Skip to content

feat: Four market backend enhancements - #1161

Merged
Ehonrie merged 6 commits into
Netwalls:mainfrom
Emmy6654:main
Jul 27, 2026
Merged

feat: Four market backend enhancements#1161
Ehonrie merged 6 commits into
Netwalls:mainfrom
Emmy6654:main

Conversation

@Emmy6654

Copy link
Copy Markdown
Contributor

Closes #1073
Closes #1074
Closes #1075
Closes #1076

Summary

Implements four backend enhancements for the BOXMEOUT market service:

1. Fallback reconciliation from Soroban RPC (Task 1)

  • reconcileMarketFromChain(marketId) reads market state directly from on-chain via simulateTransaction calling get_market_info()
  • Properly builds a TransactionBuilder with a throwaway keypair for read-only simulation
  • Parses Soroban ScVal return values using scValToNative
  • Maps on-chain status/pools/outcome to DB columns and overwrites the row
  • Admin endpoint: POST /api/admin/markets/:id/reconcile (adminAuth-protected)
  • Used when cached data is suspected stale (force refresh action)

2. Optimistic row insertion on create_market tx (Task 2)

  • createMarketOptimistic(txHash, marketData) inserts an optimistic row immediately after tx submission
  • Uses txHash as temporary ID so row can be matched when the real event arrives
  • createMarketRecord() now runs an interactive Prisma transaction to atomically reconcile:
    1. Finds optimistic row by txHash inside the transaction
    2. Deletes optimistic row and creates the real one with on-chain market_id
    3. Falls back to standard upsert if no optimistic row exists
  • Zod validation on the POST /api/markets/optimistic endpoint
  • No duplication: matched by txHash; race-condition safe via interactive transaction

3. List markets created by a given address (Task 3)

  • getMarketsByCreator(createdBy, pagination) uses indexed createdBy column
  • Returns { data: Market[], total: number } with page/limit pagination
  • Added @@index([createdBy]) on the Market model
  • Migration: CREATE INDEX Market_createdBy_idx ON Market (createdBy)
  • Endpoint: GET /api/markets/by-creator/:address?page=&limit=
  • No full table scan — query uses B-tree index

4. Single-market lookup by marketId (Task 4)

  • getMarketById() returns Market | null for unknown IDs (not a thrown error)
  • Controller returns 404 for null results
  • Cleaned up merge conflict artifacts in market.service.ts:
    • Removed duplicate imports
    • Consolidated getAllMarkets, getMarketById, createMarketRecord
    • Switched from raw PrismaClient to shared db instance

Files Changed

File Change
backend/src/services/market.service.ts Cleanup + all 4 new functions
backend/src/api/controllers/market.controller.ts 3 new handlers + Zod validation
backend/src/api/routes/market.routes.ts 3 new routes + cleanup duplicates
backend/prisma/schema.prisma @@index([createdBy]) on Market
backend/prisma/migrations/.../migration.sql New index migration

Testing

  • TypeScript compilation: no errors in changed files
  • Indexer service tests: 33/33 pass

Emmy6654 and others added 6 commits July 26, 2026 13:16
- Clean up merge conflict artifacts in market.service.ts

- getMarketById returns Market or null, not thrown error

- Consolidated getAllMarkets, getMarketById, createMarketRecord

- Switched from prisma client to shared db instance
- Add createMarketOptimistic to market.service.ts uses txHash as temp id

- Update createMarketRecord to reconcile optimistic rows matched by txHash

- Add Zod validation schema for optimistic create payload

- Add POST /api/markets/optimistic endpoint

- Add reconcileMarketHandler for admin force-refresh (task 1)

- Add getMarketsByCreatorHandler with paginated response (task 3)
- Add reconcileMarketFromChain in market.service.ts using simulateTransaction

- Properly build TransactionBuilder for read-only contract simulation

- Parse Soroban ScVal return with scValToNative

- Add POST /api/admin/markets/:id/reconcile admin-protected route

- Clean up duplicate route definitions

- Add /by-creator/:address and /optimistic routes
- Add getMarketsByCreator to market.service.ts

- Add @@index([createdBy]) on Market model

- Create migration for Market_createdBy_idx B-tree index

- Add GET /api/markets/by-creator/:address with pagination
feat: Four market backend enhancements
@Ehonrie
Ehonrie merged commit a214e29 into Netwalls:main Jul 27, 2026
1 check failed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant