@diviswap/sdk 1.7.12 → 1.7.14
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.
- package/dist/cli/index.js +8 -2
- package/dist/cli/templates/nextjs-app/actions.ts.hbs +32 -32
- package/dist/cli/templates/nextjs-app/api-hooks.ts.hbs +10 -10
- package/dist/cli/templates/nextjs-app/api-route.ts.hbs +67 -67
- package/dist/cli/templates/nextjs-app/auth-context.tsx.hbs +1 -1
- package/dist/cli/templates/nextjs-app/client.ts.hbs +10 -10
- package/dist/cli/templates/nextjs-app/dashboard-hooks.ts.hbs +7 -7
- package/dist/cli/templates/nextjs-app/example-page.tsx.hbs +9 -9
- package/dist/cli/templates/nextjs-app/hooks.ts.hbs +7 -7
- package/dist/cli/templates/nextjs-app/kyc-hooks.ts.hbs +3 -3
- package/dist/cli/templates/nextjs-app/kyc-wizard.css.hbs +16 -16
- package/dist/cli/templates/nextjs-app/kyc-wizard.tsx.hbs +25 -25
- package/dist/cli/templates/nextjs-app/layout-wrapper.tsx.hbs +4 -4
- package/dist/cli/templates/nextjs-app/layout.tsx.hbs +4 -4
- package/dist/cli/templates/nextjs-app/middleware.ts.hbs +15 -15
- package/dist/cli/templates/nextjs-app/provider-wrapper.tsx.hbs +4 -4
- package/dist/cli/templates/nextjs-app/provider.tsx.hbs +21 -21
- package/dist/cli/templates/nextjs-app/setup-provider.tsx.hbs +4 -4
- package/dist/cli/templates/react/api-client-wrapper.ts.hbs +14 -14
- package/dist/cli/templates/react/example.tsx.hbs +6 -6
- package/dist/cli/templates/react/tanstack-hooks.ts.hbs +14 -14
- package/dist/cli/templates/webhooks/nextjs.hbs +3 -3
- package/package.json +2 -1
- package/src/cli/templates/index.ts +13 -2
- package/src/cli/templates/nextjs-app/actions.ts.hbs +32 -32
- package/src/cli/templates/nextjs-app/api-hooks.ts.hbs +10 -10
- package/src/cli/templates/nextjs-app/api-route.ts.hbs +67 -67
- package/src/cli/templates/nextjs-app/auth-context.tsx.hbs +1 -1
- package/src/cli/templates/nextjs-app/client.ts.hbs +10 -10
- package/src/cli/templates/nextjs-app/dashboard-hooks.ts.hbs +7 -7
- package/src/cli/templates/nextjs-app/example-page.tsx.hbs +9 -9
- package/src/cli/templates/nextjs-app/hooks.ts.hbs +7 -7
- package/src/cli/templates/nextjs-app/kyc-hooks.ts.hbs +3 -3
- package/src/cli/templates/nextjs-app/kyc-wizard.css.hbs +16 -16
- package/src/cli/templates/nextjs-app/kyc-wizard.tsx.hbs +25 -25
- package/src/cli/templates/nextjs-app/layout-wrapper.tsx.hbs +4 -4
- package/src/cli/templates/nextjs-app/layout.tsx.hbs +4 -4
- package/src/cli/templates/nextjs-app/middleware.ts.hbs +15 -15
- package/src/cli/templates/nextjs-app/provider-wrapper.tsx.hbs +4 -4
- package/src/cli/templates/nextjs-app/provider.tsx.hbs +21 -21
- package/src/cli/templates/nextjs-app/setup-provider.tsx.hbs +4 -4
- package/src/cli/templates/react/api-client-wrapper.ts.hbs +14 -14
- package/src/cli/templates/react/example.tsx.hbs +6 -6
- package/src/cli/templates/react/tanstack-hooks.ts.hbs +14 -14
- package/src/cli/templates/webhooks/nextjs.hbs +3 -3
|
@@ -6,7 +6,7 @@ import type { User, Transaction, Payee, TransactionStatus } from './lbx-types';
|
|
|
6
6
|
import io, { Socket } from 'socket.io-client';
|
|
7
7
|
{{/if}}
|
|
8
8
|
|
|
9
|
-
interface
|
|
9
|
+
interface LiberExContextValue {
|
|
10
10
|
// Customer state (for partner authentication)
|
|
11
11
|
customerId: string | null;
|
|
12
12
|
customerEmail: string | null;
|
|
@@ -63,17 +63,17 @@ interface DiviswapContextValue {
|
|
|
63
63
|
{{/if}}
|
|
64
64
|
}
|
|
65
65
|
|
|
66
|
-
const
|
|
66
|
+
const LiberExContext = createContext<LiberExContextValue | null>(null);
|
|
67
67
|
|
|
68
68
|
// API client class
|
|
69
|
-
class
|
|
70
|
-
constructor(private baseUrl: string = '/api/
|
|
69
|
+
class LiberExClient {
|
|
70
|
+
constructor(private baseUrl: string = '/api/liberex') {}
|
|
71
71
|
|
|
72
72
|
private async request<T = any>(
|
|
73
73
|
endpoint: string,
|
|
74
74
|
options: RequestInit = {}
|
|
75
75
|
): Promise<T> {
|
|
76
|
-
const response = await fetch(
|
|
76
|
+
const response = await fetch(this.baseUrl + endpoint, {
|
|
77
77
|
...options,
|
|
78
78
|
headers: {
|
|
79
79
|
'Content-Type': 'application/json',
|
|
@@ -106,7 +106,7 @@ class DiviswapClient {
|
|
|
106
106
|
|
|
107
107
|
async getCustomerStatus(customerId: string, customerEmail: string) {
|
|
108
108
|
try {
|
|
109
|
-
return await this.request(`?resource=customerStatus&customerId
|
|
109
|
+
return await this.request(`?resource=customerStatus&customerId=${encodeURIComponent(customerId)}&customerEmail=${encodeURIComponent(customerEmail)}`);
|
|
110
110
|
} catch {
|
|
111
111
|
return null;
|
|
112
112
|
}
|
|
@@ -132,16 +132,16 @@ class DiviswapClient {
|
|
|
132
132
|
...(params.type && { type: params.type }),
|
|
133
133
|
}),
|
|
134
134
|
});
|
|
135
|
-
return this.request(
|
|
135
|
+
return this.request(`?${searchParams}`);
|
|
136
136
|
}
|
|
137
137
|
|
|
138
138
|
async getTransaction(id: string) {
|
|
139
|
-
return this.request(`?resource=transaction&id
|
|
139
|
+
return this.request(`?resource=transaction&id=${id}`);
|
|
140
140
|
}
|
|
141
141
|
|
|
142
142
|
// Payee methods
|
|
143
143
|
async getPayees(customerId: string, customerEmail: string) {
|
|
144
|
-
return this.request(`?resource=payees&customerId
|
|
144
|
+
return this.request(`?resource=payees&customerId=${encodeURIComponent(customerId)}&customerEmail=${encodeURIComponent(customerEmail)}`);
|
|
145
145
|
}
|
|
146
146
|
|
|
147
147
|
async createPayee(data: any) {
|
|
@@ -152,7 +152,7 @@ class DiviswapClient {
|
|
|
152
152
|
}
|
|
153
153
|
|
|
154
154
|
async deletePayee(id: string, customerId: string, customerEmail: string) {
|
|
155
|
-
return this.request(`?resource=payee&id
|
|
155
|
+
return this.request(`?resource=payee&id=${id}&customerId=${encodeURIComponent(customerId)}&customerEmail=${encodeURIComponent(customerEmail)}`, {
|
|
156
156
|
method: 'DELETE',
|
|
157
157
|
});
|
|
158
158
|
}
|
|
@@ -168,7 +168,7 @@ class DiviswapClient {
|
|
|
168
168
|
{{/if}}
|
|
169
169
|
}
|
|
170
170
|
|
|
171
|
-
export function
|
|
171
|
+
export function LiberExProvider({ children }: { children: React.ReactNode }) {
|
|
172
172
|
const [customerId, setCustomerId] = useState<string | null>(null);
|
|
173
173
|
const [customerEmail, setCustomerEmail] = useState<string | null>(null);
|
|
174
174
|
const [loading, setLoading] = useState(false);
|
|
@@ -177,7 +177,7 @@ export function DiviswapProvider({ children }: { children: React.ReactNode }) {
|
|
|
177
177
|
const [socket, setSocket] = useState<Socket | null>(null);
|
|
178
178
|
{{/if}}
|
|
179
179
|
|
|
180
|
-
const client = new
|
|
180
|
+
const client = new LiberExClient('/api/liberex');
|
|
181
181
|
|
|
182
182
|
// Initialize with demo customer for development
|
|
183
183
|
useEffect(() => {
|
|
@@ -192,7 +192,7 @@ export function DiviswapProvider({ children }: { children: React.ReactNode }) {
|
|
|
192
192
|
useEffect(() => {
|
|
193
193
|
if (customerId && customerEmail) {
|
|
194
194
|
const socketInstance = io(
|
|
195
|
-
process.env.
|
|
195
|
+
process.env.NEXT_PUBLIC_LIBEREX_WS_URL || 'wss://ws.liberex.io',
|
|
196
196
|
{
|
|
197
197
|
auth: {
|
|
198
198
|
customerId,
|
|
@@ -205,11 +205,11 @@ export function DiviswapProvider({ children }: { children: React.ReactNode }) {
|
|
|
205
205
|
);
|
|
206
206
|
|
|
207
207
|
socketInstance.on('connect', () => {
|
|
208
|
-
console.log('Connected to
|
|
208
|
+
console.log('Connected to LiberEx WebSocket');
|
|
209
209
|
});
|
|
210
210
|
|
|
211
211
|
socketInstance.on('disconnect', () => {
|
|
212
|
-
console.log('Disconnected from
|
|
212
|
+
console.log('Disconnected from LiberEx WebSocket');
|
|
213
213
|
});
|
|
214
214
|
|
|
215
215
|
socketInstance.on('transaction:update', (data) => {
|
|
@@ -368,7 +368,7 @@ export function DiviswapProvider({ children }: { children: React.ReactNode }) {
|
|
|
368
368
|
}, [socket]);
|
|
369
369
|
{{/if}}
|
|
370
370
|
|
|
371
|
-
const value:
|
|
371
|
+
const value: LiberExContextValue = {
|
|
372
372
|
customerId,
|
|
373
373
|
customerEmail,
|
|
374
374
|
loading,
|
|
@@ -393,16 +393,16 @@ export function DiviswapProvider({ children }: { children: React.ReactNode }) {
|
|
|
393
393
|
};
|
|
394
394
|
|
|
395
395
|
return (
|
|
396
|
-
<
|
|
396
|
+
<LiberExContext.Provider value={value}>
|
|
397
397
|
{children}
|
|
398
|
-
</
|
|
398
|
+
</LiberExContext.Provider>
|
|
399
399
|
);
|
|
400
400
|
}
|
|
401
401
|
|
|
402
|
-
export function
|
|
403
|
-
const context = useContext(
|
|
402
|
+
export function useLiberEx() {
|
|
403
|
+
const context = useContext(LiberExContext);
|
|
404
404
|
if (!context) {
|
|
405
|
-
throw new Error('
|
|
405
|
+
throw new Error('useLiberEx must be used within a LiberExProvider');
|
|
406
406
|
}
|
|
407
407
|
return context;
|
|
408
408
|
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Add this to your root layout.tsx to enable
|
|
2
|
+
* Add this to your root layout.tsx to enable LiberEx functionality
|
|
3
3
|
*
|
|
4
4
|
* Example:
|
|
5
5
|
*
|
|
6
|
-
* import {
|
|
6
|
+
* import { LiberExProvider } from '@99darwin/liberex-sdk/react';
|
|
7
7
|
*
|
|
8
8
|
* export default function RootLayout({
|
|
9
9
|
* children,
|
|
@@ -13,9 +13,9 @@
|
|
|
13
13
|
* return (
|
|
14
14
|
* <html lang="en">
|
|
15
15
|
* <body>
|
|
16
|
-
* <
|
|
16
|
+
* <LiberExProvider>
|
|
17
17
|
* {children}
|
|
18
|
-
* </
|
|
18
|
+
* </LiberExProvider>
|
|
19
19
|
* </body>
|
|
20
20
|
* </html>
|
|
21
21
|
* );
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* API client wrapper for custom backend integration
|
|
3
|
-
* This allows you to proxy
|
|
3
|
+
* This allows you to proxy LiberEx API calls through your own backend
|
|
4
4
|
* for additional security and custom logic
|
|
5
5
|
*/
|
|
6
6
|
|
|
@@ -18,10 +18,10 @@ class ApiClient {
|
|
|
18
18
|
private async request<T = any>(endpoint: string, options: ApiOptions = {}): Promise<T> {
|
|
19
19
|
const { params, ...fetchOptions } = options;
|
|
20
20
|
|
|
21
|
-
let url =
|
|
21
|
+
let url = this.baseUrl + endpoint;
|
|
22
22
|
if (params) {
|
|
23
23
|
const searchParams = new URLSearchParams(params);
|
|
24
|
-
url +=
|
|
24
|
+
url += '?' + searchParams.toString();
|
|
25
25
|
}
|
|
26
26
|
|
|
27
27
|
const response = await fetch(url, {
|
|
@@ -34,52 +34,52 @@ class ApiClient {
|
|
|
34
34
|
|
|
35
35
|
if (!response.ok) {
|
|
36
36
|
const error = await response.json().catch(() => ({ message: 'Request failed' }));
|
|
37
|
-
throw new Error(error.message || `HTTP
|
|
37
|
+
throw new Error(error.message || `HTTP ${response.status}`);
|
|
38
38
|
}
|
|
39
39
|
|
|
40
40
|
return response.json();
|
|
41
41
|
}
|
|
42
42
|
|
|
43
|
-
//
|
|
44
|
-
|
|
43
|
+
// LiberEx-specific endpoints
|
|
44
|
+
liberex = {
|
|
45
45
|
// Authentication
|
|
46
46
|
login: (email: string, password: string) =>
|
|
47
|
-
this.request('/
|
|
47
|
+
this.request('/liberex', {
|
|
48
48
|
method: 'POST',
|
|
49
49
|
body: JSON.stringify({ action: 'login', email, password }),
|
|
50
50
|
}),
|
|
51
51
|
|
|
52
52
|
logout: () =>
|
|
53
|
-
this.request('/
|
|
53
|
+
this.request('/liberex', {
|
|
54
54
|
method: 'POST',
|
|
55
55
|
body: JSON.stringify({ action: 'logout' }),
|
|
56
56
|
}),
|
|
57
57
|
|
|
58
58
|
getSession: () =>
|
|
59
|
-
this.request('/
|
|
59
|
+
this.request('/liberex', { params: { resource: 'session' } }),
|
|
60
60
|
|
|
61
61
|
// Transactions
|
|
62
62
|
createTransaction: (data: any) =>
|
|
63
|
-
this.request('/
|
|
63
|
+
this.request('/liberex', {
|
|
64
64
|
method: 'POST',
|
|
65
65
|
body: JSON.stringify({ action: 'createTransaction', ...data }),
|
|
66
66
|
}),
|
|
67
67
|
|
|
68
68
|
getTransactions: (filters?: any) =>
|
|
69
|
-
this.request('/
|
|
69
|
+
this.request('/liberex', { params: { resource: 'transactions', ...filters } }),
|
|
70
70
|
|
|
71
71
|
// Payees
|
|
72
72
|
createPayee: (data: any) =>
|
|
73
|
-
this.request('/
|
|
73
|
+
this.request('/liberex', {
|
|
74
74
|
method: 'POST',
|
|
75
75
|
body: JSON.stringify({ action: 'createPayee', ...data }),
|
|
76
76
|
}),
|
|
77
77
|
|
|
78
78
|
getPayees: () =>
|
|
79
|
-
this.request('/
|
|
79
|
+
this.request('/liberex', { params: { resource: 'payees' } }),
|
|
80
80
|
|
|
81
81
|
deletePayee: (id: string) =>
|
|
82
|
-
this.request('/
|
|
82
|
+
this.request('/liberex', {
|
|
83
83
|
method: 'DELETE',
|
|
84
84
|
params: { resource: 'payee', id },
|
|
85
85
|
}),
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import {
|
|
2
|
+
import { LiberExProvider, useLiberEx } from '@99darwin/liberex-sdk/react';
|
|
3
3
|
import { apiClient } from './api-client';
|
|
4
4
|
|
|
5
5
|
function TransactionDemo() {
|
|
@@ -11,7 +11,7 @@ function TransactionDemo() {
|
|
|
11
11
|
logout,
|
|
12
12
|
createTransaction,
|
|
13
13
|
getTransactions
|
|
14
|
-
} =
|
|
14
|
+
} = useLiberEx();
|
|
15
15
|
|
|
16
16
|
const handleLogin = async () => {
|
|
17
17
|
try {
|
|
@@ -44,8 +44,8 @@ function TransactionDemo() {
|
|
|
44
44
|
}
|
|
45
45
|
|
|
46
46
|
return (
|
|
47
|
-
<div className="
|
|
48
|
-
<h1>
|
|
47
|
+
<div className="liberex-demo">
|
|
48
|
+
<h1>LiberEx Demo</h1>
|
|
49
49
|
|
|
50
50
|
{!user ? (
|
|
51
51
|
<button onClick={handleLogin}>Login</button>
|
|
@@ -62,8 +62,8 @@ function TransactionDemo() {
|
|
|
62
62
|
|
|
63
63
|
export default function App() {
|
|
64
64
|
return (
|
|
65
|
-
<
|
|
65
|
+
<LiberExProvider>
|
|
66
66
|
<TransactionDemo />
|
|
67
|
-
</
|
|
67
|
+
</LiberExProvider>
|
|
68
68
|
);
|
|
69
69
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Example of using TanStack Query with
|
|
2
|
+
* Example of using TanStack Query with LiberEx API routes
|
|
3
3
|
* This provides automatic caching, background refetching, and optimistic updates
|
|
4
4
|
*/
|
|
5
5
|
|
|
@@ -8,17 +8,17 @@ import { apiClient } from './api-client';
|
|
|
8
8
|
|
|
9
9
|
// Query keys for cache invalidation
|
|
10
10
|
const queryKeys = {
|
|
11
|
-
user: ['
|
|
12
|
-
transactions: (filters?: any) => ['
|
|
13
|
-
payees: ['
|
|
14
|
-
fees: (amount: number) => ['
|
|
11
|
+
user: ['liberex', 'user'],
|
|
12
|
+
transactions: (filters?: any) => ['liberex', 'transactions', filters],
|
|
13
|
+
payees: ['liberex', 'payees'],
|
|
14
|
+
fees: (amount: number) => ['liberex', 'fees', amount],
|
|
15
15
|
};
|
|
16
16
|
|
|
17
17
|
// User hooks
|
|
18
18
|
export function useUser() {
|
|
19
19
|
return useQuery({
|
|
20
20
|
queryKey: queryKeys.user,
|
|
21
|
-
queryFn: () => apiClient.
|
|
21
|
+
queryFn: () => apiClient.liberex.getSession(),
|
|
22
22
|
retry: false,
|
|
23
23
|
staleTime: 5 * 60 * 1000, // 5 minutes
|
|
24
24
|
});
|
|
@@ -29,7 +29,7 @@ export function useLogin() {
|
|
|
29
29
|
|
|
30
30
|
return useMutation({
|
|
31
31
|
mutationFn: ({ email, password }: { email: string; password: string }) =>
|
|
32
|
-
apiClient.
|
|
32
|
+
apiClient.liberex.login(email, password),
|
|
33
33
|
onSuccess: (data) => {
|
|
34
34
|
queryClient.setQueryData(queryKeys.user, data.user);
|
|
35
35
|
queryClient.invalidateQueries({ queryKey: queryKeys.transactions() });
|
|
@@ -42,7 +42,7 @@ export function useLogout() {
|
|
|
42
42
|
const queryClient = useQueryClient();
|
|
43
43
|
|
|
44
44
|
return useMutation({
|
|
45
|
-
mutationFn: () => apiClient.
|
|
45
|
+
mutationFn: () => apiClient.liberex.logout(),
|
|
46
46
|
onSuccess: () => {
|
|
47
47
|
queryClient.clear(); // Clear all cached data
|
|
48
48
|
},
|
|
@@ -55,7 +55,7 @@ export function useTransactions(filters?: any) {
|
|
|
55
55
|
|
|
56
56
|
return useQuery({
|
|
57
57
|
queryKey: queryKeys.transactions(filters),
|
|
58
|
-
queryFn: () => apiClient.
|
|
58
|
+
queryFn: () => apiClient.liberex.getTransactions(filters),
|
|
59
59
|
enabled: !!user, // Only fetch if user is authenticated
|
|
60
60
|
staleTime: 30 * 1000, // 30 seconds
|
|
61
61
|
});
|
|
@@ -65,7 +65,7 @@ export function useCreateTransaction() {
|
|
|
65
65
|
const queryClient = useQueryClient();
|
|
66
66
|
|
|
67
67
|
return useMutation({
|
|
68
|
-
mutationFn: (data: any) => apiClient.
|
|
68
|
+
mutationFn: (data: any) => apiClient.liberex.createTransaction(data),
|
|
69
69
|
onSuccess: () => {
|
|
70
70
|
// Invalidate and refetch transactions
|
|
71
71
|
queryClient.invalidateQueries({ queryKey: queryKeys.transactions() });
|
|
@@ -82,7 +82,7 @@ export function usePayees() {
|
|
|
82
82
|
|
|
83
83
|
return useQuery({
|
|
84
84
|
queryKey: queryKeys.payees,
|
|
85
|
-
queryFn: () => apiClient.
|
|
85
|
+
queryFn: () => apiClient.liberex.getPayees(),
|
|
86
86
|
enabled: !!user,
|
|
87
87
|
staleTime: 60 * 1000, // 1 minute
|
|
88
88
|
});
|
|
@@ -92,7 +92,7 @@ export function useCreatePayee() {
|
|
|
92
92
|
const queryClient = useQueryClient();
|
|
93
93
|
|
|
94
94
|
return useMutation({
|
|
95
|
-
mutationFn: (data: any) => apiClient.
|
|
95
|
+
mutationFn: (data: any) => apiClient.liberex.createPayee(data),
|
|
96
96
|
onSuccess: (newPayee) => {
|
|
97
97
|
// Optimistically add the new payee to the cache
|
|
98
98
|
queryClient.setQueryData(queryKeys.payees, (old: any[] = []) => {
|
|
@@ -106,7 +106,7 @@ export function useDeletePayee() {
|
|
|
106
106
|
const queryClient = useQueryClient();
|
|
107
107
|
|
|
108
108
|
return useMutation({
|
|
109
|
-
mutationFn: (id: string) => apiClient.
|
|
109
|
+
mutationFn: (id: string) => apiClient.liberex.deletePayee(id),
|
|
110
110
|
onMutate: async (deletedId) => {
|
|
111
111
|
// Cancel in-flight queries
|
|
112
112
|
await queryClient.cancelQueries({ queryKey: queryKeys.payees });
|
|
@@ -139,7 +139,7 @@ export function useDeletePayee() {
|
|
|
139
139
|
export function useFeeCalculation(amount: number, enabled = true) {
|
|
140
140
|
return useQuery({
|
|
141
141
|
queryKey: queryKeys.fees(amount),
|
|
142
|
-
queryFn: () => apiClient.
|
|
142
|
+
queryFn: () => apiClient.liberex.calculateFees(amount),
|
|
143
143
|
enabled: enabled && amount > 0,
|
|
144
144
|
staleTime: 5 * 60 * 1000, // 5 minutes
|
|
145
145
|
gcTime: 10 * 60 * 1000, // 10 minutes (formerly cacheTime)
|
|
@@ -24,7 +24,7 @@ export async function POST(request: NextRequest) {
|
|
|
24
24
|
const rawBody = await request.text();
|
|
25
25
|
|
|
26
26
|
// Get signature from headers
|
|
27
|
-
const signature = request.headers.get('x-
|
|
27
|
+
const signature = request.headers.get('x-liberex-signature');
|
|
28
28
|
|
|
29
29
|
if (!signature) {
|
|
30
30
|
return NextResponse.json(
|
|
@@ -34,9 +34,9 @@ export async function POST(request: NextRequest) {
|
|
|
34
34
|
}
|
|
35
35
|
|
|
36
36
|
// Verify signature
|
|
37
|
-
const webhookSecret = process.env.
|
|
37
|
+
const webhookSecret = process.env.LIBEREX_WEBHOOK_SECRET;
|
|
38
38
|
if (!webhookSecret) {
|
|
39
|
-
console.error('
|
|
39
|
+
console.error('LIBEREX_WEBHOOK_SECRET not configured');
|
|
40
40
|
return NextResponse.json(
|
|
41
41
|
{ error: 'Webhook secret not configured' },
|
|
42
42
|
{ status: 500 }
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@diviswap/sdk",
|
|
3
|
-
"version": "1.7.
|
|
3
|
+
"version": "1.7.14",
|
|
4
4
|
"description": "Official Diviswap SDK - Crypto rails made simple",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"module": "./dist/index.mjs",
|
|
@@ -71,6 +71,7 @@
|
|
|
71
71
|
"typescript": "^5.7.3"
|
|
72
72
|
},
|
|
73
73
|
"dependencies": {
|
|
74
|
+
"@diviswap/sdk": "1.7.12",
|
|
74
75
|
"@solana/wallet-adapter-base": "0.9.27",
|
|
75
76
|
"@solana/wallet-adapter-react": "0.15.39",
|
|
76
77
|
"@solana/wallet-adapter-react-ui": "0.9.39",
|
|
@@ -49,8 +49,19 @@ export function getTemplate(templateName: string, data: any): string {
|
|
|
49
49
|
// Fallback to inline templates
|
|
50
50
|
templateSource = getInlineTemplateSource(templateName);
|
|
51
51
|
}
|
|
52
|
-
|
|
53
|
-
template
|
|
52
|
+
|
|
53
|
+
// Escape JavaScript template literals to prevent Handlebars from interpreting them
|
|
54
|
+
// Replace ${ with a placeholder, compile, then replace back
|
|
55
|
+
const PLACEHOLDER = '__TEMPLATE_LITERAL_START__';
|
|
56
|
+
templateSource = templateSource.replace(/\$\{/g, PLACEHOLDER);
|
|
57
|
+
|
|
58
|
+
const compiledTemplate = Handlebars.compile(templateSource);
|
|
59
|
+
|
|
60
|
+
// Wrap to restore ${ after compilation
|
|
61
|
+
template = (data: any) => {
|
|
62
|
+
const result = compiledTemplate(data);
|
|
63
|
+
return result.replace(new RegExp(PLACEHOLDER, 'g'), '${');
|
|
64
|
+
};
|
|
54
65
|
templateCache.set(templateName, template);
|
|
55
66
|
}
|
|
56
67
|
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
'use server';
|
|
2
2
|
|
|
3
|
-
import {
|
|
4
|
-
import type { Transaction, Payee } from '@
|
|
3
|
+
import { LiberEx } from '@99darwin/liberex-sdk';
|
|
4
|
+
import type { Transaction, Payee } from '@99darwin/liberex-sdk';
|
|
5
5
|
import { revalidatePath } from 'next/cache';
|
|
6
6
|
import { cookies } from 'next/headers';
|
|
7
7
|
|
|
8
|
-
// Initialize
|
|
9
|
-
function
|
|
10
|
-
return
|
|
11
|
-
apiKey: process.env.
|
|
12
|
-
clientId: process.env.
|
|
13
|
-
environment: (process.env.
|
|
8
|
+
// Initialize LiberEx SDK
|
|
9
|
+
function getLiberEx() {
|
|
10
|
+
return LiberEx.init({
|
|
11
|
+
apiKey: process.env.LIBEREX_API_KEY!,
|
|
12
|
+
clientId: process.env.LIBEREX_CLIENT_ID!,
|
|
13
|
+
environment: (process.env.NEXT_PUBLIC_LIBEREX_ENV as 'production' | 'sandbox') || 'production',
|
|
14
14
|
debug: true // Enable debug logging
|
|
15
15
|
});
|
|
16
16
|
}
|
|
@@ -18,7 +18,7 @@ function getDiviswap() {
|
|
|
18
18
|
// Helper to get session token from cookies
|
|
19
19
|
async function getSessionToken() {
|
|
20
20
|
const cookieStore = await cookies();
|
|
21
|
-
const session = cookieStore.get('
|
|
21
|
+
const session = cookieStore.get('liberex_session');
|
|
22
22
|
return session?.value;
|
|
23
23
|
}
|
|
24
24
|
|
|
@@ -39,7 +39,7 @@ export async function createTransactionAction(data: {
|
|
|
39
39
|
return { success: false, error: 'Not authenticated' };
|
|
40
40
|
}
|
|
41
41
|
|
|
42
|
-
const
|
|
42
|
+
const liberex = getLiberEx();
|
|
43
43
|
|
|
44
44
|
// Use the appropriate method based on transaction type
|
|
45
45
|
let transaction;
|
|
@@ -47,7 +47,7 @@ export async function createTransactionAction(data: {
|
|
|
47
47
|
// Note: Onramp is not yet available in v1 API
|
|
48
48
|
return { success: false, error: 'Onramp transactions are not yet available' };
|
|
49
49
|
} else {
|
|
50
|
-
transaction = await
|
|
50
|
+
transaction = await liberex.transactions.offramp({
|
|
51
51
|
amount: data.amount,
|
|
52
52
|
currency: data.currency || 'USD',
|
|
53
53
|
payeeId: data.payeeId!,
|
|
@@ -56,7 +56,7 @@ export async function createTransactionAction(data: {
|
|
|
56
56
|
});
|
|
57
57
|
}
|
|
58
58
|
|
|
59
|
-
revalidatePath('/
|
|
59
|
+
revalidatePath('/liberex');
|
|
60
60
|
return { success: true, transaction };
|
|
61
61
|
} catch (error) {
|
|
62
62
|
return {
|
|
@@ -78,8 +78,8 @@ export async function getTransactionsAction(filters?: {
|
|
|
78
78
|
return { success: false, error: 'Not authenticated' };
|
|
79
79
|
}
|
|
80
80
|
|
|
81
|
-
const
|
|
82
|
-
const transactions = await
|
|
81
|
+
const liberex = getLiberEx();
|
|
82
|
+
const transactions = await liberex.transactions.list(filters);
|
|
83
83
|
|
|
84
84
|
return { success: true, transactions };
|
|
85
85
|
} catch (error) {
|
|
@@ -98,8 +98,8 @@ export async function getPayeesAction() {
|
|
|
98
98
|
return { success: false, error: 'Not authenticated' };
|
|
99
99
|
}
|
|
100
100
|
|
|
101
|
-
const
|
|
102
|
-
const payees = await
|
|
101
|
+
const liberex = getLiberEx();
|
|
102
|
+
const payees = await liberex.payees.list();
|
|
103
103
|
|
|
104
104
|
return { success: true, payees };
|
|
105
105
|
} catch (error) {
|
|
@@ -122,8 +122,8 @@ export async function createPayeeAction(data: {
|
|
|
122
122
|
return { success: false, error: 'Not authenticated' };
|
|
123
123
|
}
|
|
124
124
|
|
|
125
|
-
const
|
|
126
|
-
const payee = await
|
|
125
|
+
const liberex = getLiberEx();
|
|
126
|
+
const payee = await liberex.payees.create({
|
|
127
127
|
nickname: data.nickname,
|
|
128
128
|
accountNumber: data.accountNumber,
|
|
129
129
|
routingNumber: data.routingNumber,
|
|
@@ -131,7 +131,7 @@ export async function createPayeeAction(data: {
|
|
|
131
131
|
setAsDefault: false
|
|
132
132
|
});
|
|
133
133
|
|
|
134
|
-
revalidatePath('/
|
|
134
|
+
revalidatePath('/liberex');
|
|
135
135
|
return { success: true, payee };
|
|
136
136
|
} catch (error) {
|
|
137
137
|
return {
|
|
@@ -148,10 +148,10 @@ export async function deletePayeeAction(payeeId: string) {
|
|
|
148
148
|
return { success: false, error: 'Not authenticated' };
|
|
149
149
|
}
|
|
150
150
|
|
|
151
|
-
const
|
|
152
|
-
await
|
|
151
|
+
const liberex = getLiberEx();
|
|
152
|
+
await liberex.payees.delete(payeeId);
|
|
153
153
|
|
|
154
|
-
revalidatePath('/
|
|
154
|
+
revalidatePath('/liberex');
|
|
155
155
|
return { success: true };
|
|
156
156
|
} catch (error) {
|
|
157
157
|
return {
|
|
@@ -169,8 +169,8 @@ export async function calculateFeesAction(data: {
|
|
|
169
169
|
currency?: string;
|
|
170
170
|
}) {
|
|
171
171
|
try {
|
|
172
|
-
const
|
|
173
|
-
const fees = await
|
|
172
|
+
const liberex = getLiberEx();
|
|
173
|
+
const fees = await liberex.fees.calculateFees({
|
|
174
174
|
amount: data.amount,
|
|
175
175
|
userId: undefined // Optional: for per-user fees
|
|
176
176
|
});
|
|
@@ -191,8 +191,8 @@ export async function getIntegratorFeesAction() {
|
|
|
191
191
|
return { success: false, error: 'Not authenticated' };
|
|
192
192
|
}
|
|
193
193
|
|
|
194
|
-
const
|
|
195
|
-
const fees = await
|
|
194
|
+
const liberex = getLiberEx();
|
|
195
|
+
const fees = await liberex.fees.getFees();
|
|
196
196
|
|
|
197
197
|
return { success: true, fees };
|
|
198
198
|
} catch (error) {
|
|
@@ -213,10 +213,10 @@ export async function updateIntegratorFeeAction(data: {
|
|
|
213
213
|
return { success: false, error: 'Not authenticated' };
|
|
214
214
|
}
|
|
215
215
|
|
|
216
|
-
const
|
|
217
|
-
const fee = await
|
|
216
|
+
const liberex = getLiberEx();
|
|
217
|
+
const fee = await liberex.fees.setFee(data);
|
|
218
218
|
|
|
219
|
-
revalidatePath('/
|
|
219
|
+
revalidatePath('/liberex');
|
|
220
220
|
return { success: true, fee };
|
|
221
221
|
} catch (error) {
|
|
222
222
|
return {
|
|
@@ -235,8 +235,8 @@ export async function getCurrentUserAction() {
|
|
|
235
235
|
return { success: false, user: null };
|
|
236
236
|
}
|
|
237
237
|
|
|
238
|
-
const
|
|
239
|
-
const user = await
|
|
238
|
+
const liberex = getLiberEx();
|
|
239
|
+
const user = await liberex.auth.getProfile();
|
|
240
240
|
|
|
241
241
|
return { success: true, user };
|
|
242
242
|
} catch (error) {
|
|
@@ -247,7 +247,7 @@ export async function getCurrentUserAction() {
|
|
|
247
247
|
// Utility action for checking API status
|
|
248
248
|
export async function checkApiStatusAction() {
|
|
249
249
|
try {
|
|
250
|
-
const
|
|
250
|
+
const liberex = getLiberEx();
|
|
251
251
|
// Note: Health check endpoint not available in SDK
|
|
252
252
|
return { success: true, status: 'OK' };
|
|
253
253
|
} catch (error) {
|