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

2 participants