@revealui/services 0.0.3 → 0.2.0

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 (144) hide show
  1. package/LICENSE +22 -0
  2. package/LICENSE.commercial +112 -0
  3. package/README.md +177 -0
  4. package/dist/api/create-checkout-session/index.d.ts +2 -0
  5. package/dist/api/create-checkout-session/index.d.ts.map +1 -0
  6. package/dist/api/create-checkout-session/index.js +61 -0
  7. package/dist/api/create-checkout-session/index.js.map +1 -0
  8. package/dist/api/create-portal-link/index.d.ts +2 -0
  9. package/dist/api/create-portal-link/index.d.ts.map +1 -0
  10. package/dist/api/create-portal-link/index.js +37 -0
  11. package/dist/api/create-portal-link/index.js.map +1 -0
  12. package/dist/api/handlers/customer-handlers.d.ts +27 -0
  13. package/dist/api/handlers/customer-handlers.d.ts.map +1 -0
  14. package/dist/api/handlers/customer-handlers.js +86 -0
  15. package/dist/api/handlers/customer-handlers.js.map +1 -0
  16. package/dist/api/handlers/index.d.ts +18 -0
  17. package/dist/api/handlers/index.d.ts.map +1 -0
  18. package/dist/api/handlers/index.js +18 -0
  19. package/dist/api/handlers/index.js.map +1 -0
  20. package/dist/api/handlers/invoice-handlers.d.ts +9 -0
  21. package/dist/api/handlers/invoice-handlers.d.ts.map +1 -0
  22. package/dist/api/handlers/invoice-handlers.js +52 -0
  23. package/dist/api/handlers/invoice-handlers.js.map +1 -0
  24. package/dist/api/handlers/payment-handlers.d.ts +13 -0
  25. package/dist/api/handlers/payment-handlers.d.ts.map +1 -0
  26. package/dist/api/handlers/payment-handlers.js +133 -0
  27. package/dist/api/handlers/payment-handlers.js.map +1 -0
  28. package/dist/api/handlers/payment-intent.d.ts +21 -0
  29. package/dist/api/handlers/payment-intent.d.ts.map +1 -0
  30. package/dist/api/handlers/payment-intent.js +87 -0
  31. package/dist/api/handlers/payment-intent.js.map +1 -0
  32. package/dist/api/handlers/product-handlers.d.ts +11 -0
  33. package/dist/api/handlers/product-handlers.d.ts.map +1 -0
  34. package/dist/api/handlers/product-handlers.js +43 -0
  35. package/dist/api/handlers/product-handlers.js.map +1 -0
  36. package/dist/api/handlers/subscription-handlers.d.ts +17 -0
  37. package/dist/api/handlers/subscription-handlers.d.ts.map +1 -0
  38. package/dist/api/handlers/subscription-handlers.js +119 -0
  39. package/dist/api/handlers/subscription-handlers.js.map +1 -0
  40. package/dist/api/index.d.ts +8 -0
  41. package/dist/api/index.d.ts.map +1 -0
  42. package/dist/api/index.js +8 -0
  43. package/dist/api/index.js.map +1 -0
  44. package/dist/api/types/stripe.d.ts +42 -0
  45. package/dist/api/types/stripe.d.ts.map +1 -0
  46. package/dist/api/types/stripe.js +72 -0
  47. package/dist/api/types/stripe.js.map +1 -0
  48. package/dist/api/update-price/index.d.ts +42 -0
  49. package/dist/api/update-price/index.d.ts.map +1 -0
  50. package/dist/api/update-price/index.js +78 -0
  51. package/dist/api/update-price/index.js.map +1 -0
  52. package/dist/api/update-product/index.d.ts +44 -0
  53. package/dist/api/update-product/index.d.ts.map +1 -0
  54. package/dist/api/update-product/index.js +85 -0
  55. package/dist/api/update-product/index.js.map +1 -0
  56. package/dist/api/utils.d.ts +34 -0
  57. package/dist/api/utils.d.ts.map +1 -0
  58. package/dist/api/utils.js +66 -0
  59. package/dist/api/utils.js.map +1 -0
  60. package/dist/api/webhooks/index.d.ts +12 -0
  61. package/dist/api/webhooks/index.d.ts.map +1 -0
  62. package/dist/api/webhooks/index.js +280 -0
  63. package/dist/api/webhooks/index.js.map +1 -0
  64. package/dist/client/index.d.ts +11 -0
  65. package/dist/client/index.d.ts.map +1 -0
  66. package/dist/client/index.js +12 -0
  67. package/dist/client/index.js.map +1 -0
  68. package/dist/index.d.ts +33 -24
  69. package/dist/index.d.ts.map +1 -0
  70. package/dist/index.js +46 -41
  71. package/dist/index.js.map +1 -0
  72. package/dist/revealcoin/__tests__/client.test.d.ts +2 -0
  73. package/dist/revealcoin/__tests__/client.test.d.ts.map +1 -0
  74. package/dist/revealcoin/__tests__/client.test.js +207 -0
  75. package/dist/revealcoin/__tests__/client.test.js.map +1 -0
  76. package/dist/revealcoin/__tests__/config.test.d.ts +2 -0
  77. package/dist/revealcoin/__tests__/config.test.d.ts.map +1 -0
  78. package/dist/revealcoin/__tests__/config.test.js +91 -0
  79. package/dist/revealcoin/__tests__/config.test.js.map +1 -0
  80. package/dist/revealcoin/__tests__/oracle.test.d.ts +2 -0
  81. package/dist/revealcoin/__tests__/oracle.test.d.ts.map +1 -0
  82. package/dist/revealcoin/__tests__/oracle.test.js +238 -0
  83. package/dist/revealcoin/__tests__/oracle.test.js.map +1 -0
  84. package/dist/revealcoin/__tests__/safeguards.test.d.ts +2 -0
  85. package/dist/revealcoin/__tests__/safeguards.test.d.ts.map +1 -0
  86. package/dist/revealcoin/__tests__/safeguards.test.js +571 -0
  87. package/dist/revealcoin/__tests__/safeguards.test.js.map +1 -0
  88. package/dist/revealcoin/client.d.ts +51 -0
  89. package/dist/revealcoin/client.d.ts.map +1 -0
  90. package/dist/revealcoin/client.js +211 -0
  91. package/dist/revealcoin/client.js.map +1 -0
  92. package/dist/revealcoin/config.d.ts +32 -0
  93. package/dist/revealcoin/config.d.ts.map +1 -0
  94. package/dist/revealcoin/config.js +54 -0
  95. package/dist/revealcoin/config.js.map +1 -0
  96. package/dist/revealcoin/index.d.ts +5 -0
  97. package/dist/revealcoin/index.d.ts.map +1 -0
  98. package/dist/revealcoin/index.js +5 -0
  99. package/dist/revealcoin/index.js.map +1 -0
  100. package/dist/revealcoin/oracle.d.ts +81 -0
  101. package/dist/revealcoin/oracle.d.ts.map +1 -0
  102. package/dist/revealcoin/oracle.js +211 -0
  103. package/dist/revealcoin/oracle.js.map +1 -0
  104. package/dist/revealcoin/safeguards.d.ts +92 -0
  105. package/dist/revealcoin/safeguards.d.ts.map +1 -0
  106. package/dist/revealcoin/safeguards.js +240 -0
  107. package/dist/revealcoin/safeguards.js.map +1 -0
  108. package/dist/stripe/db-circuit-breaker.d.ts +47 -0
  109. package/dist/stripe/db-circuit-breaker.d.ts.map +1 -0
  110. package/dist/stripe/db-circuit-breaker.js +223 -0
  111. package/dist/stripe/db-circuit-breaker.js.map +1 -0
  112. package/dist/stripe/index.d.ts +2 -0
  113. package/dist/stripe/index.d.ts.map +1 -0
  114. package/dist/stripe/index.js +2 -0
  115. package/dist/stripe/index.js.map +1 -0
  116. package/dist/stripe/stripeClient.d.ts +126 -0
  117. package/dist/stripe/stripeClient.d.ts.map +1 -0
  118. package/dist/stripe/stripeClient.js +226 -0
  119. package/dist/stripe/stripeClient.js.map +1 -0
  120. package/dist/supabase/index.d.ts +6 -0
  121. package/dist/supabase/index.d.ts.map +1 -0
  122. package/dist/supabase/index.js +5 -0
  123. package/dist/supabase/index.js.map +1 -0
  124. package/dist/supabase/resilience.d.ts +50 -0
  125. package/dist/supabase/resilience.d.ts.map +1 -0
  126. package/dist/supabase/resilience.js +166 -0
  127. package/dist/supabase/resilience.js.map +1 -0
  128. package/dist/supabase/types.d.ts +206 -0
  129. package/dist/supabase/types.d.ts.map +1 -0
  130. package/dist/supabase/types.js +19 -0
  131. package/dist/supabase/types.js.map +1 -0
  132. package/dist/supabase/utils/client.d.ts +4 -0
  133. package/dist/supabase/utils/client.d.ts.map +1 -0
  134. package/dist/supabase/utils/client.js +12 -0
  135. package/dist/supabase/utils/client.js.map +1 -0
  136. package/dist/supabase/utils/server.d.ts +10 -0
  137. package/dist/supabase/utils/server.d.ts.map +1 -0
  138. package/dist/supabase/utils/server.js +49 -0
  139. package/dist/supabase/utils/server.js.map +1 -0
  140. package/dist/supabase/utils/web.d.ts +4 -0
  141. package/dist/supabase/utils/web.d.ts.map +1 -0
  142. package/dist/supabase/utils/web.js +37 -0
  143. package/dist/supabase/utils/web.js.map +1 -0
  144. package/package.json +79 -16
@@ -0,0 +1,207 @@
1
+ import { beforeEach, describe, expect, it, vi } from 'vitest';
2
+ // All mock fns must be created via vi.hoisted() so they exist when vi.mock factories run
3
+ const { mockGetTransaction, mockGetTokenAccountsByOwner, mockIsOpen, mockRecordSuccess, mockRecordFailure, mockReset, } = vi.hoisted(() => ({
4
+ mockGetTransaction: vi.fn(),
5
+ mockGetTokenAccountsByOwner: vi.fn(),
6
+ mockIsOpen: vi.fn().mockResolvedValue(false),
7
+ mockRecordSuccess: vi.fn().mockResolvedValue(undefined),
8
+ mockRecordFailure: vi.fn().mockResolvedValue(undefined),
9
+ mockReset: vi.fn().mockResolvedValue(undefined),
10
+ }));
11
+ vi.mock('@solana/kit', () => ({
12
+ address: (s) => s,
13
+ signature: (s) => s,
14
+ createSolanaRpc: () => ({
15
+ getTransaction: (...args) => ({ send: () => mockGetTransaction(...args) }),
16
+ getTokenAccountsByOwner: (...args) => ({ send: () => mockGetTokenAccountsByOwner(...args) }),
17
+ }),
18
+ }));
19
+ vi.mock('@revealui/contracts', () => ({
20
+ RVUI_MINT_ADDRESSES: {
21
+ devnet: '4Ysb1gkz21FD2B9P8P5Pm8bHh4CAMKYU1L528e1MigPo',
22
+ 'mainnet-beta': '',
23
+ },
24
+ RVUI_TOKEN_CONFIG: { decimals: 6 },
25
+ RVUI_TOKEN_PROGRAM: 'TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb',
26
+ }));
27
+ vi.mock('@revealui/core/observability/logger', () => ({
28
+ createLogger: () => ({
29
+ debug: vi.fn(),
30
+ info: vi.fn(),
31
+ warn: vi.fn(),
32
+ error: vi.fn(),
33
+ }),
34
+ }));
35
+ vi.mock('../config.js', () => ({
36
+ getRevealCoinConfig: vi.fn(() => ({
37
+ network: 'devnet',
38
+ queryCommitment: 'confirmed',
39
+ paymentCommitment: 'finalized',
40
+ })),
41
+ resolveRpcUrl: vi.fn(() => 'https://api.devnet.solana.com'),
42
+ }));
43
+ vi.mock('../../stripe/db-circuit-breaker.js', () => ({
44
+ DbCircuitBreaker: class {
45
+ isOpen = mockIsOpen;
46
+ recordSuccess = mockRecordSuccess;
47
+ recordFailure = mockRecordFailure;
48
+ reset = mockReset;
49
+ },
50
+ }));
51
+ import { getRvuiBalance, verifyRvuiPayment, __resetConnection, } from '../client.js';
52
+ function resetMocks() {
53
+ mockGetTransaction.mockClear();
54
+ mockGetTokenAccountsByOwner.mockClear();
55
+ mockIsOpen.mockClear();
56
+ mockIsOpen.mockResolvedValue(false);
57
+ mockRecordSuccess.mockClear();
58
+ mockRecordSuccess.mockResolvedValue(undefined);
59
+ mockRecordFailure.mockClear();
60
+ mockRecordFailure.mockResolvedValue(undefined);
61
+ mockReset.mockClear();
62
+ }
63
+ /** Helper to create a mock getTokenAccountsByOwner response */
64
+ function tokenAccountResponse(amount) {
65
+ return {
66
+ value: [{
67
+ pubkey: 'mock-ata',
68
+ account: {
69
+ data: {
70
+ parsed: { info: { tokenAmount: { amount } } },
71
+ },
72
+ },
73
+ }],
74
+ };
75
+ }
76
+ describe('getRvuiBalance', () => {
77
+ beforeEach(() => {
78
+ resetMocks();
79
+ });
80
+ it('returns balance for wallet with tokens', async () => {
81
+ mockGetTokenAccountsByOwner.mockResolvedValue(tokenAccountResponse('1000000000'));
82
+ const result = await getRvuiBalance('wallet-with-tokens');
83
+ expect(result.raw).toBe(1000000000n);
84
+ expect(result.uiAmount).toBe(1000);
85
+ expect(mockRecordSuccess).toHaveBeenCalled();
86
+ });
87
+ it('returns zero for wallet without token account', async () => {
88
+ mockGetTokenAccountsByOwner.mockResolvedValue({ value: [] });
89
+ const result = await getRvuiBalance('wallet-no-tokens');
90
+ expect(result.raw).toBe(0n);
91
+ expect(result.uiAmount).toBe(0);
92
+ expect(result.formatted).toBe('0');
93
+ });
94
+ it('throws when circuit breaker is open', async () => {
95
+ mockIsOpen.mockResolvedValue(true);
96
+ await expect(getRvuiBalance('any-wallet')).rejects.toThrow('circuit breaker is OPEN');
97
+ });
98
+ it('retries on timeout errors', async () => {
99
+ mockGetTokenAccountsByOwner
100
+ .mockRejectedValueOnce(new Error('timeout'))
101
+ .mockResolvedValueOnce(tokenAccountResponse('500000'));
102
+ const result = await getRvuiBalance('wallet-retry');
103
+ expect(result.raw).toBe(500000n);
104
+ expect(mockGetTokenAccountsByOwner).toHaveBeenCalledTimes(2);
105
+ });
106
+ it('does not retry non-retryable errors', async () => {
107
+ mockGetTokenAccountsByOwner.mockRejectedValue(new Error('Invalid public key input'));
108
+ await expect(getRvuiBalance('bad-wallet')).rejects.toThrow('Invalid public key input');
109
+ expect(mockGetTokenAccountsByOwner).toHaveBeenCalledTimes(1);
110
+ expect(mockRecordFailure).toHaveBeenCalled();
111
+ });
112
+ });
113
+ describe('verifyRvuiPayment', () => {
114
+ beforeEach(() => {
115
+ resetMocks();
116
+ });
117
+ const mintAddress = '4Ysb1gkz21FD2B9P8P5Pm8bHh4CAMKYU1L528e1MigPo';
118
+ const programId = 'TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb';
119
+ it('returns valid for correct payment', async () => {
120
+ mockGetTransaction.mockResolvedValue({
121
+ meta: {
122
+ err: null,
123
+ preTokenBalances: [
124
+ {
125
+ mint: mintAddress,
126
+ owner: 'recipient-wallet',
127
+ programId,
128
+ uiTokenAmount: { amount: '0' },
129
+ },
130
+ ],
131
+ postTokenBalances: [
132
+ {
133
+ mint: mintAddress,
134
+ owner: 'recipient-wallet',
135
+ programId,
136
+ uiTokenAmount: { amount: '1000000' },
137
+ },
138
+ ],
139
+ },
140
+ });
141
+ const result = await verifyRvuiPayment('tx-sig-valid', 1000000n, 'recipient-wallet');
142
+ expect(result).toEqual({ valid: true });
143
+ });
144
+ it('rejects when transaction not found', async () => {
145
+ mockGetTransaction.mockResolvedValue(null);
146
+ const result = await verifyRvuiPayment('tx-sig-missing', 1n, 'recipient');
147
+ expect(result).toEqual({
148
+ valid: false,
149
+ error: 'Transaction not found or not yet finalized',
150
+ });
151
+ });
152
+ it('rejects failed transactions', async () => {
153
+ mockGetTransaction.mockResolvedValue({
154
+ meta: {
155
+ err: { InstructionError: [0, 'InsufficientFunds'] },
156
+ preTokenBalances: [],
157
+ postTokenBalances: [],
158
+ },
159
+ });
160
+ const result = await verifyRvuiPayment('tx-sig-failed', 1n, 'recipient');
161
+ expect(result.valid).toBe(false);
162
+ expect(result.error).toContain('Transaction failed');
163
+ });
164
+ it('rejects when recipient did not receive tokens', async () => {
165
+ mockGetTransaction.mockResolvedValue({
166
+ meta: {
167
+ err: null,
168
+ preTokenBalances: [],
169
+ postTokenBalances: [],
170
+ },
171
+ });
172
+ const result = await verifyRvuiPayment('tx-sig-no-transfer', 1n, 'recipient');
173
+ expect(result.valid).toBe(false);
174
+ expect(result.error).toContain('did not receive');
175
+ });
176
+ it('rejects insufficient payment amount', async () => {
177
+ mockGetTransaction.mockResolvedValue({
178
+ meta: {
179
+ err: null,
180
+ preTokenBalances: [
181
+ {
182
+ mint: mintAddress,
183
+ owner: 'recipient',
184
+ programId,
185
+ uiTokenAmount: { amount: '0' },
186
+ },
187
+ ],
188
+ postTokenBalances: [
189
+ {
190
+ mint: mintAddress,
191
+ owner: 'recipient',
192
+ programId,
193
+ uiTokenAmount: { amount: '500' },
194
+ },
195
+ ],
196
+ },
197
+ });
198
+ const result = await verifyRvuiPayment('tx-sig-low', 1000000n, 'recipient');
199
+ expect(result.valid).toBe(false);
200
+ expect(result.error).toContain('Insufficient payment');
201
+ });
202
+ it('throws when circuit breaker is open', async () => {
203
+ mockIsOpen.mockResolvedValue(true);
204
+ await expect(verifyRvuiPayment('tx', 1n, 'recipient')).rejects.toThrow('circuit breaker is OPEN');
205
+ });
206
+ });
207
+ //# sourceMappingURL=client.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.test.js","sourceRoot":"","sources":["../../../src/revealcoin/__tests__/client.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=config.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.test.d.ts","sourceRoot":"","sources":["../../../src/revealcoin/__tests__/config.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,91 @@
1
+ import { afterEach, describe, expect, it } from 'vitest';
2
+ import { configureRevealCoin, getRevealCoinConfig, resetRevealCoinConfig, resolveRpcUrl, } from '../config.js';
3
+ describe('RevealCoinConfig', () => {
4
+ afterEach(() => {
5
+ resetRevealCoinConfig();
6
+ delete process.env.SOLANA_NETWORK;
7
+ delete process.env.SOLANA_RPC_URL;
8
+ delete process.env.RVUI_PAYMENTS_ENABLED;
9
+ delete process.env.RVUI_RECEIVING_WALLET;
10
+ });
11
+ it('returns defaults', () => {
12
+ const config = getRevealCoinConfig();
13
+ expect(config.network).toBe('devnet');
14
+ expect(config.queryCommitment).toBe('confirmed');
15
+ expect(config.paymentCommitment).toBe('finalized');
16
+ expect(config.enabled).toBe(false);
17
+ expect(config.receivingWallet).toBe('');
18
+ expect(config.pollIntervalMs).toBe(60_000);
19
+ });
20
+ it('reads network from env', () => {
21
+ process.env.SOLANA_NETWORK = 'mainnet-beta';
22
+ const config = getRevealCoinConfig();
23
+ expect(config.network).toBe('mainnet-beta');
24
+ });
25
+ it('reads RPC URL from env', () => {
26
+ process.env.SOLANA_RPC_URL = 'https://custom-rpc.example.com';
27
+ const config = getRevealCoinConfig();
28
+ expect(config.rpcUrl).toBe('https://custom-rpc.example.com');
29
+ });
30
+ it('reads enabled flag from env', () => {
31
+ process.env.RVUI_PAYMENTS_ENABLED = 'true';
32
+ const config = getRevealCoinConfig();
33
+ expect(config.enabled).toBe(true);
34
+ });
35
+ it('reads receiving wallet from env', () => {
36
+ process.env.RVUI_RECEIVING_WALLET = 'wallet-123';
37
+ const config = getRevealCoinConfig();
38
+ expect(config.receivingWallet).toBe('wallet-123');
39
+ });
40
+ it('applies overrides', () => {
41
+ configureRevealCoin({ pollIntervalMs: 5_000, queryCommitment: 'finalized' });
42
+ const config = getRevealCoinConfig();
43
+ expect(config.pollIntervalMs).toBe(5_000);
44
+ expect(config.queryCommitment).toBe('finalized');
45
+ });
46
+ it('resets to defaults', () => {
47
+ configureRevealCoin({ pollIntervalMs: 1_000 });
48
+ resetRevealCoinConfig();
49
+ const config = getRevealCoinConfig();
50
+ expect(config.pollIntervalMs).toBe(60_000);
51
+ });
52
+ });
53
+ describe('resolveRpcUrl', () => {
54
+ afterEach(() => {
55
+ resetRevealCoinConfig();
56
+ delete process.env.SOLANA_RPC_URL;
57
+ delete process.env.SOLANA_NETWORK;
58
+ });
59
+ it('returns devnet URL by default', () => {
60
+ const url = resolveRpcUrl();
61
+ expect(url).toBe('https://api.devnet.solana.com');
62
+ });
63
+ it('returns custom URL when configured', () => {
64
+ process.env.SOLANA_RPC_URL = 'https://my-rpc.example.com';
65
+ const url = resolveRpcUrl();
66
+ expect(url).toBe('https://my-rpc.example.com');
67
+ });
68
+ it('returns testnet URL for testnet network', () => {
69
+ process.env.SOLANA_NETWORK = 'testnet';
70
+ const url = resolveRpcUrl();
71
+ expect(url).toBe('https://api.testnet.solana.com');
72
+ });
73
+ it('returns mainnet URL for mainnet-beta', () => {
74
+ process.env.SOLANA_NETWORK = 'mainnet-beta';
75
+ const url = resolveRpcUrl();
76
+ expect(url).toBe('https://api.mainnet-beta.solana.com');
77
+ });
78
+ it('accepts explicit config override', () => {
79
+ const url = resolveRpcUrl({
80
+ network: 'mainnet-beta',
81
+ rpcUrl: 'https://override.example.com',
82
+ queryCommitment: 'confirmed',
83
+ paymentCommitment: 'finalized',
84
+ enabled: false,
85
+ receivingWallet: '',
86
+ pollIntervalMs: 60_000,
87
+ });
88
+ expect(url).toBe('https://override.example.com');
89
+ });
90
+ });
91
+ //# sourceMappingURL=config.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.test.js","sourceRoot":"","sources":["../../../src/revealcoin/__tests__/config.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=oracle.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oracle.test.d.ts","sourceRoot":"","sources":["../../../src/revealcoin/__tests__/oracle.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,238 @@
1
+ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
2
+ // Mock dependencies before imports
3
+ vi.mock('@revealui/contracts', () => ({
4
+ RVUI_MINT_ADDRESSES: {
5
+ devnet: '4Ysb1gkz21FD2B9P8P5Pm8bHh4CAMKYU1L528e1MigPo',
6
+ 'mainnet-beta': '',
7
+ },
8
+ }));
9
+ vi.mock('@revealui/core/observability/logger', () => ({
10
+ createLogger: () => ({
11
+ debug: vi.fn(),
12
+ info: vi.fn(),
13
+ warn: vi.fn(),
14
+ error: vi.fn(),
15
+ }),
16
+ }));
17
+ const mockGetRevealCoinConfig = vi.fn(() => ({
18
+ network: 'devnet',
19
+ }));
20
+ vi.mock('../config.js', () => ({
21
+ getRevealCoinConfig: () => mockGetRevealCoinConfig(),
22
+ }));
23
+ const mockRecordPriceSnapshot = vi.fn();
24
+ const mockGetTwapPrice = vi.fn();
25
+ vi.mock('../safeguards.js', () => ({
26
+ recordPriceSnapshot: (...args) => mockRecordPriceSnapshot(...args),
27
+ getTwapPrice: () => mockGetTwapPrice(),
28
+ }));
29
+ import { configurePriceOracle, fetchRvuiPrice, getPriceOracleConfig, isPriceOracleRunning, recordPriceFromJupiter, rvuiToUsd, startPriceOracle, stopPriceOracle, usdToRvui, } from '../oracle.js';
30
+ describe('PriceOracle config', () => {
31
+ afterEach(() => {
32
+ configurePriceOracle({ apiKey: '' });
33
+ });
34
+ it('returns default config', () => {
35
+ const config = getPriceOracleConfig();
36
+ expect(config.apiUrl).toBe('https://api.jup.ag/price/v3');
37
+ expect(config.pollIntervalMs).toBe(60_000);
38
+ expect(config.requestTimeoutMs).toBe(10_000);
39
+ expect(config.maxConsecutiveFailures).toBe(10);
40
+ });
41
+ it('overrides config', () => {
42
+ configurePriceOracle({ pollIntervalMs: 5_000, maxConsecutiveFailures: 3 });
43
+ const config = getPriceOracleConfig();
44
+ expect(config.pollIntervalMs).toBe(5_000);
45
+ expect(config.maxConsecutiveFailures).toBe(3);
46
+ });
47
+ it('reads API key from env', () => {
48
+ process.env.JUPITER_API_KEY = 'test-key-123';
49
+ const config = getPriceOracleConfig();
50
+ expect(config.apiKey).toBe('test-key-123');
51
+ delete process.env.JUPITER_API_KEY;
52
+ });
53
+ });
54
+ describe('fetchRvuiPrice', () => {
55
+ const originalFetch = globalThis.fetch;
56
+ beforeEach(() => {
57
+ delete process.env.JUPITER_API_KEY;
58
+ });
59
+ afterEach(() => {
60
+ globalThis.fetch = originalFetch;
61
+ configurePriceOracle({ apiKey: '' });
62
+ });
63
+ it('returns null when API key is not configured', async () => {
64
+ const result = await fetchRvuiPrice();
65
+ expect(result).toBeNull();
66
+ });
67
+ it('returns price data on success', async () => {
68
+ configurePriceOracle({ apiKey: 'test-key' });
69
+ const mintAddress = '4Ysb1gkz21FD2B9P8P5Pm8bHh4CAMKYU1L528e1MigPo';
70
+ globalThis.fetch = vi.fn().mockResolvedValue({
71
+ ok: true,
72
+ status: 200,
73
+ json: () => Promise.resolve({
74
+ [mintAddress]: {
75
+ createdAt: '2026-01-01T00:00:00Z',
76
+ liquidity: 50_000,
77
+ usdPrice: 0.0042,
78
+ blockId: 123456,
79
+ decimals: 6,
80
+ priceChange24h: -2.5,
81
+ },
82
+ }),
83
+ });
84
+ const result = await fetchRvuiPrice();
85
+ expect(result).toEqual({
86
+ priceUsd: 0.0042,
87
+ liquidity: 50_000,
88
+ blockId: 123456,
89
+ priceChange24h: -2.5,
90
+ });
91
+ expect(globalThis.fetch).toHaveBeenCalledWith(expect.stringContaining(mintAddress), expect.objectContaining({
92
+ headers: { 'x-api-key': 'test-key' },
93
+ }));
94
+ });
95
+ it('returns null on 429 rate limit', async () => {
96
+ configurePriceOracle({ apiKey: 'test-key' });
97
+ globalThis.fetch = vi.fn().mockResolvedValue({ ok: false, status: 429 });
98
+ const result = await fetchRvuiPrice();
99
+ expect(result).toBeNull();
100
+ });
101
+ it('returns null on 401 unauthorized', async () => {
102
+ configurePriceOracle({ apiKey: 'test-key' });
103
+ globalThis.fetch = vi.fn().mockResolvedValue({ ok: false, status: 401 });
104
+ const result = await fetchRvuiPrice();
105
+ expect(result).toBeNull();
106
+ });
107
+ it('returns null on other HTTP errors', async () => {
108
+ configurePriceOracle({ apiKey: 'test-key' });
109
+ globalThis.fetch = vi.fn().mockResolvedValue({ ok: false, status: 500 });
110
+ const result = await fetchRvuiPrice();
111
+ expect(result).toBeNull();
112
+ });
113
+ it('returns null when token has no price data', async () => {
114
+ configurePriceOracle({ apiKey: 'test-key' });
115
+ globalThis.fetch = vi.fn().mockResolvedValue({
116
+ ok: true,
117
+ status: 200,
118
+ json: () => Promise.resolve({}),
119
+ });
120
+ const result = await fetchRvuiPrice();
121
+ expect(result).toBeNull();
122
+ });
123
+ it('returns null on network error', async () => {
124
+ configurePriceOracle({ apiKey: 'test-key' });
125
+ globalThis.fetch = vi.fn().mockRejectedValue(new Error('Network error'));
126
+ const result = await fetchRvuiPrice();
127
+ expect(result).toBeNull();
128
+ });
129
+ it('returns null when mint address is empty', async () => {
130
+ configurePriceOracle({ apiKey: 'test-key' });
131
+ mockGetRevealCoinConfig.mockReturnValueOnce({ network: 'mainnet-beta' });
132
+ const result = await fetchRvuiPrice();
133
+ expect(result).toBeNull();
134
+ });
135
+ });
136
+ describe('recordPriceFromJupiter', () => {
137
+ const originalFetch = globalThis.fetch;
138
+ afterEach(() => {
139
+ globalThis.fetch = originalFetch;
140
+ configurePriceOracle({ apiKey: '' });
141
+ mockRecordPriceSnapshot.mockClear();
142
+ });
143
+ it('records snapshot and returns price on success', async () => {
144
+ configurePriceOracle({ apiKey: 'test-key' });
145
+ const mintAddress = '4Ysb1gkz21FD2B9P8P5Pm8bHh4CAMKYU1L528e1MigPo';
146
+ globalThis.fetch = vi.fn().mockResolvedValue({
147
+ ok: true,
148
+ status: 200,
149
+ json: () => Promise.resolve({
150
+ [mintAddress]: {
151
+ createdAt: '2026-01-01T00:00:00Z',
152
+ liquidity: 50_000,
153
+ usdPrice: 0.0042,
154
+ blockId: 123456,
155
+ decimals: 6,
156
+ priceChange24h: null,
157
+ },
158
+ }),
159
+ });
160
+ const result = await recordPriceFromJupiter();
161
+ expect(result).toBe(0.0042);
162
+ expect(mockRecordPriceSnapshot).toHaveBeenCalledWith(0.0042, 'jupiter-v3');
163
+ });
164
+ it('returns null when fetch fails', async () => {
165
+ const result = await recordPriceFromJupiter();
166
+ expect(result).toBeNull();
167
+ expect(mockRecordPriceSnapshot).not.toHaveBeenCalled();
168
+ });
169
+ });
170
+ describe('rvuiToUsd', () => {
171
+ afterEach(() => {
172
+ mockGetTwapPrice.mockClear();
173
+ });
174
+ it('converts RVUI to USD using TWAP', async () => {
175
+ mockGetTwapPrice.mockResolvedValue(0.005);
176
+ const result = await rvuiToUsd(1000);
177
+ expect(result).toBe(5);
178
+ });
179
+ it('returns null when TWAP is unavailable', async () => {
180
+ mockGetTwapPrice.mockResolvedValue(null);
181
+ const result = await rvuiToUsd(1000);
182
+ expect(result).toBeNull();
183
+ });
184
+ });
185
+ describe('usdToRvui', () => {
186
+ afterEach(() => {
187
+ mockGetTwapPrice.mockClear();
188
+ });
189
+ it('converts USD to RVUI using TWAP', async () => {
190
+ mockGetTwapPrice.mockResolvedValue(0.005);
191
+ const result = await usdToRvui(5);
192
+ expect(result).toBe(1000);
193
+ });
194
+ it('returns null when TWAP is unavailable', async () => {
195
+ mockGetTwapPrice.mockResolvedValue(null);
196
+ const result = await usdToRvui(5);
197
+ expect(result).toBeNull();
198
+ });
199
+ it('returns null when TWAP is zero', async () => {
200
+ mockGetTwapPrice.mockResolvedValue(0);
201
+ const result = await usdToRvui(5);
202
+ expect(result).toBeNull();
203
+ });
204
+ });
205
+ describe('polling lifecycle', () => {
206
+ afterEach(() => {
207
+ stopPriceOracle();
208
+ configurePriceOracle({ apiKey: '' });
209
+ });
210
+ it('reports not running initially', () => {
211
+ expect(isPriceOracleRunning()).toBe(false);
212
+ });
213
+ it('does not start without API key', () => {
214
+ startPriceOracle();
215
+ expect(isPriceOracleRunning()).toBe(false);
216
+ });
217
+ it('starts and stops with API key', () => {
218
+ configurePriceOracle({ apiKey: 'test-key', pollIntervalMs: 60_000 });
219
+ startPriceOracle();
220
+ expect(isPriceOracleRunning()).toBe(true);
221
+ stopPriceOracle();
222
+ expect(isPriceOracleRunning()).toBe(false);
223
+ });
224
+ it('prevents duplicate starts', () => {
225
+ configurePriceOracle({ apiKey: 'test-key', pollIntervalMs: 60_000 });
226
+ startPriceOracle();
227
+ startPriceOracle(); // should warn, not create second timer
228
+ expect(isPriceOracleRunning()).toBe(true);
229
+ stopPriceOracle();
230
+ expect(isPriceOracleRunning()).toBe(false);
231
+ });
232
+ it('stop is idempotent', () => {
233
+ stopPriceOracle();
234
+ stopPriceOracle();
235
+ expect(isPriceOracleRunning()).toBe(false);
236
+ });
237
+ });
238
+ //# sourceMappingURL=oracle.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oracle.test.js","sourceRoot":"","sources":["../../../src/revealcoin/__tests__/oracle.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=safeguards.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safeguards.test.d.ts","sourceRoot":"","sources":["../../../src/revealcoin/__tests__/safeguards.test.ts"],"names":[],"mappings":""}