0xFableOrg / 0xFable

A fully on-chain trading card game. There will be elves, wizards & shit. Drama and broken friendships also.
https://twitter.com/0xFableGame
BSD 3-Clause Clear License
103 stars 35 forks source link

Unable to join game #135

Open eviterin opened 4 months ago

eviterin commented 4 months ago

Issue: Player is unable to join a new game.

Build: 5080439

Steps to reproduce:

  1. clone fresh
  2. run make setup, make anvil, make webdev, make deploy, make circuits
  3. navigate to http://localhost:3000/?index=1 and mint deck
  4. navigate to http://localhost:3000/?index=2 and mint deck
  5. from index=1: create game (game index = 1)
  6. from index=2: join game (game index = 1)

Expected: Player 2 can join game of player 1.

Reality: Modal displays the following error message: "SyntaxError: Cannot convert #bigint.20826557750498812955920791981733214788339539821236692591183101691377953231916 to a BigInt"

eviterin commented 4 months ago

Just found this and have not had the time yet to investigate.

eviterin commented 4 months ago

Console points to contract: setting error modal: {"title":"Contract execution error","message":"SyntaxError: Cannot convert #bigint.20826557750498812955920791981733214788339539821236692591183101691377953231916 to a BigInt","buttons":[{"text":"Dismiss"}]}

norswap commented 4 months ago

Hhm, so the error message points at the serialization we use to persist bigints in the browser storage. It seems like the string representing the bigint is not parsed correctly and is being fed directly to the contract instead of a bigint.

We override the JSON.stringify and JSON.parse logic in the setup.ts file.

I think we should try to pinpoint in which scenarios this happens. Clearly it doesn't happen if we don't mint and use users 0 and 1, right?

The standard deployment script should mint decks to index 0 and index 1, so I'm already surprised you manage to mint a deck to index 1? Okay lmao, we never set the claimed flag here: https://github.com/0xFableOrg/0xFable/blob/master/packages/contracts/src/DeckAirdrop.sol — that shouldn't be causing this issue though, but worth trying anyway.

Can you pinpoint the transaction in which this happens? joinGame, or drawInitialHand (you should be able to tell by the changing modal text, if not by the console). Mostly likely it's joinGame and the culprit is the gameID ... not sure what could have changed to make that into a parsed string though... so maybe not.

Good debugging exercise in perspective :D

ultraviolet10 commented 4 months ago

The culprit here is the saltHash param in the doJoinGameTransaction. The function expects a bigint but is being fed a string, from PrivateInfo.saltHash.

Screenshot 2024-03-21 at 8 52 54 PM