be-components 7.6.2 → 7.6.3
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/lib/commonjs/BetRouter/layouts/DesktopAdminLayout.js +27 -2
- package/lib/commonjs/BetRouter/layouts/DesktopAdminLayout.js.map +1 -1
- package/lib/commonjs/BetRouter/layouts/MobileAdminLayout.js +24 -0
- package/lib/commonjs/BetRouter/layouts/MobileAdminLayout.js.map +1 -1
- package/lib/commonjs/BetRouter/types/credentials.js +20 -4
- package/lib/commonjs/BetRouter/types/credentials.js.map +1 -1
- package/lib/commonjs/BetRouter/types/liquidity.js +4 -0
- package/lib/commonjs/Wallet/components/WalletActionSelector.js +3 -1
- package/lib/commonjs/Wallet/components/WalletActionSelector.js.map +1 -1
- package/lib/module/BetRouter/layouts/DesktopAdminLayout.js +29 -4
- package/lib/module/BetRouter/layouts/DesktopAdminLayout.js.map +1 -1
- package/lib/module/BetRouter/layouts/MobileAdminLayout.js +26 -2
- package/lib/module/BetRouter/layouts/MobileAdminLayout.js.map +1 -1
- package/lib/module/BetRouter/types/credentials.js +17 -2
- package/lib/module/BetRouter/types/credentials.js.map +1 -1
- package/lib/module/BetRouter/types/liquidity.js +1 -1
- package/lib/module/Wallet/components/WalletActionSelector.js +3 -1
- package/lib/module/Wallet/components/WalletActionSelector.js.map +1 -1
- package/lib/typescript/lib/commonjs/BetRouter/layouts/DesktopAdminLayout.d.ts.map +1 -1
- package/lib/typescript/lib/commonjs/BetRouter/layouts/MobileAdminLayout.d.ts.map +1 -1
- package/lib/typescript/lib/commonjs/BetRouter/types/credentials.d.ts +33 -0
- package/lib/typescript/lib/commonjs/BetRouter/types/credentials.d.ts.map +1 -1
- package/lib/typescript/lib/commonjs/BetRouter/types/liquidity.d.ts +1 -1
- package/lib/typescript/lib/commonjs/Wallet/components/WalletActionSelector.d.ts.map +1 -1
- package/lib/typescript/lib/module/BetRouter/layouts/DesktopAdminLayout.d.ts.map +1 -1
- package/lib/typescript/lib/module/BetRouter/layouts/MobileAdminLayout.d.ts.map +1 -1
- package/lib/typescript/lib/module/BetRouter/types/credentials.d.ts +33 -0
- package/lib/typescript/lib/module/BetRouter/types/credentials.d.ts.map +1 -1
- package/lib/typescript/lib/module/Wallet/components/WalletActionSelector.d.ts.map +1 -1
- package/lib/typescript/src/BetRouter/layouts/DesktopAdminLayout.d.ts.map +1 -1
- package/lib/typescript/src/BetRouter/layouts/MobileAdminLayout.d.ts.map +1 -1
- package/lib/typescript/src/BetRouter/types/credentials.d.ts +3 -1
- package/lib/typescript/src/BetRouter/types/credentials.d.ts.map +1 -1
- package/lib/typescript/src/BetRouter/types/liquidity.d.ts +11 -0
- package/lib/typescript/src/BetRouter/types/liquidity.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/BetRouter/layouts/DesktopAdminLayout.tsx +27 -2
- package/src/BetRouter/layouts/MobileAdminLayout.tsx +27 -2
- package/src/BetRouter/types/credentials.ts +20 -3
- package/src/BetRouter/types/liquidity.ts +18 -0
- package/src/Wallet/components/WalletActionSelector.tsx +1 -1
|
@@ -2,8 +2,8 @@ import React, { useEffect, useState } from 'react';
|
|
|
2
2
|
import { View, Text } from "../../Components/Themed";
|
|
3
3
|
import { ScrollView, TouchableOpacity } from 'react-native';
|
|
4
4
|
import { useColors } from '../../constants/useColors';
|
|
5
|
-
import { Icons, SearchBox } from '../../Components';
|
|
6
|
-
import { getLeagues } from '../api';
|
|
5
|
+
import { Icons, SearchBox, Button } from '../../Components';
|
|
6
|
+
import { getLeagues, BetRouterApi } from '../api';
|
|
7
7
|
import type { RouterLeagueProps } from '../types';
|
|
8
8
|
import LeagueInfo from '../components/admin/LeagueInfo';
|
|
9
9
|
import LeagueContests from '../components/admin/LeagueContests';
|
|
@@ -33,9 +33,11 @@ const DesktopAdminLayout = ({ insets, onClose, initialContestId, initialLeagueId
|
|
|
33
33
|
const [selectedSection, setSelectedSection] = useState<NavigationSection>('info');
|
|
34
34
|
const [selectedTool, setSelectedTool] = useState<GlobalTool | null>(null);
|
|
35
35
|
const [searchText, setSearchText] = useState('');
|
|
36
|
+
const [reconcilingOpportunities, setReconcilingOpportunities] = useState(false);
|
|
36
37
|
|
|
37
38
|
// Load leagues on mount
|
|
38
39
|
useEffect(() => {
|
|
40
|
+
BetRouterApi.setEnvironment();
|
|
39
41
|
loadLeagues();
|
|
40
42
|
}, []);
|
|
41
43
|
|
|
@@ -91,6 +93,19 @@ const DesktopAdminLayout = ({ insets, onClose, initialContestId, initialLeagueId
|
|
|
91
93
|
setSelectedSection('info'); // Reset section when selecting a tool
|
|
92
94
|
};
|
|
93
95
|
|
|
96
|
+
const handleReconcileOpportunities = async () => {
|
|
97
|
+
setReconcilingOpportunities(true);
|
|
98
|
+
try {
|
|
99
|
+
await BetRouterApi.BetRouter.OpportunityApi.reconcileOpportunities();
|
|
100
|
+
alert('Opportunities reconciled successfully!');
|
|
101
|
+
} catch (error) {
|
|
102
|
+
console.error('Failed to reconcile opportunities:', error);
|
|
103
|
+
alert('Failed to reconcile opportunities. Check console for details.');
|
|
104
|
+
} finally {
|
|
105
|
+
setReconcilingOpportunities(false);
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
|
|
94
109
|
const filteredLeagues = leagues.filter(league =>
|
|
95
110
|
league.name.toLowerCase().includes(searchText.toLowerCase())
|
|
96
111
|
);
|
|
@@ -298,6 +313,7 @@ const DesktopAdminLayout = ({ insets, onClose, initialContestId, initialLeagueId
|
|
|
298
313
|
paddingLeft: 16,
|
|
299
314
|
backgroundColor: selectedTool === 'router-markets' ? Colors.views.header : 'transparent',
|
|
300
315
|
borderRadius: 4,
|
|
316
|
+
marginBottom: 16,
|
|
301
317
|
}}
|
|
302
318
|
>
|
|
303
319
|
<Text
|
|
@@ -307,6 +323,15 @@ const DesktopAdminLayout = ({ insets, onClose, initialContestId, initialLeagueId
|
|
|
307
323
|
Router Markets
|
|
308
324
|
</Text>
|
|
309
325
|
</TouchableOpacity>
|
|
326
|
+
|
|
327
|
+
{/* Reconcile Opportunities Button */}
|
|
328
|
+
<View transparent style={{ paddingLeft: 16, paddingRight: 16 }}>
|
|
329
|
+
<Button
|
|
330
|
+
title={reconcilingOpportunities ? "Reconciling..." : "Reconcile Opportunities"}
|
|
331
|
+
onPress={handleReconcileOpportunities}
|
|
332
|
+
disabled={reconcilingOpportunities}
|
|
333
|
+
/>
|
|
334
|
+
</View>
|
|
310
335
|
</View>
|
|
311
336
|
</ScrollView>
|
|
312
337
|
</View>
|
|
@@ -2,8 +2,8 @@ import React, { useEffect, useState } from 'react';
|
|
|
2
2
|
import { View, Text } from "../../Components/Themed";
|
|
3
3
|
import { ScrollView, TouchableOpacity } from 'react-native';
|
|
4
4
|
import { useColors } from '../../constants/useColors';
|
|
5
|
-
import { Icons, SearchBox } from '../../Components';
|
|
6
|
-
import { getLeagues } from '../api';
|
|
5
|
+
import { Icons, SearchBox, Button } from '../../Components';
|
|
6
|
+
import { getLeagues, BetRouterApi } from '../api';
|
|
7
7
|
import type { RouterLeagueProps } from '../types';
|
|
8
8
|
import LeagueInfo from '../components/admin/LeagueInfo';
|
|
9
9
|
import LeagueContests from '../components/admin/LeagueContests';
|
|
@@ -34,8 +34,10 @@ const MobileAdminLayout = ({ insets, onClose, initialContestId, initialLeagueId
|
|
|
34
34
|
const [selectedTool, setSelectedTool] = useState<GlobalTool | null>(null);
|
|
35
35
|
const [currentScreen, setCurrentScreen] = useState<Screen>('menu');
|
|
36
36
|
const [searchText, setSearchText] = useState('');
|
|
37
|
+
const [reconcilingOpportunities, setReconcilingOpportunities] = useState(false);
|
|
37
38
|
|
|
38
39
|
useEffect(() => {
|
|
40
|
+
BetRouterApi.setEnvironment();
|
|
39
41
|
loadLeagues();
|
|
40
42
|
}, []);
|
|
41
43
|
|
|
@@ -77,6 +79,19 @@ const MobileAdminLayout = ({ insets, onClose, initialContestId, initialLeagueId
|
|
|
77
79
|
}
|
|
78
80
|
};
|
|
79
81
|
|
|
82
|
+
const handleReconcileOpportunities = async () => {
|
|
83
|
+
setReconcilingOpportunities(true);
|
|
84
|
+
try {
|
|
85
|
+
await BetRouterApi.BetRouter.OpportunityApi.reconcileOpportunities();
|
|
86
|
+
alert('Opportunities reconciled successfully!');
|
|
87
|
+
} catch (error) {
|
|
88
|
+
console.error('Failed to reconcile opportunities:', error);
|
|
89
|
+
alert('Failed to reconcile opportunities. Check console for details.');
|
|
90
|
+
} finally {
|
|
91
|
+
setReconcilingOpportunities(false);
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
|
|
80
95
|
const filteredLeagues = leagues.filter(league =>
|
|
81
96
|
league.name.toLowerCase().includes(searchText.toLowerCase())
|
|
82
97
|
);
|
|
@@ -188,6 +203,7 @@ const MobileAdminLayout = ({ insets, onClose, initialContestId, initialLeagueId
|
|
|
188
203
|
borderRadius: 8,
|
|
189
204
|
borderWidth: 1,
|
|
190
205
|
borderColor: Colors.borders.light,
|
|
206
|
+
marginBottom: 8,
|
|
191
207
|
flexDirection: 'row',
|
|
192
208
|
alignItems: 'center',
|
|
193
209
|
justifyContent: 'space-between'
|
|
@@ -201,6 +217,15 @@ const MobileAdminLayout = ({ insets, onClose, initialContestId, initialLeagueId
|
|
|
201
217
|
</View>
|
|
202
218
|
<Icons.ChevronIcon size={20} color={Colors.text.descriptionLight} direction="right" />
|
|
203
219
|
</TouchableOpacity>
|
|
220
|
+
|
|
221
|
+
{/* Reconcile Opportunities Button */}
|
|
222
|
+
<View transparent style={{ marginTop: 4 }}>
|
|
223
|
+
<Button
|
|
224
|
+
title={reconcilingOpportunities ? "Reconciling..." : "Reconcile Opportunities"}
|
|
225
|
+
onPress={handleReconcileOpportunities}
|
|
226
|
+
disabled={reconcilingOpportunities}
|
|
227
|
+
/>
|
|
228
|
+
</View>
|
|
204
229
|
</View>
|
|
205
230
|
|
|
206
231
|
{/* Leagues Section */}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
// Partner Credential Types
|
|
2
2
|
// These define what inputs are needed for each partner
|
|
3
3
|
|
|
4
|
-
//import { BetOpenlyCredentialProps as BetOpenlyCredentialPropsImport } from "../partners/betopenly/cred.types"
|
|
5
|
-
|
|
6
4
|
// Re-export BetOpenly credentials
|
|
7
5
|
export type BetOpenlyCredentialProps = any
|
|
8
6
|
|
|
7
|
+
// Re-export Polymarket credentials
|
|
8
|
+
export type PolymarketCredentialProps = any
|
|
9
|
+
|
|
9
10
|
export interface KalshiCredentialProps {
|
|
10
11
|
api_key: string
|
|
11
12
|
private_key_pem: string
|
|
@@ -20,7 +21,7 @@ export interface BettorEdgeCredentialProps {
|
|
|
20
21
|
}
|
|
21
22
|
|
|
22
23
|
// Union type of all possible credentials
|
|
23
|
-
export type PartnerCredentialProps = KalshiCredentialProps | BettorEdgeCredentialProps | BetOpenlyCredentialProps
|
|
24
|
+
export type PartnerCredentialProps = KalshiCredentialProps | BettorEdgeCredentialProps | BetOpenlyCredentialProps | PolymarketCredentialProps
|
|
24
25
|
|
|
25
26
|
// Type guard helpers for client to determine which credential type is needed
|
|
26
27
|
export const isKalshiCredentials = (creds: any): creds is KalshiCredentialProps => {
|
|
@@ -35,6 +36,10 @@ export const isBetOpenlyCredentials = (creds: any): creds is BetOpenlyCredential
|
|
|
35
36
|
return 'username' in creds && 'password' in creds && !('device_id' in creds)
|
|
36
37
|
}
|
|
37
38
|
|
|
39
|
+
export const isPolymarketCredentials = (creds: any): creds is PolymarketCredentialProps => {
|
|
40
|
+
return 'private_key' in creds
|
|
41
|
+
}
|
|
42
|
+
|
|
38
43
|
// Helper to get required fields for a partner by name
|
|
39
44
|
export const getRequiredCredentialFields = (partnerName: string): string[] => {
|
|
40
45
|
switch (partnerName) {
|
|
@@ -44,6 +49,8 @@ export const getRequiredCredentialFields = (partnerName: string): string[] => {
|
|
|
44
49
|
return ['username', 'password']
|
|
45
50
|
case 'BetOpenly':
|
|
46
51
|
return ['user_id','username', 'password']
|
|
52
|
+
case 'Polymarket':
|
|
53
|
+
return ['private_key', 'funder']
|
|
47
54
|
default:
|
|
48
55
|
return []
|
|
49
56
|
}
|
|
@@ -68,6 +75,11 @@ export const getCredentialFieldLabels = (partnerName: string): Record<string, st
|
|
|
68
75
|
password: 'Password',
|
|
69
76
|
user_id: 'User Id'
|
|
70
77
|
}
|
|
78
|
+
case 'Polymarket':
|
|
79
|
+
return {
|
|
80
|
+
private_key: 'Private Key (Ethereum Wallet)',
|
|
81
|
+
funder: 'Funder Address (shown under profile pic on Polymarket)'
|
|
82
|
+
}
|
|
71
83
|
default:
|
|
72
84
|
return {}
|
|
73
85
|
}
|
|
@@ -92,6 +104,11 @@ export const getCredentialFieldTypes = (partnerName: string): Record<string, 'te
|
|
|
92
104
|
username: 'text',
|
|
93
105
|
password: 'password'
|
|
94
106
|
}
|
|
107
|
+
case 'Polymarket':
|
|
108
|
+
return {
|
|
109
|
+
private_key: 'password',
|
|
110
|
+
funder: 'text'
|
|
111
|
+
}
|
|
95
112
|
default:
|
|
96
113
|
return {}
|
|
97
114
|
}
|
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
// Liquidity Types
|
|
2
2
|
|
|
3
|
+
import type {
|
|
4
|
+
RouterMarketSideProps,
|
|
5
|
+
RouterMarketVariableProps,
|
|
6
|
+
RouterMarketProps
|
|
7
|
+
} from './markets';
|
|
8
|
+
import type { RouterParticipantProps } from './participants';
|
|
9
|
+
import type { PartnerParticipantProps } from './participants';
|
|
10
|
+
|
|
3
11
|
export interface RouterLiquidityProps {
|
|
4
12
|
router_liquidity_id: string // PK
|
|
5
13
|
liquidity_hash: string // Hash identifier: partner_id:router_contest_id:router_market_id:market_side_id:market_variable_id:participant_id:timeframe_id
|
|
@@ -13,3 +21,13 @@ export interface RouterLiquidityProps {
|
|
|
13
21
|
buy_id?: string
|
|
14
22
|
last_update_datetime: any // MOMENT
|
|
15
23
|
}
|
|
24
|
+
|
|
25
|
+
// Reference data shared across all getBatchLiquidity calls
|
|
26
|
+
export interface LiquidityReferenceData {
|
|
27
|
+
allRouterMarketSides: RouterMarketSideProps[];
|
|
28
|
+
allRouterMarketVariables: RouterMarketVariableProps[];
|
|
29
|
+
allRouterMarkets: RouterMarketProps[];
|
|
30
|
+
allTimeframes: any[];
|
|
31
|
+
allRouterParticipants: RouterParticipantProps[];
|
|
32
|
+
allPartnerParticipants: PartnerParticipantProps[];
|
|
33
|
+
}
|
|
@@ -70,7 +70,7 @@ const WalletActionSelector = ({ player, walkthrough_steps, player_balance, accou
|
|
|
70
70
|
if(instant_withdraw_account){ return onActionSelect(action, instant_withdraw_account) }
|
|
71
71
|
//Ok lets get the ibt_placeholder one!
|
|
72
72
|
let ibt_placeholder = accounts.find(a => a.ibt_placeholder);
|
|
73
|
-
if(ibt_placeholder){ return onActionSelect(action, ibt_placeholder) }
|
|
73
|
+
if(ibt_placeholder){ return onActionSelect({ action:'add_ibt' }, ibt_placeholder) }
|
|
74
74
|
return //Dont do anything if we dont have an ibt acccount possible
|
|
75
75
|
default: onActionSelect(action)
|
|
76
76
|
}
|