@antseed/payments 0.1.4 → 0.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. package/dist/crypto-context.d.ts +1 -0
  2. package/dist/crypto-context.js.map +1 -1
  3. package/dist/index.js +7 -2
  4. package/dist/index.js.map +1 -1
  5. package/dist/routes.emissions.test.d.ts +1 -0
  6. package/dist/routes.emissions.test.js +88 -0
  7. package/dist/routes.emissions.test.js.map +1 -0
  8. package/dist/routes.js +193 -86
  9. package/dist/routes.js.map +1 -1
  10. package/dist/server.d.ts +7 -0
  11. package/dist/server.js +13 -1
  12. package/dist/server.js.map +1 -1
  13. package/dist/web/assets/{add-BIV5AyuA.js → add-C19VLth2.js} +1 -1
  14. package/dist/web/assets/{all-wallets-EBePThCL.js → all-wallets-DrbbDi_J.js} +1 -1
  15. package/dist/web/assets/{app-store-BjklFqDr.js → app-store-BquU1K8P.js} +1 -1
  16. package/dist/web/assets/{apple-D1VE8Smb.js → apple-lbwwuLeK.js} +1 -1
  17. package/dist/web/assets/{arrow-bottom-ZsiT1L1y.js → arrow-bottom-BtCJDY1B.js} +1 -1
  18. package/dist/web/assets/{arrow-bottom-circle-DKvUi0Ci.js → arrow-bottom-circle-DsqZ-XfJ.js} +1 -1
  19. package/dist/web/assets/{arrow-left-DqPtSsbQ.js → arrow-left-C7WFJwzj.js} +1 -1
  20. package/dist/web/assets/{arrow-right-C-L7Eq7n.js → arrow-right-BiQWww9h.js} +1 -1
  21. package/dist/web/assets/{arrow-top-BsmnE_gW.js → arrow-top-BKIU1iFr.js} +1 -1
  22. package/dist/web/assets/{bank-BJyS5lzc.js → bank-D6uPUMhQ.js} +1 -1
  23. package/dist/web/assets/{basic-GN_iqL6N.js → basic-DJOTYvb7.js} +1 -1
  24. package/dist/web/assets/{browser-CzG38Il3.js → browser-g6xlc4hr.js} +1 -1
  25. package/dist/web/assets/{card-BLn7fSRd.js → card-CNXxK8uM.js} +1 -1
  26. package/dist/web/assets/{ccip-DzXGS3YO.js → ccip-y_grEayF.js} +1 -1
  27. package/dist/web/assets/{checkmark-LJnZOJkW.js → checkmark-BZAcDR-j.js} +1 -1
  28. package/dist/web/assets/{checkmark-bold-DdCvfZpZ.js → checkmark-bold-D5XVtqYz.js} +1 -1
  29. package/dist/web/assets/{chevron-bottom-fPQSj-LV.js → chevron-bottom-Vkyj_Nzg.js} +1 -1
  30. package/dist/web/assets/{chevron-left-DxQSFiW8.js → chevron-left-DrmAXuU-.js} +1 -1
  31. package/dist/web/assets/{chevron-right-COD1o4NQ.js → chevron-right-5nScP158.js} +1 -1
  32. package/dist/web/assets/{chevron-top-B6E8u1u1.js → chevron-top-CTdyA8VO.js} +1 -1
  33. package/dist/web/assets/{chrome-store-BVadPKvh.js → chrome-store-oVCjsWzl.js} +1 -1
  34. package/dist/web/assets/{clock-CxMPGV40.js → clock-D4CQ4NWG.js} +1 -1
  35. package/dist/web/assets/{close-BoT-UoFd.js → close-1ZaJf7JR.js} +1 -1
  36. package/dist/web/assets/{coinPlaceholder-DTR4YLbx.js → coinPlaceholder-BWhwD718.js} +1 -1
  37. package/dist/web/assets/{compass-u6DewpdB.js → compass-DorGy6ut.js} +1 -1
  38. package/dist/web/assets/{copy-guqFsruM.js → copy-CD4GflKl.js} +1 -1
  39. package/dist/web/assets/core-BokkgsR-.js +908 -0
  40. package/dist/web/assets/{cursor-Cyzj71eZ.js → cursor-BmZ5Lzl7.js} +1 -1
  41. package/dist/web/assets/{cursor-transparent-b6KJIq15.js → cursor-transparent-DS0n62Va.js} +1 -1
  42. package/dist/web/assets/{desktop-OTJfzaeI.js → desktop-B63L9Ya5.js} +1 -1
  43. package/dist/web/assets/{disconnect-DJjKJNIm.js → disconnect-CXTe519G.js} +1 -1
  44. package/dist/web/assets/{discord-BfWJZWec.js → discord-DQi0_Z_3.js} +1 -1
  45. package/dist/web/assets/{etherscan-BRcaU-hR.js → etherscan-CeKoVfwO.js} +1 -1
  46. package/dist/web/assets/{exclamation-triangle-TqYv9OE3.js → exclamation-triangle-NIMD3-Ss.js} +1 -1
  47. package/dist/web/assets/{extension-Bcq1-Vc9.js → extension-CIubNQyb.js} +1 -1
  48. package/dist/web/assets/{external-link-Dl8906oz.js → external-link-RE45g6An.js} +1 -1
  49. package/dist/web/assets/{facebook-BEGagL0C.js → facebook-CRPhgK6P.js} +1 -1
  50. package/dist/web/assets/{farcaster-COGce0XN.js → farcaster-CymY7pC9.js} +1 -1
  51. package/dist/web/assets/{filters-DHDAVWM_.js → filters-DZK-7Yar.js} +1 -1
  52. package/dist/web/assets/{github-CHkFHIOw.js → github-JbFdJVxH.js} +1 -1
  53. package/dist/web/assets/{google-BVPM91iU.js → google-G-gEXxk4.js} +1 -1
  54. package/dist/web/assets/{help-circle-JqiWjFOK.js → help-circle-BtqIHitk.js} +1 -1
  55. package/dist/web/assets/{id-CsrkQOLZ.js → id-DZ25afr8.js} +1 -1
  56. package/dist/web/assets/{image-DVcW7iXO.js → image-CO-AjOrW.js} +1 -1
  57. package/dist/web/assets/{index-BF417SGJ.js → index-C9_0Fr2c.js} +1 -1
  58. package/dist/web/assets/index-Cag74snT.css +1 -0
  59. package/dist/web/assets/{index-DuvDGHB2.js → index-Cs0IyllF.js} +1 -1
  60. package/dist/web/assets/{index-9qmOgJOU.js → index-DMKXqTcx.js} +1 -1
  61. package/dist/web/assets/{index-DzJb2L5K.js → index-M-jBTbqp.js} +3 -3
  62. package/dist/web/assets/index-jSclbA_D.js +1775 -0
  63. package/dist/web/assets/{index.es-CpQtULc3.js → index.es-J3dlIVGI.js} +4 -4
  64. package/dist/web/assets/{info-BInhAzlq.js → info-B9XV3NxB.js} +1 -1
  65. package/dist/web/assets/{info-circle-BQVRr1po.js → info-circle-BRnOfVgu.js} +1 -1
  66. package/dist/web/assets/{lightbulb-BxxYBMhT.js → lightbulb-BCOe1dKj.js} +1 -1
  67. package/dist/web/assets/{mail-D_0lmFKl.js → mail-CtrLC_Vu.js} +1 -1
  68. package/dist/web/assets/{metamask-sdk-DWKTYpSR.js → metamask-sdk-P_iF3xrF.js} +1 -1
  69. package/dist/web/assets/{mobile-DWLQto9I.js → mobile-CMMuzkgd.js} +1 -1
  70. package/dist/web/assets/{more-KNa1lBim.js → more-Dl6Gj3Kz.js} +1 -1
  71. package/dist/web/assets/{network-placeholder-BootwA5c.js → network-placeholder-BEcer765.js} +1 -1
  72. package/dist/web/assets/{nftPlaceholder-DDZ5L7H6.js → nftPlaceholder-Bl3yNlnk.js} +1 -1
  73. package/dist/web/assets/{off-D0UPLkkK.js → off-B5xKeyIX.js} +1 -1
  74. package/dist/web/assets/{play-store-B_CaXXPp.js → play-store-C8zG_nea.js} +1 -1
  75. package/dist/web/assets/{plus-BcvR0JCg.js → plus-BCz51CiU.js} +1 -1
  76. package/dist/web/assets/{qr-code-Txj5hQxm.js → qr-code-BZMdhzub.js} +1 -1
  77. package/dist/web/assets/{recycle-horizontal-_rXVIasi.js → recycle-horizontal-BkrADZhQ.js} +1 -1
  78. package/dist/web/assets/{refresh-CHoOsJ33.js → refresh-P6kLP2QF.js} +1 -1
  79. package/dist/web/assets/{reown-logo-BHSUfB2F.js → reown-logo-CVlaKhY0.js} +1 -1
  80. package/dist/web/assets/{search-BSbqjN1T.js → search-RJpDNXww.js} +1 -1
  81. package/dist/web/assets/{secp256k1-KHQhI22D.js → secp256k1-BFrL8mDQ.js} +1 -1
  82. package/dist/web/assets/{secp256k1-bI3F5j6R.js → secp256k1-DNxbZl4R.js} +1 -1
  83. package/dist/web/assets/{send-CD2UnMQE.js → send-h1n6ztZH.js} +1 -1
  84. package/dist/web/assets/{swapHorizontal-D8K8GaAT.js → swapHorizontal-BRaMETTe.js} +1 -1
  85. package/dist/web/assets/{swapHorizontalBold-CQkuydSS.js → swapHorizontalBold-D2ANyhtg.js} +1 -1
  86. package/dist/web/assets/{swapHorizontalMedium-Di6AKYYk.js → swapHorizontalMedium-Btk43bqe.js} +1 -1
  87. package/dist/web/assets/{swapHorizontalRoundedBold-Cs0NEdw6.js → swapHorizontalRoundedBold-DujAsvF_.js} +1 -1
  88. package/dist/web/assets/{swapVertical-BnACgsHa.js → swapVertical-BbrR6UFZ.js} +1 -1
  89. package/dist/web/assets/{telegram-CItM_Dok.js → telegram-Dt-ATR99.js} +1 -1
  90. package/dist/web/assets/{three-dots-CWyCBR2N.js → three-dots-C0oOxUXr.js} +1 -1
  91. package/dist/web/assets/{twitch-DlpdSRKl.js → twitch-CfwqzP5e.js} +1 -1
  92. package/dist/web/assets/{twitterIcon-BIJMMIxn.js → twitterIcon-DfSzbix_.js} +1 -1
  93. package/dist/web/assets/{verify-VRzbSjrR.js → verify-DeF51qLB.js} +1 -1
  94. package/dist/web/assets/{verify-filled-CQITc0RR.js → verify-filled-C6cRHh2w.js} +1 -1
  95. package/dist/web/assets/{w3m-modal-BUECoo-v.js → w3m-modal-De_5dbtz.js} +1 -1
  96. package/dist/web/assets/{wallet-DzucEhgC.js → wallet-CtR1NqGs.js} +1 -1
  97. package/dist/web/assets/{wallet-placeholder-DDE-TuyH.js → wallet-placeholder-BeEq9gzA.js} +1 -1
  98. package/dist/web/assets/{walletconnect-Bz-1NlJ1.js → walletconnect-DKzdh_bY.js} +1 -1
  99. package/dist/web/assets/{warning-circle-BkUEJMvU.js → warning-circle-DmbwH0Pu.js} +1 -1
  100. package/dist/web/assets/{x-iLiJ5bOe.js → x-DrcaUCzm.js} +1 -1
  101. package/dist/web/index.html +2 -2
  102. package/package.json +5 -2
  103. package/dist/web/assets/core-Do4oAjfk.js +0 -908
  104. package/dist/web/assets/index-5w7d6cAM.js +0 -1730
  105. package/dist/web/assets/index-Du9ryAVy.css +0 -1
@@ -7,6 +7,7 @@ export interface CryptoContext {
7
7
  }
8
8
  export interface PaymentCryptoConfig {
9
9
  rpcUrl: string;
10
+ fallbackRpcUrls?: string[];
10
11
  depositsContractAddress: string;
11
12
  channelsContractAddress: string;
12
13
  usdcContractAddress: string;
@@ -1 +1 @@
1
- {"version":3,"file":"crypto-context.js","sourceRoot":"","sources":["../src/crypto-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AAiBhF;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,OAGvC;IACC,IAAI,QAAkB,CAAC;IAEvB,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;QACxB,QAAQ,GAAG,yBAAyB,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAC5D,CAAC;SAAM,CAAC;QACN,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;QAC5C,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,GAAG,OAAO,EAAE,WAAW,CAAC;QAC3D,QAAQ,GAAG,MAAM,oBAAoB,CAAC,OAAO,CAAC,CAAC;IACjD,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;AACpF,CAAC"}
1
+ {"version":3,"file":"crypto-context.js","sourceRoot":"","sources":["../src/crypto-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AAkBhF;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,OAGvC;IACC,IAAI,QAAkB,CAAC;IAEvB,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;QACxB,QAAQ,GAAG,yBAAyB,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAC5D,CAAC;SAAM,CAAC;QACN,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;QAC5C,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,GAAG,OAAO,EAAE,WAAW,CAAC;QAC3D,QAAQ,GAAG,MAAM,oBAAoB,CAAC,OAAO,CAAC,CAAC;IACjD,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;AACpF,CAAC"}
package/dist/index.js CHANGED
@@ -1,8 +1,13 @@
1
+ import { pathToFileURL } from 'node:url';
1
2
  import { createServer } from './server.js';
2
3
  export { createServer } from './server.js';
3
4
  const DEFAULT_PORT = 3118;
4
- // Only auto-start if this file is the entry point (not imported as a library)
5
- const isMain = process.argv[1]?.endsWith('index.js') || process.argv[1]?.endsWith('index.ts');
5
+ // Only auto-start when this file is the process entry point (not when the
6
+ // CLI imports it as a library). Compare the module URL with argv[1] resolved
7
+ // as a file:// URL — the standard ESM "main module" check.
8
+ const isMain = process.argv[1]
9
+ ? import.meta.url === pathToFileURL(process.argv[1]).href
10
+ : false;
6
11
  if (isMain) {
7
12
  const port = Number(process.env['ANTSEED_PAYMENTS_PORT']) || DEFAULT_PORT;
8
13
  const dataDir = process.env['ANTSEED_DATA_DIR'] || undefined;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG3C,MAAM,YAAY,GAAG,IAAI,CAAC;AAE1B,8EAA8E;AAC9E,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,UAAU,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC;AAE9F,IAAI,MAAM,EAAE,CAAC;IACX,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC,IAAI,YAAY,CAAC;IAC1E,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,SAAS,CAAC;IAC7D,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,IAAI,SAAS,CAAC;IAErE,YAAY,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;QACjE,MAAM,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,iDAAiD,IAAI,EAAE,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;QACf,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,GAAG,CAAC,CAAC;QAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG3C,MAAM,YAAY,GAAG,IAAI,CAAC;AAE1B,0EAA0E;AAC1E,6EAA6E;AAC7E,2DAA2D;AAC3D,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5B,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;IACzD,CAAC,CAAC,KAAK,CAAC;AAEV,IAAI,MAAM,EAAE,CAAC;IACX,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC,IAAI,YAAY,CAAC;IAC1E,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,SAAS,CAAC;IAC7D,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,IAAI,SAAS,CAAC;IAErE,YAAY,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;QACjE,MAAM,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,iDAAiD,IAAI,EAAE,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;QACf,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,GAAG,CAAC,CAAC;QAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,88 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import Fastify from 'fastify';
3
+ import { registerRoutes } from './routes.js';
4
+ function mockCtx(overrides = {}) {
5
+ return {
6
+ cryptoCtx: null,
7
+ cryptoConfig: {
8
+ rpcUrl: 'http://localhost:8545',
9
+ depositsContractAddress: '0x' + '0'.repeat(40),
10
+ channelsContractAddress: '0x' + '1'.repeat(40),
11
+ usdcContractAddress: '0x' + '2'.repeat(40),
12
+ },
13
+ chainConfig: {
14
+ chainId: 'base-local',
15
+ evmChainId: 31337,
16
+ emissionsContractAddress: '0x' + '3'.repeat(40),
17
+ },
18
+ proxyPort: 3000,
19
+ ...overrides,
20
+ };
21
+ }
22
+ describe('GET /api/config', () => {
23
+ it('includes emissionsContractAddress', async () => {
24
+ const app = Fastify();
25
+ registerRoutes(app, mockCtx());
26
+ const res = await app.inject({ method: 'GET', url: '/api/config' });
27
+ const body = res.json();
28
+ expect(body).toHaveProperty('emissionsContractAddress');
29
+ expect(body.emissionsContractAddress).toBe('0x' + '3'.repeat(40));
30
+ await app.close();
31
+ });
32
+ it('includes networkStatsUrl when the chain config has it', async () => {
33
+ const app = Fastify();
34
+ registerRoutes(app, mockCtx({
35
+ chainConfig: {
36
+ chainId: 'base-mainnet',
37
+ evmChainId: 8453,
38
+ networkStatsUrl: 'https://network.antseed.com',
39
+ },
40
+ }));
41
+ const res = await app.inject({ method: 'GET', url: '/api/config' });
42
+ expect(res.json().networkStatsUrl).toBe('https://network.antseed.com');
43
+ await app.close();
44
+ });
45
+ it('returns networkStatsUrl: null when the chain config has none', async () => {
46
+ const app = Fastify();
47
+ registerRoutes(app, mockCtx({
48
+ chainConfig: {
49
+ chainId: 'base-local',
50
+ evmChainId: 31337,
51
+ },
52
+ }));
53
+ const res = await app.inject({ method: 'GET', url: '/api/config' });
54
+ expect(res.json().networkStatsUrl).toBeNull();
55
+ await app.close();
56
+ });
57
+ });
58
+ describe('GET /api/emissions/pending', () => {
59
+ it('rejects malformed addresses with 400', async () => {
60
+ const app = Fastify();
61
+ registerRoutes(app, mockCtx());
62
+ const res = await app.inject({ method: 'GET', url: '/api/emissions/pending?address=not-an-address' });
63
+ expect(res.statusCode).toBe(400);
64
+ await app.close();
65
+ });
66
+ it('returns 503 when emissions contract is not configured', async () => {
67
+ const app = Fastify();
68
+ registerRoutes(app, mockCtx({
69
+ chainConfig: { chainId: 'base-local', evmChainId: 31337 },
70
+ }));
71
+ const res = await app.inject({ method: 'GET', url: '/api/emissions/pending?address=0x' + '4'.repeat(40) });
72
+ expect(res.statusCode).toBe(503);
73
+ await app.close();
74
+ });
75
+ });
76
+ describe('GET /api/emissions/transfers-enabled', () => {
77
+ it('returns configured:false when ANTS token address is missing', async () => {
78
+ const app = Fastify();
79
+ registerRoutes(app, mockCtx());
80
+ const res = await app.inject({ method: 'GET', url: '/api/emissions/transfers-enabled' });
81
+ expect(res.statusCode).toBe(200);
82
+ const body = res.json();
83
+ expect(body.enabled).toBe(false);
84
+ expect(body.configured).toBe(false);
85
+ await app.close();
86
+ });
87
+ });
88
+ //# sourceMappingURL=routes.emissions.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.emissions.test.js","sourceRoot":"","sources":["../src/routes.emissions.test.ts"],"names":[],"mappings":"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"}
package/dist/routes.js CHANGED
@@ -1,12 +1,42 @@
1
- import { ChannelsClient, DepositsClient, formatUsdc, parseUsdc, signSetOperator, makeDepositsDomain } from '@antseed/node';
1
+ import { DepositsClient, EmissionsClient, ANTSTokenClient, formatUsdc, parseUsdc, signSetOperator, makeDepositsDomain, } from '@antseed/node';
2
+ const EMPTY_BUYER_USAGE = {
3
+ totalRequests: 0,
4
+ totalInputTokens: '0',
5
+ totalOutputTokens: '0',
6
+ totalSettlements: 0,
7
+ uniqueSellers: 0,
8
+ activeChannels: 0,
9
+ channels: [],
10
+ };
2
11
  // Use shared utilities from @antseed/node
3
12
  const formatUsdc6 = formatUsdc;
4
13
  const parseUsdc6 = parseUsdc;
5
- function createClient(config) {
14
+ // Retry helper for on-chain view calls. Base RPC occasionally returns an
15
+ // unparseable response (ethers surfaces it as CALL_EXCEPTION with null
16
+ // revert data even though the call didn't actually revert); view calls are
17
+ // idempotent, so retrying clears these transient failures.
18
+ async function retryRead(fn, attempts = 3) {
19
+ let lastErr;
20
+ for (let i = 0; i < attempts; i++) {
21
+ try {
22
+ return await fn();
23
+ }
24
+ catch (err) {
25
+ lastErr = err;
26
+ if (i < attempts - 1) {
27
+ await new Promise((resolve) => setTimeout(resolve, 150 * (i + 1)));
28
+ }
29
+ }
30
+ }
31
+ throw lastErr;
32
+ }
33
+ function createClient(config, evmChainId) {
6
34
  return new DepositsClient({
7
35
  rpcUrl: config.rpcUrl,
36
+ ...(config.fallbackRpcUrls ? { fallbackRpcUrls: config.fallbackRpcUrls } : {}),
8
37
  contractAddress: config.depositsContractAddress,
9
38
  usdcAddress: config.usdcContractAddress,
39
+ evmChainId,
10
40
  });
11
41
  }
12
42
  export function registerRoutes(fastify, ctx) {
@@ -14,28 +44,49 @@ export function registerRoutes(fastify, ctx) {
14
44
  let depositsClient = null;
15
45
  function getClient() {
16
46
  if (!depositsClient)
17
- depositsClient = createClient(ctx.cryptoConfig);
47
+ depositsClient = createClient(ctx.cryptoConfig, ctx.chainConfig.evmChainId);
18
48
  return depositsClient;
19
49
  }
20
- let channelsClient = null;
21
- function getChannelsClient() {
22
- if (!channelsClient) {
23
- channelsClient = new ChannelsClient({
50
+ let emissionsClient = null;
51
+ function getEmissionsClient() {
52
+ if (!ctx.chainConfig.emissionsContractAddress)
53
+ return null;
54
+ if (!emissionsClient) {
55
+ emissionsClient = new EmissionsClient({
24
56
  rpcUrl: ctx.cryptoConfig.rpcUrl,
25
- contractAddress: ctx.cryptoConfig.channelsContractAddress,
57
+ ...(ctx.cryptoConfig.fallbackRpcUrls ? { fallbackRpcUrls: ctx.cryptoConfig.fallbackRpcUrls } : {}),
58
+ contractAddress: ctx.chainConfig.emissionsContractAddress,
59
+ evmChainId: ctx.chainConfig.evmChainId,
26
60
  });
27
61
  }
28
- return channelsClient;
62
+ return emissionsClient;
63
+ }
64
+ let antsTokenClient = null;
65
+ function getAntsTokenClient() {
66
+ // ANTSToken address is typically fetched via the registry, but for v1 we
67
+ // plumb it through the chain config. Fall back to null if unavailable.
68
+ const addr = ctx.chainConfig.antsTokenAddress;
69
+ if (!addr)
70
+ return null;
71
+ if (!antsTokenClient) {
72
+ antsTokenClient = new ANTSTokenClient({
73
+ rpcUrl: ctx.cryptoConfig.rpcUrl,
74
+ contractAddress: addr,
75
+ evmChainId: ctx.chainConfig.evmChainId,
76
+ });
77
+ }
78
+ return antsTokenClient;
29
79
  }
30
80
  fastify.get('/api/balance', async (_request, reply) => {
31
81
  if (!ctx.cryptoCtx) {
32
- return reply.status(503).send({ ok: false, error: 'Identity not configured — run antseed init' });
82
+ return reply.status(503).send({ ok: false, error: 'Identity not configured — set ANTSEED_IDENTITY_HEX or run antseed seller setup' });
33
83
  }
34
84
  try {
35
85
  const client = getClient();
86
+ const buyerAddress = ctx.cryptoCtx.evmAddress;
36
87
  const [balance, creditLimit] = await Promise.all([
37
- client.getBuyerBalance(ctx.cryptoCtx.evmAddress),
38
- client.getBuyerCreditLimit(ctx.cryptoCtx.evmAddress),
88
+ retryRead(() => client.getBuyerBalance(buyerAddress)),
89
+ retryRead(() => client.getBuyerCreditLimit(buyerAddress)),
39
90
  ]);
40
91
  return {
41
92
  evmAddress: ctx.cryptoCtx.evmAddress,
@@ -57,6 +108,9 @@ export function registerRoutes(fastify, ctx) {
57
108
  depositsContractAddress: ctx.cryptoConfig.depositsContractAddress,
58
109
  channelsContractAddress: ctx.cryptoConfig.channelsContractAddress,
59
110
  usdcContractAddress: ctx.cryptoConfig.usdcContractAddress,
111
+ emissionsContractAddress: ctx.chainConfig.emissionsContractAddress ?? null,
112
+ antsTokenAddress: ctx.chainConfig.antsTokenAddress ?? null,
113
+ networkStatsUrl: ctx.chainConfig.networkStatsUrl ?? null,
60
114
  evmAddress: ctx.cryptoCtx?.evmAddress ?? null,
61
115
  };
62
116
  });
@@ -66,7 +120,7 @@ export function registerRoutes(fastify, ctx) {
66
120
  });
67
121
  fastify.post('/api/withdraw', async (request, reply) => {
68
122
  if (!ctx.cryptoCtx) {
69
- return reply.status(503).send({ ok: false, error: 'Identity not configured — run antseed init' });
123
+ return reply.status(503).send({ ok: false, error: 'Identity not configured — set ANTSEED_IDENTITY_HEX or run antseed seller setup' });
70
124
  }
71
125
  const body = request.body;
72
126
  const amount = body?.amount;
@@ -83,91 +137,43 @@ export function registerRoutes(fastify, ctx) {
83
137
  return reply.status(500).send({ ok: false, error: err instanceof Error ? err.message : String(err) });
84
138
  }
85
139
  });
86
- fastify.get('/api/channels', async (_request, _reply) => {
87
- if (!ctx.cryptoCtx) {
88
- return { channels: [], history: [] };
89
- }
90
- // Fetch channels from the buyer proxy's local ChannelStore via its
91
- // control-plane endpoint (source of truth for the list). Avoids
92
- // eth_getLogs scans which are capped on public RPCs. Then enrich each
93
- // channel with a point-read against channels(bytes32) to get the
94
- // authoritative on-chain status + closeRequestedAt, and split into
95
- // active vs history based on on-chain state.
140
+ fastify.get('/api/channels', async () => {
141
+ if (!ctx.cryptoCtx)
142
+ return { channels: [] };
96
143
  try {
97
144
  const url = `http://127.0.0.1:${ctx.proxyPort}/_antseed/channels?all=1`;
98
145
  const resp = await fetch(url);
99
146
  if (!resp.ok) {
100
147
  fastify.log.warn(`[/api/channels] buyer proxy returned ${resp.status}`);
101
- return { channels: [], history: [] };
148
+ return { channels: [] };
102
149
  }
103
150
  const body = await resp.json();
104
- // Initialize the channels client outside the enrichment loop and catch
105
- // init failures independently — a bad RPC URL must not discard the
106
- // channel list we already have from the buyer proxy.
107
- let cc = null;
108
- try {
109
- cc = getChannelsClient();
110
- }
111
- catch (err) {
112
- fastify.log.warn(`[/api/channels] channels client init failed: ${err instanceof Error ? err.message : String(err)}`);
113
- }
114
- const rawChannels = body.channels ?? [];
115
- // Cap concurrent eth_call fan-out. Public RPCs rate-limit concurrent
116
- // reads — the default wagmi primary (publicnode) was picked for 3/3
117
- // reliability at 3 concurrent eth_calls; more than that and responses
118
- // start coming back stale, which would resurrect the exact bug this
119
- // PR fixes (status=1 / closeRequestedAt=0 placeholders).
120
- const ON_CHAIN_READ_CONCURRENCY = 3;
121
- const enriched = new Array(rawChannels.length);
122
- let cursor = 0;
123
- async function worker() {
124
- while (true) {
125
- const i = cursor++;
126
- if (i >= rawChannels.length)
127
- return;
128
- const c = rawChannels[i];
129
- let closeRequestedAt = 0;
130
- let onchainStatus = 0; // 0=None, 1=Active, 2=Settled, 3=TimedOut
131
- let onchainSettled = null;
132
- if (cc) {
133
- try {
134
- const onchain = await cc.getSession(c.channelId);
135
- closeRequestedAt = Number(onchain.closeRequestedAt);
136
- onchainStatus = onchain.status;
137
- onchainSettled = onchain.settled;
138
- }
139
- catch (err) {
140
- fastify.log.warn(`[/api/channels] on-chain read failed for ${c.channelId.slice(0, 10)}: ${err instanceof Error ? err.message : String(err)}`);
141
- }
142
- }
143
- enriched[i] = {
144
- channelId: c.channelId,
145
- seller: c.seller,
146
- deposit: formatUsdc6(BigInt(c.reserveMax)),
147
- settled: formatUsdc6(onchainSettled ?? BigInt(c.cumulativeSigned)),
148
- deadline: c.deadline,
149
- closeRequestedAt,
150
- status: onchainStatus,
151
- };
152
- }
153
- }
154
- const workers = Array.from({ length: Math.min(ON_CHAIN_READ_CONCURRENCY, rawChannels.length) }, () => worker());
155
- await Promise.all(workers);
156
- // Active = on-chain status Active (1). Everything else is history
157
- // (Settled=2, TimedOut=3, None=0 means the channel no longer exists
158
- // on-chain — e.g., withdrawn and cleared).
159
- const channels = enriched.filter((c) => c.status === 1);
160
- const history = enriched.filter((c) => c.status !== 1);
161
- return { channels, history };
151
+ return { channels: body.channels ?? [] };
162
152
  }
163
153
  catch (err) {
164
154
  fastify.log.warn(`[/api/channels] buyer proxy unreachable: ${err instanceof Error ? err.message : String(err)}`);
165
- return { channels: [], history: [] };
155
+ return { channels: [] };
156
+ }
157
+ });
158
+ fastify.get('/api/buyer-usage', async () => {
159
+ try {
160
+ const url = `http://127.0.0.1:${ctx.proxyPort}/_antseed/buyer-usage`;
161
+ const resp = await fetch(url);
162
+ if (!resp.ok) {
163
+ fastify.log.warn(`[/api/buyer-usage] buyer proxy returned ${resp.status}`);
164
+ return EMPTY_BUYER_USAGE;
165
+ }
166
+ const body = await resp.json();
167
+ return body.totals;
168
+ }
169
+ catch (err) {
170
+ fastify.log.warn(`[/api/buyer-usage] buyer proxy unreachable: ${err instanceof Error ? err.message : String(err)}`);
171
+ return EMPTY_BUYER_USAGE;
166
172
  }
167
173
  });
168
174
  fastify.get('/api/operator', async (_request, reply) => {
169
175
  if (!ctx.cryptoCtx) {
170
- return reply.status(503).send({ ok: false, error: 'Identity not configured — run antseed init' });
176
+ return reply.status(503).send({ ok: false, error: 'Identity not configured — set ANTSEED_IDENTITY_HEX or run antseed seller setup' });
171
177
  }
172
178
  try {
173
179
  const client = getClient();
@@ -176,8 +182,8 @@ export function registerRoutes(fastify, ctx) {
176
182
  }
177
183
  const buyerAddress = ctx.cryptoCtx.evmAddress;
178
184
  const [operator, nonce] = await Promise.all([
179
- client.getOperator(buyerAddress),
180
- client.getOperatorNonce(buyerAddress),
185
+ retryRead(() => client.getOperator(buyerAddress)),
186
+ retryRead(() => client.getOperatorNonce(buyerAddress)),
181
187
  ]);
182
188
  return { operator, nonce: Number(nonce) };
183
189
  }
@@ -211,5 +217,106 @@ export function registerRoutes(fastify, ctx) {
211
217
  return reply.status(500).send({ ok: false, error: err instanceof Error ? err.message : String(err) });
212
218
  }
213
219
  });
220
+ fastify.get('/api/emissions', async (_request, reply) => {
221
+ const client = getEmissionsClient();
222
+ if (!client) {
223
+ return reply.status(503).send({ ok: false, error: 'Emissions contract not configured for this chain' });
224
+ }
225
+ try {
226
+ const [info, genesis, halving] = await Promise.all([
227
+ retryRead(() => client.getEpochInfo()),
228
+ retryRead(() => client.getGenesis()),
229
+ retryRead(() => client.getHalvingInterval()),
230
+ ]);
231
+ const emission = await retryRead(() => client.getEpochEmission(info.epoch));
232
+ return {
233
+ currentEpoch: info.epoch,
234
+ epochDuration: info.epochDuration,
235
+ currentRate: info.emission.toString(),
236
+ epochEmission: emission.toString(),
237
+ genesis,
238
+ halvingInterval: halving,
239
+ };
240
+ }
241
+ catch (err) {
242
+ return reply.status(500).send({ ok: false, error: err instanceof Error ? err.message : String(err) });
243
+ }
244
+ });
245
+ fastify.get('/api/emissions/pending', async (request, reply) => {
246
+ const client = getEmissionsClient();
247
+ if (!client) {
248
+ return reply.status(503).send({ ok: false, error: 'Emissions contract not configured for this chain' });
249
+ }
250
+ const query = request.query;
251
+ const address = query?.address;
252
+ if (!address || !/^0x[0-9a-fA-F]{40}$/.test(address)) {
253
+ return reply.status(400).send({ ok: false, error: 'Invalid address' });
254
+ }
255
+ const scanN = Math.min(Math.max(parseInt(query?.epochs ?? '10', 10) || 10, 1), 104);
256
+ try {
257
+ const info = await retryRead(() => client.getEpochInfo());
258
+ const current = info.epoch;
259
+ const startEpoch = Math.max(0, current - (scanN - 1));
260
+ const epochList = Array.from({ length: current - startEpoch + 1 }, (_, i) => startEpoch + i);
261
+ const rows = await Promise.all(epochList.map(async (epoch) => {
262
+ const [pending, userSP, userBP, sellerClaimed, buyerClaimed, totalSP, totalBP] = await Promise.all([
263
+ retryRead(() => client.pendingEmissions(address, [epoch])),
264
+ retryRead(() => client.userSellerPoints(address, epoch)),
265
+ retryRead(() => client.userBuyerPoints(address, epoch)),
266
+ retryRead(() => client.sellerEpochClaimed(address, epoch)),
267
+ retryRead(() => client.buyerEpochClaimed(address, epoch)),
268
+ retryRead(() => client.epochTotalSellerPoints(epoch)),
269
+ retryRead(() => client.epochTotalBuyerPoints(epoch)),
270
+ ]);
271
+ return {
272
+ epoch,
273
+ seller: {
274
+ amount: pending.seller.toString(),
275
+ userPoints: userSP.toString(),
276
+ totalPoints: totalSP.toString(),
277
+ claimed: sellerClaimed,
278
+ },
279
+ buyer: {
280
+ amount: pending.buyer.toString(),
281
+ userPoints: userBP.toString(),
282
+ totalPoints: totalBP.toString(),
283
+ claimed: buyerClaimed,
284
+ },
285
+ isCurrent: epoch === current,
286
+ };
287
+ }));
288
+ return { currentEpoch: current, rows };
289
+ }
290
+ catch (err) {
291
+ return reply.status(500).send({ ok: false, error: err instanceof Error ? err.message : String(err) });
292
+ }
293
+ });
294
+ fastify.get('/api/emissions/shares', async (_request, reply) => {
295
+ const client = getEmissionsClient();
296
+ if (!client) {
297
+ return reply.status(503).send({ ok: false, error: 'Emissions contract not configured for this chain' });
298
+ }
299
+ try {
300
+ return await retryRead(() => client.getShares());
301
+ }
302
+ catch (err) {
303
+ return reply.status(500).send({ ok: false, error: err instanceof Error ? err.message : String(err) });
304
+ }
305
+ });
306
+ fastify.get('/api/emissions/transfers-enabled', async (_request, reply) => {
307
+ const client = getAntsTokenClient();
308
+ if (!client) {
309
+ // When the ANTS token address isn't configured, treat as "not enabled yet"
310
+ // — the UI uses this to decide whether to show the locked banner.
311
+ return { enabled: false, configured: false };
312
+ }
313
+ try {
314
+ const enabled = await client.transfersEnabled();
315
+ return { enabled, configured: true };
316
+ }
317
+ catch (err) {
318
+ return reply.status(500).send({ ok: false, error: err instanceof Error ? err.message : String(err) });
319
+ }
320
+ });
214
321
  }
215
322
  //# sourceMappingURL=routes.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"routes.js","sourceRoot":"","sources":["../src/routes.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"routes.js","sourceRoot":"","sources":["../src/routes.ts"],"names":[],"mappings":"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"}
package/dist/server.d.ts CHANGED
@@ -3,5 +3,12 @@ export interface PaymentsServerOptions {
3
3
  port: number;
4
4
  dataDir?: string;
5
5
  identityHex?: string;
6
+ /**
7
+ * Fallback RPC URL used when the user has not set `payments.crypto.rpcUrl`
8
+ * in config.json. Lets the host app (e.g. desktop) override the protocol
9
+ * default (`mainnet.base.org`) with a more reliable endpoint, matching the
10
+ * RPC the rest of the app is already using for on-chain reads.
11
+ */
12
+ defaultRpcUrl?: string;
6
13
  }
7
14
  export declare function createServer(options: PaymentsServerOptions): Promise<Fastify.FastifyInstance<import("http").Server<typeof import("http").IncomingMessage, typeof import("http").ServerResponse>, import("http").IncomingMessage, import("http").ServerResponse<import("http").IncomingMessage>, Fastify.FastifyBaseLogger, Fastify.FastifyTypeProviderDefault>>;
package/dist/server.js CHANGED
@@ -73,15 +73,27 @@ export async function createServer(options) {
73
73
  catch {
74
74
  // No config file — use protocol defaults
75
75
  }
76
+ const userRpcUrl = typeof userOverrides.rpcUrl === 'string' && userOverrides.rpcUrl.trim().length > 0
77
+ ? userOverrides.rpcUrl
78
+ : undefined;
79
+ const selectedChainId = userOverrides.chainId ?? 'base-mainnet';
80
+ // Only fall back to the host's preferred RPC for base-mainnet — the only
81
+ // chain whose protocol default (mainnet.base.org) rate-limits the channels
82
+ // enrichment fan-out. Other chains keep their own presets.
83
+ const effectiveRpcUrl = userRpcUrl ?? (selectedChainId === 'base-mainnet' ? options.defaultRpcUrl : undefined);
76
84
  const chainConfig = resolveChainConfig({
77
85
  chainId: userOverrides.chainId,
78
- rpcUrl: userOverrides.rpcUrl,
86
+ ...(effectiveRpcUrl ? { rpcUrl: effectiveRpcUrl } : {}),
87
+ ...(Array.isArray(userOverrides.fallbackRpcUrls)
88
+ ? { fallbackRpcUrls: userOverrides.fallbackRpcUrls }
89
+ : {}),
79
90
  depositsContractAddress: userOverrides.depositsContractAddress,
80
91
  channelsContractAddress: userOverrides.channelsContractAddress,
81
92
  usdcContractAddress: userOverrides.usdcContractAddress,
82
93
  });
83
94
  const cryptoConfig = {
84
95
  rpcUrl: chainConfig.rpcUrl,
96
+ ...(chainConfig.fallbackRpcUrls ? { fallbackRpcUrls: chainConfig.fallbackRpcUrls } : {}),
85
97
  depositsContractAddress: chainConfig.depositsContractAddress,
86
98
  channelsContractAddress: chainConfig.channelsContractAddress,
87
99
  usdcContractAddress: chainConfig.usdcContractAddress,
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import{w as o}from"./core-Do4oAjfk.js";import"./index-5w7d6cAM.js";import"./index.es-CpQtULc3.js";import"./events-DQ172AOg.js";const e=o`<svg
1
+ import{w as o}from"./core-BokkgsR-.js";import"./index-jSclbA_D.js";import"./index.es-J3dlIVGI.js";import"./events-DQ172AOg.js";const e=o`<svg
2
2
  width="14"
3
3
  height="14"
4
4
  viewBox="0 0 14 14"
@@ -1,4 +1,4 @@
1
- import{w as o}from"./core-Do4oAjfk.js";import"./index-5w7d6cAM.js";import"./index.es-CpQtULc3.js";import"./events-DQ172AOg.js";const r=o`<svg fill="none" viewBox="0 0 24 24">
1
+ import{w as o}from"./core-BokkgsR-.js";import"./index-jSclbA_D.js";import"./index.es-J3dlIVGI.js";import"./events-DQ172AOg.js";const r=o`<svg fill="none" viewBox="0 0 24 24">
2
2
  <path
3
3
  style="fill: var(--wui-color-accent-100);"
4
4
  d="M10.2 6.6a3.6 3.6 0 1 1-7.2 0 3.6 3.6 0 0 1 7.2 0ZM21 6.6a3.6 3.6 0 1 1-7.2 0 3.6 3.6 0 0 1 7.2 0ZM10.2 17.4a3.6 3.6 0 1 1-7.2 0 3.6 3.6 0 0 1 7.2 0ZM21 17.4a3.6 3.6 0 1 1-7.2 0 3.6 3.6 0 0 1 7.2 0Z"
@@ -1,4 +1,4 @@
1
- import{w as t}from"./core-Do4oAjfk.js";import"./index-5w7d6cAM.js";import"./index.es-CpQtULc3.js";import"./events-DQ172AOg.js";const e=t`
1
+ import{w as t}from"./core-BokkgsR-.js";import"./index-jSclbA_D.js";import"./index.es-J3dlIVGI.js";import"./events-DQ172AOg.js";const e=t`
2
2
  <svg width="36" height="36">
3
3
  <path
4
4
  d="M28.724 0H7.271A7.269 7.269 0 0 0 0 7.272v21.46A7.268 7.268 0 0 0 7.271 36H28.73A7.272 7.272 0 0 0 36 28.728V7.272A7.275 7.275 0 0 0 28.724 0Z"