-
Account Info
+
Your Profile
- {/* Wallet Address with Copy Button */}
-
-
Connected Wallet
+ {/* Avatar + Link Twitter Row */}
+
+
+

+ {(!user.twitter) ? (
) : (<>>)}
+
+
+ {user.twitter ? (
+
+
+ Connected as {user.twitter.username}
+
+
+
+ ) : (
+
+ )}
+
+
+ {/* Username */}
+
+
+ setUsername(e.target.value)}
+ className="w-full bg-gray-800 text-white p-2 rounded-md"
+ />
+
+
+ {/* Bio */}
+
+
+
+ {/* Save Button */}
+
+
+ {/* Divider */}
+
+
+ {/* Wallet Info */}
+
+
Connected Wallet
+
+
SOL Balance
+
{solBalance} SOL
+
+
- {/* SOL Balance */}
-
-
SOL Balance
-
{solBalance} SOL
-
-
- {/* Socials */}
- {(user?.discord?.username || user?.email?.address) && (
-
-
Socials
-
- {user?.discord?.username && (
-
- Discord
-
- )}
- {user?.email?.address && (
-
{user?.email?.address}
- )}
-
-
- )}
-
- {/* Sign Out Button */}
- ) : null}
+ )}
+
+ {/* Username Claim Modal */}
+ {isUsernameClaimModalOpen && (
+
+
+
Claim Your Username
+ setNewUsername(e.target.value)}
+ className="w-full bg-[rgb(10,10,10)] text-white p-2 rounded-md"
+ placeholder="Enter your new username"
+ />
+
+
+
+)}
- {/* Animation */}
-
>
);
}
diff --git a/src/components/YourGames.tsx b/src/components/YourGames.tsx
index a5dc637..c7a1807 100644
--- a/src/components/YourGames.tsx
+++ b/src/components/YourGames.tsx
@@ -18,8 +18,14 @@ export default function YourGames() {
// Fetch bets
const updateBets = async () => {
- const bets: Bet[] = await fetchOpenBets(wallets[0]);
- setMyBets(bets.filter((bet) => bet.owner === wallets[0].address));
+ let wallet = wallets[0];
+ wallets.forEach((_wallet) => {
+ if (wallet.type === "solana") {
+ wallet = _wallet;
+ }
+ });
+ const bets: Bet[] = await fetchOpenBets(wallet);
+ setMyBets(bets.filter((bet) => bet.owner === wallet.address));
setLoading(false);
};
@@ -34,8 +40,14 @@ export default function YourGames() {
const handleCloseBet = async () => {
if (!selectedBet) return;
setIsProcessing(true);
+ let wallet = wallets[0];
+ wallets.forEach((_wallet) => {
+ if (wallet.type === "solana") {
+ wallet = _wallet;
+ }
+ });
try {
- const tx = await closeBet(wallets[0], selectedBet.id);
+ const tx = await closeBet(wallet, selectedBet.id);
const url = EXPLORER_TX_TEMPLATE.replace("{address}", tx);
toast.success(`Closed the bet successfully!`, {
diff --git a/src/idl/bets.ts b/src/idl/bets.ts
index 03e75aa..a70e35f 100644
--- a/src/idl/bets.ts
+++ b/src/idl/bets.ts
@@ -5,295 +5,310 @@
* IDL can be found at `target/idl/bets.json`.
*/
export type Bets = {
- "address": "HxsDuhD7wcPxcMsrYdteMYxkffuwff8HoxhZ7NuFtM37",
- "metadata": {
- "name": "bets",
- "version": "0.1.0",
- "spec": "0.1.0",
- "description": "Created with Anchor"
+ "address": "JAf3ZkQ469okXAzA6BKJeKBb9ZkCtZanULaUsapskoyn",
+ "metadata": {
+ "name": "bets",
+ "version": "0.1.0",
+ "spec": "0.1.0",
+ "description": "Created with Anchor"
+ },
+ "instructions": [
+ {
+ "name": "closeBet",
+ "discriminator": [
+ 185,
+ 206,
+ 13,
+ 184,
+ 176,
+ 108,
+ 140,
+ 107
+ ],
+ "accounts": [
+ {
+ "name": "betsList",
+ "writable": true
+ },
+ {
+ "name": "betVault",
+ "writable": true
+ },
+ {
+ "name": "winner",
+ "writable": true
+ },
+ {
+ "name": "payer",
+ "writable": true,
+ "signer": true
+ },
+ {
+ "name": "systemProgram",
+ "address": "11111111111111111111111111111111"
+ }
+ ],
+ "args": [
+ {
+ "name": "winner",
+ "type": "pubkey"
+ }
+ ]
},
- "instructions": [
- {
- "name": "closeBet",
- "discriminator": [
- 185,
- 206,
- 13,
- 184,
- 176,
- 108,
- 140,
- 107
- ],
- "accounts": [
- {
- "name": "betsList",
- "writable": true
- },
- {
- "name": "betVault",
- "writable": true
- },
- {
- "name": "winner",
- "writable": true
- },
- {
- "name": "payer",
- "writable": true,
- "signer": true
- },
- {
- "name": "systemProgram",
- "address": "11111111111111111111111111111111"
+ {
+ "name": "createBet",
+ "discriminator": [
+ 197,
+ 42,
+ 153,
+ 2,
+ 59,
+ 63,
+ 143,
+ 246
+ ],
+ "accounts": [
+ {
+ "name": "payer",
+ "writable": true,
+ "signer": true
+ },
+ {
+ "name": "betsList",
+ "writable": true
+ },
+ {
+ "name": "betVault",
+ "writable": true,
+ "pda": {
+ "seeds": [
+ {
+ "kind": "const",
+ "value": [
+ 98,
+ 101,
+ 116,
+ 95,
+ 118,
+ 97,
+ 117,
+ 108,
+ 116
+ ]
+ },
+ {
+ "kind": "account",
+ "path": "payer"
+ },
+ {
+ "kind": "arg",
+ "path": "gameId"
+ },
+ {
+ "kind": "arg",
+ "path": "nonce"
+ }
+ ]
}
- ],
- "args": [
+ },
+ {
+ "name": "systemProgram",
+ "address": "11111111111111111111111111111111"
+ }
+ ],
+ "args": [
+ {
+ "name": "wager",
+ "type": "u64"
+ },
+ {
+ "name": "userId",
+ "type": "string"
+ },
+ {
+ "name": "gameId",
+ "type": "string"
+ },
+ {
+ "name": "nonce",
+ "type": "u64"
+ }
+ ]
+ },
+ {
+ "name": "initialize",
+ "discriminator": [
+ 175,
+ 175,
+ 109,
+ 31,
+ 13,
+ 152,
+ 155,
+ 237
+ ],
+ "accounts": [
+ {
+ "name": "betsList",
+ "writable": true,
+ "pda": {
+ "seeds": [
+ {
+ "kind": "const",
+ "value": [
+ 98,
+ 101,
+ 116,
+ 115,
+ 95,
+ 108,
+ 105,
+ 115,
+ 116
+ ]
+ }
+ ]
+ }
+ },
+ {
+ "name": "payer",
+ "writable": true,
+ "signer": true
+ },
+ {
+ "name": "systemProgram",
+ "address": "11111111111111111111111111111111"
+ }
+ ],
+ "args": []
+ },
+ {
+ "name": "joinBet",
+ "discriminator": [
+ 69,
+ 116,
+ 82,
+ 26,
+ 144,
+ 192,
+ 58,
+ 238
+ ],
+ "accounts": [
+ {
+ "name": "betVault",
+ "writable": true
+ },
+ {
+ "name": "payer",
+ "writable": true,
+ "signer": true
+ },
+ {
+ "name": "systemProgram",
+ "address": "11111111111111111111111111111111"
+ }
+ ],
+ "args": [
+ {
+ "name": "userId",
+ "type": "string"
+ },
+ {
+ "name": "gameId",
+ "type": "string"
+ }
+ ]
+ }
+ ],
+ "accounts": [
+ {
+ "name": "betVault",
+ "discriminator": [
+ 103,
+ 78,
+ 21,
+ 234,
+ 18,
+ 250,
+ 230,
+ 209
+ ]
+ },
+ {
+ "name": "betsList",
+ "discriminator": [
+ 231,
+ 234,
+ 50,
+ 58,
+ 81,
+ 179,
+ 239,
+ 117
+ ]
+ }
+ ],
+ "errors": [
+ {
+ "code": 6000,
+ "name": "betNotFilled",
+ "msg": "Bet is not filled yet!"
+ }
+ ],
+ "types": [
+ {
+ "name": "betVault",
+ "type": {
+ "kind": "struct",
+ "fields": [
{
- "name": "winner",
+ "name": "gameId",
+ "type": "string"
+ },
+ {
+ "name": "owner",
"type": "pubkey"
- }
- ]
- },
- {
- "name": "createBet",
- "discriminator": [
- 197,
- 42,
- 153,
- 2,
- 59,
- 63,
- 143,
- 246
- ],
- "accounts": [
- {
- "name": "payer",
- "writable": true,
- "signer": true
},
{
- "name": "betsList",
- "writable": true
+ "name": "ownerId",
+ "type": "string"
},
{
- "name": "betVault",
- "writable": true,
- "pda": {
- "seeds": [
- {
- "kind": "const",
- "value": [
- 98,
- 101,
- 116,
- 95,
- 118,
- 97,
- 117,
- 108,
- 116
- ]
- },
- {
- "kind": "account",
- "path": "payer"
- },
- {
- "kind": "arg",
- "path": "gameId"
- },
- {
- "kind": "arg",
- "path": "nonce"
- }
- ]
- }
+ "name": "joiner",
+ "type": "pubkey"
},
{
- "name": "systemProgram",
- "address": "11111111111111111111111111111111"
- }
- ],
- "args": [
+ "name": "joinerId",
+ "type": "string"
+ },
{
"name": "wager",
"type": "u64"
- },
- {
- "name": "gameId",
- "type": "string"
- },
- {
- "name": "nonce",
- "type": "u64"
}
]
- },
- {
- "name": "initialize",
- "discriminator": [
- 175,
- 175,
- 109,
- 31,
- 13,
- 152,
- 155,
- 237
- ],
- "accounts": [
+ }
+ },
+ {
+ "name": "betsList",
+ "type": {
+ "kind": "struct",
+ "fields": [
{
- "name": "betsList",
- "writable": true,
- "pda": {
- "seeds": [
- {
- "kind": "const",
- "value": [
- 98,
- 101,
- 116,
- 115,
- 95,
- 108,
- 105,
- 115,
- 116
- ]
- }
- ]
+ "name": "bets",
+ "type": {
+ "vec": "pubkey"
}
- },
- {
- "name": "payer",
- "writable": true,
- "signer": true
- },
- {
- "name": "systemProgram",
- "address": "11111111111111111111111111111111"
- }
- ],
- "args": []
- },
- {
- "name": "joinBet",
- "discriminator": [
- 69,
- 116,
- 82,
- 26,
- 144,
- 192,
- 58,
- 238
- ],
- "accounts": [
- {
- "name": "betVault",
- "writable": true
- },
- {
- "name": "payer",
- "writable": true,
- "signer": true
- },
- {
- "name": "systemProgram",
- "address": "11111111111111111111111111111111"
- }
- ],
- "args": [
- {
- "name": "gameId",
- "type": "string"
}
]
}
- ],
- "accounts": [
- {
- "name": "betVault",
- "discriminator": [
- 103,
- 78,
- 21,
- 234,
- 18,
- 250,
- 230,
- 209
- ]
- },
- {
- "name": "betsList",
- "discriminator": [
- 231,
- 234,
- 50,
- 58,
- 81,
- 179,
- 239,
- 117
- ]
- }
- ],
- "errors": [
- {
- "code": 6000,
- "name": "customError",
- "msg": "Custom error message"
- }
- ],
- "types": [
- {
- "name": "betVault",
- "type": {
- "kind": "struct",
- "fields": [
- {
- "name": "gameId",
- "type": "string"
- },
- {
- "name": "owner",
- "type": "pubkey"
- },
- {
- "name": "joiner",
- "type": "pubkey"
- },
- {
- "name": "wager",
- "type": "u64"
- }
- ]
- }
- },
- {
- "name": "betsList",
- "type": {
- "kind": "struct",
- "fields": [
- {
- "name": "bets",
- "type": {
- "vec": "pubkey"
- }
- }
- ]
- }
- }
- ],
- "constants": [
- {
- "name": "seed",
- "type": "string",
- "value": "\"anchor\""
- }
- ]
- };
-
\ No newline at end of file
+ }
+ ],
+ "constants": [
+ {
+ "name": "seed",
+ "type": "string",
+ "value": "\"anchor\""
+ }
+ ]
+};
diff --git a/src/idl/bets_idl.json b/src/idl/bets_idl.json
index 1a7b43f..f734b3b 100644
--- a/src/idl/bets_idl.json
+++ b/src/idl/bets_idl.json
@@ -1,292 +1,308 @@
{
- "address": "HxsDuhD7wcPxcMsrYdteMYxkffuwff8HoxhZ7NuFtM37",
- "metadata": {
- "name": "bets",
- "version": "0.1.0",
- "spec": "0.1.0",
- "description": "Created with Anchor"
+ "address": "JAf3ZkQ469okXAzA6BKJeKBb9ZkCtZanULaUsapskoyn",
+ "metadata": {
+ "name": "bets",
+ "version": "0.1.0",
+ "spec": "0.1.0",
+ "description": "Created with Anchor"
+ },
+ "instructions": [
+ {
+ "name": "close_bet",
+ "discriminator": [
+ 185,
+ 206,
+ 13,
+ 184,
+ 176,
+ 108,
+ 140,
+ 107
+ ],
+ "accounts": [
+ {
+ "name": "bets_list",
+ "writable": true
+ },
+ {
+ "name": "bet_vault",
+ "writable": true
+ },
+ {
+ "name": "winner",
+ "writable": true
+ },
+ {
+ "name": "payer",
+ "writable": true,
+ "signer": true
+ },
+ {
+ "name": "system_program",
+ "address": "11111111111111111111111111111111"
+ }
+ ],
+ "args": [
+ {
+ "name": "winner",
+ "type": "pubkey"
+ }
+ ]
},
- "instructions": [
- {
- "name": "close_bet",
- "discriminator": [
- 185,
- 206,
- 13,
- 184,
- 176,
- 108,
- 140,
- 107
- ],
- "accounts": [
- {
- "name": "bets_list",
- "writable": true
- },
- {
- "name": "bet_vault",
- "writable": true
- },
- {
- "name": "winner",
- "writable": true
- },
- {
- "name": "payer",
- "writable": true,
- "signer": true
- },
- {
- "name": "system_program",
- "address": "11111111111111111111111111111111"
+ {
+ "name": "create_bet",
+ "discriminator": [
+ 197,
+ 42,
+ 153,
+ 2,
+ 59,
+ 63,
+ 143,
+ 246
+ ],
+ "accounts": [
+ {
+ "name": "payer",
+ "writable": true,
+ "signer": true
+ },
+ {
+ "name": "bets_list",
+ "writable": true
+ },
+ {
+ "name": "bet_vault",
+ "writable": true,
+ "pda": {
+ "seeds": [
+ {
+ "kind": "const",
+ "value": [
+ 98,
+ 101,
+ 116,
+ 95,
+ 118,
+ 97,
+ 117,
+ 108,
+ 116
+ ]
+ },
+ {
+ "kind": "account",
+ "path": "payer"
+ },
+ {
+ "kind": "arg",
+ "path": "game_id"
+ },
+ {
+ "kind": "arg",
+ "path": "_nonce"
+ }
+ ]
}
- ],
- "args": [
+ },
+ {
+ "name": "system_program",
+ "address": "11111111111111111111111111111111"
+ }
+ ],
+ "args": [
+ {
+ "name": "wager",
+ "type": "u64"
+ },
+ {
+ "name": "user_id",
+ "type": "string"
+ },
+ {
+ "name": "game_id",
+ "type": "string"
+ },
+ {
+ "name": "nonce",
+ "type": "u64"
+ }
+ ]
+ },
+ {
+ "name": "initialize",
+ "discriminator": [
+ 175,
+ 175,
+ 109,
+ 31,
+ 13,
+ 152,
+ 155,
+ 237
+ ],
+ "accounts": [
+ {
+ "name": "bets_list",
+ "writable": true,
+ "pda": {
+ "seeds": [
+ {
+ "kind": "const",
+ "value": [
+ 98,
+ 101,
+ 116,
+ 115,
+ 95,
+ 108,
+ 105,
+ 115,
+ 116
+ ]
+ }
+ ]
+ }
+ },
+ {
+ "name": "payer",
+ "writable": true,
+ "signer": true
+ },
+ {
+ "name": "system_program",
+ "address": "11111111111111111111111111111111"
+ }
+ ],
+ "args": []
+ },
+ {
+ "name": "join_bet",
+ "discriminator": [
+ 69,
+ 116,
+ 82,
+ 26,
+ 144,
+ 192,
+ 58,
+ 238
+ ],
+ "accounts": [
+ {
+ "name": "bet_vault",
+ "writable": true
+ },
+ {
+ "name": "payer",
+ "writable": true,
+ "signer": true
+ },
+ {
+ "name": "system_program",
+ "address": "11111111111111111111111111111111"
+ }
+ ],
+ "args": [
+ {
+ "name": "user_id",
+ "type": "string"
+ },
+ {
+ "name": "game_id",
+ "type": "string"
+ }
+ ]
+ }
+ ],
+ "accounts": [
+ {
+ "name": "BetVault",
+ "discriminator": [
+ 103,
+ 78,
+ 21,
+ 234,
+ 18,
+ 250,
+ 230,
+ 209
+ ]
+ },
+ {
+ "name": "BetsList",
+ "discriminator": [
+ 231,
+ 234,
+ 50,
+ 58,
+ 81,
+ 179,
+ 239,
+ 117
+ ]
+ }
+ ],
+ "errors": [
+ {
+ "code": 6000,
+ "name": "BetNotFilled",
+ "msg": "Bet is not filled yet!"
+ }
+ ],
+ "types": [
+ {
+ "name": "BetVault",
+ "type": {
+ "kind": "struct",
+ "fields": [
{
- "name": "winner",
+ "name": "game_id",
+ "type": "string"
+ },
+ {
+ "name": "owner",
"type": "pubkey"
- }
- ]
- },
- {
- "name": "create_bet",
- "discriminator": [
- 197,
- 42,
- 153,
- 2,
- 59,
- 63,
- 143,
- 246
- ],
- "accounts": [
- {
- "name": "payer",
- "writable": true,
- "signer": true
},
{
- "name": "bets_list",
- "writable": true
+ "name": "owner_id",
+ "type": "string"
},
{
- "name": "bet_vault",
- "writable": true,
- "pda": {
- "seeds": [
- {
- "kind": "const",
- "value": [
- 98,
- 101,
- 116,
- 95,
- 118,
- 97,
- 117,
- 108,
- 116
- ]
- },
- {
- "kind": "account",
- "path": "payer"
- },
- {
- "kind": "arg",
- "path": "game_id"
- },
- {
- "kind": "arg",
- "path": "_nonce"
- }
- ]
- }
+ "name": "joiner",
+ "type": "pubkey"
},
{
- "name": "system_program",
- "address": "11111111111111111111111111111111"
- }
- ],
- "args": [
+ "name": "joiner_id",
+ "type": "string"
+ },
{
"name": "wager",
"type": "u64"
- },
- {
- "name": "game_id",
- "type": "string"
- },
- {
- "name": "nonce",
- "type": "u64"
}
]
- },
- {
- "name": "initialize",
- "discriminator": [
- 175,
- 175,
- 109,
- 31,
- 13,
- 152,
- 155,
- 237
- ],
- "accounts": [
+ }
+ },
+ {
+ "name": "BetsList",
+ "type": {
+ "kind": "struct",
+ "fields": [
{
- "name": "bets_list",
- "writable": true,
- "pda": {
- "seeds": [
- {
- "kind": "const",
- "value": [
- 98,
- 101,
- 116,
- 115,
- 95,
- 108,
- 105,
- 115,
- 116
- ]
- }
- ]
+ "name": "bets",
+ "type": {
+ "vec": "pubkey"
}
- },
- {
- "name": "payer",
- "writable": true,
- "signer": true
- },
- {
- "name": "system_program",
- "address": "11111111111111111111111111111111"
- }
- ],
- "args": []
- },
- {
- "name": "join_bet",
- "discriminator": [
- 69,
- 116,
- 82,
- 26,
- 144,
- 192,
- 58,
- 238
- ],
- "accounts": [
- {
- "name": "bet_vault",
- "writable": true
- },
- {
- "name": "payer",
- "writable": true,
- "signer": true
- },
- {
- "name": "system_program",
- "address": "11111111111111111111111111111111"
- }
- ],
- "args": [
- {
- "name": "game_id",
- "type": "string"
}
]
}
- ],
- "accounts": [
- {
- "name": "BetVault",
- "discriminator": [
- 103,
- 78,
- 21,
- 234,
- 18,
- 250,
- 230,
- 209
- ]
- },
- {
- "name": "BetsList",
- "discriminator": [
- 231,
- 234,
- 50,
- 58,
- 81,
- 179,
- 239,
- 117
- ]
- }
- ],
- "errors": [
- {
- "code": 6000,
- "name": "CustomError",
- "msg": "Custom error message"
- }
- ],
- "types": [
- {
- "name": "BetVault",
- "type": {
- "kind": "struct",
- "fields": [
- {
- "name": "game_id",
- "type": "string"
- },
- {
- "name": "owner",
- "type": "pubkey"
- },
- {
- "name": "joiner",
- "type": "pubkey"
- },
- {
- "name": "wager",
- "type": "u64"
- }
- ]
- }
- },
- {
- "name": "BetsList",
- "type": {
- "kind": "struct",
- "fields": [
- {
- "name": "bets",
- "type": {
- "vec": "pubkey"
- }
- }
- ]
- }
- }
- ],
- "constants": [
- {
- "name": "SEED",
- "type": "string",
- "value": "\"anchor\""
- }
- ]
- }
\ No newline at end of file
+ }
+ ],
+ "constants": [
+ {
+ "name": "SEED",
+ "type": "string",
+ "value": "\"anchor\""
+ }
+ ]
+}
\ No newline at end of file
diff --git a/src/shared/data_fetcher.ts b/src/shared/data_fetcher.ts
new file mode 100644
index 0000000..0c0522c
--- /dev/null
+++ b/src/shared/data_fetcher.ts
@@ -0,0 +1,6 @@
+export async function fetchUserById(id: string) {
+ const res = await fetch(`https://vps.playpoolstudios.com/duelfi/api/get_user_by_id.php?id=${id}`);
+ if (!res.ok) return null;
+ return await res.json();
+ }
+
\ No newline at end of file
diff --git a/src/shared/solana_helpers.ts b/src/shared/solana_helpers.ts
index 6df21a0..edc9273 100644
--- a/src/shared/solana_helpers.ts
+++ b/src/shared/solana_helpers.ts
@@ -8,7 +8,6 @@ import { Bet } from "@/types/Bet";
import { toast } from "sonner";
import { Game } from "@/types/Game";
-
export const fetchOpenBets = async (wallets: ConnectedSolanaWallet): Promise
=> {
try {
if (!wallets) return [];
@@ -39,7 +38,9 @@ export const fetchOpenBets = async (wallets: ConnectedSolanaWallet): Promise{
+export async function createBet(wallets:ConnectedSolanaWallet, uid:string,selectedPrice:number,selectedGame:Game):Promise{
const connection = new Connection(CLUSTER_URL);
const wallet = {
publicKey: new PublicKey(wallets.address),
@@ -134,7 +135,7 @@ export async function createBet(wallets:ConnectedSolanaWallet,selectedPrice:numb
const program = new Program(idl, provider);
try {
- const nonce = 1;
+ const nonce = getRandomInt(100000000);
const [bet_list_pda] = await PublicKey.findProgramAddress(
[Buffer.from("bets_list")],
program.programId
@@ -145,7 +146,7 @@ export async function createBet(wallets:ConnectedSolanaWallet,selectedPrice:numb
// Create transaction
const tx = await program.methods
- .createBet(new BN(selectedPrice * 1000000000), selectedGame.id, new BN(nonce))
+ .createBet(new BN(selectedPrice * 1000000000),uid, selectedGame.id, new BN(nonce))
.accounts({
betsList: bet_list_pda,
})
@@ -176,4 +177,8 @@ export async function createBet(wallets:ConnectedSolanaWallet,selectedPrice:numb
}
return "";
+}
+
+function getRandomInt(max:number):number {
+ return Math.floor(Math.random() * max);
}
\ No newline at end of file
diff --git a/src/types/Bet.ts b/src/types/Bet.ts
index 9c3e5f1..dfff1b5 100644
--- a/src/types/Bet.ts
+++ b/src/types/Bet.ts
@@ -1,6 +1,14 @@
export interface Bet {
id: string;
owner: string;
+ owner_id:string;
joiner: string;
+ joiner_id:string;
wager: number;
+ ownerProfile?: {
+ id: string;
+ username: string;
+ bio: string;
+ x_profile_url: string;
+ };
}
\ No newline at end of file