@meteraprotocol/minute-markets-sdk 0.1.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.
package/README.md ADDED
@@ -0,0 +1,67 @@
1
+ # `@meteraprotocol/minute-markets-sdk`
2
+
3
+ React SDK for approved Minute Markets partner integrations.
4
+
5
+ The SDK exposes the current Minute Markets wager experience, scoped theming, mandatory Minute
6
+ Markets attribution, and CIP-30 wallet detection. Transaction signing and
7
+ submission stay in the user's wallet.
8
+
9
+ ```tsx
10
+ import {
11
+ MinuteMarketsProvider,
12
+ MinuteMarketsTradeWidget,
13
+ } from '@meteraprotocol/minute-markets-sdk';
14
+ import '@meteraprotocol/minute-markets-sdk/styles.css';
15
+
16
+ export function MinuteMarket() {
17
+ return (
18
+ <MinuteMarketsProvider
19
+ partnerId="partner_example"
20
+ network="mainnet"
21
+ theme={{ accentColor: '#44bd9e', borderRadius: '18px' }}
22
+ >
23
+ <MinuteMarketsTradeWidget />
24
+ </MinuteMarketsProvider>
25
+ );
26
+ }
27
+ ```
28
+
29
+ Each staging, production, and localhost origin must be registered by Minute
30
+ Markets before it may call the SDK API.
31
+
32
+ ## Wallet ownership
33
+
34
+ By default, the SDK detects CIP-30 browser wallets under `window.cardano` and
35
+ renders its own connect controls. A host that already connected a wallet may
36
+ instead pass a structural adapter. Mesh `IWallet` instances satisfy the `api`
37
+ shape directly.
38
+
39
+ ```tsx
40
+ import {
41
+ createMeshWalletAdapter,
42
+ MinuteMarketsProvider,
43
+ MinuteMarketsTradeWidget,
44
+ } from '@meteraprotocol/minute-markets-sdk';
45
+
46
+ export function ExistingWalletIntegration({
47
+ wallet,
48
+ }: {
49
+ wallet: IWallet;
50
+ }) {
51
+ return (
52
+ <MinuteMarketsProvider
53
+ partnerId="partner_example"
54
+ network="preprod"
55
+ walletAdapter={createMeshWalletAdapter('Connected wallet', wallet)}
56
+ >
57
+ <MinuteMarketsTradeWidget />
58
+ </MinuteMarketsProvider>
59
+ );
60
+ }
61
+ ```
62
+
63
+ The provider maps `network="preprod"` to `https://minute-markets-preprod.vercel.app/`
64
+ and `network="mainnet"` to `https://www.minutemarkets.io/`. `apiBaseUrl` remains
65
+ available as an override for localhost and internal staging. Partners do not
66
+ configure eligibility or location headers; those checks belong to the hosted
67
+ Minute Markets API.
@@ -0,0 +1,8 @@
1
+ export { MinuteMarketsProvider, useMinuteMarketsWidgetState } from './provider.js';
2
+ export type { MinuteMarketsProviderProps } from './provider.js';
3
+ export { MinuteMarketsTradeWidget } from './widget.js';
4
+ export type { MinuteMarketsTradeWidgetProps } from './widget.js';
5
+ export type { MinuteMarketsBootstrap, MinuteMarketsError, MinuteMarketsEvent, MinuteMarketsMarketAsset, MinuteMarketsMarketInfo, MinuteMarketsMarketKey, MinuteMarketsMarketSnapshot, MinuteMarketsTheme, MinuteMarketsTradeOrder, MinuteMarketsWalletAdapter, MinuteMarketsWalletApi, MinuteMarketsWalletState, MinuteMarketsWidgetState, } from './types.js';
6
+ export { createCip30WalletApi, createMeshWalletAdapter } from './wallet.js';
7
+ export type { Cip30WalletApi, MeshLikeWallet } from './wallet.js';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,2BAA2B,EAAE,MAAM,eAAe,CAAC;AACnF,YAAY,EAAE,0BAA0B,EAAE,MAAM,eAAe,CAAC;AAChE,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AACvD,YAAY,EAAE,6BAA6B,EAAE,MAAM,aAAa,CAAC;AACjE,YAAY,EACV,sBAAsB,EACtB,kBAAkB,EAClB,kBAAkB,EAClB,wBAAwB,EACxB,uBAAuB,EACvB,sBAAsB,EACtB,2BAA2B,EAC3B,kBAAkB,EAClB,uBAAuB,EACvB,0BAA0B,EAC1B,sBAAsB,EACtB,wBAAwB,EACxB,wBAAwB,GACzB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAC5E,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,4 @@
1
+ export { MinuteMarketsProvider, useMinuteMarketsWidgetState } from './provider.js';
2
+ export { MinuteMarketsTradeWidget } from './widget.js';
3
+ export { createCip30WalletApi, createMeshWalletAdapter } from './wallet.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,2BAA2B,EAAE,MAAM,eAAe,CAAC;AAEnF,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAiBvD,OAAO,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,25 @@
1
+ import { type ReactNode } from 'react';
2
+ import { toThemeStyle } from './theme.js';
3
+ import type { MinuteMarketsEvent, MinuteMarketsTheme, MinuteMarketsWalletAdapter, MinuteMarketsWidgetState } from './types.js';
4
+ interface MinuteMarketsContextValue extends MinuteMarketsWidgetState {
5
+ connectWallet(walletName: string): Promise<void>;
6
+ disconnectWallet(): Promise<void>;
7
+ emitEvent(event: MinuteMarketsEvent): void;
8
+ refreshMarket(): Promise<void>;
9
+ refreshOrders(): Promise<void>;
10
+ placeWager(side: 'HIGHER' | 'LOWER', amountAda: number): Promise<void>;
11
+ themeStyle: ReturnType<typeof toThemeStyle>;
12
+ }
13
+ export interface MinuteMarketsProviderProps {
14
+ partnerId: string;
15
+ network?: 'preprod' | 'mainnet';
16
+ apiBaseUrl?: string;
17
+ theme?: MinuteMarketsTheme;
18
+ walletAdapter?: MinuteMarketsWalletAdapter;
19
+ onEvent?: (event: MinuteMarketsEvent) => void;
20
+ children: ReactNode;
21
+ }
22
+ export declare function MinuteMarketsProvider({ partnerId, network, apiBaseUrl, theme, walletAdapter, onEvent, children, }: MinuteMarketsProviderProps): import("react/jsx-runtime").JSX.Element;
23
+ export declare function useMinuteMarketsWidgetState(): MinuteMarketsContextValue;
24
+ export {};
25
+ //# sourceMappingURL=provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../src/provider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAOL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,OAAO,KAAK,EAIV,kBAAkB,EAElB,kBAAkB,EAElB,0BAA0B,EAG1B,wBAAwB,EACzB,MAAM,YAAY,CAAC;AAQpB,UAAU,yBAA0B,SAAQ,wBAAwB;IAClE,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,SAAS,CAAC,KAAK,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAC3C,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,UAAU,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvE,UAAU,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC;CAC7C;AAED,MAAM,WAAW,0BAA0B;IACzC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,kBAAkB,CAAC;IAC3B,aAAa,CAAC,EAAE,0BAA0B,CAAC;IAC3C,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,CAAC;IAC9C,QAAQ,EAAE,SAAS,CAAC;CACrB;AA+CD,wBAAgB,qBAAqB,CAAC,EACpC,SAAS,EACT,OAAmB,EACnB,UAAU,EACV,KAAK,EACL,aAAa,EACb,OAAO,EACP,QAAQ,GACT,EAAE,0BAA0B,2CA6V5B;AAED,wBAAgB,2BAA2B,8BAI1C"}
@@ -0,0 +1,354 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { createContext, useCallback, useContext, useEffect, useMemo, useState, } from 'react';
3
+ import { toThemeStyle } from './theme.js';
4
+ import { createCip30WalletApi } from './wallet.js';
5
+ const POLL_INTERVAL_MS = 6_000;
6
+ const HOSTED_API_BASE_URLS = {
7
+ preprod: 'https://minute-markets-preprod.vercel.app/',
8
+ mainnet: 'https://www.minutemarkets.io/',
9
+ };
10
+ const MinuteMarketsContext = createContext(null);
11
+ const parseResponse = async (response) => {
12
+ const json = await response.json();
13
+ if (!response.ok || !json?.success) {
14
+ throw {
15
+ code: json?.error?.code ?? 'SDK_REQUEST_FAILED',
16
+ message: json?.error?.message ?? `Minute Markets request failed (${response.status})`,
17
+ };
18
+ }
19
+ return json.data;
20
+ };
21
+ const toApiUrl = (baseUrl, path, partnerId) => {
22
+ const url = new URL(path, baseUrl.endsWith('/') ? baseUrl : `${baseUrl}/`);
23
+ url.searchParams.set('partnerId', partnerId);
24
+ return url.toString();
25
+ };
26
+ const getCardanoProviders = () => window.cardano ?? {};
27
+ const detectWallets = () => Object.entries(getCardanoProviders())
28
+ .filter(([, provider]) => typeof provider.enable === 'function')
29
+ .map(([key, provider]) => ({
30
+ key,
31
+ name: provider.name ?? key,
32
+ icon: provider.icon,
33
+ }));
34
+ const readWalletBalanceLovelace = async (api) => {
35
+ try {
36
+ return await api.getBalanceLovelace?.() ?? null;
37
+ }
38
+ catch {
39
+ return null;
40
+ }
41
+ };
42
+ export function MinuteMarketsProvider({ partnerId, network = 'preprod', apiBaseUrl, theme, walletAdapter, onEvent, children, }) {
43
+ const resolvedApiBaseUrl = apiBaseUrl ?? HOSTED_API_BASE_URLS[network];
44
+ const [bootstrap, setBootstrap] = useState(null);
45
+ const [market, setMarket] = useState(null);
46
+ const [error, setError] = useState(null);
47
+ const [isLoading, setIsLoading] = useState(true);
48
+ const [activeWalletApi, setActiveWalletApi] = useState(null);
49
+ const [activeWalletAddress, setActiveWalletAddress] = useState(null);
50
+ const [trade, setTrade] = useState({
51
+ status: 'IDLE',
52
+ txHash: null,
53
+ message: null,
54
+ });
55
+ const [orders, setOrders] = useState({
56
+ items: [],
57
+ isLoading: false,
58
+ error: null,
59
+ });
60
+ const [wallet, setWallet] = useState({
61
+ availableWallets: [],
62
+ connected: false,
63
+ walletName: null,
64
+ networkId: null,
65
+ balanceLovelace: null,
66
+ source: null,
67
+ error: null,
68
+ });
69
+ const request = useCallback(async (path, init) => {
70
+ const response = await fetch(toApiUrl(resolvedApiBaseUrl, path, partnerId), {
71
+ ...init,
72
+ headers: init?.body ? { 'Content-Type': 'application/json', ...init.headers } : init?.headers,
73
+ });
74
+ return parseResponse(response);
75
+ }, [partnerId, resolvedApiBaseUrl]);
76
+ const refreshMarket = useCallback(async () => {
77
+ try {
78
+ setMarket(await request('/api/sdk/v1/market'));
79
+ setError(null);
80
+ }
81
+ catch (requestError) {
82
+ setError(requestError);
83
+ }
84
+ }, [request]);
85
+ const refreshOrders = useCallback(async () => {
86
+ const walletAddress = activeWalletAddress ?? await activeWalletApi?.getChangeAddress();
87
+ if (!walletAddress) {
88
+ setOrders({ items: [], isLoading: false, error: null });
89
+ return;
90
+ }
91
+ setOrders((current) => ({ ...current, isLoading: true, error: null }));
92
+ try {
93
+ const data = await request(`/api/sdk/v1/trades?walletAddress=${encodeURIComponent(walletAddress)}&limit=20`);
94
+ setOrders({ items: data.orders, isLoading: false, error: null });
95
+ if (!activeWalletAddress)
96
+ setActiveWalletAddress(walletAddress);
97
+ }
98
+ catch (requestError) {
99
+ const message = typeof requestError === 'object' && requestError && 'message' in requestError
100
+ ? String(requestError.message)
101
+ : 'Order history unavailable';
102
+ setOrders((current) => ({ ...current, isLoading: false, error: message }));
103
+ }
104
+ }, [activeWalletAddress, activeWalletApi, request]);
105
+ useEffect(() => {
106
+ let cancelled = false;
107
+ setWallet((current) => ({ ...current, availableWallets: detectWallets() }));
108
+ request('/api/sdk/v1/bootstrap')
109
+ .then((data) => {
110
+ if (cancelled)
111
+ return;
112
+ setBootstrap(data);
113
+ onEvent?.({ name: 'widget_loaded' });
114
+ if (!data.capabilities.tradingEnabled && data.capabilities.tradingDisabledReason) {
115
+ onEvent?.({ name: 'eligibility_blocked', reason: data.capabilities.tradingDisabledReason });
116
+ }
117
+ })
118
+ .catch((requestError) => {
119
+ if (!cancelled)
120
+ setError(requestError);
121
+ })
122
+ .finally(() => {
123
+ if (!cancelled)
124
+ setIsLoading(false);
125
+ });
126
+ return () => {
127
+ cancelled = true;
128
+ };
129
+ }, [onEvent, request]);
130
+ useEffect(() => {
131
+ if (!bootstrap)
132
+ return;
133
+ void refreshMarket();
134
+ const timer = window.setInterval(() => void refreshMarket(), POLL_INTERVAL_MS);
135
+ return () => window.clearInterval(timer);
136
+ }, [bootstrap, refreshMarket]);
137
+ const validateNetwork = useCallback(async (api) => {
138
+ if (!bootstrap)
139
+ throw new Error('Minute Markets widget is still loading');
140
+ const networkId = await api.getNetworkId();
141
+ const expectedNetworkId = bootstrap?.network === 'mainnet' ? 1 : 0;
142
+ if (networkId !== expectedNetworkId) {
143
+ throw new Error(`Switch your wallet to ${bootstrap?.network ?? 'the configured network'}`);
144
+ }
145
+ return networkId;
146
+ }, [bootstrap?.network]);
147
+ useEffect(() => {
148
+ if (!walletAdapter) {
149
+ setActiveWalletApi(null);
150
+ setWallet((current) => current.source === 'host'
151
+ ? {
152
+ ...current,
153
+ connected: false,
154
+ walletName: null,
155
+ networkId: null,
156
+ balanceLovelace: null,
157
+ source: null,
158
+ error: null,
159
+ }
160
+ : current);
161
+ return;
162
+ }
163
+ let cancelled = false;
164
+ Promise.all([
165
+ validateNetwork(walletAdapter.api),
166
+ walletAdapter.api.getChangeAddress(),
167
+ readWalletBalanceLovelace(walletAdapter.api),
168
+ ])
169
+ .then(([networkId, walletAddress, balanceLovelace]) => {
170
+ if (cancelled)
171
+ return;
172
+ setActiveWalletAddress(walletAddress);
173
+ setWallet((current) => ({
174
+ ...current,
175
+ connected: true,
176
+ walletName: walletAdapter.name,
177
+ networkId,
178
+ balanceLovelace,
179
+ source: 'host',
180
+ error: null,
181
+ }));
182
+ setActiveWalletApi(walletAdapter.api);
183
+ onEvent?.({ name: 'wallet_connected', walletName: walletAdapter.name, networkId });
184
+ })
185
+ .catch((walletError) => {
186
+ if (cancelled)
187
+ return;
188
+ const message = walletError instanceof Error ? walletError.message : 'Wallet connection failed';
189
+ setWallet((current) => ({ ...current, connected: false, balanceLovelace: null, error: message }));
190
+ setActiveWalletAddress(null);
191
+ onEvent?.({ name: 'wallet_connection_failed', message });
192
+ });
193
+ return () => {
194
+ cancelled = true;
195
+ };
196
+ }, [onEvent, validateNetwork, walletAdapter]);
197
+ const connectWallet = useCallback(async (walletName) => {
198
+ const provider = getCardanoProviders()[walletName];
199
+ if (!provider)
200
+ throw new Error(`Cardano wallet ${walletName} is unavailable`);
201
+ try {
202
+ const api = createCip30WalletApi(await provider.enable());
203
+ const [networkId, walletAddress, balanceLovelace] = await Promise.all([
204
+ validateNetwork(api),
205
+ api.getChangeAddress(),
206
+ readWalletBalanceLovelace(api),
207
+ ]);
208
+ setWallet((current) => ({
209
+ ...current,
210
+ connected: true,
211
+ walletName,
212
+ networkId,
213
+ balanceLovelace,
214
+ source: 'injected',
215
+ error: null,
216
+ }));
217
+ setActiveWalletApi(api);
218
+ setActiveWalletAddress(walletAddress);
219
+ onEvent?.({ name: 'wallet_connected', walletName, networkId });
220
+ }
221
+ catch (walletError) {
222
+ const message = walletError instanceof Error ? walletError.message : 'Wallet connection failed';
223
+ setWallet((current) => ({ ...current, balanceLovelace: null, error: message }));
224
+ onEvent?.({ name: 'wallet_connection_failed', message });
225
+ throw walletError;
226
+ }
227
+ }, [onEvent, validateNetwork]);
228
+ const disconnectWallet = useCallback(async () => {
229
+ if (wallet.source === 'host') {
230
+ await walletAdapter?.disconnect?.();
231
+ }
232
+ setWallet((current) => ({
233
+ ...current,
234
+ connected: false,
235
+ walletName: null,
236
+ networkId: null,
237
+ balanceLovelace: null,
238
+ source: null,
239
+ error: null,
240
+ }));
241
+ setActiveWalletApi(null);
242
+ setActiveWalletAddress(null);
243
+ setOrders({ items: [], isLoading: false, error: null });
244
+ setTrade({ status: 'IDLE', txHash: null, message: null });
245
+ onEvent?.({ name: 'wallet_disconnected' });
246
+ }, [onEvent, wallet.source, walletAdapter]);
247
+ const placeWager = useCallback(async (side, amountAda) => {
248
+ if (!activeWalletApi || !market)
249
+ throw new Error('Connect a wallet before placing a wager');
250
+ if (!bootstrap?.capabilities.positionsEnabled)
251
+ throw new Error('SDK trading is not enabled');
252
+ try {
253
+ const walletAddress = await activeWalletApi.getChangeAddress();
254
+ const balanceLovelace = await readWalletBalanceLovelace(activeWalletApi);
255
+ setActiveWalletAddress(walletAddress);
256
+ setWallet((current) => ({ ...current, balanceLovelace }));
257
+ setTrade({ status: 'CHECKING_ELIGIBILITY', txHash: null, message: 'Checking eligibility...' });
258
+ const eligibility = await request('/api/sdk/v1/eligibility', { method: 'POST', body: JSON.stringify({ walletAddress }) });
259
+ if (eligibility.result !== 'ALLOW')
260
+ throw new Error(`Trading is unavailable: ${eligibility.reason}`);
261
+ setTrade({ status: 'ACCEPTING_TERMS', txHash: null, message: 'Checking terms acceptance...' });
262
+ const terms = await request('/api/sdk/v1/terms/challenge', { method: 'POST', body: JSON.stringify({ walletAddress }) });
263
+ if (!terms.accepted) {
264
+ const signature = await activeWalletApi.signMessage(terms.message, walletAddress);
265
+ await request('/api/sdk/v1/terms/accept', {
266
+ method: 'POST',
267
+ body: JSON.stringify({ challengeId: terms.challengeId, walletAddress, signature }),
268
+ });
269
+ }
270
+ setTrade({ status: 'DRAFTING', txHash: null, message: 'Preparing transaction...' });
271
+ const walletUtxos = await activeWalletApi.getUtxos();
272
+ const collateralUtxos = await activeWalletApi.getCollateral?.() ?? [];
273
+ const draft = await request('/api/sdk/v1/trades/draft', {
274
+ method: 'POST',
275
+ body: JSON.stringify({
276
+ walletAddress,
277
+ eligibilityDecisionId: eligibility.decisionId,
278
+ marketId: market.open.id,
279
+ position: side === 'HIGHER' ? 'UP' : 'DOWN',
280
+ amountLovelace: Math.round(amountAda * 1_000_000),
281
+ walletUtxos,
282
+ collateralUtxos,
283
+ }),
284
+ });
285
+ setTrade({ status: 'SIGNING', txHash: null, message: 'Approve the wager in your wallet...' });
286
+ const signedTxOrWitnessSet = await activeWalletApi.signTx(draft.unsignedTx);
287
+ const submitsViaApi = activeWalletApi.signTxResultType === 'witness_set';
288
+ const txHash = submitsViaApi
289
+ ? (await request('/api/sdk/v1/trades/submit', {
290
+ method: 'POST',
291
+ body: JSON.stringify({
292
+ draftId: draft.draftId,
293
+ unsignedTx: draft.unsignedTx,
294
+ witnessSet: signedTxOrWitnessSet,
295
+ }),
296
+ })).txHash
297
+ : await activeWalletApi.submitTx(signedTxOrWitnessSet);
298
+ if (!submitsViaApi) {
299
+ await request('/api/sdk/v1/trades/submitted', {
300
+ method: 'POST',
301
+ body: JSON.stringify({ draftId: draft.draftId, txHash }),
302
+ });
303
+ }
304
+ setTrade({ status: 'SUBMITTED', txHash, message: 'Transaction submitted. Waiting for confirmation...' });
305
+ onEvent?.({ name: 'trade_submitted', draftId: draft.draftId, txHash });
306
+ void readWalletBalanceLovelace(activeWalletApi).then((nextBalance) => setWallet((current) => ({ ...current, balanceLovelace: nextBalance })));
307
+ void refreshOrders();
308
+ for (let attempt = 0; attempt < 20; attempt += 1) {
309
+ await new Promise((resolve) => window.setTimeout(resolve, 6_000));
310
+ const result = await request(`/api/sdk/v1/trades/status?draftId=${draft.draftId}`);
311
+ if (result.status === 'CONFIRMED') {
312
+ setTrade({ status: 'CONFIRMED', txHash, message: 'Wager confirmed on-chain.' });
313
+ onEvent?.({ name: 'trade_confirmed', draftId: draft.draftId, txHash });
314
+ void readWalletBalanceLovelace(activeWalletApi).then((nextBalance) => setWallet((current) => ({ ...current, balanceLovelace: nextBalance })));
315
+ void refreshMarket();
316
+ void refreshOrders();
317
+ return;
318
+ }
319
+ }
320
+ }
321
+ catch (tradeError) {
322
+ const message = typeof tradeError === 'object' && tradeError && 'message' in tradeError
323
+ ? String(tradeError.message)
324
+ : 'Wager submission failed';
325
+ setTrade({ status: 'FAILED', txHash: null, message });
326
+ onEvent?.({ name: 'trade_failed', message });
327
+ throw tradeError;
328
+ }
329
+ }, [activeWalletApi, bootstrap?.capabilities.positionsEnabled, market, onEvent, refreshMarket, refreshOrders, request]);
330
+ const value = useMemo(() => ({
331
+ bootstrap,
332
+ market,
333
+ wallet,
334
+ trade,
335
+ orders,
336
+ isLoading,
337
+ error,
338
+ connectWallet,
339
+ disconnectWallet,
340
+ refreshMarket,
341
+ refreshOrders,
342
+ placeWager,
343
+ emitEvent: (event) => onEvent?.(event),
344
+ themeStyle: toThemeStyle(theme),
345
+ }), [bootstrap, connectWallet, disconnectWallet, error, isLoading, market, onEvent, orders, placeWager, refreshMarket, refreshOrders, theme, trade, wallet]);
346
+ return _jsx(MinuteMarketsContext.Provider, { value: value, children: children });
347
+ }
348
+ export function useMinuteMarketsWidgetState() {
349
+ const context = useContext(MinuteMarketsContext);
350
+ if (!context)
351
+ throw new Error('useMinuteMarketsWidgetState must be used inside MinuteMarketsProvider');
352
+ return context;
353
+ }
354
+ //# sourceMappingURL=provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../src/provider.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { CSSProperties } from 'react';
2
+ import type { MinuteMarketsTheme } from './types.js';
3
+ export declare function toThemeStyle(theme?: MinuteMarketsTheme): CSSProperties;
4
+ //# sourceMappingURL=theme.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../src/theme.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAC3C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAUrD,wBAAgB,YAAY,CAAC,KAAK,GAAE,kBAAuB,GAAG,aAAa,CAwB1E"}
package/dist/theme.js ADDED
@@ -0,0 +1,30 @@
1
+ const COLOR_PATTERN = /^(#[0-9a-f]{3,8}|rgb\([^)]*\)|rgba\([^)]*\)|hsl\([^)]*\)|hsla\([^)]*\))$/i;
2
+ const SIZE_PATTERN = /^\d+(\.\d+)?(px|rem)$/;
3
+ const FONT_PATTERN = /^[a-z0-9 ,'"-]{1,120}$/i;
4
+ const URL_PATTERN = /^(https?:\/\/|data:image\/)[^\s"']{1,500}$/i;
5
+ const color = (value, fallback) => value && COLOR_PATTERN.test(value) ? value : fallback;
6
+ export function toThemeStyle(theme = {}) {
7
+ const isLight = theme.mode === 'light';
8
+ const style = {
9
+ '--mm-primary': color(theme.primaryColor, '#b3d349'),
10
+ '--mm-accent': color(theme.accentColor, '#44bd9e'),
11
+ '--mm-up': color(theme.upColor, '#44bd9e'),
12
+ '--mm-down': color(theme.downColor, '#c64872'),
13
+ '--mm-bg': color(theme.backgroundColor, isLight ? '#eff7f4' : '#071b1d'),
14
+ '--mm-surface': color(theme.surfaceColor, isLight ? '#ffffff' : '#0c292c'),
15
+ '--mm-text': color(theme.textColor, isLight ? '#123033' : '#fffdf6'),
16
+ '--mm-muted': color(theme.mutedTextColor, isLight ? '#527174' : '#d0c9b0'),
17
+ '--mm-border': color(theme.borderColor, isLight ? '#c7d9d6' : 'rgba(151, 246, 222, 0.18)'),
18
+ '--mm-radius': theme.borderRadius && SIZE_PATTERN.test(theme.borderRadius) ? theme.borderRadius : '20px',
19
+ '--mm-max-width': theme.maxWidth && SIZE_PATTERN.test(theme.maxWidth) ? theme.maxWidth : '540px',
20
+ '--mm-control-height': theme.controlHeight && SIZE_PATTERN.test(theme.controlHeight) ? theme.controlHeight : '44px',
21
+ '--mm-density-gap': theme.density === 'compact' ? '8px' : '12px',
22
+ '--mm-logo-image': theme.logoUrl && URL_PATTERN.test(theme.logoUrl) ? `url("${theme.logoUrl}")` : 'none',
23
+ '--mm-asset-image': theme.assetIconUrl && URL_PATTERN.test(theme.assetIconUrl) ? `url("${theme.assetIconUrl}")` : 'none',
24
+ '--mm-font': theme.fontFamily && FONT_PATTERN.test(theme.fontFamily)
25
+ ? theme.fontFamily
26
+ : 'Inter, system-ui, sans-serif',
27
+ };
28
+ return style;
29
+ }
30
+ //# sourceMappingURL=theme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.js","sourceRoot":"","sources":["../src/theme.ts"],"names":[],"mappings":"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"}