[{"data":1,"prerenderedAt":630},["ShallowReactive",2],{"navigation_docs":3,"-docs-integration-flow-fx-fees-and-rounding":352,"-docs-integration-flow-fx-fees-and-rounding-surround":625},[4,22,35,60,81,137,223,254,282,306,327],{"title":5,"path":6,"stem":7,"children":8,"page":21},"Getting Started","\u002Fdocs\u002Fgetting-started","docs\u002F1.getting-started",[9,13,17],{"title":10,"path":11,"stem":12},"Overview","\u002Fdocs\u002Fgetting-started\u002Foverview","docs\u002F1.getting-started\u002F1.overview",{"title":14,"path":15,"stem":16},"Integration checklist","\u002Fdocs\u002Fgetting-started\u002Fintegration-checklist","docs\u002F1.getting-started\u002F2.integration-checklist",{"title":18,"path":19,"stem":20},"Environments and base URLs","\u002Fdocs\u002Fgetting-started\u002Fenvironments-and-base-urls","docs\u002F1.getting-started\u002F3.environments-and-base-urls",false,{"title":23,"path":24,"stem":25,"children":26,"page":21},"Troubleshooting","\u002Fdocs\u002Ftroubleshooting","docs\u002F10.troubleshooting",[27,31],{"title":28,"path":29,"stem":30},"Common errors","\u002Fdocs\u002Ftroubleshooting\u002Fcommon-errors","docs\u002F10.troubleshooting\u002F1.common-errors",{"title":32,"path":33,"stem":34},"Support escalation","\u002Fdocs\u002Ftroubleshooting\u002Fsupport-escalation","docs\u002F10.troubleshooting\u002F2.support-escalation",{"title":36,"path":37,"stem":38,"children":39,"page":21},"Polyflight","\u002Fdocs\u002Fpolyflight","docs\u002F11.polyflight",[40,44,48,52,56],{"title":41,"path":42,"stem":43},"Polyflight overview and launch","\u002Fdocs\u002Fpolyflight\u002Foverview-and-launch","docs\u002F11.polyflight\u002F1.overview-and-launch",{"title":45,"path":46,"stem":47},"Native wallet contract","\u002Fdocs\u002Fpolyflight\u002Fnative-wallet-contract","docs\u002F11.polyflight\u002F2.native-wallet-contract",{"title":49,"path":50,"stem":51},"API, events, and proof","\u002Fdocs\u002Fpolyflight\u002Fapi-events-and-proof","docs\u002F11.polyflight\u002F3.api-events-and-proof",{"title":53,"path":54,"stem":55},"Terms, statements, and settlement","\u002Fdocs\u002Fpolyflight\u002Fterms-statements-and-settlement","docs\u002F11.polyflight\u002F4.terms-statements-and-settlement",{"title":57,"path":58,"stem":59},"Operations, reconciliation, and rollback","\u002Fdocs\u002Fpolyflight\u002Foperations-reconciliation-and-rollback","docs\u002F11.polyflight\u002F5.operations-reconciliation-and-rollback",{"title":61,"path":62,"stem":63,"children":64,"page":21},"Integration Flow","\u002Fdocs\u002Fintegration-flow","docs\u002F2.integration-flow",[65,69,73,77],{"title":66,"path":67,"stem":68},"Architecture","\u002Fdocs\u002Fintegration-flow\u002Farchitecture","docs\u002F2.integration-flow\u002F1.architecture",{"title":70,"path":71,"stem":72},"Launch session model","\u002Fdocs\u002Fintegration-flow\u002Flaunch-session-model","docs\u002F2.integration-flow\u002F2.launch-session-model",{"title":74,"path":75,"stem":76},"Order and wallet saga","\u002Fdocs\u002Fintegration-flow\u002Forder-and-wallet-saga","docs\u002F2.integration-flow\u002F3.order-and-wallet-saga",{"title":78,"path":79,"stem":80},"FX fees and rounding","\u002Fdocs\u002Fintegration-flow\u002Ffx-fees-and-rounding","docs\u002F2.integration-flow\u002F4.fx-fees-and-rounding",{"title":82,"path":83,"stem":84,"children":85,"page":21},"Dashboard","\u002Fdocs\u002Fdashboard","docs\u002F3.dashboard",[86,89,93,97,101,105,109,113,117,121,125,129,133],{"title":10,"path":87,"stem":88},"\u002Fdocs\u002Fdashboard\u002Foverview","docs\u002F3.dashboard\u002F1.overview",{"title":90,"path":91,"stem":92},"Webhook Deliveries","\u002Fdocs\u002Fdashboard\u002Fwebhook-deliveries","docs\u002F3.dashboard\u002F10.webhook-deliveries",{"title":94,"path":95,"stem":96},"Staffs","\u002Fdocs\u002Fdashboard\u002Fstaffs","docs\u002F3.dashboard\u002F11.staffs",{"title":98,"path":99,"stem":100},"Simulator","\u002Fdocs\u002Fdashboard\u002Fsimulator","docs\u002F3.dashboard\u002F12.simulator",{"title":102,"path":103,"stem":104},"API Playground","\u002Fdocs\u002Fdashboard\u002Fapi-playground","docs\u002F3.dashboard\u002F13.api-playground",{"title":106,"path":107,"stem":108},"API keys","\u002Fdocs\u002Fdashboard\u002Fapi-keys","docs\u002F3.dashboard\u002F2.api-keys",{"title":110,"path":111,"stem":112},"Wallet adapter settings","\u002Fdocs\u002Fdashboard\u002Fwallet-adapter-settings","docs\u002F3.dashboard\u002F3.wallet-adapter-settings",{"title":114,"path":115,"stem":116},"Webhook endpoints","\u002Fdocs\u002Fdashboard\u002Fwebhook-endpoints","docs\u002F3.dashboard\u002F4.webhook-endpoints",{"title":118,"path":119,"stem":120},"Markets and visibility","\u002Fdocs\u002Fdashboard\u002Fmarket-visibility","docs\u002F3.dashboard\u002F5.market-visibility",{"title":122,"path":123,"stem":124},"Users","\u002Fdocs\u002Fdashboard\u002Fusers","docs\u002F3.dashboard\u002F6.users",{"title":126,"path":127,"stem":128},"Trades","\u002Fdocs\u002Fdashboard\u002Ftrades","docs\u002F3.dashboard\u002F7.trades",{"title":130,"path":131,"stem":132},"Resolutions","\u002Fdocs\u002Fdashboard\u002Fresolutions","docs\u002F3.dashboard\u002F8.resolutions",{"title":134,"path":135,"stem":136},"Balance Operations","\u002Fdocs\u002Fdashboard\u002Fbalance-operations","docs\u002F3.dashboard\u002F9.balance-operations",{"title":138,"path":139,"stem":140,"children":141,"page":21},"Operator Api","\u002Fdocs\u002Foperator-api","docs\u002F4.operator-api",[142,146,149,153,156,160,163,167,171,175,179,183,186,190,194,198,202,206,209,213,216,219],{"title":143,"path":144,"stem":145},"Authentication","\u002Fdocs\u002Foperator-api\u002Fauthentication","docs\u002F4.operator-api\u002F1.authentication",{"title":114,"path":147,"stem":148},"\u002Fdocs\u002Foperator-api\u002Fwebhook-endpoints","docs\u002F4.operator-api\u002F10.webhook-endpoints",{"title":150,"path":151,"stem":152},"Webhook deliveries","\u002Fdocs\u002Foperator-api\u002Fwebhook-deliveries","docs\u002F4.operator-api\u002F11.webhook-deliveries",{"title":98,"path":154,"stem":155},"\u002Fdocs\u002Foperator-api\u002Fsimulator","docs\u002F4.operator-api\u002F12.simulator",{"title":157,"path":158,"stem":159},"Wallet adapter","\u002Fdocs\u002Foperator-api\u002Fwallet-adapter","docs\u002F4.operator-api\u002F13.wallet-adapter",{"title":94,"path":161,"stem":162},"\u002Fdocs\u002Foperator-api\u002Fstaffs","docs\u002F4.operator-api\u002F14.staffs",{"title":164,"path":165,"stem":166},"Error codes","\u002Fdocs\u002Foperator-api\u002Ferror-codes","docs\u002F4.operator-api\u002F15.error-codes",{"title":168,"path":169,"stem":170},"Redemptions","\u002Fdocs\u002Foperator-api\u002Fredemptions","docs\u002F4.operator-api\u002F16.redemptions",{"title":172,"path":173,"stem":174},"Polyflight overview","\u002Fdocs\u002Foperator-api\u002Fpolyflight","docs\u002F4.operator-api\u002F17.polyflight",{"title":176,"path":177,"stem":178},"Polyflight flights","\u002Fdocs\u002Foperator-api\u002Fpolyflight-flights","docs\u002F4.operator-api\u002F18.polyflight-flights",{"title":180,"path":181,"stem":182},"Polyflight tickets","\u002Fdocs\u002Foperator-api\u002Fpolyflight-tickets","docs\u002F4.operator-api\u002F19.polyflight-tickets",{"title":106,"path":184,"stem":185},"\u002Fdocs\u002Foperator-api\u002Fapi-keys","docs\u002F4.operator-api\u002F2.api-keys",{"title":187,"path":188,"stem":189},"Polyflight balance operations","\u002Fdocs\u002Foperator-api\u002Fpolyflight-balance-operations","docs\u002F4.operator-api\u002F20.polyflight-balance-operations",{"title":191,"path":192,"stem":193},"Polyflight terms","\u002Fdocs\u002Foperator-api\u002Fpolyflight-terms","docs\u002F4.operator-api\u002F21.polyflight-terms",{"title":195,"path":196,"stem":197},"Polyflight settlement reports","\u002Fdocs\u002Foperator-api\u002Fpolyflight-settlement-reports","docs\u002F4.operator-api\u002F22.polyflight-settlement-reports",{"title":199,"path":200,"stem":201},"Session","\u002Fdocs\u002Foperator-api\u002Fsession","docs\u002F4.operator-api\u002F3.session",{"title":203,"path":204,"stem":205},"Launch","\u002Fdocs\u002Foperator-api\u002Flaunch","docs\u002F4.operator-api\u002F4.launch",{"title":122,"path":207,"stem":208},"\u002Fdocs\u002Foperator-api\u002Fusers","docs\u002F4.operator-api\u002F5.users",{"title":210,"path":211,"stem":212},"Markets","\u002Fdocs\u002Foperator-api\u002Fmarkets","docs\u002F4.operator-api\u002F6.markets",{"title":126,"path":214,"stem":215},"\u002Fdocs\u002Foperator-api\u002Ftrades","docs\u002F4.operator-api\u002F7.trades",{"title":130,"path":217,"stem":218},"\u002Fdocs\u002Foperator-api\u002Fresolutions","docs\u002F4.operator-api\u002F8.resolutions",{"title":220,"path":221,"stem":222},"Balance operations","\u002Fdocs\u002Foperator-api\u002Fbalance-operations","docs\u002F4.operator-api\u002F9.balance-operations",{"title":224,"path":225,"stem":226,"children":227,"page":21},"Wallet Adapter","\u002Fdocs\u002Fwallet-adapter","docs\u002F5.wallet-adapter",[228,231,234,238,242,246,250],{"title":10,"path":229,"stem":230},"\u002Fdocs\u002Fwallet-adapter\u002Foverview","docs\u002F5.wallet-adapter\u002F1.overview",{"title":143,"path":232,"stem":233},"\u002Fdocs\u002Fwallet-adapter\u002Fauthentication","docs\u002F5.wallet-adapter\u002F2.authentication",{"title":235,"path":236,"stem":237},"Balance","\u002Fdocs\u002Fwallet-adapter\u002Fbalance","docs\u002F5.wallet-adapter\u002F3.balance",{"title":239,"path":240,"stem":241},"Debit","\u002Fdocs\u002Fwallet-adapter\u002Fdebit","docs\u002F5.wallet-adapter\u002F4.debit",{"title":243,"path":244,"stem":245},"Credit","\u002Fdocs\u002Fwallet-adapter\u002Fcredit","docs\u002F5.wallet-adapter\u002F5.credit",{"title":247,"path":248,"stem":249},"Debit reversal","\u002Fdocs\u002Fwallet-adapter\u002Fdebit-reversal","docs\u002F5.wallet-adapter\u002F6.debit-reversal",{"title":251,"path":252,"stem":253},"Idempotency","\u002Fdocs\u002Fwallet-adapter\u002Fidempotency","docs\u002F5.wallet-adapter\u002F7.idempotency",{"title":255,"path":256,"stem":257,"children":258,"page":21},"Webhooks","\u002Fdocs\u002Fwebhooks","docs\u002F6.webhooks",[259,262,266,270,274,278],{"title":10,"path":260,"stem":261},"\u002Fdocs\u002Fwebhooks\u002Foverview","docs\u002F6.webhooks\u002F1.overview",{"title":263,"path":264,"stem":265},"Signatures","\u002Fdocs\u002Fwebhooks\u002Fsignatures","docs\u002F6.webhooks\u002F2.signatures",{"title":267,"path":268,"stem":269},"Event envelope","\u002Fdocs\u002Fwebhooks\u002Fevent-envelope","docs\u002F6.webhooks\u002F3.event-envelope",{"title":271,"path":272,"stem":273},"Event types","\u002Fdocs\u002Fwebhooks\u002Fevent-types","docs\u002F6.webhooks\u002F4.event-types",{"title":275,"path":276,"stem":277},"Retry and replay","\u002Fdocs\u002Fwebhooks\u002Fretry-and-replay","docs\u002F6.webhooks\u002F5.retry-and-replay",{"title":279,"path":280,"stem":281},"Receiver examples","\u002Fdocs\u002Fwebhooks\u002Freceiver-examples","docs\u002F6.webhooks\u002F6.receiver-examples",{"title":283,"path":284,"stem":285,"children":286,"page":21},"Testing And Staging","\u002Fdocs\u002Ftesting-and-staging","docs\u002F7.testing-and-staging",[287,291,294,298,302],{"title":288,"path":289,"stem":290},"Staging overview","\u002Fdocs\u002Ftesting-and-staging\u002Fstaging-overview","docs\u002F7.testing-and-staging\u002F1.staging-overview",{"title":98,"path":292,"stem":293},"\u002Fdocs\u002Ftesting-and-staging\u002Fsimulator","docs\u002F7.testing-and-staging\u002F2.simulator",{"title":295,"path":296,"stem":297},"Wallet failure drills","\u002Fdocs\u002Ftesting-and-staging\u002Fwallet-failure-drills","docs\u002F7.testing-and-staging\u002F3.wallet-failure-drills",{"title":299,"path":300,"stem":301},"Webhook drills","\u002Fdocs\u002Ftesting-and-staging\u002Fwebhook-drills","docs\u002F7.testing-and-staging\u002F4.webhook-drills",{"title":303,"path":304,"stem":305},"Production cutover rehearsal","\u002Fdocs\u002Ftesting-and-staging\u002Fproduction-cutover-rehearsal","docs\u002F7.testing-and-staging\u002F5.production-cutover-rehearsal",{"title":307,"path":308,"stem":309,"children":310,"page":21},"Production Readiness","\u002Fdocs\u002Fproduction-readiness","docs\u002F8.production-readiness",[311,315,319,323],{"title":312,"path":313,"stem":314},"Checklist","\u002Fdocs\u002Fproduction-readiness\u002Fchecklist","docs\u002F8.production-readiness\u002F1.checklist",{"title":316,"path":317,"stem":318},"Operational runbook","\u002Fdocs\u002Fproduction-readiness\u002Foperational-runbook","docs\u002F8.production-readiness\u002F2.operational-runbook",{"title":320,"path":321,"stem":322},"Security","\u002Fdocs\u002Fproduction-readiness\u002Fsecurity","docs\u002F8.production-readiness\u002F3.security",{"title":324,"path":325,"stem":326},"Rollback","\u002Fdocs\u002Fproduction-readiness\u002Frollback","docs\u002F8.production-readiness\u002F4.rollback",{"title":328,"path":329,"stem":330,"children":331,"page":21},"Reference","\u002Fdocs\u002Freference","docs\u002F9.reference",[332,336,340,344,348],{"title":333,"path":334,"stem":335},"Statuses","\u002Fdocs\u002Freference\u002Fstatuses","docs\u002F9.reference\u002F1.statuses",{"title":337,"path":338,"stem":339},"Scopes","\u002Fdocs\u002Freference\u002Fscopes","docs\u002F9.reference\u002F2.scopes",{"title":341,"path":342,"stem":343},"Units and money","\u002Fdocs\u002Freference\u002Funits-and-money","docs\u002F9.reference\u002F3.units-and-money",{"title":345,"path":346,"stem":347},"Changelog","\u002Fdocs\u002Freference\u002Fchangelog","docs\u002F9.reference\u002F4.changelog",{"title":349,"path":350,"stem":351},"Virtual AMM","\u002Fdocs\u002Freference\u002Fvirtual-amm","docs\u002F9.reference\u002F5.virtual-amm",{"id":353,"title":78,"body":354,"description":618,"extension":619,"links":620,"meta":621,"navigation":622,"path":79,"seo":623,"stem":80,"__hash__":624},"docs\u002Fdocs\u002F2.integration-flow\u002F4.fx-fees-and-rounding.md",{"type":355,"value":356,"toc":605},"minimark",[357,361,370,375,410,413,417,435,439,442,449,455,458,479,483,486,502,512,518,522,525,531,535,541,545,548,552,555,566,570,581,585,594],[358,359,78],"h1",{"id":360},"fx-fees-and-rounding",[362,363,364,365,369],"p",{},"OpenPoly uses integer units. The execution FX rules below apply to ",[366,367,368],"strong",{},"Opinion"," quotes, trades, sells, and redemptions. Polyflight wallet amounts follow the separate native-money boundary at the end of this page.",[371,372,374],"h2",{"id":373},"units","Units",[376,377,378,386,392,398,404],"ul",{},[379,380,381,382],"li",{},"credits-equivalent: integer, ",[383,384,385],"code",{},"10000 = 1 USDT",[379,387,388,389],{},"shares: integer micro-shares, ",[383,390,391],{},"1000000 = 1 share",[379,393,394,395],{},"IDR: integer minor unit, exponent ",[383,396,397],{},"0",[379,399,400,401],{},"FX rate: IDR per ",[383,402,403],{},"1 USDT",[379,405,406,407],{},"BPS denominator: ",[383,408,409],{},"10000",[362,411,412],{},"No floating settlement values are persisted.",[371,414,416],{"id":415},"fx-freshness","FX freshness",[376,418,419,426,432],{},[379,420,421,422,425],{},"target freshness: ",[383,423,424],{},"\u003C= 30"," seconds",[379,427,428,429,425],{},"hard stale threshold: ",[383,430,431],{},"120",[379,433,434],{},"stale FX beyond hard threshold -> execution fails before wallet mutation",[371,436,438],{"id":437},"fee-model","Fee model",[362,440,441],{},"Current wallet quote conversion applies:",[376,443,444],{},[379,445,446],{},[383,447,448],{},"fx_fee_bps",[362,450,451,454],{},[383,452,453],{},"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\u002Fexecution path does not add it to wallet buy\u002Fsell\u002Fredemption conversion formulas.",[362,456,457],{},"Rules:",[376,459,460,463,473,476],{},[379,461,462],{},"fee values are non-negative integers",[379,464,465,468,469,472],{},[383,466,467],{},"fx_fee_bps + operator_fee_bps"," must stay ",[383,470,471],{},"\u003C 10000"," at operator-config validation time",[379,474,475],{},"buy applies fee before AMM quote",[379,477,478],{},"sell and redemption apply fee after credits-equivalent proceeds known",[371,480,482],{"id":481},"buy-formula","Buy formula",[362,484,485],{},"Given:",[376,487,488,493,498],{},[379,489,490],{},[383,491,492],{},"amount_minor",[379,494,495],{},[383,496,497],{},"idr_per_usdt",[379,499,500],{},[383,501,448],{},[503,504,510],"pre",{"className":505,"code":507,"language":508,"meta":509},[506],"language-text","net_bps = 10000 - fx_fee_bps\ncredits_equivalent = floor(amount_minor * net_bps * 10000 \u002F (10000 * idr_per_usdt))\n","text","",[383,511,507],{"__ignoreMap":509},[362,513,514,515,517],{},"Debit amount remains original ",[383,516,492],{},".",[371,519,521],{"id":520},"sell-formula","Sell formula",[362,523,524],{},"Given AMM credits-equivalent proceeds:",[503,526,529],{"className":527,"code":528,"language":508,"meta":509},[506],"net_bps = 10000 - fx_fee_bps\nexternal_amount_minor = floor(credits * idr_per_usdt * net_bps \u002F (10000 * 10000))\n",[383,530,528],{"__ignoreMap":509},[371,532,534],{"id":533},"redemption-formula","Redemption formula",[503,536,539],{"className":537,"code":538,"language":508,"meta":509},[506],"credits_equivalent = floor(shares_micro * 10000 \u002F 1000000)\nnet_bps = 10000 - fx_fee_bps\nexternal_amount_minor = floor(credits_equivalent * idr_per_usdt * net_bps \u002F (10000 * 10000))\n",[383,540,538],{"__ignoreMap":509},[371,542,544],{"id":543},"rounding-rule","Rounding rule",[362,546,547],{},"Always floor final integer conversion. Never round up payout or buying power.",[371,549,551],{"id":550},"quote-safety","Quote safety",[362,553,554],{},"Execution rejects when:",[376,556,557,560,563],{},[379,558,559],{},"quote ID missing or changed",[379,561,562],{},"FX snapshot stale beyond hard threshold",[379,564,565],{},"final execution worse than accepted slippage",[371,567,569],{"id":568},"why-this-matters-for-operators","Why this matters for operators",[376,571,572,575,578],{},[379,573,574],{},"wallet side always sees integer IDR minor amounts",[379,576,577],{},"webhook and reporting APIs expose already-rounded final values",[379,579,580],{},"operator reconciliation should compare integer amounts only",[371,582,584],{"id":583},"polyflight-boundary","Polyflight boundary",[362,586,587,588,590,591,593],{},"Polyflight debits the exact IDR stake and credits the exact stored IDR win, full refund, or compensation. It does not use ",[383,589,448],{},", ",[383,592,453],{},", Opinion quote snapshots, slippage, or current FX at any wallet boundary.",[362,595,596,597,600,601,604],{},"Before boarding, a v5 flight freezes one canonical 8-decimal Indodax ",[383,598,599],{},"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 ",[383,602,603],{},"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.",{"title":509,"searchDepth":606,"depth":606,"links":607},2,[608,609,610,611,612,613,614,615,616,617],{"id":373,"depth":606,"text":374},{"id":415,"depth":606,"text":416},{"id":437,"depth":606,"text":438},{"id":481,"depth":606,"text":482},{"id":520,"depth":606,"text":521},{"id":533,"depth":606,"text":534},{"id":543,"depth":606,"text":544},{"id":550,"depth":606,"text":551},{"id":568,"depth":606,"text":569},{"id":583,"depth":606,"text":584},"Opinion FX snapshots\u002Ffees and the separate comparison-only Polyflight valuation policy.","md",null,{},true,{"title":78,"description":618},"vZZX2tHNZUzp0Xl31wO0XJQ47oRtdKCSgPWLYllMuL0",[626,628],{"title":74,"path":75,"stem":76,"description":627,"children":-1},"Buy, sell, and redemption state transitions across OpenPoly and operator systems.",{"title":10,"path":87,"stem":88,"description":629,"children":-1},"Operator dashboard surfaces and their purpose.",1789570129132]