BentoSDK

Create a market

Submit a new prediction or versus market on the Bento markets host.

Prerequisites

  • Markets host URL (baseUrl)
  • Wallet auth headers on createBentoSdk (creator wallet)
  • Sufficient collateral / credits for on-chain creation (backend enforces limits)

Flow

import { createBentoSdk, walletAuthProvider } from '@bento.fun/sdk';

const sdk = createBentoSdk({
  baseUrl: process.env.BENTO_URL!,
  auth: walletAuthProvider(() => ({
    'x-wallet-address': walletAddress,
    'x-signature': signature,
    'x-timestamp': String(Date.now()),
  })),
});

// 1. Create (HTTP 201 — on-chain submission accepted)
const result = await sdk.user.createDuel(
  {
    question: 'Will Team A win?',
    type: 'prediction', // or 'versus' with optionA / optionB
    category: 'Football',
    description: 'Optional context for traders',
    startTime: new Date().toISOString(),
    endTime: new Date(Date.now() + 7 * 86400000).toISOString(),
    privacyAccess: 'public',
    collateralMode: 'usdc', // or 'credits'
  },
  { requestId: `create-${Date.now()}` },
);

if (result.kind !== 'accepted') {
  throw new Error('Market creation rejected');
}

const { duelId, txHash } = result.raw;
console.log({ duelId, txHash });

// 2. Poll until the market appears in catalog (eventual consistency)
let detail;
for (let i = 0; i < 10; i++) {
  try {
    detail = await sdk.public.getDuelById({ duelId });
    break;
  } catch {
    await new Promise((r) => setTimeout(r, 2000));
  }
}

Use duelId from the response — not a database id from list rows. See Common patterns.

Parent markets (grouped events)

For multi-market events (e.g. a match with several child markets):

const parent = await sdk.user.createParentMarket(
  { /* title, schedule, options — see Markets OpenAPI */ },
  { requestId: `parent-${Date.now()}` },
);

await sdk.user.createParentMarketInvitation({
  parentMarketId: parent.raw.parentMarketId,
});

Request bodies are defined in the Markets OpenAPI schema (CreateDuelDto, parent-market DTOs).

Agent / access-code path

Server agents with an access code can use:

await sdk.user.agentAction.createMarket({
  accessCode: process.env.AGENT_ACCESS_CODE!,
  /* market fields */
});

Pass accessCode on each agent-action call (body for POST). Wallet headers still apply via auth — see Authentication.

After creation

TaskSDK call
Resolve outcomesdk.user.duels.resolve
Contest / disputesdk.user.duels.submitContest
Public readssdk.public.getDuelById({ duelId })

HTTP acceptance does not mean the chain has finalized. See Mutation semantics.

On this page