OpenPoly logo
Integration Flow

FX fees and rounding

Opinion FX snapshots/fees and the separate comparison-only Polyflight valuation policy.

FX fees and rounding

OpenPoly uses integer units. The execution FX rules below apply to Opinion quotes, trades, sells, and redemptions. Polyflight wallet amounts follow the separate native-money boundary at the end of this page.

Units

  • credits-equivalent: integer, 10000 = 1 USDT
  • shares: integer micro-shares, 1000000 = 1 share
  • IDR: integer minor unit, exponent 0
  • FX rate: IDR per 1 USDT
  • BPS denominator: 10000

Wallet and share settlement amounts are integers. FX observations retain their decimal precision; they are not integer wallet amounts.

FX freshness

  • Automatic Indodax USDT_IDR references use one shared 15-minute upstream cache. There is no direct-provider fallback.
  • Automatic snapshots retain the original Indodax server_time and broker expiry, which is no later than 15 minutes after the original observation or fetch. Reading a cached quote never restarts its lifetime.
  • Expired or unavailable current FX fails closed before wallet mutation. An active manual override remains authoritative; manual Finance transaction rates and historical accounting evidence are not replaced.

Fee model

Current wallet quote conversion applies:

  • fx_fee_bps

operator_fee_bps is still stored on the operator and appears in trade reporting as the operator's share of AMM trade fees, but the current Mini App quote/execution path does not add it to wallet buy/sell/redemption conversion formulas.

Rules:

  • fee values are non-negative integers
  • fx_fee_bps + operator_fee_bps must stay < 10000 at operator-config validation time
  • buy applies fee before AMM quote
  • sell and redemption apply fee after credits-equivalent proceeds known

AMM trade fees are separate

The wallet conversion formulas below do not describe the full AMM quote. Opinion adds a per-share trade premium to buy cost and subtracts it from sell proceeds:

fee_credits_total = ceil(shares_micro * effective_premium_per_share_credits / 1000000)

The effective premium is outcome/side-specific and may exceed the operator baseline under managed-market controls. Buy collateral-to-Credits rounds up; sell collateral-to-Credits rounds down. Use the returned quote and immutable execution snapshot instead of rebuilding the trade price from FX alone.

Market PnL's quoted_fee_credits and historical quoted_fee_minor disclose executed-trade fees already reflected in cash. They do not authorize a second fee debit or an extra subtraction from returned_minor - spent_minor.

Buy formula

Given:

  • amount_minor
  • idr_per_usdt
  • fx_fee_bps
net_bps = 10000 - fx_fee_bps
credits_equivalent = floor(amount_minor * net_bps * 10000 / (10000 * idr_per_usdt))

Debit amount remains original amount_minor.

Sell formula

Given AMM credits-equivalent proceeds:

net_bps = 10000 - fx_fee_bps
external_amount_minor = floor(credits * idr_per_usdt * net_bps / (10000 * 10000))

Redemption formula

credits_equivalent = floor(shares_micro * 10000 / 1000000)
net_bps = 10000 - fx_fee_bps
external_amount_minor = floor(credits_equivalent * idr_per_usdt * net_bps / (10000 * 10000))

Rounding rule

Floor the wallet FX conversions above; never round up wallet buying power or the final external payout. AMM collateral, trade premiums, and reporting conversions have their own documented rounding rules.

Quote safety

Execution rejects when:

  • quote ID missing or changed
  • FX snapshot stale beyond hard threshold
  • final execution worse than accepted slippage

Why this matters for operators

  • wallet side always sees integer IDR minor amounts
  • webhook and reporting APIs expose already-rounded final values
  • operator reconciliation should compare integer amounts only

Opinion principal, trading P&L, and monthly settlement

For public Opinion markets, Polynion owns the closed-market net principal and resulting trading profit or loss, not only its allocated trade-fee share. For private markets approved from an operator request, the requesting operator instead owns all principal gains/losses and winning redemption obligations. The existing operator, account-manager, and Polynion executed-trade fee allocations are unchanged for both market types. This does not change Polyflight commercial terms.

Operator-requested private markets remain subject to rollout and approval. See Market Requests; this economics description is not evidence that request publication is enabled in your environment.

Use successful reconciled operator-wallet movements in the original operator currency:

SymbolMeaning
BFull successful buy debits, including the included trade fees.
SNet successful sell credits actually credited to users.
GAll gross external trade fees across those buys and sells, not just Polynion's fee share.
RSuccessful Opinion redemption credits actually delivered to users.
closed-market principal = B - S - G
realized trading P&L = closed-market principal - R

all-time amount due for public markets =
  closed-market principal + Polynion trade-fee share - R
  = B - S - R - operator fee share - account-manager fee share

all-time amount due for operator-underwritten private markets =
  Polynion trade-fee share

Gross buy volume is not added on top of existing fees. Subtract G to remove included trade fees from principal; then include only Polynion's allocated fee share. Realized trading P&L already subtracts the market's lifetime redemption credits and is not added to net due or used to deduct payouts a second time. Positive amount due means the operator owes Polynion; negative means Polynion owes the operator. Neither means a bank transfer has occurred.

For example, on a public market, B = 100000, S = 98000, G = 20000, and R = 5000 give principal -18000 and trading P&L -23000. If Polynion's fee share is 14000, the all-time amount due is -9000: Polynion owes the operator 9000. On an operator-underwritten private market with the same figures, the operator bears the 23000 principal loss and still owes Polynion its 14000 fee share; Polynion does not reimburse the private-market principal loss.

Recognition and cash timing

The Opinion monthly report uses:

monthly net due =
  Polynion fee share from trades processed in the month
  + total closed-market principal recognized in the month
  - operator-underwritten principal recognized in the month
  - total successful reconciled redemption cash processed in the month
  + operator-underwritten successful reconciled redemption cash processed in the month

Executed-trade fee allocations stay on their original processing date. Redemption payout cash stays on the actual successful processing date. An immutable principal closure is recorded once per operator and market, with its own recognition date. Its buy, sell, and gross-fee totals cover the market's full reconciled history, which can span earlier activity months. Its realized trading P&L also uses that market's lifetime successful payouts; it is separate from monthly payout cash.

Historical resolved markets first closed in October 2026 are recognized as October catch-up, not backdated. These totals are not new October user bets, new cash received, or a rewrite of prior/frozen Finance history. Sum across activity and recognition months to reconcile the all-time formula; a single month's trading P&L is not the same as that month's amount due.

Closure and incomplete reconciliation

Open stakes are not earned income. Principal is excluded until the market is resolved or delisted, all executions and wallet operations reconcile, and all redeemable winning shares have been paid (floor-to-zero dust is allowed). Pending or unknown redemptions, inconsistent wallet evidence, and wrong-channel internal Credits prevent closure.

The report's pendingPrincipalMarketCount counts currently resolved operator markets still awaiting closure, not only amounts missing from the selected activity month. Review market executions, wallet operations, and winning-share payouts to reconcile those markets. Never retry an unknown wallet credit under a new idempotency key.

accountingVersion: "opinion-principal/v3" identifies the underwriting-aware report. Summary and daily rows expose total recognized principal and realized trading P&L plus operatorUnderwrittenPrincipalNetExternalMinor, operatorUnderwrittenTradingPnlExternalMinor, and operatorUnderwrittenRedemptionPayoutExternalMinor subsets. Private-market P&L is informational, not platform revenue or another amount to add to net due. Immutable historical v2 snapshots retain their original attribution. A report with pending principal covers captured closures only and is not final fully reconciled all-time performance. Missing historical fee snapshots or unreconciledPayoutCount > 0 block exports until the relevant wallet/accounting evidence is reconciled; pending principal alone remains a disclosed exclusion, with recognition deferred to a later catch-up.

The current operator-local month is available as a read-only preview, including any recognized historical principal catch-up. It is not a final settlement: exports and Finance posting remain blocked until the month ends. Future months cannot be previewed.

Operators can read the same report as Admin in Opinion Settlement Reports at /settlement-reports, or through the report and export API. Both require the dedicated settlements:read scope (or *) and are restricted to the authenticated operator. Resolution exposure is a separate measure, not this monthly settlement.

Market PnL is a different view: lifetime confirmed cash per user/resolved market, with quoted fees, pending outcomes, and failed-payout debt disclosed separately. It does not use the monthly principal-recognition schedule and is not the operator's settlement amount.

Payout completion uses the original committed amount, FX snapshot, user and idempotency key. A committed sell may finish after a market closes; that is payment completion, not a new post-cutoff trade. Supplied wallet receipt fields must match the dispatched user, key, currency and amount. Unknown or contradictory receipts remain held for operator-ledger reconciliation rather than being sent again.

Polyflight boundary

Polyflight debits the exact IDR stake and credits the exact stored IDR win, full refund, or compensation. It does not use fx_fee_bps, operator_fee_bps, Opinion quote snapshots, slippage, or current FX at any wallet boundary.

Before boarding, a v5 flight freezes one canonical 8-decimal Indodax USDT_IDR observation only to compare aggregate native IDR and Credits option activity. Fresh comparison observations use the same 15-minute global broker cache and original expiry. A refresh failure may use the latest persisted valid historical observation and disclose fallbackUsed plus age; that historical fallback never becomes Opinion current FX. The committed observation is not refreshed for purchase, lock, result, payout, or replay. No valid observation means IDR is unavailable for that flight while Credits participation continues.

Copyright © 2026