@lightconexyz/lightcone-sdk 0.8.1-rc.8 → 0.8.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +198 -10
- package/dist/auth/client.d.ts +27 -1
- package/dist/auth/client.d.ts.map +1 -1
- package/dist/auth/client.js +94 -4
- package/dist/auth/client.js.map +1 -1
- package/dist/auth/index.d.ts +59 -5
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +31 -5
- package/dist/auth/index.js.map +1 -1
- package/dist/client.d.ts +49 -3
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +70 -2
- package/dist/client.js.map +1 -1
- package/dist/context.d.ts +59 -3
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +303 -6
- package/dist/context.js.map +1 -1
- package/dist/domain/market/client.d.ts +16 -0
- package/dist/domain/market/client.d.ts.map +1 -1
- package/dist/domain/market/client.js +33 -0
- package/dist/domain/market/client.js.map +1 -1
- package/dist/domain/market/convert.d.ts.map +1 -1
- package/dist/domain/market/convert.js +24 -10
- package/dist/domain/market/convert.js.map +1 -1
- package/dist/domain/market/index.d.ts +18 -4
- package/dist/domain/market/index.d.ts.map +1 -1
- package/dist/domain/market/index.js.map +1 -1
- package/dist/domain/market/outcome.d.ts +9 -3
- package/dist/domain/market/outcome.d.ts.map +1 -1
- package/dist/domain/market/outcome.js +10 -7
- package/dist/domain/market/outcome.js.map +1 -1
- package/dist/domain/market/tokens.js +8 -2
- package/dist/domain/market/tokens.js.map +1 -1
- package/dist/domain/market/wire.d.ts +20 -3
- package/dist/domain/market/wire.d.ts.map +1 -1
- package/dist/domain/market/wire.js.map +1 -1
- package/dist/domain/order/client.d.ts +8 -7
- package/dist/domain/order/client.d.ts.map +1 -1
- package/dist/domain/order/client.js +23 -8
- package/dist/domain/order/client.js.map +1 -1
- package/dist/domain/orderbook/client.d.ts +7 -1
- package/dist/domain/orderbook/client.d.ts.map +1 -1
- package/dist/domain/orderbook/client.js +54 -1
- package/dist/domain/orderbook/client.js.map +1 -1
- package/dist/domain/orderbook/index.d.ts +7 -9
- package/dist/domain/orderbook/index.d.ts.map +1 -1
- package/dist/domain/orderbook/index.js +28 -24
- package/dist/domain/orderbook/index.js.map +1 -1
- package/dist/domain/orderbook/state.d.ts +21 -16
- package/dist/domain/orderbook/state.d.ts.map +1 -1
- package/dist/domain/orderbook/state.js +36 -15
- package/dist/domain/orderbook/state.js.map +1 -1
- package/dist/domain/orderbook/ticker.d.ts +1 -0
- package/dist/domain/orderbook/ticker.d.ts.map +1 -1
- package/dist/domain/orderbook/ticker.js.map +1 -1
- package/dist/domain/orderbook/wire.d.ts +34 -10
- package/dist/domain/orderbook/wire.d.ts.map +1 -1
- package/dist/domain/orderbook/wire.js +47 -0
- package/dist/domain/orderbook/wire.js.map +1 -1
- package/dist/domain/position/builders.d.ts +6 -2
- package/dist/domain/position/builders.d.ts.map +1 -1
- package/dist/domain/position/builders.js +24 -8
- package/dist/domain/position/builders.js.map +1 -1
- package/dist/domain/position/client.d.ts +166 -12
- package/dist/domain/position/client.d.ts.map +1 -1
- package/dist/domain/position/client.js +614 -15
- package/dist/domain/position/client.js.map +1 -1
- package/dist/domain/position/index.d.ts +58 -3
- package/dist/domain/position/index.d.ts.map +1 -1
- package/dist/domain/position/index.js +1 -0
- package/dist/domain/position/index.js.map +1 -1
- package/dist/domain/position/state.d.ts +118 -0
- package/dist/domain/position/state.d.ts.map +1 -0
- package/dist/domain/position/state.js +262 -0
- package/dist/domain/position/state.js.map +1 -0
- package/dist/env.d.ts.map +1 -1
- package/dist/env.js +2 -2
- package/dist/env.js.map +1 -1
- package/dist/error.d.ts +32 -2
- package/dist/error.d.ts.map +1 -1
- package/dist/error.js +59 -1
- package/dist/error.js.map +1 -1
- package/dist/http/client.d.ts +76 -1
- package/dist/http/client.d.ts.map +1 -1
- package/dist/http/client.js +259 -39
- package/dist/http/client.js.map +1 -1
- package/dist/http/credentialRestorer.d.ts +49 -0
- package/dist/http/credentialRestorer.d.ts.map +1 -0
- package/dist/http/credentialRestorer.js +3 -0
- package/dist/http/credentialRestorer.js.map +1 -0
- package/dist/http/index.d.ts +1 -0
- package/dist/http/index.d.ts.map +1 -1
- package/dist/http/index.js.map +1 -1
- package/dist/index.d.ts +6 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -1
- package/dist/index.js.map +1 -1
- package/dist/prelude.d.ts +10 -7
- package/dist/prelude.d.ts.map +1 -1
- package/dist/prelude.js +12 -2
- package/dist/prelude.js.map +1 -1
- package/dist/privy/client.d.ts +4 -0
- package/dist/privy/client.d.ts.map +1 -1
- package/dist/privy/client.js +4 -0
- package/dist/privy/client.js.map +1 -1
- package/dist/privy/index.d.ts +4 -4
- package/dist/privy/index.d.ts.map +1 -1
- package/dist/privy/index.js +11 -16
- package/dist/privy/index.js.map +1 -1
- package/dist/program/builder.d.ts +13 -11
- package/dist/program/builder.d.ts.map +1 -1
- package/dist/program/builder.js +31 -16
- package/dist/program/builder.js.map +1 -1
- package/dist/program/constants.d.ts +1 -0
- package/dist/program/constants.d.ts.map +1 -1
- package/dist/program/constants.js +1 -0
- package/dist/program/constants.js.map +1 -1
- package/dist/program/envelope.d.ts +14 -16
- package/dist/program/envelope.d.ts.map +1 -1
- package/dist/program/envelope.js +48 -39
- package/dist/program/envelope.js.map +1 -1
- package/dist/program/index.d.ts +2 -2
- package/dist/program/index.d.ts.map +1 -1
- package/dist/program/index.js +6 -4
- package/dist/program/index.js.map +1 -1
- package/dist/program/instructions.d.ts +17 -9
- package/dist/program/instructions.d.ts.map +1 -1
- package/dist/program/instructions.js +40 -19
- package/dist/program/instructions.js.map +1 -1
- package/dist/program/orders.d.ts +7 -8
- package/dist/program/orders.d.ts.map +1 -1
- package/dist/program/orders.js +20 -22
- package/dist/program/orders.js.map +1 -1
- package/dist/program/types.d.ts +4 -3
- package/dist/program/types.d.ts.map +1 -1
- package/dist/program/types.js.map +1 -1
- package/dist/rpc.d.ts +89 -1
- package/dist/rpc.d.ts.map +1 -1
- package/dist/rpc.js +285 -4
- package/dist/rpc.js.map +1 -1
- package/dist/shared/api_response.d.ts +16 -1
- package/dist/shared/api_response.d.ts.map +1 -1
- package/dist/shared/api_response.js +26 -1
- package/dist/shared/api_response.js.map +1 -1
- package/dist/shared/index.d.ts +3 -3
- package/dist/shared/index.d.ts.map +1 -1
- package/dist/shared/index.js +13 -6
- package/dist/shared/index.js.map +1 -1
- package/dist/shared/json.d.ts +5 -0
- package/dist/shared/json.d.ts.map +1 -0
- package/dist/shared/json.js +38 -0
- package/dist/shared/json.js.map +1 -0
- package/dist/shared/rejection.d.ts.map +1 -1
- package/dist/shared/rejection.js +8 -0
- package/dist/shared/rejection.js.map +1 -1
- package/dist/shared/scaling.d.ts +30 -18
- package/dist/shared/scaling.d.ts.map +1 -1
- package/dist/shared/scaling.js +153 -95
- package/dist/shared/scaling.js.map +1 -1
- package/dist/shared/signing.d.ts +17 -0
- package/dist/shared/signing.d.ts.map +1 -1
- package/dist/shared/signing.js +27 -0
- package/dist/shared/signing.js.map +1 -1
- package/dist/shared/types.d.ts +9 -7
- package/dist/shared/types.d.ts.map +1 -1
- package/dist/shared/types.js +12 -4
- package/dist/shared/types.js.map +1 -1
- package/dist/ws/client.browser.d.ts +4 -0
- package/dist/ws/client.browser.d.ts.map +1 -1
- package/dist/ws/client.browser.js +13 -1
- package/dist/ws/client.browser.js.map +1 -1
- package/dist/ws/client.node.d.ts +4 -0
- package/dist/ws/client.node.d.ts.map +1 -1
- package/dist/ws/client.node.js +13 -1
- package/dist/ws/client.node.js.map +1 -1
- package/dist/ws/index.d.ts +24 -0
- package/dist/ws/index.d.ts.map +1 -1
- package/dist/ws/index.js +176 -2
- package/dist/ws/index.js.map +1 -1
- package/dist/ws/subscriptions.d.ts +12 -1
- package/dist/ws/subscriptions.d.ts.map +1 -1
- package/dist/ws/subscriptions.js +11 -0
- package/dist/ws/subscriptions.js.map +1 -1
- package/dist/ws/types.d.ts +5 -0
- package/dist/ws/types.d.ts.map +1 -1
- package/dist/ws/types.js.map +1 -1
- package/package.json +6 -2
package/dist/context.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BA,8CAYC;AAWD,wDA2CC;AAED,oDAKC;AAED,wDAOC;AAED,0CAgDC;AA/JD,mCAAmC;AAInC,+CAMuB;AAiBvB,SAAgB,iBAAiB,CAAC,GAAkB;IAClD,GAAG,CAAC,gBAAgB,CAAC,qBAAqB,EAAE,CAAC;IAC7C,MAAM,IAAI,GACR,GAAG,CAAC,gBAAgB,CAAC,MAAM,KAAK,uBAAS,CAAC,OAAO;QAC/C,CAAC,CAAC,GAAG,CAAC,iBAAiB;QACvB,CAAC,CAAC,GAAG,CAAC,gBAAgB,IAAI,GAAG,CAAC,iBAAiB,CAAC;IACpD,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,gBAAQ,CAAC,UAAU,CACvB,0DAA0D,CAC3D,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,oBAAoB,CAC3B,GAAkB,EAClB,MAAiB;IAEjB,OAAO,MAAM,KAAK,uBAAS,CAAC,OAAO;QACjC,CAAC,CAAC,GAAG,CAAC,iBAAiB;QACvB,CAAC,CAAC,GAAG,CAAC,gBAAgB,CAAC;AAC3B,CAAC;AAEM,KAAK,UAAU,sBAAsB,CAC1C,GAAkB,EAClB,SAA2C;IAE3C,GAAG,CAAC,gBAAgB,CAAC,qBAAqB,EAAE,CAAC;IAC7C,MAAM,cAAc,GAAG,GAAG,CAAC,gBAAgB,CAAC,MAAM,CAAC;IACnD,MAAM,UAAU,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;IAE1C,iBAAiB;IACjB,IAAI,CAAC;QACH,OAAO,MAAM,SAAS,CAAC,UAAU,CAAC,CAAC;IACrC,CAAC;IAAC,OAAO,UAAU,EAAE,CAAC;QACpB,IAAI,CAAC,IAAA,mCAAqB,EAAC,UAAU,CAAC;YAAE,MAAM,UAAU,CAAC;IAC3D,CAAC;IAED,iCAAiC;IACjC,MAAM,IAAA,mBAAK,EAAC,iCAAmB,CAAC,CAAC;IACjC,IAAI,CAAC;QACH,OAAO,MAAM,SAAS,CAAC,UAAU,CAAC,CAAC;IACrC,CAAC;IAAC,OAAO,UAAU,EAAE,CAAC;QACpB,IAAI,CAAC,IAAA,mCAAqB,EAAC,UAAU,CAAC;YAAE,MAAM,UAAU,CAAC;QAEzD,qCAAqC;QACrC,MAAM,WAAW,GACf,cAAc,KAAK,uBAAS,CAAC,OAAO;YAClC,CAAC,CAAC,uBAAS,CAAC,MAAM;YAClB,CAAC,CAAC,uBAAS,CAAC,OAAO,CAAC;QACxB,MAAM,SAAS,GAAG,oBAAoB,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;QACzD,IAAI,SAAS,EAAE,CAAC;YACd,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,SAAS,CAAC,CAAC;gBAC1C,IAAI,WAAW,KAAK,uBAAS,CAAC,OAAO,EAAE,CAAC;oBACtC,GAAG,CAAC,gBAAgB,CAAC,aAAa,EAAE,CAAC;gBACvC,CAAC;qBAAM,CAAC;oBACN,GAAG,CAAC,gBAAgB,CAAC,YAAY,EAAE,CAAC;gBACtC,CAAC;gBACD,OAAO,MAAM,CAAC;YAChB,CAAC;YAAC,OAAO,SAAS,EAAE,CAAC;gBACnB,MAAM,SAAS,CAAC;YAClB,CAAC;QACH,CAAC;QACD,MAAM,UAAU,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAgB,oBAAoB,CAClC,GAAkB,EAClB,cAAyC;IAEzC,OAAO,cAAc,IAAI,GAAG,CAAC,aAAa,CAAC;AAC7C,CAAC;AAED,SAAgB,sBAAsB,CAAC,GAAkB;IACvD,IAAI,CAAC,GAAG,CAAC,eAAe,EAAE,CAAC;QACzB,MAAM,gBAAQ,CAAC,UAAU,CACvB,8GAA8G,CAC/G,CAAC;IACJ,CAAC;IACD,OAAO,GAAG,CAAC,eAAe,CAAC;AAC7B,CAAC;AAEM,KAAK,UAAU,eAAe,CACnC,GAAkB,EAClB,EAAyC;IAEzC,MAAM,EAAE,kBAAkB,EAAE,GAAG,wDAAa,kBAAkB,GAAC,CAAC;IAChE,MAAM,EAAE,QAAQ,EAAE,GAAG,wDAAa,SAAS,GAAC,CAAC;IAC7C,MAAM,EAAE,WAAW,EAAE,GAAG,wDAAa,QAAQ,GAAC,CAAC;IAE/C,MAAM,QAAQ,GAAG,sBAAsB,CAAC,GAAG,CAAC,CAAC;IAE7C,+BAA+B;IAC/B,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,sBAAsB,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,CAC/D,IAAI,CAAC,kBAAkB,EAAE,CAC1B,CAAC;IACF,EAAE,CAAC,eAAe,GAAG,SAAS,CAAC;IAE/B,QAAQ,QAAQ,CAAC,IAAI,EAAE,CAAC;QACtB,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YACjC,OAAO,sBAAsB,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,CAC1C,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,CACxC,CAAC;QACJ,CAAC;QACD,KAAK,eAAe,CAAC,CAAC,CAAC;YACrB,MAAM,OAAO,GAAG,EAAE,CAAC,SAAS,CAAC,EAAE,oBAAoB,EAAE,KAAK,EAAE,CAAC,CAAC;YAC9D,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,MAAM;iBACtC,eAAe,CAAC,OAAO,CAAC;iBACxB,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;gBACtB,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC7D,IAAI,kBAAkB,CAAC,GAAG,CAAC;oBAAE,MAAM,QAAQ,CAAC,aAAa,EAAE,CAAC;gBAC5D,MAAM,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAC9B,CAAC,CAAC,CAAC;YACL,OAAO,sBAAsB,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,CAC1C,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC,CACrC,CAAC;QACJ,CAAC;QACD,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,OAAO,GAAG,EAAE,CAAC,SAAS,CAAC,EAAE,oBAAoB,EAAE,KAAK,EAAE,CAAC,CAAC;YAC9D,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACzD,MAAM,GAAG,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,6BAA6B,CAAC;YAC/D,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,CAChC,GAAG,EACH,EAAE,SAAS,EAAE,QAAQ,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,EACrD,WAAW,CAAC,IAAI,CACjB,CAAC;YACF,OAAO,MAAM,CAAC,IAAI,CAAC;QACrB,CAAC;IACH,CAAC;AACH,CAAC","sourcesContent":["import type { Connection, PublicKey } from \"@solana/web3.js\";\nimport { SdkError } from \"./error\";\nimport type { LightconeHttp } from \"./http\";\nimport type { DepositSource } from \"./shared\";\nimport type { SigningStrategy } from \"./shared/signing\";\nimport {\n ActiveRpc,\n type RpcFailoverState,\n isInfrastructureError,\n sleep,\n FAST_RETRY_DELAY_MS,\n} from \"./rpcFailover\";\n\nexport interface ClientContext {\n readonly http: LightconeHttp;\n readonly programId: PublicKey;\n readonly primaryConnection?: Connection;\n readonly backupConnection?: Connection;\n readonly rpcFailoverState: RpcFailoverState;\n readonly depositSource: DepositSource;\n readonly signingStrategy?: SigningStrategy;\n orderNonce?(): number | undefined;\n setOrderNonce?(nonce: number): void;\n\n /** @deprecated Use primaryConnection — kept for backward compat in domain sub-clients. */\n readonly connection?: Connection;\n}\n\nexport function requireConnection(ctx: ClientContext): Connection {\n ctx.rpcFailoverState.maybeRecoverToPrimary();\n const conn =\n ctx.rpcFailoverState.active === ActiveRpc.Primary\n ? ctx.primaryConnection\n : ctx.backupConnection ?? ctx.primaryConnection;\n if (!conn) {\n throw SdkError.validation(\n \"RPC client not configured — use .rpcUrl() on the builder\"\n );\n }\n return conn;\n}\n\nfunction resolveConnectionFor(\n ctx: ClientContext,\n target: ActiveRpc\n): Connection | undefined {\n return target === ActiveRpc.Primary\n ? ctx.primaryConnection\n : ctx.backupConnection;\n}\n\nexport async function connectionWithFailover<T>(\n ctx: ClientContext,\n operation: (conn: Connection) => Promise<T>\n): Promise<T> {\n ctx.rpcFailoverState.maybeRecoverToPrimary();\n const originalActive = ctx.rpcFailoverState.active;\n const activeConn = requireConnection(ctx);\n\n // First attempt.\n try {\n return await operation(activeConn);\n } catch (firstError) {\n if (!isInfrastructureError(firstError)) throw firstError;\n }\n\n // Fast retry on same connection.\n await sleep(FAST_RETRY_DELAY_MS);\n try {\n return await operation(activeConn);\n } catch (retryError) {\n if (!isInfrastructureError(retryError)) throw retryError;\n\n // Flip and try the other connection.\n const otherTarget =\n originalActive === ActiveRpc.Primary\n ? ActiveRpc.Backup\n : ActiveRpc.Primary;\n const otherConn = resolveConnectionFor(ctx, otherTarget);\n if (otherConn) {\n try {\n const result = await operation(otherConn);\n if (otherTarget === ActiveRpc.Primary) {\n ctx.rpcFailoverState.flipToPrimary();\n } else {\n ctx.rpcFailoverState.flipToBackup();\n }\n return result;\n } catch (bothError) {\n throw bothError;\n }\n }\n throw retryError;\n }\n}\n\nexport function resolveDepositSource(\n ctx: ClientContext,\n overrideSource: DepositSource | undefined\n): DepositSource {\n return overrideSource ?? ctx.depositSource;\n}\n\nexport function requireSigningStrategy(ctx: ClientContext): SigningStrategy {\n if (!ctx.signingStrategy) {\n throw SdkError.validation(\n \"Signing strategy not configured — use .nativeSigner(), .externalSigner(), or .privyWalletId() on the builder\"\n );\n }\n return ctx.signingStrategy;\n}\n\nexport async function signAndSubmitTx(\n ctx: ClientContext,\n tx: import(\"@solana/web3.js\").Transaction\n): Promise<string> {\n const { isUserCancellation } = await import(\"./shared/signing\");\n const { SdkError } = await import(\"./error\");\n const { RetryPolicy } = await import(\"./http\");\n\n const strategy = requireSigningStrategy(ctx);\n\n // Get blockhash with failover.\n const { blockhash } = await connectionWithFailover(ctx, (conn) =>\n conn.getLatestBlockhash()\n );\n tx.recentBlockhash = blockhash;\n\n switch (strategy.type) {\n case \"native\": {\n tx.partialSign(strategy.keypair);\n return connectionWithFailover(ctx, (conn) =>\n conn.sendRawTransaction(tx.serialize())\n );\n }\n case \"walletAdapter\": {\n const txBytes = tx.serialize({ requireAllSignatures: false });\n const signedBytes = await strategy.signer\n .signTransaction(txBytes)\n .catch((err: unknown) => {\n const msg = err instanceof Error ? err.message : String(err);\n if (isUserCancellation(msg)) throw SdkError.userCancelled();\n throw SdkError.signing(msg);\n });\n return connectionWithFailover(ctx, (conn) =>\n conn.sendRawTransaction(signedBytes)\n );\n }\n case \"privy\": {\n const txBytes = tx.serialize({ requireAllSignatures: false });\n const base64Tx = Buffer.from(txBytes).toString(\"base64\");\n const url = `${ctx.http.baseUrl()}/api/privy/sign_and_send_tx`;\n const result = await ctx.http.post<{ hash: string }, object>(\n url,\n { wallet_id: strategy.walletId, base64_tx: base64Tx },\n RetryPolicy.None\n );\n return result.hash;\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"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","sourcesContent":["import { Transaction, type Connection, type PublicKey } from \"@solana/web3.js\";\nimport { SdkError } from \"./error\";\nimport type { LightconeHttp } from \"./http\";\nimport type { AuthCredentials } from \"./auth\";\nimport type { DepositSource, OrderbookRules } from \"./shared\";\nimport {\n signingStrategyWalletAddress,\n type SigningStrategy,\n} from \"./shared/signing\";\nimport {\n ActiveRpc,\n type RpcFailoverState,\n isInfrastructureError,\n sleep,\n FAST_RETRY_DELAY_MS,\n} from \"./rpcFailover\";\n\nexport interface ClientContext {\n readonly http: LightconeHttp;\n readonly programId: PublicKey;\n readonly primaryConnection?: Connection;\n readonly backupConnection?: Connection;\n readonly rpcFailoverState: RpcFailoverState;\n readonly depositSource: DepositSource;\n readonly signingStrategy?: SigningStrategy;\n /** Trusted application assertion that an external sponsor pays fees; omission is false. */\n readonly transactionSponsorshipEnabled?: boolean;\n /** Optional cached identity for auth-bound operations; callers must check expiry. */\n readonly authCredentials?: AuthCredentials;\n orderNonce?(): number | undefined;\n setOrderNonce?(nonce: number): void;\n readonly orderbookRulesCache?: Map<string, Promise<OrderbookRules>>;\n\n /** @deprecated Use primaryConnection — kept for backward compat in domain sub-clients. */\n readonly connection?: Connection;\n}\n\nexport function requireConnection(ctx: ClientContext): Connection {\n ctx.rpcFailoverState.maybeRecoverToPrimary();\n const conn =\n ctx.rpcFailoverState.active === ActiveRpc.Primary\n ? ctx.primaryConnection\n : ctx.backupConnection ?? ctx.primaryConnection;\n if (!conn) {\n throw SdkError.validation(\n \"RPC client not configured — use .rpcUrl() on the builder\"\n );\n }\n return conn;\n}\n\nfunction resolveConnectionFor(\n ctx: ClientContext,\n target: ActiveRpc\n): Connection | undefined {\n return target === ActiveRpc.Primary\n ? ctx.primaryConnection\n : ctx.backupConnection;\n}\n\nexport async function connectionWithFailover<T>(\n ctx: ClientContext,\n operation: (conn: Connection) => Promise<T>\n): Promise<T> {\n ctx.rpcFailoverState.maybeRecoverToPrimary();\n const originalActive = ctx.rpcFailoverState.active;\n const activeConn = requireConnection(ctx);\n\n // First attempt.\n try {\n return await operation(activeConn);\n } catch (firstError) {\n if (!isInfrastructureError(firstError)) throw firstError;\n }\n\n // Fast retry on same connection.\n await sleep(FAST_RETRY_DELAY_MS);\n try {\n return await operation(activeConn);\n } catch (retryError) {\n if (!isInfrastructureError(retryError)) throw retryError;\n\n // Flip and try the other connection.\n const otherTarget =\n originalActive === ActiveRpc.Primary\n ? ActiveRpc.Backup\n : ActiveRpc.Primary;\n const otherConn = resolveConnectionFor(ctx, otherTarget);\n if (otherConn) {\n try {\n const result = await operation(otherConn);\n if (otherTarget === ActiveRpc.Primary) {\n ctx.rpcFailoverState.flipToPrimary();\n } else {\n ctx.rpcFailoverState.flipToBackup();\n }\n return result;\n } catch (bothError) {\n throw bothError;\n }\n }\n throw retryError;\n }\n}\n\nexport function resolveDepositSource(\n ctx: ClientContext,\n overrideSource: DepositSource | undefined\n): DepositSource {\n return overrideSource ?? ctx.depositSource;\n}\n\nexport function requireSigningStrategy(ctx: ClientContext): SigningStrategy {\n if (!ctx.signingStrategy) {\n throw SdkError.validation(\n \"Signing strategy not configured — use .nativeSigner(), .externalSigner(), or .privyWalletId() on the builder\"\n );\n }\n return ctx.signingStrategy;\n}\n\n/** Capture one signer and sponsorship assertion before transaction work can yield. */\nfunction requireTransactionSigningContext(ctx: ClientContext): {\n strategy: SigningStrategy;\n sponsorshipEnabled: boolean;\n} {\n return {\n strategy: requireSigningStrategy(ctx),\n sponsorshipEnabled: ctx.transactionSponsorshipEnabled ?? false,\n };\n}\n\n/**\n * Reject invalid payer and sponsorship combinations before submission can yield.\n * Unsponsored known signers must control the payer being classified; sponsored\n * external flows may intentionally use a different payer, while native sponsorship\n * is rejected before blockhash RPC or caller-transaction mutation.\n */\nfunction validateTransactionFeeFundingContext(\n tx: import(\"@solana/web3.js\").Transaction,\n strategy: SigningStrategy,\n sponsorshipEnabled: boolean\n): void {\n if (!tx.feePayer) {\n throw SdkError.validation(\"transaction is missing a declared fee payer\");\n }\n if (sponsorshipEnabled) {\n if (strategy.type === \"native\") {\n throw SdkError.validation(\n \"transaction sponsorship is not supported with local-keypair signing\"\n );\n }\n return;\n }\n\n const signingAddress = signingStrategyWalletAddress(strategy);\n if (signingAddress && signingAddress !== tx.feePayer.toBase58()) {\n throw SdkError.validation(\n \"signing strategy does not control transaction fee payer\"\n );\n }\n}\n\n/**\n * Own the transaction message before asynchronous submission work begins.\n * A placeholder blockhash exists only long enough to serialize an ordinary\n * transaction that has not received its fresh blockhash yet.\n */\nfunction snapshotTransaction(tx: Transaction): Transaction {\n if (tx.recentBlockhash || tx.nonceInfo) {\n return Transaction.from(\n tx.serialize({ requireAllSignatures: false, verifySignatures: false })\n );\n }\n\n const serializable = new Transaction({\n feePayer: tx.feePayer,\n blockhash: \"11111111111111111111111111111111\",\n lastValidBlockHeight: tx.lastValidBlockHeight ?? 0,\n signatures: tx.signatures,\n });\n serializable.instructions = tx.instructions;\n const snapshot = Transaction.from(\n serializable.serialize({ requireAllSignatures: false, verifySignatures: false })\n );\n snapshot.recentBlockhash = undefined;\n snapshot.lastValidBlockHeight = undefined;\n return snapshot;\n}\n\n/** Publish local signatures only when the caller still holds the submitted message. */\nfunction copySignaturesIfMessageUnchanged(\n signed: Transaction,\n callerTransaction: Transaction\n): void {\n try {\n if (\n !Buffer.from(signed.serializeMessage()).equals(\n Buffer.from(callerTransaction.serializeMessage())\n )\n ) {\n return;\n }\n } catch {\n return;\n }\n callerTransaction.signatures = signed.signatures.map(({ publicKey, signature }) => ({\n publicKey,\n signature: signature ? Buffer.from(signature) : null,\n }));\n}\n\n/**\n * Reject proven fee shortfalls before signing while preserving submission on unknown evidence.\n *\n * The transaction's prepared message supplies the exact fee and declared fee\n * payer. Fee or balance lookup failure is deliberately best-effort; planner-owned\n * SOL admission remains fail-closed before reaching this shared boundary. The\n * signer and sponsorship value were captured together before RPC work.\n */\nasync function preflightTransactionFeeFunding(\n ctx: ClientContext,\n tx: import(\"@solana/web3.js\").Transaction,\n strategy: SigningStrategy,\n sponsorshipEnabled: boolean\n): Promise<void> {\n validateTransactionFeeFundingContext(tx, strategy, sponsorshipEnabled);\n if (sponsorshipEnabled) return;\n const feePayer = tx.feePayer;\n if (!feePayer) {\n throw SdkError.validation(\"transaction is missing a declared fee payer\");\n }\n\n const { Rpc } = await import(\"./rpc\");\n const rpc = new Rpc(ctx);\n let requiredLamports: bigint;\n try {\n requiredLamports = await rpc.estimatePreparedTransactionFee(tx);\n } catch {\n return;\n }\n let availableLamports: bigint;\n try {\n availableLamports = await rpc.balanceLamports(feePayer);\n } catch {\n return;\n }\n if (availableLamports < requiredLamports) {\n throw SdkError.insufficientSolForTransactionFees(\n availableLamports,\n requiredLamports\n );\n }\n}\n\n/**\n * Sign and submit a transaction using the client's signing strategy.\n *\n * Fetches a recent blockhash automatically. Returns as soon as the RPC\n * accepts the transaction — inclusion is not awaited. When follow-up work\n * depends on this transaction's on-chain effects, use\n * {@link signAndSubmitTxConfirmed} instead.\n * Unsponsored submission checks exact fee funding before signing when both\n * required RPC observations are available.\n */\nexport async function signAndSubmitTx(\n ctx: ClientContext,\n tx: import(\"@solana/web3.js\").Transaction\n): Promise<string> {\n const { strategy, sponsorshipEnabled } = requireTransactionSigningContext(ctx);\n const { signature } = await signAndSubmitTxInner(ctx, tx, strategy, sponsorshipEnabled);\n return signature;\n}\n\n/**\n * Sign and submit a transaction, then wait until it reaches `confirmed`\n * commitment on-chain.\n *\n * Sequential flows should prefer this over {@link signAndSubmitTx}: a\n * transaction that depends on a prior transaction's state is only safe to\n * send once that prior transaction has confirmed. See `Rpc.confirmSignature`\n * for the terminal error taxonomy.\n *\n * Expiry (`\"TransactionExpired\"`) is only ever reported when the submitted\n * transaction provably still carries the blockhash this function fetched:\n * always true for `native`, verified against the signed bytes for\n * `walletAdapter`, and never assumed for `privy` (the backend signs and\n * submits out of the SDK's sight) — those cases end in\n * `\"ConfirmationTimeout\"` at the poll cap instead.\n */\nexport async function signAndSubmitTxConfirmed(\n ctx: ClientContext,\n tx: import(\"@solana/web3.js\").Transaction\n): Promise<string> {\n const confirmed = await signAndSubmitTxConfirmedWithSlot(ctx, tx);\n return confirmed.signature;\n}\n\nexport interface ConfirmedTransaction {\n signature: string;\n slot: number;\n}\n\n/**\n * Sign and submit a transaction, wait for confirmed commitment, and return\n * both its signature and processing slot.\n */\nexport async function signAndSubmitTxConfirmedWithSlot(\n ctx: ClientContext,\n tx: import(\"@solana/web3.js\").Transaction\n): Promise<ConfirmedTransaction> {\n const { strategy, sponsorshipEnabled } = requireTransactionSigningContext(ctx);\n return signAndSubmitTxConfirmedWithSlotUsingStrategy(\n ctx,\n tx,\n strategy,\n sponsorshipEnabled\n );\n}\n\n/**\n * Sign, submit once, and confirm a transaction whose message was fee-estimated.\n *\n * This function preserves the prepared blockhash. A wallet adapter may add\n * signatures but may not replace any message field. Signed bytes are sent once to\n * the active RPC because a transport failure may occur after acceptance.\n * The unchanged message receives the same best-effort fee-funding preflight as an\n * ordinary transaction before the signer runs. A sponsored external signer may\n * differ from the declared fee payer. The caller-owned transaction is snapshotted\n * before the first await so later caller mutation cannot change fee authority.\n */\nexport async function signAndSubmitPreparedTxConfirmedWithSlot(\n ctx: ClientContext,\n tx: import(\"@solana/web3.js\").Transaction\n): Promise<ConfirmedTransaction> {\n if (!tx.recentBlockhash) {\n throw SdkError.validation(\"prepared transaction is missing a recent blockhash\");\n }\n const { strategy, sponsorshipEnabled } = requireTransactionSigningContext(ctx);\n if (!tx.feePayer) {\n throw SdkError.validation(\"prepared transaction is missing a fee payer\");\n }\n validateTransactionFeeFundingContext(tx, strategy, sponsorshipEnabled);\n if (!sponsorshipEnabled && !signingStrategyWalletAddress(strategy)) {\n throw SdkError.validation(\"signing strategy wallet identity is required\");\n }\n const callerTransaction = tx;\n tx = snapshotTransaction(tx);\n await preflightTransactionFeeFunding(ctx, tx, strategy, sponsorshipEnabled);\n const signature = await signAndSubmitPreparedTxInner(\n ctx,\n tx,\n strategy,\n callerTransaction\n );\n const { Rpc } = await import(\"./rpc\");\n const status = await new Rpc(ctx).confirmSignatureStatus(signature, null);\n return { signature, slot: status.slot };\n}\n\n/** @internal Submit with a strategy already validated for an identity-bound operation. */\nexport async function signAndSubmitTxConfirmedUsingStrategy(\n ctx: ClientContext,\n tx: import(\"@solana/web3.js\").Transaction,\n strategy: SigningStrategy\n): Promise<string> {\n const sponsorshipEnabled = ctx.transactionSponsorshipEnabled ?? false;\n const confirmed = await signAndSubmitTxConfirmedWithSlotUsingStrategy(\n ctx,\n tx,\n strategy,\n sponsorshipEnabled\n );\n return confirmed.signature;\n}\n\nasync function signAndSubmitTxConfirmedWithSlotUsingStrategy(\n ctx: ClientContext,\n tx: import(\"@solana/web3.js\").Transaction,\n strategy: SigningStrategy,\n sponsorshipEnabled: boolean\n): Promise<ConfirmedTransaction> {\n const { signature, lastValidBlockHeight } = await signAndSubmitTxInner(\n ctx,\n tx,\n strategy,\n sponsorshipEnabled\n );\n const { Rpc } = await import(\"./rpc\");\n const status = await new Rpc(ctx).confirmSignatureStatus(\n signature,\n lastValidBlockHeight\n );\n return { signature, slot: status.slot };\n}\n\n/**\n * Prepare funding evidence, sign, send, and return the signature and expiry bound.\n *\n * The fresh blockhash feeds best-effort fee preflight before any signer runs.\n * Submission operates on a pre-await snapshot. The fresh blockhash is copied to\n * the caller transaction; local signatures follow only if its message still matches.\n * `lastValidBlockHeight` is `null` when the submitted wire bytes cannot be proven\n * to retain that blockhash because an external signer replaced it or the final\n * bytes were never visible to the SDK.\n */\nasync function signAndSubmitTxInner(\n ctx: ClientContext,\n tx: import(\"@solana/web3.js\").Transaction,\n strategy: SigningStrategy,\n sponsorshipEnabled: boolean\n): Promise<{ signature: string; lastValidBlockHeight: number | null }> {\n validateTransactionFeeFundingContext(tx, strategy, sponsorshipEnabled);\n const callerTransaction = tx;\n tx = snapshotTransaction(tx);\n const { isUserCancellation } = await import(\"./shared/signing\");\n const { SdkError } = await import(\"./error\");\n const { RetryPolicy } = await import(\"./http\");\n\n // Get blockhash with failover, at `confirmed` commitment (pinned, not the\n // Connection's default — matching the Rust and Python SDKs).\n const { blockhash, lastValidBlockHeight } = await connectionWithFailover(\n ctx,\n (conn) => conn.getLatestBlockhash(\"confirmed\")\n );\n tx.recentBlockhash = blockhash;\n tx.lastValidBlockHeight = lastValidBlockHeight;\n callerTransaction.recentBlockhash = blockhash;\n callerTransaction.lastValidBlockHeight = lastValidBlockHeight;\n await preflightTransactionFeeFunding(ctx, tx, strategy, sponsorshipEnabled);\n\n switch (strategy.type) {\n case \"native\": {\n tx.partialSign(strategy.keypair);\n copySignaturesIfMessageUnchanged(tx, callerTransaction);\n const signature = await connectionWithFailover(ctx, (conn) =>\n conn.sendRawTransaction(tx.serialize())\n );\n return { signature, lastValidBlockHeight };\n }\n case \"walletAdapter\": {\n const expectedMessage = tx.serializeMessage();\n const txBytes = tx.serialize({ requireAllSignatures: false });\n const signedBytes = await strategy.signer\n .signTransaction(txBytes)\n .catch((err: unknown) => {\n const msg = err instanceof Error ? err.message : String(err);\n if (isUserCancellation(msg)) throw SdkError.userCancelled();\n throw SdkError.signing(msg);\n });\n const signedBlockhashIsUnchanged = await validateOrdinarySignedTransaction(\n signedBytes,\n expectedMessage,\n blockhash\n );\n const signature = await connectionWithFailover(ctx, (conn) =>\n conn.sendRawTransaction(signedBytes)\n );\n return {\n signature,\n lastValidBlockHeight: signedBlockhashIsUnchanged\n ? lastValidBlockHeight\n : null,\n };\n }\n case \"privy\": {\n const txBytes = tx.serialize({ requireAllSignatures: false });\n const base64Tx = Buffer.from(txBytes).toString(\"base64\");\n const url = `${ctx.http.baseUrl()}/api/privy/sign_and_send_tx`;\n const result = await ctx.http.post<{ hash: string }, object>(\n url,\n { wallet_id: strategy.walletId, base64_tx: base64Tx },\n RetryPolicy.None\n );\n // The backend signs and submits server-side; the SDK never sees the\n // final wire bytes, so the blockhash it set cannot be trusted for\n // expiry detection.\n return { signature: result.hash, lastValidBlockHeight: null };\n }\n }\n}\n\n/**\n * Sign and submit once without replacing the planner's prepared blockhash.\n *\n * Native signing preserves the message by construction. Wallet-adapter bytes are\n * compared with the prepared message before submission. Privy is excluded because\n * this SDK cannot inspect its final wire message. The native signature is published\n * to an unchanged caller message before the one-shot send so an uncertain outcome\n * remains reconcilable. Both admitted strategies use the active connection directly.\n */\nasync function signAndSubmitPreparedTxInner(\n ctx: ClientContext,\n tx: import(\"@solana/web3.js\").Transaction,\n strategy: SigningStrategy,\n callerTransaction: import(\"@solana/web3.js\").Transaction\n): Promise<string> {\n const { isUserCancellation } = await import(\"./shared/signing\");\n\n switch (strategy.type) {\n case \"native\":\n tx.partialSign(strategy.keypair);\n copySignaturesIfMessageUnchanged(tx, callerTransaction);\n return requireConnection(ctx).sendRawTransaction(tx.serialize());\n case \"walletAdapter\": {\n const expectedMessage = tx.serializeMessage();\n const txBytes = tx.serialize({ requireAllSignatures: false });\n const signedBytes = await strategy.signer\n .signTransaction(txBytes)\n .catch((error: unknown) => {\n const message = error instanceof Error ? error.message : String(error);\n if (isUserCancellation(message)) throw SdkError.userCancelled();\n throw SdkError.signing(message);\n });\n await assertPreparedSignedMessage(signedBytes, expectedMessage);\n return requireConnection(ctx).sendRawTransaction(signedBytes);\n }\n case \"privy\":\n throw SdkError.validation(\n \"prepared transaction submission cannot verify a Privy-signed message\"\n );\n }\n}\n\n/**\n * Enforce the fee-preflight authority boundary after wallet-adapter signing.\n * Signatures may change, but any account, instruction, fee payer, or blockhash\n * change rejects the bytes before they reach RPC.\n */\nasync function assertPreparedSignedMessage(\n signedBytes: Uint8Array,\n expectedMessage: Uint8Array\n): Promise<void> {\n const { Transaction } = await import(\"@solana/web3.js\");\n let signedMessage: Uint8Array;\n try {\n signedMessage = Transaction.from(signedBytes).serializeMessage();\n } catch (error) {\n throw SdkError.signing(\n `signed transaction is invalid: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n if (!Buffer.from(signedMessage).equals(Buffer.from(expectedMessage))) {\n throw SdkError.validation(\n \"wallet changed the fee-prepared transaction message\"\n );\n }\n}\n\n/**\n * Allow an external signer to replace only the ordinary transaction blockhash.\n *\n * Fee payer, accounts, and instructions are the authority used by fee preflight\n * and must survive signing. A replacement blockhash remains allowed, but its\n * original expiry bound is discarded.\n */\nasync function validateOrdinarySignedTransaction(\n signedBytes: Uint8Array,\n expectedMessage: Uint8Array,\n expectedBlockhash: string\n): Promise<boolean> {\n const { Transaction } = await import(\"@solana/web3.js\");\n let signed: import(\"@solana/web3.js\").Transaction;\n try {\n signed = Transaction.from(signedBytes);\n } catch (error) {\n throw SdkError.signing(\n `signed transaction is invalid: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n const blockhashUnchanged = signed.recentBlockhash === expectedBlockhash;\n signed.recentBlockhash = expectedBlockhash;\n if (!Buffer.from(signed.serializeMessage()).equals(Buffer.from(expectedMessage))) {\n throw SdkError.validation(\n \"wallet changed the transaction message beyond recent blockhash\"\n );\n }\n return blockhashUnchanged;\n}\n"]}
|
|
@@ -15,6 +15,15 @@ export interface GlobalDepositAssetsResult {
|
|
|
15
15
|
assets: GlobalDepositAsset[];
|
|
16
16
|
validationErrors: string[];
|
|
17
17
|
}
|
|
18
|
+
export interface FavoriteMarkets {
|
|
19
|
+
market_pubkeys: string[];
|
|
20
|
+
next_cursor: number | null;
|
|
21
|
+
has_more: boolean;
|
|
22
|
+
}
|
|
23
|
+
export interface FavoriteMarketUpdate {
|
|
24
|
+
market_pubkey: string;
|
|
25
|
+
favorited: boolean;
|
|
26
|
+
}
|
|
18
27
|
export declare class Markets {
|
|
19
28
|
private readonly client;
|
|
20
29
|
constructor(client: ClientContext);
|
|
@@ -39,6 +48,13 @@ export declare class Markets {
|
|
|
39
48
|
* `GlobalDepositAssetsResult.validationErrors`.
|
|
40
49
|
*/
|
|
41
50
|
globalDepositAssets(): Promise<GlobalDepositAssetsResult>;
|
|
51
|
+
favoriteMarkets(limit?: number, cursor?: number): Promise<FavoriteMarkets>;
|
|
52
|
+
favoriteMarketsWithCookies(limit: number | undefined, cursor: number | undefined, cookieHeader: string): Promise<FavoriteMarkets>;
|
|
53
|
+
private favoriteMarketsUrl;
|
|
54
|
+
addFavoriteMarket(marketPubkey: string): Promise<FavoriteMarketUpdate>;
|
|
55
|
+
addFavoriteMarketWithCookies(marketPubkey: string, cookieHeader: string): Promise<FavoriteMarketUpdate>;
|
|
56
|
+
removeFavoriteMarket(marketPubkey: string): Promise<FavoriteMarketUpdate>;
|
|
57
|
+
removeFavoriteMarketWithCookies(marketPubkey: string, cookieHeader: string): Promise<FavoriteMarketUpdate>;
|
|
42
58
|
getOnchain(market: PublicKey): Promise<ProgramMarket>;
|
|
43
59
|
getByIdOnchain(marketId: bigint): Promise<ProgramMarket>;
|
|
44
60
|
nextId(): Promise<bigint>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/domain/market/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAWnD,OAAO,KAAK,EAAE,MAAM,IAAI,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEnE,OAAO,EAAU,KAAK,kBAAkB,EAAE,KAAK,MAAM,EAAE,MAAM,SAAS,CAAC;AACvE,OAAO,KAAK,EACV,oBAAoB,EAEpB,kBAAkB,EAGnB,MAAM,QAAQ,CAAC;AAEhB,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,gBAAgB,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED;;;GAGG;AACH,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,kBAAkB,EAAE,CAAC;IAC7B,gBAAgB,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED,qBAAa,OAAO;IACN,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,aAAa;IAIlD,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS;IAMhC,iBAAiB,CACf,MAAM,EAAE,SAAS,EACjB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,GAClB,MAAM;IAIT,mBAAmB,CACjB,MAAM,EAAE,SAAS,EACjB,WAAW,EAAE,SAAS,EACtB,WAAW,EAAE,MAAM,GAClB,SAAS,EAAE;IAWR,GAAG,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IA0B5D,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAWxC,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAW5C,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAOpE,QAAQ,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAQ/C;;;OAGG;IACG,aAAa,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAKxE;;;;;;OAMG;IACG,mBAAmB,IAAI,OAAO,CAAC,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/domain/market/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -145,6 +145,39 @@ class Markets {
|
|
|
145
145
|
}
|
|
146
146
|
return { assets, validationErrors };
|
|
147
147
|
}
|
|
148
|
+
async favoriteMarkets(limit, cursor) {
|
|
149
|
+
const url = this.favoriteMarketsUrl(limit, cursor);
|
|
150
|
+
return this.client.http.get(url, http_1.RetryPolicy.Idempotent);
|
|
151
|
+
}
|
|
152
|
+
async favoriteMarketsWithCookies(limit, cursor, cookieHeader) {
|
|
153
|
+
const url = this.favoriteMarketsUrl(limit, cursor);
|
|
154
|
+
return this.client.http.getWithCookies(url, http_1.RetryPolicy.Idempotent, cookieHeader);
|
|
155
|
+
}
|
|
156
|
+
favoriteMarketsUrl(limit, cursor) {
|
|
157
|
+
const search = new URLSearchParams();
|
|
158
|
+
if (limit !== undefined)
|
|
159
|
+
search.set("limit", String(limit));
|
|
160
|
+
if (cursor !== undefined)
|
|
161
|
+
search.set("cursor", String(cursor));
|
|
162
|
+
const suffix = search.size > 0 ? `?${search.toString()}` : "";
|
|
163
|
+
return `${this.client.http.baseUrl()}/api/users/favorite-markets${suffix}`;
|
|
164
|
+
}
|
|
165
|
+
async addFavoriteMarket(marketPubkey) {
|
|
166
|
+
const url = `${this.client.http.baseUrl()}/api/users/favorite-markets/${encodeURIComponent(marketPubkey)}`;
|
|
167
|
+
return this.client.http.post(url, {}, http_1.RetryPolicy.Idempotent);
|
|
168
|
+
}
|
|
169
|
+
async addFavoriteMarketWithCookies(marketPubkey, cookieHeader) {
|
|
170
|
+
const url = `${this.client.http.baseUrl()}/api/users/favorite-markets/${encodeURIComponent(marketPubkey)}`;
|
|
171
|
+
return this.client.http.postWithCookies(url, {}, http_1.RetryPolicy.Idempotent, cookieHeader);
|
|
172
|
+
}
|
|
173
|
+
async removeFavoriteMarket(marketPubkey) {
|
|
174
|
+
const url = `${this.client.http.baseUrl()}/api/users/favorite-markets/${encodeURIComponent(marketPubkey)}`;
|
|
175
|
+
return this.client.http.delete(url, http_1.RetryPolicy.Idempotent);
|
|
176
|
+
}
|
|
177
|
+
async removeFavoriteMarketWithCookies(marketPubkey, cookieHeader) {
|
|
178
|
+
const url = `${this.client.http.baseUrl()}/api/users/favorite-markets/${encodeURIComponent(marketPubkey)}`;
|
|
179
|
+
return this.client.http.deleteWithCookies(url, http_1.RetryPolicy.Idempotent, cookieHeader);
|
|
180
|
+
}
|
|
148
181
|
// ── On-chain account fetchers (require Connection) ──────────────────
|
|
149
182
|
async getOnchain(market) {
|
|
150
183
|
const connection = (0, context_1.requireConnection)(this.client);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/domain/market/client.ts"],"names":[],"mappings":"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","sourcesContent":["import { type PublicKey } from \"@solana/web3.js\";\nimport type { ClientContext } from \"../../context\";\nimport { requireConnection } from \"../../context\";\nimport { SdkError } from \"../../error\";\nimport { ProgramSdkError } from \"../../program/error\";\nimport { RetryPolicy } from \"../../http\";\nimport {\n getMarketPda,\n getAllConditionalMintPdas,\n} from \"../../program/pda\";\nimport { deserializeMarket as deserializeProgramMarket } from \"../../program/accounts\";\nimport { deriveConditionId } from \"../../program/utils\";\nimport type { Market as ProgramMarket } from \"../../program/types\";\nimport { globalDepositAssetFromWire, marketFromWire } from \"./convert\";\nimport { Status, type GlobalDepositAsset, type Market } from \"./index\";\nimport type {\n DepositMintsResponse,\n GlobalDepositAssetsListResponse,\n MarketSearchResult,\n MarketsResponse,\n SingleMarketResponse,\n} from \"./wire\";\n\nexport interface MarketsResult {\n markets: Market[];\n validationErrors: string[];\n}\n\n/**\n * Result of fetching the global deposit asset whitelist. Assets that fail\n * validation are skipped with their errors reported separately.\n */\nexport interface GlobalDepositAssetsResult {\n assets: GlobalDepositAsset[];\n validationErrors: string[];\n}\n\nexport class Markets {\n constructor(private readonly client: ClientContext) {}\n\n // ── PDA helpers ──────────────────────────────────────────────────────\n\n pda(marketId: bigint): PublicKey {\n return getMarketPda(marketId, this.client.programId)[0];\n }\n\n // ── Market helpers ───────────────────────────────────────────────────\n\n deriveConditionId(\n oracle: PublicKey,\n questionId: Buffer,\n numOutcomes: number\n ): Buffer {\n return deriveConditionId(oracle, questionId, numOutcomes);\n }\n\n getConditionalMints(\n market: PublicKey,\n depositMint: PublicKey,\n numOutcomes: number\n ): PublicKey[] {\n return getAllConditionalMintPdas(\n market,\n depositMint,\n numOutcomes,\n this.client.programId\n ).map(([mint]) => mint);\n }\n\n // ── HTTP methods ─────────────────────────────────────────────────────\n\n async get(cursor?: number, limit?: number): Promise<MarketsResult> {\n const search = new URLSearchParams();\n if (cursor !== undefined) search.set(\"cursor\", String(cursor));\n if (limit !== undefined) search.set(\"limit\", String(limit));\n\n const suffix = search.size > 0 ? `?${search.toString()}` : \"\";\n const url = `${this.client.http.baseUrl()}/api/markets${suffix}`;\n\n const response = await this.client.http.get<MarketsResponse>(url, RetryPolicy.Idempotent);\n const markets: Market[] = [];\n const validationErrors: string[] = [];\n\n for (const marketWire of response.markets) {\n try {\n const market = marketFromWire(marketWire);\n if (market.status === Status.Active || market.status === Status.Resolved) {\n markets.push(market);\n }\n } catch (error) {\n validationErrors.push(error instanceof Error ? error.message : String(error));\n }\n }\n\n return { markets, validationErrors };\n }\n\n async getBySlug(slug: string): Promise<Market> {\n const url = `${this.client.http.baseUrl()}/api/markets/by-slug/${encodeURIComponent(slug)}`;\n const response = await this.client.http.get<SingleMarketResponse>(url, RetryPolicy.Idempotent);\n\n try {\n return marketFromWire(response.market);\n } catch (error) {\n throw SdkError.validation(error instanceof Error ? error.message : String(error));\n }\n }\n\n async getByPubkey(pubkey: string): Promise<Market> {\n const url = `${this.client.http.baseUrl()}/api/markets/${encodeURIComponent(pubkey)}`;\n const response = await this.client.http.get<SingleMarketResponse>(url, RetryPolicy.Idempotent);\n\n try {\n return marketFromWire(response.market);\n } catch (error) {\n throw SdkError.validation(error instanceof Error ? error.message : String(error));\n }\n }\n\n async search(query: string, limit?: number): Promise<MarketSearchResult[]> {\n const encoded = encodeURIComponent(query);\n const suffix = limit !== undefined ? `?limit=${limit}` : \"\";\n const url = `${this.client.http.baseUrl()}/api/markets/search/by-query/${encoded}${suffix}`;\n return this.client.http.get<MarketSearchResult[]>(url, RetryPolicy.Idempotent);\n }\n\n async featured(): Promise<MarketSearchResult[]> {\n const url = `${this.client.http.baseUrl()}/api/markets/search/featured`;\n const result = await this.client.http.get<MarketSearchResult[]>(url, RetryPolicy.Idempotent);\n return result.filter(\n (item) => item.market_status === Status.Active\n );\n }\n\n /**\n * Fetch deposit assets registered for a specific market, including each\n * asset's conditional mints.\n */\n async depositAssets(marketPubkey: string): Promise<DepositMintsResponse> {\n const url = `${this.client.http.baseUrl()}/api/markets/${encodeURIComponent(marketPubkey)}/deposit-assets`;\n return this.client.http.get<DepositMintsResponse>(url, RetryPolicy.Idempotent);\n }\n\n /**\n * Fetch the active global deposit asset whitelist (platform-scoped, not\n * market-bound).\n *\n * Assets that fail validation are skipped and their errors are returned in\n * `GlobalDepositAssetsResult.validationErrors`.\n */\n async globalDepositAssets(): Promise<GlobalDepositAssetsResult> {\n const url = `${this.client.http.baseUrl()}/api/global-deposit-assets`;\n const response = await this.client.http.get<GlobalDepositAssetsListResponse>(\n url,\n RetryPolicy.Idempotent\n );\n\n const assets: GlobalDepositAsset[] = [];\n const validationErrors: string[] = [];\n for (const wireAsset of response.assets) {\n try {\n assets.push(globalDepositAssetFromWire(wireAsset));\n } catch (error) {\n validationErrors.push(error instanceof Error ? error.message : String(error));\n }\n }\n\n return { assets, validationErrors };\n }\n\n // ── On-chain account fetchers (require Connection) ──────────────────\n\n async getOnchain(market: PublicKey): Promise<ProgramMarket> {\n const connection = requireConnection(this.client);\n const accountInfo = await connection.getAccountInfo(market);\n if (!accountInfo) {\n throw ProgramSdkError.accountNotFound(`Market at ${market.toBase58()}`);\n }\n return deserializeProgramMarket(accountInfo.data as Buffer);\n }\n\n async getByIdOnchain(marketId: bigint): Promise<ProgramMarket> {\n const marketPda = this.pda(marketId);\n return this.getOnchain(marketPda);\n }\n\n async nextId(): Promise<bigint> {\n const { Rpc } = await import(\"../../rpc\");\n const rpc = new Rpc(this.client);\n const exchange = await rpc.getExchange();\n return exchange.marketCount;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/domain/market/client.ts"],"names":[],"mappings":"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","sourcesContent":["import { type PublicKey } from \"@solana/web3.js\";\nimport type { ClientContext } from \"../../context\";\nimport { requireConnection } from \"../../context\";\nimport { SdkError } from \"../../error\";\nimport { ProgramSdkError } from \"../../program/error\";\nimport { RetryPolicy } from \"../../http\";\nimport {\n getMarketPda,\n getAllConditionalMintPdas,\n} from \"../../program/pda\";\nimport { deserializeMarket as deserializeProgramMarket } from \"../../program/accounts\";\nimport { deriveConditionId } from \"../../program/utils\";\nimport type { Market as ProgramMarket } from \"../../program/types\";\nimport { globalDepositAssetFromWire, marketFromWire } from \"./convert\";\nimport { Status, type GlobalDepositAsset, type Market } from \"./index\";\nimport type {\n DepositMintsResponse,\n GlobalDepositAssetsListResponse,\n MarketSearchResult,\n MarketsResponse,\n SingleMarketResponse,\n} from \"./wire\";\n\nexport interface MarketsResult {\n markets: Market[];\n validationErrors: string[];\n}\n\n/**\n * Result of fetching the global deposit asset whitelist. Assets that fail\n * validation are skipped with their errors reported separately.\n */\nexport interface GlobalDepositAssetsResult {\n assets: GlobalDepositAsset[];\n validationErrors: string[];\n}\n\nexport interface FavoriteMarkets {\n market_pubkeys: string[];\n next_cursor: number | null;\n has_more: boolean;\n}\n\nexport interface FavoriteMarketUpdate {\n market_pubkey: string;\n favorited: boolean;\n}\n\nexport class Markets {\n constructor(private readonly client: ClientContext) {}\n\n // ── PDA helpers ──────────────────────────────────────────────────────\n\n pda(marketId: bigint): PublicKey {\n return getMarketPda(marketId, this.client.programId)[0];\n }\n\n // ── Market helpers ───────────────────────────────────────────────────\n\n deriveConditionId(\n oracle: PublicKey,\n questionId: Buffer,\n numOutcomes: number\n ): Buffer {\n return deriveConditionId(oracle, questionId, numOutcomes);\n }\n\n getConditionalMints(\n market: PublicKey,\n depositMint: PublicKey,\n numOutcomes: number\n ): PublicKey[] {\n return getAllConditionalMintPdas(\n market,\n depositMint,\n numOutcomes,\n this.client.programId\n ).map(([mint]) => mint);\n }\n\n // ── HTTP methods ─────────────────────────────────────────────────────\n\n async get(cursor?: number, limit?: number): Promise<MarketsResult> {\n const search = new URLSearchParams();\n if (cursor !== undefined) search.set(\"cursor\", String(cursor));\n if (limit !== undefined) search.set(\"limit\", String(limit));\n\n const suffix = search.size > 0 ? `?${search.toString()}` : \"\";\n const url = `${this.client.http.baseUrl()}/api/markets${suffix}`;\n\n const response = await this.client.http.get<MarketsResponse>(url, RetryPolicy.Idempotent);\n const markets: Market[] = [];\n const validationErrors: string[] = [];\n\n for (const marketWire of response.markets) {\n try {\n const market = marketFromWire(marketWire);\n if (market.status === Status.Active || market.status === Status.Resolved) {\n markets.push(market);\n }\n } catch (error) {\n validationErrors.push(error instanceof Error ? error.message : String(error));\n }\n }\n\n return { markets, validationErrors };\n }\n\n async getBySlug(slug: string): Promise<Market> {\n const url = `${this.client.http.baseUrl()}/api/markets/by-slug/${encodeURIComponent(slug)}`;\n const response = await this.client.http.get<SingleMarketResponse>(url, RetryPolicy.Idempotent);\n\n try {\n return marketFromWire(response.market);\n } catch (error) {\n throw SdkError.validation(error instanceof Error ? error.message : String(error));\n }\n }\n\n async getByPubkey(pubkey: string): Promise<Market> {\n const url = `${this.client.http.baseUrl()}/api/markets/${encodeURIComponent(pubkey)}`;\n const response = await this.client.http.get<SingleMarketResponse>(url, RetryPolicy.Idempotent);\n\n try {\n return marketFromWire(response.market);\n } catch (error) {\n throw SdkError.validation(error instanceof Error ? error.message : String(error));\n }\n }\n\n async search(query: string, limit?: number): Promise<MarketSearchResult[]> {\n const encoded = encodeURIComponent(query);\n const suffix = limit !== undefined ? `?limit=${limit}` : \"\";\n const url = `${this.client.http.baseUrl()}/api/markets/search/by-query/${encoded}${suffix}`;\n return this.client.http.get<MarketSearchResult[]>(url, RetryPolicy.Idempotent);\n }\n\n async featured(): Promise<MarketSearchResult[]> {\n const url = `${this.client.http.baseUrl()}/api/markets/search/featured`;\n const result = await this.client.http.get<MarketSearchResult[]>(url, RetryPolicy.Idempotent);\n return result.filter(\n (item) => item.market_status === Status.Active\n );\n }\n\n /**\n * Fetch deposit assets registered for a specific market, including each\n * asset's conditional mints.\n */\n async depositAssets(marketPubkey: string): Promise<DepositMintsResponse> {\n const url = `${this.client.http.baseUrl()}/api/markets/${encodeURIComponent(marketPubkey)}/deposit-assets`;\n return this.client.http.get<DepositMintsResponse>(url, RetryPolicy.Idempotent);\n }\n\n /**\n * Fetch the active global deposit asset whitelist (platform-scoped, not\n * market-bound).\n *\n * Assets that fail validation are skipped and their errors are returned in\n * `GlobalDepositAssetsResult.validationErrors`.\n */\n async globalDepositAssets(): Promise<GlobalDepositAssetsResult> {\n const url = `${this.client.http.baseUrl()}/api/global-deposit-assets`;\n const response = await this.client.http.get<GlobalDepositAssetsListResponse>(\n url,\n RetryPolicy.Idempotent\n );\n\n const assets: GlobalDepositAsset[] = [];\n const validationErrors: string[] = [];\n for (const wireAsset of response.assets) {\n try {\n assets.push(globalDepositAssetFromWire(wireAsset));\n } catch (error) {\n validationErrors.push(error instanceof Error ? error.message : String(error));\n }\n }\n\n return { assets, validationErrors };\n }\n\n async favoriteMarkets(limit?: number, cursor?: number): Promise<FavoriteMarkets> {\n const url = this.favoriteMarketsUrl(limit, cursor);\n return this.client.http.get<FavoriteMarkets>(url, RetryPolicy.Idempotent);\n }\n\n async favoriteMarketsWithCookies(limit: number | undefined, cursor: number | undefined, cookieHeader: string): Promise<FavoriteMarkets> {\n const url = this.favoriteMarketsUrl(limit, cursor);\n return this.client.http.getWithCookies<FavoriteMarkets>(url, RetryPolicy.Idempotent, cookieHeader);\n }\n\n private favoriteMarketsUrl(limit?: number, cursor?: number): string {\n const search = new URLSearchParams();\n if (limit !== undefined) search.set(\"limit\", String(limit));\n if (cursor !== undefined) search.set(\"cursor\", String(cursor));\n const suffix = search.size > 0 ? `?${search.toString()}` : \"\";\n return `${this.client.http.baseUrl()}/api/users/favorite-markets${suffix}`;\n }\n\n async addFavoriteMarket(marketPubkey: string): Promise<FavoriteMarketUpdate> {\n const url = `${this.client.http.baseUrl()}/api/users/favorite-markets/${encodeURIComponent(marketPubkey)}`;\n return this.client.http.post<FavoriteMarketUpdate, object>(url, {}, RetryPolicy.Idempotent);\n }\n\n async addFavoriteMarketWithCookies(\n marketPubkey: string,\n cookieHeader: string\n ): Promise<FavoriteMarketUpdate> {\n const url = `${this.client.http.baseUrl()}/api/users/favorite-markets/${encodeURIComponent(marketPubkey)}`;\n return this.client.http.postWithCookies<FavoriteMarketUpdate, object>(url, {}, RetryPolicy.Idempotent, cookieHeader);\n }\n\n async removeFavoriteMarket(marketPubkey: string): Promise<FavoriteMarketUpdate> {\n const url = `${this.client.http.baseUrl()}/api/users/favorite-markets/${encodeURIComponent(marketPubkey)}`;\n return this.client.http.delete<FavoriteMarketUpdate>(url, RetryPolicy.Idempotent);\n }\n\n async removeFavoriteMarketWithCookies(\n marketPubkey: string,\n cookieHeader: string\n ): Promise<FavoriteMarketUpdate> {\n const url = `${this.client.http.baseUrl()}/api/users/favorite-markets/${encodeURIComponent(marketPubkey)}`;\n return this.client.http.deleteWithCookies<FavoriteMarketUpdate>(url, RetryPolicy.Idempotent, cookieHeader);\n }\n\n // ── On-chain account fetchers (require Connection) ──────────────────\n\n async getOnchain(market: PublicKey): Promise<ProgramMarket> {\n const connection = requireConnection(this.client);\n const accountInfo = await connection.getAccountInfo(market);\n if (!accountInfo) {\n throw ProgramSdkError.accountNotFound(`Market at ${market.toBase58()}`);\n }\n return deserializeProgramMarket(accountInfo.data as Buffer);\n }\n\n async getByIdOnchain(marketId: bigint): Promise<ProgramMarket> {\n const marketPda = this.pda(marketId);\n return this.getOnchain(marketPda);\n }\n\n async nextId(): Promise<bigint> {\n const { Rpc } = await import(\"../../rpc\");\n const rpc = new Rpc(this.client);\n const exchange = await rpc.getExchange();\n return exchange.marketCount;\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"convert.d.ts","sourceRoot":"","sources":["../../../src/domain/market/convert.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"convert.d.ts","sourceRoot":"","sources":["../../../src/domain/market/convert.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAElD,OAAO,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AAEzC,OAAO,EAAkB,KAAK,MAAM,EAAiC,MAAM,SAAS,CAAC;AACrF,OAAO,EACL,0BAA0B,EAG1B,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACtB,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAE7C,OAAO,EAAE,0BAA0B,EAAE,eAAe,EAAE,CAAC;AAEvD,wBAAgB,cAAc,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAyG7D;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CACrC,aAAa,EAAE,YAAY,EAAE,EAC7B,cAAc,EAAE,aAAa,EAAE,GAC9B,gBAAgB,EAAE,CAwBpB;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,cAAc,GAAG;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAM7F"}
|
|
@@ -5,6 +5,7 @@ exports.marketFromWire = marketFromWire;
|
|
|
5
5
|
exports.deriveDepositAssetPairs = deriveDepositAssetPairs;
|
|
6
6
|
exports.tryMarketFromWire = tryMarketFromWire;
|
|
7
7
|
const shared_1 = require("../../shared");
|
|
8
|
+
const constants_1 = require("../../program/constants");
|
|
8
9
|
const convert_1 = require("../orderbook/convert");
|
|
9
10
|
const icon_1 = require("./icon");
|
|
10
11
|
Object.defineProperty(exports, "resolveIconUrls", { enumerable: true, get: function () { return icon_1.resolveIconUrls; } });
|
|
@@ -14,6 +15,16 @@ const tokens_1 = require("./tokens");
|
|
|
14
15
|
Object.defineProperty(exports, "globalDepositAssetFromWire", { enumerable: true, get: function () { return tokens_1.globalDepositAssetFromWire; } });
|
|
15
16
|
function marketFromWire(source) {
|
|
16
17
|
const errors = [];
|
|
18
|
+
const numOutcomes = source.num_outcomes ?? source.deposit_assets[0]?.num_outcomes ?? 0;
|
|
19
|
+
if (!Number.isInteger(numOutcomes) || numOutcomes < constants_1.MIN_OUTCOMES || numOutcomes > constants_1.MAX_OUTCOMES) {
|
|
20
|
+
errors.push(`Invalid outcome count: ${numOutcomes}`);
|
|
21
|
+
}
|
|
22
|
+
const inconsistentOutcomeCounts = source.deposit_assets
|
|
23
|
+
.map((asset) => asset.num_outcomes)
|
|
24
|
+
.filter((count) => count !== numOutcomes);
|
|
25
|
+
if (inconsistentOutcomeCounts.length > 0) {
|
|
26
|
+
errors.push(`Deposit asset outcome counts do not match market: ${inconsistentOutcomeCounts.join(", ")}`);
|
|
27
|
+
}
|
|
17
28
|
const outcomes = source.outcomes.flatMap((outcome) => {
|
|
18
29
|
try {
|
|
19
30
|
return [(0, outcome_1.outcomeFromWire)(outcome)];
|
|
@@ -47,22 +58,20 @@ function marketFromWire(source) {
|
|
|
47
58
|
}
|
|
48
59
|
});
|
|
49
60
|
const status = (0, index_1.statusFromWire)(source.market_status);
|
|
61
|
+
const definition = typeof source.definition === "string" ? source.definition : undefined;
|
|
50
62
|
if (!source.slug)
|
|
51
63
|
errors.push("Missing slug");
|
|
52
64
|
if (!source.market_name)
|
|
53
65
|
errors.push("Missing market name");
|
|
54
66
|
if (!status)
|
|
55
67
|
errors.push(`Invalid status: ${source.market_status}`);
|
|
56
|
-
if (!
|
|
57
|
-
errors.push("Missing description");
|
|
58
|
-
if (!source.definition)
|
|
68
|
+
if (!definition)
|
|
59
69
|
errors.push("Missing definition");
|
|
60
70
|
const iconUrls = (0, icon_1.resolveIconUrls)(source.icon_url_low, source.icon_url_medium, source.icon_url_high);
|
|
61
71
|
if (!iconUrls)
|
|
62
72
|
errors.push("Missing icon URL");
|
|
73
|
+
// Banners are optional; cross-fallback still applies when any variant is set.
|
|
63
74
|
const bannerUrls = (0, icon_1.resolveIconUrls)(source.banner_image_url_low, source.banner_image_url_medium, source.banner_image_url_high);
|
|
64
|
-
if (!bannerUrls)
|
|
65
|
-
errors.push("Missing banner image URL");
|
|
66
75
|
const depositAssetPairs = (0, tokens_1.sortByDisplayPriority)(deriveDepositAssetPairs(depositAssets, orderbookPairs));
|
|
67
76
|
if (depositAssetPairs.length === 0) {
|
|
68
77
|
errors.push("Missing deposit asset pairs");
|
|
@@ -74,23 +83,28 @@ function marketFromWire(source) {
|
|
|
74
83
|
id: source.market_id,
|
|
75
84
|
pubkey: (0, shared_1.asPubkeyStr)(source.market_pubkey),
|
|
76
85
|
name: source.market_name ?? "",
|
|
77
|
-
bannerImageUrlLow: bannerUrls?.low
|
|
78
|
-
bannerImageUrlMedium: bannerUrls?.medium
|
|
79
|
-
bannerImageUrlHigh: bannerUrls?.high
|
|
86
|
+
bannerImageUrlLow: bannerUrls?.low,
|
|
87
|
+
bannerImageUrlMedium: bannerUrls?.medium,
|
|
88
|
+
bannerImageUrlHigh: bannerUrls?.high,
|
|
80
89
|
iconUrlLow: iconUrls?.low ?? "",
|
|
81
90
|
iconUrlMedium: iconUrls?.medium ?? "",
|
|
82
91
|
iconUrlHigh: iconUrls?.high ?? "",
|
|
83
92
|
featuredRank: source.featured_rank,
|
|
84
93
|
slug: source.slug ?? "",
|
|
85
94
|
status: status ?? index_1.Status.Pending,
|
|
95
|
+
makerFeeBps: source.maker_fee_bps ?? 0,
|
|
96
|
+
takerFeeBps: source.taker_fee_bps ?? 0,
|
|
86
97
|
createdAt: new Date(source.created_at),
|
|
87
98
|
activatedAt: source.activated_at ? new Date(source.activated_at) : undefined,
|
|
88
99
|
settledAt: source.settled_at ? new Date(source.settled_at) : undefined,
|
|
100
|
+
resolutionBy: source.resolution_by ?? undefined,
|
|
89
101
|
resolution: source.resolution,
|
|
90
|
-
description: source.description
|
|
91
|
-
definition:
|
|
102
|
+
description: source.description,
|
|
103
|
+
definition: definition,
|
|
92
104
|
category: source.category,
|
|
105
|
+
subcategory: source.subcategory,
|
|
93
106
|
tags: source.tags ?? [],
|
|
107
|
+
numOutcomes,
|
|
94
108
|
depositAssets,
|
|
95
109
|
depositAssetPairs,
|
|
96
110
|
conditionalTokens,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"convert.js","sourceRoot":"","sources":["../../../src/domain/market/convert.ts"],"names":[],"mappings":"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","sourcesContent":["import { asPubkeyStr } from \"../../shared\";\nimport type { OrderBookPair } from \"../orderbook\";\nimport { orderBookPairFromWire } from \"../orderbook/convert\";\nimport { resolveIconUrls } from \"./icon\";\nimport { outcomeFromWire } from \"./outcome\";\nimport { statusFromWire, type Market, MarketValidationError, Status } from \"./index\";\nimport {\n globalDepositAssetFromWire,\n sortByDisplayPriority,\n validatedTokensFromWire,\n type DepositAsset,\n type DepositAssetPair,\n} from \"./tokens\";\nimport type { MarketResponse } from \"./wire\";\n\nexport { globalDepositAssetFromWire, resolveIconUrls };\n\nexport function marketFromWire(source: MarketResponse): Market {\n const errors: string[] = [];\n\n const outcomes = source.outcomes.flatMap((outcome) => {\n try {\n return [outcomeFromWire(outcome)];\n } catch (error) {\n errors.push(error instanceof Error ? error.message : String(error));\n return [];\n }\n });\n\n const depositAssets = [] as Market[\"depositAssets\"];\n const conditionalTokens = [] as Market[\"conditionalTokens\"];\n const tokenMetadata: Market[\"tokenMetadata\"] = {};\n\n for (const depositAsset of source.deposit_assets) {\n try {\n const validated = validatedTokensFromWire(depositAsset);\n depositAssets.push(validated.token);\n conditionalTokens.push(...validated.conditionals);\n Object.assign(tokenMetadata, validated.metadata);\n } catch (error) {\n errors.push(error instanceof Error ? error.message : String(error));\n }\n }\n\n const orderbookPairs = source.orderbooks.flatMap((orderbook) => {\n try {\n return [orderBookPairFromWire(orderbook, conditionalTokens)];\n } catch (error) {\n errors.push(error instanceof Error ? error.message : String(error));\n return [];\n }\n });\n\n const status = statusFromWire(source.market_status);\n if (!source.slug) errors.push(\"Missing slug\");\n if (!source.market_name) errors.push(\"Missing market name\");\n if (!status) errors.push(`Invalid status: ${source.market_status}`);\n if (!source.description) errors.push(\"Missing description\");\n if (!source.definition) errors.push(\"Missing definition\");\n\n const iconUrls = resolveIconUrls(source.icon_url_low, source.icon_url_medium, source.icon_url_high);\n if (!iconUrls) errors.push(\"Missing icon URL\");\n\n const bannerUrls = resolveIconUrls(source.banner_image_url_low, source.banner_image_url_medium, source.banner_image_url_high);\n if (!bannerUrls) errors.push(\"Missing banner image URL\");\n\n const depositAssetPairs = sortByDisplayPriority(\n deriveDepositAssetPairs(depositAssets, orderbookPairs),\n );\n\n if (depositAssetPairs.length === 0) {\n errors.push(\"Missing deposit asset pairs\");\n }\n\n if (errors.length > 0) {\n throw new MarketValidationError(source.market_pubkey, errors);\n }\n\n return {\n id: source.market_id,\n pubkey: asPubkeyStr(source.market_pubkey),\n name: source.market_name ?? \"\",\n bannerImageUrlLow: bannerUrls?.low ?? \"\",\n bannerImageUrlMedium: bannerUrls?.medium ?? \"\",\n bannerImageUrlHigh: bannerUrls?.high ?? \"\",\n iconUrlLow: iconUrls?.low ?? \"\",\n iconUrlMedium: iconUrls?.medium ?? \"\",\n iconUrlHigh: iconUrls?.high ?? \"\",\n featuredRank: source.featured_rank,\n slug: source.slug ?? \"\",\n status: status ?? Status.Pending,\n createdAt: new Date(source.created_at),\n activatedAt: source.activated_at ? new Date(source.activated_at) : undefined,\n settledAt: source.settled_at ? new Date(source.settled_at) : undefined,\n resolution: source.resolution,\n description: source.description ?? \"\",\n definition: source.definition ?? \"\",\n category: source.category,\n tags: source.tags ?? [],\n depositAssets,\n depositAssetPairs,\n conditionalTokens,\n outcomes,\n orderbookPairs,\n orderbookIds: orderbookPairs.map((pair) => pair.orderbookId),\n tokenMetadata,\n };\n}\n\n/**\n * Derive unique base/quote deposit-asset pairs across the market's orderbook\n * pairs. Deduplicated by `(basePubkey, quotePubkey)`; orderbook pairs whose\n * base or quote deposit asset is not present in `depositAssets` are skipped.\n */\nexport function deriveDepositAssetPairs(\n depositAssets: DepositAsset[],\n orderbookPairs: OrderBookPair[],\n): DepositAssetPair[] {\n const seen = new Map<string, DepositAssetPair>();\n\n for (const pair of orderbookPairs) {\n const base = depositAssets.find(\n (asset) => asset.depositAsset === pair.base.depositAsset,\n );\n const quote = depositAssets.find(\n (asset) => asset.depositAsset === pair.quote.depositAsset,\n );\n\n if (!base || !quote) continue;\n\n const key = `${base.depositAsset}|${quote.depositAsset}`;\n if (!seen.has(key)) {\n seen.set(key, {\n id: `${base.depositAsset}-${quote.depositAsset}`,\n base,\n quote,\n });\n }\n }\n\n return Array.from(seen.values());\n}\n\nexport function tryMarketFromWire(source: MarketResponse): { market?: Market; error?: string } {\n try {\n return { market: marketFromWire(source) };\n } catch (error) {\n return { error: error instanceof Error ? error.message : String(error) };\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"convert.js","sourceRoot":"","sources":["../../../src/domain/market/convert.ts"],"names":[],"mappings":";;;AAkBA,wCAyGC;AAOD,0DA2BC;AAED,8CAMC;AArKD,yCAA2C;AAC3C,uDAAqE;AAErE,kDAA6D;AAC7D,iCAAyC;AAYJ,gGAZ5B,sBAAe,OAY4B;AAXpD,uCAA4C;AAC5C,mCAAqF;AACrF,qCAMkB;AAGT,2GARP,mCAA0B,OAQO;AAEnC,SAAgB,cAAc,CAAC,MAAsB;IACnD,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,WAAW,GAAG,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,YAAY,IAAI,CAAC,CAAC;IACvF,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,WAAW,GAAG,wBAAY,IAAI,WAAW,GAAG,wBAAY,EAAE,CAAC;QAC/F,MAAM,CAAC,IAAI,CAAC,0BAA0B,WAAW,EAAE,CAAC,CAAC;IACvD,CAAC;IACD,MAAM,yBAAyB,GAAG,MAAM,CAAC,cAAc;SACpD,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC;SAClC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,WAAW,CAAC,CAAC;IAC5C,IAAI,yBAAyB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzC,MAAM,CAAC,IAAI,CAAC,qDAAqD,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC3G,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QACnD,IAAI,CAAC;YACH,OAAO,CAAC,IAAA,yBAAe,EAAC,OAAO,CAAC,CAAC,CAAC;QACpC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YACpE,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,aAAa,GAAG,EAA6B,CAAC;IACpD,MAAM,iBAAiB,GAAG,EAAiC,CAAC;IAC5D,MAAM,aAAa,GAA4B,EAAE,CAAC;IAElD,KAAK,MAAM,YAAY,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;QACjD,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,IAAA,gCAAuB,EAAC,YAAY,CAAC,CAAC;YACxD,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YACpC,iBAAiB,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,YAAY,CAAC,CAAC;YAClD,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC;QACnD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;IAED,MAAM,cAAc,GAAG,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE;QAC7D,IAAI,CAAC;YACH,OAAO,CAAC,IAAA,+BAAqB,EAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC,CAAC;QAC/D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YACpE,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,IAAA,sBAAc,EAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IACpD,MAAM,UAAU,GAAG,OAAO,MAAM,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;IACzF,IAAI,CAAC,MAAM,CAAC,IAAI;QAAE,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAC9C,IAAI,CAAC,MAAM,CAAC,WAAW;QAAE,MAAM,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IAC5D,IAAI,CAAC,MAAM;QAAE,MAAM,CAAC,IAAI,CAAC,mBAAmB,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC;IACpE,IAAI,CAAC,UAAU;QAAE,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IAEnD,MAAM,QAAQ,GAAG,IAAA,sBAAe,EAAC,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;IACpG,IAAI,CAAC,QAAQ;QAAE,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAE/C,8EAA8E;IAC9E,MAAM,UAAU,GAAG,IAAA,sBAAe,EAAC,MAAM,CAAC,oBAAoB,EAAE,MAAM,CAAC,uBAAuB,EAAE,MAAM,CAAC,qBAAqB,CAAC,CAAC;IAE9H,MAAM,iBAAiB,GAAG,IAAA,8BAAqB,EAC7C,uBAAuB,CAAC,aAAa,EAAE,cAAc,CAAC,CACvD,CAAC;IAEF,IAAI,iBAAiB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnC,MAAM,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;IAC7C,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,6BAAqB,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;IAChE,CAAC;IAED,OAAO;QACL,EAAE,EAAE,MAAM,CAAC,SAAS;QACpB,MAAM,EAAE,IAAA,oBAAW,EAAC,MAAM,CAAC,aAAa,CAAC;QACzC,IAAI,EAAE,MAAM,CAAC,WAAW,IAAI,EAAE;QAC9B,iBAAiB,EAAE,UAAU,EAAE,GAAG;QAClC,oBAAoB,EAAE,UAAU,EAAE,MAAM;QACxC,kBAAkB,EAAE,UAAU,EAAE,IAAI;QACpC,UAAU,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE;QAC/B,aAAa,EAAE,QAAQ,EAAE,MAAM,IAAI,EAAE;QACrC,WAAW,EAAE,QAAQ,EAAE,IAAI,IAAI,EAAE;QACjC,YAAY,EAAE,MAAM,CAAC,aAAa;QAClC,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,EAAE;QACvB,MAAM,EAAE,MAAM,IAAI,cAAM,CAAC,OAAO;QAChC,WAAW,EAAE,MAAM,CAAC,aAAa,IAAI,CAAC;QACtC,WAAW,EAAE,MAAM,CAAC,aAAa,IAAI,CAAC;QACtC,SAAS,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC;QACtC,WAAW,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS;QAC5E,SAAS,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS;QACtE,YAAY,EAAE,MAAM,CAAC,aAAa,IAAI,SAAS;QAC/C,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,UAAU,EAAE,UAAoB;QAChC,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,EAAE;QACvB,WAAW;QACX,aAAa;QACb,iBAAiB;QACjB,iBAAiB;QACjB,QAAQ;QACR,cAAc;QACd,YAAY,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC;QAC5D,aAAa;KACd,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,SAAgB,uBAAuB,CACrC,aAA6B,EAC7B,cAA+B;IAE/B,MAAM,IAAI,GAAG,IAAI,GAAG,EAA4B,CAAC;IAEjD,KAAK,MAAM,IAAI,IAAI,cAAc,EAAE,CAAC;QAClC,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,CAC7B,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,YAAY,KAAK,IAAI,CAAC,IAAI,CAAC,YAAY,CACzD,CAAC;QACF,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAC9B,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,YAAY,KAAK,IAAI,CAAC,KAAK,CAAC,YAAY,CAC1D,CAAC;QAEF,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK;YAAE,SAAS;QAE9B,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,YAAY,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;QACzD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACnB,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE;gBACZ,EAAE,EAAE,GAAG,IAAI,CAAC,YAAY,IAAI,KAAK,CAAC,YAAY,EAAE;gBAChD,IAAI;gBACJ,KAAK;aACN,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;AACnC,CAAC;AAED,SAAgB,iBAAiB,CAAC,MAAsB;IACtD,IAAI,CAAC;QACH,OAAO,EAAE,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC;IAC5C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,EAAE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;IAC3E,CAAC;AACH,CAAC","sourcesContent":["import { asPubkeyStr } from \"../../shared\";\nimport { MAX_OUTCOMES, MIN_OUTCOMES } from \"../../program/constants\";\nimport type { OrderBookPair } from \"../orderbook\";\nimport { orderBookPairFromWire } from \"../orderbook/convert\";\nimport { resolveIconUrls } from \"./icon\";\nimport { outcomeFromWire } from \"./outcome\";\nimport { statusFromWire, type Market, MarketValidationError, Status } from \"./index\";\nimport {\n globalDepositAssetFromWire,\n sortByDisplayPriority,\n validatedTokensFromWire,\n type DepositAsset,\n type DepositAssetPair,\n} from \"./tokens\";\nimport type { MarketResponse } from \"./wire\";\n\nexport { globalDepositAssetFromWire, resolveIconUrls };\n\nexport function marketFromWire(source: MarketResponse): Market {\n const errors: string[] = [];\n const numOutcomes = source.num_outcomes ?? source.deposit_assets[0]?.num_outcomes ?? 0;\n if (!Number.isInteger(numOutcomes) || numOutcomes < MIN_OUTCOMES || numOutcomes > MAX_OUTCOMES) {\n errors.push(`Invalid outcome count: ${numOutcomes}`);\n }\n const inconsistentOutcomeCounts = source.deposit_assets\n .map((asset) => asset.num_outcomes)\n .filter((count) => count !== numOutcomes);\n if (inconsistentOutcomeCounts.length > 0) {\n errors.push(`Deposit asset outcome counts do not match market: ${inconsistentOutcomeCounts.join(\", \")}`);\n }\n\n const outcomes = source.outcomes.flatMap((outcome) => {\n try {\n return [outcomeFromWire(outcome)];\n } catch (error) {\n errors.push(error instanceof Error ? error.message : String(error));\n return [];\n }\n });\n\n const depositAssets = [] as Market[\"depositAssets\"];\n const conditionalTokens = [] as Market[\"conditionalTokens\"];\n const tokenMetadata: Market[\"tokenMetadata\"] = {};\n\n for (const depositAsset of source.deposit_assets) {\n try {\n const validated = validatedTokensFromWire(depositAsset);\n depositAssets.push(validated.token);\n conditionalTokens.push(...validated.conditionals);\n Object.assign(tokenMetadata, validated.metadata);\n } catch (error) {\n errors.push(error instanceof Error ? error.message : String(error));\n }\n }\n\n const orderbookPairs = source.orderbooks.flatMap((orderbook) => {\n try {\n return [orderBookPairFromWire(orderbook, conditionalTokens)];\n } catch (error) {\n errors.push(error instanceof Error ? error.message : String(error));\n return [];\n }\n });\n\n const status = statusFromWire(source.market_status);\n const definition = typeof source.definition === \"string\" ? source.definition : undefined;\n if (!source.slug) errors.push(\"Missing slug\");\n if (!source.market_name) errors.push(\"Missing market name\");\n if (!status) errors.push(`Invalid status: ${source.market_status}`);\n if (!definition) errors.push(\"Missing definition\");\n\n const iconUrls = resolveIconUrls(source.icon_url_low, source.icon_url_medium, source.icon_url_high);\n if (!iconUrls) errors.push(\"Missing icon URL\");\n\n // Banners are optional; cross-fallback still applies when any variant is set.\n const bannerUrls = resolveIconUrls(source.banner_image_url_low, source.banner_image_url_medium, source.banner_image_url_high);\n\n const depositAssetPairs = sortByDisplayPriority(\n deriveDepositAssetPairs(depositAssets, orderbookPairs),\n );\n\n if (depositAssetPairs.length === 0) {\n errors.push(\"Missing deposit asset pairs\");\n }\n\n if (errors.length > 0) {\n throw new MarketValidationError(source.market_pubkey, errors);\n }\n\n return {\n id: source.market_id,\n pubkey: asPubkeyStr(source.market_pubkey),\n name: source.market_name ?? \"\",\n bannerImageUrlLow: bannerUrls?.low,\n bannerImageUrlMedium: bannerUrls?.medium,\n bannerImageUrlHigh: bannerUrls?.high,\n iconUrlLow: iconUrls?.low ?? \"\",\n iconUrlMedium: iconUrls?.medium ?? \"\",\n iconUrlHigh: iconUrls?.high ?? \"\",\n featuredRank: source.featured_rank,\n slug: source.slug ?? \"\",\n status: status ?? Status.Pending,\n makerFeeBps: source.maker_fee_bps ?? 0,\n takerFeeBps: source.taker_fee_bps ?? 0,\n createdAt: new Date(source.created_at),\n activatedAt: source.activated_at ? new Date(source.activated_at) : undefined,\n settledAt: source.settled_at ? new Date(source.settled_at) : undefined,\n resolutionBy: source.resolution_by ?? undefined,\n resolution: source.resolution,\n description: source.description,\n definition: definition as string,\n category: source.category,\n subcategory: source.subcategory,\n tags: source.tags ?? [],\n numOutcomes,\n depositAssets,\n depositAssetPairs,\n conditionalTokens,\n outcomes,\n orderbookPairs,\n orderbookIds: orderbookPairs.map((pair) => pair.orderbookId),\n tokenMetadata,\n };\n}\n\n/**\n * Derive unique base/quote deposit-asset pairs across the market's orderbook\n * pairs. Deduplicated by `(basePubkey, quotePubkey)`; orderbook pairs whose\n * base or quote deposit asset is not present in `depositAssets` are skipped.\n */\nexport function deriveDepositAssetPairs(\n depositAssets: DepositAsset[],\n orderbookPairs: OrderBookPair[],\n): DepositAssetPair[] {\n const seen = new Map<string, DepositAssetPair>();\n\n for (const pair of orderbookPairs) {\n const base = depositAssets.find(\n (asset) => asset.depositAsset === pair.base.depositAsset,\n );\n const quote = depositAssets.find(\n (asset) => asset.depositAsset === pair.quote.depositAsset,\n );\n\n if (!base || !quote) continue;\n\n const key = `${base.depositAsset}|${quote.depositAsset}`;\n if (!seen.has(key)) {\n seen.set(key, {\n id: `${base.depositAsset}-${quote.depositAsset}`,\n base,\n quote,\n });\n }\n }\n\n return Array.from(seen.values());\n}\n\nexport function tryMarketFromWire(source: MarketResponse): { market?: Market; error?: string } {\n try {\n return { market: marketFromWire(source) };\n } catch (error) {\n return { error: error instanceof Error ? error.message : String(error) };\n }\n}\n"]}
|
|
@@ -19,23 +19,37 @@ export interface Market {
|
|
|
19
19
|
id: number;
|
|
20
20
|
pubkey: PubkeyStr;
|
|
21
21
|
name: string;
|
|
22
|
-
bannerImageUrlLow
|
|
23
|
-
bannerImageUrlMedium
|
|
24
|
-
bannerImageUrlHigh
|
|
22
|
+
bannerImageUrlLow?: string;
|
|
23
|
+
bannerImageUrlMedium?: string;
|
|
24
|
+
bannerImageUrlHigh?: string;
|
|
25
25
|
iconUrlLow: string;
|
|
26
26
|
iconUrlMedium: string;
|
|
27
27
|
iconUrlHigh: string;
|
|
28
28
|
featuredRank?: number;
|
|
29
29
|
slug: string;
|
|
30
30
|
status: Status;
|
|
31
|
+
/**
|
|
32
|
+
* Maker fee in basis points (1 bps = 0.01%); negative means a rebate.
|
|
33
|
+
* Set per market at creation, admin-updatable on chain.
|
|
34
|
+
*/
|
|
35
|
+
makerFeeBps: number;
|
|
36
|
+
/**
|
|
37
|
+
* Taker fee in basis points (1 bps = 0.01%); negative means a rebate.
|
|
38
|
+
* Set per market at creation, admin-updatable on chain.
|
|
39
|
+
*/
|
|
40
|
+
takerFeeBps: number;
|
|
31
41
|
createdAt: Date;
|
|
32
42
|
activatedAt?: Date;
|
|
33
43
|
settledAt?: Date;
|
|
44
|
+
/** Resolution deadline as a Unix timestamp in milliseconds. */
|
|
45
|
+
resolutionBy?: number;
|
|
34
46
|
resolution?: MarketResolutionResponse;
|
|
35
|
-
description
|
|
47
|
+
description?: string;
|
|
36
48
|
definition: string;
|
|
37
49
|
category?: string;
|
|
50
|
+
subcategory?: string;
|
|
38
51
|
tags: string[];
|
|
52
|
+
numOutcomes: number;
|
|
39
53
|
depositAssets: DepositAsset[];
|
|
40
54
|
/**
|
|
41
55
|
* Unique base/quote deposit-asset pairs derived from `orderbookPairs`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/domain/market/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EACV,gBAAgB,EAChB,YAAY,EACZ,gBAAgB,EAChB,aAAa,EACd,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,QAAQ,CAAC;AAEvD,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC;AACvB,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC;AACzB,OAAO,EAAE,0BAA0B,EAAE,cAAc,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAE3G,oBAAY,MAAM;IAChB,OAAO,YAAY;IACnB,MAAM,WAAW;IACjB,QAAQ,aAAa;IACrB,SAAS,cAAc;CACxB;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAahE;AAED,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,SAAS,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,iBAAiB,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/domain/market/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EACV,gBAAgB,EAChB,YAAY,EACZ,gBAAgB,EAChB,aAAa,EACd,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,QAAQ,CAAC;AAEvD,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC;AACvB,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC;AACzB,OAAO,EAAE,0BAA0B,EAAE,cAAc,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAE3G,oBAAY,MAAM;IAChB,OAAO,YAAY;IACnB,MAAM,WAAW;IACjB,QAAQ,aAAa;IACrB,SAAS,cAAc;CACxB;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAahE;AAED,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,SAAS,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,WAAW,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,IAAI,CAAC;IAChB,WAAW,CAAC,EAAE,IAAI,CAAC;IACnB,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,+DAA+D;IAC/D,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,wBAAwB,CAAC;IACtC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B;;;OAGG;IACH,iBAAiB,EAAE,gBAAgB,EAAE,CAAC;IACtC,iBAAiB,EAAE,gBAAgB,EAAE,CAAC;IACtC,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,cAAc,EAAE,aAAa,EAAE,CAAC;IAChC,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;CAC9C;AAED,MAAM,WAAW,yBAAyB;IACxC,UAAU,CAAC,EAAE,wBAAwB,GAAG,IAAI,CAAC;CAC9C;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,yBAAyB,GAAG,OAAO,CAE3E;AAED,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,yBAAyB,GAChC,MAAM,GAAG,SAAS,CAEpB;AAED,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,yBAAyB,GAChC,OAAO,CAET;AAED,qBAAa,qBAAsB,SAAQ,KAAK;IAC9C,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;gBAEf,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE;CAMpD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/domain/market/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAwBA,wCAaC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/domain/market/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAwBA,wCAaC;AAsDD,4CAEC;AAED,oDAIC;AAED,0DAIC;AA9FD,2CAAyB;AACzB,yCAAuB;AACvB,4CAA0B;AAC1B,2CAAyB;AACzB,qCAA2G;AAAlG,qHAAA,0BAA0B,OAAA;AAAE,yGAAA,cAAc,OAAA;AAAE,4GAAA,iBAAiB,OAAA;AAAE,0GAAA,eAAe,OAAA;AAEvF,IAAY,MAKX;AALD,WAAY,MAAM;IAChB,6BAAmB,CAAA;IACnB,2BAAiB,CAAA;IACjB,+BAAqB,CAAA;IACrB,iCAAuB,CAAA;AACzB,CAAC,EALW,MAAM,sBAAN,MAAM,QAKjB;AAED,SAAgB,cAAc,CAAC,KAAa;IAC1C,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,MAAM,CAAC,OAAO;YACjB,OAAO,MAAM,CAAC,OAAO,CAAC;QACxB,KAAK,MAAM,CAAC,MAAM;YAChB,OAAO,MAAM,CAAC,MAAM,CAAC;QACvB,KAAK,MAAM,CAAC,QAAQ;YAClB,OAAO,MAAM,CAAC,QAAQ,CAAC;QACzB,KAAK,MAAM,CAAC,SAAS;YACnB,OAAO,MAAM,CAAC,SAAS,CAAC;QAC1B;YACE,OAAO,SAAS,CAAC;IACrB,CAAC;AACH,CAAC;AAsDD,SAAgB,gBAAgB,CAAC,MAAiC;IAChE,OAAO,MAAM,CAAC,UAAU,KAAK,SAAS,IAAI,MAAM,CAAC,UAAU,KAAK,IAAI,CAAC;AACvE,CAAC;AAED,SAAgB,oBAAoB,CAClC,MAAiC;IAEjC,OAAO,MAAM,CAAC,UAAU,EAAE,sBAAsB,IAAI,SAAS,CAAC;AAChE,CAAC;AAED,SAAgB,uBAAuB,CACrC,MAAiC;IAEjC,OAAO,oBAAoB,CAAC,MAAM,CAAC,KAAK,SAAS,CAAC;AACpD,CAAC;AAED,MAAa,qBAAsB,SAAQ,KAAK;IACrC,YAAY,CAAS;IACrB,OAAO,CAAW;IAE3B,YAAY,YAAoB,EAAE,OAAiB;QACjD,KAAK,CAAC,6BAA6B,YAAY,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC3E,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;QACpC,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;CACF;AAVD,sDAUC","sourcesContent":["import type { OrderBookId, PubkeyStr } from \"../../shared\";\nimport type { OrderBookPair } from \"../orderbook\";\nimport type { Outcome } from \"./outcome\";\nimport type {\n ConditionalToken,\n DepositAsset,\n DepositAssetPair,\n TokenMetadata,\n} from \"./tokens\";\nimport type { MarketResolutionResponse } from \"./wire\";\n\nexport * from \"./client\";\nexport * from \"./wire\";\nexport * from \"./outcome\";\nexport * from \"./tokens\";\nexport { globalDepositAssetFromWire, marketFromWire, tryMarketFromWire, resolveIconUrls } from \"./convert\";\n\nexport enum Status {\n Pending = \"Pending\",\n Active = \"Active\",\n Resolved = \"Resolved\",\n Cancelled = \"Cancelled\",\n}\n\nexport function statusFromWire(value: string): Status | undefined {\n switch (value) {\n case Status.Pending:\n return Status.Pending;\n case Status.Active:\n return Status.Active;\n case Status.Resolved:\n return Status.Resolved;\n case Status.Cancelled:\n return Status.Cancelled;\n default:\n return undefined;\n }\n}\n\nexport interface Market {\n id: number;\n pubkey: PubkeyStr;\n name: string;\n bannerImageUrlLow?: string;\n bannerImageUrlMedium?: string;\n bannerImageUrlHigh?: string;\n iconUrlLow: string;\n iconUrlMedium: string;\n iconUrlHigh: string;\n featuredRank?: number;\n slug: string;\n status: Status;\n /**\n * Maker fee in basis points (1 bps = 0.01%); negative means a rebate.\n * Set per market at creation, admin-updatable on chain.\n */\n makerFeeBps: number;\n /**\n * Taker fee in basis points (1 bps = 0.01%); negative means a rebate.\n * Set per market at creation, admin-updatable on chain.\n */\n takerFeeBps: number;\n createdAt: Date;\n activatedAt?: Date;\n settledAt?: Date;\n /** Resolution deadline as a Unix timestamp in milliseconds. */\n resolutionBy?: number;\n resolution?: MarketResolutionResponse;\n description?: string;\n definition: string;\n category?: string;\n subcategory?: string;\n tags: string[];\n numOutcomes: number;\n depositAssets: DepositAsset[];\n /**\n * Unique base/quote deposit-asset pairs derived from `orderbookPairs`\n * during wire→domain conversion. Deduplicated by `(base, quote)` pubkey.\n */\n depositAssetPairs: DepositAssetPair[];\n conditionalTokens: ConditionalToken[];\n outcomes: Outcome[];\n orderbookPairs: OrderBookPair[];\n orderbookIds: OrderBookId[];\n tokenMetadata: Record<string, TokenMetadata>;\n}\n\nexport interface MarketResolutionContainer {\n resolution?: MarketResolutionResponse | null;\n}\n\nexport function isMarketResolved(market: MarketResolutionContainer): boolean {\n return market.resolution !== undefined && market.resolution !== null;\n}\n\nexport function singleWinningOutcome(\n market: MarketResolutionContainer\n): number | undefined {\n return market.resolution?.single_winning_outcome ?? undefined;\n}\n\nexport function hasSingleWinningOutcome(\n market: MarketResolutionContainer\n): boolean {\n return singleWinningOutcome(market) !== undefined;\n}\n\nexport class MarketValidationError extends Error {\n readonly marketPubkey: string;\n readonly details: string[];\n\n constructor(marketPubkey: string, details: string[]) {\n super(`Market validation errors (${marketPubkey}): ${details.join(\"; \")}`);\n this.name = \"MarketValidationError\";\n this.marketPubkey = marketPubkey;\n this.details = details;\n }\n}\n"]}
|
|
@@ -1,15 +1,21 @@
|
|
|
1
1
|
import type { OutcomeResponse } from "./wire";
|
|
2
|
+
/** One market result whose artwork qualities are all populated or all absent. */
|
|
2
3
|
export interface Outcome {
|
|
3
4
|
index: number;
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
/** Optional low-quality artwork, cross-filled when another quality exists. */
|
|
6
|
+
iconUrlLow?: string;
|
|
7
|
+
/** Optional medium-quality artwork, cross-filled when another quality exists. */
|
|
8
|
+
iconUrlMedium?: string;
|
|
9
|
+
/** Optional high-quality artwork, cross-filled when another quality exists. */
|
|
10
|
+
iconUrlHigh?: string;
|
|
7
11
|
name: string;
|
|
8
12
|
nameLong?: string;
|
|
9
13
|
}
|
|
14
|
+
/** Retained conversion error surface; absent outcome artwork no longer throws it. */
|
|
10
15
|
export declare class OutcomeValidationError extends Error {
|
|
11
16
|
readonly details: string[];
|
|
12
17
|
constructor(name: string, details: string[]);
|
|
13
18
|
}
|
|
19
|
+
/** Converts outcome metadata while preserving non-blank URLs and optional artwork. */
|
|
14
20
|
export declare function outcomeFromWire(source: OutcomeResponse): Outcome;
|
|
15
21
|
//# sourceMappingURL=outcome.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"outcome.d.ts","sourceRoot":"","sources":["../../../src/domain/market/outcome.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AAE9C,MAAM,WAAW,OAAO;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"outcome.d.ts","sourceRoot":"","sources":["../../../src/domain/market/outcome.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AAE9C,iFAAiF;AACjF,MAAM,WAAW,OAAO;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,8EAA8E;IAC9E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iFAAiF;IACjF,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,+EAA+E;IAC/E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,qFAAqF;AACrF,qBAAa,sBAAuB,SAAQ,KAAK;IAC/C,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;gBAEf,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE;CAK5C;AAED,sFAAsF;AACtF,wBAAgB,eAAe,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAehE"}
|
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.OutcomeValidationError = void 0;
|
|
4
4
|
exports.outcomeFromWire = outcomeFromWire;
|
|
5
5
|
const icon_1 = require("./icon");
|
|
6
|
+
/** Retained conversion error surface; absent outcome artwork no longer throws it. */
|
|
6
7
|
class OutcomeValidationError extends Error {
|
|
7
8
|
details;
|
|
8
9
|
constructor(name, details) {
|
|
@@ -12,18 +13,20 @@ class OutcomeValidationError extends Error {
|
|
|
12
13
|
}
|
|
13
14
|
}
|
|
14
15
|
exports.OutcomeValidationError = OutcomeValidationError;
|
|
16
|
+
/** Converts outcome metadata while preserving non-blank URLs and optional artwork. */
|
|
15
17
|
function outcomeFromWire(source) {
|
|
16
|
-
const iconUrls = (0, icon_1.resolveIconUrls)(source.icon_url_low, source.icon_url_medium, source.icon_url_high);
|
|
17
|
-
if (!iconUrls) {
|
|
18
|
-
throw new OutcomeValidationError(source.name, ["Missing icon URL"]);
|
|
19
|
-
}
|
|
18
|
+
const iconUrls = (0, icon_1.resolveIconUrls)(nonBlank(source.icon_url_low), nonBlank(source.icon_url_medium), nonBlank(source.icon_url_high));
|
|
20
19
|
return {
|
|
21
20
|
index: source.index,
|
|
22
|
-
iconUrlLow: iconUrls
|
|
23
|
-
iconUrlMedium: iconUrls
|
|
24
|
-
iconUrlHigh: iconUrls
|
|
21
|
+
iconUrlLow: iconUrls?.low,
|
|
22
|
+
iconUrlMedium: iconUrls?.medium,
|
|
23
|
+
iconUrlHigh: iconUrls?.high,
|
|
25
24
|
name: source.name,
|
|
26
25
|
nameLong: source.name_long,
|
|
27
26
|
};
|
|
28
27
|
}
|
|
28
|
+
/** Treats blank outcome artwork metadata as absent without changing non-blank URLs. */
|
|
29
|
+
function nonBlank(value) {
|
|
30
|
+
return value?.trim() ? value : undefined;
|
|
31
|
+
}
|
|
29
32
|
//# sourceMappingURL=outcome.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"outcome.js","sourceRoot":"","sources":["../../../src/domain/market/outcome.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"outcome.js","sourceRoot":"","sources":["../../../src/domain/market/outcome.ts"],"names":[],"mappings":";;;AA4BA,0CAeC;AA3CD,iCAAyC;AAgBzC,qFAAqF;AACrF,MAAa,sBAAuB,SAAQ,KAAK;IACtC,OAAO,CAAW;IAE3B,YAAY,IAAY,EAAE,OAAiB;QACzC,KAAK,CAAC,8BAA8B,IAAI,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACpE,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;QACrC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;CACF;AARD,wDAQC;AAED,sFAAsF;AACtF,SAAgB,eAAe,CAAC,MAAuB;IACrD,MAAM,QAAQ,GAAG,IAAA,sBAAe,EAC9B,QAAQ,CAAC,MAAM,CAAC,YAAY,CAAC,EAC7B,QAAQ,CAAC,MAAM,CAAC,eAAe,CAAC,EAChC,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC,CAC/B,CAAC;IAEF,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,UAAU,EAAE,QAAQ,EAAE,GAAG;QACzB,aAAa,EAAE,QAAQ,EAAE,MAAM;QAC/B,WAAW,EAAE,QAAQ,EAAE,IAAI;QAC3B,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,QAAQ,EAAE,MAAM,CAAC,SAAS;KAC3B,CAAC;AACJ,CAAC;AAED,uFAAuF;AACvF,SAAS,QAAQ,CAAC,KAAgC;IAChD,OAAO,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AAC3C,CAAC","sourcesContent":["import { resolveIconUrls } from \"./icon\";\nimport type { OutcomeResponse } from \"./wire\";\n\n/** One market result whose artwork qualities are all populated or all absent. */\nexport interface Outcome {\n index: number;\n /** Optional low-quality artwork, cross-filled when another quality exists. */\n iconUrlLow?: string;\n /** Optional medium-quality artwork, cross-filled when another quality exists. */\n iconUrlMedium?: string;\n /** Optional high-quality artwork, cross-filled when another quality exists. */\n iconUrlHigh?: string;\n name: string;\n nameLong?: string;\n}\n\n/** Retained conversion error surface; absent outcome artwork no longer throws it. */\nexport class OutcomeValidationError extends Error {\n readonly details: string[];\n\n constructor(name: string, details: string[]) {\n super(`Outcome validation errors (${name}): ${details.join(\"; \")}`);\n this.name = \"OutcomeValidationError\";\n this.details = details;\n }\n}\n\n/** Converts outcome metadata while preserving non-blank URLs and optional artwork. */\nexport function outcomeFromWire(source: OutcomeResponse): Outcome {\n const iconUrls = resolveIconUrls(\n nonBlank(source.icon_url_low),\n nonBlank(source.icon_url_medium),\n nonBlank(source.icon_url_high),\n );\n\n return {\n index: source.index,\n iconUrlLow: iconUrls?.low,\n iconUrlMedium: iconUrls?.medium,\n iconUrlHigh: iconUrls?.high,\n name: source.name,\n nameLong: source.name_long,\n };\n}\n\n/** Treats blank outcome artwork metadata as absent without changing non-blank URLs. */\nfunction nonBlank(value: string | undefined | null): string | undefined {\n return value?.trim() ? value : undefined;\n}\n"]}
|
|
@@ -177,8 +177,14 @@ function conditionalFromWire(source, depositAsset, depositSymbol, depositShortSy
|
|
|
177
177
|
const errors = [];
|
|
178
178
|
if (source.decimals === undefined)
|
|
179
179
|
errors.push("Missing decimals");
|
|
180
|
-
|
|
181
|
-
|
|
180
|
+
// short_symbol is optional on the wire — the backend's conditional-mint
|
|
181
|
+
// records currently ship only `symbol` — and the conversion below already
|
|
182
|
+
// falls back short_symbol ?? symbol (mirroring the rust and python SDKs,
|
|
183
|
+
// which never required it). Requiring it here made every market invalid
|
|
184
|
+
// and broke all market-dependent consumers. A token is only invalid when
|
|
185
|
+
// BOTH are absent: then the fallback chain has nothing to display it by.
|
|
186
|
+
if (!source.short_symbol && !source.symbol)
|
|
187
|
+
errors.push("Missing symbol and short_symbol");
|
|
182
188
|
if (!source.outcome)
|
|
183
189
|
errors.push("Missing outcome");
|
|
184
190
|
if (errors.length > 0) {
|