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

No floating settlement values are persisted.

FX freshness

  • target freshness: <= 30 seconds
  • hard stale threshold: 120 seconds
  • stale FX beyond hard threshold -> execution fails before wallet mutation

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

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

Always floor final integer conversion. Never round up payout or buying power.

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 Opinion, Polynion owns the closed-market net principal and resulting trading profit or loss, not only its allocated trade-fee share. The operator retains its executed-trade fee allocation; the account-manager fee allocation is separate. This does not change Polyflight commercial terms.

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 operator amount due =
  closed-market principal + Polynion trade-fee share - R
  = B - S - R - operator fee share - account-manager 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, 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. The loss is not limited to fee-share reimbursement.

Recognition and cash timing

The Opinion monthly report uses:

monthly net due =
  Polynion fee share from trades processed in the month
  + closed-market principal recognized in the month
  - successful reconciled redemption payout 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/v2" identifies this principal-aware report. Summary and daily rows separately expose the recognized closure count, full buy debits, net sell credits, gross trade fees, net principal, and realized trading P&L. 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.

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. A refresh failure may use the latest persisted valid observation and disclose fallbackUsed plus age. 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