From d2c18d137ed16ecd6a5079013f254f69cd8d356c Mon Sep 17 00:00:00 2001 From: Bassgeta Date: Wed, 3 Sep 2025 14:44:27 +0200 Subject: [PATCH 01/37] feat: scaffold initial payment widget component --- .gitignore | 160 +- README.md | 38 +- app/favicon.ico | Bin 0 -> 25931 bytes app/globals.css | 26 + app/layout.tsx | 34 + app/page.tsx | 21 + biome.json | 37 + components.json | 18 + next.config.ts | 7 + package-lock.json | 5995 +++++++++++++++++ package.json | 28 + postcss.config.mjs | 5 + public/file.svg | 1 + public/globe.svg | 1 + public/next.svg | 1 + public/r/payment-widget.json | 14 + public/vercel.svg | 1 + public/window.svg | 1 + registry.json | 19 + .../default/payment-widget/payment-widget.tsx | 7 + tsconfig.json | 27 + 21 files changed, 6310 insertions(+), 131 deletions(-) create mode 100644 app/favicon.ico create mode 100644 app/globals.css create mode 100644 app/layout.tsx create mode 100644 app/page.tsx create mode 100644 biome.json create mode 100644 components.json create mode 100644 next.config.ts create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 postcss.config.mjs create mode 100644 public/file.svg create mode 100644 public/globe.svg create mode 100644 public/next.svg create mode 100644 public/r/payment-widget.json create mode 100644 public/vercel.svg create mode 100644 public/window.svg create mode 100644 registry.json create mode 100644 registry/default/payment-widget/payment-widget.tsx create mode 100644 tsconfig.json diff --git a/.gitignore b/.gitignore index 9a5aced..5ef6a52 100644 --- a/.gitignore +++ b/.gitignore @@ -1,139 +1,41 @@ -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -lerna-debug.log* - -# Diagnostic reports (https://nodejs.org/api/report.html) -report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json - -# Runtime data -pids -*.pid -*.seed -*.pid.lock - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. -# Coverage directory used by tools like istanbul -coverage -*.lcov +# dependencies +/node_modules +/.pnp +.pnp.* +.yarn/* +!.yarn/patches +!.yarn/plugins +!.yarn/releases +!.yarn/versions -# nyc test coverage -.nyc_output +# testing +/coverage -# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) -.grunt +# next.js +/.next/ +/out/ -# Bower dependency directory (https://bower.io/) -bower_components +# production +/build -# node-waf configuration -.lock-wscript +# misc +.DS_Store +*.pem -# Compiled binary addons (https://nodejs.org/api/addons.html) -build/Release +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* -# Dependency directories -node_modules/ -jspm_packages/ +# env files (can opt-in for committing if needed) +.env* -# Snowpack dependency directory (https://snowpack.dev/) -web_modules/ +# vercel +.vercel -# TypeScript cache +# typescript *.tsbuildinfo - -# Optional npm cache directory -.npm - -# Optional eslint cache -.eslintcache - -# Optional stylelint cache -.stylelintcache - -# Optional REPL history -.node_repl_history - -# Output of 'npm pack' -*.tgz - -# Yarn Integrity file -.yarn-integrity - -# dotenv environment variable files -.env -.env.* -!.env.example - -# parcel-bundler cache (https://parceljs.org/) -.cache -.parcel-cache - -# Next.js build output -.next -out - -# Nuxt.js build / generate output -.nuxt -dist - -# Gatsby files -.cache/ -# Comment in the public line in if your project uses Gatsby and not Next.js -# https://nextjs.org/blog/next-9-1#public-directory-support -# public - -# vuepress build output -.vuepress/dist - -# vuepress v2.x temp and cache directory -.temp -.cache - -# Sveltekit cache directory -.svelte-kit/ - -# vitepress build output -**/.vitepress/dist - -# vitepress cache directory -**/.vitepress/cache - -# Docusaurus cache and generated files -.docusaurus - -# Serverless directories -.serverless/ - -# FuseBox cache -.fusebox/ - -# DynamoDB Local files -.dynamodb/ - -# Firebase cache directory -.firebase/ - -# TernJS port file -.tern-port - -# Stores VSCode versions used for testing VSCode extensions -.vscode-test - -# yarn v3 -.pnp.* -.yarn/* -!.yarn/patches -!.yarn/plugins -!.yarn/releases -!.yarn/sdks -!.yarn/versions - -# Vite logs files -vite.config.js.timestamp-* -vite.config.ts.timestamp-* +next-env.d.ts diff --git a/README.md b/README.md index 6e97dfc..e215bc4 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,36 @@ -# ui-registry -Request Network's reusable components registry for ShadCN +This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app). + +## Getting Started + +First, run the development server: + +```bash +npm run dev +# or +yarn dev +# or +pnpm dev +# or +bun dev +``` + +Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. + +You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file. + +This project uses [`next/font`](https://nextjs.org/docs/app/building-your-application/optimizing/fonts) to automatically optimize and load [Geist](https://vercel.com/font), a new font family for Vercel. + +## Learn More + +To learn more about Next.js, take a look at the following resources: + +- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. +- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. + +You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js) - your feedback and contributions are welcome! + +## Deploy on Vercel + +The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. + +Check out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details. diff --git a/app/favicon.ico b/app/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..718d6fea4835ec2d246af9800eddb7ffb276240c GIT binary patch literal 25931 zcmeHv30#a{`}aL_*G&7qml|y<+KVaDM2m#dVr!KsA!#An?kSQM(q<_dDNCpjEux83 zLb9Z^XxbDl(w>%i@8hT6>)&Gu{h#Oeyszu?xtw#Zb1mO{pgX9699l+Qppw7jXaYf~-84xW z)w4x8?=youko|}Vr~(D$UXIbiXABHh`p1?nn8Po~fxRJv}|0e(BPs|G`(TT%kKVJAdg5*Z|x0leQq0 zkdUBvb#>9F()jo|T~kx@OM8$9wzs~t2l;K=woNssA3l6|sx2r3+kdfVW@e^8e*E}v zA1y5{bRi+3Z`uD3{F7LgFJDdvm;nJilkzDku>BwXH(8ItVCXk*-lSJnR?-2UN%hJ){&rlvg`CDTj z)Bzo!3v7Ou#83zEDEFcKt(f1E0~=rqeEbTnMvWR#{+9pg%7G8y>u1OVRUSoox-ovF z2Ydma(;=YuBY(eI|04{hXzZD6_f(v~H;C~y5=DhAC{MMS>2fm~1H_t2$56pc$NH8( z5bH|<)71dV-_oCHIrzrT`2s-5w_+2CM0$95I6X8p^r!gHp+j_gd;9O<1~CEQQGS8) zS9Qh3#p&JM-G8rHekNmKVewU;pJRcTAog68KYo^dRo}(M>36U4Us zfgYWSiHZL3;lpWT=zNAW>Dh#mB!_@Lg%$ms8N-;aPqMn+C2HqZgz&9~Eu z4|Kp<`$q)Uw1R?y(~S>ePdonHxpV1#eSP1B;Ogo+-Pk}6#0GsZZ5!||ev2MGdh}_m z{DeR7?0-1^zVs&`AV6Vt;r3`I`OI_wgs*w=eO%_#7Kepl{B@xiyCANc(l zzIyd4y|c6PXWq9-|KM8(zIk8LPk(>a)zyFWjhT!$HJ$qX1vo@d25W<fvZQ2zUz5WRc(UnFMKHwe1| zWmlB1qdbiA(C0jmnV<}GfbKtmcu^2*P^O?MBLZKt|As~ge8&AAO~2K@zbXelK|4T<{|y4`raF{=72kC2Kn(L4YyenWgrPiv z@^mr$t{#X5VuIMeL!7Ab6_kG$&#&5p*Z{+?5U|TZ`B!7llpVmp@skYz&n^8QfPJzL z0G6K_OJM9x+Wu2gfN45phANGt{7=C>i34CV{Xqlx(fWpeAoj^N0Biu`w+MVcCUyU* zDZuzO0>4Z6fbu^T_arWW5n!E45vX8N=bxTVeFoep_G#VmNlQzAI_KTIc{6>c+04vr zx@W}zE5JNSU>!THJ{J=cqjz+4{L4A{Ob9$ZJ*S1?Ggg3klFp!+Y1@K+pK1DqI|_gq z5ZDXVpge8-cs!o|;K73#YXZ3AShj50wBvuq3NTOZ`M&qtjj#GOFfgExjg8Gn8>Vq5 z`85n+9|!iLCZF5$HJ$Iu($dm?8~-ofu}tEc+-pyke=3!im#6pk_Wo8IA|fJwD&~~F zc16osQ)EBo58U7XDuMexaPRjU@h8tXe%S{fA0NH3vGJFhuyyO!Uyl2^&EOpX{9As0 zWj+P>{@}jxH)8|r;2HdupP!vie{sJ28b&bo!8`D^x}TE$%zXNb^X1p@0PJ86`dZyj z%ce7*{^oo+6%&~I!8hQy-vQ7E)0t0ybH4l%KltWOo~8cO`T=157JqL(oq_rC%ea&4 z2NcTJe-HgFjNg-gZ$6!Y`SMHrlj}Etf7?r!zQTPPSv}{so2e>Fjs1{gzk~LGeesX%r(Lh6rbhSo_n)@@G-FTQy93;l#E)hgP@d_SGvyCp0~o(Y;Ee8{ zdVUDbHm5`2taPUOY^MAGOw*>=s7=Gst=D+p+2yON!0%Hk` zz5mAhyT4lS*T3LS^WSxUy86q&GnoHxzQ6vm8)VS}_zuqG?+3td68_x;etQAdu@sc6 zQJ&5|4(I?~3d-QOAODHpZ=hlSg(lBZ!JZWCtHHSj`0Wh93-Uk)_S%zsJ~aD>{`A0~ z9{AG(e|q3g5B%wYKRxiL2Y$8(4w6bzchKuloQW#e&S3n+P- z8!ds-%f;TJ1>)v)##>gd{PdS2Oc3VaR`fr=`O8QIO(6(N!A?pr5C#6fc~Ge@N%Vvu zaoAX2&(a6eWy_q&UwOhU)|P3J0Qc%OdhzW=F4D|pt0E4osw;%<%Dn58hAWD^XnZD= z>9~H(3bmLtxpF?a7su6J7M*x1By7YSUbxGi)Ot0P77`}P3{)&5Un{KD?`-e?r21!4vTTnN(4Y6Lin?UkSM z`MXCTC1@4A4~mvz%Rh2&EwY))LeoT=*`tMoqcEXI>TZU9WTP#l?uFv+@Dn~b(>xh2 z;>B?;Tz2SR&KVb>vGiBSB`@U7VIWFSo=LDSb9F{GF^DbmWAfpms8Sx9OX4CnBJca3 zlj9(x!dIjN?OG1X4l*imJNvRCk}F%!?SOfiOq5y^mZW)jFL@a|r-@d#f7 z2gmU8L3IZq0ynIws=}~m^#@&C%J6QFo~Mo4V`>v7MI-_!EBMMtb%_M&kvAaN)@ZVw z+`toz&WG#HkWDjnZE!6nk{e-oFdL^$YnbOCN}JC&{$#$O27@|Tn-skXr)2ml2~O!5 zX+gYoxhoc7qoU?C^3~&!U?kRFtnSEecWuH0B0OvLodgUAi}8p1 zrO6RSXHH}DMc$&|?D004DiOVMHV8kXCP@7NKB zgaZq^^O<7PoKEp72kby@W0Z!Y*Ay{&vfg#C&gG@YVR9g?FEocMUi1gSN$+V+ayF45{a zuDZDTN}mS|;BO%gEf}pjBfN2-gIrU#G5~cucA;dokXW89%>AyXJJI z9X4UlIWA|ZYHgbI z5?oFk@A=Ik7lrEQPDH!H+b`7_Y~aDb_qa=B2^Y&Ow41cU=4WDd40dp5(QS-WMN-=Y z9g;6_-JdNU;|6cPwf$ak*aJIcwL@1n$#l~zi{c{EW?T;DaW*E8DYq?Umtz{nJ&w-M zEMyTDrC&9K$d|kZe2#ws6)L=7K+{ zQw{XnV6UC$6-rW0emqm8wJoeZK)wJIcV?dST}Z;G0Arq{dVDu0&4kd%N!3F1*;*pW zR&qUiFzK=@44#QGw7k1`3t_d8&*kBV->O##t|tonFc2YWrL7_eqg+=+k;!F-`^b8> z#KWCE8%u4k@EprxqiV$VmmtiWxDLgnGu$Vs<8rppV5EajBXL4nyyZM$SWVm!wnCj-B!Wjqj5-5dNXukI2$$|Bu3Lrw}z65Lc=1G z^-#WuQOj$hwNGG?*CM_TO8Bg-1+qc>J7k5c51U8g?ZU5n?HYor;~JIjoWH-G>AoUP ztrWWLbRNqIjW#RT*WqZgPJXU7C)VaW5}MiijYbABmzoru6EmQ*N8cVK7a3|aOB#O& zBl8JY2WKfmj;h#Q!pN%9o@VNLv{OUL?rixHwOZuvX7{IJ{(EdPpuVFoQqIOa7giLVkBOKL@^smUA!tZ1CKRK}#SSM)iQHk)*R~?M!qkCruaS!#oIL1c z?J;U~&FfH#*98^G?i}pA{ z9Jg36t4=%6mhY(quYq*vSxptes9qy|7xSlH?G=S@>u>Ebe;|LVhs~@+06N<4CViBk zUiY$thvX;>Tby6z9Y1edAMQaiH zm^r3v#$Q#2T=X>bsY#D%s!bhs^M9PMAcHbCc0FMHV{u-dwlL;a1eJ63v5U*?Q_8JO zT#50!RD619#j_Uf))0ooADz~*9&lN!bBDRUgE>Vud-i5ck%vT=r^yD*^?Mp@Q^v+V zG#-?gKlr}Eeqifb{|So?HM&g91P8|av8hQoCmQXkd?7wIJwb z_^v8bbg`SAn{I*4bH$u(RZ6*xUhuA~hc=8czK8SHEKTzSxgbwi~9(OqJB&gwb^l4+m`k*Q;_?>Y-APi1{k zAHQ)P)G)f|AyjSgcCFps)Fh6Bca*Xznq36!pV6Az&m{O8$wGFD? zY&O*3*J0;_EqM#jh6^gMQKpXV?#1?>$ml1xvh8nSN>-?H=V;nJIwB07YX$e6vLxH( zqYwQ>qxwR(i4f)DLd)-$P>T-no_c!LsN@)8`e;W@)-Hj0>nJ-}Kla4-ZdPJzI&Mce zv)V_j;(3ERN3_@I$N<^|4Lf`B;8n+bX@bHbcZTopEmDI*Jfl)-pFDvo6svPRoo@(x z);_{lY<;);XzT`dBFpRmGrr}z5u1=pC^S-{ce6iXQlLGcItwJ^mZx{m$&DA_oEZ)B{_bYPq-HA zcH8WGoBG(aBU_j)vEy+_71T34@4dmSg!|M8Vf92Zj6WH7Q7t#OHQqWgFE3ARt+%!T z?oLovLVlnf?2c7pTc)~cc^($_8nyKwsN`RA-23ed3sdj(ys%pjjM+9JrctL;dy8a( z@en&CQmnV(()bu|Y%G1-4a(6x{aLytn$T-;(&{QIJB9vMox11U-1HpD@d(QkaJdEb zG{)+6Dos_L+O3NpWo^=gR?evp|CqEG?L&Ut#D*KLaRFOgOEK(Kq1@!EGcTfo+%A&I z=dLbB+d$u{sh?u)xP{PF8L%;YPPW53+@{>5W=Jt#wQpN;0_HYdw1{ksf_XhO4#2F= zyPx6Lx2<92L-;L5PD`zn6zwIH`Jk($?Qw({erA$^bC;q33hv!d!>%wRhj# zal^hk+WGNg;rJtb-EB(?czvOM=H7dl=vblBwAv>}%1@{}mnpUznfq1cE^sgsL0*4I zJ##!*B?=vI_OEVis5o+_IwMIRrpQyT_Sq~ZU%oY7c5JMIADzpD!Upz9h@iWg_>>~j zOLS;wp^i$-E?4<_cp?RiS%Rd?i;f*mOz=~(&3lo<=@(nR!_Rqiprh@weZlL!t#NCc zO!QTcInq|%#>OVgobj{~ixEUec`E25zJ~*DofsQdzIa@5^nOXj2T;8O`l--(QyU^$t?TGY^7#&FQ+2SS3B#qK*k3`ye?8jUYSajE5iBbJls75CCc(m3dk{t?- zopcER9{Z?TC)mk~gpi^kbbu>b-+a{m#8-y2^p$ka4n60w;Sc2}HMf<8JUvhCL0B&Btk)T`ctE$*qNW8L$`7!r^9T+>=<=2qaq-;ll2{`{Rg zc5a0ZUI$oG&j-qVOuKa=*v4aY#IsoM+1|c4Z)<}lEDvy;5huB@1RJPquU2U*U-;gu z=En2m+qjBzR#DEJDO`WU)hdd{Vj%^0V*KoyZ|5lzV87&g_j~NCjwv0uQVqXOb*QrQ zy|Qn`hxx(58c70$E;L(X0uZZ72M1!6oeg)(cdKO ze0gDaTz+ohR-#d)NbAH4x{I(21yjwvBQfmpLu$)|m{XolbgF!pmsqJ#D}(ylp6uC> z{bqtcI#hT#HW=wl7>p!38sKsJ`r8}lt-q%Keqy%u(xk=yiIJiUw6|5IvkS+#?JTBl z8H5(Q?l#wzazujH!8o>1xtn8#_w+397*_cy8!pQGP%K(Ga3pAjsaTbbXJlQF_+m+-UpUUent@xM zg%jqLUExj~o^vQ3Gl*>wh=_gOr2*|U64_iXb+-111aH}$TjeajM+I20xw(((>fej-@CIz4S1pi$(#}P7`4({6QS2CaQS4NPENDp>sAqD z$bH4KGzXGffkJ7R>V>)>tC)uax{UsN*dbeNC*v}#8Y#OWYwL4t$ePR?VTyIs!wea+ z5Urmc)X|^`MG~*dS6pGSbU+gPJoq*^a=_>$n4|P^w$sMBBy@f*Z^Jg6?n5?oId6f{ z$LW4M|4m502z0t7g<#Bx%X;9<=)smFolV&(V^(7Cv2-sxbxopQ!)*#ZRhTBpx1)Fc zNm1T%bONzv6@#|dz(w02AH8OXe>kQ#1FMCzO}2J_mST)+ExmBr9cva-@?;wnmWMOk z{3_~EX_xadgJGv&H@zK_8{(x84`}+c?oSBX*Ge3VdfTt&F}yCpFP?CpW+BE^cWY0^ zb&uBN!Ja3UzYHK-CTyA5=L zEMW{l3Usky#ly=7px648W31UNV@K)&Ub&zP1c7%)`{);I4b0Q<)B}3;NMG2JH=X$U zfIW4)4n9ZM`-yRj67I)YSLDK)qfUJ_ij}a#aZN~9EXrh8eZY2&=uY%2N0UFF7<~%M zsB8=erOWZ>Ct_#^tHZ|*q`H;A)5;ycw*IcmVxi8_0Xk}aJA^ath+E;xg!x+As(M#0=)3!NJR6H&9+zd#iP(m0PIW8$ z1Y^VX`>jm`W!=WpF*{ioM?C9`yOR>@0q=u7o>BP-eSHqCgMDj!2anwH?s%i2p+Q7D zzszIf5XJpE)IG4;d_(La-xenmF(tgAxK`Y4sQ}BSJEPs6N_U2vI{8=0C_F?@7<(G; zo$~G=8p+076G;`}>{MQ>t>7cm=zGtfbdDXm6||jUU|?X?CaE?(<6bKDYKeHlz}DA8 zXT={X=yp_R;HfJ9h%?eWvQ!dRgz&Su*JfNt!Wu>|XfU&68iRikRrHRW|ZxzRR^`eIGt zIeiDgVS>IeExKVRWW8-=A=yA`}`)ZkWBrZD`hpWIxBGkh&f#ijr449~m`j6{4jiJ*C!oVA8ZC?$1RM#K(_b zL9TW)kN*Y4%^-qPpMP7d4)o?Nk#>aoYHT(*g)qmRUb?**F@pnNiy6Fv9rEiUqD(^O zzyS?nBrX63BTRYduaG(0VVG2yJRe%o&rVrLjbxTaAFTd8s;<<@Qs>u(<193R8>}2_ zuwp{7;H2a*X7_jryzriZXMg?bTuegABb^87@SsKkr2)0Gyiax8KQWstw^v#ix45EVrcEhr>!NMhprl$InQMzjSFH54x5k9qHc`@9uKQzvL4ihcq{^B zPrVR=o_ic%Y>6&rMN)hTZsI7I<3&`#(nl+3y3ys9A~&^=4?PL&nd8)`OfG#n zwAMN$1&>K++c{^|7<4P=2y(B{jJsQ0a#U;HTo4ZmWZYvI{+s;Td{Yzem%0*k#)vjpB zia;J&>}ICate44SFYY3vEelqStQWFihx%^vQ@Do(sOy7yR2@WNv7Y9I^yL=nZr3mb zXKV5t@=?-Sk|b{XMhA7ZGB@2hqsx}4xwCW!in#C zI@}scZlr3-NFJ@NFaJlhyfcw{k^vvtGl`N9xSo**rDW4S}i zM9{fMPWo%4wYDG~BZ18BD+}h|GQKc-g^{++3MY>}W_uq7jGHx{mwE9fZiPCoxN$+7 zrODGGJrOkcPQUB(FD5aoS4g~7#6NR^ma7-!>mHuJfY5kTe6PpNNKC9GGRiu^L31uG z$7v`*JknQHsYB!Tm_W{a32TM099djW%5e+j0Ve_ct}IM>XLF1Ap+YvcrLV=|CKo6S zb+9Nl3_YdKP6%Cxy@6TxZ>;4&nTneadr z_ES90ydCev)LV!dN=#(*f}|ZORFdvkYBni^aLbUk>BajeWIOcmHP#8S)*2U~QKI%S zyrLmtPqb&TphJ;>yAxri#;{uyk`JJqODDw%(Z=2`1uc}br^V%>j!gS)D*q*f_-qf8&D;W1dJgQMlaH5er zN2U<%Smb7==vE}dDI8K7cKz!vs^73o9f>2sgiTzWcwY|BMYHH5%Vn7#kiw&eItCqa zIkR2~Q}>X=Ar8W|^Ms41Fm8o6IB2_j60eOeBB1Br!boW7JnoeX6Gs)?7rW0^5psc- zjS16yb>dFn>KPOF;imD}e!enuIniFzv}n$m2#gCCv4jM#ArwlzZ$7@9&XkFxZ4n!V zj3dyiwW4Ki2QG{@i>yuZXQizw_OkZI^-3otXC{!(lUpJF33gI60ak;Uqitp74|B6I zgg{b=Iz}WkhCGj1M=hu4#Aw173YxIVbISaoc z-nLZC*6Tgivd5V`K%GxhBsp@SUU60-rfc$=wb>zdJzXS&-5(NRRodFk;Kxk!S(O(a0e7oY=E( zAyS;Ow?6Q&XA+cnkCb{28_1N8H#?J!*$MmIwLq^*T_9-z^&UE@A(z9oGYtFy6EZef LrJugUA?W`A8`#=m literal 0 HcmV?d00001 diff --git a/app/globals.css b/app/globals.css new file mode 100644 index 0000000..a2dc41e --- /dev/null +++ b/app/globals.css @@ -0,0 +1,26 @@ +@import "tailwindcss"; + +:root { + --background: #ffffff; + --foreground: #171717; +} + +@theme inline { + --color-background: var(--background); + --color-foreground: var(--foreground); + --font-sans: var(--font-geist-sans); + --font-mono: var(--font-geist-mono); +} + +@media (prefers-color-scheme: dark) { + :root { + --background: #0a0a0a; + --foreground: #ededed; + } +} + +body { + background: var(--background); + color: var(--foreground); + font-family: Arial, Helvetica, sans-serif; +} diff --git a/app/layout.tsx b/app/layout.tsx new file mode 100644 index 0000000..96c4631 --- /dev/null +++ b/app/layout.tsx @@ -0,0 +1,34 @@ +import type { Metadata } from "next"; +import { Geist, Geist_Mono } from "next/font/google"; +import "./globals.css"; + +const geistSans = Geist({ + variable: "--font-geist-sans", + subsets: ["latin"], +}); + +const geistMono = Geist_Mono({ + variable: "--font-geist-mono", + subsets: ["latin"], +}); + +export const metadata: Metadata = { + title: "Request Network UI Registry", + description: "Reusable UI elements by Request Network", +}; + +export default function RootLayout({ + children, +}: Readonly<{ + children: React.ReactNode; +}>) { + return ( + + + {children} + + + ); +} diff --git a/app/page.tsx b/app/page.tsx new file mode 100644 index 0000000..9cc949e --- /dev/null +++ b/app/page.tsx @@ -0,0 +1,21 @@ +import { PaymentWidget } from "@/registry/default/payment-widget/payment-widget"; + +export default function Home() { + return ( +
+

RequestNetwork UI Registry

+ +
+

Payment Widget Preview:

+ +
+ +
+

Install this component:

+ + npx shadcn add http://localhost:3000/r/payment-widget.json + +
+
+ ); +} diff --git a/biome.json b/biome.json new file mode 100644 index 0000000..41b3b95 --- /dev/null +++ b/biome.json @@ -0,0 +1,37 @@ +{ + "$schema": "https://biomejs.dev/schemas/2.2.0/schema.json", + "vcs": { + "enabled": true, + "clientKind": "git", + "useIgnoreFile": true + }, + "files": { + "ignoreUnknown": true, + "includes": ["**", "!node_modules", "!.next", "!dist", "!build"] + }, + "formatter": { + "enabled": true, + "indentStyle": "space", + "indentWidth": 2 + }, + "linter": { + "enabled": true, + "rules": { + "recommended": true, + "suspicious": { + "noUnknownAtRules": "off" + } + }, + "domains": { + "next": "recommended", + "react": "recommended" + } + }, + "assist": { + "actions": { + "source": { + "organizeImports": "on" + } + } + } +} diff --git a/components.json b/components.json new file mode 100644 index 0000000..c987a1e --- /dev/null +++ b/components.json @@ -0,0 +1,18 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "default", + "tsx": true, + "rsc": true, + "tailwind": { + "config": "", + "css": "app/globals.css", + "baseColor": "neutral", + "cssVariables": true, + "prefix": "" + }, + "aliases": { + "components": "@/components", + "utils": "@/lib/utils" + }, + "iconLibrary": "lucide" +} diff --git a/next.config.ts b/next.config.ts new file mode 100644 index 0000000..e9ffa30 --- /dev/null +++ b/next.config.ts @@ -0,0 +1,7 @@ +import type { NextConfig } from "next"; + +const nextConfig: NextConfig = { + /* config options here */ +}; + +export default nextConfig; diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..ecb2a45 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,5995 @@ +{ + "name": "ui-registry", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "ui-registry", + "version": "0.1.0", + "dependencies": { + "next": "15.5.2", + "react": "19.1.0", + "react-dom": "19.1.0" + }, + "devDependencies": { + "@biomejs/biome": "2.2.0", + "@tailwindcss/postcss": "^4", + "@types/node": "^20", + "@types/react": "^19", + "@types/react-dom": "^19", + "shadcn": "^3.1.0", + "tailwindcss": "^4", + "typescript": "^5" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@antfu/ni": { + "version": "25.0.0", + "resolved": "https://registry.npmjs.org/@antfu/ni/-/ni-25.0.0.tgz", + "integrity": "sha512-9q/yCljni37pkMr4sPrI3G4jqdIk074+iukc5aFJl7kmDCCsiJrbZ6zKxnES1Gwg+i9RcDZwvktl23puGslmvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansis": "^4.0.0", + "fzf": "^0.5.2", + "package-manager-detector": "^1.3.0", + "tinyexec": "^1.0.1" + }, + "bin": { + "na": "bin/na.mjs", + "nci": "bin/nci.mjs", + "ni": "bin/ni.mjs", + "nlx": "bin/nlx.mjs", + "nr": "bin/nr.mjs", + "nun": "bin/nun.mjs", + "nup": "bin/nup.mjs" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.0.tgz", + "integrity": "sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.3.tgz", + "integrity": "sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.3", + "@babel/parser": "^7.28.3", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.3", + "@babel/types": "^7.28.2", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz", + "integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.3", + "@babel/types": "^7.28.2", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.3" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.3.tgz", + "integrity": "sha512-V9f6ZFIYSLNEbuGA/92uOvYsGCJNsuA8ESZ4ldc09bWk/j8H8TKiPw8Mk1eG6olpnO0ALHJmYfZvF4MEE4gajg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/traverse": "^7.28.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz", + "integrity": "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", + "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.28.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", + "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz", + "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", + "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.3.tgz", + "integrity": "sha512-PTNtvUQihsAsDHMOP5pfobP8C6CM4JWXmP8DrEIt46c3r2bf87Ua1zoqevsMo9g+tWDwgWrFP5EIxuBx5RudAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.3.tgz", + "integrity": "sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz", + "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.0.tgz", + "integrity": "sha512-4AEiDEBPIZvLQaWlc9liCavE0xRM0dNca41WtBeM3jgFptfUOSG9z0uteLhq6+3rq+WB6jIvUwKDTpXEHPJ2Vg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.3.tgz", + "integrity": "sha512-7w4kZYHneL3A6NP2nxzHvT3HCZ7puDZZjFMqDpBPECub79sTtSO5CGXDkKrTQq8ksAwfD/XI2MRFX23njdDaIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.3", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.3", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.2", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz", + "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@biomejs/biome": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.2.0.tgz", + "integrity": "sha512-3On3RSYLsX+n9KnoSgfoYlckYBoU6VRM22cw1gB4Y0OuUVSYd/O/2saOJMrA4HFfA1Ff0eacOvMN1yAAvHtzIw==", + "dev": true, + "license": "MIT OR Apache-2.0", + "bin": { + "biome": "bin/biome" + }, + "engines": { + "node": ">=14.21.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/biome" + }, + "optionalDependencies": { + "@biomejs/cli-darwin-arm64": "2.2.0", + "@biomejs/cli-darwin-x64": "2.2.0", + "@biomejs/cli-linux-arm64": "2.2.0", + "@biomejs/cli-linux-arm64-musl": "2.2.0", + "@biomejs/cli-linux-x64": "2.2.0", + "@biomejs/cli-linux-x64-musl": "2.2.0", + "@biomejs/cli-win32-arm64": "2.2.0", + "@biomejs/cli-win32-x64": "2.2.0" + } + }, + "node_modules/@biomejs/cli-darwin-arm64": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.2.0.tgz", + "integrity": "sha512-zKbwUUh+9uFmWfS8IFxmVD6XwqFcENjZvEyfOxHs1epjdH3wyyMQG80FGDsmauPwS2r5kXdEM0v/+dTIA9FXAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-darwin-x64": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.2.0.tgz", + "integrity": "sha512-+OmT4dsX2eTfhD5crUOPw3RPhaR+SKVspvGVmSdZ9y9O/AgL8pla6T4hOn1q+VAFBHuHhsdxDRJgFCSC7RaMOw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-arm64": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.2.0.tgz", + "integrity": "sha512-6eoRdF2yW5FnW9Lpeivh7Mayhq0KDdaDMYOJnH9aT02KuSIX5V1HmWJCQQPwIQbhDh68Zrcpl8inRlTEan0SXw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-arm64-musl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.2.0.tgz", + "integrity": "sha512-egKpOa+4FL9YO+SMUMLUvf543cprjevNc3CAgDNFLcjknuNMcZ0GLJYa3EGTCR2xIkIUJDVneBV3O9OcIlCEZQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-x64": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.2.0.tgz", + "integrity": "sha512-5UmQx/OZAfJfi25zAnAGHUMuOd+LOsliIt119x2soA2gLggQYrVPA+2kMUxR6Mw5M1deUF/AWWP2qpxgH7Nyfw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-x64-musl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.2.0.tgz", + "integrity": "sha512-I5J85yWwUWpgJyC1CcytNSGusu2p9HjDnOPAFG4Y515hwRD0jpR9sT9/T1cKHtuCvEQ/sBvx+6zhz9l9wEJGAg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-win32-arm64": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.2.0.tgz", + "integrity": "sha512-n9a1/f2CwIDmNMNkFs+JI0ZjFnMO0jdOyGNtihgUNFnlmd84yIYY2KMTBmMV58ZlVHjgmY5Y6E1hVTnSRieggA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-win32-x64": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.2.0.tgz", + "integrity": "sha512-Nawu5nHjP/zPKTIryh2AavzTc/KEg4um/MxWdXW0A6P/RZOyIpa7+QSjeXwAwX/utJGaCoXRPWtF3m5U/bB3Ww==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@bundled-es-modules/cookie": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@bundled-es-modules/cookie/-/cookie-2.0.1.tgz", + "integrity": "sha512-8o+5fRPLNbjbdGRRmJj3h6Hh1AQJf2dk3qQ/5ZFb+PXkRNiSoMGGUKlsgLfrxneb72axVJyIYji64E2+nNfYyw==", + "dev": true, + "license": "ISC", + "dependencies": { + "cookie": "^0.7.2" + } + }, + "node_modules/@bundled-es-modules/statuses": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@bundled-es-modules/statuses/-/statuses-1.0.1.tgz", + "integrity": "sha512-yn7BklA5acgcBr+7w064fGV+SGIFySjCKpqjcWgBAIfrAkY+4GQTJJHQMeT3V/sgz23VTEVV8TtOmkvJAhFVfg==", + "dev": true, + "license": "ISC", + "dependencies": { + "statuses": "^2.0.1" + } + }, + "node_modules/@dotenvx/dotenvx": { + "version": "1.49.0", + "resolved": "https://registry.npmjs.org/@dotenvx/dotenvx/-/dotenvx-1.49.0.tgz", + "integrity": "sha512-M1cyP6YstFQCjih54SAxCqHLMMi8QqV8tenpgGE48RTXWD7vfMYJiw/6xcCDpS2h28AcLpTsFCZA863Ge9yxzA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "commander": "^11.1.0", + "dotenv": "^17.2.1", + "eciesjs": "^0.4.10", + "execa": "^5.1.1", + "fdir": "^6.2.0", + "ignore": "^5.3.0", + "object-treeify": "1.1.33", + "picomatch": "^4.0.2", + "which": "^4.0.0" + }, + "bin": { + "dotenvx": "src/cli/dotenvx.js" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/@dotenvx/dotenvx/node_modules/commander": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + } + }, + "node_modules/@dotenvx/dotenvx/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/@dotenvx/dotenvx/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@dotenvx/dotenvx/node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/@dotenvx/dotenvx/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@dotenvx/dotenvx/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@dotenvx/dotenvx/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@dotenvx/dotenvx/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/@dotenvx/dotenvx/node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/@ecies/ciphers": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@ecies/ciphers/-/ciphers-0.2.4.tgz", + "integrity": "sha512-t+iX+Wf5nRKyNzk8dviW3Ikb/280+aEJAnw9YXvCp2tYGPSkMki+NRY+8aNLmVFv3eNtMdvViPNOPxS8SZNP+w==", + "dev": true, + "license": "MIT", + "engines": { + "bun": ">=1", + "deno": ">=2", + "node": ">=16" + }, + "peerDependencies": { + "@noble/ciphers": "^1.0.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.5.0.tgz", + "integrity": "sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.3.tgz", + "integrity": "sha512-ryFMfvxxpQRsgZJqBd4wsttYQbCxsJksrv9Lw/v798JcQ8+w84mBWuXwl+TT0WJ/WrYOLaYpwQXi3sA9nTIaIg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.2.0" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.3.tgz", + "integrity": "sha512-yHpJYynROAj12TA6qil58hmPmAwxKKC7reUqtGLzsOHfP7/rniNGTL8tjWX6L3CTV4+5P4ypcS7Pp+7OB+8ihA==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.2.0" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.0.tgz", + "integrity": "sha512-sBZmpwmxqwlqG9ueWFXtockhsxefaV6O84BMOrhtg/YqbTaRdqDE7hxraVE3y6gVM4eExmfzW4a8el9ArLeEiQ==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.0.tgz", + "integrity": "sha512-M64XVuL94OgiNHa5/m2YvEQI5q2cl9d/wk0qFTDVXcYzi43lxuiFTftMR1tOnFQovVXNZJ5TURSDK2pNe9Yzqg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.0.tgz", + "integrity": "sha512-mWd2uWvDtL/nvIzThLq3fr2nnGfyr/XMXlq8ZJ9WMR6PXijHlC3ksp0IpuhK6bougvQrchUAfzRLnbsen0Cqvw==", + "cpu": [ + "arm" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.0.tgz", + "integrity": "sha512-RXwd0CgG+uPRX5YYrkzKyalt2OJYRiJQ8ED/fi1tq9WQW2jsQIn0tqrlR5l5dr/rjqq6AHAxURhj2DVjyQWSOA==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.0.tgz", + "integrity": "sha512-Xod/7KaDDHkYu2phxxfeEPXfVXFKx70EAFZ0qyUdOjCcxbjqyJOEUpDe6RIyaunGxT34Anf9ue/wuWOqBW2WcQ==", + "cpu": [ + "ppc64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.0.tgz", + "integrity": "sha512-eMKfzDxLGT8mnmPJTNMcjfO33fLiTDsrMlUVcp6b96ETbnJmd4uvZxVJSKPQfS+odwfVaGifhsB07J1LynFehw==", + "cpu": [ + "s390x" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.0.tgz", + "integrity": "sha512-ZW3FPWIc7K1sH9E3nxIGB3y3dZkpJlMnkk7z5tu1nSkBoCgw2nSRTFHI5pB/3CQaJM0pdzMF3paf9ckKMSE9Tg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.0.tgz", + "integrity": "sha512-UG+LqQJbf5VJ8NWJ5Z3tdIe/HXjuIdo4JeVNADXBFuG7z9zjoegpzzGIyV5zQKi4zaJjnAd2+g2nna8TZvuW9Q==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.0.tgz", + "integrity": "sha512-SRYOLR7CXPgNze8akZwjoGBoN1ThNZoqpOgfnOxmWsklTGVfJiGJoC/Lod7aNMGA1jSsKWM1+HRX43OP6p9+6Q==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.3.tgz", + "integrity": "sha512-oBK9l+h6KBN0i3dC8rYntLiVfW8D8wH+NPNT3O/WBHeW0OQWCjfWksLUaPidsrDKpJgXp3G3/hkmhptAW0I3+A==", + "cpu": [ + "arm" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.2.0" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.3.tgz", + "integrity": "sha512-QdrKe3EvQrqwkDrtuTIjI0bu6YEJHTgEeqdzI3uWJOH6G1O8Nl1iEeVYRGdj1h5I21CqxSvQp1Yv7xeU3ZewbA==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.2.0" + } + }, + "node_modules/@img/sharp-linux-ppc64": { + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.3.tgz", + "integrity": "sha512-GLtbLQMCNC5nxuImPR2+RgrviwKwVql28FWZIW1zWruy6zLgA5/x2ZXk3mxj58X/tszVF69KK0Is83V8YgWhLA==", + "cpu": [ + "ppc64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-ppc64": "1.2.0" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.3.tgz", + "integrity": "sha512-3gahT+A6c4cdc2edhsLHmIOXMb17ltffJlxR0aC2VPZfwKoTGZec6u5GrFgdR7ciJSsHT27BD3TIuGcuRT0KmQ==", + "cpu": [ + "s390x" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.2.0" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.3.tgz", + "integrity": "sha512-8kYso8d806ypnSq3/Ly0QEw90V5ZoHh10yH0HnrzOCr6DKAPI6QVHvwleqMkVQ0m+fc7EH8ah0BB0QPuWY6zJQ==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.2.0" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.3.tgz", + "integrity": "sha512-vAjbHDlr4izEiXM1OTggpCcPg9tn4YriK5vAjowJsHwdBIdx0fYRsURkxLG2RLm9gyBq66gwtWI8Gx0/ov+JKQ==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.2.0" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.3.tgz", + "integrity": "sha512-gCWUn9547K5bwvOn9l5XGAEjVTTRji4aPTqLzGXHvIr6bIDZKNTA34seMPgM0WmSf+RYBH411VavCejp3PkOeQ==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.2.0" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.3.tgz", + "integrity": "sha512-+CyRcpagHMGteySaWos8IbnXcHgfDn7pO2fiC2slJxvNq9gDipYBN42/RagzctVRKgxATmfqOSulgZv5e1RdMg==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.4.4" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-arm64": { + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.3.tgz", + "integrity": "sha512-MjnHPnbqMXNC2UgeLJtX4XqoVHHlZNd+nPt1kRPmj63wURegwBhZlApELdtxM2OIZDRv/DFtLcNhVbd1z8GYXQ==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.3.tgz", + "integrity": "sha512-xuCdhH44WxuXgOM714hn4amodJMZl3OEvf0GVTm0BEyMeA2to+8HEdRPShH0SLYptJY1uBw+SCFP9WVQi1Q/cw==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.3.tgz", + "integrity": "sha512-OWwz05d++TxzLEv4VnsTz5CmZ6mI6S05sfQGEMrNrQcOEERbX46332IvE7pO/EUiw7jUrrS40z/M7kPyjfl04g==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@inquirer/confirm": { + "version": "5.1.16", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.16.tgz", + "integrity": "sha512-j1a5VstaK5KQy8Mu8cHmuQvN1Zc62TbLhjJxwHvKPPKEoowSF6h/0UdOpA9DNdWZ+9Inq73+puRq1df6OJ8Sag==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.2.0", + "@inquirer/type": "^3.0.8" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/core": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.2.0.tgz", + "integrity": "sha512-NyDSjPqhSvpZEMZrLCYUquWNl+XC/moEcVFqS55IEYIYsY0a1cUCevSqk7ctOlnm/RaSBU5psFryNlxcmGrjaA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/figures": "^1.0.13", + "@inquirer/type": "^3.0.8", + "ansi-escapes": "^4.3.2", + "cli-width": "^4.1.0", + "mute-stream": "^2.0.0", + "signal-exit": "^4.1.0", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/figures": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.13.tgz", + "integrity": "sha512-lGPVU3yO9ZNqA7vTYz26jny41lE7yoQansmqdMLBEfqaGsmdg7V3W9mK9Pvb5IL4EVZ9GnSDGMO/cJXud5dMaw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/type": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.8.tgz", + "integrity": "sha512-lg9Whz8onIHRthWaN1Q9EGLa/0LFJjyM8mEUbL1eTi6yMGvBf8gvyDLtxSXztQsxMvhxxNpJYrwa1YHdq+w4Jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@isaacs/balanced-match": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", + "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@isaacs/brace-expansion": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", + "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@isaacs/balanced-match": "^4.0.1" + }, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.30", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.30.tgz", + "integrity": "sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@modelcontextprotocol/sdk": { + "version": "1.17.5", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.17.5.tgz", + "integrity": "sha512-QakrKIGniGuRVfWBdMsDea/dx1PNE739QJ7gCM41s9q+qaCYTHCdsIBXQVVXry3mfWAiaM9kT22Hyz53Uw8mfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.6", + "content-type": "^1.0.5", + "cors": "^2.8.5", + "cross-spawn": "^7.0.5", + "eventsource": "^3.0.2", + "eventsource-parser": "^3.0.0", + "express": "^5.0.1", + "express-rate-limit": "^7.5.0", + "pkce-challenge": "^5.0.0", + "raw-body": "^3.0.0", + "zod": "^3.23.8", + "zod-to-json-schema": "^3.24.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@mswjs/interceptors": { + "version": "0.39.6", + "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.39.6.tgz", + "integrity": "sha512-bndDP83naYYkfayr/qhBHMhk0YGwS1iv6vaEGcr0SQbO0IZtbOPqjKjds/WcG+bJA+1T5vCx6kprKOzn5Bg+Vw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@open-draft/deferred-promise": "^2.2.0", + "@open-draft/logger": "^0.3.0", + "@open-draft/until": "^2.0.0", + "is-node-process": "^1.2.0", + "outvariant": "^1.4.3", + "strict-event-emitter": "^0.5.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@next/env": { + "version": "15.5.2", + "resolved": "https://registry.npmjs.org/@next/env/-/env-15.5.2.tgz", + "integrity": "sha512-Qe06ew4zt12LeO6N7j8/nULSOe3fMXE4dM6xgpBQNvdzyK1sv5y4oAP3bq4LamrvGCZtmRYnW8URFCeX5nFgGg==", + "license": "MIT" + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "15.5.2", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.5.2.tgz", + "integrity": "sha512-8bGt577BXGSd4iqFygmzIfTYizHb0LGWqH+qgIF/2EDxS5JsSdERJKA8WgwDyNBZgTIIA4D8qUtoQHmxIIquoQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "15.5.2", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.5.2.tgz", + "integrity": "sha512-2DjnmR6JHK4X+dgTXt5/sOCu/7yPtqpYt8s8hLkHFK3MGkka2snTv3yRMdHvuRtJVkPwCGsvBSwmoQCHatauFQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "15.5.2", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.5.2.tgz", + "integrity": "sha512-3j7SWDBS2Wov/L9q0mFJtEvQ5miIqfO4l7d2m9Mo06ddsgUK8gWfHGgbjdFlCp2Ek7MmMQZSxpGFqcC8zGh2AA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "15.5.2", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.5.2.tgz", + "integrity": "sha512-s6N8k8dF9YGc5T01UPQ08yxsK6fUow5gG1/axWc1HVVBYQBgOjca4oUZF7s4p+kwhkB1bDSGR8QznWrFZ/Rt5g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "15.5.2", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.5.2.tgz", + "integrity": "sha512-o1RV/KOODQh6dM6ZRJGZbc+MOAHww33Vbs5JC9Mp1gDk8cpEO+cYC/l7rweiEalkSm5/1WGa4zY7xrNwObN4+Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "15.5.2", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.5.2.tgz", + "integrity": "sha512-/VUnh7w8RElYZ0IV83nUcP/J4KJ6LLYliiBIri3p3aW2giF+PAVgZb6mk8jbQSB3WlTai8gEmCAr7kptFa1H6g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "15.5.2", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.5.2.tgz", + "integrity": "sha512-sMPyTvRcNKXseNQ/7qRfVRLa0VhR0esmQ29DD6pqvG71+JdVnESJaHPA8t7bc67KD5spP3+DOCNLhqlEI2ZgQg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "15.5.2", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.5.2.tgz", + "integrity": "sha512-W5VvyZHnxG/2ukhZF/9Ikdra5fdNftxI6ybeVKYvBPDtyx7x4jPPSNduUkfH5fo3zG0JQ0bPxgy41af2JX5D4Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@noble/ciphers": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.3.0.tgz", + "integrity": "sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/curves": { + "version": "1.9.7", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.7.tgz", + "integrity": "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.8.0" + }, + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/hashes": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@open-draft/deferred-promise": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz", + "integrity": "sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@open-draft/logger": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@open-draft/logger/-/logger-0.3.0.tgz", + "integrity": "sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-node-process": "^1.2.0", + "outvariant": "^1.4.0" + } + }, + "node_modules/@open-draft/until": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@open-draft/until/-/until-2.1.0.tgz", + "integrity": "sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sec-ant/readable-stream": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", + "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sindresorhus/merge-streams": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz", + "integrity": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@swc/helpers": { + "version": "0.5.15", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", + "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@tailwindcss/node": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.12.tgz", + "integrity": "sha512-3hm9brwvQkZFe++SBt+oLjo4OLDtkvlE8q2WalaD/7QWaeM7KEJbAiY/LJZUaCs7Xa8aUu4xy3uoyX4q54UVdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.4", + "enhanced-resolve": "^5.18.3", + "jiti": "^2.5.1", + "lightningcss": "1.30.1", + "magic-string": "^0.30.17", + "source-map-js": "^1.2.1", + "tailwindcss": "4.1.12" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.12.tgz", + "integrity": "sha512-gM5EoKHW/ukmlEtphNwaGx45fGoEmP10v51t9unv55voWh6WrOL19hfuIdo2FjxIaZzw776/BUQg7Pck++cIVw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "detect-libc": "^2.0.4", + "tar": "^7.4.3" + }, + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.1.12", + "@tailwindcss/oxide-darwin-arm64": "4.1.12", + "@tailwindcss/oxide-darwin-x64": "4.1.12", + "@tailwindcss/oxide-freebsd-x64": "4.1.12", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.12", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.12", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.12", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.12", + "@tailwindcss/oxide-linux-x64-musl": "4.1.12", + "@tailwindcss/oxide-wasm32-wasi": "4.1.12", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.12", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.12" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.12.tgz", + "integrity": "sha512-oNY5pq+1gc4T6QVTsZKwZaGpBb2N1H1fsc1GD4o7yinFySqIuRZ2E4NvGasWc6PhYJwGK2+5YT1f9Tp80zUQZQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.12.tgz", + "integrity": "sha512-cq1qmq2HEtDV9HvZlTtrj671mCdGB93bVY6J29mwCyaMYCP/JaUBXxrQQQm7Qn33AXXASPUb2HFZlWiiHWFytw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.12.tgz", + "integrity": "sha512-6UCsIeFUcBfpangqlXay9Ffty9XhFH1QuUFn0WV83W8lGdX8cD5/+2ONLluALJD5+yJ7k8mVtwy3zMZmzEfbLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.12.tgz", + "integrity": "sha512-JOH/f7j6+nYXIrHobRYCtoArJdMJh5zy5lr0FV0Qu47MID/vqJAY3r/OElPzx1C/wdT1uS7cPq+xdYYelny1ww==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.12.tgz", + "integrity": "sha512-v4Ghvi9AU1SYgGr3/j38PD8PEe6bRfTnNSUE3YCMIRrrNigCFtHZ2TCm8142X8fcSqHBZBceDx+JlFJEfNg5zQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.12.tgz", + "integrity": "sha512-YP5s1LmetL9UsvVAKusHSyPlzSRqYyRB0f+Kl/xcYQSPLEw/BvGfxzbH+ihUciePDjiXwHh+p+qbSP3SlJw+6g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.12.tgz", + "integrity": "sha512-V8pAM3s8gsrXcCv6kCHSuwyb/gPsd863iT+v1PGXC4fSL/OJqsKhfK//v8P+w9ThKIoqNbEnsZqNy+WDnwQqCA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.12.tgz", + "integrity": "sha512-xYfqYLjvm2UQ3TZggTGrwxjYaLB62b1Wiysw/YE3Yqbh86sOMoTn0feF98PonP7LtjsWOWcXEbGqDL7zv0uW8Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.12.tgz", + "integrity": "sha512-ha0pHPamN+fWZY7GCzz5rKunlv9L5R8kdh+YNvP5awe3LtuXb5nRi/H27GeL2U+TdhDOptU7T6Is7mdwh5Ar3A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.12.tgz", + "integrity": "sha512-4tSyu3dW+ktzdEpuk6g49KdEangu3eCYoqPhWNsZgUhyegEda3M9rG0/j1GV/JjVVsj+lG7jWAyrTlLzd/WEBg==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.5", + "@emnapi/runtime": "^1.4.5", + "@emnapi/wasi-threads": "^1.0.4", + "@napi-rs/wasm-runtime": "^0.2.12", + "@tybys/wasm-util": "^0.10.0", + "tslib": "^2.8.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.12.tgz", + "integrity": "sha512-iGLyD/cVP724+FGtMWslhcFyg4xyYyM+5F4hGvKA7eifPkXHRAUDFaimu53fpNg9X8dfP75pXx/zFt/jlNF+lg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.12.tgz", + "integrity": "sha512-NKIh5rzw6CpEodv/++r0hGLlfgT/gFN+5WNdZtvh6wpU2BpGNgdjvj6H2oFc8nCM839QM1YOhjpgbAONUb4IxA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/postcss": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.12.tgz", + "integrity": "sha512-5PpLYhCAwf9SJEeIsSmCDLgyVfdBhdBpzX1OJ87anT9IVR0Z9pjM0FNixCAUAHGnMBGB8K99SwAheXrT0Kh6QQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "@tailwindcss/node": "4.1.12", + "@tailwindcss/oxide": "4.1.12", + "postcss": "^8.4.41", + "tailwindcss": "4.1.12" + } + }, + "node_modules/@ts-morph/common": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.27.0.tgz", + "integrity": "sha512-Wf29UqxWDpc+i61k3oIOzcUfQt79PIT9y/MWfAGlrkjg6lBC1hwDECLXPVJAhWjiGbfBCxZd65F/LIZF3+jeJQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-glob": "^3.3.3", + "minimatch": "^10.0.1", + "path-browserify": "^1.0.1" + } + }, + "node_modules/@types/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "20.19.12", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.12.tgz", + "integrity": "sha512-lSOjyS6vdO2G2g2CWrETTV3Jz2zlCXHpu1rcubLKpz9oj+z/1CceHlj+yq53W+9zgb98nSov/wjEKYDNauD+Hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/react": { + "version": "19.1.12", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.12.tgz", + "integrity": "sha512-cMoR+FoAf/Jyq6+Df2/Z41jISvGZZ2eTlnsaJRptmZ76Caldwy1odD4xTr/gNV9VLj0AWgg/nmkevIyUfIIq5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.1.9", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.9.tgz", + "integrity": "sha512-qXRuZaOsAdXKFyOhRBg6Lqqc0yay13vN7KrIg4L7N4aaHN68ma9OK3NE1BoDFgFOTfM7zg+3/8+2n8rLUH3OKQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.0.0" + } + }, + "node_modules/@types/statuses": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/statuses/-/statuses-2.0.6.tgz", + "integrity": "sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA==", + "dev": true, + "license": "MIT" + }, + "node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.0.tgz", + "integrity": "sha512-TKY5pyBkHyADOPYlRT9Lx6F544mPl0vS5Ew7BJ45hA08Q+t3GjbueLliBWN3sMICk6+y7HdyxSzC4bWS8baBdg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ansis": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansis/-/ansis-4.1.0.tgz", + "integrity": "sha512-BGcItUBWSMRgOCe+SVZJ+S7yTRG0eGt9cXAHev72yuGcY23hnLA7Bky5L/xLyPINoSN95geovfBkqoTlNZYa7w==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/ast-types": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.16.1.tgz", + "integrity": "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/body-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", + "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.0", + "http-errors": "^2.0.0", + "iconv-lite": "^0.6.3", + "on-finished": "^2.4.1", + "qs": "^6.14.0", + "raw-body": "^3.0.0", + "type-is": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.25.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.4.tgz", + "integrity": "sha512-4jYpcjabC606xJ3kw2QwGEZKX0Aw7sgQdZCvIK9dhVSPh76BKo+C+btT1RRofH7B+8iNpEbgGNVWiLki5q93yg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001737", + "electron-to-chromium": "^1.5.211", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001739", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001739.tgz", + "integrity": "sha512-y+j60d6ulelrNSwpPyrHdl+9mJnQzHBr08xm48Qno0nSk4h3Qojh+ziv2qE6rXf4k3tadF4o1J/1tAbVm1NtnA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.0.tgz", + "integrity": "sha512-46QrSQFyVSEyYAgQ22hQ+zDa60YHA4fBstHmtSApj1Y5vKtG27fWowW03jCk5KcbXEWPZUIR894aARCA/G1kfQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 12" + } + }, + "node_modules/client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", + "license": "MIT" + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/code-block-writer": { + "version": "13.0.3", + "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-13.0.3.tgz", + "integrity": "sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==", + "dev": true, + "license": "MIT" + }, + "node_modules/color": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "license": "MIT", + "optional": true, + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, + "engines": { + "node": ">=12.5.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "license": "MIT", + "optional": true, + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/commander": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.0.tgz", + "integrity": "sha512-2uM9rYjPvyq39NwLRqaiLtWHyDC1FvryJDa2ATTVims5YAS4PupsEQsDvP14FqhFr0P49CYDugi59xaxJlTXRA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/content-disposition": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", + "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/cosmiconfig": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cross-spawn/node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/cross-spawn/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "dev": true, + "license": "MIT" + }, + "node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/dedent": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.6.0.tgz", + "integrity": "sha512-F1Z+5UCFpmQUzJa11agbyPVMbpgT/qA3/SKyJ1jyBgm7dUcUEa8v9JwDkerSQXfakBwFljIxhOJqGkjUwZ9FSA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/detect-libc": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", + "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", + "devOptional": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/diff": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.2.tgz", + "integrity": "sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dotenv": { + "version": "17.2.2", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.2.tgz", + "integrity": "sha512-Sf2LSQP+bOlhKWWyhFsn0UsfdK/kCWRv1iuA2gXAwt3dyNabr6QSj00I2V10pidqz69soatm9ZwZvpQMTIOd5Q==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/eciesjs": { + "version": "0.4.15", + "resolved": "https://registry.npmjs.org/eciesjs/-/eciesjs-0.4.15.tgz", + "integrity": "sha512-r6kEJXDKecVOCj2nLMuXK/FCPeurW33+3JRpfXVbjLja3XUYFfD9I/JBreH6sUyzcm3G/YQboBjMla6poKeSdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ecies/ciphers": "^0.2.3", + "@noble/ciphers": "^1.3.0", + "@noble/curves": "^1.9.1", + "@noble/hashes": "^1.8.0" + }, + "engines": { + "bun": ">=1", + "deno": ">=2", + "node": ">=16" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true, + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.213", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.213.tgz", + "integrity": "sha512-xr9eRzSLNa4neDO0xVFrkXu3vyIzG4Ay08dApecw42Z1NbmCt+keEpXdvlYGVe0wtvY5dhW0Ay0lY0IOfsCg0Q==", + "dev": true, + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.5.0.tgz", + "integrity": "sha512-lb49vf1Xzfx080OKA0o6l8DQQpV+6Vg95zyCJX9VB/BqKYlhG7N4wgROUUHRA+ZPUefLnteQOad7z1kT2bV7bg==", + "dev": true, + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.18.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz", + "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/error-ex/node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true, + "license": "MIT" + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventsource": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz", + "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eventsource-parser": "^3.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/eventsource-parser": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.6.tgz", + "integrity": "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/execa": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-9.6.0.tgz", + "integrity": "sha512-jpWzZ1ZhwUmeWRhS7Qv3mhpOhLfwI+uAX4e5fOcXqwMR7EcJ0pj2kV1CVzHVMX/LphnKWD3LObjZCoJ71lKpHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/merge-streams": "^4.0.0", + "cross-spawn": "^7.0.6", + "figures": "^6.1.0", + "get-stream": "^9.0.0", + "human-signals": "^8.0.1", + "is-plain-obj": "^4.1.0", + "is-stream": "^4.0.1", + "npm-run-path": "^6.0.0", + "pretty-ms": "^9.2.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^4.0.0", + "yoctocolors": "^2.1.1" + }, + "engines": { + "node": "^18.19.0 || >=20.5.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/express": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", + "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.0", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express-rate-limit": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.5.1.tgz", + "integrity": "sha512-7iN8iPMDzOMHPUYllBEsQdWVB6fPDMPqwjBaFrgr4Jgr/+okjvzAy+UHlYYL/Vs0OsOrMkwS6PJDkFlJwoxUnw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/express-rate-limit" + }, + "peerDependencies": { + "express": ">= 4.11" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, + "node_modules/figures": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-6.1.0.tgz", + "integrity": "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-unicode-supported": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", + "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/fs-extra": { + "version": "11.3.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.1.tgz", + "integrity": "sha512-eXvGGwZ5CL17ZSwHWd3bbgk7UUpF6IFHtP57NYYakPvHOs8GDgDe5KJI36jIJzDkJ6eJjuzRA8eBQb6SkKue0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/fuzzysort": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fuzzysort/-/fuzzysort-3.1.0.tgz", + "integrity": "sha512-sR9BNCjBg6LNgwvxlBd0sBABvQitkLzoVY9MYYROQVX/FvfJ4Mai9LsGhDgd8qYdds0bY77VzYd5iuB+v5rwQQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/fzf": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fzf/-/fzf-0.5.2.tgz", + "integrity": "sha512-Tt4kuxLXFKHy8KT40zwsUPUkg1CrsgY25FxA2U/j/0WgEDCk3ddc/zLTCCcbSHX9FcKtLuVaDGtGE/STWC+j3Q==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.1.tgz", + "integrity": "sha512-R1QfovbPsKmosqTnPoRFiJ7CF9MLRgb53ChvMZm+r4p76/+8yKDy17qLL2PKInORy2RkZZekuK0efYgmzTkXyQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-own-enumerable-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-own-enumerable-keys/-/get-own-enumerable-keys-1.0.0.tgz", + "integrity": "sha512-PKsK2FSrQCyxcGHsGrLDcK0lx+0Ke+6e8KFFozA9/fIQLhQzPaRvJFdcz7+Axg3jUH/Mq+NI4xa5u/UT2tQskA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz", + "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sec-ant/readable-stream": "^0.4.1", + "is-stream": "^4.0.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/graphql": { + "version": "16.11.0", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.11.0.tgz", + "integrity": "sha512-mS1lbMsxgQj6hge1XZ6p7GPhbrtFwUFYi3wRzXAC/FmYnyXMTvvI3td3rjmQ2u8ewXueaSvRPWaEcgVVOT9Jnw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/headers-polyfill": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/headers-polyfill/-/headers-polyfill-4.0.3.tgz", + "integrity": "sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-errors/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/human-signals": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-8.0.1.tgz", + "integrity": "sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "license": "MIT", + "optional": true + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-interactive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", + "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-node-process": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-node-process/-/is-node-process-1.2.0.tgz", + "integrity": "sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-3.0.0.tgz", + "integrity": "sha512-IlsXEHOjtKhpN8r/tRFj2nDyTmHvcfNeu/nrRIcXE17ROeatXchkojffa1SpdqW4cr/Fj6QkEf/Gn4zf6KKvEQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-regexp": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-3.1.0.tgz", + "integrity": "sha512-rbku49cWloU5bSMI+zaRaXdQHXnthP6DZ/vLnfdSKyL4zUzuWnomtOEiZZOd+ioQ+avFo/qau3KPTc7Fjy1uPA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-stream": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", + "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-unicode-supported": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16" + } + }, + "node_modules/jiti": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.5.1.tgz", + "integrity": "sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/lightningcss": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.1.tgz", + "integrity": "sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-darwin-arm64": "1.30.1", + "lightningcss-darwin-x64": "1.30.1", + "lightningcss-freebsd-x64": "1.30.1", + "lightningcss-linux-arm-gnueabihf": "1.30.1", + "lightningcss-linux-arm64-gnu": "1.30.1", + "lightningcss-linux-arm64-musl": "1.30.1", + "lightningcss-linux-x64-gnu": "1.30.1", + "lightningcss-linux-x64-musl": "1.30.1", + "lightningcss-win32-arm64-msvc": "1.30.1", + "lightningcss-win32-x64-msvc": "1.30.1" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.1.tgz", + "integrity": "sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.1.tgz", + "integrity": "sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.1.tgz", + "integrity": "sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.1.tgz", + "integrity": "sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.1.tgz", + "integrity": "sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.1.tgz", + "integrity": "sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.1.tgz", + "integrity": "sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.1.tgz", + "integrity": "sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.1.tgz", + "integrity": "sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.1.tgz", + "integrity": "sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/log-symbols": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", + "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^5.3.0", + "is-unicode-supported": "^1.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols/node_modules/is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lru-cache/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/magic-string": { + "version": "0.30.18", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.18.tgz", + "integrity": "sha512-yi8swmWbO17qHhwIBNeeZxTceJMeBvWJaId6dyvTSOwTipqeHhMhOrz6513r1sOKnpvQ7zkhlG8tPrpilwTxHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.3.tgz", + "integrity": "sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==", + "dev": true, + "license": "ISC", + "dependencies": { + "@isaacs/brace-expansion": "^5.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minizlib": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz", + "integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/mkdirp": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/msw": { + "version": "2.11.1", + "resolved": "https://registry.npmjs.org/msw/-/msw-2.11.1.tgz", + "integrity": "sha512-dGSRx0AJmQVQfpGXTsAAq4JFdwdhOBdJ6sJS/jnN0ac3s0NZB6daacHF1z5Pefx+IejmvuiLWw260RlyQOf3sQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@bundled-es-modules/cookie": "^2.0.1", + "@bundled-es-modules/statuses": "^1.0.1", + "@inquirer/confirm": "^5.0.0", + "@mswjs/interceptors": "^0.39.1", + "@open-draft/deferred-promise": "^2.2.0", + "@open-draft/until": "^2.1.0", + "@types/cookie": "^0.6.0", + "@types/statuses": "^2.0.4", + "graphql": "^16.8.1", + "headers-polyfill": "^4.0.2", + "is-node-process": "^1.2.0", + "outvariant": "^1.4.3", + "path-to-regexp": "^6.3.0", + "picocolors": "^1.1.1", + "strict-event-emitter": "^0.5.1", + "tough-cookie": "^6.0.0", + "type-fest": "^4.26.1", + "yargs": "^17.7.2" + }, + "bin": { + "msw": "cli/index.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/mswjs" + }, + "peerDependencies": { + "typescript": ">= 4.8.x" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/mute-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", + "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/next": { + "version": "15.5.2", + "resolved": "https://registry.npmjs.org/next/-/next-15.5.2.tgz", + "integrity": "sha512-H8Otr7abj1glFhbGnvUt3gz++0AF1+QoCXEBmd/6aKbfdFwrn0LpA836Ed5+00va/7HQSDD+mOoVhn3tNy3e/Q==", + "license": "MIT", + "dependencies": { + "@next/env": "15.5.2", + "@swc/helpers": "0.5.15", + "caniuse-lite": "^1.0.30001579", + "postcss": "8.4.31", + "styled-jsx": "5.1.6" + }, + "bin": { + "next": "dist/bin/next" + }, + "engines": { + "node": "^18.18.0 || ^19.8.0 || >= 20.0.0" + }, + "optionalDependencies": { + "@next/swc-darwin-arm64": "15.5.2", + "@next/swc-darwin-x64": "15.5.2", + "@next/swc-linux-arm64-gnu": "15.5.2", + "@next/swc-linux-arm64-musl": "15.5.2", + "@next/swc-linux-x64-gnu": "15.5.2", + "@next/swc-linux-x64-musl": "15.5.2", + "@next/swc-win32-arm64-msvc": "15.5.2", + "@next/swc-win32-x64-msvc": "15.5.2", + "sharp": "^0.34.3" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0", + "@playwright/test": "^1.51.1", + "babel-plugin-react-compiler": "*", + "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", + "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", + "sass": "^1.3.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "@playwright/test": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/next/node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "deprecated": "Use your platform's native DOMException instead", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "engines": { + "node": ">=10.5.0" + } + }, + "node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, + "node_modules/node-releases": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "dev": true, + "license": "MIT" + }, + "node_modules/npm-run-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-6.0.0.tgz", + "integrity": "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^4.0.0", + "unicorn-magic": "^0.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-treeify": { + "version": "1.1.33", + "resolved": "https://registry.npmjs.org/object-treeify/-/object-treeify-1.1.33.tgz", + "integrity": "sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-8.2.0.tgz", + "integrity": "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^5.3.0", + "cli-cursor": "^5.0.0", + "cli-spinners": "^2.9.2", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^2.0.0", + "log-symbols": "^6.0.0", + "stdin-discarder": "^0.2.2", + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/outvariant": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.4.3.tgz", + "integrity": "sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==", + "dev": true, + "license": "MIT" + }, + "node_modules/package-manager-detector": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.3.0.tgz", + "integrity": "sha512-ZsEbbZORsyHuO00lY1kV3/t72yp6Ysay6Pd17ZAlNGuGwmWDLCJxFpRs0IzfXfj1o4icJOkUEioexFHzyPurSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-ms": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-4.0.0.tgz", + "integrity": "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-to-regexp": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", + "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkce-challenge": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.0.tgz", + "integrity": "sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/pretty-ms": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-9.2.0.tgz", + "integrity": "sha512-4yf0QO/sllf/1zbZWYnvWw3NxCQwLXKzIj0G849LSufP15BXKM0rbD2Z3wVnkMfjdn/CB0Dpp444gYAACdsplg==", + "dev": true, + "license": "MIT", + "dependencies": { + "parse-ms": "^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prompts/node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz", + "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.6.3", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/react": { + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz", + "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz", + "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.26.0" + }, + "peerDependencies": { + "react": "^19.1.0" + } + }, + "node_modules/recast": { + "version": "0.23.11", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.11.tgz", + "integrity": "sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ast-types": "^0.16.1", + "esprima": "~4.0.0", + "source-map": "~0.6.1", + "tiny-invariant": "^1.3.3", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/router/node_modules/path-to-regexp": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", + "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/scheduler": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", + "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "license": "ISC", + "optional": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", + "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.5", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "mime-types": "^3.0.1", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/serve-static": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", + "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true, + "license": "ISC" + }, + "node_modules/shadcn": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/shadcn/-/shadcn-3.1.0.tgz", + "integrity": "sha512-tYem+5cR8kSo0g3V3JbVpZ5NmblrH+b52UX9pgYkpyalotjejldZCAIoCszF3VoKTvHRRxrifmTO8gdOpmkz1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@antfu/ni": "^25.0.0", + "@babel/core": "^7.28.0", + "@babel/parser": "^7.28.0", + "@babel/plugin-transform-typescript": "^7.28.0", + "@dotenvx/dotenvx": "^1.48.4", + "@modelcontextprotocol/sdk": "^1.17.2", + "commander": "^14.0.0", + "cosmiconfig": "^9.0.0", + "dedent": "^1.6.0", + "deepmerge": "^4.3.1", + "diff": "^8.0.2", + "execa": "^9.6.0", + "fast-glob": "^3.3.3", + "fs-extra": "^11.3.1", + "fuzzysort": "^3.1.0", + "https-proxy-agent": "^7.0.6", + "kleur": "^4.1.5", + "msw": "^2.10.4", + "node-fetch": "^3.3.2", + "ora": "^8.2.0", + "postcss": "^8.5.6", + "prompts": "^2.4.2", + "recast": "^0.23.11", + "stringify-object": "^5.0.0", + "ts-morph": "^26.0.0", + "tsconfig-paths": "^4.2.0", + "zod": "^3.24.1", + "zod-to-json-schema": "^3.24.6" + }, + "bin": { + "shadcn": "dist/index.js" + } + }, + "node_modules/sharp": { + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.3.tgz", + "integrity": "sha512-eX2IQ6nFohW4DbvHIOLRB3MHFpYqaqvXd3Tp5e/T/dSH83fxaNJQRvDMhASmkNTsNTVF2/OOopzRCt7xokgPfg==", + "hasInstallScript": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "color": "^4.2.3", + "detect-libc": "^2.0.4", + "semver": "^7.7.2" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.34.3", + "@img/sharp-darwin-x64": "0.34.3", + "@img/sharp-libvips-darwin-arm64": "1.2.0", + "@img/sharp-libvips-darwin-x64": "1.2.0", + "@img/sharp-libvips-linux-arm": "1.2.0", + "@img/sharp-libvips-linux-arm64": "1.2.0", + "@img/sharp-libvips-linux-ppc64": "1.2.0", + "@img/sharp-libvips-linux-s390x": "1.2.0", + "@img/sharp-libvips-linux-x64": "1.2.0", + "@img/sharp-libvips-linuxmusl-arm64": "1.2.0", + "@img/sharp-libvips-linuxmusl-x64": "1.2.0", + "@img/sharp-linux-arm": "0.34.3", + "@img/sharp-linux-arm64": "0.34.3", + "@img/sharp-linux-ppc64": "0.34.3", + "@img/sharp-linux-s390x": "0.34.3", + "@img/sharp-linux-x64": "0.34.3", + "@img/sharp-linuxmusl-arm64": "0.34.3", + "@img/sharp-linuxmusl-x64": "0.34.3", + "@img/sharp-wasm32": "0.34.3", + "@img/sharp-win32-arm64": "0.34.3", + "@img/sharp-win32-ia32": "0.34.3", + "@img/sharp-win32-x64": "0.34.3" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "license": "MIT", + "optional": true, + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/stdin-discarder": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", + "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strict-event-emitter": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/strict-event-emitter/-/strict-event-emitter-0.5.1.tgz", + "integrity": "sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stringify-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-5.0.0.tgz", + "integrity": "sha512-zaJYxz2FtcMb4f+g60KsRNFOpVMUyuJgA51Zi5Z1DOTC3S59+OQiVOzE9GZt0x72uBGWKsQIuBKeF9iusmKFsg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "get-own-enumerable-keys": "^1.0.0", + "is-obj": "^3.0.0", + "is-regexp": "^3.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/yeoman/stringify-object?sponsor=1" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-final-newline": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-4.0.0.tgz", + "integrity": "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/styled-jsx": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz", + "integrity": "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==", + "license": "MIT", + "dependencies": { + "client-only": "0.0.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "peerDependencies": { + "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/tailwindcss": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.12.tgz", + "integrity": "sha512-DzFtxOi+7NsFf7DBtI3BJsynR+0Yp6etH+nRPTbpWnS2pZBaSksv/JGctNwSWzbFjp0vxSqknaUylseZqMDGrA==", + "dev": true, + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.3.tgz", + "integrity": "sha512-ZL6DDuAlRlLGghwcfmSn9sK3Hr6ArtyudlSAiCqQ6IfE+b+HHbydbYDIG15IfS5do+7XQQBdBiubF/cV2dnDzg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tar": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", + "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", + "dev": true, + "license": "ISC", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.0.1", + "mkdirp": "^3.0.1", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/tiny-invariant": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.1.tgz", + "integrity": "sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==", + "dev": true, + "license": "MIT" + }, + "node_modules/tldts": { + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.0.12.tgz", + "integrity": "sha512-M9ZQBPp6FyqhMcl233vHYyYRkxXOA1SKGlnq13S0mJdUhRSwr2w6I8rlchPL73wBwRlyIZpFvpu2VcdSMWLYXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tldts-core": "^7.0.12" + }, + "bin": { + "tldts": "bin/cli.js" + } + }, + "node_modules/tldts-core": { + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.0.12.tgz", + "integrity": "sha512-3K76aXywJFduGRsOYoY5JzINLs/WMlOkeDwPL+8OCPq2Rh39gkSDtWAxdJQlWjpun/xF/LHf29yqCi6VC/rHDA==", + "dev": true, + "license": "MIT" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tough-cookie": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.0.tgz", + "integrity": "sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tldts": "^7.0.5" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/ts-morph": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-26.0.0.tgz", + "integrity": "sha512-ztMO++owQnz8c/gIENcM9XfCEzgoGphTv+nKpYNM1bgsdOVC/jRZuEBf6N+mLLDNg68Kl+GgUZfOySaRiG1/Ug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ts-morph/common": "~0.27.0", + "code-block-writer": "^13.0.3" + } + }, + "node_modules/tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "dev": true, + "license": "MIT", + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typescript": { + "version": "5.9.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", + "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/unicorn-magic": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", + "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/web-streams-polyfill": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", + "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/which": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" + } + }, + "node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yoctocolors": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.2.tgz", + "integrity": "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yoctocolors-cjs": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz", + "integrity": "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-to-json-schema": { + "version": "3.24.6", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.6.tgz", + "integrity": "sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg==", + "dev": true, + "license": "ISC", + "peerDependencies": { + "zod": "^3.24.1" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..ed9ae54 --- /dev/null +++ b/package.json @@ -0,0 +1,28 @@ +{ + "name": "ui-registry", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev --turbopack", + "build": "next build --turbopack", + "start": "next start", + "lint": "biome check", + "format": "biome format --write", + "registry:build": "shadcn build" + }, + "dependencies": { + "react": "19.1.0", + "react-dom": "19.1.0", + "next": "15.5.2" + }, + "devDependencies": { + "typescript": "^5", + "@types/node": "^20", + "@types/react": "^19", + "@types/react-dom": "^19", + "@tailwindcss/postcss": "^4", + "tailwindcss": "^4", + "@biomejs/biome": "2.2.0", + "shadcn": "^3.1.0" + } +} diff --git a/postcss.config.mjs b/postcss.config.mjs new file mode 100644 index 0000000..c7bcb4b --- /dev/null +++ b/postcss.config.mjs @@ -0,0 +1,5 @@ +const config = { + plugins: ["@tailwindcss/postcss"], +}; + +export default config; diff --git a/public/file.svg b/public/file.svg new file mode 100644 index 0000000..004145c --- /dev/null +++ b/public/file.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/globe.svg b/public/globe.svg new file mode 100644 index 0000000..567f17b --- /dev/null +++ b/public/globe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/next.svg b/public/next.svg new file mode 100644 index 0000000..5174b28 --- /dev/null +++ b/public/next.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/r/payment-widget.json b/public/r/payment-widget.json new file mode 100644 index 0000000..44c662b --- /dev/null +++ b/public/r/payment-widget.json @@ -0,0 +1,14 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "payment-widget", + "type": "registry:component", + "title": "Payment Widget", + "description": "A simple payment widget for Request Network", + "files": [ + { + "path": "registry/default/payment-widget/payment-widget.tsx", + "content": "export function PaymentWidget() {\n return (\n
\n
Pay with RN
\n
\n );\n}\n", + "type": "registry:component" + } + ] +} \ No newline at end of file diff --git a/public/vercel.svg b/public/vercel.svg new file mode 100644 index 0000000..7705396 --- /dev/null +++ b/public/vercel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/window.svg b/public/window.svg new file mode 100644 index 0000000..b2b2a44 --- /dev/null +++ b/public/window.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/registry.json b/registry.json new file mode 100644 index 0000000..4d2295e --- /dev/null +++ b/registry.json @@ -0,0 +1,19 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry.json", + "name": "requestnetwork", + "homepage": "https://request.network", + "items": [ + { + "name": "payment-widget", + "type": "registry:component", + "title": "Payment Widget", + "description": "A simple payment widget for Request Network", + "files": [ + { + "path": "registry/default/payment-widget/payment-widget.tsx", + "type": "registry:component" + } + ] + } + ] +} diff --git a/registry/default/payment-widget/payment-widget.tsx b/registry/default/payment-widget/payment-widget.tsx new file mode 100644 index 0000000..b92f784 --- /dev/null +++ b/registry/default/payment-widget/payment-widget.tsx @@ -0,0 +1,7 @@ +export function PaymentWidget() { + return ( +
+
Pay with RN
+
+ ); +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..d8b9323 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + "target": "ES2017", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true, + "plugins": [ + { + "name": "next" + } + ], + "paths": { + "@/*": ["./*"] + } + }, + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], + "exclude": ["node_modules"] +} From 9ae4ede8e4589c00b8ec5b153a57dc0cae55f27b Mon Sep 17 00:00:00 2001 From: Bassgeta Date: Fri, 5 Sep 2025 13:03:41 +0200 Subject: [PATCH 02/37] feat: reorganize folder structure when lib is added via shad cli, use wagmi for wallet connection --- app/globals.css | 86 +- app/layout.tsx | 4 +- app/page.tsx | 4 +- components.json | 1 + components/providers/web3-provider.tsx | 21 + components/ui/button.tsx | 56 + components/ui/dialog.tsx | 122 + lib/utils.ts | 6 + lib/wagmi.ts | 45 + package-lock.json | 6477 +++++++++++++++-- package.json | 20 +- public/r/payment-widget.json | 46 +- public/r/registry.json | 51 + public/r/requestnetwork.json | 5 + registry.json | 36 +- .../components/connection-handler.tsx | 33 + .../components/payment-modal.tsx | 65 + .../components/wallet-connect-modal.tsx | 86 + .../default/payment-widget/payment-widget.tsx | 30 +- 19 files changed, 6655 insertions(+), 539 deletions(-) create mode 100644 components/providers/web3-provider.tsx create mode 100644 components/ui/button.tsx create mode 100644 components/ui/dialog.tsx create mode 100644 lib/utils.ts create mode 100644 lib/wagmi.ts create mode 100644 public/r/registry.json create mode 100644 public/r/requestnetwork.json create mode 100644 registry/default/payment-widget/components/connection-handler.tsx create mode 100644 registry/default/payment-widget/components/payment-modal.tsx create mode 100644 registry/default/payment-widget/components/wallet-connect-modal.tsx diff --git a/app/globals.css b/app/globals.css index a2dc41e..dc5753e 100644 --- a/app/globals.css +++ b/app/globals.css @@ -1,26 +1,86 @@ @import "tailwindcss"; +@import "tw-animate-css"; -:root { - --background: #ffffff; - --foreground: #171717; -} +@custom-variant dark (&:is(.dark *)); @theme inline { --color-background: var(--background); --color-foreground: var(--foreground); --font-sans: var(--font-geist-sans); --font-mono: var(--font-geist-mono); + --color-ring: var(--ring); + --color-input: var(--input); + --color-border: var(--border); + --color-destructive: var(--destructive); + --color-destructive-foreground: var(--destructive-foreground); + --color-accent-foreground: var(--accent-foreground); + --color-accent: var(--accent); + --color-muted-foreground: var(--muted-foreground); + --color-muted: var(--muted); + --color-secondary-foreground: var(--secondary-foreground); + --color-secondary: var(--secondary); + --color-primary-foreground: var(--primary-foreground); + --color-primary: var(--primary); + --color-popover-foreground: var(--popover-foreground); + --color-popover: var(--popover); + --color-card-foreground: var(--card-foreground); + --color-card: var(--card); + --radius-sm: calc(var(--radius) - 4px); + --radius-md: calc(var(--radius) - 2px); + --radius-lg: var(--radius); + --radius-xl: calc(var(--radius) + 4px); } -@media (prefers-color-scheme: dark) { - :root { - --background: #0a0a0a; - --foreground: #ededed; - } +:root { + --radius: 0.625rem; + --background: oklch(1 0 0); + --foreground: oklch(0.098 0.024 162); + --card: oklch(1 0 0); + --card-foreground: oklch(0.098 0.024 162); + --popover: oklch(1 0 0); + --popover-foreground: oklch(0.098 0.024 162); + --primary: oklch(0.68 0.15 174); + --primary-foreground: oklch(1 0 0); + --secondary: oklch(0.95 0.005 162); + --secondary-foreground: oklch(0.31 0.05 162); + --muted: oklch(0.97 0.002 162); + --muted-foreground: oklch(0.5 0.01 162); + --accent: oklch(0.92 0.08 174); + --accent-foreground: oklch(0.31 0.05 162); + --destructive: oklch(0.627 0.258 29.234); + --destructive-foreground: oklch(1 0 0); + --border: oklch(0.9 0.005 162); + --input: oklch(0.9 0.005 162); + --ring: oklch(0.68 0.15 174); } -body { - background: var(--background); - color: var(--foreground); - font-family: Arial, Helvetica, sans-serif; +.dark { + --background: oklch(0.098 0.024 162); + --foreground: oklch(1 0 0); + --card: oklch(0.15 0.02 162); + --card-foreground: oklch(1 0 0); + --popover: oklch(0.15 0.02 162); + --popover-foreground: oklch(1 0 0); + --primary: oklch(0.68 0.15 174); + --primary-foreground: oklch(0.098 0.024 162); + --secondary: oklch(0.31 0.05 162); + --secondary-foreground: oklch(1 0 0); + --muted: oklch(0.25 0.02 162); + --muted-foreground: oklch(0.7 0.01 162); + --accent: oklch(0.85 0.12 174); + --accent-foreground: oklch(0.098 0.024 162); + --destructive: oklch(0.627 0.258 29.234); + --destructive-foreground: oklch(1 0 0); + --border: oklch(0.25 0.02 162); + --input: oklch(0.25 0.02 162); + --ring: oklch(0.68 0.15 174); +} + +@layer base { + * { + @apply border-border outline-ring/50; + } + body { + @apply bg-background text-foreground; + } } diff --git a/app/layout.tsx b/app/layout.tsx index 96c4631..fb6592b 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -19,9 +19,9 @@ export const metadata: Metadata = { export default function RootLayout({ children, -}: Readonly<{ +}: { children: React.ReactNode; -}>) { +}) { return (

RequestNetwork UI Registry

Payment Widget Preview:

- +
diff --git a/components.json b/components.json index c987a1e..8870b22 100644 --- a/components.json +++ b/components.json @@ -12,6 +12,7 @@ }, "aliases": { "components": "@/components", + "ui": "@/components/ui", "utils": "@/lib/utils" }, "iconLibrary": "lucide" diff --git a/components/providers/web3-provider.tsx b/components/providers/web3-provider.tsx new file mode 100644 index 0000000..804271d --- /dev/null +++ b/components/providers/web3-provider.tsx @@ -0,0 +1,21 @@ +"use client"; + +import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; +import { WagmiProvider } from "wagmi"; +import { getWagmiConfig } from "@/lib/wagmi"; + +const queryClient = new QueryClient(); + +export function Web3Provider({ + children, + walletConnectProjectId, +}: { + children: React.ReactNode; + walletConnectProjectId?: string; +}) { + return ( + + {children} + + ); +} diff --git a/components/ui/button.tsx b/components/ui/button.tsx new file mode 100644 index 0000000..36496a2 --- /dev/null +++ b/components/ui/button.tsx @@ -0,0 +1,56 @@ +import * as React from "react" +import { Slot } from "@radix-ui/react-slot" +import { cva, type VariantProps } from "class-variance-authority" + +import { cn } from "@/lib/utils" + +const buttonVariants = cva( + "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0", + { + variants: { + variant: { + default: "bg-primary text-primary-foreground hover:bg-primary/90", + destructive: + "bg-destructive text-destructive-foreground hover:bg-destructive/90", + outline: + "border border-input bg-background hover:bg-accent hover:text-accent-foreground", + secondary: + "bg-secondary text-secondary-foreground hover:bg-secondary/80", + ghost: "hover:bg-accent hover:text-accent-foreground", + link: "text-primary underline-offset-4 hover:underline", + }, + size: { + default: "h-10 px-4 py-2", + sm: "h-9 rounded-md px-3", + lg: "h-11 rounded-md px-8", + icon: "h-10 w-10", + }, + }, + defaultVariants: { + variant: "default", + size: "default", + }, + } +) + +export interface ButtonProps + extends React.ButtonHTMLAttributes, + VariantProps { + asChild?: boolean +} + +const Button = React.forwardRef( + ({ className, variant, size, asChild = false, ...props }, ref) => { + const Comp = asChild ? Slot : "button" + return ( + + ) + } +) +Button.displayName = "Button" + +export { Button, buttonVariants } diff --git a/components/ui/dialog.tsx b/components/ui/dialog.tsx new file mode 100644 index 0000000..f38593b --- /dev/null +++ b/components/ui/dialog.tsx @@ -0,0 +1,122 @@ +"use client" + +import * as React from "react" +import * as DialogPrimitive from "@radix-ui/react-dialog" +import { X } from "lucide-react" + +import { cn } from "@/lib/utils" + +const Dialog = DialogPrimitive.Root + +const DialogTrigger = DialogPrimitive.Trigger + +const DialogPortal = DialogPrimitive.Portal + +const DialogClose = DialogPrimitive.Close + +const DialogOverlay = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +DialogOverlay.displayName = DialogPrimitive.Overlay.displayName + +const DialogContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + + + {children} + + + Close + + + +)) +DialogContent.displayName = DialogPrimitive.Content.displayName + +const DialogHeader = ({ + className, + ...props +}: React.HTMLAttributes) => ( +
+) +DialogHeader.displayName = "DialogHeader" + +const DialogFooter = ({ + className, + ...props +}: React.HTMLAttributes) => ( +
+) +DialogFooter.displayName = "DialogFooter" + +const DialogTitle = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +DialogTitle.displayName = DialogPrimitive.Title.displayName + +const DialogDescription = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +DialogDescription.displayName = DialogPrimitive.Description.displayName + +export { + Dialog, + DialogPortal, + DialogOverlay, + DialogClose, + DialogTrigger, + DialogContent, + DialogHeader, + DialogFooter, + DialogTitle, + DialogDescription, +} diff --git a/lib/utils.ts b/lib/utils.ts new file mode 100644 index 0000000..a5ef193 --- /dev/null +++ b/lib/utils.ts @@ -0,0 +1,6 @@ +import { clsx, type ClassValue } from "clsx"; +import { twMerge } from "tailwind-merge"; + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)); +} diff --git a/lib/wagmi.ts b/lib/wagmi.ts new file mode 100644 index 0000000..7a10cf4 --- /dev/null +++ b/lib/wagmi.ts @@ -0,0 +1,45 @@ +import { createConfig, http } from "wagmi"; +import { mainnet, sepolia } from "wagmi/chains"; +import { + injected, + walletConnect, + coinbaseWallet, + metaMask, + safe, +} from "wagmi/connectors"; + +export const getWagmiConfig = (walletConnectProjectId?: string) => { + const connectors = [ + injected(), + coinbaseWallet({ + appName: "Request Network Payment", + }), + metaMask(), + safe(), + ]; + + if (walletConnectProjectId) { + connectors.push( + walletConnect({ + projectId: walletConnectProjectId, + metadata: { + name: "Request Network Payment", + description: "Pay with cryptocurrency using Request Network", + url: "https://request.network", + icons: [], + }, + }) as any, // @TODO fix connector type + ); + } + + const config = createConfig({ + chains: [mainnet, sepolia], + connectors, + transports: { + [mainnet.id]: http(), + [sepolia.id]: http(), + }, + }); + + return config; +}; diff --git a/package-lock.json b/package-lock.json index ecb2a45..0611f4e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,9 +8,21 @@ "name": "ui-registry", "version": "0.1.0", "dependencies": { + "@radix-ui/react-dialog": "^1.1.15", + "@radix-ui/react-slot": "^1.2.3", + "@reown/appkit": "^1.8.2", + "@reown/appkit-adapter-wagmi": "^1.8.2", + "@tanstack/react-query": "^5.86.0", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "lucide-react": "^0.542.0", "next": "15.5.2", "react": "19.1.0", - "react-dom": "19.1.0" + "react-dom": "19.1.0", + "tailwind-merge": "^3.3.1", + "tw-animate-css": "^1.3.6", + "viem": "^2.37.3", + "wagmi": "^2.16.9" }, "devDependencies": { "@biomejs/biome": "2.2.0", @@ -23,6 +35,12 @@ "typescript": "^5" } }, + "node_modules/@adraffy/ens-normalize": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.11.0.tgz", + "integrity": "sha512-/3DDPKHqqIqxUULp8yP4zODUY1i+2xvVWsv8A79xGWdCAG+8sb0hRh0Rk2QyOJUnnbyPUAZYcpBuRe3nS2OIUg==", + "license": "MIT" + }, "node_modules/@alloc/quick-lru": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", @@ -434,6 +452,15 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/runtime": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.3.tgz", + "integrity": "sha512-9uIQ10o0WGdpP6GDhXcdOJPJuDgFtIDtN/9+ArJQ2NAfAmiuhTQdzkaTGR33v43GYS2UrSA0eX2pPPHoFVvpxA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/template": { "version": "7.27.2", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", @@ -482,6 +509,43 @@ "node": ">=6.9.0" } }, + "node_modules/@base-org/account": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@base-org/account/-/account-1.1.1.tgz", + "integrity": "sha512-IfVJPrDPhHfqXRDb89472hXkpvJuQQR7FDI9isLPHEqSYt/45whIoBxSPgZ0ssTt379VhQo4+87PWI1DoLSfAQ==", + "license": "Apache-2.0", + "dependencies": { + "@noble/hashes": "1.4.0", + "clsx": "1.2.1", + "eventemitter3": "5.0.1", + "idb-keyval": "6.2.1", + "ox": "0.6.9", + "preact": "10.24.2", + "viem": "^2.31.7", + "zustand": "5.0.3" + } + }, + "node_modules/@base-org/account/node_modules/@noble/hashes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@base-org/account/node_modules/clsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/@biomejs/biome": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.2.0.tgz", @@ -665,6 +729,43 @@ "statuses": "^2.0.1" } }, + "node_modules/@coinbase/wallet-sdk": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/@coinbase/wallet-sdk/-/wallet-sdk-4.3.6.tgz", + "integrity": "sha512-4q8BNG1ViL4mSAAvPAtpwlOs1gpC+67eQtgIwNvT3xyeyFFd+guwkc8bcX5rTmQhXpqnhzC4f0obACbP9CqMSA==", + "license": "Apache-2.0", + "dependencies": { + "@noble/hashes": "1.4.0", + "clsx": "1.2.1", + "eventemitter3": "5.0.1", + "idb-keyval": "6.2.1", + "ox": "0.6.9", + "preact": "10.24.2", + "viem": "^2.27.2", + "zustand": "5.0.3" + } + }, + "node_modules/@coinbase/wallet-sdk/node_modules/@noble/hashes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@coinbase/wallet-sdk/node_modules/clsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/@dotenvx/dotenvx": { "version": "1.49.0", "resolved": "https://registry.npmjs.org/@dotenvx/dotenvx/-/dotenvx-1.49.0.tgz", @@ -809,7 +910,6 @@ "version": "0.2.4", "resolved": "https://registry.npmjs.org/@ecies/ciphers/-/ciphers-0.2.4.tgz", "integrity": "sha512-t+iX+Wf5nRKyNzk8dviW3Ikb/280+aEJAnw9YXvCp2tYGPSkMki+NRY+8aNLmVFv3eNtMdvViPNOPxS8SZNP+w==", - "dev": true, "license": "MIT", "engines": { "bun": ">=1", @@ -830,6 +930,70 @@ "tslib": "^2.4.0" } }, + "node_modules/@ethereumjs/common": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-3.2.0.tgz", + "integrity": "sha512-pksvzI0VyLgmuEF2FA/JR/4/y6hcPq8OUail3/AvycBaW1d5VSauOZzqGvJ3RTmR4MU35lWE8KseKOsEhrFRBA==", + "license": "MIT", + "dependencies": { + "@ethereumjs/util": "^8.1.0", + "crc-32": "^1.2.0" + } + }, + "node_modules/@ethereumjs/rlp": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@ethereumjs/rlp/-/rlp-4.0.1.tgz", + "integrity": "sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==", + "license": "MPL-2.0", + "bin": { + "rlp": "bin/rlp" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@ethereumjs/tx": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-4.2.0.tgz", + "integrity": "sha512-1nc6VO4jtFd172BbSnTnDQVr9IYBFl1y4xPzZdtkrkKIncBCkdbgfdRV+MiTkJYAtTxvV12GRZLqBFT1PNK6Yw==", + "license": "MPL-2.0", + "dependencies": { + "@ethereumjs/common": "^3.2.0", + "@ethereumjs/rlp": "^4.0.1", + "@ethereumjs/util": "^8.1.0", + "ethereum-cryptography": "^2.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@ethereumjs/util": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/util/-/util-8.1.0.tgz", + "integrity": "sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA==", + "license": "MPL-2.0", + "dependencies": { + "@ethereumjs/rlp": "^4.0.1", + "ethereum-cryptography": "^2.0.0", + "micro-ftch": "^0.3.1" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@gemini-wallet/core": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@gemini-wallet/core/-/core-0.2.0.tgz", + "integrity": "sha512-vv9aozWnKrrPWQ3vIFcWk7yta4hQW1Ie0fsNNPeXnjAxkbXr2hqMagEptLuMxpEP2W3mnRu05VDNKzcvAuuZDw==", + "license": "MIT", + "dependencies": { + "@metamask/rpc-errors": "7.0.2", + "eventemitter3": "5.0.1" + }, + "peerDependencies": { + "viem": ">=2.0.0" + } + }, "node_modules/@img/sharp-darwin-arm64": { "version": "0.34.3", "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.3.tgz", @@ -1412,454 +1576,606 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@modelcontextprotocol/sdk": { - "version": "1.17.5", - "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.17.5.tgz", - "integrity": "sha512-QakrKIGniGuRVfWBdMsDea/dx1PNE739QJ7gCM41s9q+qaCYTHCdsIBXQVVXry3mfWAiaM9kT22Hyz53Uw8mfg==", - "dev": true, - "license": "MIT", + "node_modules/@lit-labs/ssr-dom-shim": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.4.0.tgz", + "integrity": "sha512-ficsEARKnmmW5njugNYKipTm4SFnbik7CXtoencDZzmzo/dQ+2Q0bgkzJuoJP20Aj0F+izzJjOqsnkd6F/o1bw==", + "license": "BSD-3-Clause" + }, + "node_modules/@lit/react": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@lit/react/-/react-1.0.8.tgz", + "integrity": "sha512-p2+YcF+JE67SRX3mMlJ1TKCSTsgyOVdAwd/nxp3NuV1+Cb6MWALbN6nT7Ld4tpmYofcE5kcaSY1YBB9erY+6fw==", + "license": "BSD-3-Clause", + "optional": true, + "peerDependencies": { + "@types/react": "17 || 18 || 19" + } + }, + "node_modules/@lit/reactive-element": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-2.1.1.tgz", + "integrity": "sha512-N+dm5PAYdQ8e6UlywyyrgI2t++wFGXfHx+dSJ1oBrg6FAxUj40jId++EaRm80MKX5JnlH1sBsyZ5h0bcZKemCg==", + "license": "BSD-3-Clause", "dependencies": { - "ajv": "^6.12.6", - "content-type": "^1.0.5", - "cors": "^2.8.5", - "cross-spawn": "^7.0.5", - "eventsource": "^3.0.2", - "eventsource-parser": "^3.0.0", - "express": "^5.0.1", - "express-rate-limit": "^7.5.0", - "pkce-challenge": "^5.0.0", - "raw-body": "^3.0.0", - "zod": "^3.23.8", - "zod-to-json-schema": "^3.24.1" + "@lit-labs/ssr-dom-shim": "^1.4.0" + } + }, + "node_modules/@metamask/eth-json-rpc-provider": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@metamask/eth-json-rpc-provider/-/eth-json-rpc-provider-1.0.1.tgz", + "integrity": "sha512-whiUMPlAOrVGmX8aKYVPvlKyG4CpQXiNNyt74vE1xb5sPvmx5oA7B/kOi/JdBvhGQq97U1/AVdXEdk2zkP8qyA==", + "dependencies": { + "@metamask/json-rpc-engine": "^7.0.0", + "@metamask/safe-event-emitter": "^3.0.0", + "@metamask/utils": "^5.0.1" }, "engines": { - "node": ">=18" + "node": ">=14.0.0" } }, - "node_modules/@mswjs/interceptors": { - "version": "0.39.6", - "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.39.6.tgz", - "integrity": "sha512-bndDP83naYYkfayr/qhBHMhk0YGwS1iv6vaEGcr0SQbO0IZtbOPqjKjds/WcG+bJA+1T5vCx6kprKOzn5Bg+Vw==", - "dev": true, - "license": "MIT", + "node_modules/@metamask/eth-json-rpc-provider/node_modules/@metamask/json-rpc-engine": { + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/@metamask/json-rpc-engine/-/json-rpc-engine-7.3.3.tgz", + "integrity": "sha512-dwZPq8wx9yV3IX2caLi9q9xZBw2XeIoYqdyihDDDpuHVCEiqadJLwqM3zy+uwf6F1QYQ65A8aOMQg1Uw7LMLNg==", + "license": "ISC", "dependencies": { - "@open-draft/deferred-promise": "^2.2.0", - "@open-draft/logger": "^0.3.0", - "@open-draft/until": "^2.0.0", - "is-node-process": "^1.2.0", - "outvariant": "^1.4.3", - "strict-event-emitter": "^0.5.1" + "@metamask/rpc-errors": "^6.2.1", + "@metamask/safe-event-emitter": "^3.0.0", + "@metamask/utils": "^8.3.0" }, "engines": { - "node": ">=18" + "node": ">=16.0.0" } }, - "node_modules/@next/env": { - "version": "15.5.2", - "resolved": "https://registry.npmjs.org/@next/env/-/env-15.5.2.tgz", - "integrity": "sha512-Qe06ew4zt12LeO6N7j8/nULSOe3fMXE4dM6xgpBQNvdzyK1sv5y4oAP3bq4LamrvGCZtmRYnW8URFCeX5nFgGg==", - "license": "MIT" + "node_modules/@metamask/eth-json-rpc-provider/node_modules/@metamask/json-rpc-engine/node_modules/@metamask/utils": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@metamask/utils/-/utils-8.5.0.tgz", + "integrity": "sha512-I6bkduevXb72TIM9q2LRO63JSsF9EXduh3sBr9oybNX2hNNpr/j1tEjXrsG0Uabm4MJ1xkGAQEMwifvKZIkyxQ==", + "license": "ISC", + "dependencies": { + "@ethereumjs/tx": "^4.2.0", + "@metamask/superstruct": "^3.0.0", + "@noble/hashes": "^1.3.1", + "@scure/base": "^1.1.3", + "@types/debug": "^4.1.7", + "debug": "^4.3.4", + "pony-cause": "^2.1.10", + "semver": "^7.5.4", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=16.0.0" + } }, - "node_modules/@next/swc-darwin-arm64": { - "version": "15.5.2", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.5.2.tgz", - "integrity": "sha512-8bGt577BXGSd4iqFygmzIfTYizHb0LGWqH+qgIF/2EDxS5JsSdERJKA8WgwDyNBZgTIIA4D8qUtoQHmxIIquoQ==", - "cpu": [ - "arm64" - ], + "node_modules/@metamask/eth-json-rpc-provider/node_modules/@metamask/rpc-errors": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@metamask/rpc-errors/-/rpc-errors-6.4.0.tgz", + "integrity": "sha512-1ugFO1UoirU2esS3juZanS/Fo8C8XYocCuBpfZI5N7ECtoG+zu0wF+uWZASik6CkO6w9n/Iebt4iI4pT0vptpg==", "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], + "dependencies": { + "@metamask/utils": "^9.0.0", + "fast-safe-stringify": "^2.0.6" + }, "engines": { - "node": ">= 10" + "node": ">=16.0.0" } }, - "node_modules/@next/swc-darwin-x64": { - "version": "15.5.2", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.5.2.tgz", - "integrity": "sha512-2DjnmR6JHK4X+dgTXt5/sOCu/7yPtqpYt8s8hLkHFK3MGkka2snTv3yRMdHvuRtJVkPwCGsvBSwmoQCHatauFQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], + "node_modules/@metamask/eth-json-rpc-provider/node_modules/@metamask/rpc-errors/node_modules/@metamask/utils": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@metamask/utils/-/utils-9.3.0.tgz", + "integrity": "sha512-w8CVbdkDrVXFJbfBSlDfafDR6BAkpDmv1bC1UJVCoVny5tW2RKAdn9i68Xf7asYT4TnUhl/hN4zfUiKQq9II4g==", + "license": "ISC", + "dependencies": { + "@ethereumjs/tx": "^4.2.0", + "@metamask/superstruct": "^3.1.0", + "@noble/hashes": "^1.3.1", + "@scure/base": "^1.1.3", + "@types/debug": "^4.1.7", + "debug": "^4.3.4", + "pony-cause": "^2.1.10", + "semver": "^7.5.4", + "uuid": "^9.0.1" + }, "engines": { - "node": ">= 10" + "node": ">=16.0.0" } }, - "node_modules/@next/swc-linux-arm64-gnu": { - "version": "15.5.2", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.5.2.tgz", - "integrity": "sha512-3j7SWDBS2Wov/L9q0mFJtEvQ5miIqfO4l7d2m9Mo06ddsgUK8gWfHGgbjdFlCp2Ek7MmMQZSxpGFqcC8zGh2AA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "node_modules/@metamask/eth-json-rpc-provider/node_modules/@metamask/utils": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@metamask/utils/-/utils-5.0.2.tgz", + "integrity": "sha512-yfmE79bRQtnMzarnKfX7AEJBwFTxvTyw3nBQlu/5rmGXrjAeAMltoGxO62TFurxrQAFMNa/fEjIHNvungZp0+g==", + "license": "ISC", + "dependencies": { + "@ethereumjs/tx": "^4.1.2", + "@types/debug": "^4.1.7", + "debug": "^4.3.4", + "semver": "^7.3.8", + "superstruct": "^1.0.3" + }, "engines": { - "node": ">= 10" + "node": ">=14.0.0" } }, - "node_modules/@next/swc-linux-arm64-musl": { - "version": "15.5.2", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.5.2.tgz", - "integrity": "sha512-s6N8k8dF9YGc5T01UPQ08yxsK6fUow5gG1/axWc1HVVBYQBgOjca4oUZF7s4p+kwhkB1bDSGR8QznWrFZ/Rt5g==", - "cpu": [ - "arm64" + "node_modules/@metamask/eth-json-rpc-provider/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" ], "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@metamask/json-rpc-engine": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@metamask/json-rpc-engine/-/json-rpc-engine-8.0.2.tgz", + "integrity": "sha512-IoQPmql8q7ABLruW7i4EYVHWUbF74yrp63bRuXV5Zf9BQwcn5H9Ww1eLtROYvI1bUXwOiHZ6qT5CWTrDc/t/AA==", + "license": "ISC", + "dependencies": { + "@metamask/rpc-errors": "^6.2.1", + "@metamask/safe-event-emitter": "^3.0.0", + "@metamask/utils": "^8.3.0" + }, "engines": { - "node": ">= 10" + "node": ">=16.0.0" } }, - "node_modules/@next/swc-linux-x64-gnu": { - "version": "15.5.2", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.5.2.tgz", - "integrity": "sha512-o1RV/KOODQh6dM6ZRJGZbc+MOAHww33Vbs5JC9Mp1gDk8cpEO+cYC/l7rweiEalkSm5/1WGa4zY7xrNwObN4+Q==", - "cpu": [ - "x64" - ], + "node_modules/@metamask/json-rpc-engine/node_modules/@metamask/rpc-errors": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@metamask/rpc-errors/-/rpc-errors-6.4.0.tgz", + "integrity": "sha512-1ugFO1UoirU2esS3juZanS/Fo8C8XYocCuBpfZI5N7ECtoG+zu0wF+uWZASik6CkO6w9n/Iebt4iI4pT0vptpg==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@metamask/utils": "^9.0.0", + "fast-safe-stringify": "^2.0.6" + }, "engines": { - "node": ">= 10" + "node": ">=16.0.0" } }, - "node_modules/@next/swc-linux-x64-musl": { - "version": "15.5.2", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.5.2.tgz", - "integrity": "sha512-/VUnh7w8RElYZ0IV83nUcP/J4KJ6LLYliiBIri3p3aW2giF+PAVgZb6mk8jbQSB3WlTai8gEmCAr7kptFa1H6g==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "node_modules/@metamask/json-rpc-engine/node_modules/@metamask/rpc-errors/node_modules/@metamask/utils": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@metamask/utils/-/utils-9.3.0.tgz", + "integrity": "sha512-w8CVbdkDrVXFJbfBSlDfafDR6BAkpDmv1bC1UJVCoVny5tW2RKAdn9i68Xf7asYT4TnUhl/hN4zfUiKQq9II4g==", + "license": "ISC", + "dependencies": { + "@ethereumjs/tx": "^4.2.0", + "@metamask/superstruct": "^3.1.0", + "@noble/hashes": "^1.3.1", + "@scure/base": "^1.1.3", + "@types/debug": "^4.1.7", + "debug": "^4.3.4", + "pony-cause": "^2.1.10", + "semver": "^7.5.4", + "uuid": "^9.0.1" + }, "engines": { - "node": ">= 10" + "node": ">=16.0.0" } }, - "node_modules/@next/swc-win32-arm64-msvc": { - "version": "15.5.2", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.5.2.tgz", - "integrity": "sha512-sMPyTvRcNKXseNQ/7qRfVRLa0VhR0esmQ29DD6pqvG71+JdVnESJaHPA8t7bc67KD5spP3+DOCNLhqlEI2ZgQg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], + "node_modules/@metamask/json-rpc-engine/node_modules/@metamask/utils": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@metamask/utils/-/utils-8.5.0.tgz", + "integrity": "sha512-I6bkduevXb72TIM9q2LRO63JSsF9EXduh3sBr9oybNX2hNNpr/j1tEjXrsG0Uabm4MJ1xkGAQEMwifvKZIkyxQ==", + "license": "ISC", + "dependencies": { + "@ethereumjs/tx": "^4.2.0", + "@metamask/superstruct": "^3.0.0", + "@noble/hashes": "^1.3.1", + "@scure/base": "^1.1.3", + "@types/debug": "^4.1.7", + "debug": "^4.3.4", + "pony-cause": "^2.1.10", + "semver": "^7.5.4", + "uuid": "^9.0.1" + }, "engines": { - "node": ">= 10" + "node": ">=16.0.0" } }, - "node_modules/@next/swc-win32-x64-msvc": { - "version": "15.5.2", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.5.2.tgz", - "integrity": "sha512-W5VvyZHnxG/2ukhZF/9Ikdra5fdNftxI6ybeVKYvBPDtyx7x4jPPSNduUkfH5fo3zG0JQ0bPxgy41af2JX5D4Q==", - "cpu": [ - "x64" + "node_modules/@metamask/json-rpc-engine/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" ], "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" + "bin": { + "uuid": "dist/bin/uuid" } }, - "node_modules/@noble/ciphers": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.3.0.tgz", - "integrity": "sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.21.3 || >=16" + "node_modules/@metamask/json-rpc-middleware-stream": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@metamask/json-rpc-middleware-stream/-/json-rpc-middleware-stream-7.0.2.tgz", + "integrity": "sha512-yUdzsJK04Ev98Ck4D7lmRNQ8FPioXYhEUZOMS01LXW8qTvPGiRVXmVltj2p4wrLkh0vW7u6nv0mNl5xzC5Qmfg==", + "license": "ISC", + "dependencies": { + "@metamask/json-rpc-engine": "^8.0.2", + "@metamask/safe-event-emitter": "^3.0.0", + "@metamask/utils": "^8.3.0", + "readable-stream": "^3.6.2" }, - "funding": { - "url": "https://paulmillr.com/funding/" + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@noble/curves": { - "version": "1.9.7", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.7.tgz", - "integrity": "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==", - "dev": true, - "license": "MIT", + "node_modules/@metamask/json-rpc-middleware-stream/node_modules/@metamask/utils": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@metamask/utils/-/utils-8.5.0.tgz", + "integrity": "sha512-I6bkduevXb72TIM9q2LRO63JSsF9EXduh3sBr9oybNX2hNNpr/j1tEjXrsG0Uabm4MJ1xkGAQEMwifvKZIkyxQ==", + "license": "ISC", "dependencies": { - "@noble/hashes": "1.8.0" + "@ethereumjs/tx": "^4.2.0", + "@metamask/superstruct": "^3.0.0", + "@noble/hashes": "^1.3.1", + "@scure/base": "^1.1.3", + "@types/debug": "^4.1.7", + "debug": "^4.3.4", + "pony-cause": "^2.1.10", + "semver": "^7.5.4", + "uuid": "^9.0.1" }, "engines": { - "node": "^14.21.3 || >=16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" + "node": ">=16.0.0" } }, - "node_modules/@noble/hashes": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", - "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", - "dev": true, + "node_modules/@metamask/json-rpc-middleware-stream/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], "license": "MIT", - "engines": { - "node": "^14.21.3 || >=16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" + "bin": { + "uuid": "dist/bin/uuid" } }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "license": "MIT", + "node_modules/@metamask/object-multiplex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@metamask/object-multiplex/-/object-multiplex-2.1.0.tgz", + "integrity": "sha512-4vKIiv0DQxljcXwfpnbsXcfa5glMj5Zg9mqn4xpIWqkv6uJ2ma5/GtUfLFSxhlxnR8asRMv8dDmWya1Tc1sDFA==", + "license": "ISC", "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "once": "^1.4.0", + "readable-stream": "^3.6.2" }, "engines": { - "node": ">= 8" + "node": "^16.20 || ^18.16 || >=20" } }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, + "node_modules/@metamask/onboarding": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@metamask/onboarding/-/onboarding-1.0.1.tgz", + "integrity": "sha512-FqHhAsCI+Vacx2qa5mAFcWNSrTcVGMNjzxVgaX8ECSny/BJ9/vgXP9V7WF/8vb9DltPeQkxr+Fnfmm6GHfmdTQ==", "license": "MIT", - "engines": { - "node": ">= 8" + "dependencies": { + "bowser": "^2.9.0" } }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, + "node_modules/@metamask/providers": { + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/@metamask/providers/-/providers-16.1.0.tgz", + "integrity": "sha512-znVCvux30+3SaUwcUGaSf+pUckzT5ukPRpcBmy+muBLC0yaWnBcvDqGfcsw6CBIenUdFrVoAFa8B6jsuCY/a+g==", "license": "MIT", "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" + "@metamask/json-rpc-engine": "^8.0.1", + "@metamask/json-rpc-middleware-stream": "^7.0.1", + "@metamask/object-multiplex": "^2.0.0", + "@metamask/rpc-errors": "^6.2.1", + "@metamask/safe-event-emitter": "^3.1.1", + "@metamask/utils": "^8.3.0", + "detect-browser": "^5.2.0", + "extension-port-stream": "^3.0.0", + "fast-deep-equal": "^3.1.3", + "is-stream": "^2.0.0", + "readable-stream": "^3.6.2", + "webextension-polyfill": "^0.10.0" }, "engines": { - "node": ">= 8" + "node": "^18.18 || >=20" } }, - "node_modules/@open-draft/deferred-promise": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz", - "integrity": "sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@open-draft/logger": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@open-draft/logger/-/logger-0.3.0.tgz", - "integrity": "sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==", - "dev": true, + "node_modules/@metamask/providers/node_modules/@metamask/rpc-errors": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@metamask/rpc-errors/-/rpc-errors-6.4.0.tgz", + "integrity": "sha512-1ugFO1UoirU2esS3juZanS/Fo8C8XYocCuBpfZI5N7ECtoG+zu0wF+uWZASik6CkO6w9n/Iebt4iI4pT0vptpg==", "license": "MIT", "dependencies": { - "is-node-process": "^1.2.0", - "outvariant": "^1.4.0" + "@metamask/utils": "^9.0.0", + "fast-safe-stringify": "^2.0.6" + }, + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@open-draft/until": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@open-draft/until/-/until-2.1.0.tgz", - "integrity": "sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==", - "dev": true, - "license": "MIT" + "node_modules/@metamask/providers/node_modules/@metamask/rpc-errors/node_modules/@metamask/utils": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@metamask/utils/-/utils-9.3.0.tgz", + "integrity": "sha512-w8CVbdkDrVXFJbfBSlDfafDR6BAkpDmv1bC1UJVCoVny5tW2RKAdn9i68Xf7asYT4TnUhl/hN4zfUiKQq9II4g==", + "license": "ISC", + "dependencies": { + "@ethereumjs/tx": "^4.2.0", + "@metamask/superstruct": "^3.1.0", + "@noble/hashes": "^1.3.1", + "@scure/base": "^1.1.3", + "@types/debug": "^4.1.7", + "debug": "^4.3.4", + "pony-cause": "^2.1.10", + "semver": "^7.5.4", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=16.0.0" + } }, - "node_modules/@sec-ant/readable-stream": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", - "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==", - "dev": true, - "license": "MIT" + "node_modules/@metamask/providers/node_modules/@metamask/utils": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@metamask/utils/-/utils-8.5.0.tgz", + "integrity": "sha512-I6bkduevXb72TIM9q2LRO63JSsF9EXduh3sBr9oybNX2hNNpr/j1tEjXrsG0Uabm4MJ1xkGAQEMwifvKZIkyxQ==", + "license": "ISC", + "dependencies": { + "@ethereumjs/tx": "^4.2.0", + "@metamask/superstruct": "^3.0.0", + "@noble/hashes": "^1.3.1", + "@scure/base": "^1.1.3", + "@types/debug": "^4.1.7", + "debug": "^4.3.4", + "pony-cause": "^2.1.10", + "semver": "^7.5.4", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=16.0.0" + } }, - "node_modules/@sindresorhus/merge-streams": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz", - "integrity": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==", - "dev": true, + "node_modules/@metamask/providers/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "license": "MIT", "engines": { - "node": ">=18" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@swc/helpers": { - "version": "0.5.15", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", - "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.8.0" - } - }, - "node_modules/@tailwindcss/node": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.12.tgz", - "integrity": "sha512-3hm9brwvQkZFe++SBt+oLjo4OLDtkvlE8q2WalaD/7QWaeM7KEJbAiY/LJZUaCs7Xa8aUu4xy3uoyX4q54UVdQ==", - "dev": true, + "node_modules/@metamask/providers/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], "license": "MIT", - "dependencies": { - "@jridgewell/remapping": "^2.3.4", - "enhanced-resolve": "^5.18.3", - "jiti": "^2.5.1", - "lightningcss": "1.30.1", - "magic-string": "^0.30.17", - "source-map-js": "^1.2.1", - "tailwindcss": "4.1.12" + "bin": { + "uuid": "dist/bin/uuid" } }, - "node_modules/@tailwindcss/oxide": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.12.tgz", - "integrity": "sha512-gM5EoKHW/ukmlEtphNwaGx45fGoEmP10v51t9unv55voWh6WrOL19hfuIdo2FjxIaZzw776/BUQg7Pck++cIVw==", - "dev": true, - "hasInstallScript": true, + "node_modules/@metamask/rpc-errors": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@metamask/rpc-errors/-/rpc-errors-7.0.2.tgz", + "integrity": "sha512-YYYHsVYd46XwY2QZzpGeU4PSdRhHdxnzkB8piWGvJW2xbikZ3R+epAYEL4q/K8bh9JPTucsUdwRFnACor1aOYw==", "license": "MIT", "dependencies": { - "detect-libc": "^2.0.4", - "tar": "^7.4.3" + "@metamask/utils": "^11.0.1", + "fast-safe-stringify": "^2.0.6" }, "engines": { - "node": ">= 10" - }, - "optionalDependencies": { - "@tailwindcss/oxide-android-arm64": "4.1.12", - "@tailwindcss/oxide-darwin-arm64": "4.1.12", - "@tailwindcss/oxide-darwin-x64": "4.1.12", - "@tailwindcss/oxide-freebsd-x64": "4.1.12", - "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.12", - "@tailwindcss/oxide-linux-arm64-gnu": "4.1.12", - "@tailwindcss/oxide-linux-arm64-musl": "4.1.12", - "@tailwindcss/oxide-linux-x64-gnu": "4.1.12", - "@tailwindcss/oxide-linux-x64-musl": "4.1.12", - "@tailwindcss/oxide-wasm32-wasi": "4.1.12", - "@tailwindcss/oxide-win32-arm64-msvc": "4.1.12", - "@tailwindcss/oxide-win32-x64-msvc": "4.1.12" + "node": "^18.20 || ^20.17 || >=22" } }, - "node_modules/@tailwindcss/oxide-android-arm64": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.12.tgz", - "integrity": "sha512-oNY5pq+1gc4T6QVTsZKwZaGpBb2N1H1fsc1GD4o7yinFySqIuRZ2E4NvGasWc6PhYJwGK2+5YT1f9Tp80zUQZQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], + "node_modules/@metamask/safe-event-emitter": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@metamask/safe-event-emitter/-/safe-event-emitter-3.1.2.tgz", + "integrity": "sha512-5yb2gMI1BDm0JybZezeoX/3XhPDOtTbcFvpTXM9kxsoZjPZFh4XciqRbpD6N86HYZqWDhEaKUDuOyR0sQHEjMA==", + "license": "ISC", "engines": { - "node": ">= 10" + "node": ">=12.0.0" } }, - "node_modules/@tailwindcss/oxide-darwin-arm64": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.12.tgz", - "integrity": "sha512-cq1qmq2HEtDV9HvZlTtrj671mCdGB93bVY6J29mwCyaMYCP/JaUBXxrQQQm7Qn33AXXASPUb2HFZlWiiHWFytw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" + "node_modules/@metamask/sdk": { + "version": "0.32.0", + "resolved": "https://registry.npmjs.org/@metamask/sdk/-/sdk-0.32.0.tgz", + "integrity": "sha512-WmGAlP1oBuD9hk4CsdlG1WJFuPtYJY+dnTHJMeCyohTWD2GgkcLMUUuvu9lO1/NVzuOoSi1OrnjbuY1O/1NZ1g==", + "dependencies": { + "@babel/runtime": "^7.26.0", + "@metamask/onboarding": "^1.0.1", + "@metamask/providers": "16.1.0", + "@metamask/sdk-communication-layer": "0.32.0", + "@metamask/sdk-install-modal-web": "0.32.0", + "@paulmillr/qr": "^0.2.1", + "bowser": "^2.9.0", + "cross-fetch": "^4.0.0", + "debug": "^4.3.4", + "eciesjs": "^0.4.11", + "eth-rpc-errors": "^4.0.3", + "eventemitter2": "^6.4.9", + "obj-multiplex": "^1.0.0", + "pump": "^3.0.0", + "readable-stream": "^3.6.2", + "socket.io-client": "^4.5.1", + "tslib": "^2.6.0", + "util": "^0.12.4", + "uuid": "^8.3.2" + } + }, + "node_modules/@metamask/sdk-communication-layer": { + "version": "0.32.0", + "resolved": "https://registry.npmjs.org/@metamask/sdk-communication-layer/-/sdk-communication-layer-0.32.0.tgz", + "integrity": "sha512-dmj/KFjMi1fsdZGIOtbhxdg3amxhKL/A5BqSU4uh/SyDKPub/OT+x5pX8bGjpTL1WPWY/Q0OIlvFyX3VWnT06Q==", + "dependencies": { + "bufferutil": "^4.0.8", + "date-fns": "^2.29.3", + "debug": "^4.3.4", + "utf-8-validate": "^5.0.2", + "uuid": "^8.3.2" + }, + "peerDependencies": { + "cross-fetch": "^4.0.0", + "eciesjs": "*", + "eventemitter2": "^6.4.9", + "readable-stream": "^3.6.2", + "socket.io-client": "^4.5.1" } }, - "node_modules/@tailwindcss/oxide-darwin-x64": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.12.tgz", - "integrity": "sha512-6UCsIeFUcBfpangqlXay9Ffty9XhFH1QuUFn0WV83W8lGdX8cD5/+2ONLluALJD5+yJ7k8mVtwy3zMZmzEfbLg==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/@metamask/sdk-install-modal-web": { + "version": "0.32.0", + "resolved": "https://registry.npmjs.org/@metamask/sdk-install-modal-web/-/sdk-install-modal-web-0.32.0.tgz", + "integrity": "sha512-TFoktj0JgfWnQaL3yFkApqNwcaqJ+dw4xcnrJueMP3aXkSNev2Ido+WVNOg4IIMxnmOrfAC9t0UJ0u/dC9MjOQ==", + "dependencies": { + "@paulmillr/qr": "^0.2.1" + } + }, + "node_modules/@metamask/superstruct": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@metamask/superstruct/-/superstruct-3.2.1.tgz", + "integrity": "sha512-fLgJnDOXFmuVlB38rUN5SmU7hAFQcCjrg3Vrxz67KTY7YHFnSNEKvX4avmEBdOI0yTCxZjwMCFEqsC8k2+Wd3g==", "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], "engines": { - "node": ">= 10" + "node": ">=16.0.0" } }, - "node_modules/@tailwindcss/oxide-freebsd-x64": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.12.tgz", - "integrity": "sha512-JOH/f7j6+nYXIrHobRYCtoArJdMJh5zy5lr0FV0Qu47MID/vqJAY3r/OElPzx1C/wdT1uS7cPq+xdYYelny1ww==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], + "node_modules/@metamask/utils": { + "version": "11.7.0", + "resolved": "https://registry.npmjs.org/@metamask/utils/-/utils-11.7.0.tgz", + "integrity": "sha512-IamqpZF8Lr4WeXJ84fD+Sy+v1Zo05SYuMPHHBrZWpzVbnHAmXQpL4ckn9s5dfA+zylp3WGypaBPb6SBZdOhuNQ==", + "license": "ISC", + "dependencies": { + "@ethereumjs/tx": "^4.2.0", + "@metamask/superstruct": "^3.1.0", + "@noble/hashes": "^1.3.1", + "@scure/base": "^1.1.3", + "@types/debug": "^4.1.7", + "@types/lodash": "^4.17.20", + "debug": "^4.3.4", + "lodash": "^4.17.21", + "pony-cause": "^2.1.10", + "semver": "^7.5.4", + "uuid": "^9.0.1" + }, "engines": { - "node": ">= 10" + "node": "^18.18 || ^20.14 || >=22" } }, - "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.12.tgz", - "integrity": "sha512-v4Ghvi9AU1SYgGr3/j38PD8PEe6bRfTnNSUE3YCMIRrrNigCFtHZ2TCm8142X8fcSqHBZBceDx+JlFJEfNg5zQ==", - "cpu": [ - "arm" + "node_modules/@metamask/utils/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" ], - "dev": true, "license": "MIT", - "optional": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@modelcontextprotocol/sdk": { + "version": "1.17.5", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.17.5.tgz", + "integrity": "sha512-QakrKIGniGuRVfWBdMsDea/dx1PNE739QJ7gCM41s9q+qaCYTHCdsIBXQVVXry3mfWAiaM9kT22Hyz53Uw8mfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.6", + "content-type": "^1.0.5", + "cors": "^2.8.5", + "cross-spawn": "^7.0.5", + "eventsource": "^3.0.2", + "eventsource-parser": "^3.0.0", + "express": "^5.0.1", + "express-rate-limit": "^7.5.0", + "pkce-challenge": "^5.0.0", + "raw-body": "^3.0.0", + "zod": "^3.23.8", + "zod-to-json-schema": "^3.24.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@msgpack/msgpack": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@msgpack/msgpack/-/msgpack-3.1.2.tgz", + "integrity": "sha512-JEW4DEtBzfe8HvUYecLU9e6+XJnKDlUAIve8FvPzF3Kzs6Xo/KuZkZJsDH0wJXl/qEZbeeE7edxDNY3kMs39hQ==", + "license": "ISC", + "engines": { + "node": ">= 18" + } + }, + "node_modules/@mswjs/interceptors": { + "version": "0.39.6", + "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.39.6.tgz", + "integrity": "sha512-bndDP83naYYkfayr/qhBHMhk0YGwS1iv6vaEGcr0SQbO0IZtbOPqjKjds/WcG+bJA+1T5vCx6kprKOzn5Bg+Vw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@open-draft/deferred-promise": "^2.2.0", + "@open-draft/logger": "^0.3.0", + "@open-draft/until": "^2.0.0", + "is-node-process": "^1.2.0", + "outvariant": "^1.4.3", + "strict-event-emitter": "^0.5.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@next/env": { + "version": "15.5.2", + "resolved": "https://registry.npmjs.org/@next/env/-/env-15.5.2.tgz", + "integrity": "sha512-Qe06ew4zt12LeO6N7j8/nULSOe3fMXE4dM6xgpBQNvdzyK1sv5y4oAP3bq4LamrvGCZtmRYnW8URFCeX5nFgGg==", + "license": "MIT" + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "15.5.2", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.5.2.tgz", + "integrity": "sha512-8bGt577BXGSd4iqFygmzIfTYizHb0LGWqH+qgIF/2EDxS5JsSdERJKA8WgwDyNBZgTIIA4D8qUtoQHmxIIquoQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, "os": [ - "linux" + "darwin" ], "engines": { "node": ">= 10" } }, - "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.12.tgz", - "integrity": "sha512-YP5s1LmetL9UsvVAKusHSyPlzSRqYyRB0f+Kl/xcYQSPLEw/BvGfxzbH+ihUciePDjiXwHh+p+qbSP3SlJw+6g==", + "node_modules/@next/swc-darwin-x64": { + "version": "15.5.2", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.5.2.tgz", + "integrity": "sha512-2DjnmR6JHK4X+dgTXt5/sOCu/7yPtqpYt8s8hLkHFK3MGkka2snTv3yRMdHvuRtJVkPwCGsvBSwmoQCHatauFQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "15.5.2", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.5.2.tgz", + "integrity": "sha512-3j7SWDBS2Wov/L9q0mFJtEvQ5miIqfO4l7d2m9Mo06ddsgUK8gWfHGgbjdFlCp2Ek7MmMQZSxpGFqcC8zGh2AA==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1869,14 +2185,13 @@ "node": ">= 10" } }, - "node_modules/@tailwindcss/oxide-linux-arm64-musl": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.12.tgz", - "integrity": "sha512-V8pAM3s8gsrXcCv6kCHSuwyb/gPsd863iT+v1PGXC4fSL/OJqsKhfK//v8P+w9ThKIoqNbEnsZqNy+WDnwQqCA==", + "node_modules/@next/swc-linux-arm64-musl": { + "version": "15.5.2", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.5.2.tgz", + "integrity": "sha512-s6N8k8dF9YGc5T01UPQ08yxsK6fUow5gG1/axWc1HVVBYQBgOjca4oUZF7s4p+kwhkB1bDSGR8QznWrFZ/Rt5g==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1886,14 +2201,13 @@ "node": ">= 10" } }, - "node_modules/@tailwindcss/oxide-linux-x64-gnu": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.12.tgz", - "integrity": "sha512-xYfqYLjvm2UQ3TZggTGrwxjYaLB62b1Wiysw/YE3Yqbh86sOMoTn0feF98PonP7LtjsWOWcXEbGqDL7zv0uW8Q==", + "node_modules/@next/swc-linux-x64-gnu": { + "version": "15.5.2", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.5.2.tgz", + "integrity": "sha512-o1RV/KOODQh6dM6ZRJGZbc+MOAHww33Vbs5JC9Mp1gDk8cpEO+cYC/l7rweiEalkSm5/1WGa4zY7xrNwObN4+Q==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1903,14 +2217,13 @@ "node": ">= 10" } }, - "node_modules/@tailwindcss/oxide-linux-x64-musl": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.12.tgz", - "integrity": "sha512-ha0pHPamN+fWZY7GCzz5rKunlv9L5R8kdh+YNvP5awe3LtuXb5nRi/H27GeL2U+TdhDOptU7T6Is7mdwh5Ar3A==", + "node_modules/@next/swc-linux-x64-musl": { + "version": "15.5.2", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.5.2.tgz", + "integrity": "sha512-/VUnh7w8RElYZ0IV83nUcP/J4KJ6LLYliiBIri3p3aW2giF+PAVgZb6mk8jbQSB3WlTai8gEmCAr7kptFa1H6g==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1920,140 +2233,2940 @@ "node": ">= 10" } }, - "node_modules/@tailwindcss/oxide-wasm32-wasi": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.12.tgz", - "integrity": "sha512-4tSyu3dW+ktzdEpuk6g49KdEangu3eCYoqPhWNsZgUhyegEda3M9rG0/j1GV/JjVVsj+lG7jWAyrTlLzd/WEBg==", - "bundleDependencies": [ - "@napi-rs/wasm-runtime", - "@emnapi/core", - "@emnapi/runtime", - "@tybys/wasm-util", - "@emnapi/wasi-threads", - "tslib" + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "15.5.2", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.5.2.tgz", + "integrity": "sha512-sMPyTvRcNKXseNQ/7qRfVRLa0VhR0esmQ29DD6pqvG71+JdVnESJaHPA8t7bc67KD5spP3+DOCNLhqlEI2ZgQg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "15.5.2", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.5.2.tgz", + "integrity": "sha512-W5VvyZHnxG/2ukhZF/9Ikdra5fdNftxI6ybeVKYvBPDtyx7x4jPPSNduUkfH5fo3zG0JQ0bPxgy41af2JX5D4Q==", "cpu": [ - "wasm32" + "x64" ], - "dev": true, "license": "MIT", "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@noble/ciphers": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.3.0.tgz", + "integrity": "sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/curves": { + "version": "1.9.7", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.7.tgz", + "integrity": "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==", + "license": "MIT", "dependencies": { - "@emnapi/core": "^1.4.5", - "@emnapi/runtime": "^1.4.5", - "@emnapi/wasi-threads": "^1.0.4", - "@napi-rs/wasm-runtime": "^0.2.12", - "@tybys/wasm-util": "^0.10.0", - "tslib": "^2.8.0" + "@noble/hashes": "1.8.0" + }, + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/hashes": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@open-draft/deferred-promise": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz", + "integrity": "sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@open-draft/logger": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@open-draft/logger/-/logger-0.3.0.tgz", + "integrity": "sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-node-process": "^1.2.0", + "outvariant": "^1.4.0" + } + }, + "node_modules/@open-draft/until": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@open-draft/until/-/until-2.1.0.tgz", + "integrity": "sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@paulmillr/qr": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@paulmillr/qr/-/qr-0.2.1.tgz", + "integrity": "sha512-IHnV6A+zxU7XwmKFinmYjUcwlyK9+xkG3/s9KcQhI9BjQKycrJ1JRO+FbNYPwZiPKW3je/DR0k7w8/gLa5eaxQ==", + "deprecated": "The package is now available as \"qr\": npm install qr", + "license": "(MIT OR Apache-2.0)", + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@phosphor-icons/webcomponents": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@phosphor-icons/webcomponents/-/webcomponents-2.1.5.tgz", + "integrity": "sha512-JcvQkZxvcX2jK+QCclm8+e8HXqtdFW9xV4/kk2aL9Y3dJA2oQVt+pzbv1orkumz3rfx4K9mn9fDoMr1He1yr7Q==", + "license": "MIT", + "dependencies": { + "lit": "^3" + } + }, + "node_modules/@radix-ui/primitive": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz", + "integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", + "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", + "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.15.tgz", + "integrity": "sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.11.tgz", + "integrity": "sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-escape-keydown": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-guards": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.3.tgz", + "integrity": "sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-scope": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.7.tgz", + "integrity": "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-id": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz", + "integrity": "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-portal": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz", + "integrity": "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-presence": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.5.tgz", + "integrity": "sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-primitive": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", + "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz", + "integrity": "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz", + "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-effect-event": "0.0.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-effect-event": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz", + "integrity": "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-escape-keydown": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz", + "integrity": "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-callback-ref": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz", + "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@reown/appkit": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@reown/appkit/-/appkit-1.8.2.tgz", + "integrity": "sha512-nCFMGQX3+XHTmd8pkWtyGRj+INFgeg0sRYxLZKQktvFsiR98BFjP9DQIErIujdk2chRx5mX0gGc5s9OvaRJNyA==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@reown/appkit-common": "1.8.2", + "@reown/appkit-controllers": "1.8.2", + "@reown/appkit-pay": "1.8.2", + "@reown/appkit-polyfills": "1.8.2", + "@reown/appkit-scaffold-ui": "1.8.2", + "@reown/appkit-ui": "1.8.2", + "@reown/appkit-utils": "1.8.2", + "@reown/appkit-wallet": "1.8.2", + "@walletconnect/universal-provider": "2.21.7", + "bs58": "6.0.0", + "semver": "7.7.2", + "valtio": "2.1.5", + "viem": ">=2.33.3" + }, + "optionalDependencies": { + "@lit/react": "1.0.8" + } + }, + "node_modules/@reown/appkit-adapter-wagmi": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@reown/appkit-adapter-wagmi/-/appkit-adapter-wagmi-1.8.2.tgz", + "integrity": "sha512-7VfKKjDZkr3C9Bbx19FQfP3umHaw13ZZKbde+DjZNxWGx2CScOMZ187wXa+FU7umkvmXlAdYSbOzFFmriiEwNw==", + "license": "Apache-2.0", + "dependencies": { + "@reown/appkit": "1.8.2", + "@reown/appkit-common": "1.8.2", + "@reown/appkit-controllers": "1.8.2", + "@reown/appkit-polyfills": "1.8.2", + "@reown/appkit-scaffold-ui": "1.8.2", + "@reown/appkit-utils": "1.8.2", + "@reown/appkit-wallet": "1.8.2", + "@walletconnect/universal-provider": "2.21.7", + "valtio": "2.1.5" + }, + "optionalDependencies": { + "@wagmi/connectors": ">=5.7.11" + }, + "peerDependencies": { + "@wagmi/core": ">=2.16.7", + "viem": ">=2.33.3", + "wagmi": ">=2.16.3" + } + }, + "node_modules/@reown/appkit-common": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@reown/appkit-common/-/appkit-common-1.8.2.tgz", + "integrity": "sha512-xlo1pRh1DkZfB7I1JkeC8ELlsM7ziSG/oJig1KgTsNZPQdYC9fADWY7vH/daUUkgS8QQbINc7HW8WAR1DkA+dw==", + "license": "Apache-2.0", + "dependencies": { + "big.js": "6.2.2", + "dayjs": "1.11.13", + "viem": ">=2.33.3" + } + }, + "node_modules/@reown/appkit-controllers": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@reown/appkit-controllers/-/appkit-controllers-1.8.2.tgz", + "integrity": "sha512-ccGbuiKNceCmh8JxtcDFc115fosJ2abcSfDo4HVSSgew/4rPzqIsD/TPfBLgk2KOAi7RF4keC5mckHHIWfmoFw==", + "license": "Apache-2.0", + "dependencies": { + "@reown/appkit-common": "1.8.2", + "@reown/appkit-wallet": "1.8.2", + "@walletconnect/universal-provider": "2.21.7", + "valtio": "2.1.5", + "viem": ">=2.33.3" + } + }, + "node_modules/@reown/appkit-pay": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@reown/appkit-pay/-/appkit-pay-1.8.2.tgz", + "integrity": "sha512-8rBB/sNty9P4oKVgETFmUXh6iFfbr+UWmpN7TThtMAFXuAGevbHKIF4ZXNjvF63L5knpOF8elVNNmSXyxHpInA==", + "license": "Apache-2.0", + "dependencies": { + "@reown/appkit-common": "1.8.2", + "@reown/appkit-controllers": "1.8.2", + "@reown/appkit-ui": "1.8.2", + "@reown/appkit-utils": "1.8.2", + "lit": "3.3.0", + "valtio": "2.1.5" + } + }, + "node_modules/@reown/appkit-polyfills": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@reown/appkit-polyfills/-/appkit-polyfills-1.8.2.tgz", + "integrity": "sha512-D1npLFY3q/X6qh241lh47DfL1EaPpMEeVtV7c2HFdmitUgXqc2BgH7mhMfpI3UgaT42+eP5+W+KanZwwyraNPw==", + "license": "Apache-2.0", + "dependencies": { + "buffer": "6.0.3" + } + }, + "node_modules/@reown/appkit-scaffold-ui": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@reown/appkit-scaffold-ui/-/appkit-scaffold-ui-1.8.2.tgz", + "integrity": "sha512-AmcMlrovF6NLsopRGgjRYoWMx9R04Tf7G4g+O3I/I09iKv+whz3yjQDePuxhymsCbH5pUvuGkmvVl3mMvhCR0Q==", + "license": "Apache-2.0", + "dependencies": { + "@reown/appkit-common": "1.8.2", + "@reown/appkit-controllers": "1.8.2", + "@reown/appkit-ui": "1.8.2", + "@reown/appkit-utils": "1.8.2", + "@reown/appkit-wallet": "1.8.2", + "lit": "3.3.0" + } + }, + "node_modules/@reown/appkit-ui": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@reown/appkit-ui/-/appkit-ui-1.8.2.tgz", + "integrity": "sha512-tdYFBmFLIQzqO0QYo6KJTWJ8UZ5yyqmQ4+YnD1PL4pIMPAaFcVB9ZP0ESSX1eX+bGKkBc+I/rbwKgyqTIJLV9Q==", + "license": "Apache-2.0", + "dependencies": { + "@phosphor-icons/webcomponents": "2.1.5", + "@reown/appkit-common": "1.8.2", + "@reown/appkit-controllers": "1.8.2", + "@reown/appkit-wallet": "1.8.2", + "lit": "3.3.0", + "qrcode": "1.5.3" + } + }, + "node_modules/@reown/appkit-utils": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@reown/appkit-utils/-/appkit-utils-1.8.2.tgz", + "integrity": "sha512-MBhZBCSMNeP6zQ/NVDqEK4DZttUMLEtO/G5WK4Yhzvzra54Z5VIzTPg5bnNe+ntAJ19AL2P7dh8RjaazdMN7Aw==", + "license": "Apache-2.0", + "dependencies": { + "@reown/appkit-common": "1.8.2", + "@reown/appkit-controllers": "1.8.2", + "@reown/appkit-polyfills": "1.8.2", + "@reown/appkit-wallet": "1.8.2", + "@wallet-standard/wallet": "1.1.0", + "@walletconnect/logger": "2.1.2", + "@walletconnect/universal-provider": "2.21.7", + "valtio": "2.1.5", + "viem": ">=2.33.3" + }, + "peerDependencies": { + "valtio": "2.1.5" + } + }, + "node_modules/@reown/appkit-wallet": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@reown/appkit-wallet/-/appkit-wallet-1.8.2.tgz", + "integrity": "sha512-cENbBX4WLwkLpIXwH6w+Ys9gmPVnQtGz59/UaO/+nsCxpy+yJcH1yjXyktiLYUBq64ZPGBluYYXg2zJgSCL+nA==", + "license": "Apache-2.0", + "dependencies": { + "@reown/appkit-common": "1.8.2", + "@reown/appkit-polyfills": "1.8.2", + "@walletconnect/logger": "2.1.2", + "zod": "3.22.4" + } + }, + "node_modules/@reown/appkit-wallet/node_modules/zod": { + "version": "3.22.4", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.4.tgz", + "integrity": "sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/@safe-global/safe-apps-provider": { + "version": "0.18.6", + "resolved": "https://registry.npmjs.org/@safe-global/safe-apps-provider/-/safe-apps-provider-0.18.6.tgz", + "integrity": "sha512-4LhMmjPWlIO8TTDC2AwLk44XKXaK6hfBTWyljDm0HQ6TWlOEijVWNrt2s3OCVMSxlXAcEzYfqyu1daHZooTC2Q==", + "license": "MIT", + "dependencies": { + "@safe-global/safe-apps-sdk": "^9.1.0", + "events": "^3.3.0" + } + }, + "node_modules/@safe-global/safe-apps-sdk": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@safe-global/safe-apps-sdk/-/safe-apps-sdk-9.1.0.tgz", + "integrity": "sha512-N5p/ulfnnA2Pi2M3YeWjULeWbjo7ei22JwU/IXnhoHzKq3pYCN6ynL9mJBOlvDVv892EgLPCWCOwQk/uBT2v0Q==", + "license": "MIT", + "dependencies": { + "@safe-global/safe-gateway-typescript-sdk": "^3.5.3", + "viem": "^2.1.1" + } + }, + "node_modules/@safe-global/safe-gateway-typescript-sdk": { + "version": "3.23.1", + "resolved": "https://registry.npmjs.org/@safe-global/safe-gateway-typescript-sdk/-/safe-gateway-typescript-sdk-3.23.1.tgz", + "integrity": "sha512-6ORQfwtEJYpalCeVO21L4XXGSdbEMfyp2hEv6cP82afKXSwvse6d3sdelgaPWUxHIsFRkWvHDdzh8IyyKHZKxw==", + "license": "MIT", + "engines": { + "node": ">=16" + } + }, + "node_modules/@scure/base": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.2.6.tgz", + "integrity": "sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg==", + "license": "MIT", + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip32": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.4.0.tgz", + "integrity": "sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==", + "license": "MIT", + "dependencies": { + "@noble/curves": "~1.4.0", + "@noble/hashes": "~1.4.0", + "@scure/base": "~1.1.6" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip32/node_modules/@noble/curves": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.2.tgz", + "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.4.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip32/node_modules/@noble/hashes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip32/node_modules/@scure/base": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.9.tgz", + "integrity": "sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==", + "license": "MIT", + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip39": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.3.0.tgz", + "integrity": "sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "~1.4.0", + "@scure/base": "~1.1.6" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip39/node_modules/@noble/hashes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip39/node_modules/@scure/base": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.9.tgz", + "integrity": "sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==", + "license": "MIT", + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@sec-ant/readable-stream": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", + "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sindresorhus/merge-streams": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz", + "integrity": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@socket.io/component-emitter": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", + "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", + "license": "MIT" + }, + "node_modules/@swc/helpers": { + "version": "0.5.15", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", + "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@tailwindcss/node": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.12.tgz", + "integrity": "sha512-3hm9brwvQkZFe++SBt+oLjo4OLDtkvlE8q2WalaD/7QWaeM7KEJbAiY/LJZUaCs7Xa8aUu4xy3uoyX4q54UVdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.4", + "enhanced-resolve": "^5.18.3", + "jiti": "^2.5.1", + "lightningcss": "1.30.1", + "magic-string": "^0.30.17", + "source-map-js": "^1.2.1", + "tailwindcss": "4.1.12" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.12.tgz", + "integrity": "sha512-gM5EoKHW/ukmlEtphNwaGx45fGoEmP10v51t9unv55voWh6WrOL19hfuIdo2FjxIaZzw776/BUQg7Pck++cIVw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "detect-libc": "^2.0.4", + "tar": "^7.4.3" + }, + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.1.12", + "@tailwindcss/oxide-darwin-arm64": "4.1.12", + "@tailwindcss/oxide-darwin-x64": "4.1.12", + "@tailwindcss/oxide-freebsd-x64": "4.1.12", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.12", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.12", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.12", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.12", + "@tailwindcss/oxide-linux-x64-musl": "4.1.12", + "@tailwindcss/oxide-wasm32-wasi": "4.1.12", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.12", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.12" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.12.tgz", + "integrity": "sha512-oNY5pq+1gc4T6QVTsZKwZaGpBb2N1H1fsc1GD4o7yinFySqIuRZ2E4NvGasWc6PhYJwGK2+5YT1f9Tp80zUQZQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.12.tgz", + "integrity": "sha512-cq1qmq2HEtDV9HvZlTtrj671mCdGB93bVY6J29mwCyaMYCP/JaUBXxrQQQm7Qn33AXXASPUb2HFZlWiiHWFytw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.12.tgz", + "integrity": "sha512-6UCsIeFUcBfpangqlXay9Ffty9XhFH1QuUFn0WV83W8lGdX8cD5/+2ONLluALJD5+yJ7k8mVtwy3zMZmzEfbLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.12.tgz", + "integrity": "sha512-JOH/f7j6+nYXIrHobRYCtoArJdMJh5zy5lr0FV0Qu47MID/vqJAY3r/OElPzx1C/wdT1uS7cPq+xdYYelny1ww==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.12.tgz", + "integrity": "sha512-v4Ghvi9AU1SYgGr3/j38PD8PEe6bRfTnNSUE3YCMIRrrNigCFtHZ2TCm8142X8fcSqHBZBceDx+JlFJEfNg5zQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.12.tgz", + "integrity": "sha512-YP5s1LmetL9UsvVAKusHSyPlzSRqYyRB0f+Kl/xcYQSPLEw/BvGfxzbH+ihUciePDjiXwHh+p+qbSP3SlJw+6g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.12.tgz", + "integrity": "sha512-V8pAM3s8gsrXcCv6kCHSuwyb/gPsd863iT+v1PGXC4fSL/OJqsKhfK//v8P+w9ThKIoqNbEnsZqNy+WDnwQqCA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.12.tgz", + "integrity": "sha512-xYfqYLjvm2UQ3TZggTGrwxjYaLB62b1Wiysw/YE3Yqbh86sOMoTn0feF98PonP7LtjsWOWcXEbGqDL7zv0uW8Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.12.tgz", + "integrity": "sha512-ha0pHPamN+fWZY7GCzz5rKunlv9L5R8kdh+YNvP5awe3LtuXb5nRi/H27GeL2U+TdhDOptU7T6Is7mdwh5Ar3A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.12.tgz", + "integrity": "sha512-4tSyu3dW+ktzdEpuk6g49KdEangu3eCYoqPhWNsZgUhyegEda3M9rG0/j1GV/JjVVsj+lG7jWAyrTlLzd/WEBg==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.5", + "@emnapi/runtime": "^1.4.5", + "@emnapi/wasi-threads": "^1.0.4", + "@napi-rs/wasm-runtime": "^0.2.12", + "@tybys/wasm-util": "^0.10.0", + "tslib": "^2.8.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.12.tgz", + "integrity": "sha512-iGLyD/cVP724+FGtMWslhcFyg4xyYyM+5F4hGvKA7eifPkXHRAUDFaimu53fpNg9X8dfP75pXx/zFt/jlNF+lg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.12.tgz", + "integrity": "sha512-NKIh5rzw6CpEodv/++r0hGLlfgT/gFN+5WNdZtvh6wpU2BpGNgdjvj6H2oFc8nCM839QM1YOhjpgbAONUb4IxA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/postcss": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.12.tgz", + "integrity": "sha512-5PpLYhCAwf9SJEeIsSmCDLgyVfdBhdBpzX1OJ87anT9IVR0Z9pjM0FNixCAUAHGnMBGB8K99SwAheXrT0Kh6QQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "@tailwindcss/node": "4.1.12", + "@tailwindcss/oxide": "4.1.12", + "postcss": "^8.4.41", + "tailwindcss": "4.1.12" + } + }, + "node_modules/@tanstack/query-core": { + "version": "5.86.0", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.86.0.tgz", + "integrity": "sha512-Y6ibQm6BXbw6w1p3a5LrPn8Ae64M0dx7hGmnhrm9P+XAkCCKXOwZN0J5Z1wK/0RdNHtR9o+sWHDXd4veNI60tQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/react-query": { + "version": "5.86.0", + "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.86.0.tgz", + "integrity": "sha512-jgS/v0oSJkGHucv9zxOS8rL7mjATh1XO3K4eqAV4WMpAly8okcBrGi1YxRZN5S4B59F54x9JFjWrK5vMAvJYqA==", + "license": "MIT", + "dependencies": { + "@tanstack/query-core": "5.86.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": "^18 || ^19" + } + }, + "node_modules/@ts-morph/common": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.27.0.tgz", + "integrity": "sha512-Wf29UqxWDpc+i61k3oIOzcUfQt79PIT9y/MWfAGlrkjg6lBC1hwDECLXPVJAhWjiGbfBCxZd65F/LIZF3+jeJQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-glob": "^3.3.3", + "minimatch": "^10.0.1", + "path-browserify": "^1.0.1" + } + }, + "node_modules/@types/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-H3MHACvFUEiujabxhaI/ImO6gUrd8oOurg7LQtS7mbwIXA/cUqWrvBsaeJ23aZEPk1TAYkurjfMbSELfoCXlGA==", + "license": "MIT" + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "20.19.12", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.12.tgz", + "integrity": "sha512-lSOjyS6vdO2G2g2CWrETTV3Jz2zlCXHpu1rcubLKpz9oj+z/1CceHlj+yq53W+9zgb98nSov/wjEKYDNauD+Hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/react": { + "version": "19.1.12", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.12.tgz", + "integrity": "sha512-cMoR+FoAf/Jyq6+Df2/Z41jISvGZZ2eTlnsaJRptmZ76Caldwy1odD4xTr/gNV9VLj0AWgg/nmkevIyUfIIq5w==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.1.9", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.9.tgz", + "integrity": "sha512-qXRuZaOsAdXKFyOhRBg6Lqqc0yay13vN7KrIg4L7N4aaHN68ma9OK3NE1BoDFgFOTfM7zg+3/8+2n8rLUH3OKQ==", + "devOptional": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.0.0" + } + }, + "node_modules/@types/statuses": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/statuses/-/statuses-2.0.6.tgz", + "integrity": "sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "license": "MIT" + }, + "node_modules/@wagmi/connectors": { + "version": "5.9.9", + "resolved": "https://registry.npmjs.org/@wagmi/connectors/-/connectors-5.9.9.tgz", + "integrity": "sha512-6+eqU7P2OtxU2PkIw6kHojfYYUJykYG2K5rSkzVh29RDCAjhJqGEZW5f1b8kV5rUBORip1NpST8QTBNi96JHGQ==", + "license": "MIT", + "dependencies": { + "@base-org/account": "1.1.1", + "@coinbase/wallet-sdk": "4.3.6", + "@gemini-wallet/core": "0.2.0", + "@metamask/sdk": "0.32.0", + "@safe-global/safe-apps-provider": "0.18.6", + "@safe-global/safe-apps-sdk": "9.1.0", + "@walletconnect/ethereum-provider": "2.21.1", + "cbw-sdk": "npm:@coinbase/wallet-sdk@3.9.3" + }, + "funding": { + "url": "https://github.com/sponsors/wevm" + }, + "peerDependencies": { + "@wagmi/core": "2.20.3", + "typescript": ">=5.0.4", + "viem": "2.x" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@wagmi/core": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/@wagmi/core/-/core-2.20.3.tgz", + "integrity": "sha512-gsbuHnWxf0AYZISvR8LvF/vUCIq6/ZwT5f5/FKd6wLA7Wq05NihCvmQpIgrcVbpSJPL67wb6S8fXm3eJGJA1vQ==", + "license": "MIT", + "dependencies": { + "eventemitter3": "5.0.1", + "mipd": "0.0.7", + "zustand": "5.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/wevm" + }, + "peerDependencies": { + "@tanstack/query-core": ">=5.0.0", + "typescript": ">=5.0.4", + "viem": "2.x" + }, + "peerDependenciesMeta": { + "@tanstack/query-core": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/@wagmi/core/node_modules/zustand": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.0.tgz", + "integrity": "sha512-LE+VcmbartOPM+auOjCCLQOsQ05zUTp8RkgwRzefUk+2jISdMMFnxvyTjA4YNWr5ZGXYbVsEMZosttuxUBkojQ==", + "license": "MIT", + "engines": { + "node": ">=12.20.0" + }, + "peerDependencies": { + "@types/react": ">=18.0.0", + "immer": ">=9.0.6", + "react": ">=18.0.0", + "use-sync-external-store": ">=1.2.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "immer": { + "optional": true + }, + "react": { + "optional": true + }, + "use-sync-external-store": { + "optional": true + } + } + }, + "node_modules/@wallet-standard/base": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@wallet-standard/base/-/base-1.1.0.tgz", + "integrity": "sha512-DJDQhjKmSNVLKWItoKThJS+CsJQjR9AOBOirBVT1F9YpRyC9oYHE+ZnSf8y8bxUphtKqdQMPVQ2mHohYdRvDVQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=16" + } + }, + "node_modules/@wallet-standard/wallet": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@wallet-standard/wallet/-/wallet-1.1.0.tgz", + "integrity": "sha512-Gt8TnSlDZpAl+RWOOAB/kuvC7RpcdWAlFbHNoi4gsXsfaWa1QCT6LBcfIYTPdOZC9OVZUDwqGuGAcqZejDmHjg==", + "license": "Apache-2.0", + "dependencies": { + "@wallet-standard/base": "^1.1.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@walletconnect/core": { + "version": "2.21.1", + "resolved": "https://registry.npmjs.org/@walletconnect/core/-/core-2.21.1.tgz", + "integrity": "sha512-Tp4MHJYcdWD846PH//2r+Mu4wz1/ZU/fr9av1UWFiaYQ2t2TPLDiZxjLw54AAEpMqlEHemwCgiRiAmjR1NDdTQ==", + "license": "Apache-2.0", + "dependencies": { + "@walletconnect/heartbeat": "1.2.2", + "@walletconnect/jsonrpc-provider": "1.0.14", + "@walletconnect/jsonrpc-types": "1.0.4", + "@walletconnect/jsonrpc-utils": "1.0.8", + "@walletconnect/jsonrpc-ws-connection": "1.0.16", + "@walletconnect/keyvaluestorage": "1.1.1", + "@walletconnect/logger": "2.1.2", + "@walletconnect/relay-api": "1.0.11", + "@walletconnect/relay-auth": "1.1.0", + "@walletconnect/safe-json": "1.0.2", + "@walletconnect/time": "1.0.2", + "@walletconnect/types": "2.21.1", + "@walletconnect/utils": "2.21.1", + "@walletconnect/window-getters": "1.0.1", + "es-toolkit": "1.33.0", + "events": "3.3.0", + "uint8arrays": "3.1.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@walletconnect/environment": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@walletconnect/environment/-/environment-1.0.1.tgz", + "integrity": "sha512-T426LLZtHj8e8rYnKfzsw1aG6+M0BT1ZxayMdv/p8yM0MU+eJDISqNY3/bccxRr4LrF9csq02Rhqt08Ibl0VRg==", + "license": "MIT", + "dependencies": { + "tslib": "1.14.1" + } + }, + "node_modules/@walletconnect/environment/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "license": "0BSD" + }, + "node_modules/@walletconnect/ethereum-provider": { + "version": "2.21.1", + "resolved": "https://registry.npmjs.org/@walletconnect/ethereum-provider/-/ethereum-provider-2.21.1.tgz", + "integrity": "sha512-SSlIG6QEVxClgl1s0LMk4xr2wg4eT3Zn/Hb81IocyqNSGfXpjtawWxKxiC5/9Z95f1INyBD6MctJbL/R1oBwIw==", + "license": "Apache-2.0", + "dependencies": { + "@reown/appkit": "1.7.8", + "@walletconnect/jsonrpc-http-connection": "1.0.8", + "@walletconnect/jsonrpc-provider": "1.0.14", + "@walletconnect/jsonrpc-types": "1.0.4", + "@walletconnect/jsonrpc-utils": "1.0.8", + "@walletconnect/keyvaluestorage": "1.1.1", + "@walletconnect/sign-client": "2.21.1", + "@walletconnect/types": "2.21.1", + "@walletconnect/universal-provider": "2.21.1", + "@walletconnect/utils": "2.21.1", + "events": "3.3.0" + } + }, + "node_modules/@walletconnect/ethereum-provider/node_modules/@noble/ciphers": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.2.1.tgz", + "integrity": "sha512-rONPWMC7PeExE077uLE4oqWrZ1IvAfz3oH9LibVAcVCopJiA9R62uavnbEzdkVmJYI6M6Zgkbeb07+tWjlq2XA==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@walletconnect/ethereum-provider/node_modules/@noble/curves": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.8.1.tgz", + "integrity": "sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.7.1" + }, + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@walletconnect/ethereum-provider/node_modules/@noble/hashes": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.7.1.tgz", + "integrity": "sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@walletconnect/ethereum-provider/node_modules/@reown/appkit": { + "version": "1.7.8", + "resolved": "https://registry.npmjs.org/@reown/appkit/-/appkit-1.7.8.tgz", + "integrity": "sha512-51kTleozhA618T1UvMghkhKfaPcc9JlKwLJ5uV+riHyvSoWPKPRIa5A6M1Wano5puNyW0s3fwywhyqTHSilkaA==", + "license": "Apache-2.0", + "dependencies": { + "@reown/appkit-common": "1.7.8", + "@reown/appkit-controllers": "1.7.8", + "@reown/appkit-pay": "1.7.8", + "@reown/appkit-polyfills": "1.7.8", + "@reown/appkit-scaffold-ui": "1.7.8", + "@reown/appkit-ui": "1.7.8", + "@reown/appkit-utils": "1.7.8", + "@reown/appkit-wallet": "1.7.8", + "@walletconnect/types": "2.21.0", + "@walletconnect/universal-provider": "2.21.0", + "bs58": "6.0.0", + "valtio": "1.13.2", + "viem": ">=2.29.0" + } + }, + "node_modules/@walletconnect/ethereum-provider/node_modules/@reown/appkit-common": { + "version": "1.7.8", + "resolved": "https://registry.npmjs.org/@reown/appkit-common/-/appkit-common-1.7.8.tgz", + "integrity": "sha512-ridIhc/x6JOp7KbDdwGKY4zwf8/iK8EYBl+HtWrruutSLwZyVi5P8WaZa+8iajL6LcDcDF7LoyLwMTym7SRuwQ==", + "license": "Apache-2.0", + "dependencies": { + "big.js": "6.2.2", + "dayjs": "1.11.13", + "viem": ">=2.29.0" + } + }, + "node_modules/@walletconnect/ethereum-provider/node_modules/@reown/appkit-controllers": { + "version": "1.7.8", + "resolved": "https://registry.npmjs.org/@reown/appkit-controllers/-/appkit-controllers-1.7.8.tgz", + "integrity": "sha512-IdXlJlivrlj6m63VsGLsjtPHHsTWvKGVzWIP1fXZHVqmK+rZCBDjCi9j267Rb9/nYRGHWBtlFQhO8dK35WfeDA==", + "license": "Apache-2.0", + "dependencies": { + "@reown/appkit-common": "1.7.8", + "@reown/appkit-wallet": "1.7.8", + "@walletconnect/universal-provider": "2.21.0", + "valtio": "1.13.2", + "viem": ">=2.29.0" + } + }, + "node_modules/@walletconnect/ethereum-provider/node_modules/@reown/appkit-controllers/node_modules/@walletconnect/sign-client": { + "version": "2.21.0", + "resolved": "https://registry.npmjs.org/@walletconnect/sign-client/-/sign-client-2.21.0.tgz", + "integrity": "sha512-z7h+PeLa5Au2R591d/8ZlziE0stJvdzP9jNFzFolf2RG/OiXulgFKum8PrIyXy+Rg2q95U9nRVUF9fWcn78yBA==", + "license": "Apache-2.0", + "dependencies": { + "@walletconnect/core": "2.21.0", + "@walletconnect/events": "1.0.1", + "@walletconnect/heartbeat": "1.2.2", + "@walletconnect/jsonrpc-utils": "1.0.8", + "@walletconnect/logger": "2.1.2", + "@walletconnect/time": "1.0.2", + "@walletconnect/types": "2.21.0", + "@walletconnect/utils": "2.21.0", + "events": "3.3.0" + } + }, + "node_modules/@walletconnect/ethereum-provider/node_modules/@reown/appkit-controllers/node_modules/@walletconnect/types": { + "version": "2.21.0", + "resolved": "https://registry.npmjs.org/@walletconnect/types/-/types-2.21.0.tgz", + "integrity": "sha512-ll+9upzqt95ZBWcfkOszXZkfnpbJJ2CmxMfGgE5GmhdxxxCcO5bGhXkI+x8OpiS555RJ/v/sXJYMSOLkmu4fFw==", + "license": "Apache-2.0", + "dependencies": { + "@walletconnect/events": "1.0.1", + "@walletconnect/heartbeat": "1.2.2", + "@walletconnect/jsonrpc-types": "1.0.4", + "@walletconnect/keyvaluestorage": "1.1.1", + "@walletconnect/logger": "2.1.2", + "events": "3.3.0" + } + }, + "node_modules/@walletconnect/ethereum-provider/node_modules/@reown/appkit-controllers/node_modules/@walletconnect/universal-provider": { + "version": "2.21.0", + "resolved": "https://registry.npmjs.org/@walletconnect/universal-provider/-/universal-provider-2.21.0.tgz", + "integrity": "sha512-mtUQvewt+X0VBQay/xOJBvxsB3Xsm1lTwFjZ6WUwSOTR1X+FNb71hSApnV5kbsdDIpYPXeQUbGt2se1n5E5UBg==", + "license": "Apache-2.0", + "dependencies": { + "@walletconnect/events": "1.0.1", + "@walletconnect/jsonrpc-http-connection": "1.0.8", + "@walletconnect/jsonrpc-provider": "1.0.14", + "@walletconnect/jsonrpc-types": "1.0.4", + "@walletconnect/jsonrpc-utils": "1.0.8", + "@walletconnect/keyvaluestorage": "1.1.1", + "@walletconnect/logger": "2.1.2", + "@walletconnect/sign-client": "2.21.0", + "@walletconnect/types": "2.21.0", + "@walletconnect/utils": "2.21.0", + "es-toolkit": "1.33.0", + "events": "3.3.0" + } + }, + "node_modules/@walletconnect/ethereum-provider/node_modules/@reown/appkit-controllers/node_modules/@walletconnect/utils": { + "version": "2.21.0", + "resolved": "https://registry.npmjs.org/@walletconnect/utils/-/utils-2.21.0.tgz", + "integrity": "sha512-zfHLiUoBrQ8rP57HTPXW7rQMnYxYI4gT9yTACxVW6LhIFROTF6/ytm5SKNoIvi4a5nX5dfXG4D9XwQUCu8Ilig==", + "license": "Apache-2.0", + "dependencies": { + "@noble/ciphers": "1.2.1", + "@noble/curves": "1.8.1", + "@noble/hashes": "1.7.1", + "@walletconnect/jsonrpc-utils": "1.0.8", + "@walletconnect/keyvaluestorage": "1.1.1", + "@walletconnect/relay-api": "1.0.11", + "@walletconnect/relay-auth": "1.1.0", + "@walletconnect/safe-json": "1.0.2", + "@walletconnect/time": "1.0.2", + "@walletconnect/types": "2.21.0", + "@walletconnect/window-getters": "1.0.1", + "@walletconnect/window-metadata": "1.0.1", + "bs58": "6.0.0", + "detect-browser": "5.3.0", + "query-string": "7.1.3", + "uint8arrays": "3.1.0", + "viem": "2.23.2" + } + }, + "node_modules/@walletconnect/ethereum-provider/node_modules/@reown/appkit-controllers/node_modules/@walletconnect/utils/node_modules/viem": { + "version": "2.23.2", + "resolved": "https://registry.npmjs.org/viem/-/viem-2.23.2.tgz", + "integrity": "sha512-NVmW/E0c5crMOtbEAqMF0e3NmvQykFXhLOc/CkLIXOlzHSA6KXVz3CYVmaKqBF8/xtjsjHAGjdJN3Ru1kFJLaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], + "license": "MIT", + "dependencies": { + "@noble/curves": "1.8.1", + "@noble/hashes": "1.7.1", + "@scure/bip32": "1.6.2", + "@scure/bip39": "1.5.4", + "abitype": "1.0.8", + "isows": "1.0.6", + "ox": "0.6.7", + "ws": "8.18.0" + }, + "peerDependencies": { + "typescript": ">=5.0.4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@walletconnect/ethereum-provider/node_modules/@reown/appkit-pay": { + "version": "1.7.8", + "resolved": "https://registry.npmjs.org/@reown/appkit-pay/-/appkit-pay-1.7.8.tgz", + "integrity": "sha512-OSGQ+QJkXx0FEEjlpQqIhT8zGJKOoHzVnyy/0QFrl3WrQTjCzg0L6+i91Ad5Iy1zb6V5JjqtfIFpRVRWN4M3pw==", + "license": "Apache-2.0", + "dependencies": { + "@reown/appkit-common": "1.7.8", + "@reown/appkit-controllers": "1.7.8", + "@reown/appkit-ui": "1.7.8", + "@reown/appkit-utils": "1.7.8", + "lit": "3.3.0", + "valtio": "1.13.2" + } + }, + "node_modules/@walletconnect/ethereum-provider/node_modules/@reown/appkit-polyfills": { + "version": "1.7.8", + "resolved": "https://registry.npmjs.org/@reown/appkit-polyfills/-/appkit-polyfills-1.7.8.tgz", + "integrity": "sha512-W/kq786dcHHAuJ3IV2prRLEgD/2iOey4ueMHf1sIFjhhCGMynMkhsOhQMUH0tzodPqUgAC494z4bpIDYjwWXaA==", + "license": "Apache-2.0", + "dependencies": { + "buffer": "6.0.3" + } + }, + "node_modules/@walletconnect/ethereum-provider/node_modules/@reown/appkit-scaffold-ui": { + "version": "1.7.8", + "resolved": "https://registry.npmjs.org/@reown/appkit-scaffold-ui/-/appkit-scaffold-ui-1.7.8.tgz", + "integrity": "sha512-RCeHhAwOrIgcvHwYlNWMcIDibdI91waaoEYBGw71inE0kDB8uZbE7tE6DAXJmDkvl0qPh+DqlC4QbJLF1FVYdQ==", + "license": "Apache-2.0", + "dependencies": { + "@reown/appkit-common": "1.7.8", + "@reown/appkit-controllers": "1.7.8", + "@reown/appkit-ui": "1.7.8", + "@reown/appkit-utils": "1.7.8", + "@reown/appkit-wallet": "1.7.8", + "lit": "3.3.0" + } + }, + "node_modules/@walletconnect/ethereum-provider/node_modules/@reown/appkit-ui": { + "version": "1.7.8", + "resolved": "https://registry.npmjs.org/@reown/appkit-ui/-/appkit-ui-1.7.8.tgz", + "integrity": "sha512-1hjCKjf6FLMFzrulhl0Y9Vb9Fu4royE+SXCPSWh4VhZhWqlzUFc7kutnZKx8XZFVQH4pbBvY62SpRC93gqoHow==", + "license": "Apache-2.0", + "dependencies": { + "@reown/appkit-common": "1.7.8", + "@reown/appkit-controllers": "1.7.8", + "@reown/appkit-wallet": "1.7.8", + "lit": "3.3.0", + "qrcode": "1.5.3" + } + }, + "node_modules/@walletconnect/ethereum-provider/node_modules/@reown/appkit-utils": { + "version": "1.7.8", + "resolved": "https://registry.npmjs.org/@reown/appkit-utils/-/appkit-utils-1.7.8.tgz", + "integrity": "sha512-8X7UvmE8GiaoitCwNoB86pttHgQtzy4ryHZM9kQpvjQ0ULpiER44t1qpVLXNM4X35O0v18W0Dk60DnYRMH2WRw==", + "license": "Apache-2.0", + "dependencies": { + "@reown/appkit-common": "1.7.8", + "@reown/appkit-controllers": "1.7.8", + "@reown/appkit-polyfills": "1.7.8", + "@reown/appkit-wallet": "1.7.8", + "@walletconnect/logger": "2.1.2", + "@walletconnect/universal-provider": "2.21.0", + "valtio": "1.13.2", + "viem": ">=2.29.0" + }, + "peerDependencies": { + "valtio": "1.13.2" + } + }, + "node_modules/@walletconnect/ethereum-provider/node_modules/@reown/appkit-utils/node_modules/@walletconnect/sign-client": { + "version": "2.21.0", + "resolved": "https://registry.npmjs.org/@walletconnect/sign-client/-/sign-client-2.21.0.tgz", + "integrity": "sha512-z7h+PeLa5Au2R591d/8ZlziE0stJvdzP9jNFzFolf2RG/OiXulgFKum8PrIyXy+Rg2q95U9nRVUF9fWcn78yBA==", + "license": "Apache-2.0", + "dependencies": { + "@walletconnect/core": "2.21.0", + "@walletconnect/events": "1.0.1", + "@walletconnect/heartbeat": "1.2.2", + "@walletconnect/jsonrpc-utils": "1.0.8", + "@walletconnect/logger": "2.1.2", + "@walletconnect/time": "1.0.2", + "@walletconnect/types": "2.21.0", + "@walletconnect/utils": "2.21.0", + "events": "3.3.0" + } + }, + "node_modules/@walletconnect/ethereum-provider/node_modules/@reown/appkit-utils/node_modules/@walletconnect/types": { + "version": "2.21.0", + "resolved": "https://registry.npmjs.org/@walletconnect/types/-/types-2.21.0.tgz", + "integrity": "sha512-ll+9upzqt95ZBWcfkOszXZkfnpbJJ2CmxMfGgE5GmhdxxxCcO5bGhXkI+x8OpiS555RJ/v/sXJYMSOLkmu4fFw==", + "license": "Apache-2.0", + "dependencies": { + "@walletconnect/events": "1.0.1", + "@walletconnect/heartbeat": "1.2.2", + "@walletconnect/jsonrpc-types": "1.0.4", + "@walletconnect/keyvaluestorage": "1.1.1", + "@walletconnect/logger": "2.1.2", + "events": "3.3.0" + } + }, + "node_modules/@walletconnect/ethereum-provider/node_modules/@reown/appkit-utils/node_modules/@walletconnect/universal-provider": { + "version": "2.21.0", + "resolved": "https://registry.npmjs.org/@walletconnect/universal-provider/-/universal-provider-2.21.0.tgz", + "integrity": "sha512-mtUQvewt+X0VBQay/xOJBvxsB3Xsm1lTwFjZ6WUwSOTR1X+FNb71hSApnV5kbsdDIpYPXeQUbGt2se1n5E5UBg==", + "license": "Apache-2.0", + "dependencies": { + "@walletconnect/events": "1.0.1", + "@walletconnect/jsonrpc-http-connection": "1.0.8", + "@walletconnect/jsonrpc-provider": "1.0.14", + "@walletconnect/jsonrpc-types": "1.0.4", + "@walletconnect/jsonrpc-utils": "1.0.8", + "@walletconnect/keyvaluestorage": "1.1.1", + "@walletconnect/logger": "2.1.2", + "@walletconnect/sign-client": "2.21.0", + "@walletconnect/types": "2.21.0", + "@walletconnect/utils": "2.21.0", + "es-toolkit": "1.33.0", + "events": "3.3.0" + } + }, + "node_modules/@walletconnect/ethereum-provider/node_modules/@reown/appkit-utils/node_modules/@walletconnect/utils": { + "version": "2.21.0", + "resolved": "https://registry.npmjs.org/@walletconnect/utils/-/utils-2.21.0.tgz", + "integrity": "sha512-zfHLiUoBrQ8rP57HTPXW7rQMnYxYI4gT9yTACxVW6LhIFROTF6/ytm5SKNoIvi4a5nX5dfXG4D9XwQUCu8Ilig==", + "license": "Apache-2.0", + "dependencies": { + "@noble/ciphers": "1.2.1", + "@noble/curves": "1.8.1", + "@noble/hashes": "1.7.1", + "@walletconnect/jsonrpc-utils": "1.0.8", + "@walletconnect/keyvaluestorage": "1.1.1", + "@walletconnect/relay-api": "1.0.11", + "@walletconnect/relay-auth": "1.1.0", + "@walletconnect/safe-json": "1.0.2", + "@walletconnect/time": "1.0.2", + "@walletconnect/types": "2.21.0", + "@walletconnect/window-getters": "1.0.1", + "@walletconnect/window-metadata": "1.0.1", + "bs58": "6.0.0", + "detect-browser": "5.3.0", + "query-string": "7.1.3", + "uint8arrays": "3.1.0", + "viem": "2.23.2" + } + }, + "node_modules/@walletconnect/ethereum-provider/node_modules/@reown/appkit-utils/node_modules/@walletconnect/utils/node_modules/viem": { + "version": "2.23.2", + "resolved": "https://registry.npmjs.org/viem/-/viem-2.23.2.tgz", + "integrity": "sha512-NVmW/E0c5crMOtbEAqMF0e3NmvQykFXhLOc/CkLIXOlzHSA6KXVz3CYVmaKqBF8/xtjsjHAGjdJN3Ru1kFJLaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], + "license": "MIT", + "dependencies": { + "@noble/curves": "1.8.1", + "@noble/hashes": "1.7.1", + "@scure/bip32": "1.6.2", + "@scure/bip39": "1.5.4", + "abitype": "1.0.8", + "isows": "1.0.6", + "ox": "0.6.7", + "ws": "8.18.0" + }, + "peerDependencies": { + "typescript": ">=5.0.4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@walletconnect/ethereum-provider/node_modules/@reown/appkit-wallet": { + "version": "1.7.8", + "resolved": "https://registry.npmjs.org/@reown/appkit-wallet/-/appkit-wallet-1.7.8.tgz", + "integrity": "sha512-kspz32EwHIOT/eg/ZQbFPxgXq0B/olDOj3YMu7gvLEFz4xyOFd/wgzxxAXkp5LbG4Cp++s/elh79rVNmVFdB9A==", + "license": "Apache-2.0", + "dependencies": { + "@reown/appkit-common": "1.7.8", + "@reown/appkit-polyfills": "1.7.8", + "@walletconnect/logger": "2.1.2", + "zod": "3.22.4" + } + }, + "node_modules/@walletconnect/ethereum-provider/node_modules/@reown/appkit/node_modules/@walletconnect/sign-client": { + "version": "2.21.0", + "resolved": "https://registry.npmjs.org/@walletconnect/sign-client/-/sign-client-2.21.0.tgz", + "integrity": "sha512-z7h+PeLa5Au2R591d/8ZlziE0stJvdzP9jNFzFolf2RG/OiXulgFKum8PrIyXy+Rg2q95U9nRVUF9fWcn78yBA==", + "license": "Apache-2.0", + "dependencies": { + "@walletconnect/core": "2.21.0", + "@walletconnect/events": "1.0.1", + "@walletconnect/heartbeat": "1.2.2", + "@walletconnect/jsonrpc-utils": "1.0.8", + "@walletconnect/logger": "2.1.2", + "@walletconnect/time": "1.0.2", + "@walletconnect/types": "2.21.0", + "@walletconnect/utils": "2.21.0", + "events": "3.3.0" + } + }, + "node_modules/@walletconnect/ethereum-provider/node_modules/@reown/appkit/node_modules/@walletconnect/types": { + "version": "2.21.0", + "resolved": "https://registry.npmjs.org/@walletconnect/types/-/types-2.21.0.tgz", + "integrity": "sha512-ll+9upzqt95ZBWcfkOszXZkfnpbJJ2CmxMfGgE5GmhdxxxCcO5bGhXkI+x8OpiS555RJ/v/sXJYMSOLkmu4fFw==", + "license": "Apache-2.0", + "dependencies": { + "@walletconnect/events": "1.0.1", + "@walletconnect/heartbeat": "1.2.2", + "@walletconnect/jsonrpc-types": "1.0.4", + "@walletconnect/keyvaluestorage": "1.1.1", + "@walletconnect/logger": "2.1.2", + "events": "3.3.0" + } + }, + "node_modules/@walletconnect/ethereum-provider/node_modules/@reown/appkit/node_modules/@walletconnect/universal-provider": { + "version": "2.21.0", + "resolved": "https://registry.npmjs.org/@walletconnect/universal-provider/-/universal-provider-2.21.0.tgz", + "integrity": "sha512-mtUQvewt+X0VBQay/xOJBvxsB3Xsm1lTwFjZ6WUwSOTR1X+FNb71hSApnV5kbsdDIpYPXeQUbGt2se1n5E5UBg==", + "license": "Apache-2.0", + "dependencies": { + "@walletconnect/events": "1.0.1", + "@walletconnect/jsonrpc-http-connection": "1.0.8", + "@walletconnect/jsonrpc-provider": "1.0.14", + "@walletconnect/jsonrpc-types": "1.0.4", + "@walletconnect/jsonrpc-utils": "1.0.8", + "@walletconnect/keyvaluestorage": "1.1.1", + "@walletconnect/logger": "2.1.2", + "@walletconnect/sign-client": "2.21.0", + "@walletconnect/types": "2.21.0", + "@walletconnect/utils": "2.21.0", + "es-toolkit": "1.33.0", + "events": "3.3.0" + } + }, + "node_modules/@walletconnect/ethereum-provider/node_modules/@reown/appkit/node_modules/@walletconnect/utils": { + "version": "2.21.0", + "resolved": "https://registry.npmjs.org/@walletconnect/utils/-/utils-2.21.0.tgz", + "integrity": "sha512-zfHLiUoBrQ8rP57HTPXW7rQMnYxYI4gT9yTACxVW6LhIFROTF6/ytm5SKNoIvi4a5nX5dfXG4D9XwQUCu8Ilig==", + "license": "Apache-2.0", + "dependencies": { + "@noble/ciphers": "1.2.1", + "@noble/curves": "1.8.1", + "@noble/hashes": "1.7.1", + "@walletconnect/jsonrpc-utils": "1.0.8", + "@walletconnect/keyvaluestorage": "1.1.1", + "@walletconnect/relay-api": "1.0.11", + "@walletconnect/relay-auth": "1.1.0", + "@walletconnect/safe-json": "1.0.2", + "@walletconnect/time": "1.0.2", + "@walletconnect/types": "2.21.0", + "@walletconnect/window-getters": "1.0.1", + "@walletconnect/window-metadata": "1.0.1", + "bs58": "6.0.0", + "detect-browser": "5.3.0", + "query-string": "7.1.3", + "uint8arrays": "3.1.0", + "viem": "2.23.2" + } + }, + "node_modules/@walletconnect/ethereum-provider/node_modules/@reown/appkit/node_modules/@walletconnect/utils/node_modules/viem": { + "version": "2.23.2", + "resolved": "https://registry.npmjs.org/viem/-/viem-2.23.2.tgz", + "integrity": "sha512-NVmW/E0c5crMOtbEAqMF0e3NmvQykFXhLOc/CkLIXOlzHSA6KXVz3CYVmaKqBF8/xtjsjHAGjdJN3Ru1kFJLaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], + "license": "MIT", + "dependencies": { + "@noble/curves": "1.8.1", + "@noble/hashes": "1.7.1", + "@scure/bip32": "1.6.2", + "@scure/bip39": "1.5.4", + "abitype": "1.0.8", + "isows": "1.0.6", + "ox": "0.6.7", + "ws": "8.18.0" + }, + "peerDependencies": { + "typescript": ">=5.0.4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@walletconnect/ethereum-provider/node_modules/@scure/bip32": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.6.2.tgz", + "integrity": "sha512-t96EPDMbtGgtb7onKKqxRLfE5g05k7uHnHRM2xdE6BP/ZmxaLtPek4J4KfVn/90IQNrU1IOAqMgiDtUdtbe3nw==", + "license": "MIT", + "dependencies": { + "@noble/curves": "~1.8.1", + "@noble/hashes": "~1.7.1", + "@scure/base": "~1.2.2" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@walletconnect/ethereum-provider/node_modules/@scure/bip39": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.5.4.tgz", + "integrity": "sha512-TFM4ni0vKvCfBpohoh+/lY05i9gRbSwXWngAsF4CABQxoaOHijxuaZ2R6cStDQ5CHtHO9aGJTr4ksVJASRRyMA==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "~1.7.1", + "@scure/base": "~1.2.4" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@walletconnect/ethereum-provider/node_modules/@walletconnect/core": { + "version": "2.21.0", + "resolved": "https://registry.npmjs.org/@walletconnect/core/-/core-2.21.0.tgz", + "integrity": "sha512-o6R7Ua4myxR8aRUAJ1z3gT9nM+jd2B2mfamu6arzy1Cc6vi10fIwFWb6vg3bC8xJ6o9H3n/cN5TOW3aA9Y1XVw==", + "license": "Apache-2.0", + "dependencies": { + "@walletconnect/heartbeat": "1.2.2", + "@walletconnect/jsonrpc-provider": "1.0.14", + "@walletconnect/jsonrpc-types": "1.0.4", + "@walletconnect/jsonrpc-utils": "1.0.8", + "@walletconnect/jsonrpc-ws-connection": "1.0.16", + "@walletconnect/keyvaluestorage": "1.1.1", + "@walletconnect/logger": "2.1.2", + "@walletconnect/relay-api": "1.0.11", + "@walletconnect/relay-auth": "1.1.0", + "@walletconnect/safe-json": "1.0.2", + "@walletconnect/time": "1.0.2", + "@walletconnect/types": "2.21.0", + "@walletconnect/utils": "2.21.0", + "@walletconnect/window-getters": "1.0.1", + "es-toolkit": "1.33.0", + "events": "3.3.0", + "uint8arrays": "3.1.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@walletconnect/ethereum-provider/node_modules/@walletconnect/core/node_modules/@walletconnect/types": { + "version": "2.21.0", + "resolved": "https://registry.npmjs.org/@walletconnect/types/-/types-2.21.0.tgz", + "integrity": "sha512-ll+9upzqt95ZBWcfkOszXZkfnpbJJ2CmxMfGgE5GmhdxxxCcO5bGhXkI+x8OpiS555RJ/v/sXJYMSOLkmu4fFw==", + "license": "Apache-2.0", + "dependencies": { + "@walletconnect/events": "1.0.1", + "@walletconnect/heartbeat": "1.2.2", + "@walletconnect/jsonrpc-types": "1.0.4", + "@walletconnect/keyvaluestorage": "1.1.1", + "@walletconnect/logger": "2.1.2", + "events": "3.3.0" + } + }, + "node_modules/@walletconnect/ethereum-provider/node_modules/@walletconnect/core/node_modules/@walletconnect/utils": { + "version": "2.21.0", + "resolved": "https://registry.npmjs.org/@walletconnect/utils/-/utils-2.21.0.tgz", + "integrity": "sha512-zfHLiUoBrQ8rP57HTPXW7rQMnYxYI4gT9yTACxVW6LhIFROTF6/ytm5SKNoIvi4a5nX5dfXG4D9XwQUCu8Ilig==", + "license": "Apache-2.0", + "dependencies": { + "@noble/ciphers": "1.2.1", + "@noble/curves": "1.8.1", + "@noble/hashes": "1.7.1", + "@walletconnect/jsonrpc-utils": "1.0.8", + "@walletconnect/keyvaluestorage": "1.1.1", + "@walletconnect/relay-api": "1.0.11", + "@walletconnect/relay-auth": "1.1.0", + "@walletconnect/safe-json": "1.0.2", + "@walletconnect/time": "1.0.2", + "@walletconnect/types": "2.21.0", + "@walletconnect/window-getters": "1.0.1", + "@walletconnect/window-metadata": "1.0.1", + "bs58": "6.0.0", + "detect-browser": "5.3.0", + "query-string": "7.1.3", + "uint8arrays": "3.1.0", + "viem": "2.23.2" + } + }, + "node_modules/@walletconnect/ethereum-provider/node_modules/@walletconnect/core/node_modules/viem": { + "version": "2.23.2", + "resolved": "https://registry.npmjs.org/viem/-/viem-2.23.2.tgz", + "integrity": "sha512-NVmW/E0c5crMOtbEAqMF0e3NmvQykFXhLOc/CkLIXOlzHSA6KXVz3CYVmaKqBF8/xtjsjHAGjdJN3Ru1kFJLaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], + "license": "MIT", + "dependencies": { + "@noble/curves": "1.8.1", + "@noble/hashes": "1.7.1", + "@scure/bip32": "1.6.2", + "@scure/bip39": "1.5.4", + "abitype": "1.0.8", + "isows": "1.0.6", + "ox": "0.6.7", + "ws": "8.18.0" + }, + "peerDependencies": { + "typescript": ">=5.0.4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@walletconnect/ethereum-provider/node_modules/@walletconnect/universal-provider": { + "version": "2.21.1", + "resolved": "https://registry.npmjs.org/@walletconnect/universal-provider/-/universal-provider-2.21.1.tgz", + "integrity": "sha512-Wjx9G8gUHVMnYfxtasC9poGm8QMiPCpXpbbLFT+iPoQskDDly8BwueWnqKs4Mx2SdIAWAwuXeZ5ojk5qQOxJJg==", + "license": "Apache-2.0", + "dependencies": { + "@walletconnect/events": "1.0.1", + "@walletconnect/jsonrpc-http-connection": "1.0.8", + "@walletconnect/jsonrpc-provider": "1.0.14", + "@walletconnect/jsonrpc-types": "1.0.4", + "@walletconnect/jsonrpc-utils": "1.0.8", + "@walletconnect/keyvaluestorage": "1.1.1", + "@walletconnect/logger": "2.1.2", + "@walletconnect/sign-client": "2.21.1", + "@walletconnect/types": "2.21.1", + "@walletconnect/utils": "2.21.1", + "es-toolkit": "1.33.0", + "events": "3.3.0" + } + }, + "node_modules/@walletconnect/ethereum-provider/node_modules/abitype": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/abitype/-/abitype-1.0.8.tgz", + "integrity": "sha512-ZeiI6h3GnW06uYDLx0etQtX/p8E24UaHHBj57RSjK7YBFe7iuVn07EDpOeP451D06sF27VOz9JJPlIKJmXgkEg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/wevm" + }, + "peerDependencies": { + "typescript": ">=5.0.4", + "zod": "^3 >=3.22.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + }, + "zod": { + "optional": true + } + } + }, + "node_modules/@walletconnect/ethereum-provider/node_modules/isows": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/isows/-/isows-1.0.6.tgz", + "integrity": "sha512-lPHCayd40oW98/I0uvgaHKWCSvkzY27LjWLbtzOm64yQ+G3Q5npjjbdppU65iZXkK1Zt+kH9pfegli0AYfwYYw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], + "license": "MIT", + "peerDependencies": { + "ws": "*" + } + }, + "node_modules/@walletconnect/ethereum-provider/node_modules/ox": { + "version": "0.6.7", + "resolved": "https://registry.npmjs.org/ox/-/ox-0.6.7.tgz", + "integrity": "sha512-17Gk/eFsFRAZ80p5eKqv89a57uXjd3NgIf1CaXojATPBuujVc/fQSVhBeAU9JCRB+k7J50WQAyWTxK19T9GgbA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], + "license": "MIT", + "dependencies": { + "@adraffy/ens-normalize": "^1.10.1", + "@noble/curves": "^1.6.0", + "@noble/hashes": "^1.5.0", + "@scure/bip32": "^1.5.0", + "@scure/bip39": "^1.4.0", + "abitype": "^1.0.6", + "eventemitter3": "5.0.1" + }, + "peerDependencies": { + "typescript": ">=5.4.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@walletconnect/ethereum-provider/node_modules/proxy-compare": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/proxy-compare/-/proxy-compare-2.6.0.tgz", + "integrity": "sha512-8xuCeM3l8yqdmbPoYeLbrAXCBWu19XEYc5/F28f5qOaoAIMyfmBUkl5axiK+x9olUvRlcekvnm98AP9RDngOIw==", + "license": "MIT" + }, + "node_modules/@walletconnect/ethereum-provider/node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@walletconnect/ethereum-provider/node_modules/use-sync-external-store": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", + "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@walletconnect/ethereum-provider/node_modules/valtio": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/valtio/-/valtio-1.13.2.tgz", + "integrity": "sha512-Qik0o+DSy741TmkqmRfjq+0xpZBXi/Y6+fXZLn0xNF1z/waFMbE3rkivv5Zcf9RrMUp6zswf2J7sbh2KBlba5A==", + "license": "MIT", + "dependencies": { + "derive-valtio": "0.1.0", + "proxy-compare": "2.6.0", + "use-sync-external-store": "1.2.0" + }, + "engines": { + "node": ">=12.20.0" + }, + "peerDependencies": { + "@types/react": ">=16.8", + "react": ">=16.8" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react": { + "optional": true + } + } + }, + "node_modules/@walletconnect/ethereum-provider/node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/@walletconnect/ethereum-provider/node_modules/zod": { + "version": "3.22.4", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.4.tgz", + "integrity": "sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/@walletconnect/events": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@walletconnect/events/-/events-1.0.1.tgz", + "integrity": "sha512-NPTqaoi0oPBVNuLv7qPaJazmGHs5JGyO8eEAk5VGKmJzDR7AHzD4k6ilox5kxk1iwiOnFopBOOMLs86Oa76HpQ==", + "license": "MIT", + "dependencies": { + "keyvaluestorage-interface": "^1.0.0", + "tslib": "1.14.1" + } + }, + "node_modules/@walletconnect/events/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "license": "0BSD" + }, + "node_modules/@walletconnect/heartbeat": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@walletconnect/heartbeat/-/heartbeat-1.2.2.tgz", + "integrity": "sha512-uASiRmC5MwhuRuf05vq4AT48Pq8RMi876zV8rr8cV969uTOzWdB/k+Lj5yI2PBtB1bGQisGen7MM1GcZlQTBXw==", + "license": "MIT", + "dependencies": { + "@walletconnect/events": "^1.0.1", + "@walletconnect/time": "^1.0.2", + "events": "^3.3.0" + } + }, + "node_modules/@walletconnect/jsonrpc-http-connection": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@walletconnect/jsonrpc-http-connection/-/jsonrpc-http-connection-1.0.8.tgz", + "integrity": "sha512-+B7cRuaxijLeFDJUq5hAzNyef3e3tBDIxyaCNmFtjwnod5AGis3RToNqzFU33vpVcxFhofkpE7Cx+5MYejbMGw==", + "license": "MIT", + "dependencies": { + "@walletconnect/jsonrpc-utils": "^1.0.6", + "@walletconnect/safe-json": "^1.0.1", + "cross-fetch": "^3.1.4", + "events": "^3.3.0" + } + }, + "node_modules/@walletconnect/jsonrpc-http-connection/node_modules/cross-fetch": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.2.0.tgz", + "integrity": "sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==", + "license": "MIT", + "dependencies": { + "node-fetch": "^2.7.0" + } + }, + "node_modules/@walletconnect/jsonrpc-http-connection/node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/@walletconnect/jsonrpc-provider": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/@walletconnect/jsonrpc-provider/-/jsonrpc-provider-1.0.14.tgz", + "integrity": "sha512-rtsNY1XqHvWj0EtITNeuf8PHMvlCLiS3EjQL+WOkxEOA4KPxsohFnBDeyPYiNm4ZvkQdLnece36opYidmtbmow==", + "license": "MIT", + "dependencies": { + "@walletconnect/jsonrpc-utils": "^1.0.8", + "@walletconnect/safe-json": "^1.0.2", + "events": "^3.3.0" + } + }, + "node_modules/@walletconnect/jsonrpc-types": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@walletconnect/jsonrpc-types/-/jsonrpc-types-1.0.4.tgz", + "integrity": "sha512-P6679fG/M+wuWg9TY8mh6xFSdYnFyFjwFelxyISxMDrlbXokorEVXYOxiqEbrU3x1BmBoCAJJ+vtEaEoMlpCBQ==", + "license": "MIT", + "dependencies": { + "events": "^3.3.0", + "keyvaluestorage-interface": "^1.0.0" + } + }, + "node_modules/@walletconnect/jsonrpc-utils": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@walletconnect/jsonrpc-utils/-/jsonrpc-utils-1.0.8.tgz", + "integrity": "sha512-vdeb03bD8VzJUL6ZtzRYsFMq1eZQcM3EAzT0a3st59dyLfJ0wq+tKMpmGH7HlB7waD858UWgfIcudbPFsbzVdw==", + "license": "MIT", + "dependencies": { + "@walletconnect/environment": "^1.0.1", + "@walletconnect/jsonrpc-types": "^1.0.3", + "tslib": "1.14.1" + } + }, + "node_modules/@walletconnect/jsonrpc-utils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "license": "0BSD" + }, + "node_modules/@walletconnect/jsonrpc-ws-connection": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/@walletconnect/jsonrpc-ws-connection/-/jsonrpc-ws-connection-1.0.16.tgz", + "integrity": "sha512-G81JmsMqh5nJheE1mPst1W0WfVv0SG3N7JggwLLGnI7iuDZJq8cRJvQwLGKHn5H1WTW7DEPCo00zz5w62AbL3Q==", + "license": "MIT", + "dependencies": { + "@walletconnect/jsonrpc-utils": "^1.0.6", + "@walletconnect/safe-json": "^1.0.2", + "events": "^3.3.0", + "ws": "^7.5.1" + } + }, + "node_modules/@walletconnect/keyvaluestorage": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@walletconnect/keyvaluestorage/-/keyvaluestorage-1.1.1.tgz", + "integrity": "sha512-V7ZQq2+mSxAq7MrRqDxanTzu2RcElfK1PfNYiaVnJgJ7Q7G7hTVwF8voIBx92qsRyGHZihrwNPHuZd1aKkd0rA==", + "license": "MIT", + "dependencies": { + "@walletconnect/safe-json": "^1.0.1", + "idb-keyval": "^6.2.1", + "unstorage": "^1.9.0" + }, + "peerDependencies": { + "@react-native-async-storage/async-storage": "1.x" + }, + "peerDependenciesMeta": { + "@react-native-async-storage/async-storage": { + "optional": true + } + } + }, + "node_modules/@walletconnect/logger": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@walletconnect/logger/-/logger-2.1.2.tgz", + "integrity": "sha512-aAb28I3S6pYXZHQm5ESB+V6rDqIYfsnHaQyzFbwUUBFY4H0OXx/YtTl8lvhUNhMMfb9UxbwEBS253TlXUYJWSw==", + "license": "MIT", + "dependencies": { + "@walletconnect/safe-json": "^1.0.2", + "pino": "7.11.0" + } + }, + "node_modules/@walletconnect/relay-api": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@walletconnect/relay-api/-/relay-api-1.0.11.tgz", + "integrity": "sha512-tLPErkze/HmC9aCmdZOhtVmYZq1wKfWTJtygQHoWtgg722Jd4homo54Cs4ak2RUFUZIGO2RsOpIcWipaua5D5Q==", + "license": "MIT", + "dependencies": { + "@walletconnect/jsonrpc-types": "^1.0.2" + } + }, + "node_modules/@walletconnect/relay-auth": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@walletconnect/relay-auth/-/relay-auth-1.1.0.tgz", + "integrity": "sha512-qFw+a9uRz26jRCDgL7Q5TA9qYIgcNY8jpJzI1zAWNZ8i7mQjaijRnWFKsCHAU9CyGjvt6RKrRXyFtFOpWTVmCQ==", + "license": "MIT", + "dependencies": { + "@noble/curves": "1.8.0", + "@noble/hashes": "1.7.0", + "@walletconnect/safe-json": "^1.0.1", + "@walletconnect/time": "^1.0.2", + "uint8arrays": "^3.0.0" + } + }, + "node_modules/@walletconnect/relay-auth/node_modules/@noble/curves": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.8.0.tgz", + "integrity": "sha512-j84kjAbzEnQHaSIhRPUmB3/eVXu2k3dKPl2LOrR8fSOIL+89U+7lV117EWHtq/GHM3ReGHM46iRBdZfpc4HRUQ==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.7.0" + }, + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@walletconnect/relay-auth/node_modules/@noble/hashes": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.7.0.tgz", + "integrity": "sha512-HXydb0DgzTpDPwbVeDGCG1gIu7X6+AuU6Zl6av/E/KG8LMsvPntvq+w17CHRpKBmN6Ybdrt1eP3k4cj8DJa78w==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@walletconnect/safe-json": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@walletconnect/safe-json/-/safe-json-1.0.2.tgz", + "integrity": "sha512-Ogb7I27kZ3LPC3ibn8ldyUr5544t3/STow9+lzz7Sfo808YD7SBWk7SAsdBFlYgP2zDRy2hS3sKRcuSRM0OTmA==", + "license": "MIT", + "dependencies": { + "tslib": "1.14.1" + } + }, + "node_modules/@walletconnect/safe-json/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "license": "0BSD" + }, + "node_modules/@walletconnect/sign-client": { + "version": "2.21.1", + "resolved": "https://registry.npmjs.org/@walletconnect/sign-client/-/sign-client-2.21.1.tgz", + "integrity": "sha512-QaXzmPsMnKGV6tc4UcdnQVNOz4zyXgarvdIQibJ4L3EmLat73r5ZVl4c0cCOcoaV7rgM9Wbphgu5E/7jNcd3Zg==", + "license": "Apache-2.0", + "dependencies": { + "@walletconnect/core": "2.21.1", + "@walletconnect/events": "1.0.1", + "@walletconnect/heartbeat": "1.2.2", + "@walletconnect/jsonrpc-utils": "1.0.8", + "@walletconnect/logger": "2.1.2", + "@walletconnect/time": "1.0.2", + "@walletconnect/types": "2.21.1", + "@walletconnect/utils": "2.21.1", + "events": "3.3.0" + } + }, + "node_modules/@walletconnect/time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@walletconnect/time/-/time-1.0.2.tgz", + "integrity": "sha512-uzdd9woDcJ1AaBZRhqy5rNC9laqWGErfc4dxA9a87mPdKOgWMD85mcFo9dIYIts/Jwocfwn07EC6EzclKubk/g==", + "license": "MIT", + "dependencies": { + "tslib": "1.14.1" + } + }, + "node_modules/@walletconnect/time/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "license": "0BSD" + }, + "node_modules/@walletconnect/types": { + "version": "2.21.1", + "resolved": "https://registry.npmjs.org/@walletconnect/types/-/types-2.21.1.tgz", + "integrity": "sha512-UeefNadqP6IyfwWC1Yi7ux+ljbP2R66PLfDrDm8izmvlPmYlqRerJWJvYO4t0Vvr9wrG4Ko7E0c4M7FaPKT/sQ==", + "license": "Apache-2.0", + "dependencies": { + "@walletconnect/events": "1.0.1", + "@walletconnect/heartbeat": "1.2.2", + "@walletconnect/jsonrpc-types": "1.0.4", + "@walletconnect/keyvaluestorage": "1.1.1", + "@walletconnect/logger": "2.1.2", + "events": "3.3.0" + } + }, + "node_modules/@walletconnect/universal-provider": { + "version": "2.21.7", + "resolved": "https://registry.npmjs.org/@walletconnect/universal-provider/-/universal-provider-2.21.7.tgz", + "integrity": "sha512-8PB+vA5VuR9PBqt5Y0xj4JC2doYNPlXLGQt3wJORVF9QC227Mm/8R1CAKpmneeLrUH02LkSRwx+wnN/pPnDiQA==", + "license": "Apache-2.0", + "dependencies": { + "@walletconnect/events": "1.0.1", + "@walletconnect/jsonrpc-http-connection": "1.0.8", + "@walletconnect/jsonrpc-provider": "1.0.14", + "@walletconnect/jsonrpc-types": "1.0.4", + "@walletconnect/jsonrpc-utils": "1.0.8", + "@walletconnect/keyvaluestorage": "1.1.1", + "@walletconnect/logger": "2.1.2", + "@walletconnect/sign-client": "2.21.7", + "@walletconnect/types": "2.21.7", + "@walletconnect/utils": "2.21.7", + "es-toolkit": "1.39.3", + "events": "3.3.0" + } + }, + "node_modules/@walletconnect/universal-provider/node_modules/@noble/curves": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.2.tgz", + "integrity": "sha512-HxngEd2XUcg9xi20JkwlLCtYwfoFw4JGkuZpT+WlsPD4gB/cxkvTD8fSsoAnphGZhFdZYKeQIPCuFlWPm1uE0g==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.8.0" + }, + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@walletconnect/universal-provider/node_modules/@scure/bip32": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.7.0.tgz", + "integrity": "sha512-E4FFX/N3f4B80AKWp5dP6ow+flD1LQZo/w8UnLGYZO674jS6YnYeepycOOksv+vLPSpgN35wgKgy+ybfTb2SMw==", + "license": "MIT", + "dependencies": { + "@noble/curves": "~1.9.0", + "@noble/hashes": "~1.8.0", + "@scure/base": "~1.2.5" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@walletconnect/universal-provider/node_modules/@scure/bip39": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.6.0.tgz", + "integrity": "sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "~1.8.0", + "@scure/base": "~1.2.5" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@walletconnect/universal-provider/node_modules/@walletconnect/core": { + "version": "2.21.7", + "resolved": "https://registry.npmjs.org/@walletconnect/core/-/core-2.21.7.tgz", + "integrity": "sha512-q/Au5Ne3g4R+q4GvHR5cvRd3+ha00QZCZiCs058lmy+eDbiZd0YsautvTPJ5a2guD6UaS1k/w5e1JHgixdcgLA==", + "license": "Apache-2.0", + "dependencies": { + "@walletconnect/heartbeat": "1.2.2", + "@walletconnect/jsonrpc-provider": "1.0.14", + "@walletconnect/jsonrpc-types": "1.0.4", + "@walletconnect/jsonrpc-utils": "1.0.8", + "@walletconnect/jsonrpc-ws-connection": "1.0.16", + "@walletconnect/keyvaluestorage": "1.1.1", + "@walletconnect/logger": "2.1.2", + "@walletconnect/relay-api": "1.0.11", + "@walletconnect/relay-auth": "1.1.0", + "@walletconnect/safe-json": "1.0.2", + "@walletconnect/time": "1.0.2", + "@walletconnect/types": "2.21.7", + "@walletconnect/utils": "2.21.7", + "@walletconnect/window-getters": "1.0.1", + "es-toolkit": "1.39.3", + "events": "3.3.0", + "uint8arrays": "3.1.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@walletconnect/universal-provider/node_modules/@walletconnect/sign-client": { + "version": "2.21.7", + "resolved": "https://registry.npmjs.org/@walletconnect/sign-client/-/sign-client-2.21.7.tgz", + "integrity": "sha512-9k/JEl9copR6nXRhqnmzWz2Zk1hiWysH+o6bp6Cqo8TgDUrZoMLBZMZ6qbo+2HLI54V02kKf0Vg8M81nNFOpjQ==", + "license": "Apache-2.0", + "dependencies": { + "@walletconnect/core": "2.21.7", + "@walletconnect/events": "1.0.1", + "@walletconnect/heartbeat": "1.2.2", + "@walletconnect/jsonrpc-utils": "1.0.8", + "@walletconnect/logger": "2.1.2", + "@walletconnect/time": "1.0.2", + "@walletconnect/types": "2.21.7", + "@walletconnect/utils": "2.21.7", + "events": "3.3.0" + } + }, + "node_modules/@walletconnect/universal-provider/node_modules/@walletconnect/types": { + "version": "2.21.7", + "resolved": "https://registry.npmjs.org/@walletconnect/types/-/types-2.21.7.tgz", + "integrity": "sha512-kyGnFje4Iq+XGkZZcSoAIrJWBE4BeghVW4O7n9e1MhUyeOOtO55M/kcqceNGYrvwjHvdN+Kf+aoLnKC0zKlpbQ==", + "license": "Apache-2.0", + "dependencies": { + "@walletconnect/events": "1.0.1", + "@walletconnect/heartbeat": "1.2.2", + "@walletconnect/jsonrpc-types": "1.0.4", + "@walletconnect/keyvaluestorage": "1.1.1", + "@walletconnect/logger": "2.1.2", + "events": "3.3.0" + } + }, + "node_modules/@walletconnect/universal-provider/node_modules/@walletconnect/utils": { + "version": "2.21.7", + "resolved": "https://registry.npmjs.org/@walletconnect/utils/-/utils-2.21.7.tgz", + "integrity": "sha512-qyaclTgcFf9AwVuoV8CLLg8wfH3nX7yZdpylNkDqCpS7wawQL9zmFFTaGgma8sQrCsd3Sd9jUIymcpRvCJnSTw==", + "license": "Apache-2.0", + "dependencies": { + "@msgpack/msgpack": "3.1.2", + "@noble/ciphers": "1.3.0", + "@noble/curves": "1.9.2", + "@noble/hashes": "1.8.0", + "@scure/base": "1.2.6", + "@walletconnect/jsonrpc-utils": "1.0.8", + "@walletconnect/keyvaluestorage": "1.1.1", + "@walletconnect/relay-api": "1.0.11", + "@walletconnect/relay-auth": "1.1.0", + "@walletconnect/safe-json": "1.0.2", + "@walletconnect/time": "1.0.2", + "@walletconnect/types": "2.21.7", + "@walletconnect/window-getters": "1.0.1", + "@walletconnect/window-metadata": "1.0.1", + "blakejs": "1.2.1", + "bs58": "6.0.0", + "detect-browser": "5.3.0", + "query-string": "7.1.3", + "uint8arrays": "3.1.1", + "viem": "2.31.0" + } + }, + "node_modules/@walletconnect/universal-provider/node_modules/abitype": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/abitype/-/abitype-1.0.8.tgz", + "integrity": "sha512-ZeiI6h3GnW06uYDLx0etQtX/p8E24UaHHBj57RSjK7YBFe7iuVn07EDpOeP451D06sF27VOz9JJPlIKJmXgkEg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/wevm" + }, + "peerDependencies": { + "typescript": ">=5.0.4", + "zod": "^3 >=3.22.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + }, + "zod": { + "optional": true + } + } + }, + "node_modules/@walletconnect/universal-provider/node_modules/es-toolkit": { + "version": "1.39.3", + "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.39.3.tgz", + "integrity": "sha512-Qb/TCFCldgOy8lZ5uC7nLGdqJwSabkQiYQShmw4jyiPk1pZzaYWTwaYKYP7EgLccWYgZocMrtItrwh683voaww==", + "license": "MIT", + "workspaces": [ + "docs", + "benchmarks" + ] + }, + "node_modules/@walletconnect/universal-provider/node_modules/ox": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ox/-/ox-0.7.1.tgz", + "integrity": "sha512-+k9fY9PRNuAMHRFIUbiK9Nt5seYHHzSQs9Bj+iMETcGtlpS7SmBzcGSVUQO3+nqGLEiNK4598pHNFlVRaZbRsg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], + "license": "MIT", + "dependencies": { + "@adraffy/ens-normalize": "^1.10.1", + "@noble/ciphers": "^1.3.0", + "@noble/curves": "^1.6.0", + "@noble/hashes": "^1.5.0", + "@scure/bip32": "^1.5.0", + "@scure/bip39": "^1.4.0", + "abitype": "^1.0.6", + "eventemitter3": "5.0.1" + }, + "peerDependencies": { + "typescript": ">=5.4.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@walletconnect/universal-provider/node_modules/uint8arrays": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.1.tgz", + "integrity": "sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg==", + "license": "MIT", + "dependencies": { + "multiformats": "^9.4.2" + } + }, + "node_modules/@walletconnect/universal-provider/node_modules/viem": { + "version": "2.31.0", + "resolved": "https://registry.npmjs.org/viem/-/viem-2.31.0.tgz", + "integrity": "sha512-U7OMQ6yqK+bRbEIarf2vqxL7unSEQvNxvML/1zG7suAmKuJmipqdVTVJGKBCJiYsm/EremyO2FS4dHIPpGv+eA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], + "license": "MIT", + "dependencies": { + "@noble/curves": "1.9.1", + "@noble/hashes": "1.8.0", + "@scure/bip32": "1.7.0", + "@scure/bip39": "1.6.0", + "abitype": "1.0.8", + "isows": "1.0.7", + "ox": "0.7.1", + "ws": "8.18.2" + }, + "peerDependencies": { + "typescript": ">=5.0.4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@walletconnect/universal-provider/node_modules/viem/node_modules/@noble/curves": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.1.tgz", + "integrity": "sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.8.0" + }, + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@walletconnect/universal-provider/node_modules/ws": { + "version": "8.18.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.2.tgz", + "integrity": "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/@walletconnect/utils": { + "version": "2.21.1", + "resolved": "https://registry.npmjs.org/@walletconnect/utils/-/utils-2.21.1.tgz", + "integrity": "sha512-VPZvTcrNQCkbGOjFRbC24mm/pzbRMUq2DSQoiHlhh0X1U7ZhuIrzVtAoKsrzu6rqjz0EEtGxCr3K1TGRqDG4NA==", + "license": "Apache-2.0", + "dependencies": { + "@noble/ciphers": "1.2.1", + "@noble/curves": "1.8.1", + "@noble/hashes": "1.7.1", + "@walletconnect/jsonrpc-utils": "1.0.8", + "@walletconnect/keyvaluestorage": "1.1.1", + "@walletconnect/relay-api": "1.0.11", + "@walletconnect/relay-auth": "1.1.0", + "@walletconnect/safe-json": "1.0.2", + "@walletconnect/time": "1.0.2", + "@walletconnect/types": "2.21.1", + "@walletconnect/window-getters": "1.0.1", + "@walletconnect/window-metadata": "1.0.1", + "bs58": "6.0.0", + "detect-browser": "5.3.0", + "query-string": "7.1.3", + "uint8arrays": "3.1.0", + "viem": "2.23.2" + } + }, + "node_modules/@walletconnect/utils/node_modules/@noble/ciphers": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.2.1.tgz", + "integrity": "sha512-rONPWMC7PeExE077uLE4oqWrZ1IvAfz3oH9LibVAcVCopJiA9R62uavnbEzdkVmJYI6M6Zgkbeb07+tWjlq2XA==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@walletconnect/utils/node_modules/@noble/curves": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.8.1.tgz", + "integrity": "sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.7.1" + }, + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@walletconnect/utils/node_modules/@noble/hashes": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.7.1.tgz", + "integrity": "sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@walletconnect/utils/node_modules/@scure/bip32": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.6.2.tgz", + "integrity": "sha512-t96EPDMbtGgtb7onKKqxRLfE5g05k7uHnHRM2xdE6BP/ZmxaLtPek4J4KfVn/90IQNrU1IOAqMgiDtUdtbe3nw==", + "license": "MIT", + "dependencies": { + "@noble/curves": "~1.8.1", + "@noble/hashes": "~1.7.1", + "@scure/base": "~1.2.2" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@walletconnect/utils/node_modules/@scure/bip39": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.5.4.tgz", + "integrity": "sha512-TFM4ni0vKvCfBpohoh+/lY05i9gRbSwXWngAsF4CABQxoaOHijxuaZ2R6cStDQ5CHtHO9aGJTr4ksVJASRRyMA==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "~1.7.1", + "@scure/base": "~1.2.4" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@walletconnect/utils/node_modules/abitype": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/abitype/-/abitype-1.0.8.tgz", + "integrity": "sha512-ZeiI6h3GnW06uYDLx0etQtX/p8E24UaHHBj57RSjK7YBFe7iuVn07EDpOeP451D06sF27VOz9JJPlIKJmXgkEg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/wevm" + }, + "peerDependencies": { + "typescript": ">=5.0.4", + "zod": "^3 >=3.22.0" }, - "engines": { - "node": ">=14.0.0" + "peerDependenciesMeta": { + "typescript": { + "optional": true + }, + "zod": { + "optional": true + } } }, - "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.12.tgz", - "integrity": "sha512-iGLyD/cVP724+FGtMWslhcFyg4xyYyM+5F4hGvKA7eifPkXHRAUDFaimu53fpNg9X8dfP75pXx/zFt/jlNF+lg==", - "cpu": [ - "arm64" + "node_modules/@walletconnect/utils/node_modules/isows": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/isows/-/isows-1.0.6.tgz", + "integrity": "sha512-lPHCayd40oW98/I0uvgaHKWCSvkzY27LjWLbtzOm64yQ+G3Q5npjjbdppU65iZXkK1Zt+kH9pfegli0AYfwYYw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } ], - "dev": true, "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" + "peerDependencies": { + "ws": "*" } }, - "node_modules/@tailwindcss/oxide-win32-x64-msvc": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.12.tgz", - "integrity": "sha512-NKIh5rzw6CpEodv/++r0hGLlfgT/gFN+5WNdZtvh6wpU2BpGNgdjvj6H2oFc8nCM839QM1YOhjpgbAONUb4IxA==", - "cpu": [ - "x64" + "node_modules/@walletconnect/utils/node_modules/ox": { + "version": "0.6.7", + "resolved": "https://registry.npmjs.org/ox/-/ox-0.6.7.tgz", + "integrity": "sha512-17Gk/eFsFRAZ80p5eKqv89a57uXjd3NgIf1CaXojATPBuujVc/fQSVhBeAU9JCRB+k7J50WQAyWTxK19T9GgbA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } ], - "dev": true, "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" + "dependencies": { + "@adraffy/ens-normalize": "^1.10.1", + "@noble/curves": "^1.6.0", + "@noble/hashes": "^1.5.0", + "@scure/bip32": "^1.5.0", + "@scure/bip39": "^1.4.0", + "abitype": "^1.0.6", + "eventemitter3": "5.0.1" + }, + "peerDependencies": { + "typescript": ">=5.4.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@tailwindcss/postcss": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.12.tgz", - "integrity": "sha512-5PpLYhCAwf9SJEeIsSmCDLgyVfdBhdBpzX1OJ87anT9IVR0Z9pjM0FNixCAUAHGnMBGB8K99SwAheXrT0Kh6QQ==", - "dev": true, + "node_modules/@walletconnect/utils/node_modules/viem": { + "version": "2.23.2", + "resolved": "https://registry.npmjs.org/viem/-/viem-2.23.2.tgz", + "integrity": "sha512-NVmW/E0c5crMOtbEAqMF0e3NmvQykFXhLOc/CkLIXOlzHSA6KXVz3CYVmaKqBF8/xtjsjHAGjdJN3Ru1kFJLaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], "license": "MIT", "dependencies": { - "@alloc/quick-lru": "^5.2.0", - "@tailwindcss/node": "4.1.12", - "@tailwindcss/oxide": "4.1.12", - "postcss": "^8.4.41", - "tailwindcss": "4.1.12" + "@noble/curves": "1.8.1", + "@noble/hashes": "1.7.1", + "@scure/bip32": "1.6.2", + "@scure/bip39": "1.5.4", + "abitype": "1.0.8", + "isows": "1.0.6", + "ox": "0.6.7", + "ws": "8.18.0" + }, + "peerDependencies": { + "typescript": ">=5.0.4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@ts-morph/common": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.27.0.tgz", - "integrity": "sha512-Wf29UqxWDpc+i61k3oIOzcUfQt79PIT9y/MWfAGlrkjg6lBC1hwDECLXPVJAhWjiGbfBCxZd65F/LIZF3+jeJQ==", - "dev": true, + "node_modules/@walletconnect/utils/node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", "license": "MIT", - "dependencies": { - "fast-glob": "^3.3.3", - "minimatch": "^10.0.1", - "path-browserify": "^1.0.1" + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, - "node_modules/@types/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "20.19.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.12.tgz", - "integrity": "sha512-lSOjyS6vdO2G2g2CWrETTV3Jz2zlCXHpu1rcubLKpz9oj+z/1CceHlj+yq53W+9zgb98nSov/wjEKYDNauD+Hw==", - "dev": true, + "node_modules/@walletconnect/window-getters": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@walletconnect/window-getters/-/window-getters-1.0.1.tgz", + "integrity": "sha512-vHp+HqzGxORPAN8gY03qnbTMnhqIwjeRJNOMOAzePRg4xVEEE2WvYsI9G2NMjOknA8hnuYbU3/hwLcKbjhc8+Q==", "license": "MIT", "dependencies": { - "undici-types": "~6.21.0" + "tslib": "1.14.1" } }, - "node_modules/@types/react": { - "version": "19.1.12", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.12.tgz", - "integrity": "sha512-cMoR+FoAf/Jyq6+Df2/Z41jISvGZZ2eTlnsaJRptmZ76Caldwy1odD4xTr/gNV9VLj0AWgg/nmkevIyUfIIq5w==", - "dev": true, + "node_modules/@walletconnect/window-getters/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "license": "0BSD" + }, + "node_modules/@walletconnect/window-metadata": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@walletconnect/window-metadata/-/window-metadata-1.0.1.tgz", + "integrity": "sha512-9koTqyGrM2cqFRW517BPY/iEtUDx2r1+Pwwu5m7sJ7ka79wi3EyqhqcICk/yDmv6jAS1rjKgTKXlEhanYjijcA==", "license": "MIT", "dependencies": { - "csstype": "^3.0.2" + "@walletconnect/window-getters": "^1.0.1", + "tslib": "1.14.1" } }, - "node_modules/@types/react-dom": { - "version": "19.1.9", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.9.tgz", - "integrity": "sha512-qXRuZaOsAdXKFyOhRBg6Lqqc0yay13vN7KrIg4L7N4aaHN68ma9OK3NE1BoDFgFOTfM7zg+3/8+2n8rLUH3OKQ==", - "dev": true, + "node_modules/@walletconnect/window-metadata/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "license": "0BSD" + }, + "node_modules/abitype": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/abitype/-/abitype-1.1.0.tgz", + "integrity": "sha512-6Vh4HcRxNMLA0puzPjM5GBgT4aAcFGKZzSgAXvuZ27shJP6NEpielTuqbBmZILR5/xd0PizkBGy5hReKz9jl5A==", "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/wevm" + }, "peerDependencies": { - "@types/react": "^19.0.0" + "typescript": ">=5.0.4", + "zod": "^3.22.0 || ^4.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + }, + "zod": { + "optional": true + } } }, - "node_modules/@types/statuses": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/statuses/-/statuses-2.0.6.tgz", - "integrity": "sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA==", - "dev": true, - "license": "MIT" - }, "node_modules/accepts": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", @@ -2141,7 +5254,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -2163,6 +5275,31 @@ "node": ">=14" } }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -2170,6 +5307,18 @@ "dev": true, "license": "Python-2.0" }, + "node_modules/aria-hidden": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz", + "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/ast-types": { "version": "0.16.1", "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.16.1.tgz", @@ -2183,6 +5332,90 @@ "node": ">=4" } }, + "node_modules/async-mutex": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/async-mutex/-/async-mutex-0.2.6.tgz", + "integrity": "sha512-Hs4R+4SPgamu6rSGW8C7cV9gaWUKEHykfzCCvIRuaVv636Ju10ZdeUbvb4TBEW0INuq2DHZqXbK4Nd3yG4RaRw==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + } + }, + "node_modules/atomic-sleep": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", + "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/base-x": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-5.0.1.tgz", + "integrity": "sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg==", + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/big.js": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-6.2.2.tgz", + "integrity": "sha512-y/ie+Faknx7sZA5MfGA2xKlu0GDv8RWrXGsmlteyJQ2lvoKv9GBK/fpRMc2qlSoBAgNxrixICFCBefIq8WCQpQ==", + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/bigjs" + } + }, + "node_modules/blakejs": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz", + "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==", + "license": "MIT" + }, + "node_modules/bn.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.2.tgz", + "integrity": "sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==", + "license": "MIT" + }, "node_modules/body-parser": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", @@ -2204,6 +5437,12 @@ "node": ">=18" } }, + "node_modules/bowser": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.12.1.tgz", + "integrity": "sha512-z4rE2Gxh7tvshQ4hluIT7XcFrgLIQaw9X3A+kTTRdovCz5PMukm/0QC/BKSYPj3omF5Qfypn9O/c5kgpmvYUCw==", + "license": "MIT" + }, "node_modules/braces": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", @@ -2250,6 +5489,52 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, + "node_modules/bs58": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-6.0.0.tgz", + "integrity": "sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==", + "license": "MIT", + "dependencies": { + "base-x": "^5.0.0" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/bufferutil": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.9.tgz", + "integrity": "sha512-WDtdLmJvAuNNPzByAYpRo2rF1Mmradw6gvWsQKf63476DDXmomT9zUiGypLcG4ibIM67vhAj8jJRdbmEws2Aqw==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=6.14.2" + } + }, "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -2260,11 +5545,28 @@ "node": ">= 0.8" } }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/call-bind-apply-helpers": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -2278,7 +5580,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", @@ -2301,6 +5602,15 @@ "node": ">=6" } }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/caniuse-lite": { "version": "1.0.30001739", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001739.tgz", @@ -2321,6 +5631,33 @@ ], "license": "CC-BY-4.0" }, + "node_modules/cbw-sdk": { + "name": "@coinbase/wallet-sdk", + "version": "3.9.3", + "resolved": "https://registry.npmjs.org/@coinbase/wallet-sdk/-/wallet-sdk-3.9.3.tgz", + "integrity": "sha512-N/A2DRIf0Y3PHc1XAMvbBUu4zisna6qAdqABMZwBMNEfWrXpAwx16pZGkYCLGE+Rvv1edbcB2LYDRnACNcmCiw==", + "license": "Apache-2.0", + "dependencies": { + "bn.js": "^5.2.1", + "buffer": "^6.0.3", + "clsx": "^1.2.1", + "eth-block-tracker": "^7.1.0", + "eth-json-rpc-filters": "^6.0.0", + "eventemitter3": "^5.0.1", + "keccak": "^3.0.3", + "preact": "^10.16.0", + "sha.js": "^2.4.11" + } + }, + "node_modules/cbw-sdk/node_modules/clsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/chalk": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.0.tgz", @@ -2334,6 +5671,21 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/chownr": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", @@ -2344,6 +5696,18 @@ "node": ">=18" } }, + "node_modules/class-variance-authority": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz", + "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==", + "license": "Apache-2.0", + "dependencies": { + "clsx": "^2.1.1" + }, + "funding": { + "url": "https://polar.sh/cva" + } + }, "node_modules/cli-cursor": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", @@ -2467,6 +5831,15 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/code-block-writer": { "version": "13.0.3", "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-13.0.3.tgz", @@ -2492,7 +5865,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "devOptional": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" @@ -2505,7 +5877,6 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "devOptional": true, "license": "MIT" }, "node_modules/color-string": { @@ -2569,6 +5940,12 @@ "node": ">= 0.6" } }, + "node_modules/cookie-es": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-1.2.2.tgz", + "integrity": "sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==", + "license": "MIT" + }, "node_modules/cookie-signature": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", @@ -2579,6 +5956,12 @@ "node": ">=6.6.0" } }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "license": "MIT" + }, "node_modules/cors": { "version": "2.8.5", "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", @@ -2620,6 +6003,47 @@ } } }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "license": "Apache-2.0", + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/cross-fetch": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.1.0.tgz", + "integrity": "sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw==", + "license": "MIT", + "dependencies": { + "node-fetch": "^2.7.0" + } + }, + "node_modules/cross-fetch/node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -2658,11 +6082,20 @@ "node": ">= 8" } }, + "node_modules/crossws": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/crossws/-/crossws-0.3.5.tgz", + "integrity": "sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==", + "license": "MIT", + "dependencies": { + "uncrypto": "^0.1.3" + } + }, "node_modules/csstype": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/data-uri-to-buffer": { @@ -2675,11 +6108,32 @@ "node": ">= 12" } }, + "node_modules/date-fns": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", + "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.21.0" + }, + "engines": { + "node": ">=0.11" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/date-fns" + } + }, + "node_modules/dayjs": { + "version": "1.11.13", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", + "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==", + "license": "MIT" + }, "node_modules/debug": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", - "dev": true, "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -2693,6 +6147,24 @@ } } }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decode-uri-component": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, "node_modules/dedent": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.6.0.tgz", @@ -2718,6 +6190,29 @@ "node": ">=0.10.0" } }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/defu": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", + "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", + "license": "MIT" + }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -2728,6 +6223,27 @@ "node": ">= 0.8" } }, + "node_modules/derive-valtio": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/derive-valtio/-/derive-valtio-0.1.0.tgz", + "integrity": "sha512-OCg2UsLbXK7GmmpzMXhYkdO64vhJ1ROUUGaTFyHjVwEdMEcTTRj7W1TxLbSBxdY8QLBPCcp66MTyaSy0RpO17A==", + "license": "MIT", + "peerDependencies": { + "valtio": "*" + } + }, + "node_modules/destr": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.5.tgz", + "integrity": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==", + "license": "MIT" + }, + "node_modules/detect-browser": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/detect-browser/-/detect-browser-5.3.0.tgz", + "integrity": "sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w==", + "license": "MIT" + }, "node_modules/detect-libc": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", @@ -2738,6 +6254,12 @@ "node": ">=8" } }, + "node_modules/detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", + "license": "MIT" + }, "node_modules/diff": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.2.tgz", @@ -2748,6 +6270,12 @@ "node": ">=0.3.1" } }, + "node_modules/dijkstrajs": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.3.tgz", + "integrity": "sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==", + "license": "MIT" + }, "node_modules/dotenv": { "version": "17.2.2", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.2.tgz", @@ -2765,7 +6293,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.1", @@ -2776,11 +6303,22 @@ "node": ">= 0.4" } }, + "node_modules/duplexify": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.3.tgz", + "integrity": "sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==", + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.4.1", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1", + "stream-shift": "^1.0.2" + } + }, "node_modules/eciesjs": { "version": "0.4.15", "resolved": "https://registry.npmjs.org/eciesjs/-/eciesjs-0.4.15.tgz", "integrity": "sha512-r6kEJXDKecVOCj2nLMuXK/FCPeurW33+3JRpfXVbjLja3XUYFfD9I/JBreH6sUyzcm3G/YQboBjMla6poKeSdA==", - "dev": true, "license": "MIT", "dependencies": { "@ecies/ciphers": "^0.2.3", @@ -2815,6 +6353,12 @@ "dev": true, "license": "MIT" }, + "node_modules/encode-utf8": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/encode-utf8/-/encode-utf8-1.0.3.tgz", + "integrity": "sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==", + "license": "MIT" + }, "node_modules/encodeurl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", @@ -2825,6 +6369,75 @@ "node": ">= 0.8" } }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/engine.io-client": { + "version": "6.6.3", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.6.3.tgz", + "integrity": "sha512-T0iLjnyNWahNyv/lcjS2y4oE358tVS/SYQNxYXGAJ9/GLgH4VCvOQ/mhTjqU88mLZCQgiG8RIegFHYCdVC+j5w==", + "license": "MIT", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.17.1", + "xmlhttprequest-ssl": "~2.1.1" + } + }, + "node_modules/engine.io-client/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/engine.io-client/node_modules/ws": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/engine.io-parser": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", + "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/enhanced-resolve": { "version": "5.18.3", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz", @@ -2870,7 +6483,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -2880,7 +6492,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -2890,7 +6501,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0" @@ -2899,6 +6509,16 @@ "node": ">= 0.4" } }, + "node_modules/es-toolkit": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.33.0.tgz", + "integrity": "sha512-X13Q/ZSc+vsO1q600bvNK4bxgXMkHcf//RxCmYDaRY5DAcT+eoXjY5hoAPGMdRnWQjvyLEcyauG3b6hz76LNqg==", + "license": "MIT", + "workspaces": [ + "docs", + "benchmarks" + ] + }, "node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", @@ -2926,18 +6546,154 @@ "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" }, - "engines": { - "node": ">=4" + "engines": { + "node": ">=4" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eth-block-tracker": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/eth-block-tracker/-/eth-block-tracker-7.1.0.tgz", + "integrity": "sha512-8YdplnuE1IK4xfqpf4iU7oBxnOYAc35934o083G8ao+8WM8QQtt/mVlAY6yIAdY1eMeLqg4Z//PZjJGmWGPMRg==", + "license": "MIT", + "dependencies": { + "@metamask/eth-json-rpc-provider": "^1.0.0", + "@metamask/safe-event-emitter": "^3.0.0", + "@metamask/utils": "^5.0.1", + "json-rpc-random-id": "^1.0.1", + "pify": "^3.0.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/eth-block-tracker/node_modules/@metamask/utils": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@metamask/utils/-/utils-5.0.2.tgz", + "integrity": "sha512-yfmE79bRQtnMzarnKfX7AEJBwFTxvTyw3nBQlu/5rmGXrjAeAMltoGxO62TFurxrQAFMNa/fEjIHNvungZp0+g==", + "license": "ISC", + "dependencies": { + "@ethereumjs/tx": "^4.1.2", + "@types/debug": "^4.1.7", + "debug": "^4.3.4", + "semver": "^7.3.8", + "superstruct": "^1.0.3" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/eth-json-rpc-filters": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/eth-json-rpc-filters/-/eth-json-rpc-filters-6.0.1.tgz", + "integrity": "sha512-ITJTvqoCw6OVMLs7pI8f4gG92n/St6x80ACtHodeS+IXmO0w+t1T5OOzfSt7KLSMLRkVUoexV7tztLgDxg+iig==", + "license": "ISC", + "dependencies": { + "@metamask/safe-event-emitter": "^3.0.0", + "async-mutex": "^0.2.6", + "eth-query": "^2.1.2", + "json-rpc-engine": "^6.1.0", + "pify": "^5.0.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/eth-json-rpc-filters/node_modules/pify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz", + "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eth-query": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/eth-query/-/eth-query-2.1.2.tgz", + "integrity": "sha512-srES0ZcvwkR/wd5OQBRA1bIJMww1skfGS0s8wlwK3/oNP4+wnds60krvu5R1QbpRQjMmpG5OMIWro5s7gvDPsA==", + "license": "ISC", + "dependencies": { + "json-rpc-random-id": "^1.0.0", + "xtend": "^4.0.1" + } + }, + "node_modules/eth-rpc-errors": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eth-rpc-errors/-/eth-rpc-errors-4.0.3.tgz", + "integrity": "sha512-Z3ymjopaoft7JDoxZcEb3pwdGh7yiYMhOwm2doUt6ASXlMavpNlK6Cre0+IMl2VSGyEU9rkiperQhp5iRxn5Pg==", + "license": "MIT", + "dependencies": { + "fast-safe-stringify": "^2.0.6" + } + }, + "node_modules/ethereum-cryptography": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.2.1.tgz", + "integrity": "sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==", + "license": "MIT", + "dependencies": { + "@noble/curves": "1.4.2", + "@noble/hashes": "1.4.0", + "@scure/bip32": "1.4.0", + "@scure/bip39": "1.3.0" + } + }, + "node_modules/ethereum-cryptography/node_modules/@noble/curves": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.2.tgz", + "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.4.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/ethereum-cryptography/node_modules/@noble/hashes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "dev": true, + "node_modules/eventemitter2": { + "version": "6.4.9", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.9.tgz", + "integrity": "sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==", + "license": "MIT" + }, + "node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "license": "MIT" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">=0.8.x" } }, "node_modules/eventsource": { @@ -3049,11 +6805,23 @@ "express": ">= 4.11" } }, + "node_modules/extension-port-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/extension-port-stream/-/extension-port-stream-3.0.0.tgz", + "integrity": "sha512-an2S5quJMiy5bnZKEf6AkfH/7r8CzHvhchU40gxN+OM6HPhe7Z9T1FUychcf2M9PpPOO0Hf7BAEfJkw2TDIBDw==", + "license": "ISC", + "dependencies": { + "readable-stream": "^3.6.2 || ^4.4.2", + "webextension-polyfill": ">=0.10.0 <1.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true, "license": "MIT" }, "node_modules/fast-glob": { @@ -3080,6 +6848,21 @@ "dev": true, "license": "MIT" }, + "node_modules/fast-redact": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.5.0.tgz", + "integrity": "sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", + "license": "MIT" + }, "node_modules/fastq": { "version": "1.19.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", @@ -3161,6 +6944,15 @@ "node": ">=8" } }, + "node_modules/filter-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz", + "integrity": "sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/finalhandler": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", @@ -3179,6 +6971,34 @@ "node": ">= 0.8" } }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/formdata-polyfill": { "version": "4.0.10", "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", @@ -3231,7 +7051,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -3265,7 +7084,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, "license": "ISC", "engines": { "node": "6.* || 8.* || >= 10.*" @@ -3288,7 +7106,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", @@ -3309,6 +7126,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/get-own-enumerable-keys": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/get-own-enumerable-keys/-/get-own-enumerable-keys-1.0.0.tgz", @@ -3326,7 +7152,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "dev": true, "license": "MIT", "dependencies": { "dunder-proto": "^1.0.1", @@ -3370,7 +7195,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -3396,11 +7220,39 @@ "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" } }, + "node_modules/h3": { + "version": "1.15.4", + "resolved": "https://registry.npmjs.org/h3/-/h3-1.15.4.tgz", + "integrity": "sha512-z5cFQWDffyOe4vQ9xIqNfCZdV4p//vy6fBnr8Q1AWnVZ0teurKMG66rLj++TKwKPUP3u7iMUvrvKaEUiQw2QWQ==", + "license": "MIT", + "dependencies": { + "cookie-es": "^1.2.2", + "crossws": "^0.3.5", + "defu": "^6.1.4", + "destr": "^2.0.5", + "iron-webcrypto": "^1.2.1", + "node-mock-http": "^1.0.2", + "radix3": "^1.1.2", + "ufo": "^1.6.1", + "uncrypto": "^0.1.3" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-symbols": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -3409,11 +7261,25 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -3493,6 +7359,32 @@ "node": ">=0.10.0" } }, + "node_modules/idb-keyval": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/idb-keyval/-/idb-keyval-6.2.1.tgz", + "integrity": "sha512-8Sb3veuYCyrZL+VBt9LJfZjLUPWVvqn8tG28VqYNFCo43KHcKuq+b4EiXGeuaLAQWL2YmyDgMp2aSpH9JHsEQg==", + "license": "Apache-2.0" + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -3524,7 +7416,6 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true, "license": "ISC" }, "node_modules/ipaddr.js": { @@ -3537,6 +7428,31 @@ "node": ">= 0.10" } }, + "node_modules/iron-webcrypto": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/iron-webcrypto/-/iron-webcrypto-1.2.1.tgz", + "integrity": "sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/brc-dd" + } + }, + "node_modules/is-arguments": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", + "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-arrayish": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", @@ -3544,6 +7460,18 @@ "license": "MIT", "optional": true }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -3558,12 +7486,29 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, + "node_modules/is-generator-function": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", + "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-proto": "^1.0.0", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -3640,6 +7585,24 @@ "dev": true, "license": "MIT" }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-regexp": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-3.1.0.tgz", @@ -3666,6 +7629,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-unicode-supported": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", @@ -3679,6 +7657,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "license": "MIT" + }, "node_modules/isexe": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", @@ -3689,6 +7673,21 @@ "node": ">=16" } }, + "node_modules/isows": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/isows/-/isows-1.0.7.tgz", + "integrity": "sha512-I1fSfDCZL5P0v33sVqeTDSpcstAg/N+wF5HS033mogOVIp4B+oHC7oOCsA3axAbBSGTJ8QubbNmnIRN/h8U7hg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], + "license": "MIT", + "peerDependencies": { + "ws": "*" + } + }, "node_modules/jiti": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.5.1.tgz", @@ -3703,7 +7702,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true, "license": "MIT" }, "node_modules/js-yaml": { @@ -3739,6 +7737,31 @@ "dev": true, "license": "MIT" }, + "node_modules/json-rpc-engine": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/json-rpc-engine/-/json-rpc-engine-6.1.0.tgz", + "integrity": "sha512-NEdLrtrq1jUZyfjkr9OCz9EzCNhnRyWtt1PAnvnhwy6e8XETS0Dtc+ZNCO2gvuAoKsIn2+vCSowXTYE4CkgnAQ==", + "license": "ISC", + "dependencies": { + "@metamask/safe-event-emitter": "^2.0.0", + "eth-rpc-errors": "^4.0.2" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/json-rpc-engine/node_modules/@metamask/safe-event-emitter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@metamask/safe-event-emitter/-/safe-event-emitter-2.0.0.tgz", + "integrity": "sha512-/kSXhY692qiV1MXu6EeOZvg5nECLclxNXcKCxJ3cXQgYuRymRHpdx/t7JXfsK+JLjwA1e1c1/SBrlQYpusC29Q==", + "license": "ISC" + }, + "node_modules/json-rpc-random-id": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-rpc-random-id/-/json-rpc-random-id-1.0.1.tgz", + "integrity": "sha512-RJ9YYNCkhVDBuP4zN5BBtYAzEl03yq/jIIsyif0JY9qyJuQQZNeDK7anAPKKlyEtLSj2s8h6hNh2F8zO5q7ScA==", + "license": "ISC" + }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -3772,6 +7795,27 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/keccak": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.4.tgz", + "integrity": "sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/keyvaluestorage-interface": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/keyvaluestorage-interface/-/keyvaluestorage-interface-1.0.0.tgz", + "integrity": "sha512-8t6Q3TclQ4uZynJY9IGr2+SsIGwK9JHcO6ootkHCGA0CrQCRy+VkouYNO2xicET6b9al7QKzpebNow+gkpCL8g==", + "license": "MIT" + }, "node_modules/kleur": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", @@ -4028,6 +8072,55 @@ "dev": true, "license": "MIT" }, + "node_modules/lit": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lit/-/lit-3.3.0.tgz", + "integrity": "sha512-DGVsqsOIHBww2DqnuZzW7QsuCdahp50ojuDaBPC7jUDRpYoH0z7kHBBYZewRzer75FwtrkmkKk7iOAwSaWdBmw==", + "license": "BSD-3-Clause", + "dependencies": { + "@lit/reactive-element": "^2.1.0", + "lit-element": "^4.2.0", + "lit-html": "^3.3.0" + } + }, + "node_modules/lit-element": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-4.2.1.tgz", + "integrity": "sha512-WGAWRGzirAgyphK2urmYOV72tlvnxw7YfyLDgQ+OZnM9vQQBQnumQ7jUJe6unEzwGU3ahFOjuz1iz1jjrpCPuw==", + "license": "BSD-3-Clause", + "dependencies": { + "@lit-labs/ssr-dom-shim": "^1.4.0", + "@lit/reactive-element": "^2.1.0", + "lit-html": "^3.3.0" + } + }, + "node_modules/lit-html": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-3.3.1.tgz", + "integrity": "sha512-S9hbyDu/vs1qNrithiNyeyv64c9yqiW9l+DBgI18fL+MTvOtWoFR0FWiyq1TxaYef5wNlpEmzlXoBlZEO+WjoA==", + "license": "BSD-3-Clause", + "dependencies": { + "@types/trusted-types": "^2.0.2" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" + }, "node_modules/log-symbols": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", @@ -4058,6 +8151,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "peer": true, + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -4075,6 +8181,15 @@ "dev": true, "license": "ISC" }, + "node_modules/lucide-react": { + "version": "0.542.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.542.0.tgz", + "integrity": "sha512-w3hD8/SQB7+lzU2r4VdFyzzOzKnUjTZIF/MQJGSSvni7Llewni4vuViRppfRAa2guOsY5k4jZyxw/i9DQHv+dw==", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, "node_modules/magic-string": { "version": "0.30.18", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.18.tgz", @@ -4089,7 +8204,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -4135,6 +8249,12 @@ "node": ">= 8" } }, + "node_modules/micro-ftch": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/micro-ftch/-/micro-ftch-0.3.1.tgz", + "integrity": "sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==", + "license": "MIT" + }, "node_modules/micromatch": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", @@ -4253,8 +8373,28 @@ "dependencies": { "minipass": "^7.1.2" }, - "engines": { - "node": ">= 18" + "engines": { + "node": ">= 18" + } + }, + "node_modules/mipd": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mipd/-/mipd-0.0.7.tgz", + "integrity": "sha512-aAPZPNDQ3uMTdKbuO2YmAw2TxLHO0moa4YKAyETM/DTj5FloZo+a+8tU+iv4GmW+sOxKLSRwcSFuczk+Cpt6fg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wagmi-dev" + } + ], + "license": "MIT", + "peerDependencies": { + "typescript": ">=5.0.4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/mkdirp": { @@ -4277,7 +8417,6 @@ "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, "license": "MIT" }, "node_modules/msw": { @@ -4325,6 +8464,12 @@ } } }, + "node_modules/multiformats": { + "version": "9.9.0", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", + "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==", + "license": "(Apache-2.0 AND MIT)" + }, "node_modules/mute-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", @@ -4443,6 +8588,12 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/node-addon-api": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", + "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==", + "license": "MIT" + }, "node_modules/node-domexception": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", @@ -4483,6 +8634,29 @@ "url": "https://opencollective.com/node-fetch" } }, + "node_modules/node-fetch-native": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.7.tgz", + "integrity": "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==", + "license": "MIT" + }, + "node_modules/node-gyp-build": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", + "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", + "license": "MIT", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/node-mock-http": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/node-mock-http/-/node-mock-http-1.0.3.tgz", + "integrity": "sha512-jN8dK25fsfnMrVsEhluUTPkBFY+6ybu7jSB1n+ri/vOGjJxU8J9CZhpSGkHXSkFjtUhbmoncG/YG9ta5Ludqog==", + "license": "MIT" + }, "node_modules/node-releases": { "version": "2.0.19", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", @@ -4490,6 +8664,15 @@ "dev": true, "license": "MIT" }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/npm-run-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-6.0.0.tgz", @@ -4520,6 +8703,53 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/obj-multiplex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/obj-multiplex/-/obj-multiplex-1.0.0.tgz", + "integrity": "sha512-0GNJAOsHoBHeNTvl5Vt6IWnpUEcc3uSRxzBri7EDyIcMgYvnY2JL2qdeV5zTMjWQX5OHcD5amcW2HFfDh0gjIA==", + "license": "ISC", + "dependencies": { + "end-of-stream": "^1.4.0", + "once": "^1.4.0", + "readable-stream": "^2.3.3" + } + }, + "node_modules/obj-multiplex/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/obj-multiplex/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/obj-multiplex/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/obj-multiplex/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -4553,6 +8783,23 @@ "node": ">= 10" } }, + "node_modules/ofetch": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/ofetch/-/ofetch-1.4.1.tgz", + "integrity": "sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw==", + "license": "MIT", + "dependencies": { + "destr": "^2.0.3", + "node-fetch-native": "^1.6.4", + "ufo": "^1.5.4" + } + }, + "node_modules/on-exit-leak-free": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-0.2.0.tgz", + "integrity": "sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg==", + "license": "MIT" + }, "node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", @@ -4570,7 +8817,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, "license": "ISC", "dependencies": { "wrappy": "1" @@ -4623,6 +8869,98 @@ "dev": true, "license": "MIT" }, + "node_modules/ox": { + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/ox/-/ox-0.6.9.tgz", + "integrity": "sha512-wi5ShvzE4eOcTwQVsIPdFr+8ycyX+5le/96iAJutaZAvCes1J0+RvpEPg5QDPDiaR0XQQAvZVl7AwqQcINuUug==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], + "license": "MIT", + "dependencies": { + "@adraffy/ens-normalize": "^1.10.1", + "@noble/curves": "^1.6.0", + "@noble/hashes": "^1.5.0", + "@scure/bip32": "^1.5.0", + "@scure/bip39": "^1.4.0", + "abitype": "^1.0.6", + "eventemitter3": "5.0.1" + }, + "peerDependencies": { + "typescript": ">=5.4.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/ox/node_modules/@scure/bip32": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.7.0.tgz", + "integrity": "sha512-E4FFX/N3f4B80AKWp5dP6ow+flD1LQZo/w8UnLGYZO674jS6YnYeepycOOksv+vLPSpgN35wgKgy+ybfTb2SMw==", + "license": "MIT", + "dependencies": { + "@noble/curves": "~1.9.0", + "@noble/hashes": "~1.8.0", + "@scure/base": "~1.2.5" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/ox/node_modules/@scure/bip39": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.6.0.tgz", + "integrity": "sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "~1.8.0", + "@scure/base": "~1.2.5" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/package-manager-detector": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.3.0.tgz", @@ -4692,6 +9030,15 @@ "dev": true, "license": "MIT" }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -4728,6 +9075,53 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/pino": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/pino/-/pino-7.11.0.tgz", + "integrity": "sha512-dMACeu63HtRLmCG8VKdy4cShCPKaYDR4youZqoSWLxl5Gu99HUw8bw75thbPv9Nip+H+QYX8o3ZJbTdVZZ2TVg==", + "license": "MIT", + "dependencies": { + "atomic-sleep": "^1.0.0", + "fast-redact": "^3.0.0", + "on-exit-leak-free": "^0.2.0", + "pino-abstract-transport": "v0.5.0", + "pino-std-serializers": "^4.0.0", + "process-warning": "^1.0.0", + "quick-format-unescaped": "^4.0.3", + "real-require": "^0.1.0", + "safe-stable-stringify": "^2.1.0", + "sonic-boom": "^2.2.1", + "thread-stream": "^0.15.1" + }, + "bin": { + "pino": "bin.js" + } + }, + "node_modules/pino-abstract-transport": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-0.5.0.tgz", + "integrity": "sha512-+KAgmVeqXYbTtU2FScx1XS3kNyfZ5TrXY07V96QnUSFqo2gAqlvmaxH67Lj7SWazqsMabf+58ctdTcBgnOLUOQ==", + "license": "MIT", + "dependencies": { + "duplexify": "^4.1.2", + "split2": "^4.0.0" + } + }, + "node_modules/pino-std-serializers": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-4.0.0.tgz", + "integrity": "sha512-cK0pekc1Kjy5w9V2/n+8MkZwusa6EyyxfeQCB799CQRhRt/CqYKiWs5adeu8Shve2ZNffvfC/7J64A2PJo1W/Q==", + "license": "MIT" + }, "node_modules/pkce-challenge": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.0.tgz", @@ -4738,6 +9132,33 @@ "node": ">=16.20.0" } }, + "node_modules/pngjs": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-5.0.0.tgz", + "integrity": "sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==", + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/pony-cause": { + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/pony-cause/-/pony-cause-2.1.11.tgz", + "integrity": "sha512-M7LhCsdNbNgiLYiP4WjsfLUuFmCfnjdF6jKe2R9NKl4WFN+HZPGHJZ9lnLP7f9ZnKe3U9nuWD0szirmj+migUg==", + "license": "0BSD", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/postcss": { "version": "8.5.6", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", @@ -4767,6 +9188,16 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/preact": { + "version": "10.24.2", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.24.2.tgz", + "integrity": "sha512-1cSoF0aCC8uaARATfrlz4VCBqE8LwZwRfLgkxJOQwAlQt6ayTmi0D9OF7nXid1POI5SZidFuG9CnlXbDfLqY/Q==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + } + }, "node_modules/pretty-ms": { "version": "9.2.0", "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-9.2.0.tgz", @@ -4783,6 +9214,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "license": "MIT" + }, + "node_modules/process-warning": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-1.0.0.tgz", + "integrity": "sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q==", + "license": "MIT" + }, "node_modules/prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", @@ -4821,6 +9264,22 @@ "node": ">= 0.10" } }, + "node_modules/proxy-compare": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/proxy-compare/-/proxy-compare-3.0.1.tgz", + "integrity": "sha512-V9plBAt3qjMlS1+nC8771KNf6oJ12gExvaxnNzN/9yVRLdTv/lc+oJlnSzrdYDAvBfTStPCoiaCOTmTs0adv7Q==", + "license": "MIT" + }, + "node_modules/pump": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", + "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -4831,6 +9290,117 @@ "node": ">=6" } }, + "node_modules/qrcode": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.5.3.tgz", + "integrity": "sha512-puyri6ApkEHYiVl4CFzo1tDkAZ+ATcnbJrJ6RiBM1Fhctdn/ix9MTE3hRph33omisEbC/2fcfemsseiKgBPKZg==", + "license": "MIT", + "dependencies": { + "dijkstrajs": "^1.0.1", + "encode-utf8": "^1.0.3", + "pngjs": "^5.0.0", + "yargs": "^15.3.1" + }, + "bin": { + "qrcode": "bin/qrcode" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/qrcode/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/qrcode/node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/qrcode/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/qrcode/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/qrcode/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/qrcode/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "license": "ISC" + }, + "node_modules/qrcode/node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "license": "MIT", + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/qrcode/node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "license": "ISC", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/qs": { "version": "6.14.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", @@ -4847,6 +9417,24 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/query-string": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-7.1.3.tgz", + "integrity": "sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==", + "license": "MIT", + "dependencies": { + "decode-uri-component": "^0.2.2", + "filter-obj": "^1.1.0", + "split-on-first": "^1.0.0", + "strict-uri-encode": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -4868,6 +9456,18 @@ ], "license": "MIT" }, + "node_modules/quick-format-unescaped": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", + "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==", + "license": "MIT" + }, + "node_modules/radix3": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/radix3/-/radix3-1.1.2.tgz", + "integrity": "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==", + "license": "MIT" + }, "node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -4915,6 +9515,111 @@ "react": "^19.1.0" } }, + "node_modules/react-remove-scroll": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.1.tgz", + "integrity": "sha512-HpMh8+oahmIdOuS5aFKKY6Pyog+FNaZV/XyJOq7b4YFwsFHe5yYfdbIalI4k3vU2nSDql7YskmUseHsRrJqIPA==", + "license": "MIT", + "dependencies": { + "react-remove-scroll-bar": "^2.3.7", + "react-style-singleton": "^2.2.3", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.3", + "use-sidecar": "^1.1.3" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz", + "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==", + "license": "MIT", + "dependencies": { + "react-style-singleton": "^2.2.2", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-style-singleton": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz", + "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==", + "license": "MIT", + "dependencies": { + "get-nonce": "^1.0.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/real-require": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.1.0.tgz", + "integrity": "sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg==", + "license": "MIT", + "engines": { + "node": ">= 12.13.0" + } + }, "node_modules/recast": { "version": "0.23.11", "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.11.tgz", @@ -4936,12 +9641,17 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" } }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "license": "ISC" + }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -5036,7 +9746,6 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, "funding": [ { "type": "github", @@ -5053,6 +9762,32 @@ ], "license": "MIT" }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-stable-stringify": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", + "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -5071,7 +9806,6 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", "license": "ISC", - "optional": true, "bin": { "semver": "bin/semver.js" }, @@ -5118,6 +9852,29 @@ "node": ">= 18" } }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "license": "ISC" + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -5125,6 +9882,26 @@ "dev": true, "license": "ISC" }, + "node_modules/sha.js": { + "version": "2.4.12", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.12.tgz", + "integrity": "sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==", + "license": "(MIT AND BSD-3-Clause)", + "dependencies": { + "inherits": "^2.0.4", + "safe-buffer": "^5.2.1", + "to-buffer": "^1.2.0" + }, + "bin": { + "sha.js": "bin.js" + }, + "engines": { + "node": ">= 0.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/shadcn": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/shadcn/-/shadcn-3.1.0.tgz", @@ -5337,6 +10114,77 @@ "dev": true, "license": "MIT" }, + "node_modules/socket.io-client": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.8.1.tgz", + "integrity": "sha512-hJVXfu3E28NmzGk8o1sHhN3om52tRvwYeidbj7xKy2eIIse5IoKX3USlS6Tqt3BHAtflLIkCQBkzVrEEfWUyYQ==", + "license": "MIT", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.2", + "engine.io-client": "~6.6.1", + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-client/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socket.io-parser": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", + "license": "MIT", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-parser/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/sonic-boom": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-2.8.0.tgz", + "integrity": "sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg==", + "license": "MIT", + "dependencies": { + "atomic-sleep": "^1.0.0" + } + }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -5356,6 +10204,24 @@ "node": ">=0.10.0" } }, + "node_modules/split-on-first": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz", + "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "license": "ISC", + "engines": { + "node": ">= 10.x" + } + }, "node_modules/statuses": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", @@ -5379,6 +10245,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/stream-shift": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", + "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==", + "license": "MIT" + }, "node_modules/strict-event-emitter": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/strict-event-emitter/-/strict-event-emitter-0.5.1.tgz", @@ -5386,6 +10258,24 @@ "dev": true, "license": "MIT" }, + "node_modules/strict-uri-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", + "integrity": "sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, "node_modules/string-width": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", @@ -5484,6 +10374,25 @@ } } }, + "node_modules/superstruct": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-1.0.4.tgz", + "integrity": "sha512-7JpaAoX2NGyoFlI9NBh66BQXGONc+uE+MRS5i2iOBKuS4e+ccgMDjATgZldkah+33DakBxDHiss9kvUcGAO8UQ==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tailwind-merge": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.3.1.tgz", + "integrity": "sha512-gBXpgUm/3rp1lMZZrM/w7D8GKqshif0zAymAhbCyIt8KMe+0v9DQ7cdYLR4FHH/cKpdTXb+A/tKKU3eolfsI+g==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, "node_modules/tailwindcss": { "version": "4.1.12", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.12.tgz", @@ -5523,6 +10432,15 @@ "node": ">=18" } }, + "node_modules/thread-stream": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-0.15.2.tgz", + "integrity": "sha512-UkEhKIg2pD+fjkHQKyJO3yoIvAP3N6RlNFt2dUhcS1FGvCD1cQa1M/PGknCLFIyZdtJOWQjejp7bdNqmN7zwdA==", + "license": "MIT", + "dependencies": { + "real-require": "^0.1.0" + } + }, "node_modules/tiny-invariant": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", @@ -5557,6 +10475,20 @@ "dev": true, "license": "MIT" }, + "node_modules/to-buffer": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.2.1.tgz", + "integrity": "sha512-tB82LpAIWjhLYbqjx3X4zEeHN6M8CiuOEy2JY8SEQVdYRe3CCHOFaqrBW1doLDrfpWhplcW7BL+bO3/6S3pcDQ==", + "license": "MIT", + "dependencies": { + "isarray": "^2.0.5", + "safe-buffer": "^5.2.1", + "typed-array-buffer": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -5593,6 +10525,12 @@ "node": ">=16" } }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" + }, "node_modules/ts-morph": { "version": "26.0.0", "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-26.0.0.tgz", @@ -5625,6 +10563,15 @@ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "license": "0BSD" }, + "node_modules/tw-animate-css": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/tw-animate-css/-/tw-animate-css-1.3.8.tgz", + "integrity": "sha512-Qrk3PZ7l7wUcGYhwZloqfkWCmaXZAoqjkdbIDvzfGshwGtexa/DAs9koXxIkrpEasyevandomzCBAV1Yyop5rw==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Wombosvideo" + } + }, "node_modules/type-fest": { "version": "4.41.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", @@ -5653,11 +10600,25 @@ "node": ">= 0.6" } }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/typescript": { "version": "5.9.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", - "dev": true, + "devOptional": true, "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", @@ -5667,6 +10628,27 @@ "node": ">=14.17" } }, + "node_modules/ufo": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.1.tgz", + "integrity": "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==", + "license": "MIT" + }, + "node_modules/uint8arrays": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.0.tgz", + "integrity": "sha512-ei5rfKtoRO8OyOIor2Rz5fhzjThwIHJZ3uyDPnDHTXbP0aMQ1RN/6AI5B5d9dBxJOU+BvOAk7ZQ1xphsX8Lrog==", + "license": "MIT", + "dependencies": { + "multiformats": "^9.4.2" + } + }, + "node_modules/uncrypto": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/uncrypto/-/uncrypto-0.1.3.tgz", + "integrity": "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==", + "license": "MIT" + }, "node_modules/undici-types": { "version": "6.21.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", @@ -5697,15 +10679,117 @@ "node": ">= 10.0.0" } }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/unstorage": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.17.1.tgz", + "integrity": "sha512-KKGwRTT0iVBCErKemkJCLs7JdxNVfqTPc/85ae1XES0+bsHbc/sFBfVi5kJp156cc51BHinIH2l3k0EZ24vOBQ==", + "license": "MIT", + "dependencies": { + "anymatch": "^3.1.3", + "chokidar": "^4.0.3", + "destr": "^2.0.5", + "h3": "^1.15.4", + "lru-cache": "^10.4.3", + "node-fetch-native": "^1.6.7", + "ofetch": "^1.4.1", + "ufo": "^1.6.1" + }, + "peerDependencies": { + "@azure/app-configuration": "^1.8.0", + "@azure/cosmos": "^4.2.0", + "@azure/data-tables": "^13.3.0", + "@azure/identity": "^4.6.0", + "@azure/keyvault-secrets": "^4.9.0", + "@azure/storage-blob": "^12.26.0", + "@capacitor/preferences": "^6.0.3 || ^7.0.0", + "@deno/kv": ">=0.9.0", + "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0", + "@planetscale/database": "^1.19.0", + "@upstash/redis": "^1.34.3", + "@vercel/blob": ">=0.27.1", + "@vercel/functions": "^2.2.12 || ^3.0.0", + "@vercel/kv": "^1.0.1", + "aws4fetch": "^1.0.20", + "db0": ">=0.2.1", + "idb-keyval": "^6.2.1", + "ioredis": "^5.4.2", + "uploadthing": "^7.4.4" + }, + "peerDependenciesMeta": { + "@azure/app-configuration": { + "optional": true + }, + "@azure/cosmos": { + "optional": true + }, + "@azure/data-tables": { + "optional": true + }, + "@azure/identity": { + "optional": true + }, + "@azure/keyvault-secrets": { + "optional": true + }, + "@azure/storage-blob": { + "optional": true + }, + "@capacitor/preferences": { + "optional": true + }, + "@deno/kv": { + "optional": true + }, + "@netlify/blobs": { + "optional": true + }, + "@planetscale/database": { + "optional": true + }, + "@upstash/redis": { + "optional": true + }, + "@vercel/blob": { + "optional": true + }, + "@vercel/functions": { + "optional": true + }, + "@vercel/kv": { + "optional": true + }, + "aws4fetch": { + "optional": true + }, + "db0": { + "optional": true + }, + "idb-keyval": { + "optional": true + }, + "ioredis": { + "optional": true + }, + "uploadthing": { + "optional": true + } + } + }, + "node_modules/unstorage/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" }, "node_modules/update-browserslist-db": { "version": "1.1.3", @@ -5748,6 +10832,123 @@ "punycode": "^2.1.0" } }, + "node_modules/use-callback-ref": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", + "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sidecar": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz", + "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==", + "license": "MIT", + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sync-external-store": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.4.0.tgz", + "integrity": "sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/utf-8-validate": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz", + "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=6.14.2" + } + }, + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/valtio": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/valtio/-/valtio-2.1.5.tgz", + "integrity": "sha512-vsh1Ixu5mT0pJFZm+Jspvhga5GzHUTYv0/+Th203pLfh3/wbHwxhu/Z2OkZDXIgHfjnjBns7SN9HNcbDvPmaGw==", + "license": "MIT", + "dependencies": { + "proxy-compare": "^3.0.1" + }, + "engines": { + "node": ">=12.20.0" + }, + "peerDependencies": { + "@types/react": ">=18.0.0", + "react": ">=18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react": { + "optional": true + } + } + }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -5758,6 +10959,154 @@ "node": ">= 0.8" } }, + "node_modules/viem": { + "version": "2.37.3", + "resolved": "https://registry.npmjs.org/viem/-/viem-2.37.3.tgz", + "integrity": "sha512-hwoZqkFSy13GCFzIftgfIH8hNENvdlcHIvtLt73w91tL6rKmZjQisXWTahi1Vn5of8/JQ1FBKfwUus3YkDXwbw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], + "license": "MIT", + "dependencies": { + "@noble/curves": "1.9.1", + "@noble/hashes": "1.8.0", + "@scure/bip32": "1.7.0", + "@scure/bip39": "1.6.0", + "abitype": "1.1.0", + "isows": "1.0.7", + "ox": "0.9.3", + "ws": "8.18.3" + }, + "peerDependencies": { + "typescript": ">=5.0.4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/viem/node_modules/@noble/curves": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.1.tgz", + "integrity": "sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.8.0" + }, + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/viem/node_modules/@scure/bip32": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.7.0.tgz", + "integrity": "sha512-E4FFX/N3f4B80AKWp5dP6ow+flD1LQZo/w8UnLGYZO674jS6YnYeepycOOksv+vLPSpgN35wgKgy+ybfTb2SMw==", + "license": "MIT", + "dependencies": { + "@noble/curves": "~1.9.0", + "@noble/hashes": "~1.8.0", + "@scure/base": "~1.2.5" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/viem/node_modules/@scure/bip39": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.6.0.tgz", + "integrity": "sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "~1.8.0", + "@scure/base": "~1.2.5" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/viem/node_modules/ox": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/ox/-/ox-0.9.3.tgz", + "integrity": "sha512-KzyJP+fPV4uhuuqrTZyok4DC7vFzi7HLUFiUNEmpbyh59htKWkOC98IONC1zgXJPbHAhQgqs6B0Z6StCGhmQvg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], + "license": "MIT", + "dependencies": { + "@adraffy/ens-normalize": "^1.11.0", + "@noble/ciphers": "^1.3.0", + "@noble/curves": "1.9.1", + "@noble/hashes": "^1.8.0", + "@scure/bip32": "^1.7.0", + "@scure/bip39": "^1.6.0", + "abitype": "^1.0.9", + "eventemitter3": "5.0.1" + }, + "peerDependencies": { + "typescript": ">=5.4.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/viem/node_modules/ws": { + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/wagmi": { + "version": "2.16.9", + "resolved": "https://registry.npmjs.org/wagmi/-/wagmi-2.16.9.tgz", + "integrity": "sha512-5NbjvuNNhT0t0lQsDD5otQqZ5RZBM1UhInHoBq/Lpnr6xLLa8AWxYqHg5oZtGCdiUNltys11iBOS6z4mLepIqw==", + "license": "MIT", + "dependencies": { + "@wagmi/connectors": "5.9.9", + "@wagmi/core": "2.20.3", + "use-sync-external-store": "1.4.0" + }, + "funding": { + "url": "https://github.com/sponsors/wevm" + }, + "peerDependencies": { + "@tanstack/react-query": ">=5.0.0", + "react": ">=18", + "typescript": ">=5.0.4", + "viem": "2.x" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/web-streams-polyfill": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", @@ -5768,6 +11117,28 @@ "node": ">= 8" } }, + "node_modules/webextension-polyfill": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/webextension-polyfill/-/webextension-polyfill-0.10.0.tgz", + "integrity": "sha512-c5s35LgVa5tFaHhrZDnr3FpQpjj1BB+RXhLTYUxGqBVN460HkbM8TBtEqdXWbpTKfzwCcjAZVF7zXCYSKtcp9g==", + "license": "MPL-2.0" + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/which": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", @@ -5784,11 +11155,37 @@ "node": "^16.13.0 || >=18.0.0" } }, + "node_modules/which-module": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", + "license": "ISC" + }, + "node_modules/which-typed-array": { + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/wrap-ansi": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", @@ -5803,7 +11200,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -5813,14 +11209,12 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, "license": "MIT" }, "node_modules/wrap-ansi/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", @@ -5835,7 +11229,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" @@ -5848,9 +11241,46 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true, "license": "ISC" }, + "node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xmlhttprequest-ssl": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.1.2.tgz", + "integrity": "sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -5975,7 +11405,7 @@ "version": "3.25.76", "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", - "dev": true, + "devOptional": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" @@ -5990,6 +11420,35 @@ "peerDependencies": { "zod": "^3.24.1" } + }, + "node_modules/zustand": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.3.tgz", + "integrity": "sha512-14fwWQtU3pH4dE0dOpdMiWjddcH+QzKIgk1cl8epwSE7yag43k/AD/m4L6+K7DytAOr9gGBe3/EXj9g7cdostg==", + "license": "MIT", + "engines": { + "node": ">=12.20.0" + }, + "peerDependencies": { + "@types/react": ">=18.0.0", + "immer": ">=9.0.6", + "react": ">=18.0.0", + "use-sync-external-store": ">=1.2.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "immer": { + "optional": true + }, + "react": { + "optional": true + }, + "use-sync-external-store": { + "optional": true + } + } } } } diff --git a/package.json b/package.json index ed9ae54..3108c7e 100644 --- a/package.json +++ b/package.json @@ -11,18 +11,28 @@ "registry:build": "shadcn build" }, "dependencies": { + "@radix-ui/react-dialog": "^1.1.15", + "@radix-ui/react-slot": "^1.2.3", + "@tanstack/react-query": "^5.86.0", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "lucide-react": "^0.542.0", + "next": "15.5.2", "react": "19.1.0", "react-dom": "19.1.0", - "next": "15.5.2" + "tailwind-merge": "^3.3.1", + "tw-animate-css": "^1.3.6", + "viem": "^2.37.3", + "wagmi": "^2.16.9" }, "devDependencies": { - "typescript": "^5", + "@biomejs/biome": "2.2.0", + "@tailwindcss/postcss": "^4", "@types/node": "^20", "@types/react": "^19", "@types/react-dom": "^19", - "@tailwindcss/postcss": "^4", + "shadcn": "^3.1.0", "tailwindcss": "^4", - "@biomejs/biome": "2.2.0", - "shadcn": "^3.1.0" + "typescript": "^5" } } diff --git a/public/r/payment-widget.json b/public/r/payment-widget.json index 44c662b..94a0a0d 100644 --- a/public/r/payment-widget.json +++ b/public/r/payment-widget.json @@ -3,12 +3,52 @@ "name": "payment-widget", "type": "registry:component", "title": "Payment Widget", - "description": "A simple payment widget for Request Network", + "description": "A wallet-connected payment widget for Request Network using pure wagmi", + "dependencies": [ + "wagmi@^2.12.29", + "viem@^2.21.53", + "@tanstack/react-query@^5.64.1" + ], + "registryDependencies": [ + "button", + "dialog" + ], "files": [ { "path": "registry/default/payment-widget/payment-widget.tsx", - "content": "export function PaymentWidget() {\n return (\n
\n
Pay with RN
\n
\n );\n}\n", - "type": "registry:component" + "content": "\"use client\";\n\nimport { useState } from \"react\";\nimport { Button } from \"@/components/ui/button\";\nimport { ConnectionHandler } from \"./components/connection-handler\";\nimport { Web3Provider } from \"@/components/providers/web3-provider\";\n\nexport function PaymentWidget() {\n const [isModalOpen, setIsModalOpen] = useState(false);\n const handleModalOpenChange = (open: boolean) => {\n setIsModalOpen(open);\n };\n\n return (\n \n \n \n \n );\n}\n", + "type": "registry:component", + "target": "components/payment-widget/payment-widget.tsx" + }, + { + "path": "registry/default/payment-widget/components/connection-handler.tsx", + "content": "\"use client\";\n\nimport { useAccount } from \"wagmi\";\nimport { PaymentModal } from \"./payment-modal\";\nimport { WalletConnectModal } from \"./wallet-connect-modal\";\n\ninterface ConnectionHandlerProps {\n isOpen: boolean;\n handleModalOpenChange: (open: boolean) => void;\n}\n\nexport function ConnectionHandler({\n isOpen,\n handleModalOpenChange,\n}: ConnectionHandlerProps) {\n const { isConnected } = useAccount();\n\n if (!isConnected) {\n return (\n \n );\n }\n\n return (\n \n );\n}\n", + "type": "registry:component", + "target": "components/payment-widget/components/connection-handler.tsx" + }, + { + "path": "registry/default/payment-widget/components/wallet-connect-modal.tsx", + "content": "\"use client\";\n\nimport { useConnect } from \"wagmi\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n} from \"@/components/ui/dialog\";\n\ninterface WalletConnectModalProps {\n isOpen: boolean;\n handleModalOpenChange: (open: boolean) => void;\n}\n\nexport function WalletConnectModal({\n isOpen,\n handleModalOpenChange,\n}: WalletConnectModalProps) {\n const { connectors, connect, isPending } = useConnect();\n\n const handleConnect = (connector: any) => {\n connect({ connector });\n };\n\n const getWalletIcon = (connectorName: string) => {\n switch (connectorName.toLowerCase()) {\n case \"metamask\":\n return \"🦊\";\n case \"walletconnect\":\n return \"🔗\";\n case \"coinbase wallet\":\n case \"coinbase\":\n return \"🔵\";\n case \"injected\":\n return \"💳\";\n default:\n return \"👛\";\n }\n };\n\n return (\n \n \n \n Connect Wallet\n \n Choose a wallet to connect and make your payment\n \n \n\n
\n {connectors.map((connector) => (\n handleConnect(connector)}\n disabled={isPending}\n variant=\"outline\"\n className=\"w-full justify-start h-14\"\n >\n
\n \n {getWalletIcon(connector.name)}\n \n
\n
{connector.name}
\n
\n Connect using {connector.name}\n
\n
\n
\n \n ))}\n\n {isPending && (\n
\n Connecting to wallet...\n
\n )}\n
\n
\n
\n );\n}\n", + "type": "registry:component", + "target": "components/payment-widget/components/wallet-connect-modal.tsx" + }, + { + "path": "registry/default/payment-widget/components/payment-modal.tsx", + "content": "\"use client\";\n\nimport { useAccount, useDisconnect } from \"wagmi\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n} from \"@/components/ui/dialog\";\n\ninterface PaymentModalProps {\n isOpen: boolean;\n handleModalOpenChange: (open: boolean) => void;\n}\n\nexport function PaymentModal({\n isOpen,\n handleModalOpenChange,\n}: PaymentModalProps) {\n const { address } = useAccount();\n const { disconnect } = useDisconnect();\n\n const handleDisconnect = () => {\n disconnect();\n handleModalOpenChange(false);\n };\n\n return (\n \n \n \n Payment\n \n Pay with cryptocurrency using Request Network\n \n \n
\n
\n

$25.00

\n

\n Payment form coming soon...\n

\n
\n
\n
\n Connected:\n \n {address?.slice(0, 6)}...{address?.slice(-4)}\n \n
\n \n Disconnect\n \n
\n
\n
\n
\n );\n}\n", + "type": "registry:component", + "target": "components/payment-widget/components/payment-modal.tsx" + }, + { + "path": "components/providers/web3-provider.tsx", + "content": "\"use client\";\n\nimport { QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\nimport { WagmiProvider } from \"wagmi\";\nimport { config } from \"@/lib/wagmi\";\n\nconst queryClient = new QueryClient();\n\nexport function Web3Provider({ children }: { children: React.ReactNode }) {\n return (\n \n {children}\n \n );\n}\n", + "type": "registry:component", + "target": "components/providers/web3-provider.tsx" + }, + { + "path": "lib/wagmi.ts", + "content": "import { createConfig, http } from \"wagmi\";\nimport { mainnet, sepolia } from \"wagmi/chains\";\nimport {\n injected,\n walletConnect,\n coinbaseWallet,\n metaMask,\n safe,\n} from \"wagmi/connectors\";\n\nconst projectId = process.env.NEXT_PUBLIC_WALLET_CONNECT_PROJECT_ID || \"\";\n\nexport const config = createConfig({\n chains: [mainnet, sepolia],\n connectors: [\n injected(),\n walletConnect({\n projectId,\n metadata: {\n name: \"Request Network Payment\",\n description: \"Pay with cryptocurrency using Request Network\",\n url: \"https://request.network\",\n icons: [],\n },\n }),\n coinbaseWallet({\n appName: \"Request Network Payment\",\n }),\n metaMask(),\n safe(),\n ],\n transports: {\n [mainnet.id]: http(),\n [sepolia.id]: http(),\n },\n});\n", + "type": "registry:lib", + "target": "lib/wagmi.ts" } ] } \ No newline at end of file diff --git a/public/r/registry.json b/public/r/registry.json new file mode 100644 index 0000000..aa334c5 --- /dev/null +++ b/public/r/registry.json @@ -0,0 +1,51 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry.json", + "name": "requestnetwork", + "homepage": "https://request.network", + "items": [ + { + "name": "payment-widget", + "type": "registry:component", + "title": "Payment Widget", + "description": "A wallet-connected payment widget for Request Network using pure wagmi", + "registryDependencies": ["button", "dialog"], + "dependencies": [ + "wagmi@^2.12.29", + "viem@^2.21.53", + "@tanstack/react-query@^5.64.1" + ], + "files": [ + { + "path": "registry/default/payment-widget/payment-widget.tsx", + "type": "registry:component", + "target": "components/payment-widget/payment-widget.tsx" + }, + { + "path": "registry/default/payment-widget/components/connection-handler.tsx", + "type": "registry:component", + "target": "components/payment-widget/components/connection-handler.tsx" + }, + { + "path": "registry/default/payment-widget/components/wallet-connect-modal.tsx", + "type": "registry:component", + "target": "components/payment-widget/components/wallet-connect-modal.tsx" + }, + { + "path": "registry/default/payment-widget/components/payment-modal.tsx", + "type": "registry:component", + "target": "components/payment-widget/components/payment-modal.tsx" + }, + { + "path": "components/providers/web3-provider.tsx", + "type": "registry:component", + "target": "components/providers/web3-provider.tsx" + }, + { + "path": "lib/wagmi.ts", + "type": "registry:lib", + "target": "lib/wagmi.ts" + } + ] + } + ] +} diff --git a/public/r/requestnetwork.json b/public/r/requestnetwork.json new file mode 100644 index 0000000..b4dd2ed --- /dev/null +++ b/public/r/requestnetwork.json @@ -0,0 +1,5 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry-item.json", + "name": "requestnetwork", + "type": "registry:component" +} \ No newline at end of file diff --git a/registry.json b/registry.json index 4d2295e..aa334c5 100644 --- a/registry.json +++ b/registry.json @@ -7,11 +7,43 @@ "name": "payment-widget", "type": "registry:component", "title": "Payment Widget", - "description": "A simple payment widget for Request Network", + "description": "A wallet-connected payment widget for Request Network using pure wagmi", + "registryDependencies": ["button", "dialog"], + "dependencies": [ + "wagmi@^2.12.29", + "viem@^2.21.53", + "@tanstack/react-query@^5.64.1" + ], "files": [ { "path": "registry/default/payment-widget/payment-widget.tsx", - "type": "registry:component" + "type": "registry:component", + "target": "components/payment-widget/payment-widget.tsx" + }, + { + "path": "registry/default/payment-widget/components/connection-handler.tsx", + "type": "registry:component", + "target": "components/payment-widget/components/connection-handler.tsx" + }, + { + "path": "registry/default/payment-widget/components/wallet-connect-modal.tsx", + "type": "registry:component", + "target": "components/payment-widget/components/wallet-connect-modal.tsx" + }, + { + "path": "registry/default/payment-widget/components/payment-modal.tsx", + "type": "registry:component", + "target": "components/payment-widget/components/payment-modal.tsx" + }, + { + "path": "components/providers/web3-provider.tsx", + "type": "registry:component", + "target": "components/providers/web3-provider.tsx" + }, + { + "path": "lib/wagmi.ts", + "type": "registry:lib", + "target": "lib/wagmi.ts" } ] } diff --git a/registry/default/payment-widget/components/connection-handler.tsx b/registry/default/payment-widget/components/connection-handler.tsx new file mode 100644 index 0000000..e30ccf6 --- /dev/null +++ b/registry/default/payment-widget/components/connection-handler.tsx @@ -0,0 +1,33 @@ +"use client"; + +import { useAccount } from "wagmi"; +import { PaymentModal } from "./payment-modal"; +import { WalletConnectModal } from "./wallet-connect-modal"; + +interface ConnectionHandlerProps { + isOpen: boolean; + handleModalOpenChange: (open: boolean) => void; +} + +export function ConnectionHandler({ + isOpen, + handleModalOpenChange, +}: ConnectionHandlerProps) { + const { isConnected } = useAccount(); + + if (!isConnected) { + return ( + + ); + } + + return ( + + ); +} diff --git a/registry/default/payment-widget/components/payment-modal.tsx b/registry/default/payment-widget/components/payment-modal.tsx new file mode 100644 index 0000000..7fdecf3 --- /dev/null +++ b/registry/default/payment-widget/components/payment-modal.tsx @@ -0,0 +1,65 @@ +"use client"; + +import { useAccount, useDisconnect } from "wagmi"; +import { Button } from "@/components/ui/button"; +import { + Dialog, + DialogContent, + DialogDescription, + DialogHeader, + DialogTitle, +} from "@/components/ui/dialog"; + +interface PaymentModalProps { + isOpen: boolean; + handleModalOpenChange: (open: boolean) => void; +} + +export function PaymentModal({ + isOpen, + handleModalOpenChange, +}: PaymentModalProps) { + const { address } = useAccount(); + const { disconnect } = useDisconnect(); + + const handleDisconnect = () => { + disconnect(); + handleModalOpenChange(false); + }; + + return ( + + + + Payment + + Pay with cryptocurrency using Request Network + + +
+
+

$25.00

+

+ Payment form coming soon... +

+
+
+
+ Connected: + + {address?.slice(0, 6)}...{address?.slice(-4)} + +
+ +
+
+
+
+ ); +} diff --git a/registry/default/payment-widget/components/wallet-connect-modal.tsx b/registry/default/payment-widget/components/wallet-connect-modal.tsx new file mode 100644 index 0000000..7e7fd75 --- /dev/null +++ b/registry/default/payment-widget/components/wallet-connect-modal.tsx @@ -0,0 +1,86 @@ +"use client"; + +import { useConnect } from "wagmi"; +import { Button } from "@/components/ui/button"; +import { + Dialog, + DialogContent, + DialogDescription, + DialogHeader, + DialogTitle, +} from "@/components/ui/dialog"; + +interface WalletConnectModalProps { + isOpen: boolean; + handleModalOpenChange: (open: boolean) => void; +} + +export function WalletConnectModal({ + isOpen, + handleModalOpenChange, +}: WalletConnectModalProps) { + const { connectors, connect, isPending } = useConnect(); + + const handleConnect = (connector: any) => { + connect({ connector }); + }; + + const getWalletIcon = (connectorName: string) => { + switch (connectorName.toLowerCase()) { + case "metamask": + return "🦊"; + case "walletconnect": + return "🔗"; + case "coinbase wallet": + case "coinbase": + return "🔵"; + case "injected": + return "💳"; + default: + return "👛"; + } + }; + + return ( + + + + Connect Wallet + + Choose a wallet to connect and make your payment + + + +
+ {connectors.map((connector) => ( + + ))} + + {isPending && ( +
+ Connecting to wallet... +
+ )} +
+
+
+ ); +} diff --git a/registry/default/payment-widget/payment-widget.tsx b/registry/default/payment-widget/payment-widget.tsx index b92f784..5d8e90e 100644 --- a/registry/default/payment-widget/payment-widget.tsx +++ b/registry/default/payment-widget/payment-widget.tsx @@ -1,7 +1,29 @@ -export function PaymentWidget() { +"use client"; + +import { useState } from "react"; +import { Button } from "@/components/ui/button"; +import { ConnectionHandler } from "./components/connection-handler"; +import { Web3Provider } from "@/components/providers/web3-provider"; + +export function PaymentWidget({ + walletConnectProjectId, +}: { + walletConnectProjectId?: string; +}) { + const [isModalOpen, setIsModalOpen] = useState(false); + const handleModalOpenChange = (open: boolean) => { + setIsModalOpen(open); + }; + return ( -
-
Pay with RN
-
+ + + + ); } From d7a1a57ced91ba268be6fa56266bfa8dbb7edf00 Mon Sep 17 00:00:00 2001 From: Bassgeta Date: Mon, 8 Sep 2025 09:59:38 +0200 Subject: [PATCH 03/37] feat: implement currency selection and buyer info form --- components/ui/input.tsx | 22 + components/ui/label.tsx | 26 + components/ui/radio-group.tsx | 44 ++ package-lock.json | 673 +++++------------- package.json | 3 + .../components/buyer-info-form.tsx | 180 +++++ .../components/connection-handler.tsx | 19 +- .../components/currency-select.tsx | 67 ++ .../components/payment-modal.tsx | 54 +- .../default/payment-widget/payment-widget.tsx | 10 + 10 files changed, 572 insertions(+), 526 deletions(-) create mode 100644 components/ui/input.tsx create mode 100644 components/ui/label.tsx create mode 100644 components/ui/radio-group.tsx create mode 100644 registry/default/payment-widget/components/buyer-info-form.tsx create mode 100644 registry/default/payment-widget/components/currency-select.tsx diff --git a/components/ui/input.tsx b/components/ui/input.tsx new file mode 100644 index 0000000..68551b9 --- /dev/null +++ b/components/ui/input.tsx @@ -0,0 +1,22 @@ +import * as React from "react" + +import { cn } from "@/lib/utils" + +const Input = React.forwardRef>( + ({ className, type, ...props }, ref) => { + return ( + + ) + } +) +Input.displayName = "Input" + +export { Input } diff --git a/components/ui/label.tsx b/components/ui/label.tsx new file mode 100644 index 0000000..5341821 --- /dev/null +++ b/components/ui/label.tsx @@ -0,0 +1,26 @@ +"use client" + +import * as React from "react" +import * as LabelPrimitive from "@radix-ui/react-label" +import { cva, type VariantProps } from "class-variance-authority" + +import { cn } from "@/lib/utils" + +const labelVariants = cva( + "text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70" +) + +const Label = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & + VariantProps +>(({ className, ...props }, ref) => ( + +)) +Label.displayName = LabelPrimitive.Root.displayName + +export { Label } diff --git a/components/ui/radio-group.tsx b/components/ui/radio-group.tsx new file mode 100644 index 0000000..e9bde17 --- /dev/null +++ b/components/ui/radio-group.tsx @@ -0,0 +1,44 @@ +"use client" + +import * as React from "react" +import * as RadioGroupPrimitive from "@radix-ui/react-radio-group" +import { Circle } from "lucide-react" + +import { cn } from "@/lib/utils" + +const RadioGroup = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => { + return ( + + ) +}) +RadioGroup.displayName = RadioGroupPrimitive.Root.displayName + +const RadioGroupItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => { + return ( + + + + + + ) +}) +RadioGroupItem.displayName = RadioGroupPrimitive.Item.displayName + +export { RadioGroup, RadioGroupItem } diff --git a/package-lock.json b/package-lock.json index 0611f4e..e4112c7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,9 +9,9 @@ "version": "0.1.0", "dependencies": { "@radix-ui/react-dialog": "^1.1.15", + "@radix-ui/react-label": "^2.1.7", + "@radix-ui/react-radio-group": "^1.3.8", "@radix-ui/react-slot": "^1.2.3", - "@reown/appkit": "^1.8.2", - "@reown/appkit-adapter-wagmi": "^1.8.2", "@tanstack/react-query": "^5.86.0", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", @@ -19,6 +19,7 @@ "next": "15.5.2", "react": "19.1.0", "react-dom": "19.1.0", + "react-hook-form": "^7.62.0", "tailwind-merge": "^3.3.1", "tw-animate-css": "^1.3.6", "viem": "^2.37.3", @@ -1582,16 +1583,6 @@ "integrity": "sha512-ficsEARKnmmW5njugNYKipTm4SFnbik7CXtoencDZzmzo/dQ+2Q0bgkzJuoJP20Aj0F+izzJjOqsnkd6F/o1bw==", "license": "BSD-3-Clause" }, - "node_modules/@lit/react": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@lit/react/-/react-1.0.8.tgz", - "integrity": "sha512-p2+YcF+JE67SRX3mMlJ1TKCSTsgyOVdAwd/nxp3NuV1+Cb6MWALbN6nT7Ld4tpmYofcE5kcaSY1YBB9erY+6fw==", - "license": "BSD-3-Clause", - "optional": true, - "peerDependencies": { - "@types/react": "17 || 18 || 19" - } - }, "node_modules/@lit/reactive-element": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-2.1.1.tgz", @@ -2104,15 +2095,6 @@ "node": ">=18" } }, - "node_modules/@msgpack/msgpack": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@msgpack/msgpack/-/msgpack-3.1.2.tgz", - "integrity": "sha512-JEW4DEtBzfe8HvUYecLU9e6+XJnKDlUAIve8FvPzF3Kzs6Xo/KuZkZJsDH0wJXl/qEZbeeE7edxDNY3kMs39hQ==", - "license": "ISC", - "engines": { - "node": ">= 18" - } - }, "node_modules/@mswjs/interceptors": { "version": "0.39.6", "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.39.6.tgz", @@ -2377,21 +2359,38 @@ "url": "https://paulmillr.com/funding/" } }, - "node_modules/@phosphor-icons/webcomponents": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@phosphor-icons/webcomponents/-/webcomponents-2.1.5.tgz", - "integrity": "sha512-JcvQkZxvcX2jK+QCclm8+e8HXqtdFW9xV4/kk2aL9Y3dJA2oQVt+pzbv1orkumz3rfx4K9mn9fDoMr1He1yr7Q==", - "license": "MIT", - "dependencies": { - "lit": "^3" - } - }, "node_modules/@radix-ui/primitive": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz", "integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==", "license": "MIT" }, + "node_modules/@radix-ui/react-collection": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.7.tgz", + "integrity": "sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-compose-refs": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", @@ -2458,6 +2457,21 @@ } } }, + "node_modules/@radix-ui/react-direction": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.1.tgz", + "integrity": "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-dismissable-layer": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.11.tgz", @@ -2543,6 +2557,29 @@ } } }, + "node_modules/@radix-ui/react-label": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.7.tgz", + "integrity": "sha512-YT1GqPSL8kJn20djelMX7/cTRp/Y9w5IZHvfxQTVHrOqa2yMl7i/UfMqKRU5V7mEyKTrUVgJXhNQPVCG8PBLoQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-portal": { "version": "1.1.9", "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz", @@ -2614,6 +2651,69 @@ } } }, + "node_modules/@radix-ui/react-radio-group": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-radio-group/-/react-radio-group-1.3.8.tgz", + "integrity": "sha512-VBKYIYImA5zsxACdisNQ3BjCBfmbGH3kQlnFVqlWU4tXwjy7cGX8ta80BcrO+WJXIn5iBylEH3K6ZTlee//lgQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-roving-focus": "1.1.11", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-use-size": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-roving-focus": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.11.tgz", + "integrity": "sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-slot": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", @@ -2717,170 +2817,37 @@ } } }, - "node_modules/@reown/appkit": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/@reown/appkit/-/appkit-1.8.2.tgz", - "integrity": "sha512-nCFMGQX3+XHTmd8pkWtyGRj+INFgeg0sRYxLZKQktvFsiR98BFjP9DQIErIujdk2chRx5mX0gGc5s9OvaRJNyA==", - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "@reown/appkit-common": "1.8.2", - "@reown/appkit-controllers": "1.8.2", - "@reown/appkit-pay": "1.8.2", - "@reown/appkit-polyfills": "1.8.2", - "@reown/appkit-scaffold-ui": "1.8.2", - "@reown/appkit-ui": "1.8.2", - "@reown/appkit-utils": "1.8.2", - "@reown/appkit-wallet": "1.8.2", - "@walletconnect/universal-provider": "2.21.7", - "bs58": "6.0.0", - "semver": "7.7.2", - "valtio": "2.1.5", - "viem": ">=2.33.3" + "node_modules/@radix-ui/react-use-previous": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.1.tgz", + "integrity": "sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, - "optionalDependencies": { - "@lit/react": "1.0.8" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@reown/appkit-adapter-wagmi": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/@reown/appkit-adapter-wagmi/-/appkit-adapter-wagmi-1.8.2.tgz", - "integrity": "sha512-7VfKKjDZkr3C9Bbx19FQfP3umHaw13ZZKbde+DjZNxWGx2CScOMZ187wXa+FU7umkvmXlAdYSbOzFFmriiEwNw==", - "license": "Apache-2.0", + "node_modules/@radix-ui/react-use-size": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.1.tgz", + "integrity": "sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==", + "license": "MIT", "dependencies": { - "@reown/appkit": "1.8.2", - "@reown/appkit-common": "1.8.2", - "@reown/appkit-controllers": "1.8.2", - "@reown/appkit-polyfills": "1.8.2", - "@reown/appkit-scaffold-ui": "1.8.2", - "@reown/appkit-utils": "1.8.2", - "@reown/appkit-wallet": "1.8.2", - "@walletconnect/universal-provider": "2.21.7", - "valtio": "2.1.5" - }, - "optionalDependencies": { - "@wagmi/connectors": ">=5.7.11" + "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { - "@wagmi/core": ">=2.16.7", - "viem": ">=2.33.3", - "wagmi": ">=2.16.3" - } - }, - "node_modules/@reown/appkit-common": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/@reown/appkit-common/-/appkit-common-1.8.2.tgz", - "integrity": "sha512-xlo1pRh1DkZfB7I1JkeC8ELlsM7ziSG/oJig1KgTsNZPQdYC9fADWY7vH/daUUkgS8QQbINc7HW8WAR1DkA+dw==", - "license": "Apache-2.0", - "dependencies": { - "big.js": "6.2.2", - "dayjs": "1.11.13", - "viem": ">=2.33.3" - } - }, - "node_modules/@reown/appkit-controllers": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/@reown/appkit-controllers/-/appkit-controllers-1.8.2.tgz", - "integrity": "sha512-ccGbuiKNceCmh8JxtcDFc115fosJ2abcSfDo4HVSSgew/4rPzqIsD/TPfBLgk2KOAi7RF4keC5mckHHIWfmoFw==", - "license": "Apache-2.0", - "dependencies": { - "@reown/appkit-common": "1.8.2", - "@reown/appkit-wallet": "1.8.2", - "@walletconnect/universal-provider": "2.21.7", - "valtio": "2.1.5", - "viem": ">=2.33.3" - } - }, - "node_modules/@reown/appkit-pay": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/@reown/appkit-pay/-/appkit-pay-1.8.2.tgz", - "integrity": "sha512-8rBB/sNty9P4oKVgETFmUXh6iFfbr+UWmpN7TThtMAFXuAGevbHKIF4ZXNjvF63L5knpOF8elVNNmSXyxHpInA==", - "license": "Apache-2.0", - "dependencies": { - "@reown/appkit-common": "1.8.2", - "@reown/appkit-controllers": "1.8.2", - "@reown/appkit-ui": "1.8.2", - "@reown/appkit-utils": "1.8.2", - "lit": "3.3.0", - "valtio": "2.1.5" - } - }, - "node_modules/@reown/appkit-polyfills": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/@reown/appkit-polyfills/-/appkit-polyfills-1.8.2.tgz", - "integrity": "sha512-D1npLFY3q/X6qh241lh47DfL1EaPpMEeVtV7c2HFdmitUgXqc2BgH7mhMfpI3UgaT42+eP5+W+KanZwwyraNPw==", - "license": "Apache-2.0", - "dependencies": { - "buffer": "6.0.3" - } - }, - "node_modules/@reown/appkit-scaffold-ui": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/@reown/appkit-scaffold-ui/-/appkit-scaffold-ui-1.8.2.tgz", - "integrity": "sha512-AmcMlrovF6NLsopRGgjRYoWMx9R04Tf7G4g+O3I/I09iKv+whz3yjQDePuxhymsCbH5pUvuGkmvVl3mMvhCR0Q==", - "license": "Apache-2.0", - "dependencies": { - "@reown/appkit-common": "1.8.2", - "@reown/appkit-controllers": "1.8.2", - "@reown/appkit-ui": "1.8.2", - "@reown/appkit-utils": "1.8.2", - "@reown/appkit-wallet": "1.8.2", - "lit": "3.3.0" - } - }, - "node_modules/@reown/appkit-ui": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/@reown/appkit-ui/-/appkit-ui-1.8.2.tgz", - "integrity": "sha512-tdYFBmFLIQzqO0QYo6KJTWJ8UZ5yyqmQ4+YnD1PL4pIMPAaFcVB9ZP0ESSX1eX+bGKkBc+I/rbwKgyqTIJLV9Q==", - "license": "Apache-2.0", - "dependencies": { - "@phosphor-icons/webcomponents": "2.1.5", - "@reown/appkit-common": "1.8.2", - "@reown/appkit-controllers": "1.8.2", - "@reown/appkit-wallet": "1.8.2", - "lit": "3.3.0", - "qrcode": "1.5.3" - } - }, - "node_modules/@reown/appkit-utils": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/@reown/appkit-utils/-/appkit-utils-1.8.2.tgz", - "integrity": "sha512-MBhZBCSMNeP6zQ/NVDqEK4DZttUMLEtO/G5WK4Yhzvzra54Z5VIzTPg5bnNe+ntAJ19AL2P7dh8RjaazdMN7Aw==", - "license": "Apache-2.0", - "dependencies": { - "@reown/appkit-common": "1.8.2", - "@reown/appkit-controllers": "1.8.2", - "@reown/appkit-polyfills": "1.8.2", - "@reown/appkit-wallet": "1.8.2", - "@wallet-standard/wallet": "1.1.0", - "@walletconnect/logger": "2.1.2", - "@walletconnect/universal-provider": "2.21.7", - "valtio": "2.1.5", - "viem": ">=2.33.3" + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, - "peerDependencies": { - "valtio": "2.1.5" - } - }, - "node_modules/@reown/appkit-wallet": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/@reown/appkit-wallet/-/appkit-wallet-1.8.2.tgz", - "integrity": "sha512-cENbBX4WLwkLpIXwH6w+Ys9gmPVnQtGz59/UaO/+nsCxpy+yJcH1yjXyktiLYUBq64ZPGBluYYXg2zJgSCL+nA==", - "license": "Apache-2.0", - "dependencies": { - "@reown/appkit-common": "1.8.2", - "@reown/appkit-polyfills": "1.8.2", - "@walletconnect/logger": "2.1.2", - "zod": "3.22.4" - } - }, - "node_modules/@reown/appkit-wallet/node_modules/zod": { - "version": "3.22.4", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.4.tgz", - "integrity": "sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, "node_modules/@safe-global/safe-apps-provider": { @@ -3507,27 +3474,6 @@ } } }, - "node_modules/@wallet-standard/base": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@wallet-standard/base/-/base-1.1.0.tgz", - "integrity": "sha512-DJDQhjKmSNVLKWItoKThJS+CsJQjR9AOBOirBVT1F9YpRyC9oYHE+ZnSf8y8bxUphtKqdQMPVQ2mHohYdRvDVQ==", - "license": "Apache-2.0", - "engines": { - "node": ">=16" - } - }, - "node_modules/@wallet-standard/wallet": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@wallet-standard/wallet/-/wallet-1.1.0.tgz", - "integrity": "sha512-Gt8TnSlDZpAl+RWOOAB/kuvC7RpcdWAlFbHNoi4gsXsfaWa1QCT6LBcfIYTPdOZC9OVZUDwqGuGAcqZejDmHjg==", - "license": "Apache-2.0", - "dependencies": { - "@wallet-standard/base": "^1.1.0" - }, - "engines": { - "node": ">=16" - } - }, "node_modules/@walletconnect/core": { "version": "2.21.1", "resolved": "https://registry.npmjs.org/@walletconnect/core/-/core-2.21.1.tgz", @@ -4623,291 +4569,6 @@ "events": "3.3.0" } }, - "node_modules/@walletconnect/universal-provider": { - "version": "2.21.7", - "resolved": "https://registry.npmjs.org/@walletconnect/universal-provider/-/universal-provider-2.21.7.tgz", - "integrity": "sha512-8PB+vA5VuR9PBqt5Y0xj4JC2doYNPlXLGQt3wJORVF9QC227Mm/8R1CAKpmneeLrUH02LkSRwx+wnN/pPnDiQA==", - "license": "Apache-2.0", - "dependencies": { - "@walletconnect/events": "1.0.1", - "@walletconnect/jsonrpc-http-connection": "1.0.8", - "@walletconnect/jsonrpc-provider": "1.0.14", - "@walletconnect/jsonrpc-types": "1.0.4", - "@walletconnect/jsonrpc-utils": "1.0.8", - "@walletconnect/keyvaluestorage": "1.1.1", - "@walletconnect/logger": "2.1.2", - "@walletconnect/sign-client": "2.21.7", - "@walletconnect/types": "2.21.7", - "@walletconnect/utils": "2.21.7", - "es-toolkit": "1.39.3", - "events": "3.3.0" - } - }, - "node_modules/@walletconnect/universal-provider/node_modules/@noble/curves": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.2.tgz", - "integrity": "sha512-HxngEd2XUcg9xi20JkwlLCtYwfoFw4JGkuZpT+WlsPD4gB/cxkvTD8fSsoAnphGZhFdZYKeQIPCuFlWPm1uE0g==", - "license": "MIT", - "dependencies": { - "@noble/hashes": "1.8.0" - }, - "engines": { - "node": "^14.21.3 || >=16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@walletconnect/universal-provider/node_modules/@scure/bip32": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.7.0.tgz", - "integrity": "sha512-E4FFX/N3f4B80AKWp5dP6ow+flD1LQZo/w8UnLGYZO674jS6YnYeepycOOksv+vLPSpgN35wgKgy+ybfTb2SMw==", - "license": "MIT", - "dependencies": { - "@noble/curves": "~1.9.0", - "@noble/hashes": "~1.8.0", - "@scure/base": "~1.2.5" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@walletconnect/universal-provider/node_modules/@scure/bip39": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.6.0.tgz", - "integrity": "sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A==", - "license": "MIT", - "dependencies": { - "@noble/hashes": "~1.8.0", - "@scure/base": "~1.2.5" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@walletconnect/universal-provider/node_modules/@walletconnect/core": { - "version": "2.21.7", - "resolved": "https://registry.npmjs.org/@walletconnect/core/-/core-2.21.7.tgz", - "integrity": "sha512-q/Au5Ne3g4R+q4GvHR5cvRd3+ha00QZCZiCs058lmy+eDbiZd0YsautvTPJ5a2guD6UaS1k/w5e1JHgixdcgLA==", - "license": "Apache-2.0", - "dependencies": { - "@walletconnect/heartbeat": "1.2.2", - "@walletconnect/jsonrpc-provider": "1.0.14", - "@walletconnect/jsonrpc-types": "1.0.4", - "@walletconnect/jsonrpc-utils": "1.0.8", - "@walletconnect/jsonrpc-ws-connection": "1.0.16", - "@walletconnect/keyvaluestorage": "1.1.1", - "@walletconnect/logger": "2.1.2", - "@walletconnect/relay-api": "1.0.11", - "@walletconnect/relay-auth": "1.1.0", - "@walletconnect/safe-json": "1.0.2", - "@walletconnect/time": "1.0.2", - "@walletconnect/types": "2.21.7", - "@walletconnect/utils": "2.21.7", - "@walletconnect/window-getters": "1.0.1", - "es-toolkit": "1.39.3", - "events": "3.3.0", - "uint8arrays": "3.1.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@walletconnect/universal-provider/node_modules/@walletconnect/sign-client": { - "version": "2.21.7", - "resolved": "https://registry.npmjs.org/@walletconnect/sign-client/-/sign-client-2.21.7.tgz", - "integrity": "sha512-9k/JEl9copR6nXRhqnmzWz2Zk1hiWysH+o6bp6Cqo8TgDUrZoMLBZMZ6qbo+2HLI54V02kKf0Vg8M81nNFOpjQ==", - "license": "Apache-2.0", - "dependencies": { - "@walletconnect/core": "2.21.7", - "@walletconnect/events": "1.0.1", - "@walletconnect/heartbeat": "1.2.2", - "@walletconnect/jsonrpc-utils": "1.0.8", - "@walletconnect/logger": "2.1.2", - "@walletconnect/time": "1.0.2", - "@walletconnect/types": "2.21.7", - "@walletconnect/utils": "2.21.7", - "events": "3.3.0" - } - }, - "node_modules/@walletconnect/universal-provider/node_modules/@walletconnect/types": { - "version": "2.21.7", - "resolved": "https://registry.npmjs.org/@walletconnect/types/-/types-2.21.7.tgz", - "integrity": "sha512-kyGnFje4Iq+XGkZZcSoAIrJWBE4BeghVW4O7n9e1MhUyeOOtO55M/kcqceNGYrvwjHvdN+Kf+aoLnKC0zKlpbQ==", - "license": "Apache-2.0", - "dependencies": { - "@walletconnect/events": "1.0.1", - "@walletconnect/heartbeat": "1.2.2", - "@walletconnect/jsonrpc-types": "1.0.4", - "@walletconnect/keyvaluestorage": "1.1.1", - "@walletconnect/logger": "2.1.2", - "events": "3.3.0" - } - }, - "node_modules/@walletconnect/universal-provider/node_modules/@walletconnect/utils": { - "version": "2.21.7", - "resolved": "https://registry.npmjs.org/@walletconnect/utils/-/utils-2.21.7.tgz", - "integrity": "sha512-qyaclTgcFf9AwVuoV8CLLg8wfH3nX7yZdpylNkDqCpS7wawQL9zmFFTaGgma8sQrCsd3Sd9jUIymcpRvCJnSTw==", - "license": "Apache-2.0", - "dependencies": { - "@msgpack/msgpack": "3.1.2", - "@noble/ciphers": "1.3.0", - "@noble/curves": "1.9.2", - "@noble/hashes": "1.8.0", - "@scure/base": "1.2.6", - "@walletconnect/jsonrpc-utils": "1.0.8", - "@walletconnect/keyvaluestorage": "1.1.1", - "@walletconnect/relay-api": "1.0.11", - "@walletconnect/relay-auth": "1.1.0", - "@walletconnect/safe-json": "1.0.2", - "@walletconnect/time": "1.0.2", - "@walletconnect/types": "2.21.7", - "@walletconnect/window-getters": "1.0.1", - "@walletconnect/window-metadata": "1.0.1", - "blakejs": "1.2.1", - "bs58": "6.0.0", - "detect-browser": "5.3.0", - "query-string": "7.1.3", - "uint8arrays": "3.1.1", - "viem": "2.31.0" - } - }, - "node_modules/@walletconnect/universal-provider/node_modules/abitype": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/abitype/-/abitype-1.0.8.tgz", - "integrity": "sha512-ZeiI6h3GnW06uYDLx0etQtX/p8E24UaHHBj57RSjK7YBFe7iuVn07EDpOeP451D06sF27VOz9JJPlIKJmXgkEg==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/wevm" - }, - "peerDependencies": { - "typescript": ">=5.0.4", - "zod": "^3 >=3.22.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - }, - "zod": { - "optional": true - } - } - }, - "node_modules/@walletconnect/universal-provider/node_modules/es-toolkit": { - "version": "1.39.3", - "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.39.3.tgz", - "integrity": "sha512-Qb/TCFCldgOy8lZ5uC7nLGdqJwSabkQiYQShmw4jyiPk1pZzaYWTwaYKYP7EgLccWYgZocMrtItrwh683voaww==", - "license": "MIT", - "workspaces": [ - "docs", - "benchmarks" - ] - }, - "node_modules/@walletconnect/universal-provider/node_modules/ox": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ox/-/ox-0.7.1.tgz", - "integrity": "sha512-+k9fY9PRNuAMHRFIUbiK9Nt5seYHHzSQs9Bj+iMETcGtlpS7SmBzcGSVUQO3+nqGLEiNK4598pHNFlVRaZbRsg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/wevm" - } - ], - "license": "MIT", - "dependencies": { - "@adraffy/ens-normalize": "^1.10.1", - "@noble/ciphers": "^1.3.0", - "@noble/curves": "^1.6.0", - "@noble/hashes": "^1.5.0", - "@scure/bip32": "^1.5.0", - "@scure/bip39": "^1.4.0", - "abitype": "^1.0.6", - "eventemitter3": "5.0.1" - }, - "peerDependencies": { - "typescript": ">=5.4.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@walletconnect/universal-provider/node_modules/uint8arrays": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.1.tgz", - "integrity": "sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg==", - "license": "MIT", - "dependencies": { - "multiformats": "^9.4.2" - } - }, - "node_modules/@walletconnect/universal-provider/node_modules/viem": { - "version": "2.31.0", - "resolved": "https://registry.npmjs.org/viem/-/viem-2.31.0.tgz", - "integrity": "sha512-U7OMQ6yqK+bRbEIarf2vqxL7unSEQvNxvML/1zG7suAmKuJmipqdVTVJGKBCJiYsm/EremyO2FS4dHIPpGv+eA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/wevm" - } - ], - "license": "MIT", - "dependencies": { - "@noble/curves": "1.9.1", - "@noble/hashes": "1.8.0", - "@scure/bip32": "1.7.0", - "@scure/bip39": "1.6.0", - "abitype": "1.0.8", - "isows": "1.0.7", - "ox": "0.7.1", - "ws": "8.18.2" - }, - "peerDependencies": { - "typescript": ">=5.0.4" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@walletconnect/universal-provider/node_modules/viem/node_modules/@noble/curves": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.1.tgz", - "integrity": "sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==", - "license": "MIT", - "dependencies": { - "@noble/hashes": "1.8.0" - }, - "engines": { - "node": "^14.21.3 || >=16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@walletconnect/universal-provider/node_modules/ws": { - "version": "8.18.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.2.tgz", - "integrity": "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, "node_modules/@walletconnect/utils": { "version": "2.21.1", "resolved": "https://registry.npmjs.org/@walletconnect/utils/-/utils-2.21.1.tgz", @@ -5404,12 +5065,6 @@ "url": "https://opencollective.com/bigjs" } }, - "node_modules/blakejs": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz", - "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==", - "license": "MIT" - }, "node_modules/bn.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.2.tgz", @@ -9268,7 +8923,8 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/proxy-compare/-/proxy-compare-3.0.1.tgz", "integrity": "sha512-V9plBAt3qjMlS1+nC8771KNf6oJ12gExvaxnNzN/9yVRLdTv/lc+oJlnSzrdYDAvBfTStPCoiaCOTmTs0adv7Q==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/pump": { "version": "3.0.3", @@ -9515,6 +9171,22 @@ "react": "^19.1.0" } }, + "node_modules/react-hook-form": { + "version": "7.62.0", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.62.0.tgz", + "integrity": "sha512-7KWFejc98xqG/F4bAxpL41NB3o1nnvQO1RWZT3TqRZYL8RryQETGfEdVnJN2fy1crCiBLLjkRBVK05j24FxJGA==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/react-hook-form" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17 || ^18 || ^19" + } + }, "node_modules/react-remove-scroll": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.1.tgz", @@ -10930,6 +10602,7 @@ "resolved": "https://registry.npmjs.org/valtio/-/valtio-2.1.5.tgz", "integrity": "sha512-vsh1Ixu5mT0pJFZm+Jspvhga5GzHUTYv0/+Th203pLfh3/wbHwxhu/Z2OkZDXIgHfjnjBns7SN9HNcbDvPmaGw==", "license": "MIT", + "peer": true, "dependencies": { "proxy-compare": "^3.0.1" }, diff --git a/package.json b/package.json index 3108c7e..749c68c 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,8 @@ }, "dependencies": { "@radix-ui/react-dialog": "^1.1.15", + "@radix-ui/react-label": "^2.1.7", + "@radix-ui/react-radio-group": "^1.3.8", "@radix-ui/react-slot": "^1.2.3", "@tanstack/react-query": "^5.86.0", "class-variance-authority": "^0.7.1", @@ -20,6 +22,7 @@ "next": "15.5.2", "react": "19.1.0", "react-dom": "19.1.0", + "react-hook-form": "^7.62.0", "tailwind-merge": "^3.3.1", "tw-animate-css": "^1.3.6", "viem": "^2.37.3", diff --git a/registry/default/payment-widget/components/buyer-info-form.tsx b/registry/default/payment-widget/components/buyer-info-form.tsx new file mode 100644 index 0000000..4e34014 --- /dev/null +++ b/registry/default/payment-widget/components/buyer-info-form.tsx @@ -0,0 +1,180 @@ +"use client"; + +import { useForm } from "react-hook-form"; +import { Button } from "@/components/ui/button"; +import { Input } from "@/components/ui/input"; +import { Label } from "@/components/ui/label"; + +export interface BuyerInfo { + email: string; + firstName: string; + lastName: string; + businessName?: string; + phone?: string; + streetAddress?: string; + city?: string; + state?: string; + country?: string; + postalCode?: string; +} + +interface BuyerInfoProps { + onBack: () => void; + onSubmit: (data: BuyerInfo) => void; +} + +export function BuyerInfoForm({ onBack, onSubmit }: BuyerInfoProps) { + const { + register, + handleSubmit, + formState: { errors }, + } = useForm(); + + const onFormSubmit = (data: BuyerInfo) => { + onSubmit(data); + }; + + return ( +
+

Buyer Information

+
+
+ + + {errors.email && ( + + {errors.email.message} + + )} +
+ +
+
+ + + {errors.firstName && ( + + {errors.firstName.message} + + )} +
+
+ + + {errors.lastName && ( + + {errors.lastName.message} + + )} +
+
+ +
+
+ + +
+
+ + + {errors.phone && ( + + {errors.phone.message} + + )} +
+
+ +
+ + +
+ +
+
+ + +
+
+ + +
+
+ +
+
+ + +
+
+ + +
+
+ +
+ + +
+
+
+ ); +} diff --git a/registry/default/payment-widget/components/connection-handler.tsx b/registry/default/payment-widget/components/connection-handler.tsx index e30ccf6..b61af76 100644 --- a/registry/default/payment-widget/components/connection-handler.tsx +++ b/registry/default/payment-widget/components/connection-handler.tsx @@ -1,19 +1,26 @@ "use client"; import { useAccount } from "wagmi"; -import { PaymentModal } from "./payment-modal"; import { WalletConnectModal } from "./wallet-connect-modal"; +import { ReactNode } from "react"; interface ConnectionHandlerProps { isOpen: boolean; handleModalOpenChange: (open: boolean) => void; + paymentModal: ReactNode; } export function ConnectionHandler({ isOpen, handleModalOpenChange, + paymentModal, }: ConnectionHandlerProps) { - const { isConnected } = useAccount(); + const { isConnected, isConnecting } = useAccount(); + + if (isConnecting) { + // TODO loader + return null; + } if (!isConnected) { return ( @@ -23,11 +30,5 @@ export function ConnectionHandler({ /> ); } - - return ( - - ); + return paymentModal; } diff --git a/registry/default/payment-widget/components/currency-select.tsx b/registry/default/payment-widget/components/currency-select.tsx new file mode 100644 index 0000000..cde03d5 --- /dev/null +++ b/registry/default/payment-widget/components/currency-select.tsx @@ -0,0 +1,67 @@ +"use client"; + +import { useState } from "react"; +import { Button } from "@/components/ui/button"; +import { RadioGroup, RadioGroupItem } from "@/components/ui/radio-group"; + +interface Currency { + id: string; + name: string; + symbol: string; +} + +const currencies: Currency[] = [ + { id: "eth-sepolia", name: "Ethereum", symbol: "ETH" }, + { id: "fau-sepolia", name: "Faucet Token", symbol: "FAU" }, + { id: "usdc-sepolia", name: "USD Coin", symbol: "USDC" }, +]; + +interface CurrencySelectProps { + onSubmit: (currency: string) => void; +} + +export function CurrencySelect({ onSubmit }: CurrencySelectProps) { + const [selectedCurrency, setSelectedCurrency] = useState(""); + + const handleSubmit = () => { + const currency = currencies.find((c) => c.id === selectedCurrency); + if (currency) { + onSubmit(currency.id); + } + }; + + return ( +
+

Select a currency

+ +
+ {currencies.map((currency) => ( +
+ +
+ ))} +
+
+ +
+ ); +} diff --git a/registry/default/payment-widget/components/payment-modal.tsx b/registry/default/payment-widget/components/payment-modal.tsx index 7fdecf3..e7f996c 100644 --- a/registry/default/payment-widget/components/payment-modal.tsx +++ b/registry/default/payment-widget/components/payment-modal.tsx @@ -9,16 +9,28 @@ import { DialogHeader, DialogTitle, } from "@/components/ui/dialog"; +import { useState } from "react"; +import { Currency } from "lucide-react"; +import { CurrencySelect } from "./currency-select"; +import { type BuyerInfo, BuyerInfoForm } from "./buyer-info-form"; interface PaymentModalProps { isOpen: boolean; handleModalOpenChange: (open: boolean) => void; + amountInUsd: string; } export function PaymentModal({ isOpen, handleModalOpenChange, + amountInUsd, }: PaymentModalProps) { + const [activeStep, setActiveStep] = useState< + "currency-select" | "buyer-info" | "payment-confirmation" + >("currency-select"); + const [selectedCurrency, setSelectedCurrency] = useState(null); + const [buyerInfo, setBuyerInfo] = useState(null); + const { address } = useAccount(); const { disconnect } = useDisconnect(); @@ -27,38 +39,46 @@ export function PaymentModal({ handleModalOpenChange(false); }; + const handleCurrencySelect = (currency: string) => { + setSelectedCurrency(currency); + setActiveStep("buyer-info"); + }; + + const handleBuyerInfoSubmit = (data: BuyerInfo) => { + setBuyerInfo(data); + setActiveStep("payment-confirmation"); + }; + return ( Payment - Pay with cryptocurrency using Request Network + Pay with crypto using Request Network -
-
-

$25.00

-

- Payment form coming soon... -

-
+
-
- Connected: +
{address?.slice(0, 6)}...{address?.slice(-4)} +
-
+ {activeStep === "currency-select" && ( + + )} + {activeStep === "buyer-info" && ( + setActiveStep("currency-select")} + onSubmit={handleBuyerInfoSubmit} + /> + )}
); diff --git a/registry/default/payment-widget/payment-widget.tsx b/registry/default/payment-widget/payment-widget.tsx index 5d8e90e..fd5f990 100644 --- a/registry/default/payment-widget/payment-widget.tsx +++ b/registry/default/payment-widget/payment-widget.tsx @@ -4,10 +4,13 @@ import { useState } from "react"; import { Button } from "@/components/ui/button"; import { ConnectionHandler } from "./components/connection-handler"; import { Web3Provider } from "@/components/providers/web3-provider"; +import { PaymentModal } from "./components/payment-modal"; export function PaymentWidget({ + amountInUsd, walletConnectProjectId, }: { + amountInUsd: string; walletConnectProjectId?: string; }) { const [isModalOpen, setIsModalOpen] = useState(false); @@ -23,6 +26,13 @@ export function PaymentWidget({ + } /> ); From 1683a730dc60f69b5f0ce8bc0d174d42ff6eac89 Mon Sep 17 00:00:00 2001 From: Bassgeta Date: Mon, 8 Sep 2025 12:03:29 +0200 Subject: [PATCH 04/37] feat: reorganize the home page and widget due to env issues, implement payment confirmation step --- app/components/payment-widget-wrapper.tsx | 34 ++++ app/page.tsx | 10 +- components/providers/web3-provider.tsx | 8 +- .../components/buyer-info-form.tsx | 14 +- .../components/payment-confirmation.tsx | 170 ++++++++++++++++++ .../components/payment-modal.tsx | 40 ++++- registry/default/payment-widget/constants.ts | 1 + .../default/payment-widget/payment-widget.tsx | 36 +++- registry/default/payment-widget/types.ts | 22 +++ 9 files changed, 311 insertions(+), 24 deletions(-) create mode 100644 app/components/payment-widget-wrapper.tsx create mode 100644 registry/default/payment-widget/components/payment-confirmation.tsx create mode 100644 registry/default/payment-widget/constants.ts create mode 100644 registry/default/payment-widget/types.ts diff --git a/app/components/payment-widget-wrapper.tsx b/app/components/payment-widget-wrapper.tsx new file mode 100644 index 0000000..b020fd8 --- /dev/null +++ b/app/components/payment-widget-wrapper.tsx @@ -0,0 +1,34 @@ +"use client"; + +import { PaymentWidget } from "@/registry/default/payment-widget/payment-widget"; + +interface PaymentWidgetWrapperProps { + walletConnectProjectId: string; + rnApiKey: string; + recipientWallet: string; +} + +export function PaymentWidgetWrapper({ + walletConnectProjectId, + rnApiKey, + recipientWallet, +}: PaymentWidgetWrapperProps) { + const handleSuccess = () => { + console.log("Payment successful"); + }; + + const handleError = (error: any) => { + console.error("Payment failed:", error); + }; + + return ( + + ); +} diff --git a/app/page.tsx b/app/page.tsx index 2032fbc..255aa15 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -1,7 +1,9 @@ -import { PaymentWidget } from "@/registry/default/payment-widget/payment-widget"; +import { PaymentWidgetWrapper } from "./components/payment-widget-wrapper"; export default function Home() { const projectId = process.env.NEXT_PUBLIC_WALLET_CONNECT_PROJECT_ID || ""; + const rnApiKey = process.env.REQUEST_API_KEY || ""; + const recipientWallet = process.env.RECIPIENT_WALLET || ""; return (
@@ -9,7 +11,11 @@ export default function Home() {

Payment Widget Preview:

- +
diff --git a/components/providers/web3-provider.tsx b/components/providers/web3-provider.tsx index 804271d..9343dfb 100644 --- a/components/providers/web3-provider.tsx +++ b/components/providers/web3-provider.tsx @@ -3,6 +3,7 @@ import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; import { WagmiProvider } from "wagmi"; import { getWagmiConfig } from "@/lib/wagmi"; +import { use, useMemo } from "react"; const queryClient = new QueryClient(); @@ -13,8 +14,13 @@ export function Web3Provider({ children: React.ReactNode; walletConnectProjectId?: string; }) { + const wagmiConfig = useMemo( + () => getWagmiConfig(walletConnectProjectId), + [walletConnectProjectId], + ); + return ( - + {children} ); diff --git a/registry/default/payment-widget/components/buyer-info-form.tsx b/registry/default/payment-widget/components/buyer-info-form.tsx index 4e34014..0ef810d 100644 --- a/registry/default/payment-widget/components/buyer-info-form.tsx +++ b/registry/default/payment-widget/components/buyer-info-form.tsx @@ -4,19 +4,7 @@ import { useForm } from "react-hook-form"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; - -export interface BuyerInfo { - email: string; - firstName: string; - lastName: string; - businessName?: string; - phone?: string; - streetAddress?: string; - city?: string; - state?: string; - country?: string; - postalCode?: string; -} +import { type BuyerInfo } from "../types"; interface BuyerInfoProps { onBack: () => void; diff --git a/registry/default/payment-widget/components/payment-confirmation.tsx b/registry/default/payment-widget/components/payment-confirmation.tsx new file mode 100644 index 0000000..efdac4d --- /dev/null +++ b/registry/default/payment-widget/components/payment-confirmation.tsx @@ -0,0 +1,170 @@ +"use client"; + +import { useState } from "react"; +import { Button } from "@/components/ui/button"; +import { ArrowRight, ArrowDown } from "lucide-react"; +import { type FeeInfo, type PaymentError, type BuyerInfo } from "../types"; +import { useAccount, useSendTransaction } from "wagmi"; +import { RN_API_URL } from "../constants"; + +interface PaymentConfirmationProps { + rnApiKey: string; + recipientWallet: string; + feeInfo?: FeeInfo; + buyerInfo: BuyerInfo; + amountInUsd: string; + paymentCurrency: string; + + onBack: () => void; + onSuccess: (txHash: string) => void; + onError: (error: PaymentError) => void; +} + +const isPaymentError = (error: any): error is PaymentError => { + return ( + error && typeof error === "object" && "type" in error && "error" in error + ); +}; + +export function PaymentConfirmation({ + amountInUsd, + paymentCurrency, + rnApiKey, + recipientWallet, + feeInfo, + buyerInfo, + onBack, + onSuccess, + onError, +}: PaymentConfirmationProps) { + const [isExecuting, setIsExecuting] = useState(false); + const { isConnected } = useAccount(); + const { sendTransactionAsync } = useSendTransaction(); + + const executeTransactions = async ( + transactions: Array<{ to: string; data: string; value: { hex: string } }>, + ) => { + if (!isConnected) { + return; + } + + try { + for (let i = 0; i < transactions.length; i++) { + const tx = transactions[i]; + + await sendTransactionAsync({ + to: tx.to as `0x${string}`, + data: tx.data as `0x${string}`, + value: BigInt(tx.value.hex), + }); + } + } catch (error) { + console.error("Transaction execution failed:", error); + throw { type: "transaction", error: error as Error }; + } + }; + + const handleExecutePayment = async (e: React.FormEvent) => { + e.preventDefault(); + + setIsExecuting(true); + + try { + const response = await fetch(`${RN_API_URL}/v2/payouts`, { + method: "POST", + headers: { + "x-api-key": rnApiKey, + "Content-Type": "application/json", + }, + body: JSON.stringify({ + amount: amountInUsd, + payee: recipientWallet, + invoiceCurrency: "USD", + paymentCurrency: paymentCurrency, + feePercentage: feeInfo?.feePercentage || undefined, + feeAddress: feeInfo?.feeAddress || undefined, + }), + }); + + if (!response.ok) { + const errorData = await response.json(); + const error = new Error(errorData.error || "Failed to create payment"); + throw { type: "api", error }; + } + + const data = await response.json(); + + if (data?.calldata?.transactions) { + await executeTransactions(data.calldata.transactions); + } else { + const error = new Error("No transaction data received from backend"); + throw { type: "api", error }; + } + } catch (error) { + console.error("Error in payment flow:", error); + if (isPaymentError(error)) { + onError(error); + } else { + onError({ type: "unknown", error: error as Error }); + } + } finally { + setIsExecuting(false); + } + }; + + return ( +
+

Payment Confirmation

+ +
+
+
+ {amountInUsd} USD +
+ From +
+ +
+ + +
+ +
+
+ {paymentCurrency} +
+ To +
+
+ +
+

Payment Destination

+
+ + {recipientWallet} + +
+
+ +
+ + +
+
+ ); +} diff --git a/registry/default/payment-widget/components/payment-modal.tsx b/registry/default/payment-widget/components/payment-modal.tsx index e7f996c..81cc64e 100644 --- a/registry/default/payment-widget/components/payment-modal.tsx +++ b/registry/default/payment-widget/components/payment-modal.tsx @@ -10,23 +10,39 @@ import { DialogTitle, } from "@/components/ui/dialog"; import { useState } from "react"; -import { Currency } from "lucide-react"; import { CurrencySelect } from "./currency-select"; -import { type BuyerInfo, BuyerInfoForm } from "./buyer-info-form"; +import { BuyerInfoForm } from "./buyer-info-form"; +import { type FeeInfo, type PaymentError, type BuyerInfo } from "../types"; +import { PaymentConfirmation } from "./payment-confirmation"; +import { set } from "react-hook-form"; interface PaymentModalProps { isOpen: boolean; handleModalOpenChange: (open: boolean) => void; amountInUsd: string; + rnApiKey: string; + recipientWallet: string; + feeInfo?: FeeInfo; + + onSuccess: () => void; + onError: (error: PaymentError) => void; } export function PaymentModal({ isOpen, handleModalOpenChange, amountInUsd, + rnApiKey, + recipientWallet, + feeInfo, + onSuccess, + onError, }: PaymentModalProps) { const [activeStep, setActiveStep] = useState< - "currency-select" | "buyer-info" | "payment-confirmation" + | "currency-select" + | "buyer-info" + | "payment-confirmation" + | "payment-success" >("currency-select"); const [selectedCurrency, setSelectedCurrency] = useState(null); const [buyerInfo, setBuyerInfo] = useState(null); @@ -79,6 +95,24 @@ export function PaymentModal({ onSubmit={handleBuyerInfoSubmit} /> )} + {activeStep === "payment-confirmation" && + selectedCurrency && + buyerInfo && ( + setActiveStep("buyer-info")} + onSuccess={() => { + setActiveStep("payment-success"); + onSuccess(); + }} + onError={onError} + /> + )} ); diff --git a/registry/default/payment-widget/constants.ts b/registry/default/payment-widget/constants.ts new file mode 100644 index 0000000..a76ac11 --- /dev/null +++ b/registry/default/payment-widget/constants.ts @@ -0,0 +1 @@ +export const RN_API_URL = "https://api.request.network"; diff --git a/registry/default/payment-widget/payment-widget.tsx b/registry/default/payment-widget/payment-widget.tsx index fd5f990..1b4c2a2 100644 --- a/registry/default/payment-widget/payment-widget.tsx +++ b/registry/default/payment-widget/payment-widget.tsx @@ -5,18 +5,39 @@ import { Button } from "@/components/ui/button"; import { ConnectionHandler } from "./components/connection-handler"; import { Web3Provider } from "@/components/providers/web3-provider"; import { PaymentModal } from "./components/payment-modal"; +import { type PaymentError, type FeeInfo } from "./types"; + +export interface PaymentWidgetProps { + // The amount to be paid in USD + amountInUsd: string; + // Optional WalletConnect Project ID for connecting via WalletConnect + walletConnectProjectId?: string; + // RN API Key to use to access the Request Network API + rnApiKey: string; + // The recipient wallet address for the payment + recipientWallet: string; + // Optional fee info to include fees in the payment + feeInfo?: FeeInfo; + // On success callback when the payment is completed + onSuccess: () => void; + // On error callback when the payment fails + onError: (error: PaymentError) => void; +} export function PaymentWidget({ amountInUsd, walletConnectProjectId, -}: { - amountInUsd: string; - walletConnectProjectId?: string; -}) { + rnApiKey, + recipientWallet, + feeInfo, + onSuccess, + onError, +}: PaymentWidgetProps) { const [isModalOpen, setIsModalOpen] = useState(false); const handleModalOpenChange = (open: boolean) => { setIsModalOpen(open); }; + console.log("Rendering PaymentWidget with props:", rnApiKey, recipientWallet); return ( @@ -28,9 +49,14 @@ export function PaymentWidget({ handleModalOpenChange={handleModalOpenChange} paymentModal={ } /> diff --git a/registry/default/payment-widget/types.ts b/registry/default/payment-widget/types.ts new file mode 100644 index 0000000..074d15f --- /dev/null +++ b/registry/default/payment-widget/types.ts @@ -0,0 +1,22 @@ +export interface BuyerInfo { + email: string; + firstName: string; + lastName: string; + businessName?: string; + phone?: string; + streetAddress?: string; + city?: string; + state?: string; + country?: string; + postalCode?: string; +} + +export interface PaymentError { + type: "api" | "transaction" | "unknown"; + error: Error; +} + +export interface FeeInfo { + feePercentage: string; + feeAddress: string; +} From 708d6867dd62654adb830219e4e693e07419c6ea Mon Sep 17 00:00:00 2001 From: Bassgeta Date: Tue, 9 Sep 2025 12:10:25 +0200 Subject: [PATCH 05/37] feat: make the payment step more granular and decouple functions, connect to the RN API --- components/providers/web3-provider.tsx | 2 +- hooks/use-payment.ts | 47 +++++++ lib/payment.ts | 121 ++++++++++++++++++ registry.json | 40 +++++- .../components/buyer-info-form.tsx | 22 +--- .../components/payment-confirmation.tsx | 103 +++------------ .../components/payment-modal.tsx | 25 ++-- .../default/payment-widget/payment-widget.tsx | 51 ++++---- registry/default/payment-widget/types.ts | 29 +++-- types/payment.ts | 15 +++ 10 files changed, 300 insertions(+), 155 deletions(-) create mode 100644 hooks/use-payment.ts create mode 100644 lib/payment.ts create mode 100644 types/payment.ts diff --git a/components/providers/web3-provider.tsx b/components/providers/web3-provider.tsx index 9343dfb..dad69ba 100644 --- a/components/providers/web3-provider.tsx +++ b/components/providers/web3-provider.tsx @@ -3,7 +3,7 @@ import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; import { WagmiProvider } from "wagmi"; import { getWagmiConfig } from "@/lib/wagmi"; -import { use, useMemo } from "react"; +import { useMemo } from "react"; const queryClient = new QueryClient(); diff --git a/hooks/use-payment.ts b/hooks/use-payment.ts new file mode 100644 index 0000000..4ed9476 --- /dev/null +++ b/hooks/use-payment.ts @@ -0,0 +1,47 @@ +import { useState } from "react"; +import { useAccount, useSendTransaction } from "wagmi"; +import { executePayment, PaymentParams } from "@/lib/payment"; +import { type FeeInfo, type PaymentError } from "@/types/payment"; + +export const usePayment = () => { + const [isExecuting, setIsExecuting] = useState(false); + const { isConnected } = useAccount(); + const { sendTransactionAsync } = useSendTransaction(); + + const execute = async ( + rnApiKey: string, + params: PaymentParams, + ): Promise => { + if (!isConnected) { + throw { + type: "wallet", + error: new Error("Wallet not connected"), + } as PaymentError; + } + + setIsExecuting(true); + + try { + const txHash = await executePayment({ + rnApiKey, + paymentParams: { + amountInUsd: params.amountInUsd, + recipientWallet: params.recipientWallet, + paymentCurrency: params.paymentCurrency, + feeInfo: params.feeInfo, + }, + sendTransaction: sendTransactionAsync, + }); + + return txHash; + // no need to catch and rethrow PaymentError, just let it propagate + } finally { + setIsExecuting(false); + } + }; + + return { + isExecuting, + executePayment: execute, + }; +}; diff --git a/lib/payment.ts b/lib/payment.ts new file mode 100644 index 0000000..a705969 --- /dev/null +++ b/lib/payment.ts @@ -0,0 +1,121 @@ +import { + type FeeInfo, + type PaymentError, + type Transaction, +} from "@/types/payment"; +import { RN_API_URL } from "@/registry/default/payment-widget/constants"; + +export interface PaymentParams { + amountInUsd: string; + recipientWallet: string; + paymentCurrency: string; + feeInfo?: FeeInfo; +} + +// Best to use the return value of useSendTransaction from wagmi directly +type SendTransactionFunction = (tx: { + to: `0x${string}`; + data: `0x${string}`; + value: bigint; +}) => Promise; + +export const isPaymentError = (error: any): error is PaymentError => { + return ( + error && typeof error === "object" && "type" in error && "error" in error + ); +}; + +export const executeTransactions = async ( + transactions: Transaction[], + sendTransaction: SendTransactionFunction, +): Promise => { + let lastTxHash = ""; + + try { + for (const tx of transactions) { + lastTxHash = await sendTransaction({ + to: tx.to as `0x${string}`, + data: tx.data as `0x${string}`, + value: BigInt(tx.value.hex), + }); + } + + return lastTxHash; + } catch (error) { + console.error("Transaction execution failed:", error); + throw { type: "transaction", error: error as Error } as PaymentError; + } +}; + +export const createPayout = async ( + rnApiKey: string, + params: PaymentParams, +): Promise => { + const { amountInUsd, recipientWallet, paymentCurrency, feeInfo } = params; + + const response = await fetch(`${RN_API_URL}/v2/payouts`, { + method: "POST", + headers: { + "x-api-key": rnApiKey, + "Content-Type": "application/json", + }, + body: JSON.stringify({ + amount: amountInUsd, + payee: recipientWallet, + invoiceCurrency: "USD", + paymentCurrency: paymentCurrency, + feePercentage: feeInfo?.feePercentage || undefined, + feeAddress: feeInfo?.feeAddress || undefined, + }), + }); + + return response; +}; + +export const executePayment = async ({ + paymentParams, + rnApiKey, + sendTransaction, +}: { + rnApiKey: string; + paymentParams: PaymentParams; + sendTransaction: SendTransactionFunction; +}): Promise => { + try { + const response = await createPayout(rnApiKey, paymentParams); + + if (!response.ok) { + let errorMessage = "Failed to create payment"; + + try { + const errorData = await response.json(); + errorMessage = errorData.error || errorData.message || errorMessage; + } catch (_parsingError) { + // If we can't parse the error response, just use status text + errorMessage = `HTTP ${response.status}: ${response.statusText}`; + } + + const error = new Error(errorMessage); + throw { type: "api", error } as PaymentError; + } + + const data = await response.json(); + + if (data?.calldata?.transactions) { + return await executeTransactions( + data.calldata.transactions, + sendTransaction, + ); + } else { + const error = new Error("No transaction data received from backend"); + throw { type: "api", error } as PaymentError; + } + } catch (error) { + console.error("Error in payment flow:", error); + if (isPaymentError(error)) { + throw error; + } else { + throw { type: "unknown", error: error as Error } as PaymentError; + } + } +}; diff --git a/registry.json b/registry.json index aa334c5..1f1e851 100644 --- a/registry.json +++ b/registry.json @@ -8,11 +8,12 @@ "type": "registry:component", "title": "Payment Widget", "description": "A wallet-connected payment widget for Request Network using pure wagmi", - "registryDependencies": ["button", "dialog"], + "registryDependencies": ["button", "dialog", "input", "label"], "dependencies": [ "wagmi@^2.12.29", "viem@^2.21.53", - "@tanstack/react-query@^5.64.1" + "@tanstack/react-query@^5.64.1", + "react-hook-form@^7.0.0" ], "files": [ { @@ -35,6 +36,31 @@ "type": "registry:component", "target": "components/payment-widget/components/payment-modal.tsx" }, + { + "path": "registry/default/payment-widget/components/currency-select.tsx", + "type": "registry:component", + "target": "components/payment-widget/components/currency-select.tsx" + }, + { + "path": "registry/default/payment-widget/components/buyer-info-form.tsx", + "type": "registry:component", + "target": "components/payment-widget/components/buyer-info-form.tsx" + }, + { + "path": "registry/default/payment-widget/components/payment-confirmation.tsx", + "type": "registry:component", + "target": "components/payment-widget/components/payment-confirmation.tsx" + }, + { + "path": "registry/default/payment-widget/types.ts", + "type": "registry:lib", + "target": "components/payment-widget/types.ts" + }, + { + "path": "registry/default/payment-widget/constants.ts", + "type": "registry:lib", + "target": "components/payment-widget/constants.ts" + }, { "path": "components/providers/web3-provider.tsx", "type": "registry:component", @@ -44,6 +70,16 @@ "path": "lib/wagmi.ts", "type": "registry:lib", "target": "lib/wagmi.ts" + }, + { + "path": "lib/payment.ts", + "type": "registry:lib", + "target": "lib/payment.ts" + }, + { + "path": "hooks/use-payment.ts", + "type": "registry:lib", + "target": "hooks/use-payment.ts" } ] } diff --git a/registry/default/payment-widget/components/buyer-info-form.tsx b/registry/default/payment-widget/components/buyer-info-form.tsx index 0ef810d..b7905ef 100644 --- a/registry/default/payment-widget/components/buyer-info-form.tsx +++ b/registry/default/payment-widget/components/buyer-info-form.tsx @@ -27,7 +27,9 @@ export function BuyerInfoForm({ onBack, onSubmit }: BuyerInfoProps) {

Buyer Information

- + - {errors.firstName && ( - - {errors.firstName.message} - - )}
- - {errors.lastName && ( - - {errors.lastName.message} - - )} +
diff --git a/registry/default/payment-widget/components/payment-confirmation.tsx b/registry/default/payment-widget/components/payment-confirmation.tsx index efdac4d..18d435e 100644 --- a/registry/default/payment-widget/components/payment-confirmation.tsx +++ b/registry/default/payment-widget/components/payment-confirmation.tsx @@ -1,114 +1,45 @@ "use client"; -import { useState } from "react"; import { Button } from "@/components/ui/button"; import { ArrowRight, ArrowDown } from "lucide-react"; -import { type FeeInfo, type PaymentError, type BuyerInfo } from "../types"; -import { useAccount, useSendTransaction } from "wagmi"; -import { RN_API_URL } from "../constants"; +import { type FeeInfo, type PaymentError } from "@/types/payment"; +import { type PaymentWidgetProps, type BuyerInfo } from "../types"; +import { usePayment } from "@/hooks/use-payment"; -interface PaymentConfirmationProps { - rnApiKey: string; - recipientWallet: string; - feeInfo?: FeeInfo; - buyerInfo: BuyerInfo; - amountInUsd: string; +interface PaymentConfirmationProps + extends Omit { paymentCurrency: string; - + buyerInfo: BuyerInfo; onBack: () => void; - onSuccess: (txHash: string) => void; - onError: (error: PaymentError) => void; } -const isPaymentError = (error: any): error is PaymentError => { - return ( - error && typeof error === "object" && "type" in error && "error" in error - ); -}; - export function PaymentConfirmation({ amountInUsd, paymentCurrency, rnApiKey, recipientWallet, feeInfo, - buyerInfo, onBack, onSuccess, onError, }: PaymentConfirmationProps) { - const [isExecuting, setIsExecuting] = useState(false); - const { isConnected } = useAccount(); - const { sendTransactionAsync } = useSendTransaction(); - - const executeTransactions = async ( - transactions: Array<{ to: string; data: string; value: { hex: string } }>, - ) => { - if (!isConnected) { - return; - } - - try { - for (let i = 0; i < transactions.length; i++) { - const tx = transactions[i]; - - await sendTransactionAsync({ - to: tx.to as `0x${string}`, - data: tx.data as `0x${string}`, - value: BigInt(tx.value.hex), - }); - } - } catch (error) { - console.error("Transaction execution failed:", error); - throw { type: "transaction", error: error as Error }; - } - }; + const { isExecuting, executePayment } = usePayment(); const handleExecutePayment = async (e: React.FormEvent) => { e.preventDefault(); - setIsExecuting(true); - try { - const response = await fetch(`${RN_API_URL}/v2/payouts`, { - method: "POST", - headers: { - "x-api-key": rnApiKey, - "Content-Type": "application/json", - }, - body: JSON.stringify({ - amount: amountInUsd, - payee: recipientWallet, - invoiceCurrency: "USD", - paymentCurrency: paymentCurrency, - feePercentage: feeInfo?.feePercentage || undefined, - feeAddress: feeInfo?.feeAddress || undefined, - }), + const txHash = await executePayment(rnApiKey, { + amountInUsd, + recipientWallet, + paymentCurrency, + feeInfo, }); - if (!response.ok) { - const errorData = await response.json(); - const error = new Error(errorData.error || "Failed to create payment"); - throw { type: "api", error }; - } - - const data = await response.json(); - - if (data?.calldata?.transactions) { - await executeTransactions(data.calldata.transactions); - } else { - const error = new Error("No transaction data received from backend"); - throw { type: "api", error }; - } + console.log("Payment completed with tx hash:", txHash); + onSuccess(txHash); } catch (error) { - console.error("Error in payment flow:", error); - if (isPaymentError(error)) { - onError(error); - } else { - onError({ type: "unknown", error: error as Error }); - } - } finally { - setIsExecuting(false); + onError(error as PaymentError); } }; @@ -119,7 +50,7 @@ export function PaymentConfirmation({
- {amountInUsd} USD + USD
From
@@ -160,7 +91,7 @@ export function PaymentConfirmation({ type="button" onClick={handleExecutePayment} className="flex-1" - disabled={isExecuting || !isConnected} + disabled={isExecuting} > {isExecuting ? "Processing..." : "Pay"} diff --git a/registry/default/payment-widget/components/payment-modal.tsx b/registry/default/payment-widget/components/payment-modal.tsx index 81cc64e..809c080 100644 --- a/registry/default/payment-widget/components/payment-modal.tsx +++ b/registry/default/payment-widget/components/payment-modal.tsx @@ -12,20 +12,13 @@ import { import { useState } from "react"; import { CurrencySelect } from "./currency-select"; import { BuyerInfoForm } from "./buyer-info-form"; -import { type FeeInfo, type PaymentError, type BuyerInfo } from "../types"; +import { type PaymentWidgetProps, type BuyerInfo } from "../types"; import { PaymentConfirmation } from "./payment-confirmation"; -import { set } from "react-hook-form"; -interface PaymentModalProps { +interface PaymentModalProps + extends Omit { isOpen: boolean; handleModalOpenChange: (open: boolean) => void; - amountInUsd: string; - rnApiKey: string; - recipientWallet: string; - feeInfo?: FeeInfo; - - onSuccess: () => void; - onError: (error: PaymentError) => void; } export function PaymentModal({ @@ -99,18 +92,18 @@ export function PaymentModal({ selectedCurrency && buyerInfo && ( setActiveStep("buyer-info")} - onSuccess={() => { + onSuccess={(txHash) => { setActiveStep("payment-success"); - onSuccess(); + onSuccess(txHash); }} onError={onError} + paymentCurrency={selectedCurrency} + buyerInfo={buyerInfo} + onBack={() => setActiveStep("buyer-info")} /> )} diff --git a/registry/default/payment-widget/payment-widget.tsx b/registry/default/payment-widget/payment-widget.tsx index 1b4c2a2..ffc5c5c 100644 --- a/registry/default/payment-widget/payment-widget.tsx +++ b/registry/default/payment-widget/payment-widget.tsx @@ -5,42 +5,23 @@ import { Button } from "@/components/ui/button"; import { ConnectionHandler } from "./components/connection-handler"; import { Web3Provider } from "@/components/providers/web3-provider"; import { PaymentModal } from "./components/payment-modal"; -import { type PaymentError, type FeeInfo } from "./types"; +import { PaymentWidgetProps } from "./types"; -export interface PaymentWidgetProps { - // The amount to be paid in USD - amountInUsd: string; - // Optional WalletConnect Project ID for connecting via WalletConnect - walletConnectProjectId?: string; - // RN API Key to use to access the Request Network API - rnApiKey: string; - // The recipient wallet address for the payment - recipientWallet: string; - // Optional fee info to include fees in the payment - feeInfo?: FeeInfo; - // On success callback when the payment is completed - onSuccess: () => void; - // On error callback when the payment fails - onError: (error: PaymentError) => void; -} - -export function PaymentWidget({ +function PaymentWidgetInner({ amountInUsd, - walletConnectProjectId, rnApiKey, recipientWallet, feeInfo, onSuccess, onError, -}: PaymentWidgetProps) { +}: Omit) { const [isModalOpen, setIsModalOpen] = useState(false); const handleModalOpenChange = (open: boolean) => { setIsModalOpen(open); }; - console.log("Rendering PaymentWidget with props:", rnApiKey, recipientWallet); return ( - + <> @@ -60,6 +41,30 @@ export function PaymentWidget({ /> } /> + + ); +} + +export function PaymentWidget({ + amountInUsd, + walletConnectProjectId, + rnApiKey, + recipientWallet, + feeInfo, + onSuccess, + onError, +}: PaymentWidgetProps) { + // We need to wrap the widget in the Web3Provider to provide wagmi context and so it doesn't rerender every time the modal opens or closes + return ( + + ); } diff --git a/registry/default/payment-widget/types.ts b/registry/default/payment-widget/types.ts index 074d15f..b5350b9 100644 --- a/registry/default/payment-widget/types.ts +++ b/registry/default/payment-widget/types.ts @@ -1,7 +1,9 @@ +import { type FeeInfo, type PaymentError } from "@/types/payment"; + export interface BuyerInfo { email: string; - firstName: string; - lastName: string; + firstName?: string; + lastName?: string; businessName?: string; phone?: string; streetAddress?: string; @@ -11,12 +13,19 @@ export interface BuyerInfo { postalCode?: string; } -export interface PaymentError { - type: "api" | "transaction" | "unknown"; - error: Error; -} - -export interface FeeInfo { - feePercentage: string; - feeAddress: string; +export interface PaymentWidgetProps { + // The amount to be paid in USD + amountInUsd: string; + // Optional WalletConnect Project ID for connecting via WalletConnect + walletConnectProjectId?: string; + // RN API Key to use to access the Request Network API + rnApiKey: string; + // The recipient wallet address for the payment + recipientWallet: string; + // Optional fee info to include fees in the payment + feeInfo?: FeeInfo; + // On success callback when the payment is completed + onSuccess: (txHash: string) => void; + // On error callback when the payment fails + onError: (error: PaymentError) => void; } diff --git a/types/payment.ts b/types/payment.ts new file mode 100644 index 0000000..c1bce41 --- /dev/null +++ b/types/payment.ts @@ -0,0 +1,15 @@ +export interface FeeInfo { + feePercentage: number; + feeAddress: string; +} + +export interface PaymentError { + type: "wallet" | "transaction" | "api" | "unknown"; + error: Error; +} + +export interface Transaction { + to: string; + data: string; + value: { hex: string }; +} From bade62086c931c66419c40426e255ba1df814035 Mon Sep 17 00:00:00 2001 From: Bassgeta Date: Tue, 9 Sep 2025 16:45:23 +0200 Subject: [PATCH 06/37] feat: add invoice download as the payment success step --- app/components/payment-widget-wrapper.tsx | 2 +- app/globals.css | 76 +++--- components/invoice/invoice-template.tsx | 190 ++++++++++++++ components/invoice/styles.css | 245 ++++++++++++++++++ hooks/use-payment.ts | 2 +- lib/invoice.ts | 234 +++++++++++++++++ lib/payment.ts | 57 +++- package-lock.json | 215 +++++++++++++++ package.json | 1 + .../components/currency-select.tsx | 6 +- .../components/payment-confirmation.tsx | 2 +- .../components/payment-modal.tsx | 50 ++-- .../components/payment-success.tsx | 147 +++++++++++ registry/default/payment-widget/types.ts | 2 +- types/html2pdf.d.ts | 76 ++++++ types/{payment.ts => index.ts} | 0 16 files changed, 1232 insertions(+), 73 deletions(-) create mode 100644 components/invoice/invoice-template.tsx create mode 100644 components/invoice/styles.css create mode 100644 lib/invoice.ts create mode 100644 registry/default/payment-widget/components/payment-success.tsx create mode 100644 types/html2pdf.d.ts rename types/{payment.ts => index.ts} (100%) diff --git a/app/components/payment-widget-wrapper.tsx b/app/components/payment-widget-wrapper.tsx index b020fd8..25746cf 100644 --- a/app/components/payment-widget-wrapper.tsx +++ b/app/components/payment-widget-wrapper.tsx @@ -24,7 +24,7 @@ export function PaymentWidgetWrapper({ return ( = ({ + invoice, +}) => { + return ( +
+
+ {/* Company Info */} +
+

{invoice.company.name}

+
{invoice.company.walletAddress}
+
+
{invoice.company.address.street}
+
+ {invoice.company.address.city}, {invoice.company.address.state}{" "} + {invoice.company.address.zipCode} +
+
Tax ID: {invoice.company.taxId}
+ {invoice.company.email &&
{invoice.company.email}
} +
+
+ + {/* Invoice Title */} +
+

INVOICE

+
+ #{invoice.metadata.invoiceNumber} +
+
+
+ +
+
+
+ Issue Date:{" "} + {formatInvoiceDate(invoice.metadata.issueDate)} +
+
+ Chain: {invoice.payment.chain} +
+
+ Currency: {invoice.payment.currency} +
+ {invoice.payment.transactionHash && ( +
+ TX:{" "} + {invoice.payment.transactionHash} +
+ )} +
+ +
+

BILL TO

+
+ {[invoice.buyer.firstName, invoice.buyer.lastName] + .filter(Boolean) + .join(" ") || "Customer"} +
+
{invoice.buyer.walletAddress}
+
{invoice.buyer.email}
+ {invoice.buyer.address && ( +
+
{invoice.buyer.address.street}
+
+ {invoice.buyer.address.city}, {invoice.buyer.address.state}{" "} + {invoice.buyer.address.zipCode} +
+
+ )} +
+
+ + + + + + + + + + + + + + {invoice.items.map((item, index) => ( + + + + + + + + + ))} + +
DescriptionQtyUnit PriceDisc%Tax%Amount
{item.description}{item.quantity} + {formatCryptoAmount( + item.unitPrice, + invoice.payment.currency, + 6, + )} + {item.discount || 0}%{item.tax || 0}% + {formatCryptoAmount( + item.finalAmount, + invoice.payment.currency, + 6, + )} +
+ + {/* Totals */} +
+
+
+ Subtotal: + + {formatCryptoAmount( + invoice.totals.subtotal, + invoice.payment.currency, + 6, + )} + +
+ + {invoice.totals.totalDiscount > 0 && ( +
+ Discount: + + - + {formatCryptoAmount( + invoice.totals.totalDiscount, + invoice.payment.currency, + 6, + )} + +
+ )} + + {invoice.totals.totalTax > 0 && ( +
+ Tax: + + {formatCryptoAmount( + invoice.totals.totalTax, + invoice.payment.currency, + 6, + )} + +
+ )} + +
+ TOTAL: + + {formatCryptoAmount( + invoice.totals.total, + invoice.payment.currency, + 6, + )} + +
+ +
+ USD Equivalent: + {formatUSDAmount(invoice.totals.totalUSD)} +
+
+
+ + {/* Notes */} + {invoice.metadata.notes && ( +
+

Notes:

+
{invoice.metadata.notes}
+
+ )} +
+ ); +}; diff --git a/components/invoice/styles.css b/components/invoice/styles.css new file mode 100644 index 0000000..7064055 --- /dev/null +++ b/components/invoice/styles.css @@ -0,0 +1,245 @@ +.invoice-container { + background-color: #ffffff; + padding: 32px; + max-width: 896px; + margin: 0 auto; + font-family: Arial, sans-serif; + font-size: 14px; + line-height: 1.6; + color: #000502; +} + +.invoice-header { + display: flex; + justify-content: space-between; + align-items: flex-start; + margin-bottom: 32px; +} + +.company-info { + flex: 1; + padding-right: 32px; +} + +.company-name { + font-size: 30px; + font-weight: 700; + color: #00b591; + margin-bottom: 16px; +} + +.company-wallet { + font-size: 12px; + color: #5e6561; + font-family: "Courier New", monospace; + margin-bottom: 8px; +} + +.company-address > div { + margin-bottom: 4px; +} + +.invoice-title-section { + text-align: right; +} + +.invoice-title { + font-size: 36px; + font-weight: 700; + color: #00b591; + margin-bottom: 8px; +} + +.invoice-number { + font-size: 20px; + font-weight: 700; + color: #00b591; +} + +.invoice-meta { + display: flex; + justify-content: space-between; + margin-bottom: 32px; +} + +.invoice-details > div { + margin-bottom: 8px; +} + +.invoice-details .label { + font-weight: 600; +} + +.transaction-hash { + font-size: 12px; + color: #5e6561; +} + +.bill-to-section { + background-color: #f4f5f5; + padding: 16px; + border-radius: 8px; + min-width: 288px; +} + +.bill-to-header { + font-weight: 600; + color: #374151; + margin-bottom: 12px; +} + +.customer-name { + font-weight: 600; + font-size: 18px; + margin-bottom: 8px; +} + +.customer-wallet { + font-size: 12px; + color: #5e6561; + font-family: "Courier New", monospace; + margin-bottom: 8px; +} + +.customer-email { + margin-bottom: 8px; +} + +.customer-address { + font-size: 14px; +} + +.customer-address > div { + margin-bottom: 4px; +} + +.items-table { + width: 100%; + border-collapse: collapse; + border: 1px solid #dbdfdd; + margin-bottom: 32px; +} + +.items-table th { + background-color: #ecefed; + border: 1px solid #dbdfdd; + padding: 12px; + font-weight: 600; + text-align: left; +} + +.items-table th.center { + text-align: center; +} +.items-table th.right { + text-align: right; +} + +.items-table td { + border: 1px solid #dbdfdd; + padding: 12px; +} + +.items-table td.center { + text-align: center; +} +.items-table td.right { + text-align: right; +} + +.items-table .row-even { + background-color: #ffffff; +} + +.items-table .row-odd { + background-color: #f4f5f5; +} + +.price-amount { + font-family: "Courier New", monospace; + font-size: 12px; +} + +.price-amount.bold { + font-weight: 600; +} + +.col-qty { + width: 64px; +} +.col-price { + width: 128px; +} +.col-discount { + width: 64px; +} +.col-tax { + width: 64px; +} +.col-amount { + width: 128px; +} + +.totals-section { + display: flex; + justify-content: flex-end; + margin-bottom: 32px; +} + +.totals-box { + background-color: #f4f5f5; + padding: 24px; + border-radius: 8px; + min-width: 320px; +} + +.total-line { + display: flex; + justify-content: space-between; + margin-bottom: 8px; +} + +.total-line.discount { + color: #00b591; +} + +.total-line.final { + font-size: 18px; + font-weight: 700; + color: #00b591; + padding-top: 12px; + border-top: 1px solid #dbdfdd; +} + +.total-line.usd { + font-size: 14px; + color: #5e6561; +} + +.total-amount { + font-family: "Courier New", monospace; + font-size: 14px; +} + +.total-amount.large { + font-size: inherit; +} + +.notes-section { + border-top: 1px solid #dbdfdd; + padding-top: 16px; +} + +.notes-header { + font-weight: 600; + color: #374151; + margin-bottom: 8px; +} + +.notes-content { + font-size: 14px; + color: #5e6561; + background-color: #f4f5f5; + padding: 12px; + border-radius: 6px; +} diff --git a/hooks/use-payment.ts b/hooks/use-payment.ts index 4ed9476..5e7ce87 100644 --- a/hooks/use-payment.ts +++ b/hooks/use-payment.ts @@ -1,7 +1,7 @@ import { useState } from "react"; import { useAccount, useSendTransaction } from "wagmi"; import { executePayment, PaymentParams } from "@/lib/payment"; -import { type FeeInfo, type PaymentError } from "@/types/payment"; +import { type PaymentError } from "@/types"; export const usePayment = () => { const [isExecuting, setIsExecuting] = useState(false); diff --git a/lib/invoice.ts b/lib/invoice.ts new file mode 100644 index 0000000..b6a20bd --- /dev/null +++ b/lib/invoice.ts @@ -0,0 +1,234 @@ +export interface InvoiceItem { + id: string; + description: string; + quantity: number; + unitPrice: number; + discount?: number; + tax?: number; + finalAmount: number; +} + +export interface CompanyInfo { + name: string; + walletAddress: string; + address: { + street: string; + city: string; + state: string; + zipCode: string; + country?: string; + }; + taxId: string; + email?: string; + phone?: string; + website?: string; +} + +export interface InvoiceBuyerInfo { + walletAddress: string; + email: string; + firstName?: string; + lastName?: string; + address?: { + street: string; + city: string; + state: string; + zipCode: string; + country?: string; + }; +} + +export interface PaymentInfo { + chain: string; + currency: string; + exchangeRate: number; + transactionHash?: string; +} + +export interface InvoiceMetadata { + invoiceNumber: string; + issueDate: Date; + notes?: string; +} + +export interface InvoiceData { + metadata: InvoiceMetadata; + company: CompanyInfo; + buyer: InvoiceBuyerInfo; + payment: PaymentInfo; + items: InvoiceItem[]; + totals: { + subtotal: number; + totalDiscount: number; + totalTax: number; + total: number; + totalUSD: number; + }; +} + +export const calculateItemTotal = ( + item: Omit, +): InvoiceItem => { + const baseAmount = item.quantity * item.unitPrice; + const discountAmount = item.discount ? (baseAmount * item.discount) / 100 : 0; + const afterDiscount = baseAmount - discountAmount; + const taxAmount = item.tax ? (afterDiscount * item.tax) / 100 : 0; + const finalAmount = afterDiscount + taxAmount; + + return { + ...item, + finalAmount: Number(finalAmount.toFixed(6)), // Crypto precision + }; +}; + +export const calculateInvoiceTotals = ( + items: InvoiceItem[], + exchangeRate: number, +) => { + const subtotal = items.reduce( + (sum, item) => sum + item.quantity * item.unitPrice, + 0, + ); + const totalDiscount = items.reduce((sum, item) => { + const baseAmount = item.quantity * item.unitPrice; + return sum + (item.discount ? (baseAmount * item.discount) / 100 : 0); + }, 0); + const totalTax = items.reduce((sum, item) => { + const baseAmount = item.quantity * item.unitPrice; + const afterDiscount = + baseAmount - (item.discount ? (baseAmount * item.discount) / 100 : 0); + return sum + (item.tax ? (afterDiscount * item.tax) / 100 : 0); + }, 0); + const total = items.reduce((sum, item) => sum + item.finalAmount, 0); + const totalUSD = total * exchangeRate; + + return { + subtotal: Number(subtotal.toFixed(6)), + totalDiscount: Number(totalDiscount.toFixed(6)), + totalTax: Number(totalTax.toFixed(6)), + total: Number(total.toFixed(6)), + totalUSD: Number(totalUSD.toFixed(2)), + }; +}; + +export const generateInvoiceNumber = (prefix: string = "INV"): string => { + const timestamp = Date.now(); + const random = Math.floor(Math.random() * 1000) + .toString() + .padStart(3, "0"); + return `${prefix}-${timestamp}-${random}`; +}; + +export const formatWalletAddress = ( + address: string, + startChars: number = 6, + endChars: number = 4, +): string => { + if (address.length <= startChars + endChars) return address; + return `${address.slice(0, startChars)}...${address.slice(-endChars)}`; +}; + +export const formatCryptoAmount = ( + amount: number, + currency: string, + decimals: number = 6, +): string => { + return `${amount.toFixed(decimals)} ${currency}`; +}; + +export const formatUSDAmount = (amount: number): string => { + return new Intl.NumberFormat("en-US", { + style: "currency", + currency: "USD", + minimumFractionDigits: 2, + maximumFractionDigits: 2, + }).format(amount); +}; + +/** + * Formats dates for invoice display + */ +export const formatInvoiceDate = (date: Date): string => { + return date.toLocaleDateString("en-US", { + year: "numeric", + month: "short", + day: "numeric", + }); +}; + +export interface CreateInvoiceParams { + company: CompanyInfo; + buyer: InvoiceBuyerInfo; + payment: PaymentInfo; + items: Omit[]; + metadata?: Partial; +} + +export const createInvoice = (params: CreateInvoiceParams): InvoiceData => { + const calculatedItems = params.items.map(calculateItemTotal); + + const totals = calculateInvoiceTotals( + calculatedItems, + params.payment.exchangeRate, + ); + + const metadata: InvoiceMetadata = { + invoiceNumber: generateInvoiceNumber(), + issueDate: new Date(), + ...params.metadata, + }; + + const invoice: InvoiceData = { + metadata, + company: params.company, + buyer: params.buyer, + payment: params.payment, + items: calculatedItems, + totals, + }; + + return invoice; +}; + +export const getCompanyDisplayInfo = (company: CompanyInfo) => ({ + name: company.name, + walletAddress: company.walletAddress, + fullAddress: `${company.address.street}, ${company.address.city}, ${company.address.state} ${company.address.zipCode}`, + taxId: company.taxId, + contact: { + email: company.email, + phone: company.phone, + website: company.website, + }, +}); + +export const getBuyerDisplayInfo = (buyer: InvoiceBuyerInfo) => ({ + walletAddress: buyer.walletAddress, + email: buyer.email, + fullName: + [buyer.firstName, buyer.lastName].filter(Boolean).join(" ") || "N/A", + fullAddress: buyer.address + ? `${buyer.address.street}, ${buyer.address.city}, ${buyer.address.state} ${buyer.address.zipCode}` + : "N/A", +}); + +export const getPaymentDisplayInfo = (payment: PaymentInfo) => ({ + chain: payment.chain.charAt(0).toUpperCase() + payment.chain.slice(1), + currency: payment.currency, + formattedRate: `1 ${payment.currency} = ${formatUSDAmount(payment.exchangeRate)}`, + transactionHash: payment.transactionHash ?? undefined, +}); + +export const InvoiceUtils = { + createInvoice, + calculateItemTotal, + calculateInvoiceTotals, + generateInvoiceNumber, + formatWalletAddress, + formatCryptoAmount, + formatUSDAmount, + formatInvoiceDate, + getCompanyDisplayInfo, + getBuyerDisplayInfo, + getPaymentDisplayInfo, +} as const; diff --git a/lib/payment.ts b/lib/payment.ts index a705969..aeb4b94 100644 --- a/lib/payment.ts +++ b/lib/payment.ts @@ -1,8 +1,4 @@ -import { - type FeeInfo, - type PaymentError, - type Transaction, -} from "@/types/payment"; +import { type FeeInfo, type PaymentError } from "@/types"; import { RN_API_URL } from "@/registry/default/payment-widget/constants"; export interface PaymentParams { @@ -12,6 +8,23 @@ export interface PaymentParams { feeInfo?: FeeInfo; } +interface PayoutAPITransaction { + to: string; + data: string; + value: number | string | { type: string; hex: string }; +} +export interface PayoutAPIResponse { + requestId: string; + paymentReference: string; + transactions: PayoutAPITransaction[]; + metadata: { + stepsRequired: number; + needsApproval: boolean; + approvalTransactionIndex: number; + paymentTransactionIndex: number; + }; +} + // Best to use the return value of useSendTransaction from wagmi directly type SendTransactionFunction = (tx: { to: `0x${string}`; @@ -25,8 +38,29 @@ export const isPaymentError = (error: any): error is PaymentError => { ); }; +export const normalizeValue = ( + value: PayoutAPITransaction["value"], +): bigint => { + // ERC20 tokens don't have a bignumber returned + if (typeof value === "number") { + return BigInt(value); + } + + if (typeof value === "string") { + return BigInt(value); + } + + if (typeof value === "object" && value !== null && "hex" in value) { + return BigInt(value.hex); + } + + // Fallback to 0 if we can't parse it + console.warn("Unknown value format, defaulting to 0:", value); + return BigInt(0); +}; + export const executeTransactions = async ( - transactions: Transaction[], + transactions: PayoutAPITransaction[], sendTransaction: SendTransactionFunction, ): Promise => { let lastTxHash = ""; @@ -36,7 +70,7 @@ export const executeTransactions = async ( lastTxHash = await sendTransaction({ to: tx.to as `0x${string}`, data: tx.data as `0x${string}`, - value: BigInt(tx.value.hex), + value: normalizeValue(tx.value), }); } @@ -99,13 +133,10 @@ export const executePayment = async ({ throw { type: "api", error } as PaymentError; } - const data = await response.json(); + const data: PayoutAPIResponse = await response.json(); - if (data?.calldata?.transactions) { - return await executeTransactions( - data.calldata.transactions, - sendTransaction, - ); + if (data?.transactions) { + return await executeTransactions(data.transactions, sendTransaction); } else { const error = new Error("No transaction data received from backend"); throw { type: "api", error } as PaymentError; diff --git a/package-lock.json b/package-lock.json index e4112c7..9015a2c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,6 +15,7 @@ "@tanstack/react-query": "^5.86.0", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", + "html2pdf.js": "^0.12.0", "lucide-react": "^0.542.0", "next": "15.5.2", "react": "19.1.0", @@ -3356,6 +3357,19 @@ "undici-types": "~6.21.0" } }, + "node_modules/@types/pako": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/pako/-/pako-2.0.4.tgz", + "integrity": "sha512-VWDCbrLeVXJM9fihYodcLiIv0ku+AlOa/TQ1SvYOaBuyrSKgEcro95LJyIsJ4vSo6BXIxOKxiJAat04CmST9Fw==", + "license": "MIT" + }, + "node_modules/@types/raf": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/@types/raf/-/raf-3.4.3.tgz", + "integrity": "sha512-c4YAvMedbPZ5tEyxzQdMoOhhJ4RD3rngZIdwC2/qDN3d7JpEhB6fiBRKVY1lg5B7Wk+uPBjn5f39j1/2MY1oOw==", + "license": "MIT", + "optional": true + }, "node_modules/@types/react": { "version": "19.1.12", "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.12.tgz", @@ -5032,6 +5046,15 @@ "integrity": "sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg==", "license": "MIT" }, + "node_modules/base64-arraybuffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", + "integrity": "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, "node_modules/base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -5286,6 +5309,26 @@ ], "license": "CC-BY-4.0" }, + "node_modules/canvg": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/canvg/-/canvg-3.0.11.tgz", + "integrity": "sha512-5ON+q7jCTgMp9cjpu4Jo6XbvfYwSB2Ow3kzHKfIyJfaCAOHLbdKPQqGKgfED/R5B+3TFFfe8pegYA+b423SRyA==", + "license": "MIT", + "optional": true, + "dependencies": { + "@babel/runtime": "^7.12.5", + "@types/raf": "^3.4.0", + "core-js": "^3.8.3", + "raf": "^3.4.1", + "regenerator-runtime": "^0.13.7", + "rgbcolor": "^1.0.1", + "stackblur-canvas": "^2.0.0", + "svg-pathdata": "^6.0.3" + }, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/cbw-sdk": { "name": "@coinbase/wallet-sdk", "version": "3.9.3", @@ -5611,6 +5654,18 @@ "node": ">=6.6.0" } }, + "node_modules/core-js": { + "version": "3.45.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.45.1.tgz", + "integrity": "sha512-L4NPsJlCfZsPeXukyzHFlg/i7IIVwHSItR0wg0FLNqYClJ4MQYTYLbC7EkjKYRLZF2iof2MUgN0EGy7MdQFChg==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, "node_modules/core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", @@ -5746,6 +5801,15 @@ "uncrypto": "^0.1.3" } }, + "node_modules/css-line-break": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-line-break/-/css-line-break-2.1.0.tgz", + "integrity": "sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w==", + "license": "MIT", + "dependencies": { + "utrie": "^1.0.2" + } + }, "node_modules/csstype": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", @@ -5931,6 +5995,16 @@ "integrity": "sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==", "license": "MIT" }, + "node_modules/dompurify": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.2.6.tgz", + "integrity": "sha512-/2GogDQlohXPZe6D6NOgQvXLPSYBqIWMnZ8zzOhn09REE4eyAzb+Hed3jhoM9OkuaJ8P6ZGTTVWQKAi8ieIzfQ==", + "license": "(MPL-2.0 OR Apache-2.0)", + "optional": true, + "optionalDependencies": { + "@types/trusted-types": "^2.0.7" + } + }, "node_modules/dotenv": { "version": "17.2.2", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.2.tgz", @@ -6503,6 +6577,17 @@ "dev": true, "license": "MIT" }, + "node_modules/fast-png": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/fast-png/-/fast-png-6.4.0.tgz", + "integrity": "sha512-kAqZq1TlgBjZcLr5mcN6NP5Rv4V2f22z00c3g8vRrwkcqjerx7BEhPbOnWCPqaHUl2XWQBJQvOT/FQhdMT7X/Q==", + "license": "MIT", + "dependencies": { + "@types/pako": "^2.0.3", + "iobuffer": "^5.3.2", + "pako": "^2.1.0" + } + }, "node_modules/fast-redact": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.5.0.tgz", @@ -6570,6 +6655,12 @@ "node": "^12.20 || >= 14.13" } }, + "node_modules/fflate": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", + "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==", + "license": "MIT" + }, "node_modules/figures": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/figures/-/figures-6.1.0.tgz", @@ -6950,6 +7041,29 @@ "dev": true, "license": "MIT" }, + "node_modules/html2canvas": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/html2canvas/-/html2canvas-1.4.1.tgz", + "integrity": "sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA==", + "license": "MIT", + "dependencies": { + "css-line-break": "^2.1.0", + "text-segmentation": "^1.0.3" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/html2pdf.js": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/html2pdf.js/-/html2pdf.js-0.12.0.tgz", + "integrity": "sha512-UiaAxJpkNiintpAKZ94V0GTmwDSootT78f5AHw5nUjDXo+RHsJJ0aVhoccrxdWiM7Lx2cJ929ca7mAnbSt13gw==", + "license": "MIT", + "dependencies": { + "html2canvas": "^1.0.0", + "jspdf": "^3.0.0" + } + }, "node_modules/http-errors": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", @@ -7073,6 +7187,12 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "license": "ISC" }, + "node_modules/iobuffer": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/iobuffer/-/iobuffer-5.4.0.tgz", + "integrity": "sha512-DRebOWuqDvxunfkNJAlc3IzWIPD5xVxwUNbHr7xKB8E6aLJxIPfNX3CoMJghcFjpv6RWQsrcJbghtEwSPoJqMA==", + "license": "MIT" + }, "node_modules/ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", @@ -7450,6 +7570,23 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/jspdf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jspdf/-/jspdf-3.0.2.tgz", + "integrity": "sha512-G0fQDJ5fAm6UW78HG6lNXyq09l0PrA1rpNY5i+ly17Zb1fMMFSmS+3lw4cnrAPGyouv2Y0ylujbY2Ieq3DSlKA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.26.9", + "fast-png": "^6.2.0", + "fflate": "^0.8.1" + }, + "optionalDependencies": { + "canvg": "^3.0.11", + "core-js": "^3.6.0", + "dompurify": "^3.2.4", + "html2canvas": "^1.0.0-rc.5" + } + }, "node_modules/keccak": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.4.tgz", @@ -8623,6 +8760,12 @@ "dev": true, "license": "MIT" }, + "node_modules/pako": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", + "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==", + "license": "(MIT AND Zlib)" + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -8711,6 +8854,13 @@ "dev": true, "license": "MIT" }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "license": "MIT", + "optional": true + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -9124,6 +9274,16 @@ "integrity": "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==", "license": "MIT" }, + "node_modules/raf": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", + "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", + "license": "MIT", + "optional": true, + "dependencies": { + "performance-now": "^2.1.0" + } + }, "node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -9309,6 +9469,13 @@ "node": ">= 4" } }, + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "license": "MIT", + "optional": true + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -9362,6 +9529,16 @@ "node": ">=0.10.0" } }, + "node_modules/rgbcolor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rgbcolor/-/rgbcolor-1.0.1.tgz", + "integrity": "sha512-9aZLIrhRaD97sgVhtJOW6ckOEh6/GnvQtdVNfdZ6s67+3/XwLS9lBcQYzEEhYVeUowN7pRzMLsyGhK2i/xvWbw==", + "license": "MIT OR SEE LICENSE IN FEEL-FREE.md", + "optional": true, + "engines": { + "node": ">= 0.8.15" + } + }, "node_modules/router": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", @@ -9894,6 +10071,16 @@ "node": ">= 10.x" } }, + "node_modules/stackblur-canvas": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/stackblur-canvas/-/stackblur-canvas-2.7.0.tgz", + "integrity": "sha512-yf7OENo23AGJhBriGx0QivY5JP6Y1HbrrDI6WLt6C5auYZXlQrheoY8hD4ibekFKz1HOfE48Ww8kMWMnJD/zcQ==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.1.14" + } + }, "node_modules/statuses": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", @@ -10055,6 +10242,16 @@ "node": ">=14.0.0" } }, + "node_modules/svg-pathdata": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/svg-pathdata/-/svg-pathdata-6.0.3.tgz", + "integrity": "sha512-qsjeeq5YjBZ5eMdFuUa4ZosMLxgr5RZ+F+Y1OrDhuOCEInRMA3x74XdBtggJcj9kOeInz0WE+LgCPDkZFlBYJw==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/tailwind-merge": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.3.1.tgz", @@ -10104,6 +10301,15 @@ "node": ">=18" } }, + "node_modules/text-segmentation": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/text-segmentation/-/text-segmentation-1.0.3.tgz", + "integrity": "sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw==", + "license": "MIT", + "dependencies": { + "utrie": "^1.0.2" + } + }, "node_modules/thread-stream": { "version": "0.15.2", "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-0.15.2.tgz", @@ -10588,6 +10794,15 @@ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "license": "MIT" }, + "node_modules/utrie": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/utrie/-/utrie-1.0.2.tgz", + "integrity": "sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw==", + "license": "MIT", + "dependencies": { + "base64-arraybuffer": "^1.0.2" + } + }, "node_modules/uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", diff --git a/package.json b/package.json index 749c68c..6a77efc 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "@tanstack/react-query": "^5.86.0", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", + "html2pdf.js": "^0.12.0", "lucide-react": "^0.542.0", "next": "15.5.2", "react": "19.1.0", diff --git a/registry/default/payment-widget/components/currency-select.tsx b/registry/default/payment-widget/components/currency-select.tsx index cde03d5..bd8f996 100644 --- a/registry/default/payment-widget/components/currency-select.tsx +++ b/registry/default/payment-widget/components/currency-select.tsx @@ -11,9 +11,9 @@ interface Currency { } const currencies: Currency[] = [ - { id: "eth-sepolia", name: "Ethereum", symbol: "ETH" }, - { id: "fau-sepolia", name: "Faucet Token", symbol: "FAU" }, - { id: "usdc-sepolia", name: "USD Coin", symbol: "USDC" }, + { id: "ETH-sepolia-sepolia", name: "Ethereum", symbol: "ETH" }, + { id: "FAU-sepolia", name: "Faucet Token", symbol: "FAU" }, + { id: "fUSDC-sepolia", name: "USD Coin", symbol: "USDC" }, ]; interface CurrencySelectProps { diff --git a/registry/default/payment-widget/components/payment-confirmation.tsx b/registry/default/payment-widget/components/payment-confirmation.tsx index 18d435e..811f733 100644 --- a/registry/default/payment-widget/components/payment-confirmation.tsx +++ b/registry/default/payment-widget/components/payment-confirmation.tsx @@ -2,7 +2,7 @@ import { Button } from "@/components/ui/button"; import { ArrowRight, ArrowDown } from "lucide-react"; -import { type FeeInfo, type PaymentError } from "@/types/payment"; +import { type PaymentError } from "@/types"; import { type PaymentWidgetProps, type BuyerInfo } from "../types"; import { usePayment } from "@/hooks/use-payment"; diff --git a/registry/default/payment-widget/components/payment-modal.tsx b/registry/default/payment-widget/components/payment-modal.tsx index 809c080..de20061 100644 --- a/registry/default/payment-widget/components/payment-modal.tsx +++ b/registry/default/payment-widget/components/payment-modal.tsx @@ -12,8 +12,9 @@ import { import { useState } from "react"; import { CurrencySelect } from "./currency-select"; import { BuyerInfoForm } from "./buyer-info-form"; -import { type PaymentWidgetProps, type BuyerInfo } from "../types"; import { PaymentConfirmation } from "./payment-confirmation"; +import { PaymentSuccess } from "./payment-success"; +import { PaymentWidgetProps, type BuyerInfo } from "../types"; interface PaymentModalProps extends Omit { @@ -39,6 +40,7 @@ export function PaymentModal({ >("currency-select"); const [selectedCurrency, setSelectedCurrency] = useState(null); const [buyerInfo, setBuyerInfo] = useState(null); + const [requestId, setRequestId] = useState(""); const { address } = useAccount(); const { disconnect } = useDisconnect(); @@ -58,6 +60,12 @@ export function PaymentModal({ setActiveStep("payment-confirmation"); }; + const handlePaymentSuccess = (txHash: string) => { + setRequestId(`req_${txHash.slice(-8)}`); + setActiveStep("payment-success"); + onSuccess(txHash); + }; + return ( @@ -67,27 +75,33 @@ export function PaymentModal({ Pay with crypto using Request Network -
-
-
- - {address?.slice(0, 6)}...{address?.slice(-4)} - - + + {activeStep !== "payment-success" && ( +
+
+
+ + {address?.slice(0, 6)}...{address?.slice(-4)} + + +
-
+ )} + {activeStep === "currency-select" && ( )} + {activeStep === "buyer-info" && ( setActiveStep("currency-select")} onSubmit={handleBuyerInfoSubmit} /> )} + {activeStep === "payment-confirmation" && selectedCurrency && buyerInfo && ( @@ -96,16 +110,22 @@ export function PaymentModal({ rnApiKey={rnApiKey} recipientWallet={recipientWallet} feeInfo={feeInfo} - onSuccess={(txHash) => { - setActiveStep("payment-success"); - onSuccess(txHash); - }} + onSuccess={handlePaymentSuccess} onError={onError} paymentCurrency={selectedCurrency} buyerInfo={buyerInfo} onBack={() => setActiveStep("buyer-info")} /> )} + + {activeStep === "payment-success" && selectedCurrency && ( + + )}
); diff --git a/registry/default/payment-widget/components/payment-success.tsx b/registry/default/payment-widget/components/payment-success.tsx new file mode 100644 index 0000000..4861903 --- /dev/null +++ b/registry/default/payment-widget/components/payment-success.tsx @@ -0,0 +1,147 @@ +"use client"; + +import { Button } from "@/components/ui/button"; +import { CheckCircle, ExternalLink, Download } from "lucide-react"; +import { createInvoice, type CreateInvoiceParams } from "@/lib/invoice"; +import { type BuyerInfo } from "../types"; +import Link from "next/link"; +import { useRef } from "react"; +import { InvoicePDFTemplate } from "@/components/invoice/invoice-template"; +import html2pdf from "html2pdf.js"; + +interface PaymentSuccessProps { + requestId: string; + buyerInfo: BuyerInfo; + amountInUsd: string; + paymentCurrency: string; +} + +export function PaymentSuccess({ + requestId, + buyerInfo, + amountInUsd, + paymentCurrency, +}: PaymentSuccessProps) { + const invoiceRef = useRef(null); + + const invoiceParams: CreateInvoiceParams = { + company: { + name: "Request Network Inc.", + walletAddress: "0x742d35Cc6634C0532925a3b8D697Bf5e", + address: { + street: "123 Crypto Street", + city: "San Francisco", + state: "CA", + zipCode: "94105", + country: "USA", + }, + taxId: "US123456789", + email: "hello@request.network", + phone: "+1 (555) 123-4567", + website: "https://request.network", + }, + buyer: { + walletAddress: "0x" + "0".repeat(40), // Mock buyer wallet + email: buyerInfo.email, + firstName: buyerInfo.firstName, + lastName: buyerInfo.lastName, + address: buyerInfo.streetAddress + ? { + street: buyerInfo.streetAddress, + city: buyerInfo.city || "", + state: buyerInfo.state || "", + zipCode: buyerInfo.postalCode || "", + country: buyerInfo.country || "", + } + : undefined, + }, + payment: { + chain: "ethereum", + currency: paymentCurrency, + exchangeRate: 1, // Mock exchange rate + transactionHash: "", // We don't have the tx hash in this context + }, + items: [ + { + id: "1", + description: "Payment via Request Network", + quantity: 1, + unitPrice: parseFloat(amountInUsd), + discount: 0, + tax: 0, + }, + ], + metadata: { + notes: `Payment processed through Request Network for ${amountInUsd} USD`, + }, + }; + + const handleDownloadInvoice = async () => { + try { + const element = invoiceRef.current; + if (!element) { + console.error("Invoice element not found"); + return; + } + + html2pdf() + .set({ + margin: 1, + filename: "invoice.pdf", + image: { type: "jpeg", quality: 0.98 }, + html2canvas: { scale: 2 }, + jsPDF: { unit: "in", format: "a4", orientation: "portrait" }, + }) + .from(element) + .save(); + } catch (error) { + console.error("Failed to download invoice:", error); + alert("Failed to download invoice. Please try again."); + } + }; + + const requestScanUrl = `https://scan.request.network/request/${requestId}`; + + return ( +
+
+ +
+

+ Payment Completed! +

+

+ Your payment of ${amountInUsd} has been processed successfully. +

+
+
+ +
+ + + +
+
+
+ +
+
+
+ ); +} diff --git a/registry/default/payment-widget/types.ts b/registry/default/payment-widget/types.ts index b5350b9..5c91af3 100644 --- a/registry/default/payment-widget/types.ts +++ b/registry/default/payment-widget/types.ts @@ -1,4 +1,4 @@ -import { type FeeInfo, type PaymentError } from "@/types/payment"; +import { type FeeInfo, type PaymentError } from "@/types"; export interface BuyerInfo { email: string; diff --git a/types/html2pdf.d.ts b/types/html2pdf.d.ts new file mode 100644 index 0000000..9c36907 --- /dev/null +++ b/types/html2pdf.d.ts @@ -0,0 +1,76 @@ +// Type definitions for html2pdf.js +// Project: https://github.com/eKoopmans/html2pdf.js + +declare module "html2pdf.js" { + interface Html2PdfOptions { + margin?: number | [number, number, number, number]; + filename?: string; + image?: { + type?: "jpeg" | "png" | "webp"; + quality?: number; + }; + html2canvas?: { + scale?: number; + backgroundColor?: string; + useCORS?: boolean; + allowTaint?: boolean; + logging?: boolean; + debug?: boolean; + width?: number; + height?: number; + scrollX?: number; + scrollY?: number; + x?: number; + y?: number; + }; + jsPDF?: { + unit?: "pt" | "mm" | "cm" | "in"; + format?: "a4" | "letter" | "legal" | [number, number]; + orientation?: "portrait" | "landscape"; + compress?: boolean; + }; + pagebreak?: { + mode?: string | string[]; + before?: string | string[]; + after?: string | string[]; + avoid?: string | string[]; + }; + } + + interface Html2PdfWorker { + from(element: HTMLElement | string): Html2PdfWorker; + to(target: string): Html2PdfWorker; + set(options: Html2PdfOptions): Html2PdfWorker; + save(filename?: string): Promise; + outputPdf(type?: string): Promise; + then( + onFulfilled?: (value: any) => any, + onRejected?: (reason: any) => any, + ): Promise; + catch(onRejected?: (reason: any) => any): Promise; + } + + function html2pdf(): Html2PdfWorker; + function html2pdf( + element: HTMLElement, + options?: Html2PdfOptions, + ): Promise; + + namespace html2pdf { + class Worker implements Html2PdfWorker { + from(element: HTMLElement | string): Html2PdfWorker; + to(target: string): Html2PdfWorker; + set(options: Html2PdfOptions): Html2PdfWorker; + save(filename?: string): Promise; + outputPdf(type?: string): Promise; + // biome-ignore lint/suspicious/noThenProperty: + then( + onFulfilled?: (value: any) => any, + onRejected?: (reason: any) => any, + ): Promise; + catch(onRejected?: (reason: any) => any): Promise; + } + } + + export = html2pdf; +} diff --git a/types/payment.ts b/types/index.ts similarity index 100% rename from types/payment.ts rename to types/index.ts From 89c6923f987b853889dd792270309d16c099471e Mon Sep 17 00:00:00 2001 From: Bassgeta Date: Wed, 10 Sep 2025 10:53:39 +0200 Subject: [PATCH 07/37] feat: rework props and make invoice info configurable by props --- app/components/payment-widget-wrapper.tsx | 45 ++++- components/invoice/invoice-template.tsx | 43 +---- lib/invoice.ts | 175 +++--------------- .../components/buyer-info-form.tsx | 25 ++- .../components/payment-confirmation.tsx | 14 +- .../components/payment-modal.tsx | 42 +++-- .../components/payment-success.tsx | 63 ++----- .../default/payment-widget/payment-widget.tsx | 27 +-- registry/default/payment-widget/types.ts | 27 +-- types/index.ts | 55 ++++++ 10 files changed, 216 insertions(+), 300 deletions(-) diff --git a/app/components/payment-widget-wrapper.tsx b/app/components/payment-widget-wrapper.tsx index 25746cf..0b65eab 100644 --- a/app/components/payment-widget-wrapper.tsx +++ b/app/components/payment-widget-wrapper.tsx @@ -13,8 +13,8 @@ export function PaymentWidgetWrapper({ rnApiKey, recipientWallet, }: PaymentWidgetWrapperProps) { - const handleSuccess = () => { - console.log("Payment successful"); + const handleSuccess = (txHash: string) => { + console.log("Payment successful:", txHash); }; const handleError = (error: any) => { @@ -23,10 +23,45 @@ export function PaymentWidgetWrapper({ return ( diff --git a/components/invoice/invoice-template.tsx b/components/invoice/invoice-template.tsx index 9012ae3..09e7193 100644 --- a/components/invoice/invoice-template.tsx +++ b/components/invoice/invoice-template.tsx @@ -5,7 +5,6 @@ import { formatInvoiceDate, type InvoiceData, } from "@/lib/invoice"; -// Since we are using html2pdf, which doesn't work with tailwind, we need to import a separate CSS file import "./styles.css"; export const InvoicePDFTemplate: React.FC<{ invoice: InvoiceData }> = ({ @@ -14,7 +13,6 @@ export const InvoicePDFTemplate: React.FC<{ invoice: InvoiceData }> = ({ return (
- {/* Company Info */}

{invoice.company.name}

{invoice.company.walletAddress}
@@ -29,7 +27,6 @@ export const InvoicePDFTemplate: React.FC<{ invoice: InvoiceData }> = ({
- {/* Invoice Title */}

INVOICE

@@ -67,15 +64,13 @@ export const InvoicePDFTemplate: React.FC<{ invoice: InvoiceData }> = ({
{invoice.buyer.walletAddress}
{invoice.buyer.email}
- {invoice.buyer.address && ( -
-
{invoice.buyer.address.street}
-
- {invoice.buyer.address.city}, {invoice.buyer.address.state}{" "} - {invoice.buyer.address.zipCode} -
+
+
{invoice.buyer.streetAddress}
+
+ {invoice.buyer.city}, {invoice.buyer.state}{" "} + {invoice.buyer.postalCode}
- )} +
@@ -87,7 +82,7 @@ export const InvoicePDFTemplate: React.FC<{ invoice: InvoiceData }> = ({ Unit Price Disc% Tax% - Amount + Total @@ -101,17 +96,15 @@ export const InvoicePDFTemplate: React.FC<{ invoice: InvoiceData }> = ({ {formatCryptoAmount( item.unitPrice, - invoice.payment.currency, - 6, + item.currency || invoice.payment.currency, )} {item.discount || 0}% {item.tax || 0}% {formatCryptoAmount( - item.finalAmount, - invoice.payment.currency, - 6, + item.total, + item.currency || invoice.payment.currency, )} @@ -119,20 +112,8 @@ export const InvoicePDFTemplate: React.FC<{ invoice: InvoiceData }> = ({ - {/* Totals */}
-
- Subtotal: - - {formatCryptoAmount( - invoice.totals.subtotal, - invoice.payment.currency, - 6, - )} - -
- {invoice.totals.totalDiscount > 0 && (
Discount: @@ -141,7 +122,6 @@ export const InvoicePDFTemplate: React.FC<{ invoice: InvoiceData }> = ({ {formatCryptoAmount( invoice.totals.totalDiscount, invoice.payment.currency, - 6, )}
@@ -154,7 +134,6 @@ export const InvoicePDFTemplate: React.FC<{ invoice: InvoiceData }> = ({ {formatCryptoAmount( invoice.totals.totalTax, invoice.payment.currency, - 6, )}
@@ -166,7 +145,6 @@ export const InvoicePDFTemplate: React.FC<{ invoice: InvoiceData }> = ({ {formatCryptoAmount( invoice.totals.total, invoice.payment.currency, - 6, )}
@@ -178,7 +156,6 @@ export const InvoicePDFTemplate: React.FC<{ invoice: InvoiceData }> = ({
- {/* Notes */} {invoice.metadata.notes && (

Notes:

diff --git a/lib/invoice.ts b/lib/invoice.ts index b6a20bd..bc3a0cf 100644 --- a/lib/invoice.ts +++ b/lib/invoice.ts @@ -1,42 +1,4 @@ -export interface InvoiceItem { - id: string; - description: string; - quantity: number; - unitPrice: number; - discount?: number; - tax?: number; - finalAmount: number; -} - -export interface CompanyInfo { - name: string; - walletAddress: string; - address: { - street: string; - city: string; - state: string; - zipCode: string; - country?: string; - }; - taxId: string; - email?: string; - phone?: string; - website?: string; -} - -export interface InvoiceBuyerInfo { - walletAddress: string; - email: string; - firstName?: string; - lastName?: string; - address?: { - street: string; - city: string; - state: string; - zipCode: string; - country?: string; - }; -} +import { BuyerInfo, CompanyInfo, InvoiceItem } from "@/types"; export interface PaymentInfo { chain: string; @@ -51,14 +13,17 @@ export interface InvoiceMetadata { notes?: string; } +interface InvoiceBuyerInfo extends BuyerInfo { + walletAddress: string; +} + export interface InvoiceData { - metadata: InvoiceMetadata; company: CompanyInfo; buyer: InvoiceBuyerInfo; payment: PaymentInfo; items: InvoiceItem[]; + metadata: InvoiceMetadata; totals: { - subtotal: number; totalDiscount: number; totalTax: number; total: number; @@ -66,51 +31,6 @@ export interface InvoiceData { }; } -export const calculateItemTotal = ( - item: Omit, -): InvoiceItem => { - const baseAmount = item.quantity * item.unitPrice; - const discountAmount = item.discount ? (baseAmount * item.discount) / 100 : 0; - const afterDiscount = baseAmount - discountAmount; - const taxAmount = item.tax ? (afterDiscount * item.tax) / 100 : 0; - const finalAmount = afterDiscount + taxAmount; - - return { - ...item, - finalAmount: Number(finalAmount.toFixed(6)), // Crypto precision - }; -}; - -export const calculateInvoiceTotals = ( - items: InvoiceItem[], - exchangeRate: number, -) => { - const subtotal = items.reduce( - (sum, item) => sum + item.quantity * item.unitPrice, - 0, - ); - const totalDiscount = items.reduce((sum, item) => { - const baseAmount = item.quantity * item.unitPrice; - return sum + (item.discount ? (baseAmount * item.discount) / 100 : 0); - }, 0); - const totalTax = items.reduce((sum, item) => { - const baseAmount = item.quantity * item.unitPrice; - const afterDiscount = - baseAmount - (item.discount ? (baseAmount * item.discount) / 100 : 0); - return sum + (item.tax ? (afterDiscount * item.tax) / 100 : 0); - }, 0); - const total = items.reduce((sum, item) => sum + item.finalAmount, 0); - const totalUSD = total * exchangeRate; - - return { - subtotal: Number(subtotal.toFixed(6)), - totalDiscount: Number(totalDiscount.toFixed(6)), - totalTax: Number(totalTax.toFixed(6)), - total: Number(total.toFixed(6)), - totalUSD: Number(totalUSD.toFixed(2)), - }; -}; - export const generateInvoiceNumber = (prefix: string = "INV"): string => { const timestamp = Date.now(); const random = Math.floor(Math.random() * 1000) @@ -119,23 +39,6 @@ export const generateInvoiceNumber = (prefix: string = "INV"): string => { return `${prefix}-${timestamp}-${random}`; }; -export const formatWalletAddress = ( - address: string, - startChars: number = 6, - endChars: number = 4, -): string => { - if (address.length <= startChars + endChars) return address; - return `${address.slice(0, startChars)}...${address.slice(-endChars)}`; -}; - -export const formatCryptoAmount = ( - amount: number, - currency: string, - decimals: number = 6, -): string => { - return `${amount.toFixed(decimals)} ${currency}`; -}; - export const formatUSDAmount = (amount: number): string => { return new Intl.NumberFormat("en-US", { style: "currency", @@ -145,9 +48,13 @@ export const formatUSDAmount = (amount: number): string => { }).format(amount); }; -/** - * Formats dates for invoice display - */ +export const formatCryptoAmount = ( + amount: number, + currency: string, +): string => { + return `${amount} ${currency}`; +}; + export const formatInvoiceDate = (date: Date): string => { return date.toLocaleDateString("en-US", { year: "numeric", @@ -160,18 +67,17 @@ export interface CreateInvoiceParams { company: CompanyInfo; buyer: InvoiceBuyerInfo; payment: PaymentInfo; - items: Omit[]; + items: InvoiceItem[]; + totals: { + totalDiscount: number; + totalTax: number; + total: number; + totalUSD: number; + }; metadata?: Partial; } export const createInvoice = (params: CreateInvoiceParams): InvoiceData => { - const calculatedItems = params.items.map(calculateItemTotal); - - const totals = calculateInvoiceTotals( - calculatedItems, - params.payment.exchangeRate, - ); - const metadata: InvoiceMetadata = { invoiceNumber: generateInvoiceNumber(), issueDate: new Date(), @@ -183,52 +89,17 @@ export const createInvoice = (params: CreateInvoiceParams): InvoiceData => { company: params.company, buyer: params.buyer, payment: params.payment, - items: calculatedItems, - totals, + items: params.items, + totals: params.totals, }; return invoice; }; -export const getCompanyDisplayInfo = (company: CompanyInfo) => ({ - name: company.name, - walletAddress: company.walletAddress, - fullAddress: `${company.address.street}, ${company.address.city}, ${company.address.state} ${company.address.zipCode}`, - taxId: company.taxId, - contact: { - email: company.email, - phone: company.phone, - website: company.website, - }, -}); - -export const getBuyerDisplayInfo = (buyer: InvoiceBuyerInfo) => ({ - walletAddress: buyer.walletAddress, - email: buyer.email, - fullName: - [buyer.firstName, buyer.lastName].filter(Boolean).join(" ") || "N/A", - fullAddress: buyer.address - ? `${buyer.address.street}, ${buyer.address.city}, ${buyer.address.state} ${buyer.address.zipCode}` - : "N/A", -}); - -export const getPaymentDisplayInfo = (payment: PaymentInfo) => ({ - chain: payment.chain.charAt(0).toUpperCase() + payment.chain.slice(1), - currency: payment.currency, - formattedRate: `1 ${payment.currency} = ${formatUSDAmount(payment.exchangeRate)}`, - transactionHash: payment.transactionHash ?? undefined, -}); - export const InvoiceUtils = { createInvoice, - calculateItemTotal, - calculateInvoiceTotals, generateInvoiceNumber, - formatWalletAddress, - formatCryptoAmount, formatUSDAmount, + formatCryptoAmount, formatInvoiceDate, - getCompanyDisplayInfo, - getBuyerDisplayInfo, - getPaymentDisplayInfo, } as const; diff --git a/registry/default/payment-widget/components/buyer-info-form.tsx b/registry/default/payment-widget/components/buyer-info-form.tsx index b7905ef..160ed4a 100644 --- a/registry/default/payment-widget/components/buyer-info-form.tsx +++ b/registry/default/payment-widget/components/buyer-info-form.tsx @@ -4,19 +4,26 @@ import { useForm } from "react-hook-form"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; -import { type BuyerInfo } from "../types"; +import { type BuyerInfo } from "@/types"; interface BuyerInfoProps { + initialData?: BuyerInfo; onBack: () => void; onSubmit: (data: BuyerInfo) => void; } -export function BuyerInfoForm({ onBack, onSubmit }: BuyerInfoProps) { +export function BuyerInfoForm({ + initialData, + onBack, + onSubmit, +}: BuyerInfoProps) { const { register, handleSubmit, formState: { errors }, - } = useForm(); + } = useForm({ + defaultValues: initialData || {}, + }); const onFormSubmit = (data: BuyerInfo) => { onSubmit(data); @@ -79,18 +86,8 @@ export function BuyerInfoForm({ onBack, onSubmit }: BuyerInfoProps) { id="phone" type="tel" placeholder="+1 (555) 123-4567" - {...register("phone", { - pattern: { - value: /^\+?[1-9]\d{1,14}$/, - message: "Please enter a valid phone number", - }, - })} + {...register("phone")} /> - {errors.phone && ( - - {errors.phone.message} - - )}
diff --git a/registry/default/payment-widget/components/payment-confirmation.tsx b/registry/default/payment-widget/components/payment-confirmation.tsx index 811f733..170c187 100644 --- a/registry/default/payment-widget/components/payment-confirmation.tsx +++ b/registry/default/payment-widget/components/payment-confirmation.tsx @@ -2,15 +2,19 @@ import { Button } from "@/components/ui/button"; import { ArrowRight, ArrowDown } from "lucide-react"; -import { type PaymentError } from "@/types"; -import { type PaymentWidgetProps, type BuyerInfo } from "../types"; +import { FeeInfo, type PaymentError } from "@/types"; +import { type PaymentWidgetProps } from "../types"; import { usePayment } from "@/hooks/use-payment"; -interface PaymentConfirmationProps - extends Omit { +interface PaymentConfirmationProps { + feeInfo: FeeInfo | undefined; + rnApiKey: string; + amountInUsd: string; + recipientWallet: string; paymentCurrency: string; - buyerInfo: BuyerInfo; onBack: () => void; + onSuccess: (txHash: string) => void; + onError: (error: PaymentError) => void; } export function PaymentConfirmation({ diff --git a/registry/default/payment-widget/components/payment-modal.tsx b/registry/default/payment-widget/components/payment-modal.tsx index de20061..df420a5 100644 --- a/registry/default/payment-widget/components/payment-modal.tsx +++ b/registry/default/payment-widget/components/payment-modal.tsx @@ -14,10 +14,11 @@ import { CurrencySelect } from "./currency-select"; import { BuyerInfoForm } from "./buyer-info-form"; import { PaymentConfirmation } from "./payment-confirmation"; import { PaymentSuccess } from "./payment-success"; -import { PaymentWidgetProps, type BuyerInfo } from "../types"; +import { type BuyerInfo } from "@/types"; +import { type PaymentWidgetProps } from "../types"; -interface PaymentModalProps - extends Omit { +interface PaymentModalProps extends Omit { + config: Omit; isOpen: boolean; handleModalOpenChange: (open: boolean) => void; } @@ -26,9 +27,9 @@ export function PaymentModal({ isOpen, handleModalOpenChange, amountInUsd, - rnApiKey, recipientWallet, - feeInfo, + config, + invoiceInfo, onSuccess, onError, }: PaymentModalProps) { @@ -39,7 +40,9 @@ export function PaymentModal({ | "payment-success" >("currency-select"); const [selectedCurrency, setSelectedCurrency] = useState(null); - const [buyerInfo, setBuyerInfo] = useState(null); + const [buyerInfo, setBuyerInfo] = useState( + invoiceInfo.buyerInfo || undefined, + ); const [requestId, setRequestId] = useState(""); const { address } = useAccount(); @@ -97,6 +100,7 @@ export function PaymentModal({ {activeStep === "buyer-info" && ( setActiveStep("currency-select")} onSubmit={handleBuyerInfoSubmit} /> @@ -107,25 +111,29 @@ export function PaymentModal({ buyerInfo && ( setActiveStep("buyer-info")} /> )} - {activeStep === "payment-success" && selectedCurrency && ( - - )} + {activeStep === "payment-success" && + selectedCurrency && + buyerInfo && + address && ( + + )} ); diff --git a/registry/default/payment-widget/components/payment-success.tsx b/registry/default/payment-widget/components/payment-success.tsx index 4861903..55d8805 100644 --- a/registry/default/payment-widget/components/payment-success.tsx +++ b/registry/default/payment-widget/components/payment-success.tsx @@ -3,75 +3,49 @@ import { Button } from "@/components/ui/button"; import { CheckCircle, ExternalLink, Download } from "lucide-react"; import { createInvoice, type CreateInvoiceParams } from "@/lib/invoice"; -import { type BuyerInfo } from "../types"; import Link from "next/link"; import { useRef } from "react"; import { InvoicePDFTemplate } from "@/components/invoice/invoice-template"; import html2pdf from "html2pdf.js"; +import { type BuyerInfo, type InvoiceInfo } from "@/types"; interface PaymentSuccessProps { requestId: string; - buyerInfo: BuyerInfo; amountInUsd: string; paymentCurrency: string; + invoiceInfo: InvoiceInfo; + finalBuyerInfo: BuyerInfo; + connectedWalletAddress: string; } export function PaymentSuccess({ requestId, - buyerInfo, amountInUsd, paymentCurrency, + invoiceInfo, + finalBuyerInfo, + connectedWalletAddress, }: PaymentSuccessProps) { const invoiceRef = useRef(null); const invoiceParams: CreateInvoiceParams = { - company: { - name: "Request Network Inc.", - walletAddress: "0x742d35Cc6634C0532925a3b8D697Bf5e", - address: { - street: "123 Crypto Street", - city: "San Francisco", - state: "CA", - zipCode: "94105", - country: "USA", - }, - taxId: "US123456789", - email: "hello@request.network", - phone: "+1 (555) 123-4567", - website: "https://request.network", - }, + company: invoiceInfo.companyInfo, buyer: { - walletAddress: "0x" + "0".repeat(40), // Mock buyer wallet - email: buyerInfo.email, - firstName: buyerInfo.firstName, - lastName: buyerInfo.lastName, - address: buyerInfo.streetAddress - ? { - street: buyerInfo.streetAddress, - city: buyerInfo.city || "", - state: buyerInfo.state || "", - zipCode: buyerInfo.postalCode || "", - country: buyerInfo.country || "", - } - : undefined, + ...finalBuyerInfo, + walletAddress: connectedWalletAddress, }, payment: { chain: "ethereum", currency: paymentCurrency, - exchangeRate: 1, // Mock exchange rate - transactionHash: "", // We don't have the tx hash in this context + exchangeRate: 1, + transactionHash: "", }, - items: [ - { - id: "1", - description: "Payment via Request Network", - quantity: 1, - unitPrice: parseFloat(amountInUsd), - discount: 0, - tax: 0, - }, - ], + items: invoiceInfo.items, + totals: invoiceInfo.totals, metadata: { + ...(invoiceInfo.invoiceNumber && { + invoiceNumber: invoiceInfo.invoiceNumber, + }), notes: `Payment processed through Request Network for ${amountInUsd} USD`, }, }; @@ -87,7 +61,7 @@ export function PaymentSuccess({ html2pdf() .set({ margin: 1, - filename: "invoice.pdf", + filename: `invoice-${invoiceParams.metadata?.invoiceNumber || "payment"}.pdf`, image: { type: "jpeg", quality: 0.98 }, html2canvas: { scale: 2 }, jsPDF: { unit: "in", format: "a4", orientation: "portrait" }, @@ -129,6 +103,7 @@ export function PaymentSuccess({
+
) { +}: Omit & { + config: Omit; +}) { const [isModalOpen, setIsModalOpen] = useState(false); const handleModalOpenChange = (open: boolean) => { setIsModalOpen(open); @@ -33,9 +35,9 @@ function PaymentWidgetInner({ isOpen={isModalOpen} handleModalOpenChange={handleModalOpenChange} amountInUsd={amountInUsd} - rnApiKey={rnApiKey} recipientWallet={recipientWallet} - feeInfo={feeInfo} + config={config} + invoiceInfo={invoiceInfo} onSuccess={onSuccess} onError={onError} /> @@ -47,21 +49,22 @@ function PaymentWidgetInner({ export function PaymentWidget({ amountInUsd, - walletConnectProjectId, - rnApiKey, recipientWallet, - feeInfo, + config, + invoiceInfo, onSuccess, onError, }: PaymentWidgetProps) { - // We need to wrap the widget in the Web3Provider to provide wagmi context and so it doesn't rerender every time the modal opens or closes return ( - + diff --git a/registry/default/payment-widget/types.ts b/registry/default/payment-widget/types.ts index 5c91af3..6baf986 100644 --- a/registry/default/payment-widget/types.ts +++ b/registry/default/payment-widget/types.ts @@ -1,29 +1,20 @@ -import { type FeeInfo, type PaymentError } from "@/types"; +import { type FeeInfo, type PaymentError, InvoiceInfo } from "@/types"; -export interface BuyerInfo { - email: string; - firstName?: string; - lastName?: string; - businessName?: string; - phone?: string; - streetAddress?: string; - city?: string; - state?: string; - country?: string; - postalCode?: string; +export interface PaymentConfig { + walletConnectProjectId?: string; + rnApiKey: string; + feeInfo?: FeeInfo; } export interface PaymentWidgetProps { // The amount to be paid in USD amountInUsd: string; - // Optional WalletConnect Project ID for connecting via WalletConnect - walletConnectProjectId?: string; - // RN API Key to use to access the Request Network API - rnApiKey: string; // The recipient wallet address for the payment recipientWallet: string; - // Optional fee info to include fees in the payment - feeInfo?: FeeInfo; + // Configuration for the payment widget + config: PaymentConfig; + // Invoice information + invoiceInfo: InvoiceInfo; // On success callback when the payment is completed onSuccess: (txHash: string) => void; // On error callback when the payment fails diff --git a/types/index.ts b/types/index.ts index c1bce41..0d2a0fd 100644 --- a/types/index.ts +++ b/types/index.ts @@ -13,3 +13,58 @@ export interface Transaction { data: string; value: { hex: string }; } + +export interface InvoiceItem { + id: string; + description: string; + quantity: number; + unitPrice: number; + discount?: number; + tax?: number; + total: number; + currency?: string; +} + +export interface CompanyInfo { + name: string; + walletAddress: string; + address: { + street: string; + city: string; + state: string; + zipCode: string; + country?: string; + }; + taxId: string; + email?: string; + phone?: string; + website?: string; +} + +export interface BuyerInfo { + email: string; + firstName?: string; + lastName?: string; + businessName?: string; + phone?: string; + streetAddress?: string; + city?: string; + state?: string; + country?: string; + postalCode?: string; +} + +export interface InvoiceTotals { + totalDiscount: number; + totalTax: number; + total: number; + totalUSD: number; +} + +export interface InvoiceInfo { + buyerInfo?: BuyerInfo; + companyInfo: CompanyInfo; + items: InvoiceItem[]; + totals: InvoiceTotals; + invoiceNumber?: string; +} From b2f24a187e27db7527233a6bacad86195691255b Mon Sep 17 00:00:00 2001 From: Bassgeta Date: Wed, 10 Sep 2025 13:34:54 +0200 Subject: [PATCH 08/37] feat: fetch conversion currencies dynamically --- app/components/payment-widget-wrapper.tsx | 1 + lib/currencies.ts | 41 ++++++++++++ .../components/currency-select.tsx | 63 ++++++++++++------- .../components/payment-modal.tsx | 6 +- .../default/payment-widget/payment-widget.tsx | 1 + registry/default/payment-widget/types.ts | 1 + 6 files changed, 91 insertions(+), 22 deletions(-) create mode 100644 lib/currencies.ts diff --git a/app/components/payment-widget-wrapper.tsx b/app/components/payment-widget-wrapper.tsx index 0b65eab..f24a2cf 100644 --- a/app/components/payment-widget-wrapper.tsx +++ b/app/components/payment-widget-wrapper.tsx @@ -28,6 +28,7 @@ export function PaymentWidgetWrapper({ config={{ walletConnectProjectId, rnApiKey, + network: "sepolia", }} invoiceInfo={{ companyInfo: { diff --git a/lib/currencies.ts b/lib/currencies.ts new file mode 100644 index 0000000..c9b1463 --- /dev/null +++ b/lib/currencies.ts @@ -0,0 +1,41 @@ +import { RN_API_URL } from "@/registry/default/payment-widget/constants"; + +export type ConversionCurrency = { + id: string; + symbol: string; + decimals: number; + address: string; + type: "ERC20" | "ETH" | "ISO4217"; + network: string; +}; + +export interface GetConversionCurrenciesResponse { + currencyId: string; + network: string; + conversionRoutes: ConversionCurrency[]; +} + +const DEFAULT_CURRENCY = "USD"; + +export const getConversionCurrencies = async ( + rnApiKey: string, + network: string, +): Promise => { + const response = await fetch( + `${RN_API_URL}/v2/currencies/${DEFAULT_CURRENCY}/conversion-routes?network=${network}`, + { + headers: { + "x-api-key": rnApiKey, + "Content-Type": "application/json", + }, + }, + ); + + if (!response.ok) { + throw new Error("Network response was not ok"); + } + + const data: GetConversionCurrenciesResponse = await response.json(); + + return data.conversionRoutes; +}; diff --git a/registry/default/payment-widget/components/currency-select.tsx b/registry/default/payment-widget/components/currency-select.tsx index bd8f996..5dfbc0e 100644 --- a/registry/default/payment-widget/components/currency-select.tsx +++ b/registry/default/payment-widget/components/currency-select.tsx @@ -3,39 +3,61 @@ import { useState } from "react"; import { Button } from "@/components/ui/button"; import { RadioGroup, RadioGroupItem } from "@/components/ui/radio-group"; - -interface Currency { - id: string; - name: string; - symbol: string; -} - -const currencies: Currency[] = [ - { id: "ETH-sepolia-sepolia", name: "Ethereum", symbol: "ETH" }, - { id: "FAU-sepolia", name: "Faucet Token", symbol: "FAU" }, - { id: "fUSDC-sepolia", name: "USD Coin", symbol: "USDC" }, -]; +import { useQuery } from "@tanstack/react-query"; +import { getConversionCurrencies } from "@/lib/currencies"; interface CurrencySelectProps { + rnApiKey: string; + network: string; onSubmit: (currency: string) => void; } -export function CurrencySelect({ onSubmit }: CurrencySelectProps) { - const [selectedCurrency, setSelectedCurrency] = useState(""); +export function CurrencySelect({ + onSubmit, + network, + rnApiKey, +}: CurrencySelectProps) { + const [selectedCurrency, setSelectedCurrency] = useState(null); + const { + data: conversionCurrencies, + isLoading, + isError, + refetch, + } = useQuery({ + queryKey: ["conversion-currencies"], + queryFn: async () => getConversionCurrencies(rnApiKey, network), + }); const handleSubmit = () => { - const currency = currencies.find((c) => c.id === selectedCurrency); - if (currency) { - onSubmit(currency.id); - } + if (selectedCurrency === null) return; + onSubmit(selectedCurrency); }; + if (isLoading) { + return
Loading currencies...
; + } + + if (isError) { + return ( +
+

+ Error loading currencies. Please try again later. +

+ +
+ ); + } + + if (!conversionCurrencies || conversionCurrencies.length === 0) { + return
No conversion currencies available.
; + } + return (

Select a currency

-
- {currencies.map((currency) => ( +
+ {conversionCurrencies.map((currency) => (

Install this component:

- npx shadcn add http://localhost:3000/r/payment-widget.json + npx shadcn add @requestnetwork/payment-widget
diff --git a/package.json b/package.json index 6a77efc..c8e6a74 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,8 @@ "start": "next start", "lint": "biome check", "format": "biome format --write", - "registry:build": "shadcn build" + "registry:build": "shadcn build", + "typecheck": "tsc --noEmit" }, "dependencies": { "@radix-ui/react-dialog": "^1.1.15", @@ -38,5 +39,8 @@ "shadcn": "^3.1.0", "tailwindcss": "^4", "typescript": "^5" + }, + "engines": { + "node": ">=18.18.0" } } diff --git a/public/r/payment-widget.json b/public/r/payment-widget.json index cdc9295..e160041 100644 --- a/public/r/payment-widget.json +++ b/public/r/payment-widget.json @@ -5,10 +5,10 @@ "title": "Payment Widget", "description": "A wallet-connected payment widget for Request Network using pure wagmi", "dependencies": [ - "wagmi@^2.12.29", - "viem@^2.21.53", - "@tanstack/react-query@^5.64.1", - "react-hook-form@^7.0.0", + "wagmi@^2.16.9", + "viem@^2.37.3", + "@tanstack/react-query@^5.86.0", + "react-hook-form@^7.62.0", "lucide-react@^0.542.0", "html2pdf.js@^0.12.0" ], @@ -22,13 +22,13 @@ "files": [ { "path": "registry/default/payment-widget/payment-widget.tsx", - "content": "\"use client\";\n\nimport { type PropsWithChildren, useState } from \"react\";\nimport { Button } from \"@/components/ui/button\";\nimport { ConnectionHandler } from \"./components/connection-handler\";\nimport { Web3Provider } from \"./context/web3-context\";\nimport { PaymentModal } from \"./components/payment-modal\";\nimport {\n PaymentWidgetProvider,\n usePaymentWidgetContext,\n} from \"./context/payment-widget-context\";\nimport type { PaymentWidgetProps } from \"./payment-widget.types\";\nimport { ICONS } from \"./constants\";\n\nfunction PaymentWidgetInner({ children }: PropsWithChildren) {\n const [isModalOpen, setIsModalOpen] = useState(false);\n const handleModalOpenChange = (open: boolean) => {\n setIsModalOpen(open);\n };\n\n const { walletAccount } = usePaymentWidgetContext();\n\n return (\n
\n setIsModalOpen(true)}\n variant=\"ghost\"\n className=\"p-0 h-auto bg-transparent hover:bg-transparent\"\n >\n {children || \"Pay with crypto\"}\n \n\n
\n {/** biome-ignore lint/performance/noImgElement: This is a ShadCN library, we can't enforce next syntax on everybody */}\n \n Powered by Request Network\n
\n\n {walletAccount !== undefined ? (\n \n ) : (\n \n }\n />\n )}\n
\n );\n}\n\nexport function PaymentWidget({\n amountInUsd,\n recipientWallet,\n paymentConfig,\n receiptInfo,\n onSuccess,\n onError,\n uiConfig,\n walletAccount,\n children,\n}: PaymentWidgetProps) {\n return (\n \n \n {children}\n \n \n );\n}\n", + "content": "\"use client\";\n\nimport { type PropsWithChildren, useState } from \"react\";\nimport { Button } from \"@/components/ui/button\";\nimport { ConnectionHandler } from \"./components/connection-handler\";\nimport { Web3Provider } from \"./context/web3-context\";\nimport { PaymentModal } from \"./components/payment-modal\";\nimport {\n PaymentWidgetProvider,\n usePaymentWidgetContext,\n} from \"./context/payment-widget-context\";\nimport type { PaymentWidgetProps } from \"./payment-widget.types\";\nimport { ICONS } from \"./constants\";\n\nfunction PaymentWidgetInner({ children }: PropsWithChildren) {\n const [isModalOpen, setIsModalOpen] = useState(false);\n const handleModalOpenChange = (open: boolean) => {\n setIsModalOpen(open);\n };\n\n const { walletAccount } = usePaymentWidgetContext();\n\n return (\n
\n setIsModalOpen(true)}\n variant=\"ghost\"\n className=\"p-0 h-auto bg-transparent hover:bg-transparent\"\n >\n {children || \"Pay with crypto\"}\n \n\n
\n {/** biome-ignore lint/performance/noImgElement: This is a ShadCN library, we can't enforce next syntax on everybody */}\n \n Powered by Request Network\n
\n\n {walletAccount !== undefined ? (\n \n ) : (\n \n }\n />\n )}\n
\n );\n}\n\nexport function PaymentWidget({\n amountInUsd,\n recipientWallet,\n paymentConfig,\n receiptInfo,\n onSuccess,\n onError,\n uiConfig,\n walletAccount,\n children,\n}: PaymentWidgetProps) {\n if (!paymentConfig.rnApiClientId || paymentConfig.rnApiClientId === \"\") {\n console.error(\"PaymentWidget: rnApiClientId is required in paymentConfig\");\n\n return
Error: rnApiClientId is required
;\n }\n\n return (\n \n \n {children}\n \n \n );\n}\n", "type": "registry:component", "target": "components/payment-widget/payment-widget.tsx" }, { "path": "registry/default/payment-widget/context/payment-widget-context.tsx", - "content": "\"use client\";\n\nimport { createContext, useContext, type ReactNode } from \"react\";\nimport { useAccount } from \"wagmi\";\nimport type { ReceiptInfo, FeeInfo, PaymentError } from \"../types/index\";\nimport type { TransactionReceipt, WalletClient } from \"viem\";\nimport type { PaymentWidgetProps } from \"../payment-widget.types\";\n\nexport interface PaymentWidgetContextValue {\n amountInUsd: string;\n recipientWallet: string;\n\n walletAccount?: WalletClient;\n connectedWalletAddress?: string;\n isWalletOverride: boolean;\n\n paymentConfig: {\n rnApiClientId: string;\n network:\n | \"arbitrum\"\n | \"base\"\n | \"mainnet\"\n | \"optimism\"\n | \"polygon\"\n | \"sepolia\";\n feeInfo?: FeeInfo;\n supportedCurrencies?: string[];\n };\n\n uiConfig: {\n showRequestScanUrl: boolean;\n showReceiptDownload: boolean;\n };\n\n receiptInfo: ReceiptInfo;\n\n onSuccess?: (\n requestId: string,\n transactionReceipts: TransactionReceipt[],\n ) => void | Promise;\n onError?: (error: PaymentError) => void | Promise;\n}\n\nconst PaymentWidgetContext = createContext(\n null,\n);\n\ninterface PaymentWidgetProviderProps {\n children: ReactNode;\n amountInUsd: string;\n recipientWallet: string;\n walletAccount?: WalletClient;\n paymentConfig: Omit<\n PaymentWidgetProps[\"paymentConfig\"],\n \"walletConnectProjectId\"\n >;\n uiConfig?: PaymentWidgetProps[\"uiConfig\"];\n receiptInfo: ReceiptInfo;\n onSuccess?: (\n requestId: string,\n transactionReceipts: TransactionReceipt[],\n ) => void | Promise;\n onError?: (error: PaymentError) => void | Promise;\n}\n\nexport function PaymentWidgetProvider({\n children,\n amountInUsd,\n recipientWallet,\n walletAccount,\n paymentConfig,\n uiConfig,\n receiptInfo,\n onSuccess,\n onError,\n}: PaymentWidgetProviderProps) {\n const { address } = useAccount();\n\n const isWalletOverride = walletAccount !== undefined;\n const connectedWalletAddress = walletAccount\n ? walletAccount.account?.address\n : address;\n\n const contextValue: PaymentWidgetContextValue = {\n amountInUsd,\n recipientWallet,\n walletAccount,\n connectedWalletAddress,\n isWalletOverride,\n paymentConfig: {\n rnApiClientId: paymentConfig.rnApiClientId,\n network: paymentConfig.network,\n feeInfo: paymentConfig.feeInfo,\n supportedCurrencies: paymentConfig.supportedCurrencies,\n },\n uiConfig: {\n showReceiptDownload: uiConfig?.showReceiptDownload || true,\n showRequestScanUrl: uiConfig?.showRequestScanUrl || true,\n },\n receiptInfo,\n onSuccess,\n onError,\n };\n\n return (\n \n {children}\n \n );\n}\n\nexport function usePaymentWidgetContext(): PaymentWidgetContextValue {\n const context = useContext(PaymentWidgetContext);\n\n if (!context) {\n throw new Error(\n \"usePaymentWidgetContext must be used within a PaymentWidgetProvider\",\n );\n }\n\n return context;\n}\n", + "content": "\"use client\";\n\nimport { createContext, useContext, useMemo, type ReactNode } from \"react\";\nimport { useAccount } from \"wagmi\";\nimport type { ReceiptInfo, FeeInfo, PaymentError } from \"../types/index\";\nimport type { TransactionReceipt, WalletClient } from \"viem\";\nimport type { PaymentWidgetProps } from \"../payment-widget.types\";\n\nexport interface PaymentWidgetContextValue {\n amountInUsd: string;\n recipientWallet: string;\n\n walletAccount?: WalletClient;\n connectedWalletAddress?: string;\n isWalletOverride: boolean;\n\n paymentConfig: {\n rnApiClientId: string;\n network:\n | \"arbitrum\"\n | \"base\"\n | \"mainnet\"\n | \"optimism\"\n | \"polygon\"\n | \"sepolia\";\n feeInfo?: FeeInfo;\n supportedCurrencies?: string[];\n };\n\n uiConfig: {\n showRequestScanUrl: boolean;\n showReceiptDownload: boolean;\n };\n\n receiptInfo: ReceiptInfo;\n\n onSuccess?: (\n requestId: string,\n transactionReceipts: TransactionReceipt[],\n ) => void | Promise;\n onError?: (error: PaymentError) => void | Promise;\n}\n\nconst PaymentWidgetContext = createContext(\n null,\n);\n\ninterface PaymentWidgetProviderProps {\n children: ReactNode;\n amountInUsd: string;\n recipientWallet: string;\n walletAccount?: WalletClient;\n paymentConfig: Omit<\n PaymentWidgetProps[\"paymentConfig\"],\n \"walletConnectProjectId\"\n >;\n uiConfig?: PaymentWidgetProps[\"uiConfig\"];\n receiptInfo: ReceiptInfo;\n onSuccess?: (\n requestId: string,\n transactionReceipts: TransactionReceipt[],\n ) => void | Promise;\n onError?: (error: PaymentError) => void | Promise;\n}\n\nexport function PaymentWidgetProvider({\n children,\n amountInUsd,\n recipientWallet,\n walletAccount,\n paymentConfig,\n uiConfig,\n receiptInfo,\n onSuccess,\n onError,\n}: PaymentWidgetProviderProps) {\n const { address } = useAccount();\n\n const isWalletOverride = walletAccount !== undefined;\n const connectedWalletAddress = walletAccount\n ? walletAccount.account?.address\n : address;\n\n const contextValue: PaymentWidgetContextValue = useMemo(\n () => ({\n amountInUsd,\n recipientWallet,\n walletAccount,\n connectedWalletAddress,\n isWalletOverride,\n paymentConfig: {\n rnApiClientId: paymentConfig.rnApiClientId,\n network: paymentConfig.network,\n feeInfo: paymentConfig.feeInfo,\n supportedCurrencies: paymentConfig.supportedCurrencies,\n },\n uiConfig: {\n showReceiptDownload: uiConfig?.showReceiptDownload ?? true,\n showRequestScanUrl: uiConfig?.showRequestScanUrl ?? true,\n },\n receiptInfo,\n onSuccess,\n onError,\n }),\n [\n amountInUsd,\n recipientWallet,\n walletAccount,\n connectedWalletAddress,\n isWalletOverride,\n paymentConfig.rnApiClientId,\n paymentConfig.network,\n paymentConfig.feeInfo,\n paymentConfig.supportedCurrencies,\n uiConfig?.showReceiptDownload,\n uiConfig?.showRequestScanUrl,\n receiptInfo,\n onSuccess,\n onError,\n ],\n );\n\n return (\n \n {children}\n \n );\n}\n\nexport function usePaymentWidgetContext(): PaymentWidgetContextValue {\n const context = useContext(PaymentWidgetContext);\n\n if (!context) {\n throw new Error(\n \"usePaymentWidgetContext must be used within a PaymentWidgetProvider\",\n );\n }\n\n return context;\n}\n", "type": "registry:component", "target": "components/payment-widget/context/payment-widget-context.tsx" }, @@ -46,7 +46,7 @@ }, { "path": "registry/default/payment-widget/components/payment-modal.tsx", - "content": "\"use client\";\n\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n} from \"@/components/ui/dialog\";\nimport { useState } from \"react\";\nimport { CurrencySelect } from \"./currency-select\";\nimport { BuyerInfoForm } from \"./buyer-info-form\";\nimport { PaymentConfirmation } from \"./payment-confirmation\";\nimport { PaymentSuccess } from \"./payment-success\";\nimport { DisconnectWallet } from \"./disconnect-wallet\";\nimport { usePaymentWidgetContext } from \"../context/payment-widget-context\";\nimport type { BuyerInfo } from \"../types/index\";\nimport type { ConversionCurrency } from \"../utils/currencies\";\nimport { TransactionReceipt } from \"viem\";\n\ninterface PaymentModalProps {\n isOpen: boolean;\n handleModalOpenChange: (open: boolean) => void;\n}\n\nexport function PaymentModal({\n isOpen,\n handleModalOpenChange,\n}: PaymentModalProps) {\n const { isWalletOverride, receiptInfo, onSuccess } =\n usePaymentWidgetContext();\n\n const [activeStep, setActiveStep] = useState<\n | \"currency-select\"\n | \"buyer-info\"\n | \"payment-confirmation\"\n | \"payment-success\"\n >(\"currency-select\");\n const [selectedCurrency, setSelectedCurrency] =\n useState(null);\n const [buyerInfo, setBuyerInfo] = useState(\n receiptInfo.buyerInfo || undefined,\n );\n const [requestId, setRequestId] = useState(\"\");\n\n const handleCurrencySelect = (currency: ConversionCurrency) => {\n setSelectedCurrency(currency);\n setActiveStep(\"buyer-info\");\n };\n\n const handleBuyerInfoSubmit = (data: BuyerInfo) => {\n setBuyerInfo(data);\n setActiveStep(\"payment-confirmation\");\n };\n\n const handlePaymentSuccess = async (\n requestId: string,\n transactionReceipts: TransactionReceipt[],\n ) => {\n setRequestId(requestId);\n setActiveStep(\"payment-success\");\n await onSuccess?.(requestId, transactionReceipts);\n };\n\n const reset = () => {\n setActiveStep(\"currency-select\");\n setSelectedCurrency(null);\n setBuyerInfo(receiptInfo.buyerInfo || undefined);\n setRequestId(\"\");\n };\n\n return (\n {\n // reset modal state when closing from success step\n if (!isOpen && activeStep === \"payment-success\") {\n reset();\n }\n handleModalOpenChange(isOpen);\n }}\n >\n \n \n Payment\n \n Pay with crypto using Request Network\n \n \n\n {activeStep !== \"payment-success\" && !isWalletOverride && (\n \n )}\n\n {activeStep === \"currency-select\" && (\n \n )}\n\n {activeStep === \"buyer-info\" && (\n setActiveStep(\"currency-select\")}\n onSubmit={handleBuyerInfoSubmit}\n />\n )}\n\n {activeStep === \"payment-confirmation\" &&\n selectedCurrency &&\n buyerInfo && (\n setActiveStep(\"buyer-info\")}\n handlePaymentSuccess={handlePaymentSuccess}\n />\n )}\n\n {activeStep === \"payment-success\" && selectedCurrency && buyerInfo && (\n \n )}\n \n \n );\n}\n", + "content": "\"use client\";\n\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n} from \"@/components/ui/dialog\";\nimport { useState } from \"react\";\nimport { CurrencySelect } from \"./currency-select\";\nimport { BuyerInfoForm } from \"./buyer-info-form\";\nimport { PaymentConfirmation } from \"./payment-confirmation\";\nimport { PaymentSuccess } from \"./payment-success\";\nimport { DisconnectWallet } from \"./disconnect-wallet\";\nimport { usePaymentWidgetContext } from \"../context/payment-widget-context\";\nimport type { BuyerInfo } from \"../types/index\";\nimport type { ConversionCurrency } from \"../utils/currencies\";\nimport type { TransactionReceipt } from \"viem\";\n\ninterface PaymentModalProps {\n isOpen: boolean;\n handleModalOpenChange: (open: boolean) => void;\n}\n\nexport function PaymentModal({\n isOpen,\n handleModalOpenChange,\n}: PaymentModalProps) {\n const { isWalletOverride, receiptInfo, onSuccess } =\n usePaymentWidgetContext();\n\n const [activeStep, setActiveStep] = useState<\n | \"currency-select\"\n | \"buyer-info\"\n | \"payment-confirmation\"\n | \"payment-success\"\n >(\"currency-select\");\n const [selectedCurrency, setSelectedCurrency] =\n useState(null);\n const [buyerInfo, setBuyerInfo] = useState(\n receiptInfo.buyerInfo || undefined,\n );\n const [requestId, setRequestId] = useState(\"\");\n\n const handleCurrencySelect = (currency: ConversionCurrency) => {\n setSelectedCurrency(currency);\n setActiveStep(\"buyer-info\");\n };\n\n const handleBuyerInfoSubmit = (data: BuyerInfo) => {\n setBuyerInfo(data);\n setActiveStep(\"payment-confirmation\");\n };\n\n const handlePaymentSuccess = async (\n requestId: string,\n transactionReceipts: TransactionReceipt[],\n ) => {\n setRequestId(requestId);\n setActiveStep(\"payment-success\");\n await onSuccess?.(requestId, transactionReceipts);\n };\n\n const reset = () => {\n setActiveStep(\"currency-select\");\n setSelectedCurrency(null);\n setBuyerInfo(receiptInfo.buyerInfo || undefined);\n setRequestId(\"\");\n };\n\n return (\n {\n // reset modal state when closing from success step\n if (!isOpen && activeStep === \"payment-success\") {\n reset();\n }\n handleModalOpenChange(isOpen);\n }}\n >\n \n \n Payment\n \n Pay with crypto using Request Network\n \n \n\n {activeStep !== \"payment-success\" && !isWalletOverride && (\n \n )}\n\n {activeStep === \"currency-select\" && (\n \n )}\n\n {activeStep === \"buyer-info\" && (\n setActiveStep(\"currency-select\")}\n onSubmit={handleBuyerInfoSubmit}\n />\n )}\n\n {activeStep === \"payment-confirmation\" &&\n selectedCurrency &&\n buyerInfo && (\n setActiveStep(\"buyer-info\")}\n handlePaymentSuccess={handlePaymentSuccess}\n />\n )}\n\n {activeStep === \"payment-success\" && selectedCurrency && buyerInfo && (\n \n )}\n \n \n );\n}\n", "type": "registry:component", "target": "components/payment-widget/components/payment-modal.tsx" }, @@ -64,7 +64,7 @@ }, { "path": "registry/default/payment-widget/components/payment-confirmation.tsx", - "content": "\"use client\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { ArrowRight, AlertCircle } from \"lucide-react\";\nimport { usePayment } from \"../hooks/use-payment\";\nimport {\n getSymbolOverride,\n type ConversionCurrency,\n} from \"../utils/currencies\";\nimport { usePaymentWidgetContext } from \"../context/payment-widget-context\";\nimport type { BuyerInfo, PaymentError } from \"../types/index\";\nimport { useState } from \"react\";\nimport type { TransactionReceipt } from \"viem\";\n\ninterface PaymentConfirmationProps {\n selectedCurrency: ConversionCurrency;\n buyerInfo: BuyerInfo;\n onBack: () => void;\n handlePaymentSuccess: (\n requestId: string,\n transactionReceipts: TransactionReceipt[],\n ) => void;\n}\n\nexport function PaymentConfirmation({\n buyerInfo,\n selectedCurrency,\n onBack,\n handlePaymentSuccess,\n}: PaymentConfirmationProps) {\n const {\n amountInUsd,\n recipientWallet,\n connectedWalletAddress,\n paymentConfig: { rnApiClientId, feeInfo },\n receiptInfo: { companyInfo: { name: companyName } = {} },\n onError,\n } = usePaymentWidgetContext();\n const { isExecuting, executePayment } = usePayment();\n const [localError, setLocalError] = useState(null);\n\n const handleExecutePayment = async (e: React.FormEvent) => {\n e.preventDefault();\n\n if (!connectedWalletAddress) return;\n\n setLocalError(null);\n\n try {\n const { requestId, transactionReceipts } = await executePayment(\n rnApiClientId,\n {\n payerWallet: connectedWalletAddress,\n amountInUsd,\n recipientWallet,\n paymentCurrency: selectedCurrency.id,\n feeInfo,\n customerInfo: {\n email: buyerInfo.email,\n firstName: buyerInfo.firstName,\n lastName: buyerInfo.lastName,\n address: buyerInfo.address\n ? {\n street: buyerInfo.address.street,\n city: buyerInfo.address.city,\n state: buyerInfo.address.state,\n postalCode: buyerInfo.address.postalCode,\n country: buyerInfo.address.country,\n }\n : undefined,\n },\n },\n );\n\n handlePaymentSuccess(requestId, transactionReceipts);\n } catch (error) {\n const paymentError = error as PaymentError;\n\n let errorMessage = \"Payment failed. Please try again.\";\n\n if (paymentError.type === \"wallet\") {\n errorMessage =\n \"Wallet connection error. Please check your wallet and try again.\";\n } else if (paymentError.type === \"transaction\") {\n errorMessage =\n \"Transaction failed. Please check your balance and network connection.\";\n } else if (paymentError.type === \"api\") {\n errorMessage =\n paymentError.error?.message ||\n \"Payment service error. Please try again.\";\n } else if (paymentError.error?.message) {\n errorMessage = paymentError.error.message;\n }\n setLocalError(errorMessage);\n\n onError?.(paymentError);\n }\n };\n\n return (\n
\n

Payment Confirmation

\n\n
\n {/* Payment Currency (From) */}\n
\n
\n {getSymbolOverride(selectedCurrency.symbol)}\n
\n
\n
From
\n
\n {selectedCurrency.name}\n
\n
\n
\n\n \n\n
\n
\n USD\n
\n
\n
To
\n
\n ${amountInUsd}\n
\n
\n
\n
\n\n
\n

Payment To

\n
\n
\n {companyName}\n
\n
\n
\n Wallet Address\n
\n
\n {recipientWallet}\n
\n
\n
\n
\n\n {localError && (\n
\n
\n \n
\n

\n Payment Error\n

\n

{localError}

\n
\n
\n
\n )}\n\n
\n \n Back\n \n \n {isExecuting ? \"Processing...\" : \"Pay\"}\n \n
\n
\n );\n}\n", + "content": "\"use client\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { ArrowRight, AlertCircle } from \"lucide-react\";\nimport { usePayment } from \"../hooks/use-payment\";\nimport {\n getSymbolOverride,\n type ConversionCurrency,\n} from \"../utils/currencies\";\nimport { usePaymentWidgetContext } from \"../context/payment-widget-context\";\nimport type { BuyerInfo, PaymentError } from \"../types/index\";\nimport { useState } from \"react\";\nimport type { TransactionReceipt } from \"viem\";\n\ninterface PaymentConfirmationProps {\n selectedCurrency: ConversionCurrency;\n buyerInfo: BuyerInfo;\n onBack: () => void;\n handlePaymentSuccess: (\n requestId: string,\n transactionReceipts: TransactionReceipt[],\n ) => void;\n}\n\nexport function PaymentConfirmation({\n buyerInfo,\n selectedCurrency,\n onBack,\n handlePaymentSuccess,\n}: PaymentConfirmationProps) {\n const {\n amountInUsd,\n recipientWallet,\n connectedWalletAddress,\n paymentConfig: { rnApiClientId, feeInfo },\n receiptInfo: { companyInfo: { name: companyName } = {} },\n onError,\n walletAccount,\n } = usePaymentWidgetContext();\n const { isExecuting, executePayment } = usePayment(walletAccount);\n const [localError, setLocalError] = useState(null);\n\n const handleExecutePayment = async (e: React.FormEvent) => {\n e.preventDefault();\n\n if (!connectedWalletAddress) return;\n\n setLocalError(null);\n\n try {\n const { requestId, transactionReceipts } = await executePayment(\n rnApiClientId,\n {\n payerWallet: connectedWalletAddress,\n amountInUsd,\n recipientWallet,\n paymentCurrency: selectedCurrency.id,\n feeInfo,\n customerInfo: {\n email: buyerInfo.email,\n firstName: buyerInfo.firstName,\n lastName: buyerInfo.lastName,\n address: buyerInfo.address\n ? {\n street: buyerInfo.address.street,\n city: buyerInfo.address.city,\n state: buyerInfo.address.state,\n postalCode: buyerInfo.address.postalCode,\n country: buyerInfo.address.country,\n }\n : undefined,\n },\n },\n );\n\n handlePaymentSuccess(requestId, transactionReceipts);\n } catch (error) {\n const paymentError = error as PaymentError;\n\n let errorMessage = \"Payment failed. Please try again.\";\n\n if (paymentError.type === \"wallet\") {\n errorMessage =\n \"Wallet connection error. Please check your wallet and try again.\";\n } else if (paymentError.type === \"transaction\") {\n errorMessage =\n \"Transaction failed. Please check your balance and network connection.\";\n } else if (paymentError.type === \"api\") {\n errorMessage =\n paymentError.error?.message ||\n \"Payment service error. Please try again.\";\n } else if (paymentError.error?.message) {\n errorMessage = paymentError.error.message;\n }\n setLocalError(errorMessage);\n\n onError?.(paymentError);\n }\n };\n\n return (\n
\n

Payment Confirmation

\n\n
\n {/* Payment Currency (From) */}\n
\n
\n {getSymbolOverride(selectedCurrency.symbol)}\n
\n
\n
From
\n
\n {selectedCurrency.name}\n
\n
\n
\n\n \n\n
\n
\n USD\n
\n
\n
To
\n
\n ${amountInUsd}\n
\n
\n
\n
\n\n
\n

Payment To

\n
\n
\n {companyName}\n
\n
\n
\n Wallet Address\n
\n
\n {recipientWallet}\n
\n
\n
\n
\n\n {localError && (\n
\n
\n \n
\n

\n Payment Error\n

\n

{localError}

\n
\n
\n
\n )}\n\n
\n \n Back\n \n \n {isExecuting ? \"Processing...\" : \"Pay\"}\n \n
\n
\n );\n}\n", "type": "registry:component", "target": "components/payment-widget/components/payment-confirmation.tsx" }, @@ -76,7 +76,7 @@ }, { "path": "registry/default/payment-widget/components/payment-success.tsx", - "content": "\"use client\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { CheckCircle, ExternalLink, Download } from \"lucide-react\";\nimport {\n createReceipt,\n generateReceiptNumber,\n type CreateReceiptParams,\n} from \"../utils/receipt\";\nimport { useRef } from \"react\";\nimport { ReceiptPDFTemplate } from \"../components/receipt/receipt-template\";\nimport { usePaymentWidgetContext } from \"../context/payment-widget-context\";\nimport type { BuyerInfo } from \"../types/index\";\nimport type { ConversionCurrency } from \"../utils/currencies\";\n\ninterface PaymentSuccessProps {\n requestId: string;\n selectedCurrency: ConversionCurrency;\n buyerInfo: BuyerInfo;\n}\n\nexport function PaymentSuccess({\n requestId,\n selectedCurrency,\n buyerInfo,\n}: PaymentSuccessProps) {\n const {\n amountInUsd,\n recipientWallet,\n connectedWalletAddress,\n receiptInfo,\n uiConfig,\n } = usePaymentWidgetContext();\n const receiptRef = useRef(null);\n\n const receiptParams: CreateReceiptParams = {\n company: {\n ...receiptInfo.companyInfo,\n walletAddress: recipientWallet,\n },\n buyer: {\n ...buyerInfo,\n walletAddress: connectedWalletAddress || \"\",\n },\n payment: {\n chain: \"ethereum\",\n currency: selectedCurrency.symbol,\n exchangeRate: 1,\n transactionHash: \"\",\n },\n items: receiptInfo.items,\n totals: receiptInfo.totals,\n metadata: {\n receiptNumber: receiptInfo?.receiptNumber\n ? receiptInfo.receiptNumber\n : generateReceiptNumber(),\n notes: `Payment processed through Request Network for ${amountInUsd} USD`,\n },\n };\n\n const handleDownloadReceipt = async () => {\n try {\n const element = receiptRef.current;\n if (!element) {\n console.error(\"Receipt element not found\");\n return;\n }\n\n const html2pdf = (await import(\"html2pdf.js\")).default;\n\n html2pdf()\n .set({\n margin: 1,\n filename: `receipt-${receiptParams.metadata?.receiptNumber || \"payment\"}.pdf`,\n image: { type: \"jpeg\", quality: 0.98 },\n html2canvas: { scale: 2 },\n jsPDF: { unit: \"in\", format: \"a4\", orientation: \"portrait\" },\n })\n .from(element)\n .save();\n } catch (error) {\n console.error(\"Failed to download receipt:\", error);\n alert(\"Failed to download receipt. Please try again.\");\n }\n };\n\n const requestScanUrl = `https://scan.request.network/request/${requestId}`;\n\n return (\n
\n
\n \n
\n

\n Payment Completed!\n

\n

\n Your payment has been processed successfully.\n

\n
\n
\n\n
\n {uiConfig.showReceiptDownload && (\n <>\n \n \n
\n \n
\n
\n \n )}\n {uiConfig.showRequestScanUrl && (\n \n )}\n
\n
\n );\n}\n", + "content": "\"use client\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { CheckCircle, ExternalLink, Download } from \"lucide-react\";\nimport {\n createReceipt,\n generateReceiptNumber,\n type CreateReceiptParams,\n} from \"../utils/receipt\";\nimport { useRef } from \"react\";\nimport { ReceiptPDFTemplate } from \"../components/receipt/receipt-template\";\nimport { usePaymentWidgetContext } from \"../context/payment-widget-context\";\nimport type { BuyerInfo } from \"../types/index\";\nimport type { ConversionCurrency } from \"../utils/currencies\";\n\ninterface PaymentSuccessProps {\n requestId: string;\n selectedCurrency: ConversionCurrency;\n buyerInfo: BuyerInfo;\n}\n\nexport function PaymentSuccess({\n requestId,\n selectedCurrency,\n buyerInfo,\n}: PaymentSuccessProps) {\n const {\n amountInUsd,\n recipientWallet,\n connectedWalletAddress,\n receiptInfo,\n uiConfig,\n paymentConfig: { network },\n } = usePaymentWidgetContext();\n const receiptRef = useRef(null);\n\n const receiptParams: CreateReceiptParams = {\n company: {\n ...receiptInfo.companyInfo,\n walletAddress: recipientWallet,\n },\n buyer: {\n ...buyerInfo,\n walletAddress: connectedWalletAddress || \"\",\n },\n payment: {\n chain: network,\n currency: selectedCurrency.symbol,\n exchangeRate: 1,\n transactionHash: \"\",\n },\n items: receiptInfo.items,\n totals: receiptInfo.totals,\n metadata: {\n receiptNumber: receiptInfo?.receiptNumber\n ? receiptInfo.receiptNumber\n : generateReceiptNumber(),\n notes: `Payment processed through Request Network for ${amountInUsd} USD`,\n },\n };\n\n const handleDownloadReceipt = async () => {\n try {\n const element = receiptRef.current;\n if (!element) {\n console.error(\"Receipt element not found\");\n return;\n }\n\n const html2pdf = (await import(\"html2pdf.js\")).default;\n\n html2pdf()\n .set({\n margin: 1,\n filename: `receipt-${receiptParams.metadata?.receiptNumber || \"payment\"}.pdf`,\n image: { type: \"jpeg\", quality: 0.98 },\n html2canvas: { scale: 2 },\n jsPDF: { unit: \"in\", format: \"a4\", orientation: \"portrait\" },\n })\n .from(element)\n .save();\n } catch (error) {\n console.error(\"Failed to download receipt:\", error);\n alert(\"Failed to download receipt. Please try again.\");\n }\n };\n\n const requestScanUrl = `https://scan.request.network/request/${requestId}`;\n\n return (\n
\n
\n \n
\n

\n Payment Completed!\n

\n

\n Your payment has been processed successfully.\n

\n
\n
\n\n
\n {uiConfig.showReceiptDownload && (\n <>\n \n \n
\n \n
\n
\n \n )}\n {uiConfig.showRequestScanUrl && (\n \n )}\n
\n
\n );\n}\n", "type": "registry:component", "target": "components/payment-widget/components/payment-success.tsx" }, @@ -88,7 +88,7 @@ }, { "path": "registry/default/payment-widget/constants.ts", - "content": "export const RN_API_URL = \"https://api.request.network\";\nexport const ICONS = {\n metamask:\n \"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzUiIGhlaWdodD0iMzQiIHZpZXdCb3g9IjAgMCAzNSAzNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTMyLjcwNzcgMzIuNzUyMkwyNS4xNjg4IDMwLjUxNzRMMTkuNDgzMyAzMy45MDA4TDE1LjUxNjcgMzMuODk5MUw5LjgyNzkzIDMwLjUxNzRMMi4yOTIyNSAzMi43NTIyTDAgMjUuMDQ4OUwyLjI5MjI1IDE2LjQ5OTNMMCA5LjI3MDk0TDIuMjkyMjUgMC4zMTIyNTZMMTQuMDY3NCA3LjMxNTU0SDIwLjkzMjZMMzIuNzA3NyAwLjMxMjI1NkwzNSA5LjI3MDk0TDMyLjcwNzcgMTYuNDk5M0wzNSAyNS4wNDg5TDMyLjcwNzcgMzIuNzUyMloiIGZpbGw9IiNGRjVDMTYiLz4KPHBhdGggZD0iTTIuMjkzOTUgMC4zMTIyNTZMMTQuMDY5MSA3LjMyMDQ3TDEzLjYwMDggMTIuMTMwMUwyLjI5Mzk1IDAuMzEyMjU2WiIgZmlsbD0iI0ZGNUMxNiIvPgo8cGF0aCBkPSJNOS44Mjk1OSAyNS4wNTIyTDE1LjAxMDYgMjguOTgxMUw5LjgyOTU5IDMwLjUxNzVWMjUuMDUyMloiIGZpbGw9IiNGRjVDMTYiLz4KPHBhdGggZD0iTTE0LjU5NjYgMTguNTU2NUwxMy42MDA5IDEyLjEzMzNMNy4yMjY5MiAxNi41MDA5TDcuMjIzNjMgMTYuNDk5M1YxNi41MDI1TDcuMjQzMzUgMjAuOTk4M0w5LjgyODA5IDE4LjU1NjVIOS44Mjk3NEgxNC41OTY2WiIgZmlsbD0iI0ZGNUMxNiIvPgo8cGF0aCBkPSJNMzIuNzA3NyAwLjMxMjI1NkwyMC45MzI2IDcuMzIwNDdMMjEuMzk5MyAxMi4xMzAxTDMyLjcwNzcgMC4zMTIyNTZaIiBmaWxsPSIjRkY1QzE2Ii8+CjxwYXRoIGQ9Ik0yNS4xNzIyIDI1LjA1MjJMMTkuOTkxMiAyOC45ODExTDI1LjE3MjIgMzAuNTE3NVYyNS4wNTIyWiIgZmlsbD0iI0ZGNUMxNiIvPgo8cGF0aCBkPSJNMjcuNzc2NiAxNi41MDI1SDI3Ljc3ODNIMjcuNzc2NlYxNi40OTkzTDI3Ljc3NSAxNi41MDA5TDIxLjQwMSAxMi4xMzMzTDIwLjQwNTMgMTguNTU2NUgyNS4xNzIyTDI3Ljc1ODYgMjAuOTk4M0wyNy43NzY2IDE2LjUwMjVaIiBmaWxsPSIjRkY1QzE2Ii8+CjxwYXRoIGQ9Ik05LjgyNzkzIDMwLjUxNzVMMi4yOTIyNSAzMi43NTIyTDAgMjUuMDUyMkg5LjgyNzkzVjMwLjUxNzVaIiBmaWxsPSIjRTM0ODA3Ii8+CjxwYXRoIGQ9Ik0xNC41OTQ3IDE4LjU1NDlMMTYuMDM0MSAyNy44NDA2TDE0LjAzOTMgMjIuNjc3N0w3LjIzOTc1IDIwLjk5ODRMOS44MjYxMyAxOC41NTQ5SDE0LjU5M0gxNC41OTQ3WiIgZmlsbD0iI0UzNDgwNyIvPgo8cGF0aCBkPSJNMjUuMTcyMSAzMC41MTc1TDMyLjcwNzggMzIuNzUyMkwzNS4wMDAxIDI1LjA1MjJIMjUuMTcyMVYzMC41MTc1WiIgZmlsbD0iI0UzNDgwNyIvPgo8cGF0aCBkPSJNMjAuNDA1MyAxOC41NTQ5TDE4Ljk2NTggMjcuODQwNkwyMC45NjA3IDIyLjY3NzdMMjcuNzYwMiAyMC45OTg0TDI1LjE3MjIgMTguNTU0OUgyMC40MDUzWiIgZmlsbD0iI0UzNDgwNyIvPgo8cGF0aCBkPSJNMCAyNS4wNDg4TDIuMjkyMjUgMTYuNDk5M0g3LjIyMTgzTDcuMjM5OTEgMjAuOTk2N0wxNC4wMzk0IDIyLjY3NkwxNi4wMzQzIDI3LjgzODlMMTUuMDA4OSAyOC45NzZMOS44Mjc5MyAyNS4wNDcySDBWMjUuMDQ4OFoiIGZpbGw9IiNGRjhENUQiLz4KPHBhdGggZD0iTTM1LjAwMDEgMjUuMDQ4OEwzMi43MDc4IDE2LjQ5OTNIMjcuNzc4M0wyNy43NjAyIDIwLjk5NjdMMjAuOTYwNyAyMi42NzZMMTguOTY1OCAyNy44Mzg5TDE5Ljk5MTIgMjguOTc2TDI1LjE3MjIgMjUuMDQ3MkgzNS4wMDAxVjI1LjA0ODhaIiBmaWxsPSIjRkY4RDVEIi8+CjxwYXRoIGQ9Ik0yMC45MzI1IDcuMzE1NDNIMTcuNDk5OUgxNC4wNjczTDEzLjYwMDYgMTIuMTI1MUwxNi4wMzQyIDI3LjgzNEgxOC45NjU2TDIxLjQwMDggMTIuMTI1MUwyMC45MzI1IDcuMzE1NDNaIiBmaWxsPSIjRkY4RDVEIi8+CjxwYXRoIGQ9Ik0yLjI5MjI1IDAuMzEyMjU2TDAgOS4yNzA5NEwyLjI5MjI1IDE2LjQ5OTNINy4yMjE4M0wxMy41OTkxIDEyLjEzMDFMMi4yOTIyNSAwLjMxMjI1NloiIGZpbGw9IiM2NjE4MDAiLz4KPHBhdGggZD0iTTEzLjE3IDIwLjQxOTlIMTAuOTM2OUw5LjcyMDk1IDIxLjYwNjJMMTQuMDQwOSAyMi42NzI3TDEzLjE3IDIwLjQxODJWMjAuNDE5OVoiIGZpbGw9IiM2NjE4MDAiLz4KPHBhdGggZD0iTTMyLjcwNzcgMC4zMTIyNTZMMzQuOTk5OSA5LjI3MDk0TDMyLjcwNzcgMTYuNDk5M0gyNy43NzgxTDIxLjQwMDkgMTIuMTMwMUwzMi43MDc3IDAuMzEyMjU2WiIgZmlsbD0iIzY2MTgwMCIvPgo8cGF0aCBkPSJNMjEuODMzIDIwLjQxOTlIMjQuMDY5NEwyNS4yODUzIDIxLjYwNzlMMjAuOTYwNCAyMi42NzZMMjEuODMzIDIwLjQxODJWMjAuNDE5OVoiIGZpbGw9IiM2NjE4MDAiLz4KPHBhdGggZD0iTTE5LjQ4MTcgMzAuODM2MkwxOS45OTExIDI4Ljk3OTRMMTguOTY1OCAyNy44NDIzSDE2LjAzMjdMMTUuMDA3MyAyOC45Nzk0TDE1LjUxNjcgMzAuODM2MiIgZmlsbD0iIzY2MTgwMCIvPgo8cGF0aCBkPSJNMTkuNDgxNiAzMC44MzU5VjMzLjkwMjFIMTUuNTE2NlYzMC44MzU5SDE5LjQ4MTZaIiBmaWxsPSIjQzBDNENEIi8+CjxwYXRoIGQ9Ik05LjgyOTU5IDMwLjUxNDJMMTUuNTIgMzMuOTAwOFYzMC44MzQ2TDE1LjAxMDYgMjguOTc3OEw5LjgyOTU5IDMwLjUxNDJaIiBmaWxsPSIjRTdFQkY2Ii8+CjxwYXRoIGQ9Ik0yNS4xNzIxIDMwLjUxNDJMMTkuNDgxNyAzMy45MDA4VjMwLjgzNDZMMTkuOTkxMSAyOC45Nzc4TDI1LjE3MjEgMzAuNTE0MloiIGZpbGw9IiNFN0VCRjYiLz4KPC9zdmc+\",\n walletConnect:\n \"data:image/webp;base64,UklGRoQFAABXRUJQVlA4IHgFAAAQHwCdASp4AHgAPkkkjUSioiEVDGQYKASEsQBrTdi9V/GD8mflPpT9Q+7PEdo66nv5H8k/qfWK8wD+Afwn/AfxP+d9gDzAfar7wHoY/4vqAf6DqAOfE9iL+2/679o/Zd9QD//+oB//5lWRX6GuwHaY3eTHXFDyf94MY8zXvW3sC+Ux7Ff3I9lUnxBszMzMi+F8vttSqgutQquCB9o/6xQmMK42Q/WbdImEUpOqAd6u9h29GS1GgtbyEG2sDVzO4ZMHRCs1Z+SDbXLhIp6P3MCv8qbQY5kqbkHw1whDyDmZDXnO2N0BG0kh4OJlQEVeNeizP7fD34527u7u7u7u7u7sAAD+6Isf/94lW/WpT/f/+3OgFGaTgAAGDhlRYjGqZQcAAT9yh1vvJ8zrnfD5w65SpgvO8JdZndGf06eAg4abEWdwfNrhPidbW62baoeoW6QKe6Po6a3SfDgUxTkBiyfa6aQUtIUGi1uBLXPRARZxxk1RzVeP7tX4YVlU46ZT4F21rfa+L9KZhfgsVYoGdfucm3vMShtAjG1KrxQXIerWSCwntsXHunyedtYaZoKtyPde5PXpW7xpVP32KCdQU5pFOncjUdeC5f0rzo6/PnTKPTrdy16JvvX7zEKrr+WqEZb5hXukMwo6N8Ih6/Emwxd8FgnLe8b5Bnn7k/uM+szg3FzzTeXQeufvevm98uB2YZN/M5Yjadke6+6hxX9Yg6K84Ph+iAklF9vUUs3R38v6EYfsZZ6EyjnjxA+y+Bgr94Mgjuv9vmgfQkpNGC9xgu3TSWRVS0wC37go5DrovSTTs3E8ZiKPerDFKcBNvadynIfa6hFM3wvSQ0SodZsHlh7j6vPa+mtK2EuUN+I0VTKuwuGpPTIo/jrtfdXtSHgjEfm94ypk3Wor04YhlhPB766ggMJBtI4m9/Y6zTBgcG7c28W7SB5v8Vub8I3wuLcqJLP3kAaoVHwAoydvZojNzfsmP6MwbhR1Lr5tsZVH31IUEbg76DrQ+i2ZOTl9qCKDwiQhV5k35/DZGlQDNQg5gXrPDhFUBpIBmyhJize4Z13x54n2sf/RDdrj/51FBrl0d8sNmUeP7FeNGkz5/T7W0NEWBZwxHn2MhV02YkbceGkR583AW98Gvxj5OMHAgfNi39ttJOupfJ7/NOz8W/Z0k5d/sxuyfqQhs7yPDgqxdIWvW0493pAePUIxY0eW2x7bZxfF6l2CSpAuTZQ4/7F7nU0Jc5q2qruF453uW5aGcDv7hb73x1LFBj/w6PxrMjACi/3FWRhZACmvX8Ec5wdWI0K3QsCTSmc7bpk0f17rrgqv/U0iLrqrUuLOc9InkhsxB/5jVsTG37gbkbFFqZSyXBksIuJ0aKHo4MFkTr8N9Tg7d3RRRDNQHtpm+4eG9hpNK+fkJEoQ6Ne3VYoe8sg114BI9eVPqXK3xestyFZNeS16I2gewgFTLNcar8155bz4WSLgTGccxGOSbNv0d1zuTd5o8wdP7oEb4tnT+KMdnjrgVHcvhhUnHFeaFJLXUYdUKzgN37EDPajnygrfldc0NOoNj5Bamnxlq9EEDwGeLI5wJbXCYjOU4Dz5pbDtJsM2MgPQEUfMwRvocWG+DdXe6ETfjIX0H6zr0n3fasZGGmMqFCNZcVMctEx5+mqAG+JnWvd54aoOizkzCMhmYb14IcfiocgQ3KsD3gIC4rQV9E2XaUImdbfMpGF61/wqGvda6aRDxtHd1ncqrv43wQX3Fx21uN1knQwmrwi62tw4Wowsd5IbrPWsl1jMbRdwDkvscxEqzllnBxtHcAVIz5yzQ3NTCMmOkWVm77vmiJmqtx2MBoXs3Y6uVDgNkhNfu7Mvc3jMAAAAAAAAAA==\",\n coinbase:\n \"data:image/webp;base64,UklGRuAFAABXRUJQVlA4INQFAACQIACdASp4AHgAPkkijkQioiGXCyQcKASEsQN8c2HiuAn9m/FXv/s0eA/mf7Vfkz2fu/fw79J/jxmb/G/+n8yf+d/kHuA8wD9Ff9h1AP1g/s3sA/UT/Vf4z3hP4j/kv4B7gP83/KP7p7gH8+/wvWAfoB7AH6SelL+3Xwb/rh+1vtCXRH0ve8f5zhjlYsENIFMv8jf0t0t3mAeyB+wBaFRSEFJ85QT4wMY//h5Wlu4TPcVFeRjNCzkZt45BD1kFBoRy1sqh8qFDgfeX/D+cIlLM5yIHMXM8Z04AaLr6xJpiCnmNrbtii3uMOSRTYDj+6dtl939Kx23Ixh5BAMaZ1HngzO3U+1xDyiUA4ss2AAD+7/246f8RO+IneImyhtikVuTJl5GdRXejyZ8eT2bkasC6C1DoHzZdbsY0DSZv+qv0P6G5Cv37u5VmTK2jd8/KvSxtw1SdX+UjD6wZIJ6Q8Gcn+eMa0OP894J3M/WTO1v9TC2+VmPxrIhgiAzDs0TSGbNMi0psELMxuCu+LqgNGr2bjt3G/F63cM86fE9c7LHp8ply/wO+uxQtcEr1A7z4gpBiif/KPZiwfrKkrtAAmE4jX7Si6sFt0JjSnQfFfuQc7oKqj2/x2Ten6iTJFnTIRPBcR5nzCqT8fjzfyyCeg2HDSldW87YMEGYBLbS1FuNCaMTcSze0IRjPjjAjteIYwemmxRR4qNe2bpYMjG8EvKyiexULpmlU4EKgLmHGBy3JqfnSboHVNqYMBO97kx2eQbzoEgvIEPT1wSMvi5q8BZ0OX4uv1brvwNQfE8RLiON0wdvoivhnCOhx1P+CSsxH9L7flNZfQ2y9/nwSW9C9H5d14rSK2t/vtIarPTQEmHe6naSPkZ5+GcbUQ/SwTA5EkBL+9Z+UJIylYB8dk4Ha+y6YLL9nCclJPz1+D9KWUfJhK380kkFyZ/I4NRJ9P6XdEpx8Z3f/zdeQUI2AZMU/Pf+Ly/99QQpQIlrhOL3DagEdnJVYSYEr3Z1BrUv4Wpm2H1gdpCS3sS4fYkFlbewzr+jjCeYRgXs+d/hmba33VlmyxrnJg9ujTJj1QxoG4utbk1Tf9Tg8/b3B/zgMCRRANPCC9wUx81zORgfDst3wZhOq3qS8XlwfH3uHfLREQ8gaUsY3P/j0Vo/6pihVGc9Coqxxn3zLYcdrqoav/MyEPcXxNschwk15gRP0Omh7i/3LaWr/aAwcCU5jxZ8e/O2/zQZ8ENjpOLgZAy52G6QhYFXVjdoK28DQnB9zM/1gICr7tsxUPxfyUy0aliEZs8Mkc7Pwjq2tJcVNnwTMTAkiH4jdfKHedXwcHMAoMEhTd6gTkOUCz7hCzDguvX0Wk5inBSHo3W6M1kmPcFBHhty4Uz31qBkhWsktj0gEmgF1fWmMAEVw/y7C2Sm8kKekWMpEzpDTqqwoXaY8YyFWnBK+akFoIAgTCttUBDvbFdn2Xx9P1/SjkXxJg2G+aK4vIDQD1tobM/VmoTFnNc+uXqSOyyo8Ip0uQWU2XY+cG2nyR9RmdutY2YqiMOPdm2uTQxDyQ8gn5nUz6pEz4nJ/eeXJBuXeilVON+E6wFfox4EACd6DvukaUif9FJ0L+DWCFwDNzBVr9kCQH7tq65j5WpOfl1n68fEsGnzM/xLJX4Z5TmkumyI7BnHdEMHuFWVqxkHucNuS6qjBnUY0LzFY/eMO7Yn/JM1tBo4nrauNryL+MdwTQXJBooDQLYKw4x6gPfyyPqE6meMdl3CR0L0zUSnkmnMBLoPDDZW+cxrkZ+yTpU1ekcTWQCBLC/nbu7K2C8FdCxqv02mQaWTJW0IWNGLh+39CcdGNIKNJ43wCyMyfuH49jg64SEKZpEE8JXljz1I/XR3PuGM1snokHQomCSXb4cm2fBI4jWTeoxhDus89Wk1ODk50ZWp6DihAMecO3Ul630ci/tqcLfGj2oOrhkRIhFeCA3ZN1dBudQAfeZE6eOk/Hb9PkAAA\",\n safe: \"data:image/webp;base64,UklGRmwEAABXRUJQVlA4IGAEAAAQHQCdASp4AHgAPkkijUQioqEXTPQAKASEoA1XnRfpv4k+DZc/rX4v/lH00e+XfT9pfcBlxn2j8o/7d86f4B/gP41+gHyA8wD9AP7R9oHCA/YD/Jf4D3dP8B/gP8B2AH6ucAB+uXpT/7T3V/2p/0H9m9krNM/7B1cq5zK976PADTDTNfHc+PLcMbk9SFTCv8ZK3c2kA4wxWaJEMekH7chiyjmezfBnGX7l6ZLEA/jDMtgB36h24aGBseH81LSvxBz2xwNujw/xoPLk6GGfe7gLfF2YZ3Zkq3NMEt21YwfxpCxuKElykJJrRDqMJGuBLfCAAP7wYCBRUOxLnuefomvomJgo+dAB3q+0mhgl9zX5m2b0zxrt/3BrCkvWTPpubP4mKKCrfGVI184WtIxifdw//FbCgy0ECDSgBGTtg6PQ1me430CfaGQwNqFjiuMWV381BhXRq7hzE2rtUWjMvT7W3oWJUfPOnY1KIThNxn2cBTQ5owd5fdSenGZckR6V43Ipk9FB7X6MGSRUo3wpoq5VUm+JQsgi/VkAAD3vyuWknHeTw/rP0cKYmZHkuVoA9E0xdcWDQdZO0Qt1wrosPu5BSsFF5osjLFb/v+n5jVASMrMZz/tW35s3GmY9cALgOWXNzgkWXb30BEciwVYgxAvPmnHrQRPGHXt8GBYM7Gi2dXm3RGyHtWpHgSO3jPN0CyGqrECxvuYOkX/hVNBo1KPWsQvgdEKbmw2x50cEOuJqy0E+VKMAfoYM7SeflkVUSiMpNdcA9zEeidL4Sc42m2blDop7c61kxw4ynW6aIgMdAzW/zWiDtILZSgyKk/Ee/ksyY6hmsFrTkxyBLG4KQgrlFXZR/3YLaC3FfH0pL5yUlo/FdRG4lxBm8pHASmePW/oASzAMaHfI8xBv04BjOavXJCxxlQ5/j7F6ShqFhTo+0u5HrJII7Ab25IiXUTSo5MvT42erBSNNo+gV9vqv0kNieeGlqh++PmE2ONC8Ozay7U/NCCTjVgQEMCJ1zEDdc6qkAT9yBTFGShGh/8LUqqhem5Ln2ZT1+SX79SkUP+xubo3cJsCVNxtQtZ6oG1xOCZaNiOdAdx0hcWKmGPTRfJpR+7DqQ9vpc6Sx4G4NCsyB9VpvLoiwZwKw4Aq8AcLwJ4h8geguxsBGaT0BJKGTpOb/JFaHLfDPiCVIrgezK7WFRxtSKKWun4bVDF5YUupz620xC6639ore7sZXvYN7ZneX2vMmR1a+Usq9Z5gfqVNvXOHD3a96PqvHj47SeZ9bQFy1n570OcCrj8fkfNT6jLcdF1iTbK7i9/Yw+5oTz7M4Koda9E8jKW4obgrb2EwkgMYIm0D+/6+O8s+jRgHhxLW/mDExy8avr0XAUtZjnBiWM/nEc5zMBckPwsSsg9tm8RqxV4bV3U6kNDC9FvAjFjDv9BdpHGCJiGaj9vFM7x7poRHF9vAqKGkuIkSTP/tx+Wj/80cBl4DUhdykoAAAAAAA\",\n requestNetwork:\n \"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDIiIGhlaWdodD0iNDQiIHZpZXdCb3g9IjAgMCA0MiA0NCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwXzFfMjQ2MSkiPgo8cGF0aCBkPSJNMjguMjIzMyAyNC43NjIxTDM5LjU2NTMgMTMuOTMxM0M0MC40MTc1IDEzLjEyNDMgNDAuODk1MiAxMi4wMTI2IDQwLjg5NTIgMTAuODY0OUw0MC45MTM5IDIuMTE0MjNDNDAuOTEzOSAxLjY2NTkzIDQwLjczNiAxLjIzNTU3IDQwLjQwODIgMC45MTI3OTZMMTguNjUxNiAyMS43MDQ3QzE2Ljg4MTQgMjMuMzgxMyAxNi44NzIxIDI2LjExNTkgMTguNjIzNSAyNy44MDE1TDE4LjY1MTYgMjcuODI4NEwzMy45OTI2IDQyLjQ2OTdDMzUuNzYyOCA0NC4xNTUzIDM4LjYyODcgNDQuMTQ2MyA0MC4zODAxIDQyLjQ1MThDNDIuMTQwOCA0MC43NTcyIDQyLjEzMTUgMzguMDEzNiA0MC4zNjEzIDM2LjMzN0wyOC4yMjMzIDI0Ljc2MjFaIiBmaWxsPSIjMzI4OTY1Ii8+CjxwYXRoIGQ9Ik00MC42ODA4IC0yLjQ0MzEySDUuMDEzNUMyLjEzMDggLTIuNDQzMTIgMC4wMDA1MzY2OTQgLTAuMjk3MTE3IDAuMDAwNTM2Njk0IDIuNjI4MzhWMzkuMjc0MUMtMC4wMzg1NTA4IDQxLjg0MzUgMi4wNjI0IDQzLjk2MDcgNC42NzE0OSA0My45OTkySDQuNzg4NzVDNy4zODgwNiA0NC4wNDczIDkuNTM3ODcgNDEuOTk3NSA5LjU4NjczIDM5LjQzNzdWNi41OTMySDMzLjMxMjhMNDIgLTEuOTIzNDZDNDEuNjQ4MiAtMi4yNjk5IDQxLjE3OTIgLTIuNDYyMzcgNDAuNjgwOCAtMi40NDMxMloiIGZpbGw9IiM1OEUxQTUiLz4KPC9nPgo8ZGVmcz4KPGNsaXBQYXRoIGlkPSJjbGlwMF8xXzI0NjEiPgo8cmVjdCB3aWR0aD0iNDIiIGhlaWdodD0iNDQiIGZpbGw9IndoaXRlIi8+CjwvY2xpcFBhdGg+CjwvZGVmcz4KPC9zdmc+Cg==\",\n defaultWallet:\n \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IiB2aWV3Qm94PSIwIDAgMTIyLjg4IDEwMS4zMyIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgMTIyLjg4IDEwMS4zMyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4uc3Qwe2ZpbGwtcnVsZTpldmVub2RkO2NsaXAtcnVsZTpldmVub2RkO308L3N0eWxlPjxnPjxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik05MC42MiwzMy4zMmgxOC40di0yLjc5Yy0yLjg4LTEwLjczLTEwLjItMTAuNjYtMTkuMjUtMTAuNTdjLTEuNDksMC4wMi0yLjg0LDAuMDMtMi45MiwwLjAzSDE4LjA3IGMtMS41OCwwLTIuODYtMS4yOC0yLjg2LTIuODZjMC0xLjU4LDEuMjgtMi44NiwyLjg2LTIuODZoNjguNzhjMi4wMywwLDIuNDYsMCwyLjg3LTAuMDFjNy43NC0wLjA4LDE0LjUtMC4xNSwxOS4zLDQuMzh2LTEuMzEgYzAtMy4yLTEuMzEtNi4xLTMuNDItOC4yMWMtMi4xMS0yLjExLTUuMDItMy40Mi04LjIxLTMuNDJIMTcuMzRjLTMuMiwwLTYuMSwxLjMxLTguMjEsMy40MmMtMi4xMSwyLjExLTMuNDIsNS4wMi0zLjQyLDguMjF2NjYuNjQgYzAsMy4yLDEuMzEsNi4xLDMuNDIsOC4yMWMyLjExLDIuMTEsNS4wMiwzLjQyLDguMjEsMy40Mmg4MC4wNGMzLjIsMCw2LjEtMS4zMSw4LjIxLTMuNDJjMi4xMS0yLjExLDMuNDItNS4wMiwzLjQyLTguMjF2LTkuNDYgaC0xOC40Yy01LjU1LDAtMTAuNi0yLjI3LTE0LjI1LTUuOTJjLTMuNjUtMy42NS01LjkyLTguNy01LjkyLTE0LjI1di0wLjg3YzAtNS41NSwyLjI3LTEwLjYsNS45Mi0xNC4yNSBDODAuMDIsMzUuNTksODUuMDYsMzMuMzIsOTAuNjIsMzMuMzJMOTAuNjIsMzMuMzJ6IE0xMTQuNzMsMzMuNDNjMi4wNywwLjMxLDMuOTIsMS4yOSw1LjMzLDIuNzFjMS43NCwxLjc0LDIuODEsNC4xNCwyLjgxLDYuNzggdjIxLjZjMCwyLjc2LTEuMTIsNS4yNi0yLjkzLDcuMDdjLTEuMzksMS4zOS0zLjIsMi4zOC01LjIxLDIuNzZ2OS42M2MwLDQuNzctMS45NSw5LjExLTUuMDksMTIuMjUgYy0zLjE0LDMuMTQtNy40OCw1LjA5LTEyLjI1LDUuMDlIMTcuMzRjLTQuNzcsMC05LjExLTEuOTUtMTIuMjUtNS4wOUMxLjk1LDkzLjEsMCw4OC43NiwwLDgzLjk5VjE3LjM0IGMwLTQuNzcsMS45NS05LjExLDUuMDktMTIuMjVDOC4yMywxLjk1LDEyLjU3LDAsMTcuMzQsMGg4MC4wNGM0Ljc3LDAsOS4xMSwxLjk1LDEyLjI1LDUuMDljMy4xNCwzLjE0LDUuMDksNy40OCw1LjA5LDEyLjI1VjMzLjQzIEwxMTQuNzMsMzMuNDN6IE04OC4xNCw0Ni4xMWM0LjA1LDAsNy4zMywzLjI4LDcuMzMsNy4zM2MwLDQuMDUtMy4yOCw3LjMzLTcuMzMsNy4zM2MtNC4wNSwwLTcuMzMtMy4yOC03LjMzLTcuMzMgQzgwLjgxLDQ5LjM5LDg0LjA5LDQ2LjExLDg4LjE0LDQ2LjExTDg4LjE0LDQ2LjExeiIvPjwvZz48L3N2Zz4=\",\n};\n", + "content": "export const RN_API_URL =\n process.env.NEXT_PUBLIC_REQUEST_API_URL || \"https://api.request.network\";\nexport const ICONS = {\n metamask:\n \"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzUiIGhlaWdodD0iMzQiIHZpZXdCb3g9IjAgMCAzNSAzNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTMyLjcwNzcgMzIuNzUyMkwyNS4xNjg4IDMwLjUxNzRMMTkuNDgzMyAzMy45MDA4TDE1LjUxNjcgMzMuODk5MUw5LjgyNzkzIDMwLjUxNzRMMi4yOTIyNSAzMi43NTIyTDAgMjUuMDQ4OUwyLjI5MjI1IDE2LjQ5OTNMMCA5LjI3MDk0TDIuMjkyMjUgMC4zMTIyNTZMMTQuMDY3NCA3LjMxNTU0SDIwLjkzMjZMMzIuNzA3NyAwLjMxMjI1NkwzNSA5LjI3MDk0TDMyLjcwNzcgMTYuNDk5M0wzNSAyNS4wNDg5TDMyLjcwNzcgMzIuNzUyMloiIGZpbGw9IiNGRjVDMTYiLz4KPHBhdGggZD0iTTIuMjkzOTUgMC4zMTIyNTZMMTQuMDY5MSA3LjMyMDQ3TDEzLjYwMDggMTIuMTMwMUwyLjI5Mzk1IDAuMzEyMjU2WiIgZmlsbD0iI0ZGNUMxNiIvPgo8cGF0aCBkPSJNOS44Mjk1OSAyNS4wNTIyTDE1LjAxMDYgMjguOTgxMUw5LjgyOTU5IDMwLjUxNzVWMjUuMDUyMloiIGZpbGw9IiNGRjVDMTYiLz4KPHBhdGggZD0iTTE0LjU5NjYgMTguNTU2NUwxMy42MDA5IDEyLjEzMzNMNy4yMjY5MiAxNi41MDA5TDcuMjIzNjMgMTYuNDk5M1YxNi41MDI1TDcuMjQzMzUgMjAuOTk4M0w5LjgyODA5IDE4LjU1NjVIOS44Mjk3NEgxNC41OTY2WiIgZmlsbD0iI0ZGNUMxNiIvPgo8cGF0aCBkPSJNMzIuNzA3NyAwLjMxMjI1NkwyMC45MzI2IDcuMzIwNDdMMjEuMzk5MyAxMi4xMzAxTDMyLjcwNzcgMC4zMTIyNTZaIiBmaWxsPSIjRkY1QzE2Ii8+CjxwYXRoIGQ9Ik0yNS4xNzIyIDI1LjA1MjJMMTkuOTkxMiAyOC45ODExTDI1LjE3MjIgMzAuNTE3NVYyNS4wNTIyWiIgZmlsbD0iI0ZGNUMxNiIvPgo8cGF0aCBkPSJNMjcuNzc2NiAxNi41MDI1SDI3Ljc3ODNIMjcuNzc2NlYxNi40OTkzTDI3Ljc3NSAxNi41MDA5TDIxLjQwMSAxMi4xMzMzTDIwLjQwNTMgMTguNTU2NUgyNS4xNzIyTDI3Ljc1ODYgMjAuOTk4M0wyNy43NzY2IDE2LjUwMjVaIiBmaWxsPSIjRkY1QzE2Ii8+CjxwYXRoIGQ9Ik05LjgyNzkzIDMwLjUxNzVMMi4yOTIyNSAzMi43NTIyTDAgMjUuMDUyMkg5LjgyNzkzVjMwLjUxNzVaIiBmaWxsPSIjRTM0ODA3Ii8+CjxwYXRoIGQ9Ik0xNC41OTQ3IDE4LjU1NDlMMTYuMDM0MSAyNy44NDA2TDE0LjAzOTMgMjIuNjc3N0w3LjIzOTc1IDIwLjk5ODRMOS44MjYxMyAxOC41NTQ5SDE0LjU5M0gxNC41OTQ3WiIgZmlsbD0iI0UzNDgwNyIvPgo8cGF0aCBkPSJNMjUuMTcyMSAzMC41MTc1TDMyLjcwNzggMzIuNzUyMkwzNS4wMDAxIDI1LjA1MjJIMjUuMTcyMVYzMC41MTc1WiIgZmlsbD0iI0UzNDgwNyIvPgo8cGF0aCBkPSJNMjAuNDA1MyAxOC41NTQ5TDE4Ljk2NTggMjcuODQwNkwyMC45NjA3IDIyLjY3NzdMMjcuNzYwMiAyMC45OTg0TDI1LjE3MjIgMTguNTU0OUgyMC40MDUzWiIgZmlsbD0iI0UzNDgwNyIvPgo8cGF0aCBkPSJNMCAyNS4wNDg4TDIuMjkyMjUgMTYuNDk5M0g3LjIyMTgzTDcuMjM5OTEgMjAuOTk2N0wxNC4wMzk0IDIyLjY3NkwxNi4wMzQzIDI3LjgzODlMMTUuMDA4OSAyOC45NzZMOS44Mjc5MyAyNS4wNDcySDBWMjUuMDQ4OFoiIGZpbGw9IiNGRjhENUQiLz4KPHBhdGggZD0iTTM1LjAwMDEgMjUuMDQ4OEwzMi43MDc4IDE2LjQ5OTNIMjcuNzc4M0wyNy43NjAyIDIwLjk5NjdMMjAuOTYwNyAyMi42NzZMMTguOTY1OCAyNy44Mzg5TDE5Ljk5MTIgMjguOTc2TDI1LjE3MjIgMjUuMDQ3MkgzNS4wMDAxVjI1LjA0ODhaIiBmaWxsPSIjRkY4RDVEIi8+CjxwYXRoIGQ9Ik0yMC45MzI1IDcuMzE1NDNIMTcuNDk5OUgxNC4wNjczTDEzLjYwMDYgMTIuMTI1MUwxNi4wMzQyIDI3LjgzNEgxOC45NjU2TDIxLjQwMDggMTIuMTI1MUwyMC45MzI1IDcuMzE1NDNaIiBmaWxsPSIjRkY4RDVEIi8+CjxwYXRoIGQ9Ik0yLjI5MjI1IDAuMzEyMjU2TDAgOS4yNzA5NEwyLjI5MjI1IDE2LjQ5OTNINy4yMjE4M0wxMy41OTkxIDEyLjEzMDFMMi4yOTIyNSAwLjMxMjI1NloiIGZpbGw9IiM2NjE4MDAiLz4KPHBhdGggZD0iTTEzLjE3IDIwLjQxOTlIMTAuOTM2OUw5LjcyMDk1IDIxLjYwNjJMMTQuMDQwOSAyMi42NzI3TDEzLjE3IDIwLjQxODJWMjAuNDE5OVoiIGZpbGw9IiM2NjE4MDAiLz4KPHBhdGggZD0iTTMyLjcwNzcgMC4zMTIyNTZMMzQuOTk5OSA5LjI3MDk0TDMyLjcwNzcgMTYuNDk5M0gyNy43NzgxTDIxLjQwMDkgMTIuMTMwMUwzMi43MDc3IDAuMzEyMjU2WiIgZmlsbD0iIzY2MTgwMCIvPgo8cGF0aCBkPSJNMjEuODMzIDIwLjQxOTlIMjQuMDY5NEwyNS4yODUzIDIxLjYwNzlMMjAuOTYwNCAyMi42NzZMMjEuODMzIDIwLjQxODJWMjAuNDE5OVoiIGZpbGw9IiM2NjE4MDAiLz4KPHBhdGggZD0iTTE5LjQ4MTcgMzAuODM2MkwxOS45OTExIDI4Ljk3OTRMMTguOTY1OCAyNy44NDIzSDE2LjAzMjdMMTUuMDA3MyAyOC45Nzk0TDE1LjUxNjcgMzAuODM2MiIgZmlsbD0iIzY2MTgwMCIvPgo8cGF0aCBkPSJNMTkuNDgxNiAzMC44MzU5VjMzLjkwMjFIMTUuNTE2NlYzMC44MzU5SDE5LjQ4MTZaIiBmaWxsPSIjQzBDNENEIi8+CjxwYXRoIGQ9Ik05LjgyOTU5IDMwLjUxNDJMMTUuNTIgMzMuOTAwOFYzMC44MzQ2TDE1LjAxMDYgMjguOTc3OEw5LjgyOTU5IDMwLjUxNDJaIiBmaWxsPSIjRTdFQkY2Ii8+CjxwYXRoIGQ9Ik0yNS4xNzIxIDMwLjUxNDJMMTkuNDgxNyAzMy45MDA4VjMwLjgzNDZMMTkuOTkxMSAyOC45Nzc4TDI1LjE3MjEgMzAuNTE0MloiIGZpbGw9IiNFN0VCRjYiLz4KPC9zdmc+\",\n walletConnect:\n \"data:image/webp;base64,UklGRoQFAABXRUJQVlA4IHgFAAAQHwCdASp4AHgAPkkkjUSioiEVDGQYKASEsQBrTdi9V/GD8mflPpT9Q+7PEdo66nv5H8k/qfWK8wD+Afwn/AfxP+d9gDzAfar7wHoY/4vqAf6DqAOfE9iL+2/679o/Zd9QD//+oB//5lWRX6GuwHaY3eTHXFDyf94MY8zXvW3sC+Ux7Ff3I9lUnxBszMzMi+F8vttSqgutQquCB9o/6xQmMK42Q/WbdImEUpOqAd6u9h29GS1GgtbyEG2sDVzO4ZMHRCs1Z+SDbXLhIp6P3MCv8qbQY5kqbkHw1whDyDmZDXnO2N0BG0kh4OJlQEVeNeizP7fD34527u7u7u7u7u7sAAD+6Isf/94lW/WpT/f/+3OgFGaTgAAGDhlRYjGqZQcAAT9yh1vvJ8zrnfD5w65SpgvO8JdZndGf06eAg4abEWdwfNrhPidbW62baoeoW6QKe6Po6a3SfDgUxTkBiyfa6aQUtIUGi1uBLXPRARZxxk1RzVeP7tX4YVlU46ZT4F21rfa+L9KZhfgsVYoGdfucm3vMShtAjG1KrxQXIerWSCwntsXHunyedtYaZoKtyPde5PXpW7xpVP32KCdQU5pFOncjUdeC5f0rzo6/PnTKPTrdy16JvvX7zEKrr+WqEZb5hXukMwo6N8Ih6/Emwxd8FgnLe8b5Bnn7k/uM+szg3FzzTeXQeufvevm98uB2YZN/M5Yjadke6+6hxX9Yg6K84Ph+iAklF9vUUs3R38v6EYfsZZ6EyjnjxA+y+Bgr94Mgjuv9vmgfQkpNGC9xgu3TSWRVS0wC37go5DrovSTTs3E8ZiKPerDFKcBNvadynIfa6hFM3wvSQ0SodZsHlh7j6vPa+mtK2EuUN+I0VTKuwuGpPTIo/jrtfdXtSHgjEfm94ypk3Wor04YhlhPB766ggMJBtI4m9/Y6zTBgcG7c28W7SB5v8Vub8I3wuLcqJLP3kAaoVHwAoydvZojNzfsmP6MwbhR1Lr5tsZVH31IUEbg76DrQ+i2ZOTl9qCKDwiQhV5k35/DZGlQDNQg5gXrPDhFUBpIBmyhJize4Z13x54n2sf/RDdrj/51FBrl0d8sNmUeP7FeNGkz5/T7W0NEWBZwxHn2MhV02YkbceGkR583AW98Gvxj5OMHAgfNi39ttJOupfJ7/NOz8W/Z0k5d/sxuyfqQhs7yPDgqxdIWvW0493pAePUIxY0eW2x7bZxfF6l2CSpAuTZQ4/7F7nU0Jc5q2qruF453uW5aGcDv7hb73x1LFBj/w6PxrMjACi/3FWRhZACmvX8Ec5wdWI0K3QsCTSmc7bpk0f17rrgqv/U0iLrqrUuLOc9InkhsxB/5jVsTG37gbkbFFqZSyXBksIuJ0aKHo4MFkTr8N9Tg7d3RRRDNQHtpm+4eG9hpNK+fkJEoQ6Ne3VYoe8sg114BI9eVPqXK3xestyFZNeS16I2gewgFTLNcar8155bz4WSLgTGccxGOSbNv0d1zuTd5o8wdP7oEb4tnT+KMdnjrgVHcvhhUnHFeaFJLXUYdUKzgN37EDPajnygrfldc0NOoNj5Bamnxlq9EEDwGeLI5wJbXCYjOU4Dz5pbDtJsM2MgPQEUfMwRvocWG+DdXe6ETfjIX0H6zr0n3fasZGGmMqFCNZcVMctEx5+mqAG+JnWvd54aoOizkzCMhmYb14IcfiocgQ3KsD3gIC4rQV9E2XaUImdbfMpGF61/wqGvda6aRDxtHd1ncqrv43wQX3Fx21uN1knQwmrwi62tw4Wowsd5IbrPWsl1jMbRdwDkvscxEqzllnBxtHcAVIz5yzQ3NTCMmOkWVm77vmiJmqtx2MBoXs3Y6uVDgNkhNfu7Mvc3jMAAAAAAAAAA==\",\n coinbase:\n \"data:image/webp;base64,UklGRuAFAABXRUJQVlA4INQFAACQIACdASp4AHgAPkkijkQioiGXCyQcKASEsQN8c2HiuAn9m/FXv/s0eA/mf7Vfkz2fu/fw79J/jxmb/G/+n8yf+d/kHuA8wD9Ff9h1AP1g/s3sA/UT/Vf4z3hP4j/kv4B7gP83/KP7p7gH8+/wvWAfoB7AH6SelL+3Xwb/rh+1vtCXRH0ve8f5zhjlYsENIFMv8jf0t0t3mAeyB+wBaFRSEFJ85QT4wMY//h5Wlu4TPcVFeRjNCzkZt45BD1kFBoRy1sqh8qFDgfeX/D+cIlLM5yIHMXM8Z04AaLr6xJpiCnmNrbtii3uMOSRTYDj+6dtl939Kx23Ixh5BAMaZ1HngzO3U+1xDyiUA4ss2AAD+7/246f8RO+IneImyhtikVuTJl5GdRXejyZ8eT2bkasC6C1DoHzZdbsY0DSZv+qv0P6G5Cv37u5VmTK2jd8/KvSxtw1SdX+UjD6wZIJ6Q8Gcn+eMa0OP894J3M/WTO1v9TC2+VmPxrIhgiAzDs0TSGbNMi0psELMxuCu+LqgNGr2bjt3G/F63cM86fE9c7LHp8ply/wO+uxQtcEr1A7z4gpBiif/KPZiwfrKkrtAAmE4jX7Si6sFt0JjSnQfFfuQc7oKqj2/x2Ten6iTJFnTIRPBcR5nzCqT8fjzfyyCeg2HDSldW87YMEGYBLbS1FuNCaMTcSze0IRjPjjAjteIYwemmxRR4qNe2bpYMjG8EvKyiexULpmlU4EKgLmHGBy3JqfnSboHVNqYMBO97kx2eQbzoEgvIEPT1wSMvi5q8BZ0OX4uv1brvwNQfE8RLiON0wdvoivhnCOhx1P+CSsxH9L7flNZfQ2y9/nwSW9C9H5d14rSK2t/vtIarPTQEmHe6naSPkZ5+GcbUQ/SwTA5EkBL+9Z+UJIylYB8dk4Ha+y6YLL9nCclJPz1+D9KWUfJhK380kkFyZ/I4NRJ9P6XdEpx8Z3f/zdeQUI2AZMU/Pf+Ly/99QQpQIlrhOL3DagEdnJVYSYEr3Z1BrUv4Wpm2H1gdpCS3sS4fYkFlbewzr+jjCeYRgXs+d/hmba33VlmyxrnJg9ujTJj1QxoG4utbk1Tf9Tg8/b3B/zgMCRRANPCC9wUx81zORgfDst3wZhOq3qS8XlwfH3uHfLREQ8gaUsY3P/j0Vo/6pihVGc9Coqxxn3zLYcdrqoav/MyEPcXxNschwk15gRP0Omh7i/3LaWr/aAwcCU5jxZ8e/O2/zQZ8ENjpOLgZAy52G6QhYFXVjdoK28DQnB9zM/1gICr7tsxUPxfyUy0aliEZs8Mkc7Pwjq2tJcVNnwTMTAkiH4jdfKHedXwcHMAoMEhTd6gTkOUCz7hCzDguvX0Wk5inBSHo3W6M1kmPcFBHhty4Uz31qBkhWsktj0gEmgF1fWmMAEVw/y7C2Sm8kKekWMpEzpDTqqwoXaY8YyFWnBK+akFoIAgTCttUBDvbFdn2Xx9P1/SjkXxJg2G+aK4vIDQD1tobM/VmoTFnNc+uXqSOyyo8Ip0uQWU2XY+cG2nyR9RmdutY2YqiMOPdm2uTQxDyQ8gn5nUz6pEz4nJ/eeXJBuXeilVON+E6wFfox4EACd6DvukaUif9FJ0L+DWCFwDNzBVr9kCQH7tq65j5WpOfl1n68fEsGnzM/xLJX4Z5TmkumyI7BnHdEMHuFWVqxkHucNuS6qjBnUY0LzFY/eMO7Yn/JM1tBo4nrauNryL+MdwTQXJBooDQLYKw4x6gPfyyPqE6meMdl3CR0L0zUSnkmnMBLoPDDZW+cxrkZ+yTpU1ekcTWQCBLC/nbu7K2C8FdCxqv02mQaWTJW0IWNGLh+39CcdGNIKNJ43wCyMyfuH49jg64SEKZpEE8JXljz1I/XR3PuGM1snokHQomCSXb4cm2fBI4jWTeoxhDus89Wk1ODk50ZWp6DihAMecO3Ul630ci/tqcLfGj2oOrhkRIhFeCA3ZN1dBudQAfeZE6eOk/Hb9PkAAA\",\n safe: \"data:image/webp;base64,UklGRmwEAABXRUJQVlA4IGAEAAAQHQCdASp4AHgAPkkijUQioqEXTPQAKASEoA1XnRfpv4k+DZc/rX4v/lH00e+XfT9pfcBlxn2j8o/7d86f4B/gP41+gHyA8wD9AP7R9oHCA/YD/Jf4D3dP8B/gP8B2AH6ucAB+uXpT/7T3V/2p/0H9m9krNM/7B1cq5zK976PADTDTNfHc+PLcMbk9SFTCv8ZK3c2kA4wxWaJEMekH7chiyjmezfBnGX7l6ZLEA/jDMtgB36h24aGBseH81LSvxBz2xwNujw/xoPLk6GGfe7gLfF2YZ3Zkq3NMEt21YwfxpCxuKElykJJrRDqMJGuBLfCAAP7wYCBRUOxLnuefomvomJgo+dAB3q+0mhgl9zX5m2b0zxrt/3BrCkvWTPpubP4mKKCrfGVI184WtIxifdw//FbCgy0ECDSgBGTtg6PQ1me430CfaGQwNqFjiuMWV381BhXRq7hzE2rtUWjMvT7W3oWJUfPOnY1KIThNxn2cBTQ5owd5fdSenGZckR6V43Ipk9FB7X6MGSRUo3wpoq5VUm+JQsgi/VkAAD3vyuWknHeTw/rP0cKYmZHkuVoA9E0xdcWDQdZO0Qt1wrosPu5BSsFF5osjLFb/v+n5jVASMrMZz/tW35s3GmY9cALgOWXNzgkWXb30BEciwVYgxAvPmnHrQRPGHXt8GBYM7Gi2dXm3RGyHtWpHgSO3jPN0CyGqrECxvuYOkX/hVNBo1KPWsQvgdEKbmw2x50cEOuJqy0E+VKMAfoYM7SeflkVUSiMpNdcA9zEeidL4Sc42m2blDop7c61kxw4ynW6aIgMdAzW/zWiDtILZSgyKk/Ee/ksyY6hmsFrTkxyBLG4KQgrlFXZR/3YLaC3FfH0pL5yUlo/FdRG4lxBm8pHASmePW/oASzAMaHfI8xBv04BjOavXJCxxlQ5/j7F6ShqFhTo+0u5HrJII7Ab25IiXUTSo5MvT42erBSNNo+gV9vqv0kNieeGlqh++PmE2ONC8Ozay7U/NCCTjVgQEMCJ1zEDdc6qkAT9yBTFGShGh/8LUqqhem5Ln2ZT1+SX79SkUP+xubo3cJsCVNxtQtZ6oG1xOCZaNiOdAdx0hcWKmGPTRfJpR+7DqQ9vpc6Sx4G4NCsyB9VpvLoiwZwKw4Aq8AcLwJ4h8geguxsBGaT0BJKGTpOb/JFaHLfDPiCVIrgezK7WFRxtSKKWun4bVDF5YUupz620xC6639ore7sZXvYN7ZneX2vMmR1a+Usq9Z5gfqVNvXOHD3a96PqvHj47SeZ9bQFy1n570OcCrj8fkfNT6jLcdF1iTbK7i9/Yw+5oTz7M4Koda9E8jKW4obgrb2EwkgMYIm0D+/6+O8s+jRgHhxLW/mDExy8avr0XAUtZjnBiWM/nEc5zMBckPwsSsg9tm8RqxV4bV3U6kNDC9FvAjFjDv9BdpHGCJiGaj9vFM7x7poRHF9vAqKGkuIkSTP/tx+Wj/80cBl4DUhdykoAAAAAAA\",\n requestNetwork:\n \"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDIiIGhlaWdodD0iNDQiIHZpZXdCb3g9IjAgMCA0MiA0NCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwXzFfMjQ2MSkiPgo8cGF0aCBkPSJNMjguMjIzMyAyNC43NjIxTDM5LjU2NTMgMTMuOTMxM0M0MC40MTc1IDEzLjEyNDMgNDAuODk1MiAxMi4wMTI2IDQwLjg5NTIgMTAuODY0OUw0MC45MTM5IDIuMTE0MjNDNDAuOTEzOSAxLjY2NTkzIDQwLjczNiAxLjIzNTU3IDQwLjQwODIgMC45MTI3OTZMMTguNjUxNiAyMS43MDQ3QzE2Ljg4MTQgMjMuMzgxMyAxNi44NzIxIDI2LjExNTkgMTguNjIzNSAyNy44MDE1TDE4LjY1MTYgMjcuODI4NEwzMy45OTI2IDQyLjQ2OTdDMzUuNzYyOCA0NC4xNTUzIDM4LjYyODcgNDQuMTQ2MyA0MC4zODAxIDQyLjQ1MThDNDIuMTQwOCA0MC43NTcyIDQyLjEzMTUgMzguMDEzNiA0MC4zNjEzIDM2LjMzN0wyOC4yMjMzIDI0Ljc2MjFaIiBmaWxsPSIjMzI4OTY1Ii8+CjxwYXRoIGQ9Ik00MC42ODA4IC0yLjQ0MzEySDUuMDEzNUMyLjEzMDggLTIuNDQzMTIgMC4wMDA1MzY2OTQgLTAuMjk3MTE3IDAuMDAwNTM2Njk0IDIuNjI4MzhWMzkuMjc0MUMtMC4wMzg1NTA4IDQxLjg0MzUgMi4wNjI0IDQzLjk2MDcgNC42NzE0OSA0My45OTkySDQuNzg4NzVDNy4zODgwNiA0NC4wNDczIDkuNTM3ODcgNDEuOTk3NSA5LjU4NjczIDM5LjQzNzdWNi41OTMySDMzLjMxMjhMNDIgLTEuOTIzNDZDNDEuNjQ4MiAtMi4yNjk5IDQxLjE3OTIgLTIuNDYyMzcgNDAuNjgwOCAtMi40NDMxMloiIGZpbGw9IiM1OEUxQTUiLz4KPC9nPgo8ZGVmcz4KPGNsaXBQYXRoIGlkPSJjbGlwMF8xXzI0NjEiPgo8cmVjdCB3aWR0aD0iNDIiIGhlaWdodD0iNDQiIGZpbGw9IndoaXRlIi8+CjwvY2xpcFBhdGg+CjwvZGVmcz4KPC9zdmc+Cg==\",\n defaultWallet:\n \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IiB2aWV3Qm94PSIwIDAgMTIyLjg4IDEwMS4zMyIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgMTIyLjg4IDEwMS4zMyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4uc3Qwe2ZpbGwtcnVsZTpldmVub2RkO2NsaXAtcnVsZTpldmVub2RkO308L3N0eWxlPjxnPjxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik05MC42MiwzMy4zMmgxOC40di0yLjc5Yy0yLjg4LTEwLjczLTEwLjItMTAuNjYtMTkuMjUtMTAuNTdjLTEuNDksMC4wMi0yLjg0LDAuMDMtMi45MiwwLjAzSDE4LjA3IGMtMS41OCwwLTIuODYtMS4yOC0yLjg2LTIuODZjMC0xLjU4LDEuMjgtMi44NiwyLjg2LTIuODZoNjguNzhjMi4wMywwLDIuNDYsMCwyLjg3LTAuMDFjNy43NC0wLjA4LDE0LjUtMC4xNSwxOS4zLDQuMzh2LTEuMzEgYzAtMy4yLTEuMzEtNi4xLTMuNDItOC4yMWMtMi4xMS0yLjExLTUuMDItMy40Mi04LjIxLTMuNDJIMTcuMzRjLTMuMiwwLTYuMSwxLjMxLTguMjEsMy40MmMtMi4xMSwyLjExLTMuNDIsNS4wMi0zLjQyLDguMjF2NjYuNjQgYzAsMy4yLDEuMzEsNi4xLDMuNDIsOC4yMWMyLjExLDIuMTEsNS4wMiwzLjQyLDguMjEsMy40Mmg4MC4wNGMzLjIsMCw2LjEtMS4zMSw4LjIxLTMuNDJjMi4xMS0yLjExLDMuNDItNS4wMiwzLjQyLTguMjF2LTkuNDYgaC0xOC40Yy01LjU1LDAtMTAuNi0yLjI3LTE0LjI1LTUuOTJjLTMuNjUtMy42NS01LjkyLTguNy01LjkyLTE0LjI1di0wLjg3YzAtNS41NSwyLjI3LTEwLjYsNS45Mi0xNC4yNSBDODAuMDIsMzUuNTksODUuMDYsMzMuMzIsOTAuNjIsMzMuMzJMOTAuNjIsMzMuMzJ6IE0xMTQuNzMsMzMuNDNjMi4wNywwLjMxLDMuOTIsMS4yOSw1LjMzLDIuNzFjMS43NCwxLjc0LDIuODEsNC4xNCwyLjgxLDYuNzggdjIxLjZjMCwyLjc2LTEuMTIsNS4yNi0yLjkzLDcuMDdjLTEuMzksMS4zOS0zLjIsMi4zOC01LjIxLDIuNzZ2OS42M2MwLDQuNzctMS45NSw5LjExLTUuMDksMTIuMjUgYy0zLjE0LDMuMTQtNy40OCw1LjA5LTEyLjI1LDUuMDlIMTcuMzRjLTQuNzcsMC05LjExLTEuOTUtMTIuMjUtNS4wOUMxLjk1LDkzLjEsMCw4OC43NiwwLDgzLjk5VjE3LjM0IGMwLTQuNzcsMS45NS05LjExLDUuMDktMTIuMjVDOC4yMywxLjk1LDEyLjU3LDAsMTcuMzQsMGg4MC4wNGM0Ljc3LDAsOS4xMSwxLjk1LDEyLjI1LDUuMDljMy4xNCwzLjE0LDUuMDksNy40OCw1LjA5LDEyLjI1VjMzLjQzIEwxMTQuNzMsMzMuNDN6IE04OC4xNCw0Ni4xMWM0LjA1LDAsNy4zMywzLjI4LDcuMzMsNy4zM2MwLDQuMDUtMy4yOCw3LjMzLTcuMzMsNy4zM2MtNC4wNSwwLTcuMzMtMy4yOC03LjMzLTcuMzMgQzgwLjgxLDQ5LjM5LDg0LjA5LDQ2LjExLDg4LjE0LDQ2LjExTDg4LjE0LDQ2LjExeiIvPjwvZz48L3N2Zz4=\",\n};\n", "type": "registry:lib", "target": "components/payment-widget/constants.ts" }, @@ -100,7 +100,7 @@ }, { "path": "registry/default/payment-widget/utils/payment.ts", - "content": "import { TransactionReceipt } from \"viem\";\nimport { RN_API_URL } from \"../constants\";\nimport type { FeeInfo, PaymentError } from \"../types\";\n\nexport interface PaymentParams {\n amountInUsd: string;\n payerWallet: string;\n recipientWallet: string;\n paymentCurrency: string;\n feeInfo?: FeeInfo;\n customerInfo: {\n // This matches the API spec\n firstName?: string;\n lastName?: string;\n email?: string;\n address?: {\n street?: string;\n city?: string;\n state?: string;\n postalCode?: string;\n country?: string;\n };\n };\n}\n\ninterface PayoutAPITransaction {\n to: string;\n data: string;\n value: number | string | { type: string; hex: string };\n}\nexport interface PayoutAPIResponse {\n requestId: string;\n paymentReference: string;\n transactions: PayoutAPITransaction[];\n metadata: {\n stepsRequired: number;\n needsApproval: boolean;\n approvalTransactionIndex: number;\n paymentTransactionIndex: number;\n };\n}\n\nexport type TxParams = {\n to: `0x${string}`;\n data: `0x${string}`;\n value: bigint;\n};\n\nexport type SendTransactionFunction = (tx: TxParams) => Promise<`0x${string}`>;\n\nexport type WaitForTransactionFunction = (\n hash: `0x${string}`,\n) => Promise;\n\nexport const isPaymentError = (error: any): error is PaymentError => {\n return (\n error && typeof error === \"object\" && \"type\" in error && \"error\" in error\n );\n};\n\nexport const normalizeValue = (\n value: PayoutAPITransaction[\"value\"],\n): bigint => {\n // ERC20 tokens don't have a bignumber returned\n if (typeof value === \"number\") {\n return BigInt(value);\n }\n\n if (typeof value === \"string\") {\n return BigInt(value);\n }\n\n if (typeof value === \"object\" && value !== null && \"hex\" in value) {\n return BigInt(value.hex);\n }\n\n // Fallback to 0 if we can't parse it\n console.warn(\"Unknown value format, defaulting to 0:\", value);\n return BigInt(0);\n};\n\nexport const executeTransactions = async (\n transactions: PayoutAPITransaction[],\n sendTransaction: SendTransactionFunction,\n waitForTransaction: WaitForTransactionFunction,\n): Promise => {\n const receipts: TransactionReceipt[] = [];\n\n try {\n for (const tx of transactions) {\n const hash = await sendTransaction({\n to: tx.to as `0x${string}`,\n data: tx.data as `0x${string}`,\n value: normalizeValue(tx.value),\n });\n\n const receipt = await waitForTransaction(hash);\n receipts.push(receipt);\n }\n\n return receipts;\n } catch (error) {\n console.error(\"Transaction execution failed:\", error);\n throw { type: \"transaction\", error: error as Error } as PaymentError;\n }\n};\n\nexport const createPayout = async (\n rnApiClientId: string,\n params: PaymentParams,\n): Promise => {\n const {\n amountInUsd,\n payerWallet,\n recipientWallet,\n paymentCurrency,\n feeInfo,\n } = params;\n\n const response = await fetch(`${RN_API_URL}/v2/payouts`, {\n method: \"POST\",\n headers: {\n \"x-client-id\": rnApiClientId,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n amount: amountInUsd,\n payerWallet: payerWallet,\n payee: recipientWallet,\n invoiceCurrency: \"USD\",\n paymentCurrency: paymentCurrency,\n feePercentage: feeInfo?.feePercentage || undefined,\n feeAddress: feeInfo?.feeAddress || undefined,\n customerInfo: params.customerInfo,\n }),\n });\n\n return response;\n};\n\nexport interface PaymentResponse {\n requestId: string;\n transactionReceipts: TransactionReceipt[];\n}\n\nexport const executePayment = async ({\n paymentParams,\n rnApiClientId,\n sendTransaction,\n waitForTransaction,\n}: {\n rnApiClientId: string;\n paymentParams: PaymentParams;\n sendTransaction: SendTransactionFunction;\n waitForTransaction: WaitForTransactionFunction;\n}): Promise => {\n try {\n const response = await createPayout(rnApiClientId, paymentParams);\n\n if (!response.ok) {\n let errorMessage = \"Failed to create payment\";\n\n try {\n const errorData = await response.json();\n errorMessage = errorData.error || errorData.message || errorMessage;\n } catch (_parsingError) {\n // If we can't parse the error response, just use status text\n errorMessage = `HTTP ${response.status}: ${response.statusText}`;\n }\n\n const error = new Error(errorMessage);\n throw { type: \"api\", error } as PaymentError;\n }\n\n const data: PayoutAPIResponse = await response.json();\n\n if (data?.transactions) {\n const transactionReceipts = await executeTransactions(\n data.transactions,\n sendTransaction,\n waitForTransaction,\n );\n\n return { requestId: data.requestId, transactionReceipts };\n } else {\n const error = new Error(\"No transaction data received from backend\");\n throw { type: \"api\", error } as PaymentError;\n }\n } catch (error) {\n console.error(\"Error in payment flow:\", error);\n if (isPaymentError(error)) {\n throw error;\n } else {\n throw { type: \"unknown\", error: error as Error } as PaymentError;\n }\n }\n};\n", + "content": "import { TransactionReceipt } from \"viem\";\nimport { RN_API_URL } from \"../constants\";\nimport type { FeeInfo, PaymentError } from \"../types\";\n\nexport interface PaymentParams {\n amountInUsd: string;\n payerWallet: string;\n recipientWallet: string;\n paymentCurrency: string;\n feeInfo?: FeeInfo;\n customerInfo: {\n // This matches the API spec\n firstName?: string;\n lastName?: string;\n email?: string;\n address?: {\n street?: string;\n city?: string;\n state?: string;\n postalCode?: string;\n country?: string;\n };\n };\n}\n\ninterface PayoutAPITransaction {\n to: string;\n data: string;\n value: number | string | { type: string; hex: string };\n}\nexport interface PayoutAPIResponse {\n requestId: string;\n paymentReference: string;\n transactions: PayoutAPITransaction[];\n metadata: {\n stepsRequired: number;\n needsApproval: boolean;\n approvalTransactionIndex: number;\n paymentTransactionIndex: number;\n };\n}\n\nexport type TxParams = {\n to: `0x${string}`;\n data: `0x${string}`;\n value: bigint;\n};\n\nexport type SendTransactionFunction = (tx: TxParams) => Promise<`0x${string}`>;\n\nexport type WaitForTransactionFunction = (\n hash: `0x${string}`,\n) => Promise;\n\nexport const isPaymentError = (error: any): error is PaymentError => {\n return (\n error && typeof error === \"object\" && \"type\" in error && \"error\" in error\n );\n};\n\nexport const normalizeValue = (\n value: PayoutAPITransaction[\"value\"],\n): bigint => {\n // ERC20 tokens don't have a bignumber returned\n if (typeof value === \"number\") {\n return BigInt(value);\n }\n\n if (typeof value === \"string\") {\n return BigInt(value);\n }\n\n if (typeof value === \"object\" && value !== null && \"hex\" in value) {\n return BigInt(value.hex);\n }\n\n // Fallback to 0 if we can't parse it\n console.warn(\"Unknown value format, defaulting to 0:\", value);\n return BigInt(0);\n};\n\nexport const executeTransactions = async (\n transactions: PayoutAPITransaction[],\n sendTransaction: SendTransactionFunction,\n waitForTransaction: WaitForTransactionFunction,\n): Promise => {\n const receipts: TransactionReceipt[] = [];\n\n try {\n for (const tx of transactions) {\n const hash = await sendTransaction({\n to: tx.to as `0x${string}`,\n data: tx.data as `0x${string}`,\n value: normalizeValue(tx.value),\n });\n\n const receipt = await waitForTransaction(hash);\n receipts.push(receipt);\n }\n\n return receipts;\n } catch (error) {\n console.error(\"Transaction execution failed:\", error);\n throw { type: \"transaction\", error: error as Error } as PaymentError;\n }\n};\n\nexport const createPayout = async (\n rnApiClientId: string,\n params: PaymentParams,\n): Promise => {\n const {\n amountInUsd,\n payerWallet,\n recipientWallet,\n paymentCurrency,\n feeInfo,\n } = params;\n\n const response = await fetch(`${RN_API_URL}/v2/payouts`, {\n method: \"POST\",\n headers: {\n \"x-client-id\": rnApiClientId,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n amount: amountInUsd,\n payerWallet: payerWallet,\n payee: recipientWallet,\n invoiceCurrency: \"USD\",\n paymentCurrency: paymentCurrency,\n feePercentage: feeInfo?.feePercentage || undefined,\n feeAddress: feeInfo?.feeAddress || undefined,\n customerInfo: params.customerInfo,\n }),\n });\n\n return response;\n};\n\nexport interface PaymentResponse {\n requestId: string;\n transactionReceipts: TransactionReceipt[];\n}\n\nexport const executePayment = async ({\n paymentParams,\n rnApiClientId,\n sendTransaction,\n waitForTransaction,\n}: {\n rnApiClientId: string;\n paymentParams: PaymentParams;\n sendTransaction: SendTransactionFunction;\n waitForTransaction: WaitForTransactionFunction;\n}): Promise => {\n try {\n const response = await createPayout(rnApiClientId, paymentParams);\n\n if (!response.ok) {\n let errorMessage = \"Failed to create payment\";\n\n try {\n const errorData = await response.json();\n errorMessage = errorData.error || errorData.message || errorMessage;\n } catch (_parsingError) {\n // If we can't parse the error response, just use status text\n errorMessage = `HTTP ${response.status}: ${response.statusText}`;\n }\n\n const error = new Error(errorMessage);\n throw { type: \"api\", error } as PaymentError;\n }\n\n const data: PayoutAPIResponse = await response.json();\n\n if (Array.isArray(data?.transactions) && data.transactions.length > 0) {\n const transactionReceipts = await executeTransactions(\n data.transactions,\n sendTransaction,\n waitForTransaction,\n );\n\n return { requestId: data.requestId, transactionReceipts };\n } else {\n const error = new Error(\"No transaction data received from backend\");\n throw { type: \"api\", error } as PaymentError;\n }\n } catch (error) {\n console.error(\"Error in payment flow:\", error);\n if (isPaymentError(error)) {\n throw error;\n } else {\n throw { type: \"unknown\", error: error as Error } as PaymentError;\n }\n }\n};\n", "type": "registry:lib", "target": "components/payment-widget/utils/payment.ts" }, @@ -112,13 +112,13 @@ }, { "path": "registry/default/payment-widget/utils/receipt.ts", - "content": "import type { BuyerInfo, CompanyInfo, ReceiptItem } from \"../types\";\n\nexport interface PaymentInfo {\n chain: string;\n currency: string;\n exchangeRate: number;\n transactionHash?: string;\n}\n\nexport interface ReceiptMetadata {\n receiptNumber: string;\n issueDate: Date;\n notes?: string;\n}\n\ninterface ReceiptBuyerInfo extends BuyerInfo {\n walletAddress: string;\n}\n\ninterface ReceiptCompanyInfo extends CompanyInfo {\n walletAddress: string;\n}\n\nexport interface ReceiptData {\n company: ReceiptCompanyInfo;\n buyer: ReceiptBuyerInfo;\n payment: PaymentInfo;\n items: ReceiptItem[];\n metadata: ReceiptMetadata;\n totals: {\n totalDiscount: number;\n totalTax: number;\n total: number;\n totalUSD: number;\n };\n}\n\nexport const generateReceiptNumber = (prefix: string = \"REC\"): string => {\n const timestamp = Date.now();\n const random = Math.floor(Math.random() * 1000)\n .toString()\n .padStart(3, \"0\");\n return `${prefix}-${timestamp}-${random}`;\n};\n\nexport const formatUSDAmount = (amount: number): string => {\n return new Intl.NumberFormat(\"en-US\", {\n style: \"currency\",\n currency: \"USD\",\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n }).format(amount);\n};\n\nexport const formatCryptoAmount = (\n amount: number,\n currency: string,\n): string => {\n return `${amount} ${currency}`;\n};\n\nexport const formatReceiptDate = (date: Date): string => {\n return date.toLocaleDateString(\"en-US\", {\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n });\n};\n\nexport interface CreateReceiptParams {\n company: ReceiptCompanyInfo;\n buyer: ReceiptBuyerInfo;\n payment: PaymentInfo;\n items: ReceiptItem[];\n totals: {\n totalDiscount: number;\n totalTax: number;\n total: number;\n totalUSD: number;\n };\n metadata: Omit;\n}\n\nexport const createReceipt = (params: CreateReceiptParams): ReceiptData => {\n const metadata: ReceiptMetadata = {\n issueDate: new Date(),\n ...params.metadata,\n };\n\n const receipt: ReceiptData = {\n metadata,\n company: params.company,\n buyer: params.buyer,\n payment: params.payment,\n items: params.items,\n totals: params.totals,\n };\n\n return receipt;\n};\n\nexport const ReceiptUtils = {\n createReceipt,\n generateReceiptNumber,\n formatUSDAmount,\n formatCryptoAmount,\n formatReceiptDate,\n} as const;\n", + "content": "import type { BuyerInfo, CompanyInfo, ReceiptItem } from \"../types\";\n\nexport interface PaymentInfo {\n chain: string;\n currency: string;\n exchangeRate: number;\n transactionHash?: string;\n}\n\nexport interface ReceiptMetadata {\n receiptNumber: string;\n issueDate: Date;\n notes?: string;\n}\n\ninterface ReceiptBuyerInfo extends BuyerInfo {\n walletAddress: string;\n}\n\ninterface ReceiptCompanyInfo extends CompanyInfo {\n walletAddress: string;\n}\n\nexport interface ReceiptData {\n company: ReceiptCompanyInfo;\n buyer: ReceiptBuyerInfo;\n payment: PaymentInfo;\n items: ReceiptItem[];\n metadata: ReceiptMetadata;\n totals: {\n totalDiscount: number;\n totalTax: number;\n total: number;\n totalUSD: number;\n };\n}\n\nexport const generateReceiptNumber = (prefix: string = \"REC\"): string => {\n const timestamp = Date.now();\n const random = Math.floor(Math.random() * 1000)\n .toString()\n .padStart(3, \"0\");\n return `${prefix}-${timestamp}-${random}`;\n};\n\nexport const formatUSDAmount = (amount: number): string => {\n return new Intl.NumberFormat(\"en-US\", {\n style: \"currency\",\n currency: \"USD\",\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n }).format(amount);\n};\n\nexport const formatCryptoAmount = (\n amount: number,\n currency: string,\n): string => {\n return `${amount} ${currency}`;\n};\n\nexport const formatReceiptDate = (date: Date): string => {\n return date.toLocaleDateString(\"en-US\", {\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n });\n};\n\nexport interface CreateReceiptParams {\n company: ReceiptCompanyInfo;\n buyer: ReceiptBuyerInfo;\n payment: PaymentInfo;\n items: ReceiptItem[];\n totals: {\n totalDiscount: number;\n totalTax: number;\n total: number;\n totalUSD: number;\n };\n metadata: Omit;\n}\n\nexport const createReceipt = (params: CreateReceiptParams): ReceiptData => {\n const metadata: ReceiptMetadata = {\n ...params.metadata,\n issueDate: new Date(),\n };\n\n const receipt: ReceiptData = {\n metadata,\n company: params.company,\n buyer: params.buyer,\n payment: params.payment,\n items: params.items,\n totals: params.totals,\n };\n\n return receipt;\n};\n\nexport const ReceiptUtils = {\n createReceipt,\n generateReceiptNumber,\n formatUSDAmount,\n formatCryptoAmount,\n formatReceiptDate,\n} as const;\n", "type": "registry:lib", "target": "components/payment-widget/utils/receipt.ts" }, { "path": "registry/default/payment-widget/hooks/use-payment.ts", - "content": "import { useState } from \"react\";\nimport { useAccount, useSendTransaction, useConfig } from \"wagmi\";\nimport { waitForTransactionReceipt } from \"wagmi/actions\";\nimport { createPublicClient, http } from \"viem\";\nimport {\n executePayment,\n type PaymentParams,\n type TxParams,\n type PaymentResponse,\n type SendTransactionFunction,\n type WaitForTransactionFunction,\n} from \"../utils/payment\";\nimport type { PaymentError } from \"../types/index\";\nimport type { Account, WalletClient, TransactionReceipt } from \"viem\";\n\nexport const usePayment = (walletAccount?: WalletClient) => {\n const [isExecuting, setIsExecuting] = useState(false);\n const { isConnected: wagmiConnected, address: wagmiAddress } = useAccount();\n const { sendTransactionAsync } = useSendTransaction();\n const config = useConfig();\n\n const isConnected = walletAccount\n ? Boolean(walletAccount.account)\n : wagmiConnected;\n const address = walletAccount ? walletAccount.account?.address : wagmiAddress;\n const isUsingCustomWallet = walletAccount?.account !== undefined;\n\n const wrappedSendTransaction: SendTransactionFunction = isUsingCustomWallet\n ? async (transaction: TxParams): Promise<`0x${string}`> => {\n const hash = await walletAccount.sendTransaction({\n account: walletAccount.account as Account,\n chain: walletAccount.chain,\n to: transaction.to,\n data: transaction.data,\n value: transaction.value,\n });\n\n return hash;\n }\n : async (tx: TxParams): Promise<`0x${string}`> => {\n const hash = await sendTransactionAsync(tx);\n\n return hash;\n };\n\n const wrappedWaitForTransaction: WaitForTransactionFunction =\n isUsingCustomWallet\n ? async (hash: `0x${string}`): Promise => {\n // Using viem we create a public read client\n const publicClient = createPublicClient({\n chain: walletAccount.chain,\n transport: http(), // TODO: check why walletAccount.transport wouldn't work, for now http is fine\n });\n\n const receipt = await publicClient.waitForTransactionReceipt({\n hash,\n });\n\n return receipt;\n }\n : async (hash: `0x${string}`): Promise => {\n const receipt = await waitForTransactionReceipt(config, {\n hash,\n });\n return receipt;\n };\n\n const execute = async (\n rnApiClientId: string,\n params: PaymentParams,\n ): Promise => {\n if (!isConnected || !address) {\n throw {\n type: \"wallet\",\n error: new Error(\"Wallet not connected\"),\n } as PaymentError;\n }\n\n setIsExecuting(true);\n try {\n return await executePayment({\n rnApiClientId,\n paymentParams: {\n amountInUsd: params.amountInUsd,\n payerWallet: address,\n recipientWallet: params.recipientWallet,\n paymentCurrency: params.paymentCurrency,\n feeInfo: params.feeInfo,\n customerInfo: params.customerInfo,\n },\n sendTransaction: wrappedSendTransaction,\n waitForTransaction: wrappedWaitForTransaction,\n });\n } finally {\n setIsExecuting(false);\n }\n };\n\n return {\n isExecuting,\n executePayment: execute,\n isConnected,\n address,\n };\n};\n", + "content": "import { useState } from \"react\";\nimport { useAccount, useSendTransaction, useConfig } from \"wagmi\";\nimport { waitForTransactionReceipt } from \"wagmi/actions\";\nimport { createPublicClient, http } from \"viem\";\nimport {\n executePayment,\n type PaymentParams,\n type TxParams,\n type PaymentResponse,\n type SendTransactionFunction,\n type WaitForTransactionFunction,\n} from \"../utils/payment\";\nimport type { PaymentError } from \"../types/index\";\nimport type { Account, WalletClient, TransactionReceipt } from \"viem\";\n\nexport const usePayment = (walletAccount?: WalletClient) => {\n const [isExecuting, setIsExecuting] = useState(false);\n const { isConnected: wagmiConnected, address: wagmiAddress } = useAccount();\n const { sendTransactionAsync } = useSendTransaction();\n const config = useConfig();\n\n const isConnected = walletAccount\n ? Boolean(walletAccount.account)\n : wagmiConnected;\n const address = walletAccount ? walletAccount.account?.address : wagmiAddress;\n const isUsingCustomWallet = walletAccount?.account !== undefined;\n\n const wrappedSendTransaction: SendTransactionFunction = isUsingCustomWallet\n ? async (transaction: TxParams): Promise<`0x${string}`> => {\n const hash = await walletAccount.sendTransaction({\n account: walletAccount.account as Account,\n chain: walletAccount.chain,\n to: transaction.to,\n data: transaction.data,\n value: transaction.value,\n });\n\n return hash;\n }\n : async (tx: TxParams): Promise<`0x${string}`> => {\n const hash = await sendTransactionAsync(tx);\n\n return hash;\n };\n\n const wrappedWaitForTransaction: WaitForTransactionFunction =\n isUsingCustomWallet\n ? async (hash: `0x${string}`): Promise => {\n // Using viem we create a public read client\n if (!walletAccount.chain) {\n throw {\n type: \"wallet\",\n error: new Error(\"Wallet isn't connected to any chain\"),\n } as PaymentError;\n }\n const publicClient = createPublicClient({\n chain: walletAccount.chain,\n transport: http(), // TODO: check why walletAccount.transport wouldn't work, for now http is fine\n });\n\n const receipt = await publicClient.waitForTransactionReceipt({\n hash,\n });\n\n return receipt;\n }\n : async (hash: `0x${string}`): Promise => {\n const receipt = await waitForTransactionReceipt(config, {\n hash,\n });\n return receipt;\n };\n\n const execute = async (\n rnApiClientId: string,\n params: PaymentParams,\n ): Promise => {\n if (!isConnected || !address) {\n throw {\n type: \"wallet\",\n error: new Error(\"Wallet not connected\"),\n } as PaymentError;\n }\n\n setIsExecuting(true);\n try {\n return await executePayment({\n rnApiClientId,\n paymentParams: {\n amountInUsd: params.amountInUsd,\n payerWallet: address,\n recipientWallet: params.recipientWallet,\n paymentCurrency: params.paymentCurrency,\n feeInfo: params.feeInfo,\n customerInfo: params.customerInfo,\n },\n sendTransaction: wrappedSendTransaction,\n waitForTransaction: wrappedWaitForTransaction,\n });\n } finally {\n setIsExecuting(false);\n }\n };\n\n return {\n isExecuting,\n executePayment: execute,\n isConnected,\n address,\n };\n};\n", "type": "registry:lib", "target": "components/payment-widget/hooks/use-payment.ts" }, @@ -136,27 +136,33 @@ }, { "path": "registry/default/payment-widget/context/web3-context.tsx", - "content": "\"use client\";\n\nimport { QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\nimport { WagmiProvider } from \"wagmi\";\nimport { getWagmiConfig } from \"../utils/wagmi\";\nimport { useMemo, useRef } from \"react\";\n\nconst queryClient = new QueryClient();\n\nexport function Web3Provider({\n children,\n walletConnectProjectId,\n}: {\n children: React.ReactNode;\n walletConnectProjectId?: string;\n}) {\n // @NOTE this may seem weird, but walletConnect doesn't handle strict mode initializing it twice, so we explicitly use a ref to store the config\n const configRef = useRef | null>(null);\n\n const wagmiConfig = useMemo(() => {\n if (!configRef.current) {\n configRef.current = getWagmiConfig(walletConnectProjectId);\n }\n return configRef.current;\n }, [walletConnectProjectId]);\n\n return (\n \n {children}\n \n );\n}\n", + "content": "\"use client\";\n\nimport { QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\nimport { WagmiProvider } from \"wagmi\";\nimport { getWagmiConfig } from \"../utils/wagmi\";\nimport { type ReactNode, useMemo, useRef } from \"react\";\n\nconst queryClient = new QueryClient();\n\nexport function Web3Provider({\n children,\n walletConnectProjectId,\n}: {\n children: ReactNode;\n walletConnectProjectId?: string;\n}) {\n // @NOTE this may seem weird, but walletConnect doesn't handle strict mode initializing it twice, so we explicitly use a ref to store the config\n const configRef = useRef | null>(null);\n\n const wagmiConfig = useMemo(() => {\n if (!configRef.current) {\n configRef.current = getWagmiConfig(walletConnectProjectId);\n }\n return configRef.current;\n }, [walletConnectProjectId]);\n\n return (\n \n {children}\n \n );\n}\n", "type": "registry:component", "target": "components/payment-widget/context/web3-context.tsx" }, { "path": "registry/default/payment-widget/components/receipt/receipt-template.tsx", - "content": "import type { FC } from \"react\";\nimport {\n formatCryptoAmount,\n formatUSDAmount,\n formatReceiptDate,\n type ReceiptData,\n} from \"../../utils/receipt\";\nimport \"./styles.css\";\n\nexport const ReceiptPDFTemplate: FC<{ receipt: ReceiptData }> = ({\n receipt,\n}) => {\n return (\n
\n
\n
\n

{receipt.company.name}

\n
\n {receipt.company.address && (\n <>\n
{receipt.company.address.street}
\n
\n {receipt.company.address.city},{\" \"}\n {receipt.company.address.state}{\" \"}\n {receipt.company.address.postalCode}{\" \"}\n {receipt.company.address.country}\n
\n \n )}\n {receipt.company.email &&
{receipt.company.email}
}\n {receipt.company.taxId && (\n
Tax ID: {receipt.company.taxId}
\n )}\n
\n
\n\n
\n

REC

\n
\n #{receipt.metadata.receiptNumber}\n
\n
\n {formatReceiptDate(receipt.metadata.issueDate)}\n
\n
\n
\n\n
\n
\n

FROM

\n
{receipt.company.name}
\n
{receipt.company.walletAddress}
\n
\n {receipt.company.address && (\n <>\n
{receipt.company.address.street}
\n
\n {receipt.company.address.city},{\" \"}\n {receipt.company.address.state}{\" \"}\n {receipt.company.address.postalCode}{\" \"}\n {receipt.company.address.country}\n
\n \n )}\n
\n
\n\n
\n

TO

\n
\n {[receipt.buyer.firstName, receipt.buyer.lastName]\n .filter(Boolean)\n .join(\" \") || \"Customer\"}\n
\n
{receipt.buyer.walletAddress}
\n {receipt.buyer.email && (\n
{receipt.buyer.email}
\n )}\n {receipt.buyer.address && (\n
\n
{receipt.buyer.address.street}
\n
\n {receipt.buyer.address.city}, {receipt.buyer.address.state}{\" \"}\n {receipt.buyer.address.postalCode}{\" \"}\n {receipt.buyer.address.country}\n
\n
\n )}\n
\n
\n\n
\n
\n Payment Method:{\" \"}\n {`${receipt.payment.currency} on ${receipt.payment.chain}`}\n
\n {receipt.payment.transactionHash && (\n
\n Transaction: {receipt.payment.transactionHash}\n
\n )}\n
\n\n \n \n \n \n \n \n \n \n \n \n \n \n {receipt.items.map((item, index) => (\n \n \n \n \n \n \n \n \n ))}\n \n
DescriptionQtyUnit PriceDisc%Tax%Total
{item.description}{item.quantity}\n {formatCryptoAmount(\n item.unitPrice,\n item.currency || receipt.payment.currency,\n )}\n {item.discount || 0}%{item.tax || 0}%\n {formatCryptoAmount(\n item.total,\n item.currency || receipt.payment.currency,\n )}\n
\n\n
\n
\n {receipt.totals.totalDiscount > 0 && (\n
\n Discount:\n \n -\n {formatCryptoAmount(\n receipt.totals.totalDiscount,\n receipt.payment.currency,\n )}\n \n
\n )}\n\n {receipt.totals.totalTax > 0 && (\n
\n Tax:\n \n {formatCryptoAmount(\n receipt.totals.totalTax,\n receipt.payment.currency,\n )}\n \n
\n )}\n\n
\n Subtotal:\n \n {formatCryptoAmount(\n receipt.totals.total,\n receipt.payment.currency,\n )}\n \n
\n\n
\n TOTAL (USD):\n \n {formatUSDAmount(receipt.totals.totalUSD)}\n \n
\n
\n
\n\n {receipt.metadata.notes && (\n
\n Notes: {receipt.metadata.notes}\n
\n )}\n
\n );\n};\n", + "content": "import type { FC } from \"react\";\nimport {\n formatCryptoAmount,\n formatUSDAmount,\n formatReceiptDate,\n type ReceiptData,\n} from \"../../utils/receipt\";\nimport \"./styles.module.css\";\n\nexport const ReceiptPDFTemplate: FC<{ receipt: ReceiptData }> = ({\n receipt,\n}) => {\n return (\n
\n
\n
\n

{receipt.company.name}

\n
\n {receipt.company.address && (\n <>\n
{receipt.company.address.street}
\n
\n {receipt.company.address.city},{\" \"}\n {receipt.company.address.state}{\" \"}\n {receipt.company.address.postalCode}{\" \"}\n {receipt.company.address.country}\n
\n \n )}\n {receipt.company.email &&
{receipt.company.email}
}\n {receipt.company.taxId && (\n
Tax ID: {receipt.company.taxId}
\n )}\n
\n
\n\n
\n

REC

\n
\n #{receipt.metadata.receiptNumber}\n
\n
\n {formatReceiptDate(receipt.metadata.issueDate)}\n
\n
\n
\n\n
\n
\n

FROM

\n
{receipt.company.name}
\n
{receipt.company.walletAddress}
\n
\n {receipt.company.address && (\n <>\n
{receipt.company.address.street}
\n
\n {receipt.company.address.city},{\" \"}\n {receipt.company.address.state}{\" \"}\n {receipt.company.address.postalCode}{\" \"}\n {receipt.company.address.country}\n
\n \n )}\n
\n
\n\n
\n

TO

\n
\n {[receipt.buyer.firstName, receipt.buyer.lastName]\n .filter(Boolean)\n .join(\" \") || \"Customer\"}\n
\n
{receipt.buyer.walletAddress}
\n {receipt.buyer.email && (\n
{receipt.buyer.email}
\n )}\n {receipt.buyer.address && (\n
\n
{receipt.buyer.address.street}
\n
\n {receipt.buyer.address.city}, {receipt.buyer.address.state}{\" \"}\n {receipt.buyer.address.postalCode}{\" \"}\n {receipt.buyer.address.country}\n
\n
\n )}\n
\n
\n\n
\n
\n Payment Method:{\" \"}\n {`${receipt.payment.currency} on ${receipt.payment.chain}`}\n
\n {receipt.payment.transactionHash && (\n
\n Transaction: {receipt.payment.transactionHash}\n
\n )}\n
\n\n \n \n \n \n \n \n \n \n \n \n \n \n {receipt.items.map((item, index) => (\n \n \n \n \n \n \n \n \n ))}\n \n
DescriptionQtyUnit PriceDisc%Tax%Total
{item.description}{item.quantity}\n {formatCryptoAmount(\n item.unitPrice,\n item.currency || receipt.payment.currency,\n )}\n {item.discount || 0}%{item.tax || 0}%\n {formatCryptoAmount(\n item.total,\n item.currency || receipt.payment.currency,\n )}\n
\n\n
\n
\n {receipt.totals.totalDiscount > 0 && (\n
\n Discount:\n \n -\n {formatCryptoAmount(\n receipt.totals.totalDiscount,\n receipt.payment.currency,\n )}\n \n
\n )}\n\n {receipt.totals.totalTax > 0 && (\n
\n Tax:\n \n {formatCryptoAmount(\n receipt.totals.totalTax,\n receipt.payment.currency,\n )}\n \n
\n )}\n\n
\n Subtotal:\n \n {formatCryptoAmount(\n receipt.totals.total,\n receipt.payment.currency,\n )}\n \n
\n\n
\n TOTAL (USD):\n \n {formatUSDAmount(receipt.totals.totalUSD)}\n \n
\n
\n
\n\n {receipt.metadata.notes && (\n
\n Notes: {receipt.metadata.notes}\n
\n )}\n
\n );\n};\n", "type": "registry:component", "target": "components/payment-widget/components/receipt/receipt-template.tsx" }, { - "path": "registry/default/payment-widget/components/receipt/styles.css", + "path": "registry/default/payment-widget/components/receipt/styles.module.css", "content": ".receipt-container {\n background-color: #ffffff;\n padding: 20px;\n max-width: 800px;\n margin: 0 auto;\n font-family:\n -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;\n font-size: 12px;\n line-height: 1.4;\n color: #2d3748;\n}\n\n.receipt-header {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n margin-bottom: 20px;\n padding-bottom: 15px;\n border-bottom: 2px solid #e2e8f0;\n}\n\n.company-info {\n flex: 1;\n}\n\n.company-name {\n font-size: 24px;\n font-weight: 700;\n color: #1a202c;\n margin: 0 0 8px 0;\n}\n\n.company-details {\n font-size: 11px;\n color: #4a5568;\n line-height: 1.3;\n}\n\n.company-details > div {\n margin-bottom: 2px;\n}\n\n.receipt-title-section {\n text-align: right;\n}\n\n.receipt-title {\n font-size: 28px;\n font-weight: 700;\n color: #2d3748;\n margin: 0 0 4px 0;\n}\n\n.receipt-number {\n font-size: 16px;\n font-weight: 600;\n color: #4a5568;\n margin-bottom: 4px;\n}\n\n.receipt-date {\n font-size: 11px;\n color: #718096;\n}\n\n.party-info-section {\n display: flex;\n gap: 20px;\n margin-bottom: 16px;\n}\n\n.info-box {\n flex: 1;\n border: 1px solid #e2e8f0;\n border-radius: 6px;\n padding: 12px;\n background-color: #f7fafc;\n}\n\n.info-header {\n font-size: 11px;\n font-weight: 700;\n color: #2d3748;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin: 0 0 8px 0;\n}\n\n.party-name {\n font-weight: 600;\n font-size: 14px;\n color: #1a202c;\n margin-bottom: 4px;\n}\n\n.wallet-address {\n font-size: 10px;\n color: #718096;\n font-family: \"Monaco\", \"Courier New\", monospace;\n margin-bottom: 6px;\n word-break: break-all;\n}\n\n.email {\n font-size: 11px;\n color: #4a5568;\n margin-bottom: 4px;\n}\n\n.address-info {\n font-size: 11px;\n color: #4a5568;\n line-height: 1.3;\n}\n\n.address-info > div {\n margin-bottom: 2px;\n}\n\n.payment-info {\n background-color: #edf2f7;\n padding: 8px 12px;\n border-radius: 4px;\n margin-bottom: 16px;\n font-size: 11px;\n color: #2d3748;\n}\n\n.payment-info > div {\n margin-bottom: 2px;\n}\n\n.payment-info > div:last-child {\n margin-bottom: 0;\n}\n\n.transaction-hash {\n font-family: \"Monaco\", \"Courier New\", monospace;\n word-break: break-all;\n}\n\n.items-table {\n width: 100%;\n border-collapse: collapse;\n border: 1px solid #e2e8f0;\n margin-bottom: 16px;\n font-size: 11px;\n}\n\n.items-table th {\n background-color: #edf2f7;\n border: 1px solid #e2e8f0;\n padding: 8px 6px;\n font-weight: 600;\n text-align: left;\n color: #2d3748;\n}\n\n.items-table th.center {\n text-align: center;\n width: 40px;\n}\n\n.items-table th.right {\n text-align: right;\n width: 80px;\n}\n\n.items-table td {\n border: 1px solid #e2e8f0;\n padding: 6px;\n vertical-align: top;\n}\n\n.items-table td.center {\n text-align: center;\n}\n\n.items-table td.right {\n text-align: right;\n font-family: \"Monaco\", \"Courier New\", monospace;\n}\n\n.items-table .row-even {\n background-color: #ffffff;\n}\n\n.items-table .row-odd {\n background-color: #f7fafc;\n}\n\n.items-table .amount {\n font-weight: 600;\n}\n\n.totals-section {\n display: flex;\n justify-content: flex-end;\n margin-bottom: 16px;\n}\n\n.totals-box {\n background-color: #f7fafc;\n border: 1px solid #e2e8f0;\n border-radius: 6px;\n padding: 12px;\n min-width: 240px;\n}\n\n.total-line {\n display: flex;\n justify-content: space-between;\n margin-bottom: 4px;\n font-size: 11px;\n}\n\n.total-line.subtotal {\n padding-top: 6px;\n border-top: 1px solid #e2e8f0;\n font-weight: 600;\n}\n\n.total-line.final {\n font-size: 14px;\n font-weight: 700;\n color: #1a202c;\n padding-top: 6px;\n border-top: 2px solid #2d3748;\n}\n\n.total-amount {\n font-family: \"Monaco\", \"Courier New\", monospace;\n font-size: inherit;\n}\n\n.notes-section {\n border-top: 1px solid #e2e8f0;\n font-size: 11px;\n color: #4a5568;\n background-color: #f7fafc;\n padding: 8px 12px;\n border-radius: 4px;\n}\n", "type": "registry:component", - "target": "components/payment-widget/components/receipt/styles.css" + "target": "components/payment-widget/components/receipt/styles.module.css" }, { "path": "lib/utils.ts", "content": "import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n", "type": "registry:lib", "target": "lib/utils.ts" + }, + { + "path": "registry/default/payment-widget/README.md", + "content": "# Payment Widget\n\nA React component for accepting cryptocurrency payments using the Request Network protocol. This widget provides a complete payment flow with wallet connection, currency selection, buyer information collection, and payment processing.\n\n## Overview\n\nThe Payment Widget is a comprehensive solution for integrating cryptocurrency payments into React applications. It handles the entire payment process from wallet connection to payment confirmation, with support for multiple currencies and networks through the Request Network.\n\n## Features\n\n- **Multi-wallet support** - Compatible with MetaMask, WalletConnect, Coinbase Wallet, and Safe\n- **Currency flexibility** - Supports multiple cryptocurrencies with automatic conversion rates\n- **Receipt generation** - Built-in PDF receipt generation and download\n- **Network support** - Works across Ethereum mainnet, Arbitrum, Base, Optimism, Polygon, and Sepolia\n- **Customizable UI** - Configurable display options and Tailwind CSS theming\n- **TypeScript support** - Fully typed for enhanced developer experience\n- **Works with your Viem accounts** - if your users are already logged in, you can use their logged in Viem account.\n\n## Installation\n\nInstall the required dependencies:\n\n```bash\nnpm install wagmi viem @tanstack/react-query react-hook-form lucide-react html2pdf.js\n```\n\nAdd the Payment Widget to your project using shadcn/ui:\n\n```bash\nnpx shadcn add payment-widget\n```\n\n## Basic Usage\n\n```tsx\nimport { PaymentWidget } from \"@/components/payment-widget/payment-widget\";\n\nfunction App() {\n return (\n console.log(\"Payment successful:\", requestId, transactionReceipts)}\n onError={(error) => console.error(\"Payment failed:\", error)}\n />\n );\n}\n```\n\n## Props Reference\n\n### Core Props\n\n#### `amountInUsd` (required)\n- **Type**: `string`\n- **Description**: The payment amount in USD. This is the base amount that will be converted to the selected cryptocurrency at current exchange rates.\n- **Example**: `\"100.00\"`\n\n#### `recipientWallet` (required)\n- **Type**: `string`\n- **Description**: The Ethereum wallet address that will receive the payment. Must be a valid Ethereum address.\n- **Example**: `\"0x742d35Cc6639C0532c29e54F3D4B48E4d7d5f1E0\"`\n\n#### `paymentConfig` (required)\n- **Type**: `PaymentConfig`\n- **Description**: Configuration object containing payment-related settings.\n\n##### PaymentConfig Properties\n\n###### `walletConnectProjectId` (optional)\n- **Type**: `string`\n- **Description**: WalletConnect v2 project ID for wallet connection. Obtain from [WalletConnect Cloud](https://cloud.walletconnect.com/).\n\n###### `network` (required)\n- **Type**: `\"arbitrum\" | \"base\" | \"mainnet\" | \"optimism\" | \"polygon\" | \"sepolia\"`\n- **Description**: The blockchain network to process payments on.\n\n###### `rnApiClientId` (required)\n- **Type**: `string`\n- **Description**: Request Network API client ID for accessing conversion rates and processing payments. Obtain from Request Network.\n\n###### `feeInfo` (optional)\n- **Type**: `FeeInfo`\n- **Description**: Fee configuration for the payment. Defines any additional fees to be applied.\n\n###### `supportedCurrencies` (optional)\n- **Type**: `string[]`\n- **Description**: Array of cryptocurrency IDs to limit currency selection. If not provided, all available currencies for the network will be shown.\n- **Example**: `[\"ethereum-mainnet\", \"usdc-ethereum\"]`\n\n#### `receiptInfo` (required)\n- **Type**: `ReceiptInfo`\n- **Description**: Comprehensive receipt information for PDF generation and payment records.\n\n##### ReceiptInfo Properties\n\n###### `companyInfo` (required)\n- **Type**: `CompanyInfo`\n- **Description**: Your company's information for the receipt.\n\n**CompanyInfo Structure:**\n```typescript\n{\n name: string; // Company name\n address: {\n street: string;\n city: string;\n state: string;\n postalCode: string;\n };\n email?: string; // Company email\n taxId: string; // Tax identification number\n walletAddress: string; // Company wallet address\n}\n```\n\n###### `items` (required)\n- **Type**: `ReceiptItem[]`\n- **Description**: Array of line items for the receipt.\n\n**ReceiptItem Structure:**\n```typescript\n{\n id: string; // Unique item identifier\n description: string; // Item description\n quantity: number; // Quantity of items\n unitPrice: string; // Price per unit in USD\n total: string; // Total price for this line item\n currency?: string; // Currency override (defaults to USD)\n discount?: number; // Discount percentage (0-100)\n tax?: number; // Tax percentage (0-100)\n}\n```\n\n###### `totals` (required)\n- **Type**: `ReceiptTotals`\n- **Description**: Summary totals for the receipt.\n\n**ReceiptTotals Structure:**\n```typescript\n{\n total: string; // Total amount in base currency\n totalUSD: string; // Total amount in USD\n totalDiscount: string; // Total discount amount\n totalTax: string; // Total tax amount\n}\n```\n\n###### `buyerInfo` (optional)\n- **Type**: `BuyerInfo`\n- **Description**: Pre-filled buyer information. If provided, the buyer info form will be pre-populated.\n\n###### `receiptNumber` (optional)\n- **Type**: `string`\n- **Description**: Custom receipt number. If not provided, a default will be generated.\n\n### Configuration Props\n\n#### `uiConfig` (optional)\n- **Type**: `UiConfig`\n- **Description**: UI behavior configuration options.\n\n##### UiConfig Properties\n\n###### `showRequestScanUrl` (optional)\n- **Type**: `boolean`\n- **Default**: `true`\n- **Description**: Whether to show a link to view the payment on Request Scan after successful payment.\n\n###### `showReceiptDownload` (optional)\n- **Type**: `boolean`\n- **Default**: `true`\n- **Description**: Whether to show the receipt PDF download button after successful payment.\n\n#### `walletAccount` (optional)\n- **Type**: `WalletClient`\n- **Description**: Pre-connected wallet client (using Viem/Wagmi). If provided, the wallet connection step will be skipped. Useful when you already manage wallet connection in your application.\n\n### Event Handlers\n\n#### `onSuccess` (optional)\n- **Type**: `(requestId: string) => void | Promise`\n- **Description**: Callback function called when payment is successfully completed. Receives the Request Network request ID.\n\n#### `onError` (optional)\n- **Type**: `(error: PaymentError) => void | Promise`\n- **Description**: Callback function called when payment fails. Receives detailed error information.\n\n### Children\n\n#### `children` (optional)\n- **Type**: `ReactNode`\n- **Description**: Custom trigger element for the payment widget. If not provided, defaults to \"Pay with crypto\" button.\n- **Example**: \n```tsx\n\n \n\n```\n\n## Styling and Theming\n\nThe Payment Widget uses Tailwind CSS and respects your application's design system through CSS custom properties. The following variables can be customized:\n\n```css\n:root {\n --primary: #your-primary-color;\n --primary-foreground: #your-primary-text-color;\n --secondary: #your-secondary-color;\n --secondary-foreground: #your-secondary-text-color;\n --muted: #your-muted-color;\n --muted-foreground: #your-muted-text-color;\n --accent: #your-accent-color;\n --accent-foreground: #your-accent-text-color;\n --background: #your-background-color;\n --foreground: #your-text-color;\n --border: #your-border-color;\n --radius: 0.5rem;\n}\n```\n\n## Using Your Existing Wallet Client\n\nIf your application already manages wallet connections using Viem/Wagmi, you can pass your existing wallet client to skip the built-in wallet connection flow. This is perfect for applications that have their own wallet connection UI or state management.\n\n### With Wagmi\n\n```tsx\nimport { useWalletClient } from \"wagmi\";\nimport { PaymentWidget } from \"@/components/payment-widget/payment-widget\";\n\nfunction PaymentWithExistingWallet() {\n const { data: walletClient } = useWalletClient();\n\n return (\n console.log(\"Payment successful:\", requestId)}\n onError={(error) => console.error(\"Payment failed:\", error)}\n >\n Pay with My Connected Wallet\n \n );\n}\n```\n\n### With Direct Viem Client\n\nYou can also pass any Viem wallet client directly. For more information on creating wallet clients, see the [Viem documentation](https://viem.sh/docs/clients/wallet).\n\n```tsx\nimport { createWalletClient, custom } from \"viem\";\nimport { mainnet } from \"viem/chains\";\n\n// Create wallet client directly with Viem\nconst walletClient = createWalletClient({\n chain: mainnet,\n transport: custom(window.ethereum),\n});\n\n// Use with Payment Widget\n\n```\n\n### Benefits of Using Existing Wallet Client\n\n- **Consistent UX** - Users don't see multiple wallet connection prompts\n- **Shared State** - Wallet connection state is managed in one place\n- **Better Performance** - Reuses existing connection instead of creating new ones\n- **Simplified Flow** - Skips wallet selection step in the payment widget\n\nWhen `walletAccount` is provided, the Payment Widget will:\n- Skip the wallet connection step entirely\n- Use the provided wallet for all transactions\n- Display payment options immediately\n- Maintain your application's wallet connection state\n\n## Error Handling\n\nThe widget includes comprehensive error handling for common scenarios:\n\n- **Network connectivity issues**\n- **Insufficient wallet balance**\n- **Transaction rejection**\n- **Invalid wallet addresses**\n- **API rate limiting**\n\nAll errors are passed to the `onError` callback with detailed error information for debugging and user feedback.\n\n## Browser Support\n\n- Chrome 90+\n- Firefox 88+\n- Safari 14+\n- Edge 90+\n\n## Dependencies\n\nThe Payment Widget requires these peer dependencies:\n\n- `react` \n- `wagmi` \n- `viem` \n- `@tanstack/react-query` \n- `react-hook-form` \n- `lucide-react`\n- `html2pdf.js`\n\n## Security Considerations\n\n- Always validate payment amounts on your backend\n- Verify wallet addresses before processing\n- Implement proper rate limiting for payment requests\n- Store sensitive configuration (API keys) securely\n- Use HTTPS in production environments\n\n## Support\n\nFor technical support and bug reports, please visit the [Request Network documentation](https://docs.request.network) or raise an issue in the repository.", + "type": "registry:lib", + "target": "components/payment-widget/README.md" } ] } \ No newline at end of file diff --git a/public/r/registry.json b/public/r/registry.json index 903e0cc..d2c5331 100644 --- a/public/r/registry.json +++ b/public/r/registry.json @@ -16,10 +16,10 @@ "radio-group" ], "dependencies": [ - "wagmi@^2.12.29", - "viem@^2.21.53", - "@tanstack/react-query@^5.64.1", - "react-hook-form@^7.0.0", + "wagmi@^2.16.9", + "viem@^2.37.3", + "@tanstack/react-query@^5.86.0", + "react-hook-form@^7.62.0", "lucide-react@^0.542.0", "html2pdf.js@^0.12.0" ], @@ -130,14 +130,19 @@ "target": "components/payment-widget/components/receipt/receipt-template.tsx" }, { - "path": "registry/default/payment-widget/components/receipt/styles.css", + "path": "registry/default/payment-widget/components/receipt/styles.module.css", "type": "registry:component", - "target": "components/payment-widget/components/receipt/styles.css" + "target": "components/payment-widget/components/receipt/styles.module.css" }, { "path": "lib/utils.ts", "type": "registry:lib", "target": "lib/utils.ts" + }, + { + "path": "registry/default/payment-widget/README.md", + "type": "registry:lib", + "target": "components/payment-widget/README.md" } ] } diff --git a/registry.json b/registry.json index 903e0cc..d2c5331 100644 --- a/registry.json +++ b/registry.json @@ -16,10 +16,10 @@ "radio-group" ], "dependencies": [ - "wagmi@^2.12.29", - "viem@^2.21.53", - "@tanstack/react-query@^5.64.1", - "react-hook-form@^7.0.0", + "wagmi@^2.16.9", + "viem@^2.37.3", + "@tanstack/react-query@^5.86.0", + "react-hook-form@^7.62.0", "lucide-react@^0.542.0", "html2pdf.js@^0.12.0" ], @@ -130,14 +130,19 @@ "target": "components/payment-widget/components/receipt/receipt-template.tsx" }, { - "path": "registry/default/payment-widget/components/receipt/styles.css", + "path": "registry/default/payment-widget/components/receipt/styles.module.css", "type": "registry:component", - "target": "components/payment-widget/components/receipt/styles.css" + "target": "components/payment-widget/components/receipt/styles.module.css" }, { "path": "lib/utils.ts", "type": "registry:lib", "target": "lib/utils.ts" + }, + { + "path": "registry/default/payment-widget/README.md", + "type": "registry:lib", + "target": "components/payment-widget/README.md" } ] } diff --git a/registry/default/payment-widget/README.md b/registry/default/payment-widget/README.md index c332ac9..9f4f329 100644 --- a/registry/default/payment-widget/README.md +++ b/registry/default/payment-widget/README.md @@ -74,7 +74,7 @@ function App() { totalTax: 0.00, }, }} - onSuccess={(requestId) => console.log("Payment successful:", requestId)} + onSuccess={(requestId, transactionReceipts) => console.log("Payment successful:", requestId, transactionReceipts)} onError={(error) => console.error("Payment failed:", error)} /> ); @@ -346,13 +346,13 @@ All errors are passed to the `onError` callback with detailed error information The Payment Widget requires these peer dependencies: -- `react` ^18.0.0 -- `wagmi` ^2.12.29 -- `viem` ^2.21.53 -- `@tanstack/react-query` ^5.64.1 -- `react-hook-form` ^7.0.0 -- `lucide-react` ^0.263.1 -- `html2pdf.js` ^0.12.0 +- `react` +- `wagmi` +- `viem` +- `@tanstack/react-query` +- `react-hook-form` +- `lucide-react` +- `html2pdf.js` ## Security Considerations diff --git a/registry/default/payment-widget/components/payment-success.tsx b/registry/default/payment-widget/components/payment-success.tsx index ae9e5eb..37eeeeb 100644 --- a/registry/default/payment-widget/components/payment-success.tsx +++ b/registry/default/payment-widget/components/payment-success.tsx @@ -30,6 +30,7 @@ export function PaymentSuccess({ connectedWalletAddress, receiptInfo, uiConfig, + paymentConfig: { network }, } = usePaymentWidgetContext(); const receiptRef = useRef(null); @@ -43,7 +44,7 @@ export function PaymentSuccess({ walletAddress: connectedWalletAddress || "", }, payment: { - chain: "ethereum", + chain: network, currency: selectedCurrency.symbol, exchangeRate: 1, transactionHash: "", diff --git a/registry/default/payment-widget/components/receipt/receipt-template.tsx b/registry/default/payment-widget/components/receipt/receipt-template.tsx index d997acf..1e83df9 100644 --- a/registry/default/payment-widget/components/receipt/receipt-template.tsx +++ b/registry/default/payment-widget/components/receipt/receipt-template.tsx @@ -5,7 +5,7 @@ import { formatReceiptDate, type ReceiptData, } from "../../utils/receipt"; -import "./styles.css"; +import "./styles.module.css"; export const ReceiptPDFTemplate: FC<{ receipt: ReceiptData }> = ({ receipt, diff --git a/registry/default/payment-widget/components/receipt/styles.css b/registry/default/payment-widget/components/receipt/styles.module.css similarity index 100% rename from registry/default/payment-widget/components/receipt/styles.css rename to registry/default/payment-widget/components/receipt/styles.module.css diff --git a/registry/default/payment-widget/context/payment-widget-context.tsx b/registry/default/payment-widget/context/payment-widget-context.tsx index 7e20e2b..252e42d 100644 --- a/registry/default/payment-widget/context/payment-widget-context.tsx +++ b/registry/default/payment-widget/context/payment-widget-context.tsx @@ -1,6 +1,6 @@ "use client"; -import { createContext, useContext, type ReactNode } from "react"; +import { createContext, useContext, useMemo, type ReactNode } from "react"; import { useAccount } from "wagmi"; import type { ReceiptInfo, FeeInfo, PaymentError } from "../types/index"; import type { TransactionReceipt, WalletClient } from "viem"; @@ -81,26 +81,44 @@ export function PaymentWidgetProvider({ ? walletAccount.account?.address : address; - const contextValue: PaymentWidgetContextValue = { - amountInUsd, - recipientWallet, - walletAccount, - connectedWalletAddress, - isWalletOverride, - paymentConfig: { - rnApiClientId: paymentConfig.rnApiClientId, - network: paymentConfig.network, - feeInfo: paymentConfig.feeInfo, - supportedCurrencies: paymentConfig.supportedCurrencies, - }, - uiConfig: { - showReceiptDownload: uiConfig?.showReceiptDownload ?? true, - showRequestScanUrl: uiConfig?.showRequestScanUrl ?? true, - }, - receiptInfo, - onSuccess, - onError, - }; + const contextValue: PaymentWidgetContextValue = useMemo( + () => ({ + amountInUsd, + recipientWallet, + walletAccount, + connectedWalletAddress, + isWalletOverride, + paymentConfig: { + rnApiClientId: paymentConfig.rnApiClientId, + network: paymentConfig.network, + feeInfo: paymentConfig.feeInfo, + supportedCurrencies: paymentConfig.supportedCurrencies, + }, + uiConfig: { + showReceiptDownload: uiConfig?.showReceiptDownload ?? true, + showRequestScanUrl: uiConfig?.showRequestScanUrl ?? true, + }, + receiptInfo, + onSuccess, + onError, + }), + [ + amountInUsd, + recipientWallet, + walletAccount, + connectedWalletAddress, + isWalletOverride, + paymentConfig.rnApiClientId, + paymentConfig.network, + paymentConfig.feeInfo, + paymentConfig.supportedCurrencies, + uiConfig?.showReceiptDownload, + uiConfig?.showRequestScanUrl, + receiptInfo, + onSuccess, + onError, + ], + ); return ( diff --git a/registry/default/payment-widget/context/web3-context.tsx b/registry/default/payment-widget/context/web3-context.tsx index 2166d31..0090a08 100644 --- a/registry/default/payment-widget/context/web3-context.tsx +++ b/registry/default/payment-widget/context/web3-context.tsx @@ -3,7 +3,7 @@ import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; import { WagmiProvider } from "wagmi"; import { getWagmiConfig } from "../utils/wagmi"; -import { useMemo, useRef } from "react"; +import { type ReactNode, useMemo, useRef } from "react"; const queryClient = new QueryClient(); @@ -11,7 +11,7 @@ export function Web3Provider({ children, walletConnectProjectId, }: { - children: React.ReactNode; + children: ReactNode; walletConnectProjectId?: string; }) { // @NOTE this may seem weird, but walletConnect doesn't handle strict mode initializing it twice, so we explicitly use a ref to store the config diff --git a/registry/default/payment-widget/payment-widget.tsx b/registry/default/payment-widget/payment-widget.tsx index f88c680..c77008c 100644 --- a/registry/default/payment-widget/payment-widget.tsx +++ b/registry/default/payment-widget/payment-widget.tsx @@ -74,6 +74,12 @@ export function PaymentWidget({ walletAccount, children, }: PaymentWidgetProps) { + if (!paymentConfig.rnApiClientId || paymentConfig.rnApiClientId === "") { + console.error("PaymentWidget: rnApiClientId is required in paymentConfig"); + + return
Error: rnApiClientId is required
; + } + return ( { const metadata: ReceiptMetadata = { - issueDate: new Date(), ...params.metadata, + issueDate: new Date(), }; const receipt: ReceiptData = { From 7b6dff4c4b672c7dde4ca440386c89909e6057bb Mon Sep 17 00:00:00 2001 From: Bassgeta Date: Wed, 17 Sep 2025 14:36:02 +0200 Subject: [PATCH 29/37] feat: handle switching chains before executing payment, pass txHash to receipt --- public/r/payment-widget.json | 22 +++++++++------ public/r/registry.json | 9 +++++-- registry.json | 9 +++++-- .../components/payment-confirmation.tsx | 4 +-- .../components/payment-modal.tsx | 5 ++++ .../components/payment-success.tsx | 11 +++++--- .../components/receipt/receipt-template.tsx | 3 ++- .../receipt/{styles.module.css => styles.css} | 0 .../payment-widget/hooks/use-payment.ts | 23 ++++++++++++---- .../default/payment-widget/utils/chains.ts | 27 +++++++++++++++++++ .../default/payment-widget/utils/payment.ts | 12 +++++++-- 11 files changed, 99 insertions(+), 26 deletions(-) rename registry/default/payment-widget/components/receipt/{styles.module.css => styles.css} (100%) create mode 100644 registry/default/payment-widget/utils/chains.ts diff --git a/public/r/payment-widget.json b/public/r/payment-widget.json index e160041..85243e8 100644 --- a/public/r/payment-widget.json +++ b/public/r/payment-widget.json @@ -46,7 +46,7 @@ }, { "path": "registry/default/payment-widget/components/payment-modal.tsx", - "content": "\"use client\";\n\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n} from \"@/components/ui/dialog\";\nimport { useState } from \"react\";\nimport { CurrencySelect } from \"./currency-select\";\nimport { BuyerInfoForm } from \"./buyer-info-form\";\nimport { PaymentConfirmation } from \"./payment-confirmation\";\nimport { PaymentSuccess } from \"./payment-success\";\nimport { DisconnectWallet } from \"./disconnect-wallet\";\nimport { usePaymentWidgetContext } from \"../context/payment-widget-context\";\nimport type { BuyerInfo } from \"../types/index\";\nimport type { ConversionCurrency } from \"../utils/currencies\";\nimport type { TransactionReceipt } from \"viem\";\n\ninterface PaymentModalProps {\n isOpen: boolean;\n handleModalOpenChange: (open: boolean) => void;\n}\n\nexport function PaymentModal({\n isOpen,\n handleModalOpenChange,\n}: PaymentModalProps) {\n const { isWalletOverride, receiptInfo, onSuccess } =\n usePaymentWidgetContext();\n\n const [activeStep, setActiveStep] = useState<\n | \"currency-select\"\n | \"buyer-info\"\n | \"payment-confirmation\"\n | \"payment-success\"\n >(\"currency-select\");\n const [selectedCurrency, setSelectedCurrency] =\n useState(null);\n const [buyerInfo, setBuyerInfo] = useState(\n receiptInfo.buyerInfo || undefined,\n );\n const [requestId, setRequestId] = useState(\"\");\n\n const handleCurrencySelect = (currency: ConversionCurrency) => {\n setSelectedCurrency(currency);\n setActiveStep(\"buyer-info\");\n };\n\n const handleBuyerInfoSubmit = (data: BuyerInfo) => {\n setBuyerInfo(data);\n setActiveStep(\"payment-confirmation\");\n };\n\n const handlePaymentSuccess = async (\n requestId: string,\n transactionReceipts: TransactionReceipt[],\n ) => {\n setRequestId(requestId);\n setActiveStep(\"payment-success\");\n await onSuccess?.(requestId, transactionReceipts);\n };\n\n const reset = () => {\n setActiveStep(\"currency-select\");\n setSelectedCurrency(null);\n setBuyerInfo(receiptInfo.buyerInfo || undefined);\n setRequestId(\"\");\n };\n\n return (\n {\n // reset modal state when closing from success step\n if (!isOpen && activeStep === \"payment-success\") {\n reset();\n }\n handleModalOpenChange(isOpen);\n }}\n >\n \n \n Payment\n \n Pay with crypto using Request Network\n \n \n\n {activeStep !== \"payment-success\" && !isWalletOverride && (\n \n )}\n\n {activeStep === \"currency-select\" && (\n \n )}\n\n {activeStep === \"buyer-info\" && (\n setActiveStep(\"currency-select\")}\n onSubmit={handleBuyerInfoSubmit}\n />\n )}\n\n {activeStep === \"payment-confirmation\" &&\n selectedCurrency &&\n buyerInfo && (\n setActiveStep(\"buyer-info\")}\n handlePaymentSuccess={handlePaymentSuccess}\n />\n )}\n\n {activeStep === \"payment-success\" && selectedCurrency && buyerInfo && (\n \n )}\n \n \n );\n}\n", + "content": "\"use client\";\n\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n} from \"@/components/ui/dialog\";\nimport { useState } from \"react\";\nimport { CurrencySelect } from \"./currency-select\";\nimport { BuyerInfoForm } from \"./buyer-info-form\";\nimport { PaymentConfirmation } from \"./payment-confirmation\";\nimport { PaymentSuccess } from \"./payment-success\";\nimport { DisconnectWallet } from \"./disconnect-wallet\";\nimport { usePaymentWidgetContext } from \"../context/payment-widget-context\";\nimport type { BuyerInfo } from \"../types/index\";\nimport type { ConversionCurrency } from \"../utils/currencies\";\nimport type { TransactionReceipt } from \"viem\";\n\ninterface PaymentModalProps {\n isOpen: boolean;\n handleModalOpenChange: (open: boolean) => void;\n}\n\nexport function PaymentModal({\n isOpen,\n handleModalOpenChange,\n}: PaymentModalProps) {\n const { isWalletOverride, receiptInfo, onSuccess } =\n usePaymentWidgetContext();\n\n const [activeStep, setActiveStep] = useState<\n | \"currency-select\"\n | \"buyer-info\"\n | \"payment-confirmation\"\n | \"payment-success\"\n >(\"currency-select\");\n const [selectedCurrency, setSelectedCurrency] =\n useState(null);\n const [buyerInfo, setBuyerInfo] = useState(\n receiptInfo.buyerInfo || undefined,\n );\n const [requestId, setRequestId] = useState(\"\");\n const [txHash, setTxHash] = useState(\"\");\n\n const handleCurrencySelect = (currency: ConversionCurrency) => {\n setSelectedCurrency(currency);\n setActiveStep(\"buyer-info\");\n };\n\n const handleBuyerInfoSubmit = (data: BuyerInfo) => {\n setBuyerInfo(data);\n setActiveStep(\"payment-confirmation\");\n };\n\n const handlePaymentSuccess = async (\n requestId: string,\n transactionReceipts: TransactionReceipt[],\n ) => {\n setRequestId(requestId);\n setTxHash(\n transactionReceipts[transactionReceipts.length - 1].transactionHash,\n );\n setActiveStep(\"payment-success\");\n await onSuccess?.(requestId, transactionReceipts);\n };\n\n const reset = () => {\n setActiveStep(\"currency-select\");\n setSelectedCurrency(null);\n setBuyerInfo(receiptInfo.buyerInfo || undefined);\n setRequestId(\"\");\n };\n\n return (\n {\n // reset modal state when closing from success step\n if (!isOpen && activeStep === \"payment-success\") {\n reset();\n }\n handleModalOpenChange(isOpen);\n }}\n >\n \n \n Payment\n \n Pay with crypto using Request Network\n \n \n\n {activeStep !== \"payment-success\" && !isWalletOverride && (\n \n )}\n\n {activeStep === \"currency-select\" && (\n \n )}\n\n {activeStep === \"buyer-info\" && (\n setActiveStep(\"currency-select\")}\n onSubmit={handleBuyerInfoSubmit}\n />\n )}\n\n {activeStep === \"payment-confirmation\" &&\n selectedCurrency &&\n buyerInfo && (\n setActiveStep(\"buyer-info\")}\n handlePaymentSuccess={handlePaymentSuccess}\n />\n )}\n\n {activeStep === \"payment-success\" && selectedCurrency && buyerInfo && (\n \n )}\n \n \n );\n}\n", "type": "registry:component", "target": "components/payment-widget/components/payment-modal.tsx" }, @@ -64,7 +64,7 @@ }, { "path": "registry/default/payment-widget/components/payment-confirmation.tsx", - "content": "\"use client\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { ArrowRight, AlertCircle } from \"lucide-react\";\nimport { usePayment } from \"../hooks/use-payment\";\nimport {\n getSymbolOverride,\n type ConversionCurrency,\n} from \"../utils/currencies\";\nimport { usePaymentWidgetContext } from \"../context/payment-widget-context\";\nimport type { BuyerInfo, PaymentError } from \"../types/index\";\nimport { useState } from \"react\";\nimport type { TransactionReceipt } from \"viem\";\n\ninterface PaymentConfirmationProps {\n selectedCurrency: ConversionCurrency;\n buyerInfo: BuyerInfo;\n onBack: () => void;\n handlePaymentSuccess: (\n requestId: string,\n transactionReceipts: TransactionReceipt[],\n ) => void;\n}\n\nexport function PaymentConfirmation({\n buyerInfo,\n selectedCurrency,\n onBack,\n handlePaymentSuccess,\n}: PaymentConfirmationProps) {\n const {\n amountInUsd,\n recipientWallet,\n connectedWalletAddress,\n paymentConfig: { rnApiClientId, feeInfo },\n receiptInfo: { companyInfo: { name: companyName } = {} },\n onError,\n walletAccount,\n } = usePaymentWidgetContext();\n const { isExecuting, executePayment } = usePayment(walletAccount);\n const [localError, setLocalError] = useState(null);\n\n const handleExecutePayment = async (e: React.FormEvent) => {\n e.preventDefault();\n\n if (!connectedWalletAddress) return;\n\n setLocalError(null);\n\n try {\n const { requestId, transactionReceipts } = await executePayment(\n rnApiClientId,\n {\n payerWallet: connectedWalletAddress,\n amountInUsd,\n recipientWallet,\n paymentCurrency: selectedCurrency.id,\n feeInfo,\n customerInfo: {\n email: buyerInfo.email,\n firstName: buyerInfo.firstName,\n lastName: buyerInfo.lastName,\n address: buyerInfo.address\n ? {\n street: buyerInfo.address.street,\n city: buyerInfo.address.city,\n state: buyerInfo.address.state,\n postalCode: buyerInfo.address.postalCode,\n country: buyerInfo.address.country,\n }\n : undefined,\n },\n },\n );\n\n handlePaymentSuccess(requestId, transactionReceipts);\n } catch (error) {\n const paymentError = error as PaymentError;\n\n let errorMessage = \"Payment failed. Please try again.\";\n\n if (paymentError.type === \"wallet\") {\n errorMessage =\n \"Wallet connection error. Please check your wallet and try again.\";\n } else if (paymentError.type === \"transaction\") {\n errorMessage =\n \"Transaction failed. Please check your balance and network connection.\";\n } else if (paymentError.type === \"api\") {\n errorMessage =\n paymentError.error?.message ||\n \"Payment service error. Please try again.\";\n } else if (paymentError.error?.message) {\n errorMessage = paymentError.error.message;\n }\n setLocalError(errorMessage);\n\n onError?.(paymentError);\n }\n };\n\n return (\n
\n

Payment Confirmation

\n\n
\n {/* Payment Currency (From) */}\n
\n
\n {getSymbolOverride(selectedCurrency.symbol)}\n
\n
\n
From
\n
\n {selectedCurrency.name}\n
\n
\n
\n\n \n\n
\n
\n USD\n
\n
\n
To
\n
\n ${amountInUsd}\n
\n
\n
\n
\n\n
\n

Payment To

\n
\n
\n {companyName}\n
\n
\n
\n Wallet Address\n
\n
\n {recipientWallet}\n
\n
\n
\n
\n\n {localError && (\n
\n
\n \n
\n

\n Payment Error\n

\n

{localError}

\n
\n
\n
\n )}\n\n
\n \n Back\n \n \n {isExecuting ? \"Processing...\" : \"Pay\"}\n \n
\n
\n );\n}\n", + "content": "\"use client\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { ArrowRight, AlertCircle } from \"lucide-react\";\nimport { usePayment } from \"../hooks/use-payment\";\nimport {\n getSymbolOverride,\n type ConversionCurrency,\n} from \"../utils/currencies\";\nimport { usePaymentWidgetContext } from \"../context/payment-widget-context\";\nimport type { BuyerInfo, PaymentError } from \"../types/index\";\nimport { useState } from \"react\";\nimport type { TransactionReceipt } from \"viem\";\n\ninterface PaymentConfirmationProps {\n selectedCurrency: ConversionCurrency;\n buyerInfo: BuyerInfo;\n onBack: () => void;\n handlePaymentSuccess: (\n requestId: string,\n transactionReceipts: TransactionReceipt[],\n ) => void;\n}\n\nexport function PaymentConfirmation({\n buyerInfo,\n selectedCurrency,\n onBack,\n handlePaymentSuccess,\n}: PaymentConfirmationProps) {\n const {\n amountInUsd,\n recipientWallet,\n connectedWalletAddress,\n paymentConfig: { rnApiClientId, feeInfo, network },\n receiptInfo: { companyInfo: { name: companyName } = {} },\n onError,\n walletAccount,\n } = usePaymentWidgetContext();\n const { isExecuting, executePayment } = usePayment(network, walletAccount);\n const [localError, setLocalError] = useState(null);\n\n const handleExecutePayment = async (e: React.FormEvent) => {\n e.preventDefault();\n\n if (!connectedWalletAddress) return;\n\n setLocalError(null);\n\n try {\n const { requestId, transactionReceipts } = await executePayment(\n rnApiClientId,\n {\n payerWallet: connectedWalletAddress,\n amountInUsd,\n recipientWallet,\n paymentCurrency: selectedCurrency.id,\n feeInfo,\n customerInfo: {\n email: buyerInfo.email,\n firstName: buyerInfo.firstName,\n lastName: buyerInfo.lastName,\n address: buyerInfo.address\n ? {\n street: buyerInfo.address.street,\n city: buyerInfo.address.city,\n state: buyerInfo.address.state,\n postalCode: buyerInfo.address.postalCode,\n country: buyerInfo.address.country,\n }\n : undefined,\n },\n },\n );\n\n handlePaymentSuccess(requestId, transactionReceipts);\n } catch (error) {\n const paymentError = error as PaymentError;\n\n let errorMessage = \"Payment failed. Please try again.\";\n\n if (paymentError.type === \"wallet\") {\n errorMessage =\n \"Wallet connection error. Please check your wallet and try again.\";\n } else if (paymentError.type === \"transaction\") {\n errorMessage =\n \"Transaction failed. Please check your balance and network connection.\";\n } else if (paymentError.type === \"api\") {\n errorMessage =\n paymentError.error?.message ||\n \"Payment service error. Please try again.\";\n } else if (paymentError.error?.message) {\n errorMessage = paymentError.error.message;\n }\n setLocalError(errorMessage);\n\n onError?.(paymentError);\n }\n };\n\n return (\n
\n

Payment Confirmation

\n\n
\n {/* Payment Currency (From) */}\n
\n
\n {getSymbolOverride(selectedCurrency.symbol)}\n
\n
\n
From
\n
\n {selectedCurrency.name}\n
\n
\n
\n\n \n\n
\n
\n USD\n
\n
\n
To
\n
\n ${amountInUsd}\n
\n
\n
\n
\n\n
\n

Payment To

\n
\n
\n {companyName}\n
\n
\n
\n Wallet Address\n
\n
\n {recipientWallet}\n
\n
\n
\n
\n\n {localError && (\n
\n
\n \n
\n

\n Payment Error\n

\n

{localError}

\n
\n
\n
\n )}\n\n
\n \n Back\n \n \n {isExecuting ? \"Processing...\" : \"Pay\"}\n \n
\n
\n );\n}\n", "type": "registry:component", "target": "components/payment-widget/components/payment-confirmation.tsx" }, @@ -76,7 +76,7 @@ }, { "path": "registry/default/payment-widget/components/payment-success.tsx", - "content": "\"use client\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { CheckCircle, ExternalLink, Download } from \"lucide-react\";\nimport {\n createReceipt,\n generateReceiptNumber,\n type CreateReceiptParams,\n} from \"../utils/receipt\";\nimport { useRef } from \"react\";\nimport { ReceiptPDFTemplate } from \"../components/receipt/receipt-template\";\nimport { usePaymentWidgetContext } from \"../context/payment-widget-context\";\nimport type { BuyerInfo } from \"../types/index\";\nimport type { ConversionCurrency } from \"../utils/currencies\";\n\ninterface PaymentSuccessProps {\n requestId: string;\n selectedCurrency: ConversionCurrency;\n buyerInfo: BuyerInfo;\n}\n\nexport function PaymentSuccess({\n requestId,\n selectedCurrency,\n buyerInfo,\n}: PaymentSuccessProps) {\n const {\n amountInUsd,\n recipientWallet,\n connectedWalletAddress,\n receiptInfo,\n uiConfig,\n paymentConfig: { network },\n } = usePaymentWidgetContext();\n const receiptRef = useRef(null);\n\n const receiptParams: CreateReceiptParams = {\n company: {\n ...receiptInfo.companyInfo,\n walletAddress: recipientWallet,\n },\n buyer: {\n ...buyerInfo,\n walletAddress: connectedWalletAddress || \"\",\n },\n payment: {\n chain: network,\n currency: selectedCurrency.symbol,\n exchangeRate: 1,\n transactionHash: \"\",\n },\n items: receiptInfo.items,\n totals: receiptInfo.totals,\n metadata: {\n receiptNumber: receiptInfo?.receiptNumber\n ? receiptInfo.receiptNumber\n : generateReceiptNumber(),\n notes: `Payment processed through Request Network for ${amountInUsd} USD`,\n },\n };\n\n const handleDownloadReceipt = async () => {\n try {\n const element = receiptRef.current;\n if (!element) {\n console.error(\"Receipt element not found\");\n return;\n }\n\n const html2pdf = (await import(\"html2pdf.js\")).default;\n\n html2pdf()\n .set({\n margin: 1,\n filename: `receipt-${receiptParams.metadata?.receiptNumber || \"payment\"}.pdf`,\n image: { type: \"jpeg\", quality: 0.98 },\n html2canvas: { scale: 2 },\n jsPDF: { unit: \"in\", format: \"a4\", orientation: \"portrait\" },\n })\n .from(element)\n .save();\n } catch (error) {\n console.error(\"Failed to download receipt:\", error);\n alert(\"Failed to download receipt. Please try again.\");\n }\n };\n\n const requestScanUrl = `https://scan.request.network/request/${requestId}`;\n\n return (\n
\n
\n \n
\n

\n Payment Completed!\n

\n

\n Your payment has been processed successfully.\n

\n
\n
\n\n
\n {uiConfig.showReceiptDownload && (\n <>\n \n \n
\n \n
\n
\n \n )}\n {uiConfig.showRequestScanUrl && (\n \n )}\n
\n
\n );\n}\n", + "content": "\"use client\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { CheckCircle, ExternalLink, Download } from \"lucide-react\";\nimport {\n createReceipt,\n generateReceiptNumber,\n type CreateReceiptParams,\n} from \"../utils/receipt\";\nimport { useRef } from \"react\";\nimport { ReceiptPDFTemplate } from \"../components/receipt/receipt-template\";\nimport { usePaymentWidgetContext } from \"../context/payment-widget-context\";\nimport type { BuyerInfo } from \"../types/index\";\nimport type { ConversionCurrency } from \"../utils/currencies\";\n\ninterface PaymentSuccessProps {\n requestId: string;\n txHash: string;\n selectedCurrency: ConversionCurrency;\n buyerInfo: BuyerInfo;\n}\n\nexport function PaymentSuccess({\n requestId,\n txHash,\n selectedCurrency,\n buyerInfo,\n}: PaymentSuccessProps) {\n const {\n amountInUsd,\n recipientWallet,\n connectedWalletAddress,\n receiptInfo,\n uiConfig,\n paymentConfig: { network },\n } = usePaymentWidgetContext();\n const receiptRef = useRef(null);\n\n const receiptParams: CreateReceiptParams = {\n company: {\n ...receiptInfo.companyInfo,\n walletAddress: recipientWallet,\n },\n buyer: {\n ...buyerInfo,\n walletAddress: connectedWalletAddress || \"\",\n },\n payment: {\n chain: network,\n currency: selectedCurrency.symbol,\n exchangeRate: 1,\n transactionHash: txHash,\n },\n items: receiptInfo.items,\n totals: receiptInfo.totals,\n metadata: {\n receiptNumber: receiptInfo?.receiptNumber\n ? receiptInfo.receiptNumber\n : generateReceiptNumber(),\n notes: `Payment processed through Request Network for ${amountInUsd} USD`,\n },\n };\n\n const handleDownloadReceipt = async () => {\n try {\n const element = receiptRef.current;\n if (!element) {\n console.error(\"Receipt element not found\");\n return;\n }\n\n const html2pdf = (await import(\"html2pdf.js\")).default;\n\n html2pdf()\n .set({\n margin: 1,\n filename: `receipt-${receiptParams.metadata?.receiptNumber || \"payment\"}.pdf`,\n image: { type: \"jpeg\", quality: 0.98 },\n html2canvas: { scale: 2 },\n jsPDF: { unit: \"in\", format: \"a4\", orientation: \"portrait\" },\n })\n .from(element)\n .save();\n } catch (error) {\n console.error(\"Failed to download receipt:\", error);\n alert(\"Failed to download receipt. Please try again.\");\n }\n };\n\n const requestScanUrl = `https://scan.request.network/request/${requestId}`;\n\n return (\n
\n
\n \n
\n

\n Payment Completed!\n

\n

\n Your payment has been processed successfully.\n

\n
\n
\n\n
\n {uiConfig.showReceiptDownload && (\n <>\n \n \n
\n \n
\n
\n \n )}\n {uiConfig.showRequestScanUrl && (\n \n )}\n
\n
\n );\n}\n", "type": "registry:component", "target": "components/payment-widget/components/payment-success.tsx" }, @@ -100,7 +100,7 @@ }, { "path": "registry/default/payment-widget/utils/payment.ts", - "content": "import { TransactionReceipt } from \"viem\";\nimport { RN_API_URL } from \"../constants\";\nimport type { FeeInfo, PaymentError } from \"../types\";\n\nexport interface PaymentParams {\n amountInUsd: string;\n payerWallet: string;\n recipientWallet: string;\n paymentCurrency: string;\n feeInfo?: FeeInfo;\n customerInfo: {\n // This matches the API spec\n firstName?: string;\n lastName?: string;\n email?: string;\n address?: {\n street?: string;\n city?: string;\n state?: string;\n postalCode?: string;\n country?: string;\n };\n };\n}\n\ninterface PayoutAPITransaction {\n to: string;\n data: string;\n value: number | string | { type: string; hex: string };\n}\nexport interface PayoutAPIResponse {\n requestId: string;\n paymentReference: string;\n transactions: PayoutAPITransaction[];\n metadata: {\n stepsRequired: number;\n needsApproval: boolean;\n approvalTransactionIndex: number;\n paymentTransactionIndex: number;\n };\n}\n\nexport type TxParams = {\n to: `0x${string}`;\n data: `0x${string}`;\n value: bigint;\n};\n\nexport type SendTransactionFunction = (tx: TxParams) => Promise<`0x${string}`>;\n\nexport type WaitForTransactionFunction = (\n hash: `0x${string}`,\n) => Promise;\n\nexport const isPaymentError = (error: any): error is PaymentError => {\n return (\n error && typeof error === \"object\" && \"type\" in error && \"error\" in error\n );\n};\n\nexport const normalizeValue = (\n value: PayoutAPITransaction[\"value\"],\n): bigint => {\n // ERC20 tokens don't have a bignumber returned\n if (typeof value === \"number\") {\n return BigInt(value);\n }\n\n if (typeof value === \"string\") {\n return BigInt(value);\n }\n\n if (typeof value === \"object\" && value !== null && \"hex\" in value) {\n return BigInt(value.hex);\n }\n\n // Fallback to 0 if we can't parse it\n console.warn(\"Unknown value format, defaulting to 0:\", value);\n return BigInt(0);\n};\n\nexport const executeTransactions = async (\n transactions: PayoutAPITransaction[],\n sendTransaction: SendTransactionFunction,\n waitForTransaction: WaitForTransactionFunction,\n): Promise => {\n const receipts: TransactionReceipt[] = [];\n\n try {\n for (const tx of transactions) {\n const hash = await sendTransaction({\n to: tx.to as `0x${string}`,\n data: tx.data as `0x${string}`,\n value: normalizeValue(tx.value),\n });\n\n const receipt = await waitForTransaction(hash);\n receipts.push(receipt);\n }\n\n return receipts;\n } catch (error) {\n console.error(\"Transaction execution failed:\", error);\n throw { type: \"transaction\", error: error as Error } as PaymentError;\n }\n};\n\nexport const createPayout = async (\n rnApiClientId: string,\n params: PaymentParams,\n): Promise => {\n const {\n amountInUsd,\n payerWallet,\n recipientWallet,\n paymentCurrency,\n feeInfo,\n } = params;\n\n const response = await fetch(`${RN_API_URL}/v2/payouts`, {\n method: \"POST\",\n headers: {\n \"x-client-id\": rnApiClientId,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n amount: amountInUsd,\n payerWallet: payerWallet,\n payee: recipientWallet,\n invoiceCurrency: \"USD\",\n paymentCurrency: paymentCurrency,\n feePercentage: feeInfo?.feePercentage || undefined,\n feeAddress: feeInfo?.feeAddress || undefined,\n customerInfo: params.customerInfo,\n }),\n });\n\n return response;\n};\n\nexport interface PaymentResponse {\n requestId: string;\n transactionReceipts: TransactionReceipt[];\n}\n\nexport const executePayment = async ({\n paymentParams,\n rnApiClientId,\n sendTransaction,\n waitForTransaction,\n}: {\n rnApiClientId: string;\n paymentParams: PaymentParams;\n sendTransaction: SendTransactionFunction;\n waitForTransaction: WaitForTransactionFunction;\n}): Promise => {\n try {\n const response = await createPayout(rnApiClientId, paymentParams);\n\n if (!response.ok) {\n let errorMessage = \"Failed to create payment\";\n\n try {\n const errorData = await response.json();\n errorMessage = errorData.error || errorData.message || errorMessage;\n } catch (_parsingError) {\n // If we can't parse the error response, just use status text\n errorMessage = `HTTP ${response.status}: ${response.statusText}`;\n }\n\n const error = new Error(errorMessage);\n throw { type: \"api\", error } as PaymentError;\n }\n\n const data: PayoutAPIResponse = await response.json();\n\n if (Array.isArray(data?.transactions) && data.transactions.length > 0) {\n const transactionReceipts = await executeTransactions(\n data.transactions,\n sendTransaction,\n waitForTransaction,\n );\n\n return { requestId: data.requestId, transactionReceipts };\n } else {\n const error = new Error(\"No transaction data received from backend\");\n throw { type: \"api\", error } as PaymentError;\n }\n } catch (error) {\n console.error(\"Error in payment flow:\", error);\n if (isPaymentError(error)) {\n throw error;\n } else {\n throw { type: \"unknown\", error: error as Error } as PaymentError;\n }\n }\n};\n", + "content": "import { TransactionReceipt } from \"viem\";\nimport { RN_API_URL } from \"../constants\";\nimport type { FeeInfo, PaymentError } from \"../types\";\n\nexport interface PaymentParams {\n amountInUsd: string;\n payerWallet: string;\n recipientWallet: string;\n paymentCurrency: string;\n feeInfo?: FeeInfo;\n customerInfo: {\n // This matches the API spec\n firstName?: string;\n lastName?: string;\n email?: string;\n address?: {\n street?: string;\n city?: string;\n state?: string;\n postalCode?: string;\n country?: string;\n };\n };\n}\n\ninterface PayoutAPITransaction {\n to: string;\n data: string;\n value: number | string | { type: string; hex: string };\n}\nexport interface PayoutAPIResponse {\n requestId: string;\n paymentReference: string;\n transactions: PayoutAPITransaction[];\n metadata: {\n stepsRequired: number;\n needsApproval: boolean;\n approvalTransactionIndex: number;\n paymentTransactionIndex: number;\n };\n}\n\nexport type TxParams = {\n to: `0x${string}`;\n data: `0x${string}`;\n value: bigint;\n};\n\nexport type SendTransactionFunction = (tx: TxParams) => Promise<`0x${string}`>;\n\nexport type WaitForTransactionFunction = (\n hash: `0x${string}`,\n) => Promise;\n\nexport const isPaymentError = (error: any): error is PaymentError => {\n return (\n error && typeof error === \"object\" && \"type\" in error && \"error\" in error\n );\n};\n\nexport const normalizeValue = (\n value: PayoutAPITransaction[\"value\"],\n): bigint => {\n // ERC20 tokens don't have a bignumber returned\n if (typeof value === \"number\") {\n if (!Number.isSafeInteger(value)) {\n throw new Error(\n \"Unsafe numeric value for tx.value; expected string/hex BigInt.\",\n );\n }\n return BigInt(value);\n }\n\n if (typeof value === \"string\") {\n return BigInt(value);\n }\n\n if (typeof value === \"object\" && value !== null && \"hex\" in value) {\n return BigInt(value.hex);\n }\n\n console.warn(\"Unknown value format, defaulting to 0:\", value);\n throw new Error(\"Unknown value format\");\n};\n\nexport const executeTransactions = async (\n transactions: PayoutAPITransaction[],\n sendTransaction: SendTransactionFunction,\n waitForTransaction: WaitForTransactionFunction,\n): Promise => {\n const receipts: TransactionReceipt[] = [];\n\n try {\n for (const tx of transactions) {\n const hash = await sendTransaction({\n to: tx.to as `0x${string}`,\n data: tx.data as `0x${string}`,\n value: normalizeValue(tx.value),\n });\n\n const receipt = await waitForTransaction(hash);\n if (receipt.status !== \"success\") {\n throw new Error(`Transaction reverted: ${hash}`);\n }\n\n receipts.push(receipt);\n }\n\n return receipts;\n } catch (error) {\n console.error(\"Transaction execution failed:\", error);\n throw { type: \"transaction\", error: error as Error } as PaymentError;\n }\n};\n\nexport const createPayout = async (\n rnApiClientId: string,\n params: PaymentParams,\n): Promise => {\n const {\n amountInUsd,\n payerWallet,\n recipientWallet,\n paymentCurrency,\n feeInfo,\n } = params;\n\n const response = await fetch(`${RN_API_URL}/v2/payouts`, {\n method: \"POST\",\n headers: {\n \"x-client-id\": rnApiClientId,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n amount: amountInUsd,\n payerWallet: payerWallet,\n payee: recipientWallet,\n invoiceCurrency: \"USD\",\n paymentCurrency: paymentCurrency,\n feePercentage: feeInfo?.feePercentage || undefined,\n feeAddress: feeInfo?.feeAddress || undefined,\n customerInfo: params.customerInfo,\n }),\n });\n\n return response;\n};\n\nexport interface PaymentResponse {\n requestId: string;\n transactionReceipts: TransactionReceipt[];\n}\n\nexport const executePayment = async ({\n paymentParams,\n rnApiClientId,\n sendTransaction,\n waitForTransaction,\n}: {\n rnApiClientId: string;\n paymentParams: PaymentParams;\n sendTransaction: SendTransactionFunction;\n waitForTransaction: WaitForTransactionFunction;\n}): Promise => {\n try {\n const response = await createPayout(rnApiClientId, paymentParams);\n\n if (!response.ok) {\n let errorMessage = \"Failed to create payment\";\n\n try {\n const errorData = await response.json();\n errorMessage = errorData.error || errorData.message || errorMessage;\n } catch (_parsingError) {\n // If we can't parse the error response, just use status text\n errorMessage = `HTTP ${response.status}: ${response.statusText}`;\n }\n\n const error = new Error(errorMessage);\n throw { type: \"api\", error } as PaymentError;\n }\n\n const data: PayoutAPIResponse = await response.json();\n\n if (Array.isArray(data?.transactions) && data.transactions.length > 0) {\n const transactionReceipts = await executeTransactions(\n data.transactions,\n sendTransaction,\n waitForTransaction,\n );\n\n return { requestId: data.requestId, transactionReceipts };\n } else {\n const error = new Error(\"No transaction data received from backend\");\n throw { type: \"api\", error } as PaymentError;\n }\n } catch (error) {\n console.error(\"Error in payment flow:\", error);\n if (isPaymentError(error)) {\n throw error;\n } else {\n throw { type: \"unknown\", error: error as Error } as PaymentError;\n }\n }\n};\n", "type": "registry:lib", "target": "components/payment-widget/utils/payment.ts" }, @@ -116,9 +116,15 @@ "type": "registry:lib", "target": "components/payment-widget/utils/receipt.ts" }, + { + "path": "registry/default/payment-widget/utils/chains.ts", + "content": "import {\n mainnet,\n arbitrum,\n base,\n optimism,\n polygon,\n sepolia,\n} from \"viem/chains\";\n\nexport const getChainFromNetwork = (network: string) => {\n switch (network.toLowerCase()) {\n case \"mainnet\":\n return mainnet;\n case \"arbitrum\":\n return arbitrum;\n case \"base\":\n return base;\n case \"optimism\":\n return optimism;\n case \"polygon\":\n return polygon;\n case \"sepolia\":\n return sepolia;\n default:\n throw new Error(`Unsupported network: ${network}`);\n }\n};\n", + "type": "registry:lib", + "target": "components/payment-widget/utils/chains.ts" + }, { "path": "registry/default/payment-widget/hooks/use-payment.ts", - "content": "import { useState } from \"react\";\nimport { useAccount, useSendTransaction, useConfig } from \"wagmi\";\nimport { waitForTransactionReceipt } from \"wagmi/actions\";\nimport { createPublicClient, http } from \"viem\";\nimport {\n executePayment,\n type PaymentParams,\n type TxParams,\n type PaymentResponse,\n type SendTransactionFunction,\n type WaitForTransactionFunction,\n} from \"../utils/payment\";\nimport type { PaymentError } from \"../types/index\";\nimport type { Account, WalletClient, TransactionReceipt } from \"viem\";\n\nexport const usePayment = (walletAccount?: WalletClient) => {\n const [isExecuting, setIsExecuting] = useState(false);\n const { isConnected: wagmiConnected, address: wagmiAddress } = useAccount();\n const { sendTransactionAsync } = useSendTransaction();\n const config = useConfig();\n\n const isConnected = walletAccount\n ? Boolean(walletAccount.account)\n : wagmiConnected;\n const address = walletAccount ? walletAccount.account?.address : wagmiAddress;\n const isUsingCustomWallet = walletAccount?.account !== undefined;\n\n const wrappedSendTransaction: SendTransactionFunction = isUsingCustomWallet\n ? async (transaction: TxParams): Promise<`0x${string}`> => {\n const hash = await walletAccount.sendTransaction({\n account: walletAccount.account as Account,\n chain: walletAccount.chain,\n to: transaction.to,\n data: transaction.data,\n value: transaction.value,\n });\n\n return hash;\n }\n : async (tx: TxParams): Promise<`0x${string}`> => {\n const hash = await sendTransactionAsync(tx);\n\n return hash;\n };\n\n const wrappedWaitForTransaction: WaitForTransactionFunction =\n isUsingCustomWallet\n ? async (hash: `0x${string}`): Promise => {\n // Using viem we create a public read client\n if (!walletAccount.chain) {\n throw {\n type: \"wallet\",\n error: new Error(\"Wallet isn't connected to any chain\"),\n } as PaymentError;\n }\n const publicClient = createPublicClient({\n chain: walletAccount.chain,\n transport: http(), // TODO: check why walletAccount.transport wouldn't work, for now http is fine\n });\n\n const receipt = await publicClient.waitForTransactionReceipt({\n hash,\n });\n\n return receipt;\n }\n : async (hash: `0x${string}`): Promise => {\n const receipt = await waitForTransactionReceipt(config, {\n hash,\n });\n return receipt;\n };\n\n const execute = async (\n rnApiClientId: string,\n params: PaymentParams,\n ): Promise => {\n if (!isConnected || !address) {\n throw {\n type: \"wallet\",\n error: new Error(\"Wallet not connected\"),\n } as PaymentError;\n }\n\n setIsExecuting(true);\n try {\n return await executePayment({\n rnApiClientId,\n paymentParams: {\n amountInUsd: params.amountInUsd,\n payerWallet: address,\n recipientWallet: params.recipientWallet,\n paymentCurrency: params.paymentCurrency,\n feeInfo: params.feeInfo,\n customerInfo: params.customerInfo,\n },\n sendTransaction: wrappedSendTransaction,\n waitForTransaction: wrappedWaitForTransaction,\n });\n } finally {\n setIsExecuting(false);\n }\n };\n\n return {\n isExecuting,\n executePayment: execute,\n isConnected,\n address,\n };\n};\n", + "content": "import { useState } from \"react\";\nimport {\n useAccount,\n useSendTransaction,\n useConfig,\n useSwitchChain,\n} from \"wagmi\";\nimport { waitForTransactionReceipt } from \"wagmi/actions\";\nimport { createPublicClient, http } from \"viem\";\nimport {\n executePayment,\n type PaymentParams,\n type TxParams,\n type PaymentResponse,\n type SendTransactionFunction,\n type WaitForTransactionFunction,\n} from \"../utils/payment\";\nimport type { PaymentError } from \"../types/index\";\nimport type { Account, WalletClient, TransactionReceipt } from \"viem\";\nimport { getChainFromNetwork } from \"../utils/chains\";\n\nexport const usePayment = (network: string, walletAccount?: WalletClient) => {\n const [isExecuting, setIsExecuting] = useState(false);\n const { isConnected: wagmiConnected, address: wagmiAddress } = useAccount();\n const { sendTransactionAsync } = useSendTransaction();\n const { switchChainAsync } = useSwitchChain();\n const config = useConfig();\n\n const requiredChain = getChainFromNetwork(network);\n const isConnected = walletAccount\n ? Boolean(walletAccount.account)\n : wagmiConnected;\n\n const address = walletAccount ? walletAccount.account?.address : wagmiAddress;\n const isUsingCustomWallet = walletAccount?.account !== undefined;\n\n const wrappedSendTransaction: SendTransactionFunction = isUsingCustomWallet\n ? async (transaction: TxParams): Promise<`0x${string}`> => {\n const hash = await walletAccount.sendTransaction({\n account: walletAccount.account as Account,\n chain: walletAccount.chain,\n to: transaction.to,\n data: transaction.data,\n value: transaction.value,\n });\n\n return hash;\n }\n : async (tx: TxParams): Promise<`0x${string}`> => {\n const hash = await sendTransactionAsync(tx);\n return hash;\n };\n\n const wrappedWaitForTransaction: WaitForTransactionFunction =\n isUsingCustomWallet\n ? async (hash: `0x${string}`): Promise => {\n if (!walletAccount.chain) {\n throw {\n type: \"wallet\",\n error: new Error(\"Wallet isn't connected to any chain\"),\n } as PaymentError;\n }\n const publicClient = createPublicClient({\n chain: walletAccount.chain,\n transport: http(),\n });\n\n const receipt = await publicClient.waitForTransactionReceipt({\n hash,\n });\n\n return receipt;\n }\n : async (hash: `0x${string}`): Promise => {\n const receipt = await waitForTransactionReceipt(config, {\n hash,\n });\n return receipt;\n };\n\n const execute = async (\n rnApiClientId: string,\n params: PaymentParams,\n ): Promise => {\n if (!isConnected || !address) {\n throw {\n type: \"wallet\",\n error: new Error(\"Wallet not connected\"),\n } as PaymentError;\n }\n\n setIsExecuting(true);\n try {\n if (isUsingCustomWallet) {\n await walletAccount.switchChain({ id: requiredChain.id });\n } else {\n await switchChainAsync({ chainId: requiredChain.id });\n }\n\n return await executePayment({\n rnApiClientId,\n paymentParams: {\n amountInUsd: params.amountInUsd,\n payerWallet: address,\n recipientWallet: params.recipientWallet,\n paymentCurrency: params.paymentCurrency,\n feeInfo: params.feeInfo,\n customerInfo: params.customerInfo,\n },\n sendTransaction: wrappedSendTransaction,\n waitForTransaction: wrappedWaitForTransaction,\n });\n } finally {\n setIsExecuting(false);\n }\n };\n\n return {\n isExecuting,\n executePayment: execute,\n isConnected,\n address,\n };\n};\n", "type": "registry:lib", "target": "components/payment-widget/hooks/use-payment.ts" }, @@ -142,15 +148,15 @@ }, { "path": "registry/default/payment-widget/components/receipt/receipt-template.tsx", - "content": "import type { FC } from \"react\";\nimport {\n formatCryptoAmount,\n formatUSDAmount,\n formatReceiptDate,\n type ReceiptData,\n} from \"../../utils/receipt\";\nimport \"./styles.module.css\";\n\nexport const ReceiptPDFTemplate: FC<{ receipt: ReceiptData }> = ({\n receipt,\n}) => {\n return (\n
\n
\n
\n

{receipt.company.name}

\n
\n {receipt.company.address && (\n <>\n
{receipt.company.address.street}
\n
\n {receipt.company.address.city},{\" \"}\n {receipt.company.address.state}{\" \"}\n {receipt.company.address.postalCode}{\" \"}\n {receipt.company.address.country}\n
\n \n )}\n {receipt.company.email &&
{receipt.company.email}
}\n {receipt.company.taxId && (\n
Tax ID: {receipt.company.taxId}
\n )}\n
\n
\n\n
\n

REC

\n
\n #{receipt.metadata.receiptNumber}\n
\n
\n {formatReceiptDate(receipt.metadata.issueDate)}\n
\n
\n
\n\n
\n
\n

FROM

\n
{receipt.company.name}
\n
{receipt.company.walletAddress}
\n
\n {receipt.company.address && (\n <>\n
{receipt.company.address.street}
\n
\n {receipt.company.address.city},{\" \"}\n {receipt.company.address.state}{\" \"}\n {receipt.company.address.postalCode}{\" \"}\n {receipt.company.address.country}\n
\n \n )}\n
\n
\n\n
\n

TO

\n
\n {[receipt.buyer.firstName, receipt.buyer.lastName]\n .filter(Boolean)\n .join(\" \") || \"Customer\"}\n
\n
{receipt.buyer.walletAddress}
\n {receipt.buyer.email && (\n
{receipt.buyer.email}
\n )}\n {receipt.buyer.address && (\n
\n
{receipt.buyer.address.street}
\n
\n {receipt.buyer.address.city}, {receipt.buyer.address.state}{\" \"}\n {receipt.buyer.address.postalCode}{\" \"}\n {receipt.buyer.address.country}\n
\n
\n )}\n
\n
\n\n
\n
\n Payment Method:{\" \"}\n {`${receipt.payment.currency} on ${receipt.payment.chain}`}\n
\n {receipt.payment.transactionHash && (\n
\n Transaction: {receipt.payment.transactionHash}\n
\n )}\n
\n\n \n \n \n \n \n \n \n \n \n \n \n \n {receipt.items.map((item, index) => (\n \n \n \n \n \n \n \n \n ))}\n \n
DescriptionQtyUnit PriceDisc%Tax%Total
{item.description}{item.quantity}\n {formatCryptoAmount(\n item.unitPrice,\n item.currency || receipt.payment.currency,\n )}\n {item.discount || 0}%{item.tax || 0}%\n {formatCryptoAmount(\n item.total,\n item.currency || receipt.payment.currency,\n )}\n
\n\n
\n
\n {receipt.totals.totalDiscount > 0 && (\n
\n Discount:\n \n -\n {formatCryptoAmount(\n receipt.totals.totalDiscount,\n receipt.payment.currency,\n )}\n \n
\n )}\n\n {receipt.totals.totalTax > 0 && (\n
\n Tax:\n \n {formatCryptoAmount(\n receipt.totals.totalTax,\n receipt.payment.currency,\n )}\n \n
\n )}\n\n
\n Subtotal:\n \n {formatCryptoAmount(\n receipt.totals.total,\n receipt.payment.currency,\n )}\n \n
\n\n
\n TOTAL (USD):\n \n {formatUSDAmount(receipt.totals.totalUSD)}\n \n
\n
\n
\n\n {receipt.metadata.notes && (\n
\n Notes: {receipt.metadata.notes}\n
\n )}\n
\n );\n};\n", + "content": "import type { FC } from \"react\";\nimport {\n formatCryptoAmount,\n formatUSDAmount,\n formatReceiptDate,\n type ReceiptData,\n} from \"../../utils/receipt\";\n// a module.css file doesn't work with html2pdf.js\nimport \"./styles.css\";\n\nexport const ReceiptPDFTemplate: FC<{ receipt: ReceiptData }> = ({\n receipt,\n}) => {\n return (\n
\n
\n
\n

{receipt.company.name}

\n
\n {receipt.company.address && (\n <>\n
{receipt.company.address.street}
\n
\n {receipt.company.address.city},{\" \"}\n {receipt.company.address.state}{\" \"}\n {receipt.company.address.postalCode}{\" \"}\n {receipt.company.address.country}\n
\n \n )}\n {receipt.company.email &&
{receipt.company.email}
}\n {receipt.company.taxId && (\n
Tax ID: {receipt.company.taxId}
\n )}\n
\n
\n\n
\n

REC

\n
\n #{receipt.metadata.receiptNumber}\n
\n
\n {formatReceiptDate(receipt.metadata.issueDate)}\n
\n
\n
\n\n
\n
\n

FROM

\n
{receipt.company.name}
\n
{receipt.company.walletAddress}
\n
\n {receipt.company.address && (\n <>\n
{receipt.company.address.street}
\n
\n {receipt.company.address.city},{\" \"}\n {receipt.company.address.state}{\" \"}\n {receipt.company.address.postalCode}{\" \"}\n {receipt.company.address.country}\n
\n \n )}\n
\n
\n\n
\n

TO

\n
\n {[receipt.buyer.firstName, receipt.buyer.lastName]\n .filter(Boolean)\n .join(\" \") || \"Customer\"}\n
\n
{receipt.buyer.walletAddress}
\n {receipt.buyer.email && (\n
{receipt.buyer.email}
\n )}\n {receipt.buyer.address && (\n
\n
{receipt.buyer.address.street}
\n
\n {receipt.buyer.address.city}, {receipt.buyer.address.state}{\" \"}\n {receipt.buyer.address.postalCode}{\" \"}\n {receipt.buyer.address.country}\n
\n
\n )}\n
\n
\n\n
\n
\n Payment Method:{\" \"}\n {`${receipt.payment.currency} on ${receipt.payment.chain}`}\n
\n {receipt.payment.transactionHash && (\n
\n Transaction: {receipt.payment.transactionHash}\n
\n )}\n
\n\n \n \n \n \n \n \n \n \n \n \n \n \n {receipt.items.map((item, index) => (\n \n \n \n \n \n \n \n \n ))}\n \n
DescriptionQtyUnit PriceDisc%Tax%Total
{item.description}{item.quantity}\n {formatCryptoAmount(\n item.unitPrice,\n item.currency || receipt.payment.currency,\n )}\n {item.discount || 0}%{item.tax || 0}%\n {formatCryptoAmount(\n item.total,\n item.currency || receipt.payment.currency,\n )}\n
\n\n
\n
\n {receipt.totals.totalDiscount > 0 && (\n
\n Discount:\n \n -\n {formatCryptoAmount(\n receipt.totals.totalDiscount,\n receipt.payment.currency,\n )}\n \n
\n )}\n\n {receipt.totals.totalTax > 0 && (\n
\n Tax:\n \n {formatCryptoAmount(\n receipt.totals.totalTax,\n receipt.payment.currency,\n )}\n \n
\n )}\n\n
\n Subtotal:\n \n {formatCryptoAmount(\n receipt.totals.total,\n receipt.payment.currency,\n )}\n \n
\n\n
\n TOTAL (USD):\n \n {formatUSDAmount(receipt.totals.totalUSD)}\n \n
\n
\n
\n\n {receipt.metadata.notes && (\n
\n Notes: {receipt.metadata.notes}\n
\n )}\n
\n );\n};\n", "type": "registry:component", "target": "components/payment-widget/components/receipt/receipt-template.tsx" }, { - "path": "registry/default/payment-widget/components/receipt/styles.module.css", + "path": "registry/default/payment-widget/components/receipt/styles.css", "content": ".receipt-container {\n background-color: #ffffff;\n padding: 20px;\n max-width: 800px;\n margin: 0 auto;\n font-family:\n -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;\n font-size: 12px;\n line-height: 1.4;\n color: #2d3748;\n}\n\n.receipt-header {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n margin-bottom: 20px;\n padding-bottom: 15px;\n border-bottom: 2px solid #e2e8f0;\n}\n\n.company-info {\n flex: 1;\n}\n\n.company-name {\n font-size: 24px;\n font-weight: 700;\n color: #1a202c;\n margin: 0 0 8px 0;\n}\n\n.company-details {\n font-size: 11px;\n color: #4a5568;\n line-height: 1.3;\n}\n\n.company-details > div {\n margin-bottom: 2px;\n}\n\n.receipt-title-section {\n text-align: right;\n}\n\n.receipt-title {\n font-size: 28px;\n font-weight: 700;\n color: #2d3748;\n margin: 0 0 4px 0;\n}\n\n.receipt-number {\n font-size: 16px;\n font-weight: 600;\n color: #4a5568;\n margin-bottom: 4px;\n}\n\n.receipt-date {\n font-size: 11px;\n color: #718096;\n}\n\n.party-info-section {\n display: flex;\n gap: 20px;\n margin-bottom: 16px;\n}\n\n.info-box {\n flex: 1;\n border: 1px solid #e2e8f0;\n border-radius: 6px;\n padding: 12px;\n background-color: #f7fafc;\n}\n\n.info-header {\n font-size: 11px;\n font-weight: 700;\n color: #2d3748;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin: 0 0 8px 0;\n}\n\n.party-name {\n font-weight: 600;\n font-size: 14px;\n color: #1a202c;\n margin-bottom: 4px;\n}\n\n.wallet-address {\n font-size: 10px;\n color: #718096;\n font-family: \"Monaco\", \"Courier New\", monospace;\n margin-bottom: 6px;\n word-break: break-all;\n}\n\n.email {\n font-size: 11px;\n color: #4a5568;\n margin-bottom: 4px;\n}\n\n.address-info {\n font-size: 11px;\n color: #4a5568;\n line-height: 1.3;\n}\n\n.address-info > div {\n margin-bottom: 2px;\n}\n\n.payment-info {\n background-color: #edf2f7;\n padding: 8px 12px;\n border-radius: 4px;\n margin-bottom: 16px;\n font-size: 11px;\n color: #2d3748;\n}\n\n.payment-info > div {\n margin-bottom: 2px;\n}\n\n.payment-info > div:last-child {\n margin-bottom: 0;\n}\n\n.transaction-hash {\n font-family: \"Monaco\", \"Courier New\", monospace;\n word-break: break-all;\n}\n\n.items-table {\n width: 100%;\n border-collapse: collapse;\n border: 1px solid #e2e8f0;\n margin-bottom: 16px;\n font-size: 11px;\n}\n\n.items-table th {\n background-color: #edf2f7;\n border: 1px solid #e2e8f0;\n padding: 8px 6px;\n font-weight: 600;\n text-align: left;\n color: #2d3748;\n}\n\n.items-table th.center {\n text-align: center;\n width: 40px;\n}\n\n.items-table th.right {\n text-align: right;\n width: 80px;\n}\n\n.items-table td {\n border: 1px solid #e2e8f0;\n padding: 6px;\n vertical-align: top;\n}\n\n.items-table td.center {\n text-align: center;\n}\n\n.items-table td.right {\n text-align: right;\n font-family: \"Monaco\", \"Courier New\", monospace;\n}\n\n.items-table .row-even {\n background-color: #ffffff;\n}\n\n.items-table .row-odd {\n background-color: #f7fafc;\n}\n\n.items-table .amount {\n font-weight: 600;\n}\n\n.totals-section {\n display: flex;\n justify-content: flex-end;\n margin-bottom: 16px;\n}\n\n.totals-box {\n background-color: #f7fafc;\n border: 1px solid #e2e8f0;\n border-radius: 6px;\n padding: 12px;\n min-width: 240px;\n}\n\n.total-line {\n display: flex;\n justify-content: space-between;\n margin-bottom: 4px;\n font-size: 11px;\n}\n\n.total-line.subtotal {\n padding-top: 6px;\n border-top: 1px solid #e2e8f0;\n font-weight: 600;\n}\n\n.total-line.final {\n font-size: 14px;\n font-weight: 700;\n color: #1a202c;\n padding-top: 6px;\n border-top: 2px solid #2d3748;\n}\n\n.total-amount {\n font-family: \"Monaco\", \"Courier New\", monospace;\n font-size: inherit;\n}\n\n.notes-section {\n border-top: 1px solid #e2e8f0;\n font-size: 11px;\n color: #4a5568;\n background-color: #f7fafc;\n padding: 8px 12px;\n border-radius: 4px;\n}\n", "type": "registry:component", - "target": "components/payment-widget/components/receipt/styles.module.css" + "target": "components/payment-widget/components/receipt/styles.css" }, { "path": "lib/utils.ts", diff --git a/public/r/registry.json b/public/r/registry.json index d2c5331..4fe0dd7 100644 --- a/public/r/registry.json +++ b/public/r/registry.json @@ -104,6 +104,11 @@ "type": "registry:lib", "target": "components/payment-widget/utils/receipt.ts" }, + { + "path": "registry/default/payment-widget/utils/chains.ts", + "type": "registry:lib", + "target": "components/payment-widget/utils/chains.ts" + }, { "path": "registry/default/payment-widget/hooks/use-payment.ts", "type": "registry:lib", @@ -130,9 +135,9 @@ "target": "components/payment-widget/components/receipt/receipt-template.tsx" }, { - "path": "registry/default/payment-widget/components/receipt/styles.module.css", + "path": "registry/default/payment-widget/components/receipt/styles.css", "type": "registry:component", - "target": "components/payment-widget/components/receipt/styles.module.css" + "target": "components/payment-widget/components/receipt/styles.css" }, { "path": "lib/utils.ts", diff --git a/registry.json b/registry.json index d2c5331..4fe0dd7 100644 --- a/registry.json +++ b/registry.json @@ -104,6 +104,11 @@ "type": "registry:lib", "target": "components/payment-widget/utils/receipt.ts" }, + { + "path": "registry/default/payment-widget/utils/chains.ts", + "type": "registry:lib", + "target": "components/payment-widget/utils/chains.ts" + }, { "path": "registry/default/payment-widget/hooks/use-payment.ts", "type": "registry:lib", @@ -130,9 +135,9 @@ "target": "components/payment-widget/components/receipt/receipt-template.tsx" }, { - "path": "registry/default/payment-widget/components/receipt/styles.module.css", + "path": "registry/default/payment-widget/components/receipt/styles.css", "type": "registry:component", - "target": "components/payment-widget/components/receipt/styles.module.css" + "target": "components/payment-widget/components/receipt/styles.css" }, { "path": "lib/utils.ts", diff --git a/registry/default/payment-widget/components/payment-confirmation.tsx b/registry/default/payment-widget/components/payment-confirmation.tsx index 04c1559..c601bd5 100644 --- a/registry/default/payment-widget/components/payment-confirmation.tsx +++ b/registry/default/payment-widget/components/payment-confirmation.tsx @@ -32,12 +32,12 @@ export function PaymentConfirmation({ amountInUsd, recipientWallet, connectedWalletAddress, - paymentConfig: { rnApiClientId, feeInfo }, + paymentConfig: { rnApiClientId, feeInfo, network }, receiptInfo: { companyInfo: { name: companyName } = {} }, onError, walletAccount, } = usePaymentWidgetContext(); - const { isExecuting, executePayment } = usePayment(walletAccount); + const { isExecuting, executePayment } = usePayment(network, walletAccount); const [localError, setLocalError] = useState(null); const handleExecutePayment = async (e: React.FormEvent) => { diff --git a/registry/default/payment-widget/components/payment-modal.tsx b/registry/default/payment-widget/components/payment-modal.tsx index cbcc6e0..5907a1d 100644 --- a/registry/default/payment-widget/components/payment-modal.tsx +++ b/registry/default/payment-widget/components/payment-modal.tsx @@ -42,6 +42,7 @@ export function PaymentModal({ receiptInfo.buyerInfo || undefined, ); const [requestId, setRequestId] = useState(""); + const [txHash, setTxHash] = useState(""); const handleCurrencySelect = (currency: ConversionCurrency) => { setSelectedCurrency(currency); @@ -58,6 +59,9 @@ export function PaymentModal({ transactionReceipts: TransactionReceipt[], ) => { setRequestId(requestId); + setTxHash( + transactionReceipts[transactionReceipts.length - 1].transactionHash, + ); setActiveStep("payment-success"); await onSuccess?.(requestId, transactionReceipts); }; @@ -118,6 +122,7 @@ export function PaymentModal({ {activeStep === "payment-success" && selectedCurrency && buyerInfo && ( diff --git a/registry/default/payment-widget/components/payment-success.tsx b/registry/default/payment-widget/components/payment-success.tsx index 37eeeeb..5dc2082 100644 --- a/registry/default/payment-widget/components/payment-success.tsx +++ b/registry/default/payment-widget/components/payment-success.tsx @@ -15,12 +15,14 @@ import type { ConversionCurrency } from "../utils/currencies"; interface PaymentSuccessProps { requestId: string; + txHash: string; selectedCurrency: ConversionCurrency; buyerInfo: BuyerInfo; } export function PaymentSuccess({ requestId, + txHash, selectedCurrency, buyerInfo, }: PaymentSuccessProps) { @@ -47,7 +49,7 @@ export function PaymentSuccess({ chain: network, currency: selectedCurrency.symbol, exchangeRate: 1, - transactionHash: "", + transactionHash: txHash, }, items: receiptInfo.items, totals: receiptInfo.totals, @@ -109,10 +111,11 @@ export function PaymentSuccess({ Download Receipt PDF \n );\n}\n", + "content": "\"use client\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { CheckCircle, ExternalLink, Download } from \"lucide-react\";\nimport {\n createReceipt,\n generateReceiptNumber,\n type CreateReceiptParams,\n} from \"../utils/receipt\";\nimport { useRef } from \"react\";\nimport { ReceiptPDFTemplate } from \"../components/receipt/receipt-template\";\nimport { usePaymentWidgetContext } from \"../context/payment-widget-context\";\nimport type { BuyerInfo } from \"../types/index\";\nimport type { ConversionCurrency } from \"../utils/currencies\";\n\ninterface PaymentSuccessProps {\n requestId: string;\n txHash: string;\n selectedCurrency: ConversionCurrency;\n buyerInfo: BuyerInfo;\n}\n\nexport function PaymentSuccess({\n requestId,\n txHash,\n selectedCurrency,\n buyerInfo,\n}: PaymentSuccessProps) {\n const {\n amountInUsd,\n recipientWallet,\n connectedWalletAddress,\n receiptInfo,\n uiConfig,\n paymentConfig: { network },\n } = usePaymentWidgetContext();\n const receiptRef = useRef(null);\n\n const receiptParams: CreateReceiptParams = {\n company: {\n ...receiptInfo.companyInfo,\n walletAddress: recipientWallet,\n },\n buyer: {\n ...buyerInfo,\n walletAddress: connectedWalletAddress || \"\",\n },\n payment: {\n amount: amountInUsd, // TODO connect to actual payout and exchange rate\n chain: network,\n currency: selectedCurrency.symbol,\n exchangeRate: 1,\n transactionHash: txHash,\n },\n items: receiptInfo.items,\n totals: receiptInfo.totals,\n metadata: {\n receiptNumber: receiptInfo?.receiptNumber\n ? receiptInfo.receiptNumber\n : generateReceiptNumber(),\n notes: `Payment processed through Request Network for ${amountInUsd} USD`,\n },\n };\n\n const handleDownloadReceipt = async () => {\n try {\n const element = receiptRef.current;\n if (!element) {\n console.error(\"Receipt element not found\");\n return;\n }\n\n const html2pdf = (await import(\"html2pdf.js\")).default;\n\n html2pdf()\n .set({\n margin: 1,\n filename: `receipt-${receiptParams.metadata?.receiptNumber || \"payment\"}.pdf`,\n image: { type: \"jpeg\", quality: 0.98 },\n html2canvas: { scale: 2 },\n jsPDF: { unit: \"in\", format: \"a4\", orientation: \"portrait\" },\n })\n .from(element)\n .save();\n } catch (error) {\n console.error(\"Failed to download receipt:\", error);\n alert(\"Failed to download receipt. Please try again.\");\n }\n };\n\n const requestScanUrl = `https://scan.request.network/request/${requestId}`;\n\n return (\n
\n
\n \n
\n

\n Payment Completed!\n

\n

\n Your payment has been processed successfully.\n

\n
\n
\n\n
\n {uiConfig.showReceiptDownload && (\n <>\n \n \n
\n \n
\n
\n \n )}\n {uiConfig.showRequestScanUrl && (\n \n )}\n
\n
\n );\n}\n", "type": "registry:component", "target": "components/payment-widget/components/payment-success.tsx" }, @@ -112,7 +112,7 @@ }, { "path": "registry/default/payment-widget/utils/receipt.ts", - "content": "import type { BuyerInfo, CompanyInfo, ReceiptItem } from \"../types\";\n\nexport interface PaymentInfo {\n chain: string;\n currency: string;\n exchangeRate: number;\n transactionHash?: string;\n}\n\nexport interface ReceiptMetadata {\n receiptNumber: string;\n issueDate: Date;\n notes?: string;\n}\n\ninterface ReceiptBuyerInfo extends BuyerInfo {\n walletAddress: string;\n}\n\ninterface ReceiptCompanyInfo extends CompanyInfo {\n walletAddress: string;\n}\n\nexport interface ReceiptData {\n company: ReceiptCompanyInfo;\n buyer: ReceiptBuyerInfo;\n payment: PaymentInfo;\n items: ReceiptItem[];\n metadata: ReceiptMetadata;\n totals: {\n totalDiscount: number;\n totalTax: number;\n total: number;\n totalUSD: number;\n };\n}\n\nexport const generateReceiptNumber = (prefix: string = \"REC\"): string => {\n const timestamp = Date.now();\n const random = Math.floor(Math.random() * 1000)\n .toString()\n .padStart(3, \"0\");\n return `${prefix}-${timestamp}-${random}`;\n};\n\nexport const formatUSDAmount = (amount: number): string => {\n return new Intl.NumberFormat(\"en-US\", {\n style: \"currency\",\n currency: \"USD\",\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n }).format(amount);\n};\n\nexport const formatCryptoAmount = (\n amount: number,\n currency: string,\n): string => {\n return `${amount} ${currency}`;\n};\n\nexport const formatReceiptDate = (date: Date): string => {\n return date.toLocaleDateString(\"en-US\", {\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n });\n};\n\nexport interface CreateReceiptParams {\n company: ReceiptCompanyInfo;\n buyer: ReceiptBuyerInfo;\n payment: PaymentInfo;\n items: ReceiptItem[];\n totals: {\n totalDiscount: number;\n totalTax: number;\n total: number;\n totalUSD: number;\n };\n metadata: Omit;\n}\n\nexport const createReceipt = (params: CreateReceiptParams): ReceiptData => {\n const metadata: ReceiptMetadata = {\n ...params.metadata,\n issueDate: new Date(),\n };\n\n const receipt: ReceiptData = {\n metadata,\n company: params.company,\n buyer: params.buyer,\n payment: params.payment,\n items: params.items,\n totals: params.totals,\n };\n\n return receipt;\n};\n\nexport const ReceiptUtils = {\n createReceipt,\n generateReceiptNumber,\n formatUSDAmount,\n formatCryptoAmount,\n formatReceiptDate,\n} as const;\n", + "content": "import type { BuyerInfo, CompanyInfo, ReceiptItem } from \"../types\";\n\nexport interface PaymentInfo {\n chain: string;\n amount: string;\n currency: string;\n exchangeRate: number;\n transactionHash?: string;\n}\n\nexport interface ReceiptMetadata {\n receiptNumber: string;\n issueDate: Date;\n notes?: string;\n}\n\ninterface ReceiptBuyerInfo extends BuyerInfo {\n walletAddress: string;\n}\n\ninterface ReceiptCompanyInfo extends CompanyInfo {\n walletAddress: string;\n}\n\nexport interface ReceiptData {\n company: ReceiptCompanyInfo;\n buyer: ReceiptBuyerInfo;\n payment: PaymentInfo;\n items: ReceiptItem[];\n metadata: ReceiptMetadata;\n totals: {\n totalDiscount: number;\n totalTax: number;\n total: number;\n totalUSD: number;\n };\n}\n\nexport const generateReceiptNumber = (prefix: string = \"REC\"): string => {\n const timestamp = Date.now();\n const random = Math.floor(Math.random() * 1000)\n .toString()\n .padStart(3, \"0\");\n return `${prefix}-${timestamp}-${random}`;\n};\n\nexport const formatUSDAmount = (amount: number): string => {\n return new Intl.NumberFormat(\"en-US\", {\n style: \"currency\",\n currency: \"USD\",\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n }).format(amount);\n};\n\nexport const formatCryptoAmount = (\n amount: string,\n currency: string,\n): string => {\n return `${amount} ${currency}`;\n};\n\nexport const formatReceiptDate = (date: Date): string => {\n return date.toLocaleDateString(\"en-US\", {\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n });\n};\n\nexport interface CreateReceiptParams {\n company: ReceiptCompanyInfo;\n buyer: ReceiptBuyerInfo;\n payment: PaymentInfo;\n items: ReceiptItem[];\n totals: {\n totalDiscount: number;\n totalTax: number;\n total: number;\n totalUSD: number;\n };\n metadata: Omit;\n}\n\nexport const createReceipt = (params: CreateReceiptParams): ReceiptData => {\n const metadata: ReceiptMetadata = {\n ...params.metadata,\n issueDate: new Date(),\n };\n\n const receipt: ReceiptData = {\n metadata,\n company: params.company,\n buyer: params.buyer,\n payment: params.payment,\n items: params.items,\n totals: params.totals,\n };\n\n return receipt;\n};\n\nexport const ReceiptUtils = {\n createReceipt,\n generateReceiptNumber,\n formatUSDAmount,\n formatCryptoAmount,\n formatReceiptDate,\n} as const;\n", "type": "registry:lib", "target": "components/payment-widget/utils/receipt.ts" }, @@ -124,13 +124,13 @@ }, { "path": "registry/default/payment-widget/hooks/use-payment.ts", - "content": "import { useState } from \"react\";\nimport {\n useAccount,\n useSendTransaction,\n useConfig,\n useSwitchChain,\n} from \"wagmi\";\nimport { waitForTransactionReceipt } from \"wagmi/actions\";\nimport { createPublicClient, http } from \"viem\";\nimport {\n executePayment,\n type PaymentParams,\n type TxParams,\n type PaymentResponse,\n type SendTransactionFunction,\n type WaitForTransactionFunction,\n} from \"../utils/payment\";\nimport type { PaymentError } from \"../types/index\";\nimport type { Account, WalletClient, TransactionReceipt } from \"viem\";\nimport { getChainFromNetwork } from \"../utils/chains\";\n\nexport const usePayment = (network: string, walletAccount?: WalletClient) => {\n const [isExecuting, setIsExecuting] = useState(false);\n const { isConnected: wagmiConnected, address: wagmiAddress } = useAccount();\n const { sendTransactionAsync } = useSendTransaction();\n const { switchChainAsync } = useSwitchChain();\n const config = useConfig();\n\n const requiredChain = getChainFromNetwork(network);\n const isConnected = walletAccount\n ? Boolean(walletAccount.account)\n : wagmiConnected;\n\n const address = walletAccount ? walletAccount.account?.address : wagmiAddress;\n const isUsingCustomWallet = walletAccount?.account !== undefined;\n\n const wrappedSendTransaction: SendTransactionFunction = isUsingCustomWallet\n ? async (transaction: TxParams): Promise<`0x${string}`> => {\n const hash = await walletAccount.sendTransaction({\n account: walletAccount.account as Account,\n chain: walletAccount.chain,\n to: transaction.to,\n data: transaction.data,\n value: transaction.value,\n });\n\n return hash;\n }\n : async (tx: TxParams): Promise<`0x${string}`> => {\n const hash = await sendTransactionAsync(tx);\n return hash;\n };\n\n const wrappedWaitForTransaction: WaitForTransactionFunction =\n isUsingCustomWallet\n ? async (hash: `0x${string}`): Promise => {\n if (!walletAccount.chain) {\n throw {\n type: \"wallet\",\n error: new Error(\"Wallet isn't connected to any chain\"),\n } as PaymentError;\n }\n const publicClient = createPublicClient({\n chain: walletAccount.chain,\n transport: http(),\n });\n\n const receipt = await publicClient.waitForTransactionReceipt({\n hash,\n });\n\n return receipt;\n }\n : async (hash: `0x${string}`): Promise => {\n const receipt = await waitForTransactionReceipt(config, {\n hash,\n });\n return receipt;\n };\n\n const execute = async (\n rnApiClientId: string,\n params: PaymentParams,\n ): Promise => {\n if (!isConnected || !address) {\n throw {\n type: \"wallet\",\n error: new Error(\"Wallet not connected\"),\n } as PaymentError;\n }\n\n setIsExecuting(true);\n try {\n if (isUsingCustomWallet) {\n await walletAccount.switchChain({ id: requiredChain.id });\n } else {\n await switchChainAsync({ chainId: requiredChain.id });\n }\n\n return await executePayment({\n rnApiClientId,\n paymentParams: {\n amountInUsd: params.amountInUsd,\n payerWallet: address,\n recipientWallet: params.recipientWallet,\n paymentCurrency: params.paymentCurrency,\n feeInfo: params.feeInfo,\n customerInfo: params.customerInfo,\n },\n sendTransaction: wrappedSendTransaction,\n waitForTransaction: wrappedWaitForTransaction,\n });\n } finally {\n setIsExecuting(false);\n }\n };\n\n return {\n isExecuting,\n executePayment: execute,\n isConnected,\n address,\n };\n};\n", + "content": "import { useState } from \"react\";\nimport {\n useAccount,\n useSendTransaction,\n useConfig,\n useSwitchChain,\n} from \"wagmi\";\nimport { waitForTransactionReceipt } from \"wagmi/actions\";\nimport { createPublicClient, http } from \"viem\";\nimport {\n executePayment,\n type PaymentParams,\n type TxParams,\n type PaymentResponse,\n type SendTransactionFunction,\n type WaitForTransactionFunction,\n} from \"../utils/payment\";\nimport type { PaymentError } from \"../types/index\";\nimport type { Account, WalletClient, TransactionReceipt } from \"viem\";\nimport { getChainFromNetwork } from \"../utils/chains\";\n\nexport const usePayment = (network: string, walletAccount?: WalletClient) => {\n const [isExecuting, setIsExecuting] = useState(false);\n const { isConnected: isWagmiConnected, address: wagmiAddress } = useAccount();\n const { sendTransactionAsync } = useSendTransaction();\n const { switchChainAsync } = useSwitchChain();\n const config = useConfig();\n\n const requiredChain = getChainFromNetwork(network);\n const isConnected = walletAccount\n ? Boolean(walletAccount.account)\n : isWagmiConnected;\n\n const address = walletAccount ? walletAccount.account?.address : wagmiAddress;\n const isUsingCustomWallet = walletAccount?.account !== undefined;\n\n const wrappedSendTransaction: SendTransactionFunction = isUsingCustomWallet\n ? async (transaction: TxParams): Promise<`0x${string}`> => {\n const hash = await walletAccount.sendTransaction({\n account: walletAccount.account as Account,\n chain: requiredChain,\n to: transaction.to,\n data: transaction.data,\n value: transaction.value,\n });\n\n return hash;\n }\n : async (tx: TxParams): Promise<`0x${string}`> => {\n const hash = await sendTransactionAsync(tx);\n return hash;\n };\n\n const wrappedWaitForTransaction: WaitForTransactionFunction =\n isUsingCustomWallet\n ? async (hash: `0x${string}`): Promise => {\n const publicClient = createPublicClient({\n chain: requiredChain,\n transport: http(),\n });\n\n const receipt = await publicClient.waitForTransactionReceipt({\n hash,\n });\n\n return receipt;\n }\n : async (hash: `0x${string}`): Promise => {\n const receipt = await waitForTransactionReceipt(config, {\n hash,\n });\n return receipt;\n };\n\n const execute = async (\n rnApiClientId: string,\n params: PaymentParams,\n ): Promise => {\n if (!isConnected || !address) {\n throw {\n type: \"wallet\",\n error: new Error(\"Wallet not connected\"),\n } as PaymentError;\n }\n\n setIsExecuting(true);\n try {\n if (isUsingCustomWallet) {\n await walletAccount.switchChain({ id: requiredChain.id });\n } else {\n await switchChainAsync({ chainId: requiredChain.id });\n }\n\n return await executePayment({\n rnApiClientId,\n paymentParams: {\n amountInUsd: params.amountInUsd,\n payerWallet: address,\n recipientWallet: params.recipientWallet,\n paymentCurrency: params.paymentCurrency,\n feeInfo: params.feeInfo,\n customerInfo: params.customerInfo,\n },\n sendTransaction: wrappedSendTransaction,\n waitForTransaction: wrappedWaitForTransaction,\n });\n } finally {\n setIsExecuting(false);\n }\n };\n\n return {\n isExecuting,\n executePayment: execute,\n };\n};\n", "type": "registry:lib", "target": "components/payment-widget/hooks/use-payment.ts" }, { "path": "registry/default/payment-widget/types/index.ts", - "content": "export interface FeeInfo {\n feePercentage: string;\n feeAddress: string;\n}\n\nexport interface PaymentError {\n type: \"wallet\" | \"transaction\" | \"api\" | \"unknown\";\n error: Error;\n}\n\nexport interface Transaction {\n to: string;\n data: string;\n value: { hex: string };\n}\n\nexport interface ReceiptItem {\n id: string;\n description: string;\n quantity: number;\n unitPrice: number;\n discount?: number;\n tax?: number;\n total: number;\n currency?: string;\n}\n\nexport interface CompanyInfo {\n name: string;\n address?: {\n street: string;\n city: string;\n state: string;\n postalCode: string;\n country: string;\n };\n taxId?: string;\n email?: string;\n phone?: string;\n website?: string;\n}\n\nexport interface BuyerInfo {\n email: string;\n firstName?: string;\n lastName?: string;\n businessName?: string;\n phone?: string;\n address?: {\n street: string;\n city: string;\n state: string;\n country: string;\n postalCode: string;\n };\n}\n\nexport interface ReceiptTotals {\n totalDiscount: number;\n totalTax: number;\n total: number;\n totalUSD: number;\n}\n\nexport interface ReceiptInfo {\n buyerInfo?: BuyerInfo;\n companyInfo: CompanyInfo;\n items: ReceiptItem[];\n totals: ReceiptTotals;\n receiptNumber?: string;\n}\n", + "content": "export interface FeeInfo {\n feePercentage: string;\n feeAddress: string;\n}\n\n// TODO check out if we want to rework all numbers to strings\n\nexport interface PaymentError {\n type: \"wallet\" | \"transaction\" | \"api\" | \"unknown\";\n error: Error;\n}\n\nexport interface Transaction {\n to: string;\n data: string;\n value: { hex: string };\n}\n\nexport interface ReceiptItem {\n id: string;\n description: string;\n quantity: number;\n unitPrice: number;\n discount?: number;\n tax?: number;\n total: number;\n currency?: string;\n}\n\nexport interface CompanyInfo {\n name: string;\n address?: {\n street: string;\n city: string;\n state: string;\n postalCode: string;\n country: string;\n };\n taxId?: string;\n email?: string;\n phone?: string;\n website?: string;\n}\n\nexport interface BuyerInfo {\n email: string;\n firstName?: string;\n lastName?: string;\n businessName?: string;\n phone?: string;\n address?: {\n street: string;\n city: string;\n state: string;\n country: string;\n postalCode: string;\n };\n}\n\nexport interface ReceiptTotals {\n totalDiscount: number;\n totalTax: number;\n total: number;\n totalUSD: number;\n}\n\nexport interface ReceiptInfo {\n buyerInfo?: BuyerInfo;\n companyInfo: CompanyInfo;\n items: ReceiptItem[];\n totals: ReceiptTotals;\n receiptNumber?: string;\n}\n", "type": "registry:lib", "target": "components/payment-widget/types/index.ts" }, @@ -148,13 +148,13 @@ }, { "path": "registry/default/payment-widget/components/receipt/receipt-template.tsx", - "content": "import type { FC } from \"react\";\nimport {\n formatCryptoAmount,\n formatUSDAmount,\n formatReceiptDate,\n type ReceiptData,\n} from \"../../utils/receipt\";\n// a module.css file doesn't work with html2pdf.js\nimport \"./styles.css\";\n\nexport const ReceiptPDFTemplate: FC<{ receipt: ReceiptData }> = ({\n receipt,\n}) => {\n return (\n
\n
\n
\n

{receipt.company.name}

\n
\n {receipt.company.address && (\n <>\n
{receipt.company.address.street}
\n
\n {receipt.company.address.city},{\" \"}\n {receipt.company.address.state}{\" \"}\n {receipt.company.address.postalCode}{\" \"}\n {receipt.company.address.country}\n
\n \n )}\n {receipt.company.email &&
{receipt.company.email}
}\n {receipt.company.taxId && (\n
Tax ID: {receipt.company.taxId}
\n )}\n
\n
\n\n
\n

REC

\n
\n #{receipt.metadata.receiptNumber}\n
\n
\n {formatReceiptDate(receipt.metadata.issueDate)}\n
\n
\n
\n\n
\n
\n

FROM

\n
{receipt.company.name}
\n
{receipt.company.walletAddress}
\n
\n {receipt.company.address && (\n <>\n
{receipt.company.address.street}
\n
\n {receipt.company.address.city},{\" \"}\n {receipt.company.address.state}{\" \"}\n {receipt.company.address.postalCode}{\" \"}\n {receipt.company.address.country}\n
\n \n )}\n
\n
\n\n
\n

TO

\n
\n {[receipt.buyer.firstName, receipt.buyer.lastName]\n .filter(Boolean)\n .join(\" \") || \"Customer\"}\n
\n
{receipt.buyer.walletAddress}
\n {receipt.buyer.email && (\n
{receipt.buyer.email}
\n )}\n {receipt.buyer.address && (\n
\n
{receipt.buyer.address.street}
\n
\n {receipt.buyer.address.city}, {receipt.buyer.address.state}{\" \"}\n {receipt.buyer.address.postalCode}{\" \"}\n {receipt.buyer.address.country}\n
\n
\n )}\n
\n
\n\n
\n
\n Payment Method:{\" \"}\n {`${receipt.payment.currency} on ${receipt.payment.chain}`}\n
\n {receipt.payment.transactionHash && (\n
\n Transaction: {receipt.payment.transactionHash}\n
\n )}\n
\n\n \n \n \n \n \n \n \n \n \n \n \n \n {receipt.items.map((item, index) => (\n \n \n \n \n \n \n \n \n ))}\n \n
DescriptionQtyUnit PriceDisc%Tax%Total
{item.description}{item.quantity}\n {formatCryptoAmount(\n item.unitPrice,\n item.currency || receipt.payment.currency,\n )}\n {item.discount || 0}%{item.tax || 0}%\n {formatCryptoAmount(\n item.total,\n item.currency || receipt.payment.currency,\n )}\n
\n\n
\n
\n {receipt.totals.totalDiscount > 0 && (\n
\n Discount:\n \n -\n {formatCryptoAmount(\n receipt.totals.totalDiscount,\n receipt.payment.currency,\n )}\n \n
\n )}\n\n {receipt.totals.totalTax > 0 && (\n
\n Tax:\n \n {formatCryptoAmount(\n receipt.totals.totalTax,\n receipt.payment.currency,\n )}\n \n
\n )}\n\n
\n Subtotal:\n \n {formatCryptoAmount(\n receipt.totals.total,\n receipt.payment.currency,\n )}\n \n
\n\n
\n TOTAL (USD):\n \n {formatUSDAmount(receipt.totals.totalUSD)}\n \n
\n
\n
\n\n {receipt.metadata.notes && (\n
\n Notes: {receipt.metadata.notes}\n
\n )}\n
\n );\n};\n", + "content": "import type { FC } from \"react\";\nimport {\n formatCryptoAmount,\n formatUSDAmount,\n formatReceiptDate,\n type ReceiptData,\n} from \"../../utils/receipt\";\n// a module.css file doesn't work with html2pdf.js\nimport \"./styles.css\";\n\nexport const ReceiptPDFTemplate: FC<{ receipt: ReceiptData }> = ({\n receipt,\n}) => {\n return (\n
\n
\n
\n

{receipt.company.name}

\n
\n {receipt.company.address && (\n <>\n
{receipt.company.address.street}
\n
\n {receipt.company.address.city},{\" \"}\n {receipt.company.address.state}{\" \"}\n {receipt.company.address.postalCode}{\" \"}\n {receipt.company.address.country}\n
\n \n )}\n {receipt.company.email &&
{receipt.company.email}
}\n {receipt.company.taxId && (\n
Tax ID: {receipt.company.taxId}
\n )}\n
\n
\n\n
\n

REC

\n
\n #{receipt.metadata.receiptNumber}\n
\n
\n {formatReceiptDate(receipt.metadata.issueDate)}\n
\n
\n
\n\n
\n
\n

FROM

\n
{receipt.company.name}
\n
{receipt.company.walletAddress}
\n
\n {receipt.company.address && (\n <>\n
{receipt.company.address.street}
\n
\n {receipt.company.address.city},{\" \"}\n {receipt.company.address.state}{\" \"}\n {receipt.company.address.postalCode}{\" \"}\n {receipt.company.address.country}\n
\n \n )}\n
\n
\n\n
\n

TO

\n
\n {[receipt.buyer.firstName, receipt.buyer.lastName]\n .filter(Boolean)\n .join(\" \") || \"Customer\"}\n
\n
{receipt.buyer.walletAddress}
\n {receipt.buyer.email && (\n
{receipt.buyer.email}
\n )}\n {receipt.buyer.address && (\n
\n
{receipt.buyer.address.street}
\n
\n {receipt.buyer.address.city}, {receipt.buyer.address.state}{\" \"}\n {receipt.buyer.address.postalCode}{\" \"}\n {receipt.buyer.address.country}\n
\n
\n )}\n
\n
\n\n
\n
\n Payment Method:{\" \"}\n {`${receipt.payment.currency} on ${receipt.payment.chain}`}\n
\n {receipt.payment.transactionHash && (\n
\n Transaction: {receipt.payment.transactionHash}\n
\n )}\n
\n\n \n \n \n \n \n \n \n \n \n \n \n \n {receipt.items.map((item, index) => (\n \n \n \n \n \n \n \n \n ))}\n \n
DescriptionQtyUnit PriceDisc%Tax%Total
{item.description}{item.quantity}\n {formatCryptoAmount(\n item.unitPrice.toString(),\n item.currency || receipt.payment.currency,\n )}\n {item.discount || 0}%{item.tax || 0}%\n {formatCryptoAmount(\n item.total.toString(),\n item.currency || receipt.payment.currency,\n )}\n
\n\n
\n
\n {receipt.totals.totalDiscount > 0 && (\n
\n Discount:\n \n -\n {formatCryptoAmount(\n receipt.totals.totalDiscount.toString(),\n receipt.payment.currency,\n )}\n \n
\n )}\n\n {receipt.totals.totalTax > 0 && (\n
\n Tax:\n \n {formatCryptoAmount(\n receipt.totals.totalTax.toString(),\n receipt.payment.currency,\n )}\n \n
\n )}\n\n
\n Subtotal:\n \n {formatCryptoAmount(\n receipt.payment.amount,\n receipt.payment.currency,\n )}\n \n
\n\n
\n TOTAL (USD):\n \n {formatUSDAmount(receipt.totals.totalUSD)}\n \n
\n
\n
\n\n {receipt.metadata.notes && (\n
\n Notes: {receipt.metadata.notes}\n
\n )}\n
\n );\n};\n", "type": "registry:component", "target": "components/payment-widget/components/receipt/receipt-template.tsx" }, { "path": "registry/default/payment-widget/components/receipt/styles.css", - "content": ".receipt-container {\n background-color: #ffffff;\n padding: 20px;\n max-width: 800px;\n margin: 0 auto;\n font-family:\n -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;\n font-size: 12px;\n line-height: 1.4;\n color: #2d3748;\n}\n\n.receipt-header {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n margin-bottom: 20px;\n padding-bottom: 15px;\n border-bottom: 2px solid #e2e8f0;\n}\n\n.company-info {\n flex: 1;\n}\n\n.company-name {\n font-size: 24px;\n font-weight: 700;\n color: #1a202c;\n margin: 0 0 8px 0;\n}\n\n.company-details {\n font-size: 11px;\n color: #4a5568;\n line-height: 1.3;\n}\n\n.company-details > div {\n margin-bottom: 2px;\n}\n\n.receipt-title-section {\n text-align: right;\n}\n\n.receipt-title {\n font-size: 28px;\n font-weight: 700;\n color: #2d3748;\n margin: 0 0 4px 0;\n}\n\n.receipt-number {\n font-size: 16px;\n font-weight: 600;\n color: #4a5568;\n margin-bottom: 4px;\n}\n\n.receipt-date {\n font-size: 11px;\n color: #718096;\n}\n\n.party-info-section {\n display: flex;\n gap: 20px;\n margin-bottom: 16px;\n}\n\n.info-box {\n flex: 1;\n border: 1px solid #e2e8f0;\n border-radius: 6px;\n padding: 12px;\n background-color: #f7fafc;\n}\n\n.info-header {\n font-size: 11px;\n font-weight: 700;\n color: #2d3748;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin: 0 0 8px 0;\n}\n\n.party-name {\n font-weight: 600;\n font-size: 14px;\n color: #1a202c;\n margin-bottom: 4px;\n}\n\n.wallet-address {\n font-size: 10px;\n color: #718096;\n font-family: \"Monaco\", \"Courier New\", monospace;\n margin-bottom: 6px;\n word-break: break-all;\n}\n\n.email {\n font-size: 11px;\n color: #4a5568;\n margin-bottom: 4px;\n}\n\n.address-info {\n font-size: 11px;\n color: #4a5568;\n line-height: 1.3;\n}\n\n.address-info > div {\n margin-bottom: 2px;\n}\n\n.payment-info {\n background-color: #edf2f7;\n padding: 8px 12px;\n border-radius: 4px;\n margin-bottom: 16px;\n font-size: 11px;\n color: #2d3748;\n}\n\n.payment-info > div {\n margin-bottom: 2px;\n}\n\n.payment-info > div:last-child {\n margin-bottom: 0;\n}\n\n.transaction-hash {\n font-family: \"Monaco\", \"Courier New\", monospace;\n word-break: break-all;\n}\n\n.items-table {\n width: 100%;\n border-collapse: collapse;\n border: 1px solid #e2e8f0;\n margin-bottom: 16px;\n font-size: 11px;\n}\n\n.items-table th {\n background-color: #edf2f7;\n border: 1px solid #e2e8f0;\n padding: 8px 6px;\n font-weight: 600;\n text-align: left;\n color: #2d3748;\n}\n\n.items-table th.center {\n text-align: center;\n width: 40px;\n}\n\n.items-table th.right {\n text-align: right;\n width: 80px;\n}\n\n.items-table td {\n border: 1px solid #e2e8f0;\n padding: 6px;\n vertical-align: top;\n}\n\n.items-table td.center {\n text-align: center;\n}\n\n.items-table td.right {\n text-align: right;\n font-family: \"Monaco\", \"Courier New\", monospace;\n}\n\n.items-table .row-even {\n background-color: #ffffff;\n}\n\n.items-table .row-odd {\n background-color: #f7fafc;\n}\n\n.items-table .amount {\n font-weight: 600;\n}\n\n.totals-section {\n display: flex;\n justify-content: flex-end;\n margin-bottom: 16px;\n}\n\n.totals-box {\n background-color: #f7fafc;\n border: 1px solid #e2e8f0;\n border-radius: 6px;\n padding: 12px;\n min-width: 240px;\n}\n\n.total-line {\n display: flex;\n justify-content: space-between;\n margin-bottom: 4px;\n font-size: 11px;\n}\n\n.total-line.subtotal {\n padding-top: 6px;\n border-top: 1px solid #e2e8f0;\n font-weight: 600;\n}\n\n.total-line.final {\n font-size: 14px;\n font-weight: 700;\n color: #1a202c;\n padding-top: 6px;\n border-top: 2px solid #2d3748;\n}\n\n.total-amount {\n font-family: \"Monaco\", \"Courier New\", monospace;\n font-size: inherit;\n}\n\n.notes-section {\n border-top: 1px solid #e2e8f0;\n font-size: 11px;\n color: #4a5568;\n background-color: #f7fafc;\n padding: 8px 12px;\n border-radius: 4px;\n}\n", + "content": ".receipt-container {\n background-color: #ffffff;\n padding: 20px;\n max-width: 800px;\n margin: 0 auto;\n font-family:\n -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;\n font-size: 12px;\n line-height: 1.4;\n color: #2d3748;\n\n .receipt-header {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n margin-bottom: 20px;\n padding-bottom: 15px;\n border-bottom: 2px solid #e2e8f0;\n }\n\n .company-info {\n flex: 1;\n }\n\n .company-name {\n font-size: 24px;\n font-weight: 700;\n color: #1a202c;\n margin: 0 0 8px 0;\n }\n\n .company-details {\n font-size: 11px;\n color: #4a5568;\n line-height: 1.3;\n }\n\n .company-details > div {\n margin-bottom: 2px;\n }\n\n .receipt-title-section {\n text-align: right;\n }\n\n .receipt-title {\n font-size: 28px;\n font-weight: 700;\n color: #2d3748;\n margin: 0 0 4px 0;\n }\n\n .receipt-number {\n font-size: 16px;\n font-weight: 600;\n color: #4a5568;\n margin-bottom: 4px;\n }\n\n .receipt-date {\n font-size: 11px;\n color: #718096;\n }\n\n .party-info-section {\n display: flex;\n gap: 20px;\n margin-bottom: 16px;\n }\n\n .info-box {\n flex: 1;\n border: 1px solid #e2e8f0;\n border-radius: 6px;\n padding: 12px;\n background-color: #f7fafc;\n }\n\n .info-header {\n font-size: 11px;\n font-weight: 700;\n color: #2d3748;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin: 0 0 8px 0;\n }\n\n .party-name {\n font-weight: 600;\n font-size: 14px;\n color: #1a202c;\n margin-bottom: 4px;\n }\n\n .wallet-address {\n font-size: 10px;\n color: #718096;\n font-family: \"Monaco\", \"Courier New\", monospace;\n margin-bottom: 6px;\n word-break: break-all;\n }\n\n .email {\n font-size: 11px;\n color: #4a5568;\n margin-bottom: 4px;\n }\n\n .address-info {\n font-size: 11px;\n color: #4a5568;\n line-height: 1.3;\n }\n\n .address-info > div {\n margin-bottom: 2px;\n }\n\n .payment-info {\n background-color: #edf2f7;\n padding: 8px 12px;\n border-radius: 4px;\n margin-bottom: 16px;\n font-size: 11px;\n color: #2d3748;\n }\n\n .payment-info > div {\n margin-bottom: 2px;\n }\n\n .payment-info > div:last-child {\n margin-bottom: 0;\n }\n\n .transaction-hash {\n font-family: \"Monaco\", \"Courier New\", monospace;\n word-break: break-all;\n }\n\n .items-table {\n width: 100%;\n border-collapse: collapse;\n border: 1px solid #e2e8f0;\n margin-bottom: 16px;\n font-size: 11px;\n }\n\n .items-table th {\n background-color: #edf2f7;\n border: 1px solid #e2e8f0;\n padding: 8px 6px;\n font-weight: 600;\n text-align: left;\n color: #2d3748;\n }\n\n .items-table th.center {\n text-align: center;\n width: 40px;\n }\n\n .items-table th.right {\n text-align: right;\n width: 80px;\n }\n\n .items-table td {\n border: 1px solid #e2e8f0;\n padding: 6px;\n vertical-align: top;\n }\n\n .items-table td.center {\n text-align: center;\n }\n\n .items-table td.right {\n text-align: right;\n font-family: \"Monaco\", \"Courier New\", monospace;\n }\n\n .items-table .row-even {\n background-color: #ffffff;\n }\n\n .items-table .row-odd {\n background-color: #f7fafc;\n }\n\n .items-table .amount {\n font-weight: 600;\n }\n\n .totals-section {\n display: flex;\n justify-content: flex-end;\n margin-bottom: 16px;\n }\n\n .totals-box {\n background-color: #f7fafc;\n border: 1px solid #e2e8f0;\n border-radius: 6px;\n padding: 12px;\n min-width: 240px;\n }\n\n .total-line {\n display: flex;\n justify-content: space-between;\n margin-bottom: 4px;\n font-size: 11px;\n }\n\n .total-line.subtotal {\n padding-top: 6px;\n border-top: 1px solid #e2e8f0;\n font-weight: 600;\n }\n\n .total-line.final {\n font-size: 14px;\n font-weight: 700;\n color: #1a202c;\n padding-top: 6px;\n border-top: 2px solid #2d3748;\n }\n\n .total-amount {\n font-family: \"Monaco\", \"Courier New\", monospace;\n font-size: inherit;\n }\n\n .notes-section {\n border-top: 1px solid #e2e8f0;\n font-size: 11px;\n color: #4a5568;\n background-color: #f7fafc;\n padding: 8px 12px;\n border-radius: 4px;\n }\n}\n", "type": "registry:component", "target": "components/payment-widget/components/receipt/styles.css" }, diff --git a/registry/default/payment-widget/components/payment-confirmation.tsx b/registry/default/payment-widget/components/payment-confirmation.tsx index c601bd5..e531b02 100644 --- a/registry/default/payment-widget/components/payment-confirmation.tsx +++ b/registry/default/payment-widget/components/payment-confirmation.tsx @@ -168,7 +168,7 @@ export function PaymentConfirmation({ variant="outline" onClick={onBack} className="flex-1" - disabled={isExecuting} + disabled={isExecuting || !connectedWalletAddress} > Back diff --git a/registry/default/payment-widget/components/payment-success.tsx b/registry/default/payment-widget/components/payment-success.tsx index 5dc2082..97d3780 100644 --- a/registry/default/payment-widget/components/payment-success.tsx +++ b/registry/default/payment-widget/components/payment-success.tsx @@ -46,6 +46,7 @@ export function PaymentSuccess({ walletAddress: connectedWalletAddress || "", }, payment: { + amount: amountInUsd, // TODO connect to actual payout and exchange rate chain: network, currency: selectedCurrency.symbol, exchangeRate: 1, diff --git a/registry/default/payment-widget/components/receipt/receipt-template.tsx b/registry/default/payment-widget/components/receipt/receipt-template.tsx index e69e758..a9901b7 100644 --- a/registry/default/payment-widget/components/receipt/receipt-template.tsx +++ b/registry/default/payment-widget/components/receipt/receipt-template.tsx @@ -123,7 +123,7 @@ export const ReceiptPDFTemplate: FC<{ receipt: ReceiptData }> = ({ {item.quantity} {formatCryptoAmount( - item.unitPrice, + item.unitPrice.toString(), item.currency || receipt.payment.currency, )} @@ -131,7 +131,7 @@ export const ReceiptPDFTemplate: FC<{ receipt: ReceiptData }> = ({ {item.tax || 0}% {formatCryptoAmount( - item.total, + item.total.toString(), item.currency || receipt.payment.currency, )} @@ -148,7 +148,7 @@ export const ReceiptPDFTemplate: FC<{ receipt: ReceiptData }> = ({ - {formatCryptoAmount( - receipt.totals.totalDiscount, + receipt.totals.totalDiscount.toString(), receipt.payment.currency, )} @@ -160,7 +160,7 @@ export const ReceiptPDFTemplate: FC<{ receipt: ReceiptData }> = ({ Tax: {formatCryptoAmount( - receipt.totals.totalTax, + receipt.totals.totalTax.toString(), receipt.payment.currency, )} @@ -171,7 +171,7 @@ export const ReceiptPDFTemplate: FC<{ receipt: ReceiptData }> = ({ Subtotal: {formatCryptoAmount( - receipt.totals.total, + receipt.payment.amount, receipt.payment.currency, )} diff --git a/registry/default/payment-widget/components/receipt/styles.css b/registry/default/payment-widget/components/receipt/styles.css index d2b73d1..ea2faf0 100644 --- a/registry/default/payment-widget/components/receipt/styles.css +++ b/registry/default/payment-widget/components/receipt/styles.css @@ -8,236 +8,236 @@ font-size: 12px; line-height: 1.4; color: #2d3748; -} - -.receipt-header { - display: flex; - justify-content: space-between; - align-items: flex-start; - margin-bottom: 20px; - padding-bottom: 15px; - border-bottom: 2px solid #e2e8f0; -} - -.company-info { - flex: 1; -} - -.company-name { - font-size: 24px; - font-weight: 700; - color: #1a202c; - margin: 0 0 8px 0; -} - -.company-details { - font-size: 11px; - color: #4a5568; - line-height: 1.3; -} - -.company-details > div { - margin-bottom: 2px; -} - -.receipt-title-section { - text-align: right; -} - -.receipt-title { - font-size: 28px; - font-weight: 700; - color: #2d3748; - margin: 0 0 4px 0; -} - -.receipt-number { - font-size: 16px; - font-weight: 600; - color: #4a5568; - margin-bottom: 4px; -} - -.receipt-date { - font-size: 11px; - color: #718096; -} - -.party-info-section { - display: flex; - gap: 20px; - margin-bottom: 16px; -} - -.info-box { - flex: 1; - border: 1px solid #e2e8f0; - border-radius: 6px; - padding: 12px; - background-color: #f7fafc; -} - -.info-header { - font-size: 11px; - font-weight: 700; - color: #2d3748; - text-transform: uppercase; - letter-spacing: 0.5px; - margin: 0 0 8px 0; -} - -.party-name { - font-weight: 600; - font-size: 14px; - color: #1a202c; - margin-bottom: 4px; -} - -.wallet-address { - font-size: 10px; - color: #718096; - font-family: "Monaco", "Courier New", monospace; - margin-bottom: 6px; - word-break: break-all; -} - -.email { - font-size: 11px; - color: #4a5568; - margin-bottom: 4px; -} - -.address-info { - font-size: 11px; - color: #4a5568; - line-height: 1.3; -} - -.address-info > div { - margin-bottom: 2px; -} - -.payment-info { - background-color: #edf2f7; - padding: 8px 12px; - border-radius: 4px; - margin-bottom: 16px; - font-size: 11px; - color: #2d3748; -} - -.payment-info > div { - margin-bottom: 2px; -} - -.payment-info > div:last-child { - margin-bottom: 0; -} - -.transaction-hash { - font-family: "Monaco", "Courier New", monospace; - word-break: break-all; -} - -.items-table { - width: 100%; - border-collapse: collapse; - border: 1px solid #e2e8f0; - margin-bottom: 16px; - font-size: 11px; -} - -.items-table th { - background-color: #edf2f7; - border: 1px solid #e2e8f0; - padding: 8px 6px; - font-weight: 600; - text-align: left; - color: #2d3748; -} - -.items-table th.center { - text-align: center; - width: 40px; -} - -.items-table th.right { - text-align: right; - width: 80px; -} - -.items-table td { - border: 1px solid #e2e8f0; - padding: 6px; - vertical-align: top; -} - -.items-table td.center { - text-align: center; -} - -.items-table td.right { - text-align: right; - font-family: "Monaco", "Courier New", monospace; -} - -.items-table .row-even { - background-color: #ffffff; -} - -.items-table .row-odd { - background-color: #f7fafc; -} - -.items-table .amount { - font-weight: 600; -} - -.totals-section { - display: flex; - justify-content: flex-end; - margin-bottom: 16px; -} - -.totals-box { - background-color: #f7fafc; - border: 1px solid #e2e8f0; - border-radius: 6px; - padding: 12px; - min-width: 240px; -} - -.total-line { - display: flex; - justify-content: space-between; - margin-bottom: 4px; - font-size: 11px; -} - -.total-line.subtotal { - padding-top: 6px; - border-top: 1px solid #e2e8f0; - font-weight: 600; -} - -.total-line.final { - font-size: 14px; - font-weight: 700; - color: #1a202c; - padding-top: 6px; - border-top: 2px solid #2d3748; -} - -.total-amount { - font-family: "Monaco", "Courier New", monospace; - font-size: inherit; -} -.notes-section { - border-top: 1px solid #e2e8f0; - font-size: 11px; - color: #4a5568; - background-color: #f7fafc; - padding: 8px 12px; - border-radius: 4px; + .receipt-header { + display: flex; + justify-content: space-between; + align-items: flex-start; + margin-bottom: 20px; + padding-bottom: 15px; + border-bottom: 2px solid #e2e8f0; + } + + .company-info { + flex: 1; + } + + .company-name { + font-size: 24px; + font-weight: 700; + color: #1a202c; + margin: 0 0 8px 0; + } + + .company-details { + font-size: 11px; + color: #4a5568; + line-height: 1.3; + } + + .company-details > div { + margin-bottom: 2px; + } + + .receipt-title-section { + text-align: right; + } + + .receipt-title { + font-size: 28px; + font-weight: 700; + color: #2d3748; + margin: 0 0 4px 0; + } + + .receipt-number { + font-size: 16px; + font-weight: 600; + color: #4a5568; + margin-bottom: 4px; + } + + .receipt-date { + font-size: 11px; + color: #718096; + } + + .party-info-section { + display: flex; + gap: 20px; + margin-bottom: 16px; + } + + .info-box { + flex: 1; + border: 1px solid #e2e8f0; + border-radius: 6px; + padding: 12px; + background-color: #f7fafc; + } + + .info-header { + font-size: 11px; + font-weight: 700; + color: #2d3748; + text-transform: uppercase; + letter-spacing: 0.5px; + margin: 0 0 8px 0; + } + + .party-name { + font-weight: 600; + font-size: 14px; + color: #1a202c; + margin-bottom: 4px; + } + + .wallet-address { + font-size: 10px; + color: #718096; + font-family: "Monaco", "Courier New", monospace; + margin-bottom: 6px; + word-break: break-all; + } + + .email { + font-size: 11px; + color: #4a5568; + margin-bottom: 4px; + } + + .address-info { + font-size: 11px; + color: #4a5568; + line-height: 1.3; + } + + .address-info > div { + margin-bottom: 2px; + } + + .payment-info { + background-color: #edf2f7; + padding: 8px 12px; + border-radius: 4px; + margin-bottom: 16px; + font-size: 11px; + color: #2d3748; + } + + .payment-info > div { + margin-bottom: 2px; + } + + .payment-info > div:last-child { + margin-bottom: 0; + } + + .transaction-hash { + font-family: "Monaco", "Courier New", monospace; + word-break: break-all; + } + + .items-table { + width: 100%; + border-collapse: collapse; + border: 1px solid #e2e8f0; + margin-bottom: 16px; + font-size: 11px; + } + + .items-table th { + background-color: #edf2f7; + border: 1px solid #e2e8f0; + padding: 8px 6px; + font-weight: 600; + text-align: left; + color: #2d3748; + } + + .items-table th.center { + text-align: center; + width: 40px; + } + + .items-table th.right { + text-align: right; + width: 80px; + } + + .items-table td { + border: 1px solid #e2e8f0; + padding: 6px; + vertical-align: top; + } + + .items-table td.center { + text-align: center; + } + + .items-table td.right { + text-align: right; + font-family: "Monaco", "Courier New", monospace; + } + + .items-table .row-even { + background-color: #ffffff; + } + + .items-table .row-odd { + background-color: #f7fafc; + } + + .items-table .amount { + font-weight: 600; + } + + .totals-section { + display: flex; + justify-content: flex-end; + margin-bottom: 16px; + } + + .totals-box { + background-color: #f7fafc; + border: 1px solid #e2e8f0; + border-radius: 6px; + padding: 12px; + min-width: 240px; + } + + .total-line { + display: flex; + justify-content: space-between; + margin-bottom: 4px; + font-size: 11px; + } + + .total-line.subtotal { + padding-top: 6px; + border-top: 1px solid #e2e8f0; + font-weight: 600; + } + + .total-line.final { + font-size: 14px; + font-weight: 700; + color: #1a202c; + padding-top: 6px; + border-top: 2px solid #2d3748; + } + + .total-amount { + font-family: "Monaco", "Courier New", monospace; + font-size: inherit; + } + + .notes-section { + border-top: 1px solid #e2e8f0; + font-size: 11px; + color: #4a5568; + background-color: #f7fafc; + padding: 8px 12px; + border-radius: 4px; + } } diff --git a/registry/default/payment-widget/hooks/use-payment.ts b/registry/default/payment-widget/hooks/use-payment.ts index 72e3668..dc6d3e0 100644 --- a/registry/default/payment-widget/hooks/use-payment.ts +++ b/registry/default/payment-widget/hooks/use-payment.ts @@ -21,7 +21,7 @@ import { getChainFromNetwork } from "../utils/chains"; export const usePayment = (network: string, walletAccount?: WalletClient) => { const [isExecuting, setIsExecuting] = useState(false); - const { isConnected: wagmiConnected, address: wagmiAddress } = useAccount(); + const { isConnected: isWagmiConnected, address: wagmiAddress } = useAccount(); const { sendTransactionAsync } = useSendTransaction(); const { switchChainAsync } = useSwitchChain(); const config = useConfig(); @@ -29,7 +29,7 @@ export const usePayment = (network: string, walletAccount?: WalletClient) => { const requiredChain = getChainFromNetwork(network); const isConnected = walletAccount ? Boolean(walletAccount.account) - : wagmiConnected; + : isWagmiConnected; const address = walletAccount ? walletAccount.account?.address : wagmiAddress; const isUsingCustomWallet = walletAccount?.account !== undefined; @@ -38,7 +38,7 @@ export const usePayment = (network: string, walletAccount?: WalletClient) => { ? async (transaction: TxParams): Promise<`0x${string}`> => { const hash = await walletAccount.sendTransaction({ account: walletAccount.account as Account, - chain: walletAccount.chain, + chain: requiredChain, to: transaction.to, data: transaction.data, value: transaction.value, @@ -54,14 +54,8 @@ export const usePayment = (network: string, walletAccount?: WalletClient) => { const wrappedWaitForTransaction: WaitForTransactionFunction = isUsingCustomWallet ? async (hash: `0x${string}`): Promise => { - if (!walletAccount.chain) { - throw { - type: "wallet", - error: new Error("Wallet isn't connected to any chain"), - } as PaymentError; - } const publicClient = createPublicClient({ - chain: walletAccount.chain, + chain: requiredChain, transport: http(), }); @@ -118,7 +112,5 @@ export const usePayment = (network: string, walletAccount?: WalletClient) => { return { isExecuting, executePayment: execute, - isConnected, - address, }; }; diff --git a/registry/default/payment-widget/types/index.ts b/registry/default/payment-widget/types/index.ts index be5917f..f72dfe6 100644 --- a/registry/default/payment-widget/types/index.ts +++ b/registry/default/payment-widget/types/index.ts @@ -3,6 +3,8 @@ export interface FeeInfo { feeAddress: string; } +// TODO check out if we want to rework all numbers to strings + export interface PaymentError { type: "wallet" | "transaction" | "api" | "unknown"; error: Error; diff --git a/registry/default/payment-widget/utils/receipt.ts b/registry/default/payment-widget/utils/receipt.ts index db8e18a..2d7d07b 100644 --- a/registry/default/payment-widget/utils/receipt.ts +++ b/registry/default/payment-widget/utils/receipt.ts @@ -2,6 +2,7 @@ import type { BuyerInfo, CompanyInfo, ReceiptItem } from "../types"; export interface PaymentInfo { chain: string; + amount: string; currency: string; exchangeRate: number; transactionHash?: string; @@ -53,7 +54,7 @@ export const formatUSDAmount = (amount: number): string => { }; export const formatCryptoAmount = ( - amount: number, + amount: string, currency: string, ): string => { return `${amount} ${currency}`; From b3347b8f02034d4716f148454fcdae96a3b75cc5 Mon Sep 17 00:00:00 2001 From: Bassgeta Date: Wed, 17 Sep 2025 16:34:55 +0200 Subject: [PATCH 31/37] refactor: use supportedCurrencies instead of the top level network parameter --- app/components/payment-widget-wrapper.tsx | 2 +- .../components/currency-select.tsx | 10 +++--- .../components/payment-confirmation.tsx | 7 ++-- .../components/payment-success.tsx | 3 +- .../context/payment-widget-context.tsx | 11 +------ .../default/payment-widget/payment-widget.tsx | 33 ++++++++++++++----- .../payment-widget/payment-widget.types.ts | 3 +- .../default/payment-widget/utils/chains.ts | 2 +- .../payment-widget/utils/currencies.ts | 4 +-- 9 files changed, 42 insertions(+), 33 deletions(-) diff --git a/app/components/payment-widget-wrapper.tsx b/app/components/payment-widget-wrapper.tsx index 8bea1a0..f2fe76c 100644 --- a/app/components/payment-widget-wrapper.tsx +++ b/app/components/payment-widget-wrapper.tsx @@ -32,11 +32,11 @@ export function PaymentWidgetWrapper({ paymentConfig={{ walletConnectProjectId, rnApiClientId, - network: "sepolia", supportedCurrencies: [ "ETH-sepolia-sepolia", "fUSDT-sepolia", "FAU-sepolia", + "USDCn-matic", ], feeInfo: undefined /* { feeAddress: "0xEbe98659e162e8fF3520EC71e097C9e0a4F53829", diff --git a/registry/default/payment-widget/components/currency-select.tsx b/registry/default/payment-widget/components/currency-select.tsx index ef0c1d6..96afe11 100644 --- a/registry/default/payment-widget/components/currency-select.tsx +++ b/registry/default/payment-widget/components/currency-select.tsx @@ -18,7 +18,7 @@ interface CurrencySelectProps { export function CurrencySelect({ onSubmit }: CurrencySelectProps) { const { - paymentConfig: { rnApiClientId, network, supportedCurrencies }, + paymentConfig: { rnApiClientId, supportedCurrencies }, } = usePaymentWidgetContext(); const [selectedCurrency, setSelectedCurrency] = useState(""); @@ -28,8 +28,8 @@ export function CurrencySelect({ onSubmit }: CurrencySelectProps) { isError, refetch, } = useQuery({ - queryKey: ["conversionCurrencies", rnApiClientId, network], - queryFn: () => getConversionCurrencies(rnApiClientId, network), + queryKey: ["conversionCurrencies", rnApiClientId], + queryFn: () => getConversionCurrencies(rnApiClientId), }); const handleSubmit = () => { @@ -60,8 +60,8 @@ export function CurrencySelect({ onSubmit }: CurrencySelectProps) { return
No conversion currencies available.
; } - const lowerCaseSupportedCurrencies = (supportedCurrencies || []).map( - (currency) => currency.toLowerCase(), + const lowerCaseSupportedCurrencies = supportedCurrencies.map((currency) => + currency.toLowerCase(), ); const eligibleCurrencies = diff --git a/registry/default/payment-widget/components/payment-confirmation.tsx b/registry/default/payment-widget/components/payment-confirmation.tsx index e531b02..bdafcbe 100644 --- a/registry/default/payment-widget/components/payment-confirmation.tsx +++ b/registry/default/payment-widget/components/payment-confirmation.tsx @@ -32,12 +32,15 @@ export function PaymentConfirmation({ amountInUsd, recipientWallet, connectedWalletAddress, - paymentConfig: { rnApiClientId, feeInfo, network }, + paymentConfig: { rnApiClientId, feeInfo }, receiptInfo: { companyInfo: { name: companyName } = {} }, onError, walletAccount, } = usePaymentWidgetContext(); - const { isExecuting, executePayment } = usePayment(network, walletAccount); + const { isExecuting, executePayment } = usePayment( + selectedCurrency.network, + walletAccount, + ); const [localError, setLocalError] = useState(null); const handleExecutePayment = async (e: React.FormEvent) => { diff --git a/registry/default/payment-widget/components/payment-success.tsx b/registry/default/payment-widget/components/payment-success.tsx index 97d3780..8812ce7 100644 --- a/registry/default/payment-widget/components/payment-success.tsx +++ b/registry/default/payment-widget/components/payment-success.tsx @@ -32,7 +32,6 @@ export function PaymentSuccess({ connectedWalletAddress, receiptInfo, uiConfig, - paymentConfig: { network }, } = usePaymentWidgetContext(); const receiptRef = useRef(null); @@ -47,7 +46,7 @@ export function PaymentSuccess({ }, payment: { amount: amountInUsd, // TODO connect to actual payout and exchange rate - chain: network, + chain: selectedCurrency.network, currency: selectedCurrency.symbol, exchangeRate: 1, transactionHash: txHash, diff --git a/registry/default/payment-widget/context/payment-widget-context.tsx b/registry/default/payment-widget/context/payment-widget-context.tsx index 252e42d..f33b79a 100644 --- a/registry/default/payment-widget/context/payment-widget-context.tsx +++ b/registry/default/payment-widget/context/payment-widget-context.tsx @@ -16,15 +16,8 @@ export interface PaymentWidgetContextValue { paymentConfig: { rnApiClientId: string; - network: - | "arbitrum" - | "base" - | "mainnet" - | "optimism" - | "polygon" - | "sepolia"; feeInfo?: FeeInfo; - supportedCurrencies?: string[]; + supportedCurrencies: string[]; }; uiConfig: { @@ -90,7 +83,6 @@ export function PaymentWidgetProvider({ isWalletOverride, paymentConfig: { rnApiClientId: paymentConfig.rnApiClientId, - network: paymentConfig.network, feeInfo: paymentConfig.feeInfo, supportedCurrencies: paymentConfig.supportedCurrencies, }, @@ -109,7 +101,6 @@ export function PaymentWidgetProvider({ connectedWalletAddress, isWalletOverride, paymentConfig.rnApiClientId, - paymentConfig.network, paymentConfig.feeInfo, paymentConfig.supportedCurrencies, uiConfig?.showReceiptDownload, diff --git a/registry/default/payment-widget/payment-widget.tsx b/registry/default/payment-widget/payment-widget.tsx index c77008c..3fb07ca 100644 --- a/registry/default/payment-widget/payment-widget.tsx +++ b/registry/default/payment-widget/payment-widget.tsx @@ -18,12 +18,35 @@ function PaymentWidgetInner({ children }: PropsWithChildren) { setIsModalOpen(open); }; - const { walletAccount } = usePaymentWidgetContext(); + const { + walletAccount, + paymentConfig: { rnApiClientId, supportedCurrencies }, + } = usePaymentWidgetContext(); + + let isButtonDisabled = false; + + if (!rnApiClientId || rnApiClientId === "") { + console.error("PaymentWidget: rnApiClientId is required in paymentConfig"); + + isButtonDisabled = true; + } + + if (supportedCurrencies.length === 0) { + console.error( + "PaymentWidget: supportedCurrencies is required in paymentConfig", + ); + + isButtonDisabled = true; + } return (
\n\n
\n {/** biome-ignore lint/performance/noImgElement: This is a ShadCN library, we can't enforce next syntax on everybody */}\n \n Powered by Request Network\n
\n\n {walletAccount !== undefined ? (\n \n ) : (\n \n }\n />\n )}\n
\n );\n}\n\nexport function PaymentWidget({\n amountInUsd,\n recipientWallet,\n paymentConfig,\n receiptInfo,\n onSuccess,\n onError,\n uiConfig,\n walletAccount,\n children,\n}: PaymentWidgetProps) {\n if (!paymentConfig.rnApiClientId || paymentConfig.rnApiClientId === \"\") {\n console.error(\"PaymentWidget: rnApiClientId is required in paymentConfig\");\n\n return
Error: rnApiClientId is required
;\n }\n\n return (\n \n \n {children}\n \n \n );\n}\n", + "content": "\"use client\";\n\nimport { type PropsWithChildren, useState } from \"react\";\nimport { Button } from \"@/components/ui/button\";\nimport { ConnectionHandler } from \"./components/connection-handler\";\nimport { Web3Provider } from \"./context/web3-context\";\nimport { PaymentModal } from \"./components/payment-modal\";\nimport {\n PaymentWidgetProvider,\n usePaymentWidgetContext,\n} from \"./context/payment-widget-context\";\nimport type { PaymentWidgetProps } from \"./payment-widget.types\";\nimport { ICONS } from \"./constants\";\n\nfunction PaymentWidgetInner({ children }: PropsWithChildren) {\n const [isModalOpen, setIsModalOpen] = useState(false);\n const handleModalOpenChange = (open: boolean) => {\n setIsModalOpen(open);\n };\n\n const {\n walletAccount,\n paymentConfig: { rnApiClientId, supportedCurrencies },\n } = usePaymentWidgetContext();\n\n let isButtonDisabled = false;\n\n if (!rnApiClientId || rnApiClientId === \"\") {\n console.error(\"PaymentWidget: rnApiClientId is required in paymentConfig\");\n\n isButtonDisabled = true;\n }\n\n if (supportedCurrencies.length === 0) {\n console.error(\n \"PaymentWidget: supportedCurrencies is required in paymentConfig\",\n );\n\n isButtonDisabled = true;\n }\n\n return (\n
\n {\n if (isButtonDisabled) return;\n setIsModalOpen(true);\n }}\n variant=\"ghost\"\n className=\"p-0 h-auto bg-transparent hover:bg-transparent\"\n >\n {children || \"Pay with crypto\"}\n \n\n
\n {/** biome-ignore lint/performance/noImgElement: This is a ShadCN library, we can't enforce next syntax on everybody */}\n \n Powered by Request Network\n
\n\n {walletAccount !== undefined ? (\n \n ) : (\n \n }\n />\n )}\n
\n );\n}\n\nexport function PaymentWidget({\n amountInUsd,\n recipientWallet,\n paymentConfig,\n receiptInfo,\n onSuccess,\n onError,\n uiConfig,\n walletAccount,\n children,\n}: PaymentWidgetProps) {\n return (\n \n \n {children}\n \n \n );\n}\n", "type": "registry:component", "target": "components/payment-widget/payment-widget.tsx" }, { "path": "registry/default/payment-widget/context/payment-widget-context.tsx", - "content": "\"use client\";\n\nimport { createContext, useContext, useMemo, type ReactNode } from \"react\";\nimport { useAccount } from \"wagmi\";\nimport type { ReceiptInfo, FeeInfo, PaymentError } from \"../types/index\";\nimport type { TransactionReceipt, WalletClient } from \"viem\";\nimport type { PaymentWidgetProps } from \"../payment-widget.types\";\n\nexport interface PaymentWidgetContextValue {\n amountInUsd: string;\n recipientWallet: string;\n\n walletAccount?: WalletClient;\n connectedWalletAddress?: string;\n isWalletOverride: boolean;\n\n paymentConfig: {\n rnApiClientId: string;\n network:\n | \"arbitrum\"\n | \"base\"\n | \"mainnet\"\n | \"optimism\"\n | \"polygon\"\n | \"sepolia\";\n feeInfo?: FeeInfo;\n supportedCurrencies?: string[];\n };\n\n uiConfig: {\n showRequestScanUrl: boolean;\n showReceiptDownload: boolean;\n };\n\n receiptInfo: ReceiptInfo;\n\n onSuccess?: (\n requestId: string,\n transactionReceipts: TransactionReceipt[],\n ) => void | Promise;\n onError?: (error: PaymentError) => void | Promise;\n}\n\nconst PaymentWidgetContext = createContext(\n null,\n);\n\ninterface PaymentWidgetProviderProps {\n children: ReactNode;\n amountInUsd: string;\n recipientWallet: string;\n walletAccount?: WalletClient;\n paymentConfig: Omit<\n PaymentWidgetProps[\"paymentConfig\"],\n \"walletConnectProjectId\"\n >;\n uiConfig?: PaymentWidgetProps[\"uiConfig\"];\n receiptInfo: ReceiptInfo;\n onSuccess?: (\n requestId: string,\n transactionReceipts: TransactionReceipt[],\n ) => void | Promise;\n onError?: (error: PaymentError) => void | Promise;\n}\n\nexport function PaymentWidgetProvider({\n children,\n amountInUsd,\n recipientWallet,\n walletAccount,\n paymentConfig,\n uiConfig,\n receiptInfo,\n onSuccess,\n onError,\n}: PaymentWidgetProviderProps) {\n const { address } = useAccount();\n\n const isWalletOverride = walletAccount !== undefined;\n const connectedWalletAddress = walletAccount\n ? walletAccount.account?.address\n : address;\n\n const contextValue: PaymentWidgetContextValue = useMemo(\n () => ({\n amountInUsd,\n recipientWallet,\n walletAccount,\n connectedWalletAddress,\n isWalletOverride,\n paymentConfig: {\n rnApiClientId: paymentConfig.rnApiClientId,\n network: paymentConfig.network,\n feeInfo: paymentConfig.feeInfo,\n supportedCurrencies: paymentConfig.supportedCurrencies,\n },\n uiConfig: {\n showReceiptDownload: uiConfig?.showReceiptDownload ?? true,\n showRequestScanUrl: uiConfig?.showRequestScanUrl ?? true,\n },\n receiptInfo,\n onSuccess,\n onError,\n }),\n [\n amountInUsd,\n recipientWallet,\n walletAccount,\n connectedWalletAddress,\n isWalletOverride,\n paymentConfig.rnApiClientId,\n paymentConfig.network,\n paymentConfig.feeInfo,\n paymentConfig.supportedCurrencies,\n uiConfig?.showReceiptDownload,\n uiConfig?.showRequestScanUrl,\n receiptInfo,\n onSuccess,\n onError,\n ],\n );\n\n return (\n \n {children}\n \n );\n}\n\nexport function usePaymentWidgetContext(): PaymentWidgetContextValue {\n const context = useContext(PaymentWidgetContext);\n\n if (!context) {\n throw new Error(\n \"usePaymentWidgetContext must be used within a PaymentWidgetProvider\",\n );\n }\n\n return context;\n}\n", + "content": "\"use client\";\n\nimport { createContext, useContext, useMemo, type ReactNode } from \"react\";\nimport { useAccount } from \"wagmi\";\nimport type { ReceiptInfo, FeeInfo, PaymentError } from \"../types/index\";\nimport type { TransactionReceipt, WalletClient } from \"viem\";\nimport type { PaymentWidgetProps } from \"../payment-widget.types\";\n\nexport interface PaymentWidgetContextValue {\n amountInUsd: string;\n recipientWallet: string;\n\n walletAccount?: WalletClient;\n connectedWalletAddress?: string;\n isWalletOverride: boolean;\n\n paymentConfig: {\n rnApiClientId: string;\n feeInfo?: FeeInfo;\n supportedCurrencies: string[];\n };\n\n uiConfig: {\n showRequestScanUrl: boolean;\n showReceiptDownload: boolean;\n };\n\n receiptInfo: ReceiptInfo;\n\n onSuccess?: (\n requestId: string,\n transactionReceipts: TransactionReceipt[],\n ) => void | Promise;\n onError?: (error: PaymentError) => void | Promise;\n}\n\nconst PaymentWidgetContext = createContext(\n null,\n);\n\ninterface PaymentWidgetProviderProps {\n children: ReactNode;\n amountInUsd: string;\n recipientWallet: string;\n walletAccount?: WalletClient;\n paymentConfig: Omit<\n PaymentWidgetProps[\"paymentConfig\"],\n \"walletConnectProjectId\"\n >;\n uiConfig?: PaymentWidgetProps[\"uiConfig\"];\n receiptInfo: ReceiptInfo;\n onSuccess?: (\n requestId: string,\n transactionReceipts: TransactionReceipt[],\n ) => void | Promise;\n onError?: (error: PaymentError) => void | Promise;\n}\n\nexport function PaymentWidgetProvider({\n children,\n amountInUsd,\n recipientWallet,\n walletAccount,\n paymentConfig,\n uiConfig,\n receiptInfo,\n onSuccess,\n onError,\n}: PaymentWidgetProviderProps) {\n const { address } = useAccount();\n\n const isWalletOverride = walletAccount !== undefined;\n const connectedWalletAddress = walletAccount\n ? walletAccount.account?.address\n : address;\n\n const contextValue: PaymentWidgetContextValue = useMemo(\n () => ({\n amountInUsd,\n recipientWallet,\n walletAccount,\n connectedWalletAddress,\n isWalletOverride,\n paymentConfig: {\n rnApiClientId: paymentConfig.rnApiClientId,\n feeInfo: paymentConfig.feeInfo,\n supportedCurrencies: paymentConfig.supportedCurrencies,\n },\n uiConfig: {\n showReceiptDownload: uiConfig?.showReceiptDownload ?? true,\n showRequestScanUrl: uiConfig?.showRequestScanUrl ?? true,\n },\n receiptInfo,\n onSuccess,\n onError,\n }),\n [\n amountInUsd,\n recipientWallet,\n walletAccount,\n connectedWalletAddress,\n isWalletOverride,\n paymentConfig.rnApiClientId,\n paymentConfig.feeInfo,\n paymentConfig.supportedCurrencies,\n uiConfig?.showReceiptDownload,\n uiConfig?.showRequestScanUrl,\n receiptInfo,\n onSuccess,\n onError,\n ],\n );\n\n return (\n \n {children}\n \n );\n}\n\nexport function usePaymentWidgetContext(): PaymentWidgetContextValue {\n const context = useContext(PaymentWidgetContext);\n\n if (!context) {\n throw new Error(\n \"usePaymentWidgetContext must be used within a PaymentWidgetProvider\",\n );\n }\n\n return context;\n}\n", "type": "registry:component", "target": "components/payment-widget/context/payment-widget-context.tsx" }, @@ -52,7 +52,7 @@ }, { "path": "registry/default/payment-widget/components/currency-select.tsx", - "content": "\"use client\";\n\nimport { useState } from \"react\";\nimport { Button } from \"@/components/ui/button\";\nimport { RadioGroup, RadioGroupItem } from \"@/components/ui/radio-group\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport {\n getConversionCurrencies,\n getSymbolOverride,\n type ConversionCurrency,\n} from \"../utils/currencies\";\nimport { Check } from \"lucide-react\";\nimport { usePaymentWidgetContext } from \"../context/payment-widget-context\";\n\ninterface CurrencySelectProps {\n onSubmit: (currency: ConversionCurrency) => void;\n}\n\nexport function CurrencySelect({ onSubmit }: CurrencySelectProps) {\n const {\n paymentConfig: { rnApiClientId, network, supportedCurrencies },\n } = usePaymentWidgetContext();\n const [selectedCurrency, setSelectedCurrency] = useState(\"\");\n\n const {\n data: conversionCurrencies,\n isLoading,\n isError,\n refetch,\n } = useQuery({\n queryKey: [\"conversionCurrencies\", rnApiClientId, network],\n queryFn: () => getConversionCurrencies(rnApiClientId, network),\n });\n\n const handleSubmit = () => {\n const currency = conversionCurrencies?.find(\n (c) => c.id === selectedCurrency,\n );\n if (currency) {\n onSubmit(currency);\n }\n };\n\n if (isLoading) {\n return
Loading currencies...
;\n }\n\n if (isError) {\n return (\n
\n

\n Error loading currencies. Please try again later.\n

\n \n
\n );\n }\n\n if (!conversionCurrencies || conversionCurrencies.length === 0) {\n return
No conversion currencies available.
;\n }\n\n const lowerCaseSupportedCurrencies = (supportedCurrencies || []).map(\n (currency) => currency.toLowerCase(),\n );\n\n const eligibleCurrencies =\n lowerCaseSupportedCurrencies.length > 0\n ? conversionCurrencies.filter((currency) =>\n lowerCaseSupportedCurrencies.includes(currency.id.toLowerCase()),\n )\n : conversionCurrencies;\n\n if (eligibleCurrencies.length === 0) {\n console.warn(\n \"Your supportedCurrencies do not match available currencies.\",\n { supportedCurrencies, conversionCurrencies },\n );\n return
No supported currencies available.
;\n }\n\n return (\n
\n

Select a currency

\n \n
\n {eligibleCurrencies.map((currency) => {\n const isSelected = selectedCurrency === currency.id;\n return (\n
\n \n
\n \n \n {getSymbolOverride(currency.symbol)}\n
\n
\n {currency.name}\n
\n
\n {isSelected && }\n \n
\n );\n })}\n
\n \n \n Continue\n \n \n );\n}\n", + "content": "\"use client\";\n\nimport { useState } from \"react\";\nimport { Button } from \"@/components/ui/button\";\nimport { RadioGroup, RadioGroupItem } from \"@/components/ui/radio-group\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport {\n getConversionCurrencies,\n getSymbolOverride,\n type ConversionCurrency,\n} from \"../utils/currencies\";\nimport { Check } from \"lucide-react\";\nimport { usePaymentWidgetContext } from \"../context/payment-widget-context\";\n\ninterface CurrencySelectProps {\n onSubmit: (currency: ConversionCurrency) => void;\n}\n\nexport function CurrencySelect({ onSubmit }: CurrencySelectProps) {\n const {\n paymentConfig: { rnApiClientId, supportedCurrencies },\n } = usePaymentWidgetContext();\n const [selectedCurrency, setSelectedCurrency] = useState(\"\");\n\n const {\n data: conversionCurrencies,\n isLoading,\n isError,\n refetch,\n } = useQuery({\n queryKey: [\"conversionCurrencies\", rnApiClientId],\n queryFn: () => getConversionCurrencies(rnApiClientId),\n });\n\n const handleSubmit = () => {\n const currency = conversionCurrencies?.find(\n (c) => c.id === selectedCurrency,\n );\n if (currency) {\n onSubmit(currency);\n }\n };\n\n if (isLoading) {\n return
Loading currencies...
;\n }\n\n if (isError) {\n return (\n
\n

\n Error loading currencies. Please try again later.\n

\n \n
\n );\n }\n\n if (!conversionCurrencies || conversionCurrencies.length === 0) {\n return
No conversion currencies available.
;\n }\n\n const lowerCaseSupportedCurrencies = supportedCurrencies.map((currency) =>\n currency.toLowerCase(),\n );\n\n const eligibleCurrencies =\n lowerCaseSupportedCurrencies.length > 0\n ? conversionCurrencies.filter((currency) =>\n lowerCaseSupportedCurrencies.includes(currency.id.toLowerCase()),\n )\n : conversionCurrencies;\n\n if (eligibleCurrencies.length === 0) {\n console.warn(\n \"Your supportedCurrencies do not match available currencies.\",\n { supportedCurrencies, conversionCurrencies },\n );\n return
No supported currencies available.
;\n }\n\n return (\n
\n

Select a currency

\n \n
\n {eligibleCurrencies.map((currency) => {\n const isSelected = selectedCurrency === currency.id;\n return (\n
\n \n
\n \n \n {getSymbolOverride(currency.symbol)}\n
\n
\n {currency.name}\n
\n
\n {isSelected && }\n \n
\n );\n })}\n
\n \n \n Continue\n \n \n );\n}\n", "type": "registry:component", "target": "components/payment-widget/components/currency-select.tsx" }, @@ -64,7 +64,7 @@ }, { "path": "registry/default/payment-widget/components/payment-confirmation.tsx", - "content": "\"use client\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { ArrowRight, AlertCircle } from \"lucide-react\";\nimport { usePayment } from \"../hooks/use-payment\";\nimport {\n getSymbolOverride,\n type ConversionCurrency,\n} from \"../utils/currencies\";\nimport { usePaymentWidgetContext } from \"../context/payment-widget-context\";\nimport type { BuyerInfo, PaymentError } from \"../types/index\";\nimport { useState } from \"react\";\nimport type { TransactionReceipt } from \"viem\";\n\ninterface PaymentConfirmationProps {\n selectedCurrency: ConversionCurrency;\n buyerInfo: BuyerInfo;\n onBack: () => void;\n handlePaymentSuccess: (\n requestId: string,\n transactionReceipts: TransactionReceipt[],\n ) => void;\n}\n\nexport function PaymentConfirmation({\n buyerInfo,\n selectedCurrency,\n onBack,\n handlePaymentSuccess,\n}: PaymentConfirmationProps) {\n const {\n amountInUsd,\n recipientWallet,\n connectedWalletAddress,\n paymentConfig: { rnApiClientId, feeInfo, network },\n receiptInfo: { companyInfo: { name: companyName } = {} },\n onError,\n walletAccount,\n } = usePaymentWidgetContext();\n const { isExecuting, executePayment } = usePayment(network, walletAccount);\n const [localError, setLocalError] = useState(null);\n\n const handleExecutePayment = async (e: React.FormEvent) => {\n e.preventDefault();\n\n if (!connectedWalletAddress) return;\n\n setLocalError(null);\n\n try {\n const { requestId, transactionReceipts } = await executePayment(\n rnApiClientId,\n {\n payerWallet: connectedWalletAddress,\n amountInUsd,\n recipientWallet,\n paymentCurrency: selectedCurrency.id,\n feeInfo,\n customerInfo: {\n email: buyerInfo.email,\n firstName: buyerInfo.firstName,\n lastName: buyerInfo.lastName,\n address: buyerInfo.address\n ? {\n street: buyerInfo.address.street,\n city: buyerInfo.address.city,\n state: buyerInfo.address.state,\n postalCode: buyerInfo.address.postalCode,\n country: buyerInfo.address.country,\n }\n : undefined,\n },\n },\n );\n\n handlePaymentSuccess(requestId, transactionReceipts);\n } catch (error) {\n const paymentError = error as PaymentError;\n\n let errorMessage = \"Payment failed. Please try again.\";\n\n if (paymentError.type === \"wallet\") {\n errorMessage =\n \"Wallet connection error. Please check your wallet and try again.\";\n } else if (paymentError.type === \"transaction\") {\n errorMessage =\n \"Transaction failed. Please check your balance and network connection.\";\n } else if (paymentError.type === \"api\") {\n errorMessage =\n paymentError.error?.message ||\n \"Payment service error. Please try again.\";\n } else if (paymentError.error?.message) {\n errorMessage = paymentError.error.message;\n }\n setLocalError(errorMessage);\n\n onError?.(paymentError);\n }\n };\n\n return (\n
\n

Payment Confirmation

\n\n
\n {/* Payment Currency (From) */}\n
\n
\n {getSymbolOverride(selectedCurrency.symbol)}\n
\n
\n
From
\n
\n {selectedCurrency.name}\n
\n
\n
\n\n \n\n
\n
\n USD\n
\n
\n
To
\n
\n ${amountInUsd}\n
\n
\n
\n
\n\n
\n

Payment To

\n
\n
\n {companyName}\n
\n
\n
\n Wallet Address\n
\n
\n {recipientWallet}\n
\n
\n
\n
\n\n {localError && (\n
\n
\n \n
\n

\n Payment Error\n

\n

{localError}

\n
\n
\n
\n )}\n\n
\n \n Back\n \n \n {isExecuting ? \"Processing...\" : \"Pay\"}\n \n
\n
\n );\n}\n", + "content": "\"use client\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { ArrowRight, AlertCircle } from \"lucide-react\";\nimport { usePayment } from \"../hooks/use-payment\";\nimport {\n getSymbolOverride,\n type ConversionCurrency,\n} from \"../utils/currencies\";\nimport { usePaymentWidgetContext } from \"../context/payment-widget-context\";\nimport type { BuyerInfo, PaymentError } from \"../types/index\";\nimport { useState } from \"react\";\nimport type { TransactionReceipt } from \"viem\";\n\ninterface PaymentConfirmationProps {\n selectedCurrency: ConversionCurrency;\n buyerInfo: BuyerInfo;\n onBack: () => void;\n handlePaymentSuccess: (\n requestId: string,\n transactionReceipts: TransactionReceipt[],\n ) => void;\n}\n\nexport function PaymentConfirmation({\n buyerInfo,\n selectedCurrency,\n onBack,\n handlePaymentSuccess,\n}: PaymentConfirmationProps) {\n const {\n amountInUsd,\n recipientWallet,\n connectedWalletAddress,\n paymentConfig: { rnApiClientId, feeInfo },\n receiptInfo: { companyInfo: { name: companyName } = {} },\n onError,\n walletAccount,\n } = usePaymentWidgetContext();\n const { isExecuting, executePayment } = usePayment(\n selectedCurrency.network,\n walletAccount,\n );\n const [localError, setLocalError] = useState(null);\n\n const handleExecutePayment = async (e: React.FormEvent) => {\n e.preventDefault();\n\n if (!connectedWalletAddress) return;\n\n setLocalError(null);\n\n try {\n const { requestId, transactionReceipts } = await executePayment(\n rnApiClientId,\n {\n payerWallet: connectedWalletAddress,\n amountInUsd,\n recipientWallet,\n paymentCurrency: selectedCurrency.id,\n feeInfo,\n customerInfo: {\n email: buyerInfo.email,\n firstName: buyerInfo.firstName,\n lastName: buyerInfo.lastName,\n address: buyerInfo.address\n ? {\n street: buyerInfo.address.street,\n city: buyerInfo.address.city,\n state: buyerInfo.address.state,\n postalCode: buyerInfo.address.postalCode,\n country: buyerInfo.address.country,\n }\n : undefined,\n },\n },\n );\n\n handlePaymentSuccess(requestId, transactionReceipts);\n } catch (error) {\n const paymentError = error as PaymentError;\n\n let errorMessage = \"Payment failed. Please try again.\";\n\n if (paymentError.type === \"wallet\") {\n errorMessage =\n \"Wallet connection error. Please check your wallet and try again.\";\n } else if (paymentError.type === \"transaction\") {\n errorMessage =\n \"Transaction failed. Please check your balance and network connection.\";\n } else if (paymentError.type === \"api\") {\n errorMessage =\n paymentError.error?.message ||\n \"Payment service error. Please try again.\";\n } else if (paymentError.error?.message) {\n errorMessage = paymentError.error.message;\n }\n setLocalError(errorMessage);\n\n onError?.(paymentError);\n }\n };\n\n return (\n
\n

Payment Confirmation

\n\n
\n {/* Payment Currency (From) */}\n
\n
\n {getSymbolOverride(selectedCurrency.symbol)}\n
\n
\n
From
\n
\n {selectedCurrency.name}\n
\n
\n
\n\n \n\n
\n
\n USD\n
\n
\n
To
\n
\n ${amountInUsd}\n
\n
\n
\n
\n\n
\n

Payment To

\n
\n
\n {companyName}\n
\n
\n
\n Wallet Address\n
\n
\n {recipientWallet}\n
\n
\n
\n
\n\n {localError && (\n
\n
\n \n
\n

\n Payment Error\n

\n

{localError}

\n
\n
\n
\n )}\n\n
\n \n Back\n \n \n {isExecuting ? \"Processing...\" : \"Pay\"}\n \n
\n
\n );\n}\n", "type": "registry:component", "target": "components/payment-widget/components/payment-confirmation.tsx" }, @@ -76,13 +76,13 @@ }, { "path": "registry/default/payment-widget/components/payment-success.tsx", - "content": "\"use client\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { CheckCircle, ExternalLink, Download } from \"lucide-react\";\nimport {\n createReceipt,\n generateReceiptNumber,\n type CreateReceiptParams,\n} from \"../utils/receipt\";\nimport { useRef } from \"react\";\nimport { ReceiptPDFTemplate } from \"../components/receipt/receipt-template\";\nimport { usePaymentWidgetContext } from \"../context/payment-widget-context\";\nimport type { BuyerInfo } from \"../types/index\";\nimport type { ConversionCurrency } from \"../utils/currencies\";\n\ninterface PaymentSuccessProps {\n requestId: string;\n txHash: string;\n selectedCurrency: ConversionCurrency;\n buyerInfo: BuyerInfo;\n}\n\nexport function PaymentSuccess({\n requestId,\n txHash,\n selectedCurrency,\n buyerInfo,\n}: PaymentSuccessProps) {\n const {\n amountInUsd,\n recipientWallet,\n connectedWalletAddress,\n receiptInfo,\n uiConfig,\n paymentConfig: { network },\n } = usePaymentWidgetContext();\n const receiptRef = useRef(null);\n\n const receiptParams: CreateReceiptParams = {\n company: {\n ...receiptInfo.companyInfo,\n walletAddress: recipientWallet,\n },\n buyer: {\n ...buyerInfo,\n walletAddress: connectedWalletAddress || \"\",\n },\n payment: {\n amount: amountInUsd, // TODO connect to actual payout and exchange rate\n chain: network,\n currency: selectedCurrency.symbol,\n exchangeRate: 1,\n transactionHash: txHash,\n },\n items: receiptInfo.items,\n totals: receiptInfo.totals,\n metadata: {\n receiptNumber: receiptInfo?.receiptNumber\n ? receiptInfo.receiptNumber\n : generateReceiptNumber(),\n notes: `Payment processed through Request Network for ${amountInUsd} USD`,\n },\n };\n\n const handleDownloadReceipt = async () => {\n try {\n const element = receiptRef.current;\n if (!element) {\n console.error(\"Receipt element not found\");\n return;\n }\n\n const html2pdf = (await import(\"html2pdf.js\")).default;\n\n html2pdf()\n .set({\n margin: 1,\n filename: `receipt-${receiptParams.metadata?.receiptNumber || \"payment\"}.pdf`,\n image: { type: \"jpeg\", quality: 0.98 },\n html2canvas: { scale: 2 },\n jsPDF: { unit: \"in\", format: \"a4\", orientation: \"portrait\" },\n })\n .from(element)\n .save();\n } catch (error) {\n console.error(\"Failed to download receipt:\", error);\n alert(\"Failed to download receipt. Please try again.\");\n }\n };\n\n const requestScanUrl = `https://scan.request.network/request/${requestId}`;\n\n return (\n
\n
\n \n
\n

\n Payment Completed!\n

\n

\n Your payment has been processed successfully.\n

\n
\n
\n\n
\n {uiConfig.showReceiptDownload && (\n <>\n \n \n
\n \n
\n
\n \n )}\n {uiConfig.showRequestScanUrl && (\n \n )}\n
\n \n );\n}\n", + "content": "\"use client\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { CheckCircle, ExternalLink, Download } from \"lucide-react\";\nimport {\n createReceipt,\n generateReceiptNumber,\n type CreateReceiptParams,\n} from \"../utils/receipt\";\nimport { useRef } from \"react\";\nimport { ReceiptPDFTemplate } from \"../components/receipt/receipt-template\";\nimport { usePaymentWidgetContext } from \"../context/payment-widget-context\";\nimport type { BuyerInfo } from \"../types/index\";\nimport type { ConversionCurrency } from \"../utils/currencies\";\n\ninterface PaymentSuccessProps {\n requestId: string;\n txHash: string;\n selectedCurrency: ConversionCurrency;\n buyerInfo: BuyerInfo;\n}\n\nexport function PaymentSuccess({\n requestId,\n txHash,\n selectedCurrency,\n buyerInfo,\n}: PaymentSuccessProps) {\n const {\n amountInUsd,\n recipientWallet,\n connectedWalletAddress,\n receiptInfo,\n uiConfig,\n } = usePaymentWidgetContext();\n const receiptRef = useRef(null);\n\n const receiptParams: CreateReceiptParams = {\n company: {\n ...receiptInfo.companyInfo,\n walletAddress: recipientWallet,\n },\n buyer: {\n ...buyerInfo,\n walletAddress: connectedWalletAddress || \"\",\n },\n payment: {\n amount: amountInUsd, // TODO connect to actual payout and exchange rate\n chain: selectedCurrency.network,\n currency: selectedCurrency.symbol,\n exchangeRate: \"1\",\n transactionHash: txHash,\n },\n items: receiptInfo.items,\n totals: receiptInfo.totals,\n metadata: {\n receiptNumber: receiptInfo?.receiptNumber\n ? receiptInfo.receiptNumber\n : generateReceiptNumber(),\n notes: `Payment processed through Request Network for ${amountInUsd} USD`,\n },\n };\n\n const handleDownloadReceipt = async () => {\n try {\n const element = receiptRef.current;\n if (!element) {\n console.error(\"Receipt element not found\");\n return;\n }\n\n const html2pdf = (await import(\"html2pdf.js\")).default;\n\n html2pdf()\n .set({\n margin: 1,\n filename: `receipt-${receiptParams.metadata?.receiptNumber || \"payment\"}.pdf`,\n image: { type: \"jpeg\", quality: 0.98 },\n html2canvas: { scale: 2 },\n jsPDF: { unit: \"in\", format: \"a4\", orientation: \"portrait\" },\n })\n .from(element)\n .save();\n } catch (error) {\n console.error(\"Failed to download receipt:\", error);\n alert(\"Failed to download receipt. Please try again.\");\n }\n };\n\n const requestScanUrl = `https://scan.request.network/request/${requestId}`;\n\n return (\n
\n
\n \n
\n

\n Payment Completed!\n

\n

\n Your payment has been processed successfully.\n

\n
\n
\n\n
\n {uiConfig.showReceiptDownload && (\n <>\n \n \n
\n \n
\n
\n \n )}\n {uiConfig.showRequestScanUrl && (\n \n )}\n
\n \n );\n}\n", "type": "registry:component", "target": "components/payment-widget/components/payment-success.tsx" }, { "path": "registry/default/payment-widget/payment-widget.types.ts", - "content": "import type { PropsWithChildren } from \"react\";\nimport type { TransactionReceipt, WalletClient } from \"viem\";\nimport type { FeeInfo, ReceiptInfo, PaymentError } from \"./types\";\n\nexport interface PaymentConfig {\n walletConnectProjectId?: string;\n network: \"arbitrum\" | \"base\" | \"mainnet\" | \"optimism\" | \"polygon\" | \"sepolia\";\n rnApiClientId: string;\n feeInfo?: FeeInfo;\n supportedCurrencies?: string[]; // an array of currency ids\n}\n\nexport interface UiConfig {\n showRequestScanUrl?: boolean;\n showReceiptDownload?: boolean;\n}\n\n/*\nExample on which tailwind css variables we use and that you might want to override in your app\n@theme inline {\n --color-background: var(--background);\n --color-foreground: var(--foreground);\n --font-sans: var(--font-geist-sans);\n --font-mono: var(--font-geist-mono);\n --color-ring: var(--ring);\n --color-input: var(--input);\n --color-border: var(--border);\n --color-destructive: var(--destructive);\n --color-destructive-foreground: var(--destructive-foreground);\n --color-accent-foreground: var(--accent-foreground);\n --color-accent: var(--accent);\n --color-muted-foreground: var(--muted-foreground);\n --color-muted: var(--muted);\n --color-secondary-foreground: var(--secondary-foreground);\n --color-secondary: var(--secondary);\n --color-primary-foreground: var(--primary-foreground);\n --color-primary: var(--primary);\n --color-popover-foreground: var(--popover-foreground);\n --color-popover: var(--popover);\n --color-card-foreground: var(--card-foreground);\n --color-card: var(--card);\n --radius-sm: calc(var(--radius) - 4px);\n --radius-md: calc(var(--radius) - 2px);\n --radius-lg: var(--radius);\n --radius-xl: calc(var(--radius) + 4px);\n}\n*/\n\nexport interface PaymentWidgetProps extends PropsWithChildren {\n // The amount to be paid in USD\n amountInUsd: string;\n // The recipient wallet address for the payment\n recipientWallet: string;\n // Override for the buyer's wallet account if you already have an active session\n walletAccount?: WalletClient;\n // Configuration for the payment widget\n paymentConfig: PaymentConfig;\n // UI specific config\n uiConfig?: UiConfig;\n // Receipt information\n receiptInfo: ReceiptInfo;\n // On success callback when the payment is completed\n onSuccess?: (\n requestId: string,\n receipts: TransactionReceipt[],\n ) => void | Promise;\n // On error callback when the payment fails\n onError?: (error: PaymentError) => void | Promise;\n}\n", + "content": "import type { PropsWithChildren } from \"react\";\nimport type { TransactionReceipt, WalletClient } from \"viem\";\nimport type { FeeInfo, ReceiptInfo, PaymentError } from \"./types\";\n\nexport interface PaymentConfig {\n walletConnectProjectId?: string;\n rnApiClientId: string;\n feeInfo?: FeeInfo;\n supportedCurrencies: string[]; // an array of currency ids\n}\n\nexport interface UiConfig {\n showRequestScanUrl?: boolean;\n showReceiptDownload?: boolean;\n}\n\n/*\nExample on which tailwind css variables we use and that you might want to override in your app\n@theme inline {\n --color-background: var(--background);\n --color-foreground: var(--foreground);\n --font-sans: var(--font-geist-sans);\n --font-mono: var(--font-geist-mono);\n --color-ring: var(--ring);\n --color-input: var(--input);\n --color-border: var(--border);\n --color-destructive: var(--destructive);\n --color-destructive-foreground: var(--destructive-foreground);\n --color-accent-foreground: var(--accent-foreground);\n --color-accent: var(--accent);\n --color-muted-foreground: var(--muted-foreground);\n --color-muted: var(--muted);\n --color-secondary-foreground: var(--secondary-foreground);\n --color-secondary: var(--secondary);\n --color-primary-foreground: var(--primary-foreground);\n --color-primary: var(--primary);\n --color-popover-foreground: var(--popover-foreground);\n --color-popover: var(--popover);\n --color-card-foreground: var(--card-foreground);\n --color-card: var(--card);\n --radius-sm: calc(var(--radius) - 4px);\n --radius-md: calc(var(--radius) - 2px);\n --radius-lg: var(--radius);\n --radius-xl: calc(var(--radius) + 4px);\n}\n*/\n\nexport interface PaymentWidgetProps extends PropsWithChildren {\n // The amount to be paid in USD\n amountInUsd: string;\n // The recipient wallet address for the payment\n recipientWallet: string;\n // Override for the buyer's wallet account if you already have an active session\n walletAccount?: WalletClient;\n // Configuration for the payment widget\n paymentConfig: PaymentConfig;\n // UI specific config\n uiConfig?: UiConfig;\n // Receipt information\n receiptInfo: ReceiptInfo;\n // On success callback when the payment is completed\n onSuccess?: (\n requestId: string,\n receipts: TransactionReceipt[],\n ) => void | Promise;\n // On error callback when the payment fails\n onError?: (error: PaymentError) => void | Promise;\n}\n", "type": "registry:lib", "target": "components/payment-widget/payment-widget.types.ts" }, @@ -106,19 +106,19 @@ }, { "path": "registry/default/payment-widget/utils/currencies.ts", - "content": "import { RN_API_URL } from \"../constants\";\n\nexport type ConversionCurrency = {\n id: string;\n symbol: string;\n decimals: number;\n address: string;\n name: string;\n type: \"ERC20\" | \"ETH\" | \"ISO4217\";\n network: string;\n};\n\nexport interface GetConversionCurrenciesResponse {\n currencyId: string;\n network: string;\n conversionRoutes: ConversionCurrency[];\n}\n\nconst DEFAULT_CURRENCY = \"USD\";\n\nexport const getConversionCurrencies = async (\n rnApiClientId: string,\n network: string,\n): Promise => {\n const response = await fetch(\n `${RN_API_URL}/v2/currencies/${DEFAULT_CURRENCY}/conversion-routes?network=${network}`,\n {\n headers: {\n \"x-client-id\": rnApiClientId,\n \"Content-Type\": \"application/json\",\n },\n },\n );\n\n if (!response.ok) {\n throw new Error(\"Network response was not ok\");\n }\n\n const data: GetConversionCurrenciesResponse = await response.json();\n\n return data.conversionRoutes;\n};\n\nexport const getSymbolOverride = (symbol: string) => {\n switch (symbol.toLowerCase()) {\n case \"eth-sepolia\":\n return \"ETH\";\n default:\n return symbol;\n }\n};\n", + "content": "import { RN_API_URL } from \"../constants\";\n\nexport type ConversionCurrency = {\n id: string;\n symbol: string;\n decimals: number;\n address: string;\n name: string;\n type: \"ERC20\" | \"ETH\" | \"ISO4217\";\n network: string;\n};\n\nexport interface GetConversionCurrenciesResponse {\n currencyId: string;\n network: string;\n conversionRoutes: ConversionCurrency[];\n}\n\nconst DEFAULT_CURRENCY = \"USD\";\n\n// TODO: optimize to use the new ?networks search param\nexport const getConversionCurrencies = async (\n rnApiClientId: string,\n): Promise => {\n const response = await fetch(\n `${RN_API_URL}/v2/currencies/${DEFAULT_CURRENCY}/conversion-routes`,\n {\n headers: {\n \"x-client-id\": rnApiClientId,\n \"Content-Type\": \"application/json\",\n },\n },\n );\n\n if (!response.ok) {\n throw new Error(\"Network response was not ok\");\n }\n\n const data: GetConversionCurrenciesResponse = await response.json();\n\n return data.conversionRoutes;\n};\n\nexport const getSymbolOverride = (symbol: string) => {\n switch (symbol.toLowerCase()) {\n case \"eth-sepolia\":\n return \"ETH\";\n default:\n return symbol;\n }\n};\n", "type": "registry:lib", "target": "components/payment-widget/utils/currencies.ts" }, { "path": "registry/default/payment-widget/utils/receipt.ts", - "content": "import type { BuyerInfo, CompanyInfo, ReceiptItem } from \"../types\";\n\nexport interface PaymentInfo {\n chain: string;\n amount: string;\n currency: string;\n exchangeRate: number;\n transactionHash?: string;\n}\n\nexport interface ReceiptMetadata {\n receiptNumber: string;\n issueDate: Date;\n notes?: string;\n}\n\ninterface ReceiptBuyerInfo extends BuyerInfo {\n walletAddress: string;\n}\n\ninterface ReceiptCompanyInfo extends CompanyInfo {\n walletAddress: string;\n}\n\nexport interface ReceiptData {\n company: ReceiptCompanyInfo;\n buyer: ReceiptBuyerInfo;\n payment: PaymentInfo;\n items: ReceiptItem[];\n metadata: ReceiptMetadata;\n totals: {\n totalDiscount: number;\n totalTax: number;\n total: number;\n totalUSD: number;\n };\n}\n\nexport const generateReceiptNumber = (prefix: string = \"REC\"): string => {\n const timestamp = Date.now();\n const random = Math.floor(Math.random() * 1000)\n .toString()\n .padStart(3, \"0\");\n return `${prefix}-${timestamp}-${random}`;\n};\n\nexport const formatUSDAmount = (amount: number): string => {\n return new Intl.NumberFormat(\"en-US\", {\n style: \"currency\",\n currency: \"USD\",\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n }).format(amount);\n};\n\nexport const formatCryptoAmount = (\n amount: string,\n currency: string,\n): string => {\n return `${amount} ${currency}`;\n};\n\nexport const formatReceiptDate = (date: Date): string => {\n return date.toLocaleDateString(\"en-US\", {\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n });\n};\n\nexport interface CreateReceiptParams {\n company: ReceiptCompanyInfo;\n buyer: ReceiptBuyerInfo;\n payment: PaymentInfo;\n items: ReceiptItem[];\n totals: {\n totalDiscount: number;\n totalTax: number;\n total: number;\n totalUSD: number;\n };\n metadata: Omit;\n}\n\nexport const createReceipt = (params: CreateReceiptParams): ReceiptData => {\n const metadata: ReceiptMetadata = {\n ...params.metadata,\n issueDate: new Date(),\n };\n\n const receipt: ReceiptData = {\n metadata,\n company: params.company,\n buyer: params.buyer,\n payment: params.payment,\n items: params.items,\n totals: params.totals,\n };\n\n return receipt;\n};\n\nexport const ReceiptUtils = {\n createReceipt,\n generateReceiptNumber,\n formatUSDAmount,\n formatCryptoAmount,\n formatReceiptDate,\n} as const;\n", + "content": "import type { BuyerInfo, CompanyInfo, ReceiptItem } from \"../types\";\n\nexport interface PaymentInfo {\n chain: string;\n amount: string;\n currency: string;\n exchangeRate: string;\n transactionHash?: string;\n}\n\nexport interface ReceiptMetadata {\n receiptNumber: string;\n issueDate: Date;\n notes?: string;\n}\n\ninterface ReceiptBuyerInfo extends BuyerInfo {\n walletAddress: string;\n}\n\ninterface ReceiptCompanyInfo extends CompanyInfo {\n walletAddress: string;\n}\n\nexport interface ReceiptData {\n company: ReceiptCompanyInfo;\n buyer: ReceiptBuyerInfo;\n payment: PaymentInfo;\n items: ReceiptItem[];\n metadata: ReceiptMetadata;\n totals: {\n totalDiscount: string;\n totalTax: string;\n total: string;\n totalUSD: string;\n };\n}\n\nexport const generateReceiptNumber = (prefix: string = \"REC\"): string => {\n const timestamp = Date.now();\n const random = Math.floor(Math.random() * 1000)\n .toString()\n .padStart(3, \"0\");\n return `${prefix}-${timestamp}-${random}`;\n};\n\nexport const formatUSDAmount = (amount: string): string => {\n const numericAmount = parseFloat(amount);\n\n if (Number.isNaN(numericAmount)) {\n return \"$0.00\";\n }\n\n return new Intl.NumberFormat(\"en-US\", {\n style: \"currency\",\n currency: \"USD\",\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n }).format(numericAmount);\n};\n\nexport const formatCryptoAmount = (\n amount: string,\n currency: string,\n): string => {\n return `${amount} ${currency}`;\n};\n\nexport const formatReceiptDate = (date: Date): string => {\n return date.toLocaleDateString(\"en-US\", {\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n });\n};\n\nexport interface CreateReceiptParams {\n company: ReceiptCompanyInfo;\n buyer: ReceiptBuyerInfo;\n payment: PaymentInfo;\n items: ReceiptItem[];\n totals: {\n totalDiscount: string;\n totalTax: string;\n total: string;\n totalUSD: string;\n };\n metadata: Omit;\n}\n\nexport const createReceipt = (params: CreateReceiptParams): ReceiptData => {\n const metadata: ReceiptMetadata = {\n ...params.metadata,\n issueDate: new Date(),\n };\n\n const receipt: ReceiptData = {\n metadata,\n company: params.company,\n buyer: params.buyer,\n payment: params.payment,\n items: params.items,\n totals: params.totals,\n };\n\n return receipt;\n};\n\nexport const ReceiptUtils = {\n createReceipt,\n generateReceiptNumber,\n formatUSDAmount,\n formatCryptoAmount,\n formatReceiptDate,\n} as const;\n", "type": "registry:lib", "target": "components/payment-widget/utils/receipt.ts" }, { "path": "registry/default/payment-widget/utils/chains.ts", - "content": "import {\n mainnet,\n arbitrum,\n base,\n optimism,\n polygon,\n sepolia,\n} from \"viem/chains\";\n\nexport const getChainFromNetwork = (network: string) => {\n switch (network.toLowerCase()) {\n case \"mainnet\":\n return mainnet;\n case \"arbitrum\":\n return arbitrum;\n case \"base\":\n return base;\n case \"optimism\":\n return optimism;\n case \"polygon\":\n return polygon;\n case \"sepolia\":\n return sepolia;\n default:\n throw new Error(`Unsupported network: ${network}`);\n }\n};\n", + "content": "import {\n mainnet,\n arbitrum,\n base,\n optimism,\n polygon,\n sepolia,\n} from \"viem/chains\";\n\nexport const getChainFromNetwork = (network: string) => {\n switch (network.toLowerCase()) {\n case \"mainnet\":\n return mainnet;\n case \"arbitrum\":\n return arbitrum;\n case \"base\":\n return base;\n case \"optimism\":\n return optimism;\n case \"matic\":\n return polygon;\n case \"sepolia\":\n return sepolia;\n default:\n throw new Error(`Unsupported network: ${network}`);\n }\n};\n", "type": "registry:lib", "target": "components/payment-widget/utils/chains.ts" }, @@ -130,7 +130,7 @@ }, { "path": "registry/default/payment-widget/types/index.ts", - "content": "export interface FeeInfo {\n feePercentage: string;\n feeAddress: string;\n}\n\n// TODO check out if we want to rework all numbers to strings\n\nexport interface PaymentError {\n type: \"wallet\" | \"transaction\" | \"api\" | \"unknown\";\n error: Error;\n}\n\nexport interface Transaction {\n to: string;\n data: string;\n value: { hex: string };\n}\n\nexport interface ReceiptItem {\n id: string;\n description: string;\n quantity: number;\n unitPrice: number;\n discount?: number;\n tax?: number;\n total: number;\n currency?: string;\n}\n\nexport interface CompanyInfo {\n name: string;\n address?: {\n street: string;\n city: string;\n state: string;\n postalCode: string;\n country: string;\n };\n taxId?: string;\n email?: string;\n phone?: string;\n website?: string;\n}\n\nexport interface BuyerInfo {\n email: string;\n firstName?: string;\n lastName?: string;\n businessName?: string;\n phone?: string;\n address?: {\n street: string;\n city: string;\n state: string;\n country: string;\n postalCode: string;\n };\n}\n\nexport interface ReceiptTotals {\n totalDiscount: number;\n totalTax: number;\n total: number;\n totalUSD: number;\n}\n\nexport interface ReceiptInfo {\n buyerInfo?: BuyerInfo;\n companyInfo: CompanyInfo;\n items: ReceiptItem[];\n totals: ReceiptTotals;\n receiptNumber?: string;\n}\n", + "content": "export interface FeeInfo {\n feePercentage: string;\n feeAddress: string;\n}\n\n// TODO check out if we want to rework all numbers to strings\n\nexport interface PaymentError {\n type: \"wallet\" | \"transaction\" | \"api\" | \"unknown\";\n error: Error;\n}\n\nexport interface Transaction {\n to: string;\n data: string;\n value: { hex: string };\n}\n\nexport interface ReceiptItem {\n id: string;\n description: string;\n quantity: number;\n unitPrice: string;\n discount?: string;\n tax?: string;\n total: string;\n currency?: string;\n}\n\nexport interface CompanyInfo {\n name: string;\n address?: {\n street: string;\n city: string;\n state: string;\n postalCode: string;\n country: string;\n };\n taxId?: string;\n email?: string;\n phone?: string;\n website?: string;\n}\n\nexport interface BuyerInfo {\n email: string;\n firstName?: string;\n lastName?: string;\n businessName?: string;\n phone?: string;\n address?: {\n street: string;\n city: string;\n state: string;\n country: string;\n postalCode: string;\n };\n}\n\nexport interface ReceiptTotals {\n totalDiscount: string;\n totalTax: string;\n total: string;\n totalUSD: string;\n}\n\nexport interface ReceiptInfo {\n buyerInfo?: BuyerInfo;\n companyInfo: CompanyInfo;\n items: ReceiptItem[];\n totals: ReceiptTotals;\n receiptNumber?: string;\n}\n", "type": "registry:lib", "target": "components/payment-widget/types/index.ts" }, @@ -148,7 +148,7 @@ }, { "path": "registry/default/payment-widget/components/receipt/receipt-template.tsx", - "content": "import type { FC } from \"react\";\nimport {\n formatCryptoAmount,\n formatUSDAmount,\n formatReceiptDate,\n type ReceiptData,\n} from \"../../utils/receipt\";\n// a module.css file doesn't work with html2pdf.js\nimport \"./styles.css\";\n\nexport const ReceiptPDFTemplate: FC<{ receipt: ReceiptData }> = ({\n receipt,\n}) => {\n return (\n
\n
\n
\n

{receipt.company.name}

\n
\n {receipt.company.address && (\n <>\n
{receipt.company.address.street}
\n
\n {receipt.company.address.city},{\" \"}\n {receipt.company.address.state}{\" \"}\n {receipt.company.address.postalCode}{\" \"}\n {receipt.company.address.country}\n
\n \n )}\n {receipt.company.email &&
{receipt.company.email}
}\n {receipt.company.taxId && (\n
Tax ID: {receipt.company.taxId}
\n )}\n
\n
\n\n
\n

REC

\n
\n #{receipt.metadata.receiptNumber}\n
\n
\n {formatReceiptDate(receipt.metadata.issueDate)}\n
\n
\n
\n\n
\n
\n

FROM

\n
{receipt.company.name}
\n
{receipt.company.walletAddress}
\n
\n {receipt.company.address && (\n <>\n
{receipt.company.address.street}
\n
\n {receipt.company.address.city},{\" \"}\n {receipt.company.address.state}{\" \"}\n {receipt.company.address.postalCode}{\" \"}\n {receipt.company.address.country}\n
\n \n )}\n
\n
\n\n
\n

TO

\n
\n {[receipt.buyer.firstName, receipt.buyer.lastName]\n .filter(Boolean)\n .join(\" \") || \"Customer\"}\n
\n
{receipt.buyer.walletAddress}
\n {receipt.buyer.email && (\n
{receipt.buyer.email}
\n )}\n {receipt.buyer.address && (\n
\n
{receipt.buyer.address.street}
\n
\n {receipt.buyer.address.city}, {receipt.buyer.address.state}{\" \"}\n {receipt.buyer.address.postalCode}{\" \"}\n {receipt.buyer.address.country}\n
\n
\n )}\n
\n
\n\n
\n
\n Payment Method:{\" \"}\n {`${receipt.payment.currency} on ${receipt.payment.chain}`}\n
\n {receipt.payment.transactionHash && (\n
\n Transaction: {receipt.payment.transactionHash}\n
\n )}\n
\n\n \n \n \n \n \n \n \n \n \n \n \n \n {receipt.items.map((item, index) => (\n \n \n \n \n \n \n \n \n ))}\n \n
DescriptionQtyUnit PriceDisc%Tax%Total
{item.description}{item.quantity}\n {formatCryptoAmount(\n item.unitPrice.toString(),\n item.currency || receipt.payment.currency,\n )}\n {item.discount || 0}%{item.tax || 0}%\n {formatCryptoAmount(\n item.total.toString(),\n item.currency || receipt.payment.currency,\n )}\n
\n\n
\n
\n {receipt.totals.totalDiscount > 0 && (\n
\n Discount:\n \n -\n {formatCryptoAmount(\n receipt.totals.totalDiscount.toString(),\n receipt.payment.currency,\n )}\n \n
\n )}\n\n {receipt.totals.totalTax > 0 && (\n
\n Tax:\n \n {formatCryptoAmount(\n receipt.totals.totalTax.toString(),\n receipt.payment.currency,\n )}\n \n
\n )}\n\n
\n Subtotal:\n \n {formatCryptoAmount(\n receipt.payment.amount,\n receipt.payment.currency,\n )}\n \n
\n\n
\n TOTAL (USD):\n \n {formatUSDAmount(receipt.totals.totalUSD)}\n \n
\n
\n
\n\n {receipt.metadata.notes && (\n
\n Notes: {receipt.metadata.notes}\n
\n )}\n
\n );\n};\n", + "content": "import type { FC } from \"react\";\nimport {\n formatCryptoAmount,\n formatUSDAmount,\n formatReceiptDate,\n type ReceiptData,\n} from \"../../utils/receipt\";\n// a module.css file doesn't work with html2pdf.js\nimport \"./styles.css\";\n\nexport const ReceiptPDFTemplate: FC<{ receipt: ReceiptData }> = ({\n receipt,\n}) => {\n return (\n
\n
\n
\n

{receipt.company.name}

\n
\n {receipt.company.address && (\n <>\n
{receipt.company.address.street}
\n
\n {receipt.company.address.city},{\" \"}\n {receipt.company.address.state}{\" \"}\n {receipt.company.address.postalCode}{\" \"}\n {receipt.company.address.country}\n
\n \n )}\n {receipt.company.email &&
{receipt.company.email}
}\n {receipt.company.taxId && (\n
Tax ID: {receipt.company.taxId}
\n )}\n
\n
\n\n
\n

REC

\n
\n #{receipt.metadata.receiptNumber}\n
\n
\n {formatReceiptDate(receipt.metadata.issueDate)}\n
\n
\n
\n\n
\n
\n

FROM

\n
{receipt.company.name}
\n
{receipt.company.walletAddress}
\n
\n {receipt.company.address && (\n <>\n
{receipt.company.address.street}
\n
\n {receipt.company.address.city},{\" \"}\n {receipt.company.address.state}{\" \"}\n {receipt.company.address.postalCode}{\" \"}\n {receipt.company.address.country}\n
\n \n )}\n
\n
\n\n
\n

TO

\n
\n {[receipt.buyer.firstName, receipt.buyer.lastName]\n .filter(Boolean)\n .join(\" \") || \"Customer\"}\n
\n
{receipt.buyer.walletAddress}
\n {receipt.buyer.email && (\n
{receipt.buyer.email}
\n )}\n {receipt.buyer.address && (\n
\n
{receipt.buyer.address.street}
\n
\n {receipt.buyer.address.city}, {receipt.buyer.address.state}{\" \"}\n {receipt.buyer.address.postalCode}{\" \"}\n {receipt.buyer.address.country}\n
\n
\n )}\n
\n
\n\n
\n
\n Payment Method:{\" \"}\n {`${receipt.payment.currency} on ${receipt.payment.chain}`}\n
\n {receipt.payment.transactionHash && (\n
\n Transaction: {receipt.payment.transactionHash}\n
\n )}\n
\n\n \n \n \n \n \n \n \n \n \n \n \n \n {receipt.items.map((item, index) => (\n \n \n \n \n \n \n \n \n ))}\n \n
DescriptionQtyUnit PriceDisc%Tax%Total
{item.description}{item.quantity}\n {formatCryptoAmount(\n item.unitPrice.toString(),\n item.currency || receipt.payment.currency,\n )}\n {item.discount || 0}%{item.tax || 0}%\n {formatCryptoAmount(\n item.total.toString(),\n item.currency || receipt.payment.currency,\n )}\n
\n\n
\n
\n {receipt.totals.totalDiscount.length > 0 && (\n
\n Discount:\n \n -\n {formatCryptoAmount(\n receipt.totals.totalDiscount.toString(),\n receipt.payment.currency,\n )}\n \n
\n )}\n\n {receipt.totals.totalTax.length > 0 && (\n
\n Tax:\n \n {formatCryptoAmount(\n receipt.totals.totalTax.toString(),\n receipt.payment.currency,\n )}\n \n
\n )}\n\n
\n Subtotal:\n \n {formatCryptoAmount(\n receipt.payment.amount,\n receipt.payment.currency,\n )}\n \n
\n\n
\n TOTAL (USD):\n \n {formatUSDAmount(receipt.totals.totalUSD)}\n \n
\n
\n
\n\n {receipt.metadata.notes && (\n
\n Notes: {receipt.metadata.notes}\n
\n )}\n
\n );\n};\n", "type": "registry:component", "target": "components/payment-widget/components/receipt/receipt-template.tsx" }, diff --git a/registry/default/payment-widget/components/payment-success.tsx b/registry/default/payment-widget/components/payment-success.tsx index 8812ce7..aaa95e0 100644 --- a/registry/default/payment-widget/components/payment-success.tsx +++ b/registry/default/payment-widget/components/payment-success.tsx @@ -48,7 +48,7 @@ export function PaymentSuccess({ amount: amountInUsd, // TODO connect to actual payout and exchange rate chain: selectedCurrency.network, currency: selectedCurrency.symbol, - exchangeRate: 1, + exchangeRate: "1", transactionHash: txHash, }, items: receiptInfo.items, diff --git a/registry/default/payment-widget/components/receipt/receipt-template.tsx b/registry/default/payment-widget/components/receipt/receipt-template.tsx index a9901b7..2141a6b 100644 --- a/registry/default/payment-widget/components/receipt/receipt-template.tsx +++ b/registry/default/payment-widget/components/receipt/receipt-template.tsx @@ -142,7 +142,7 @@ export const ReceiptPDFTemplate: FC<{ receipt: ReceiptData }> = ({
- {receipt.totals.totalDiscount > 0 && ( + {receipt.totals.totalDiscount.length > 0 && (
Discount: @@ -155,7 +155,7 @@ export const ReceiptPDFTemplate: FC<{ receipt: ReceiptData }> = ({
)} - {receipt.totals.totalTax > 0 && ( + {receipt.totals.totalTax.length > 0 && (
Tax: diff --git a/registry/default/payment-widget/types/index.ts b/registry/default/payment-widget/types/index.ts index f72dfe6..87d9c2a 100644 --- a/registry/default/payment-widget/types/index.ts +++ b/registry/default/payment-widget/types/index.ts @@ -20,10 +20,10 @@ export interface ReceiptItem { id: string; description: string; quantity: number; - unitPrice: number; - discount?: number; - tax?: number; - total: number; + unitPrice: string; + discount?: string; + tax?: string; + total: string; currency?: string; } @@ -58,10 +58,10 @@ export interface BuyerInfo { } export interface ReceiptTotals { - totalDiscount: number; - totalTax: number; - total: number; - totalUSD: number; + totalDiscount: string; + totalTax: string; + total: string; + totalUSD: string; } export interface ReceiptInfo { diff --git a/registry/default/payment-widget/utils/receipt.ts b/registry/default/payment-widget/utils/receipt.ts index 2d7d07b..5adc714 100644 --- a/registry/default/payment-widget/utils/receipt.ts +++ b/registry/default/payment-widget/utils/receipt.ts @@ -4,7 +4,7 @@ export interface PaymentInfo { chain: string; amount: string; currency: string; - exchangeRate: number; + exchangeRate: string; transactionHash?: string; } @@ -29,10 +29,10 @@ export interface ReceiptData { items: ReceiptItem[]; metadata: ReceiptMetadata; totals: { - totalDiscount: number; - totalTax: number; - total: number; - totalUSD: number; + totalDiscount: string; + totalTax: string; + total: string; + totalUSD: string; }; } @@ -44,13 +44,19 @@ export const generateReceiptNumber = (prefix: string = "REC"): string => { return `${prefix}-${timestamp}-${random}`; }; -export const formatUSDAmount = (amount: number): string => { +export const formatUSDAmount = (amount: string): string => { + const numericAmount = parseFloat(amount); + + if (Number.isNaN(numericAmount)) { + return "$0.00"; + } + return new Intl.NumberFormat("en-US", { style: "currency", currency: "USD", minimumFractionDigits: 2, maximumFractionDigits: 2, - }).format(amount); + }).format(numericAmount); }; export const formatCryptoAmount = ( @@ -74,10 +80,10 @@ export interface CreateReceiptParams { payment: PaymentInfo; items: ReceiptItem[]; totals: { - totalDiscount: number; - totalTax: number; - total: number; - totalUSD: number; + totalDiscount: string; + totalTax: string; + total: string; + totalUSD: string; }; metadata: Omit; } From 72e5bf9abe7c460fb4f1681b9652fab5587cdd37 Mon Sep 17 00:00:00 2001 From: Bassgeta Date: Wed, 17 Sep 2025 17:09:00 +0200 Subject: [PATCH 33/37] fix: make matic and polygon resolve to the polygon network --- public/r/payment-widget.json | 2 +- registry/default/payment-widget/utils/chains.ts | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/public/r/payment-widget.json b/public/r/payment-widget.json index 5c41551..4cdaeb3 100644 --- a/public/r/payment-widget.json +++ b/public/r/payment-widget.json @@ -118,7 +118,7 @@ }, { "path": "registry/default/payment-widget/utils/chains.ts", - "content": "import {\n mainnet,\n arbitrum,\n base,\n optimism,\n polygon,\n sepolia,\n} from \"viem/chains\";\n\nexport const getChainFromNetwork = (network: string) => {\n switch (network.toLowerCase()) {\n case \"mainnet\":\n return mainnet;\n case \"arbitrum\":\n return arbitrum;\n case \"base\":\n return base;\n case \"optimism\":\n return optimism;\n case \"matic\":\n return polygon;\n case \"sepolia\":\n return sepolia;\n default:\n throw new Error(`Unsupported network: ${network}`);\n }\n};\n", + "content": "import {\n mainnet,\n arbitrum,\n base,\n optimism,\n polygon,\n sepolia,\n} from \"viem/chains\";\n\nexport const getChainFromNetwork = (network: string) => {\n switch (network.toLowerCase()) {\n case \"mainnet\":\n return mainnet;\n case \"arbitrum\":\n return arbitrum;\n case \"base\":\n return base;\n case \"optimism\":\n return optimism;\n // our currencies API uses matic for polygon for the moment\n case \"polygon\":\n case \"matic\":\n return polygon;\n case \"sepolia\":\n return sepolia;\n default:\n throw new Error(`Unsupported network: ${network}`);\n }\n};\n", "type": "registry:lib", "target": "components/payment-widget/utils/chains.ts" }, diff --git a/registry/default/payment-widget/utils/chains.ts b/registry/default/payment-widget/utils/chains.ts index 6081999..d0c7508 100644 --- a/registry/default/payment-widget/utils/chains.ts +++ b/registry/default/payment-widget/utils/chains.ts @@ -17,6 +17,8 @@ export const getChainFromNetwork = (network: string) => { return base; case "optimism": return optimism; + // our currencies API uses matic for polygon for the moment + case "polygon": case "matic": return polygon; case "sepolia": From 4c8a456a89518ec9d1c1b421b98e8214aa00538c Mon Sep 17 00:00:00 2001 From: Bassgeta Date: Wed, 17 Sep 2025 17:19:09 +0200 Subject: [PATCH 34/37] fix: make the page try to pay 1 dollar instead of 10 --- app/components/payment-widget-wrapper.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/components/payment-widget-wrapper.tsx b/app/components/payment-widget-wrapper.tsx index 5c6315c..712c256 100644 --- a/app/components/payment-widget-wrapper.tsx +++ b/app/components/payment-widget-wrapper.tsx @@ -26,7 +26,7 @@ export function PaymentWidgetWrapper({ return ( Date: Wed, 17 Sep 2025 17:40:31 +0200 Subject: [PATCH 35/37] build: add deploy to staging and production scripts --- .github/deploy-to-production.yml | 14 ++++++++++++++ .github/deploy-to-staging.yml | 14 ++++++++++++++ 2 files changed, 28 insertions(+) create mode 100644 .github/deploy-to-production.yml create mode 100644 .github/deploy-to-staging.yml diff --git a/.github/deploy-to-production.yml b/.github/deploy-to-production.yml new file mode 100644 index 0000000..2690392 --- /dev/null +++ b/.github/deploy-to-production.yml @@ -0,0 +1,14 @@ +name: Deploy to production + +on: + workflow_dispatch: + release: + types: [published] + +jobs: + deploy: + runs-on: ubuntu-latest + steps: + - name: Webhook request + run: | + curl -X GET https://prod.request.network/api/deploy/${{ secrets.EASYPANEL_DEPLOY_KEY_PRODUCTION }} diff --git a/.github/deploy-to-staging.yml b/.github/deploy-to-staging.yml new file mode 100644 index 0000000..80705e6 --- /dev/null +++ b/.github/deploy-to-staging.yml @@ -0,0 +1,14 @@ +name: Deploy to staging + +on: + workflow_dispatch: + push: + branches: [main] + +jobs: + deploy: + runs-on: ubuntu-latest + steps: + - name: Webhook request + run: | + curl -X GET https://stage.request.network/api/deploy/${{ secrets.EASYPANEL_DEPLOY_KEY_STAGING }} From c702ddd8080562ba92862d24248570dbb8e05ce6 Mon Sep 17 00:00:00 2001 From: Bassgeta Date: Wed, 17 Sep 2025 17:47:23 +0200 Subject: [PATCH 36/37] fix: comment out actual USDC from the test page --- app/components/payment-widget-wrapper.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/components/payment-widget-wrapper.tsx b/app/components/payment-widget-wrapper.tsx index 712c256..a3a96b8 100644 --- a/app/components/payment-widget-wrapper.tsx +++ b/app/components/payment-widget-wrapper.tsx @@ -36,7 +36,7 @@ export function PaymentWidgetWrapper({ "ETH-sepolia-sepolia", "fUSDT-sepolia", "FAU-sepolia", - "USDCn-matic", + //"USDCn-matic", ], feeInfo: undefined /* { feeAddress: "0xEbe98659e162e8fF3520EC71e097C9e0a4F53829", From f9e732e06824a5d76e70789fece73d46f688a4e0 Mon Sep 17 00:00:00 2001 From: Bassgeta Date: Wed, 17 Sep 2025 18:02:56 +0200 Subject: [PATCH 37/37] docs: add note for devs to run the registry build before pushing --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index e215bc4..210acb5 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,10 @@ This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app). +## Notes + +Before you push changes to this repository, do not forget to run `npm run registry:build` to regenerate the component's `JSON` file! + + ## Getting Started First, run the development server: