@p2pdotme/sdk 1.0.0 → 1.0.1
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 +1 -1
- package/dist/fraud-engine.cjs +2 -1
- package/dist/fraud-engine.cjs.map +1 -1
- package/dist/fraud-engine.mjs +2 -1
- package/dist/fraud-engine.mjs.map +1 -1
- package/dist/index.cjs +3 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.mjs +3 -2
- package/dist/index.mjs.map +1 -1
- package/dist/order-routing.cjs +2 -1
- package/dist/order-routing.cjs.map +1 -1
- package/dist/order-routing.mjs +2 -1
- package/dist/order-routing.mjs.map +1 -1
- package/dist/payload.cjs +2 -1
- package/dist/payload.cjs.map +1 -1
- package/dist/payload.d.cts +2 -0
- package/dist/payload.d.ts +2 -0
- package/dist/payload.mjs +2 -1
- package/dist/payload.mjs.map +1 -1
- package/dist/profile.cjs +2 -1
- package/dist/profile.cjs.map +1 -1
- package/dist/profile.d.cts +3 -0
- package/dist/profile.d.ts +3 -0
- package/dist/profile.mjs +2 -1
- package/dist/profile.mjs.map +1 -1
- package/dist/react.cjs +2 -1
- package/dist/react.cjs.map +1 -1
- package/dist/react.d.cts +5 -0
- package/dist/react.d.ts +5 -0
- package/dist/react.mjs +2 -1
- package/dist/react.mjs.map +1 -1
- package/dist/zkkyc.cjs +2 -1
- package/dist/zkkyc.cjs.map +1 -1
- package/dist/zkkyc.mjs +2 -1
- package/dist/zkkyc.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/order-routing/index.ts","../src/order-routing/client.ts","../src/contracts/abis/index.ts","../src/contracts/abis/order-flow-facet.ts","../src/contracts/abis/p2p-config-facet.ts","../src/contracts/abis/reputation-manager.ts","../src/contracts/order-flow/index.ts","../src/lib/logger.ts","../src/lib/sleep.ts","../src/validation/errors.ts","../src/validation/schemas.ts","../src/order-routing/errors.ts","../src/order-routing/validation.ts","../src/contracts/p2p-config/index.ts","../src/profile/validation.ts","../src/contracts/reputation-manager/writes.ts","../src/zkkyc/validation.ts","../src/contracts/tx-limits/index.ts","../src/contracts/usdc/index.ts","../src/order-routing/routing.ts","../src/order-routing/subgraph/client.ts","../src/order-routing/subgraph/queries.ts","../src/order-routing/subgraph/index.ts"],"sourcesContent":["// ── Main entry point ────────────────────────────────────────────────────\n\nexport { createOrderRouter, type OrderRouter } from \"./client\";\n\n// ── Types ───────────────────────────────────────────────────────────────\n\nexport type { OrderRoutingConfig, SelectCircleParams } from \"./types\";\n\n// ── Errors ──────────────────────────────────────────────────────────────\n\nexport { OrderRoutingError, type OrderRoutingErrorCode } from \"./errors\";\n","import type { ResultAsync } from \"neverthrow\";\nimport { stringToHex } from \"viem\";\nimport { checkCircleEligibility } from \"../contracts\";\nimport { noopLogger } from \"../lib\";\nimport type { OrderRoutingError } from \"./errors\";\nimport { selectCircleForOrderAsync } from \"./routing\";\nimport { getCirclesForRouting } from \"./subgraph\";\nimport type { Logger, OrderRoutingConfig, SelectCircleParams } from \"./types\";\n\nexport interface OrderRouter {\n\t/**\n\t * Full flow: fetch circles from subgraph → epsilon-greedy selection →\n\t * on-chain eligibility validation → return circleId.\n\t */\n\tselectCircle(params: SelectCircleParams): ResultAsync<bigint, OrderRoutingError>;\n}\n\nexport function createOrderRouter(config: OrderRoutingConfig): OrderRouter {\n\tconst { subgraphUrl, publicClient, contractAddress } = config;\n\tconst logger: Logger = config.logger ?? noopLogger;\n\n\treturn {\n\t\tselectCircle(params: SelectCircleParams) {\n\t\t\tconst currencyHex = stringToHex(params.currency, { size: 32 });\n\n\t\t\tlogger.info(\"selectCircle started\", {\n\t\t\t\tcurrency: params.currency,\n\t\t\t\tuser: params.user,\n\t\t\t\torderType: String(params.orderType),\n\t\t\t});\n\n\t\t\treturn getCirclesForRouting(subgraphUrl, currencyHex, logger).andThen((circles) =>\n\t\t\t\tselectCircleForOrderAsync(\n\t\t\t\t\tcircles,\n\t\t\t\t\tcurrencyHex,\n\t\t\t\t\t(circleId) =>\n\t\t\t\t\t\tcheckCircleEligibility(\n\t\t\t\t\t\t\tpublicClient,\n\t\t\t\t\t\t\tcontractAddress,\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tcircleId,\n\t\t\t\t\t\t\t\tcurrency: currencyHex,\n\t\t\t\t\t\t\t\tuser: params.user,\n\t\t\t\t\t\t\t\tusdtAmount: params.usdtAmount,\n\t\t\t\t\t\t\t\tfiatAmount: params.fiatAmount,\n\t\t\t\t\t\t\t\torderType: params.orderType,\n\t\t\t\t\t\t\t\tpreferredPCConfigId: params.preferredPCConfigId,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tlogger,\n\t\t\t\t\t\t),\n\t\t\t\t\tlogger,\n\t\t\t\t),\n\t\t\t);\n\t\t},\n\t};\n}\n","import { erc20Abi } from \"viem\";\nimport { orderFlowFacetAbi } from \"./order-flow-facet\";\nimport { p2pConfigFacetAbi } from \"./p2p-config-facet\";\nimport { reputationManagerAbi } from \"./reputation-manager\";\n\nconst DIAMOND_ABI = [...orderFlowFacetAbi, ...p2pConfigFacetAbi] as const;\n\nexport const ABIS = {\n\tDIAMOND: DIAMOND_ABI,\n\tFACETS: {\n\t\tORDER_FLOW: orderFlowFacetAbi,\n\t\tCONFIG: p2pConfigFacetAbi,\n\t},\n\tEXTERNAL: {\n\t\tUSDC: erc20Abi,\n\t\tREPUTATION_MANAGER: reputationManagerAbi,\n\t},\n} as const;\n","export const orderFlowFacetAbi = [\n\t{\n\t\tinputs: [\n\t\t\t{ internalType: \"uint256\", name: \"circleId\", type: \"uint256\" },\n\t\t\t{ internalType: \"uint256\", name: \"assignUpto\", type: \"uint256\" },\n\t\t\t{ internalType: \"bytes32\", name: \"currency\", type: \"bytes32\" },\n\t\t\t{ internalType: \"address\", name: \"user\", type: \"address\" },\n\t\t\t{ internalType: \"uint256\", name: \"usdtAmount\", type: \"uint256\" },\n\t\t\t{ internalType: \"uint256\", name: \"fiatAmount\", type: \"uint256\" },\n\t\t\t{ internalType: \"int256\", name: \"orderType\", type: \"int256\" },\n\t\t\t{ internalType: \"uint256\", name: \"preferredPCConfigId\", type: \"uint256\" },\n\t\t],\n\t\tname: \"getAssignableMerchantsFromCircle\",\n\t\toutputs: [{ internalType: \"address[]\", name: \"\", type: \"address[]\" }],\n\t\tstateMutability: \"view\",\n\t\ttype: \"function\",\n\t},\n\t{\n\t\tinputs: [\n\t\t\t{ internalType: \"address\", name: \"_user\", type: \"address\" },\n\t\t\t{ internalType: \"bytes32\", name: \"_nativeCurrency\", type: \"bytes32\" },\n\t\t],\n\t\tname: \"userTxLimit\",\n\t\toutputs: [\n\t\t\t{ internalType: \"uint256\", name: \"\", type: \"uint256\" },\n\t\t\t{ internalType: \"uint256\", name: \"\", type: \"uint256\" },\n\t\t],\n\t\tstateMutability: \"view\",\n\t\ttype: \"function\",\n\t},\n] as const;\n","export const p2pConfigFacetAbi = [\n\t{\n\t\tinputs: [\n\t\t\t{\n\t\t\t\tinternalType: \"bytes32\",\n\t\t\t\tname: \"_currency\",\n\t\t\t\ttype: \"bytes32\",\n\t\t\t},\n\t\t],\n\t\tname: \"getPriceConfig\",\n\t\toutputs: [\n\t\t\t{\n\t\t\t\tcomponents: [\n\t\t\t\t\t{\n\t\t\t\t\t\tinternalType: \"uint256\",\n\t\t\t\t\t\tname: \"buyPrice\",\n\t\t\t\t\t\ttype: \"uint256\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tinternalType: \"uint256\",\n\t\t\t\t\t\tname: \"sellPrice\",\n\t\t\t\t\t\ttype: \"uint256\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tinternalType: \"int256\",\n\t\t\t\t\t\tname: \"buyPriceOffset\",\n\t\t\t\t\t\ttype: \"int256\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tinternalType: \"uint256\",\n\t\t\t\t\t\tname: \"baseSpread\",\n\t\t\t\t\t\ttype: \"uint256\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tinternalType: \"struct P2pConfigStorage.PriceConfig\",\n\t\t\t\tname: \"\",\n\t\t\t\ttype: \"tuple\",\n\t\t\t},\n\t\t],\n\t\tstateMutability: \"view\",\n\t\ttype: \"function\",\n\t},\n\t{\n\t\tinputs: [\n\t\t\t{\n\t\t\t\tinternalType: \"bytes32\",\n\t\t\t\tname: \"_nativeCurrency\",\n\t\t\t\ttype: \"bytes32\",\n\t\t\t},\n\t\t],\n\t\tname: \"getRpPerUsdtLimitRational\",\n\t\toutputs: [\n\t\t\t{\n\t\t\t\tinternalType: \"uint256\",\n\t\t\t\tname: \"numerator\",\n\t\t\t\ttype: \"uint256\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tinternalType: \"uint256\",\n\t\t\t\tname: \"denominator\",\n\t\t\t\ttype: \"uint256\",\n\t\t\t},\n\t\t],\n\t\tstateMutability: \"view\",\n\t\ttype: \"function\",\n\t},\n] as const;\n","export const reputationManagerAbi = [\n\t{\n\t\tinputs: [\n\t\t\t{\n\t\t\t\tinternalType: \"string\",\n\t\t\t\tname: \"_socialName\",\n\t\t\t\ttype: \"string\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tcomponents: [\n\t\t\t\t\t{\n\t\t\t\t\t\tcomponents: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tinternalType: \"string\",\n\t\t\t\t\t\t\t\tname: \"provider\",\n\t\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tinternalType: \"string\",\n\t\t\t\t\t\t\t\tname: \"parameters\",\n\t\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tinternalType: \"string\",\n\t\t\t\t\t\t\t\tname: \"context\",\n\t\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t\tinternalType: \"struct IReclaimSDK.ClaimInfo\",\n\t\t\t\t\t\tname: \"claimInfo\",\n\t\t\t\t\t\ttype: \"tuple\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tcomponents: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tcomponents: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tinternalType: \"bytes32\",\n\t\t\t\t\t\t\t\t\t\tname: \"identifier\",\n\t\t\t\t\t\t\t\t\t\ttype: \"bytes32\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tinternalType: \"address\",\n\t\t\t\t\t\t\t\t\t\tname: \"owner\",\n\t\t\t\t\t\t\t\t\t\ttype: \"address\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tinternalType: \"uint32\",\n\t\t\t\t\t\t\t\t\t\tname: \"timestampS\",\n\t\t\t\t\t\t\t\t\t\ttype: \"uint32\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tinternalType: \"uint32\",\n\t\t\t\t\t\t\t\t\t\tname: \"epoch\",\n\t\t\t\t\t\t\t\t\t\ttype: \"uint32\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\tinternalType: \"struct IReclaimSDK.CompleteClaimData\",\n\t\t\t\t\t\t\t\tname: \"claim\",\n\t\t\t\t\t\t\t\ttype: \"tuple\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tinternalType: \"bytes[]\",\n\t\t\t\t\t\t\t\tname: \"signatures\",\n\t\t\t\t\t\t\t\ttype: \"bytes[]\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t\tinternalType: \"struct IReclaimSDK.SignedClaim\",\n\t\t\t\t\t\tname: \"signedClaim\",\n\t\t\t\t\t\ttype: \"tuple\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tinternalType: \"struct IReclaimSDK.Proof[]\",\n\t\t\t\tname: \"proofs\",\n\t\t\t\ttype: \"tuple[]\",\n\t\t\t},\n\t\t],\n\t\tname: \"socialVerify\",\n\t\toutputs: [],\n\t\tstateMutability: \"nonpayable\",\n\t\ttype: \"function\",\n\t},\n\t{\n\t\tinputs: [\n\t\t\t{\n\t\t\t\tinternalType: \"uint256\",\n\t\t\t\tname: \"nullifierSeed\",\n\t\t\t\ttype: \"uint256\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tinternalType: \"uint256\",\n\t\t\t\tname: \"nullifier\",\n\t\t\t\ttype: \"uint256\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tinternalType: \"uint256\",\n\t\t\t\tname: \"timestamp\",\n\t\t\t\ttype: \"uint256\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tinternalType: \"uint256\",\n\t\t\t\tname: \"signal\",\n\t\t\t\ttype: \"uint256\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tinternalType: \"uint256[4]\",\n\t\t\t\tname: \"revealArray\",\n\t\t\t\ttype: \"uint256[4]\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tinternalType: \"uint256[8]\",\n\t\t\t\tname: \"groth16Proof\",\n\t\t\t\ttype: \"uint256[8]\",\n\t\t\t},\n\t\t],\n\t\tname: \"submitAnonAadharProof\",\n\t\toutputs: [],\n\t\tstateMutability: \"nonpayable\",\n\t\ttype: \"function\",\n\t},\n\t{\n\t\tinputs: [\n\t\t\t{\n\t\t\t\tcomponents: [\n\t\t\t\t\t{\n\t\t\t\t\t\tinternalType: \"bytes32\",\n\t\t\t\t\t\tname: \"version\",\n\t\t\t\t\t\ttype: \"bytes32\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tcomponents: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tinternalType: \"bytes32\",\n\t\t\t\t\t\t\t\tname: \"vkeyHash\",\n\t\t\t\t\t\t\t\ttype: \"bytes32\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tinternalType: \"bytes\",\n\t\t\t\t\t\t\t\tname: \"proof\",\n\t\t\t\t\t\t\t\ttype: \"bytes\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tinternalType: \"bytes32[]\",\n\t\t\t\t\t\t\t\tname: \"publicInputs\",\n\t\t\t\t\t\t\t\ttype: \"bytes32[]\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t\tinternalType: \"struct ProofVerificationData\",\n\t\t\t\t\t\tname: \"proofVerificationData\",\n\t\t\t\t\t\ttype: \"tuple\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tinternalType: \"bytes\",\n\t\t\t\t\t\tname: \"committedInputs\",\n\t\t\t\t\t\ttype: \"bytes\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tcomponents: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tinternalType: \"uint256\",\n\t\t\t\t\t\t\t\tname: \"validityPeriodInSeconds\",\n\t\t\t\t\t\t\t\ttype: \"uint256\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tinternalType: \"string\",\n\t\t\t\t\t\t\t\tname: \"domain\",\n\t\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tinternalType: \"string\",\n\t\t\t\t\t\t\t\tname: \"scope\",\n\t\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tinternalType: \"bool\",\n\t\t\t\t\t\t\t\tname: \"devMode\",\n\t\t\t\t\t\t\t\ttype: \"bool\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t\tinternalType: \"struct ServiceConfig\",\n\t\t\t\t\t\tname: \"serviceConfig\",\n\t\t\t\t\t\ttype: \"tuple\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tinternalType: \"struct ProofVerificationParams\",\n\t\t\t\tname: \"params\",\n\t\t\t\ttype: \"tuple\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tinternalType: \"bool\",\n\t\t\t\tname: \"isIDCard\",\n\t\t\t\ttype: \"bool\",\n\t\t\t},\n\t\t],\n\t\tname: \"zkPassportRegister\",\n\t\toutputs: [],\n\t\tstateMutability: \"nonpayable\",\n\t\ttype: \"function\",\n\t},\n] as const;\n","import { ResultAsync } from \"neverthrow\";\nimport type { Address } from \"viem\";\nimport { noopLogger } from \"../../lib\";\nimport { OrderRoutingError } from \"../../order-routing/errors\";\nimport type { CheckCircleEligibilityParams, Logger } from \"../../order-routing/types\";\nimport { ZodCheckCircleEligibilityParamsSchema } from \"../../order-routing/validation\";\nimport type { PublicClientLike } from \"../../types\";\nimport { validate } from \"../../validation\";\nimport { ABIS } from \"../abis\";\n\n/** Checks on-chain eligibility for a given circle by reading assignable merchants. */\nexport function checkCircleEligibility(\n\tpublicClient: PublicClientLike,\n\tcontractAddress: Address,\n\tparams: CheckCircleEligibilityParams,\n\tlogger: Logger = noopLogger,\n): ResultAsync<boolean, OrderRoutingError> {\n\treturn validate(\n\t\tZodCheckCircleEligibilityParamsSchema,\n\t\tparams,\n\t\t(message, cause, d) =>\n\t\t\tnew OrderRoutingError(message, { code: \"VALIDATION_ERROR\", cause, context: { data: d } }),\n\t)\n\t\t.asyncAndThen((validated) => {\n\t\t\tlogger.debug(\"checking on-chain eligibility\", {\n\t\t\t\tcircleId: String(validated.circleId),\n\t\t\t\tcontractAddress,\n\t\t\t});\n\n\t\t\treturn ResultAsync.fromPromise(\n\t\t\t\tpublicClient.readContract({\n\t\t\t\t\taddress: contractAddress,\n\t\t\t\t\tabi: ABIS.FACETS.ORDER_FLOW,\n\t\t\t\t\tfunctionName: \"getAssignableMerchantsFromCircle\",\n\t\t\t\t\targs: [\n\t\t\t\t\t\tvalidated.circleId,\n\t\t\t\t\t\t1n,\n\t\t\t\t\t\tvalidated.currency,\n\t\t\t\t\t\tvalidated.user as Address,\n\t\t\t\t\t\tvalidated.usdtAmount,\n\t\t\t\t\t\tvalidated.fiatAmount,\n\t\t\t\t\t\tvalidated.orderType,\n\t\t\t\t\t\tvalidated.preferredPCConfigId,\n\t\t\t\t\t],\n\t\t\t\t}),\n\t\t\t\t(error) =>\n\t\t\t\t\tnew OrderRoutingError(\"Eligibility check failed\", {\n\t\t\t\t\t\tcode: \"CONTRACT_READ_ERROR\",\n\t\t\t\t\t\tcause: error,\n\t\t\t\t\t\tcontext: { circleId: String(params.circleId) },\n\t\t\t\t\t}),\n\t\t\t);\n\t\t})\n\t\t.map((merchants) => {\n\t\t\tconst arr = merchants as readonly Address[];\n\t\t\tconst eligible = arr.length >= 1;\n\t\t\tlogger.debug(\"eligibility check result\", {\n\t\t\t\tcircleId: String(params.circleId),\n\t\t\t\tassignableMerchants: arr.length,\n\t\t\t\teligible,\n\t\t\t});\n\t\t\treturn eligible;\n\t\t});\n}\n","export interface Logger {\n\tdebug(message: string, data?: Record<string, unknown>): void;\n\tinfo(message: string, data?: Record<string, unknown>): void;\n\twarn(message: string, data?: Record<string, unknown>): void;\n\terror(message: string, data?: Record<string, unknown>): void;\n}\n\nconst noop = () => {};\n\nexport const noopLogger: Logger = {\n\tdebug: noop,\n\tinfo: noop,\n\twarn: noop,\n\terror: noop,\n};\n","/** Returns a promise that resolves after the given number of milliseconds. */\nexport function sleep(ms: number): Promise<void> {\n\treturn new Promise((resolve) => setTimeout(resolve, ms));\n}\n","export class SdkError<TCode extends string = string> extends Error {\n\treadonly code: TCode;\n\treadonly cause?: unknown;\n\treadonly context?: Record<string, unknown>;\n\n\tconstructor(\n\t\tmessage: string,\n\t\toptions: {\n\t\t\tcode: TCode;\n\t\t\tcause?: unknown;\n\t\t\tcontext?: Record<string, unknown>;\n\t\t},\n\t) {\n\t\tsuper(message);\n\t\tthis.name = \"SdkError\";\n\t\tthis.code = options.code;\n\t\tthis.cause = options.cause;\n\t\tthis.context = options.context;\n\t}\n}\n","import { err, ok, type Result } from \"neverthrow\";\nimport { isAddress } from \"viem\";\nimport { z } from \"zod\";\n\nexport const ZodAddressSchema = z\n\t.string()\n\t.refine((s) => isAddress(s), { message: \"Invalid Ethereum address\" });\n\nexport const ZodCurrencySchema = z.enum([\n\t\"IDR\",\n\t\"INR\",\n\t\"BRL\",\n\t\"ARS\",\n\t\"MEX\",\n\t\"VEN\",\n\t\"EUR\",\n\t\"NGN\",\n\t\"USD\",\n]);\n\nexport type CurrencyType = z.infer<typeof ZodCurrencySchema>;\n\nexport function validate<S extends z.ZodType, E>(\n\tschema: S,\n\tdata: unknown,\n\ttoError: (message: string, cause: unknown, data: unknown) => E,\n): Result<z.infer<S>, E> {\n\tconst result = schema.safeParse(data);\n\tif (result.success) {\n\t\treturn ok(result.data as z.infer<S>);\n\t}\n\treturn err(toError(z.prettifyError(result.error), result.error, data));\n}\n","import { SdkError } from \"../validation\";\n\nexport type OrderRoutingErrorCode =\n\t| \"NO_ELIGIBLE_CIRCLES\"\n\t| \"SUBGRAPH_ERROR\"\n\t| \"SUBGRAPH_NOT_CONFIGURED\"\n\t| \"VALIDATION_ERROR\"\n\t| \"CONTRACT_READ_ERROR\";\n\nexport class OrderRoutingError extends SdkError<OrderRoutingErrorCode> {\n\tconstructor(\n\t\tmessage: string,\n\t\toptions: {\n\t\t\tcode: OrderRoutingErrorCode;\n\t\t\tcause?: unknown;\n\t\t\tcontext?: Record<string, unknown>;\n\t\t},\n\t) {\n\t\tsuper(message, options);\n\t\tthis.name = \"OrderRoutingError\";\n\t}\n}\n","import { z } from \"zod\";\nimport { ZodAddressSchema } from \"../validation/schemas\";\n\n// ── Circle schemas ──────────────────────────────────────────────────────\n\nexport const ZodCircleScoreStateSchema = z.object({\n\tactiveMerchantsCount: z.coerce.number(),\n});\n\nexport const ZodCircleMetricsForRoutingSchema = z.object({\n\tcircleScore: z.coerce.number(),\n\tcircleStatus: z.string(),\n\tscoreState: ZodCircleScoreStateSchema,\n});\n\nexport const ZodCircleForRoutingSchema = z.object({\n\tcircleId: z.string(),\n\tcurrency: z.string(),\n\tmetrics: ZodCircleMetricsForRoutingSchema,\n});\n\nexport const ZodCirclesForRoutingResponseSchema = z.object({\n\tcircles: z.array(ZodCircleForRoutingSchema),\n});\n\n// ── Eligibility check schema ────────────────────────────────────────────\n\nexport const ZodCheckCircleEligibilityParamsSchema = z.object({\n\tcircleId: z.bigint(),\n\tcurrency: z.string(),\n\tuser: ZodAddressSchema,\n\tusdtAmount: z.bigint(),\n\tfiatAmount: z.bigint(),\n\torderType: z.bigint(),\n\tpreferredPCConfigId: z.bigint(),\n});\n\n// ── Select circle schema ────────────────────────────────────────────────\n\nexport const ZodSelectCircleParamsSchema = z.object({\n\tcurrency: z.string().min(1),\n\tuser: ZodAddressSchema,\n\tusdtAmount: z.bigint(),\n\tfiatAmount: z.bigint(),\n\torderType: z.bigint(),\n\tpreferredPCConfigId: z.bigint(),\n});\n","import { ResultAsync } from \"neverthrow\";\nimport { type Address, stringToHex } from \"viem\";\nimport { ProfileError } from \"../../profile/errors\";\nimport type { PriceConfig } from \"../../profile/types\";\nimport type { PriceConfigParams } from \"../../profile/validation\";\nimport { ZodPriceConfigParamsSchema } from \"../../profile/validation\";\nimport type { PublicClientLike } from \"../../types\";\nimport { validate } from \"../../validation\";\nimport { ABIS } from \"../abis\";\n\n/** Reads the price config (buy/sell prices) for a given currency. */\nexport function getPriceConfig(\n\tpublicClient: PublicClientLike,\n\tdiamondAddress: Address,\n\tparams: PriceConfigParams,\n): ResultAsync<PriceConfig, ProfileError> {\n\treturn validate(\n\t\tZodPriceConfigParamsSchema,\n\t\tparams,\n\t\t(message, cause, data) =>\n\t\t\tnew ProfileError(message, {\n\t\t\t\tcode: \"VALIDATION_ERROR\",\n\t\t\t\tcause,\n\t\t\t\tcontext: { params: data },\n\t\t\t}),\n\t).asyncAndThen((validated) =>\n\t\tResultAsync.fromPromise(\n\t\t\tpublicClient.readContract({\n\t\t\t\taddress: diamondAddress,\n\t\t\t\tabi: ABIS.FACETS.CONFIG,\n\t\t\t\tfunctionName: \"getPriceConfig\",\n\t\t\t\targs: [stringToHex(validated.currency, { size: 32 })],\n\t\t\t}) as Promise<PriceConfig>,\n\t\t\t(error) =>\n\t\t\t\tnew ProfileError(\"Failed to read price config\", {\n\t\t\t\t\tcode: \"CONTRACT_READ_ERROR\",\n\t\t\t\t\tcause: error,\n\t\t\t\t\tcontext: { currency: validated.currency, diamondAddress },\n\t\t\t\t}),\n\t\t),\n\t);\n}\n","import { z } from \"zod\";\nimport { ZodAddressSchema, ZodCurrencySchema } from \"../validation/schemas\";\n\nexport const ZodUsdcBalanceParamsSchema = z.object({\n\taddress: ZodAddressSchema,\n});\n\nexport type UsdcBalanceParams = z.infer<typeof ZodUsdcBalanceParamsSchema>;\n\nexport const ZodGetBalancesParamsSchema = z.object({\n\taddress: ZodAddressSchema,\n\tcurrency: ZodCurrencySchema,\n});\n\nexport type GetBalancesParams = z.infer<typeof ZodGetBalancesParamsSchema>;\n\nexport const ZodTxLimitsParamsSchema = z.object({\n\taddress: ZodAddressSchema,\n\tcurrency: ZodCurrencySchema,\n});\n\nexport type TxLimitsParams = z.infer<typeof ZodTxLimitsParamsSchema>;\n\nexport const ZodPriceConfigParamsSchema = z.object({\n\tcurrency: ZodCurrencySchema,\n});\n\nexport type PriceConfigParams = z.infer<typeof ZodPriceConfigParamsSchema>;\n","import { Result } from \"neverthrow\";\nimport { type Address, encodeFunctionData } from \"viem\";\nimport { validate } from \"../../validation\";\nimport { ZkkycError } from \"../../zkkyc/errors\";\nimport type {\n\tAnonAadharProofParams,\n\tSocialVerifyParams,\n\tZkPassportRegisterParams,\n} from \"../../zkkyc/validation\";\nimport {\n\tZodAnonAadharProofParamsSchema,\n\tZodSocialVerifyParamsSchema,\n\tZodZkPassportRegisterParamsSchema,\n} from \"../../zkkyc/validation\";\nimport { ABIS } from \"../abis\";\n\n/** Prepares a social verification transaction. */\nexport function prepareSocialVerify(\n\treputationManagerAddress: Address,\n\tparams: SocialVerifyParams,\n): Result<{ to: Address; data: `0x${string}` }, ZkkycError> {\n\treturn validate(\n\t\tZodSocialVerifyParamsSchema,\n\t\tparams,\n\t\t(message, cause, data) =>\n\t\t\tnew ZkkycError(message, { code: \"VALIDATION_ERROR\", cause, context: { params: data } }),\n\t).andThen((validated) =>\n\t\tResult.fromThrowable(\n\t\t\t() => ({\n\t\t\t\tto: reputationManagerAddress,\n\t\t\t\tdata: encodeFunctionData({\n\t\t\t\t\tabi: ABIS.EXTERNAL.REPUTATION_MANAGER,\n\t\t\t\t\tfunctionName: \"socialVerify\",\n\t\t\t\t\targs: [\n\t\t\t\t\t\tvalidated._socialName,\n\t\t\t\t\t\tvalidated.proofs.map((proof) => ({\n\t\t\t\t\t\t\t...proof,\n\t\t\t\t\t\t\tsignedClaim: {\n\t\t\t\t\t\t\t\t...proof.signedClaim,\n\t\t\t\t\t\t\t\tclaim: {\n\t\t\t\t\t\t\t\t\t...proof.signedClaim.claim,\n\t\t\t\t\t\t\t\t\tidentifier: proof.signedClaim.claim.identifier as `0x${string}`,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tsignatures: proof.signedClaim.signatures as readonly `0x${string}`[],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t})),\n\t\t\t\t\t],\n\t\t\t\t}),\n\t\t\t}),\n\t\t\t(error) =>\n\t\t\t\tnew ZkkycError(\"Failed to encode socialVerify\", {\n\t\t\t\t\tcode: \"ENCODE_ERROR\",\n\t\t\t\t\tcause: error,\n\t\t\t\t}),\n\t\t)(),\n\t);\n}\n\n/** Prepares a submit anon Aadhaar proof transaction. */\nexport function prepareSubmitAnonAadharProof(\n\treputationManagerAddress: Address,\n\tparams: AnonAadharProofParams,\n): Result<{ to: Address; data: `0x${string}` }, ZkkycError> {\n\treturn validate(\n\t\tZodAnonAadharProofParamsSchema,\n\t\tparams,\n\t\t(message, cause, data) =>\n\t\t\tnew ZkkycError(message, { code: \"VALIDATION_ERROR\", cause, context: { params: data } }),\n\t).andThen((validated) =>\n\t\tResult.fromThrowable(\n\t\t\t() => ({\n\t\t\t\tto: reputationManagerAddress,\n\t\t\t\tdata: encodeFunctionData({\n\t\t\t\t\tabi: ABIS.EXTERNAL.REPUTATION_MANAGER,\n\t\t\t\t\tfunctionName: \"submitAnonAadharProof\",\n\t\t\t\t\targs: [\n\t\t\t\t\t\tvalidated.nullifierSeed,\n\t\t\t\t\t\tvalidated.nullifier,\n\t\t\t\t\t\tvalidated.timestamp,\n\t\t\t\t\t\tvalidated.signal,\n\t\t\t\t\t\tvalidated.revealArray,\n\t\t\t\t\t\tvalidated.packedGroth16Proof,\n\t\t\t\t\t],\n\t\t\t\t}),\n\t\t\t}),\n\t\t\t(error) =>\n\t\t\t\tnew ZkkycError(\"Failed to encode submitAnonAadharProof\", {\n\t\t\t\t\tcode: \"ENCODE_ERROR\",\n\t\t\t\t\tcause: error,\n\t\t\t\t}),\n\t\t)(),\n\t);\n}\n\n/** Prepares a zkPassport registration transaction. */\nexport function prepareZkPassportRegister(\n\treputationManagerAddress: Address,\n\tparams: ZkPassportRegisterParams,\n): Result<{ to: Address; data: `0x${string}` }, ZkkycError> {\n\treturn validate(\n\t\tZodZkPassportRegisterParamsSchema,\n\t\tparams,\n\t\t(message, cause, data) =>\n\t\t\tnew ZkkycError(message, { code: \"VALIDATION_ERROR\", cause, context: { params: data } }),\n\t).andThen((validated) =>\n\t\tResult.fromThrowable(\n\t\t\t() => {\n\t\t\t\tconst { proofVerificationData, serviceConfig, committedInputs, version } = validated.params;\n\n\t\t\t\tconst proofVerificationParams = {\n\t\t\t\t\tversion: version as `0x${string}`,\n\t\t\t\t\tproofVerificationData: {\n\t\t\t\t\t\tvkeyHash: proofVerificationData.vkeyHash as `0x${string}`,\n\t\t\t\t\t\tproof: proofVerificationData.proof as `0x${string}`,\n\t\t\t\t\t\tpublicInputs: proofVerificationData.publicInputs as `0x${string}`[],\n\t\t\t\t\t},\n\t\t\t\t\tcommittedInputs: committedInputs as `0x${string}`,\n\t\t\t\t\tserviceConfig: {\n\t\t\t\t\t\tvalidityPeriodInSeconds: BigInt(serviceConfig.validityPeriodInSeconds),\n\t\t\t\t\t\tdomain: serviceConfig.domain,\n\t\t\t\t\t\tscope: serviceConfig.scope,\n\t\t\t\t\t\tdevMode: serviceConfig.devMode,\n\t\t\t\t\t},\n\t\t\t\t};\n\n\t\t\t\treturn {\n\t\t\t\t\tto: reputationManagerAddress,\n\t\t\t\t\tdata: encodeFunctionData({\n\t\t\t\t\t\tabi: ABIS.EXTERNAL.REPUTATION_MANAGER,\n\t\t\t\t\t\tfunctionName: \"zkPassportRegister\",\n\t\t\t\t\t\targs: [proofVerificationParams, validated.isIDCard],\n\t\t\t\t\t}),\n\t\t\t\t};\n\t\t\t},\n\t\t\t(error) =>\n\t\t\t\tnew ZkkycError(\"Failed to encode zkPassportRegister\", {\n\t\t\t\t\tcode: \"ENCODE_ERROR\",\n\t\t\t\t\tcause: error,\n\t\t\t\t}),\n\t\t)(),\n\t);\n}\n","import { z } from \"zod\";\nimport { ZodAddressSchema } from \"../validation\";\n\n// ── Write param schemas ──────────────────────────────────────────────────────\n\nexport const ZodAnonAadharProofParamsSchema = z.object({\n\tnullifierSeed: z.bigint(),\n\tnullifier: z.bigint(),\n\ttimestamp: z.bigint(),\n\tsignal: z.bigint(),\n\trevealArray: z.tuple([z.bigint(), z.bigint(), z.bigint(), z.bigint()]),\n\tpackedGroth16Proof: z.tuple([\n\t\tz.bigint(),\n\t\tz.bigint(),\n\t\tz.bigint(),\n\t\tz.bigint(),\n\t\tz.bigint(),\n\t\tz.bigint(),\n\t\tz.bigint(),\n\t\tz.bigint(),\n\t]),\n});\n\nexport type AnonAadharProofParams = z.infer<typeof ZodAnonAadharProofParamsSchema>;\n\nexport const ZodSocialVerifyParamsSchema = z.object({\n\t_socialName: z.string(),\n\tproofs: z.array(\n\t\tz.object({\n\t\t\tclaimInfo: z.object({\n\t\t\t\tprovider: z.string(),\n\t\t\t\tparameters: z.string(),\n\t\t\t\tcontext: z.string(),\n\t\t\t}),\n\t\t\tsignedClaim: z.object({\n\t\t\t\tclaim: z.object({\n\t\t\t\t\tidentifier: z.string(),\n\t\t\t\t\towner: ZodAddressSchema,\n\t\t\t\t\ttimestampS: z.number(),\n\t\t\t\t\tepoch: z.number(),\n\t\t\t\t}),\n\t\t\t\tsignatures: z.array(z.string()),\n\t\t\t}),\n\t\t}),\n\t),\n});\n\nexport type SocialVerifyParams = z.infer<typeof ZodSocialVerifyParamsSchema>;\n\n// Schema matching SolidityVerifierParameters from @zkpassport/sdk (structural definition)\nexport const ZodSolidityVerifierParametersSchema = z.object({\n\tversion: z.string().refine((val) => val.startsWith(\"0x\"), {\n\t\tmessage: \"Version must be a hex string\",\n\t}),\n\tproofVerificationData: z.object({\n\t\tvkeyHash: z.string().refine((val) => /^0x[a-fA-F0-9]{64}$/.test(val), {\n\t\t\tmessage: \"Invalid bytes32 hex string\",\n\t\t}),\n\t\tproof: z.string().refine((val) => val.startsWith(\"0x\"), {\n\t\t\tmessage: \"Proof must be a hex string\",\n\t\t}),\n\t\tpublicInputs: z.array(\n\t\t\tz.string().refine((val) => /^0x[a-fA-F0-9]{64}$/.test(val), {\n\t\t\t\tmessage: \"Each public input must be a valid bytes32 hex string\",\n\t\t\t}),\n\t\t),\n\t}),\n\tcommittedInputs: z.string().refine((val) => val.startsWith(\"0x\"), {\n\t\tmessage: \"Committed inputs must be a hex string\",\n\t}),\n\tserviceConfig: z.object({\n\t\tvalidityPeriodInSeconds: z.number().int().nonnegative(),\n\t\tdomain: z.string(),\n\t\tscope: z.string(),\n\t\tdevMode: z.boolean(),\n\t}),\n});\n\nexport type SolidityVerifierParameters = z.infer<typeof ZodSolidityVerifierParametersSchema>;\n\nexport const ZodZkPassportRegisterParamsSchema = z.object({\n\tparams: ZodSolidityVerifierParametersSchema,\n\tisIDCard: z.boolean(),\n});\n\nexport type ZkPassportRegisterParams = z.infer<typeof ZodZkPassportRegisterParamsSchema>;\n","import { ResultAsync } from \"neverthrow\";\nimport { type Address, formatUnits, stringToHex } from \"viem\";\nimport { ProfileError } from \"../../profile/errors\";\nimport type { PriceConfigParams, TxLimitsParams } from \"../../profile/validation\";\nimport { ZodPriceConfigParamsSchema, ZodTxLimitsParamsSchema } from \"../../profile/validation\";\nimport type { PublicClientLike } from \"../../types\";\nimport { validate } from \"../../validation\";\nimport { ABIS } from \"../abis\";\n\nexport interface TxLimits {\n\treadonly buyLimit: number;\n\treadonly sellLimit: number;\n}\n\nexport interface RpPerUsdtLimit {\n\treadonly numerator: bigint;\n\treadonly denominator: bigint;\n\t/** The USDC multiplier per RP: denominator / numerator. */\n\treadonly multiplier: number;\n}\n\n/** Reads the buy and sell transaction limits for a given address and currency. */\nexport function getTxLimits(\n\tpublicClient: PublicClientLike,\n\tdiamondAddress: Address,\n\tparams: TxLimitsParams,\n): ResultAsync<TxLimits, ProfileError> {\n\treturn validate(\n\t\tZodTxLimitsParamsSchema,\n\t\tparams,\n\t\t(message, cause, data) =>\n\t\t\tnew ProfileError(message, {\n\t\t\t\tcode: \"VALIDATION_ERROR\",\n\t\t\t\tcause,\n\t\t\t\tcontext: { params: data },\n\t\t\t}),\n\t).asyncAndThen((validated) =>\n\t\tResultAsync.fromPromise(\n\t\t\tpublicClient.readContract({\n\t\t\t\taddress: diamondAddress,\n\t\t\t\tabi: ABIS.FACETS.ORDER_FLOW,\n\t\t\t\tfunctionName: \"userTxLimit\",\n\t\t\t\targs: [validated.address, stringToHex(validated.currency, { size: 32 })],\n\t\t\t}) as Promise<readonly [bigint, bigint]>,\n\t\t\t(error) =>\n\t\t\t\tnew ProfileError(\"Failed to read tx limits\", {\n\t\t\t\t\tcode: \"CONTRACT_READ_ERROR\",\n\t\t\t\t\tcause: error,\n\t\t\t\t\tcontext: { address: validated.address, currency: validated.currency, diamondAddress },\n\t\t\t\t}),\n\t\t).map(([buyLimit, sellLimit]) => ({\n\t\t\tbuyLimit: Number(formatUnits(buyLimit, 6)),\n\t\t\tsellLimit: Number(formatUnits(sellLimit, 6)),\n\t\t})),\n\t);\n}\n/** Reads the RP-to-USDC limit ratio for a given currency from the Diamond contract. */\nexport function getRpPerUsdtLimitRational(\n\tpublicClient: PublicClientLike,\n\tdiamondAddress: Address,\n\tparams: PriceConfigParams,\n): ResultAsync<RpPerUsdtLimit, ProfileError> {\n\treturn validate(\n\t\tZodPriceConfigParamsSchema,\n\t\tparams,\n\t\t(message, cause, data) =>\n\t\t\tnew ProfileError(message, {\n\t\t\t\tcode: \"VALIDATION_ERROR\",\n\t\t\t\tcause,\n\t\t\t\tcontext: { params: data },\n\t\t\t}),\n\t).asyncAndThen((validated) =>\n\t\tResultAsync.fromPromise(\n\t\t\tpublicClient.readContract({\n\t\t\t\taddress: diamondAddress,\n\t\t\t\tabi: ABIS.DIAMOND,\n\t\t\t\tfunctionName: \"getRpPerUsdtLimitRational\",\n\t\t\t\targs: [stringToHex(validated.currency, { size: 32 })],\n\t\t\t}) as Promise<readonly [bigint, bigint]>,\n\t\t\t(error) =>\n\t\t\t\tnew ProfileError(\"Failed to read RP per USDT limit rational\", {\n\t\t\t\t\tcode: \"CONTRACT_READ_ERROR\",\n\t\t\t\t\tcause: error,\n\t\t\t\t\tcontext: { currency: validated.currency, diamondAddress },\n\t\t\t\t}),\n\t\t).map(([numerator, denominator]) => ({\n\t\t\tnumerator,\n\t\t\tdenominator,\n\t\t\tmultiplier: numerator > 0n ? Number(denominator) / Number(numerator) : 0,\n\t\t})),\n\t);\n}\n","import { ResultAsync } from \"neverthrow\";\nimport type { Address } from \"viem\";\nimport { ProfileError } from \"../../profile/errors\";\nimport type { UsdcBalanceParams } from \"../../profile/validation\";\nimport { ZodUsdcBalanceParamsSchema } from \"../../profile/validation\";\nimport type { PublicClientLike } from \"../../types\";\nimport { validate } from \"../../validation\";\nimport { ABIS } from \"../abis\";\n\n/** Reads the USDC balance for a given address. */\nexport function getUsdcBalance(\n\tpublicClient: PublicClientLike,\n\tusdcAddress: Address,\n\tparams: UsdcBalanceParams,\n): ResultAsync<bigint, ProfileError> {\n\treturn validate(\n\t\tZodUsdcBalanceParamsSchema,\n\t\tparams,\n\t\t(message, cause, data) =>\n\t\t\tnew ProfileError(message, {\n\t\t\t\tcode: \"VALIDATION_ERROR\",\n\t\t\t\tcause,\n\t\t\t\tcontext: { params: data },\n\t\t\t}),\n\t).asyncAndThen((validated) =>\n\t\tResultAsync.fromPromise(\n\t\t\tpublicClient.readContract({\n\t\t\t\taddress: usdcAddress,\n\t\t\t\tabi: ABIS.EXTERNAL.USDC,\n\t\t\t\tfunctionName: \"balanceOf\",\n\t\t\t\targs: [validated.address],\n\t\t\t}) as Promise<bigint>,\n\t\t\t(error) =>\n\t\t\t\tnew ProfileError(\"Failed to read USDC balance\", {\n\t\t\t\t\tcode: \"CONTRACT_READ_ERROR\",\n\t\t\t\t\tcause: error,\n\t\t\t\t\tcontext: { address: validated.address, usdcAddress },\n\t\t\t\t}),\n\t\t),\n\t);\n}\n","import { errAsync, okAsync, type ResultAsync } from \"neverthrow\";\nimport { noopLogger } from \"../lib\";\nimport { OrderRoutingError } from \"./errors\";\nimport type { CircleForRouting, Logger } from \"./types\";\n\nconst EPSILON = 0.25;\nconst RECOVERY_SCALE = 0.3;\nconst BOOTSTRAP_MAX_WEIGHT = 25;\nconst MAX_VALIDATION_ATTEMPTS = 3;\n\nexport function circleWeight(c: CircleForRouting): number {\n\tconst score = c.metrics.circleScore;\n\tif (c.metrics.circleStatus === \"paused\") {\n\t\treturn score * RECOVERY_SCALE;\n\t}\n\tif (c.metrics.circleStatus === \"bootstrap\") {\n\t\treturn Math.min(score, BOOTSTRAP_MAX_WEIGHT);\n\t}\n\treturn score;\n}\n\nexport function filterEligibleCircles(\n\tcircles: readonly CircleForRouting[],\n\torderCurrency: string,\n): CircleForRouting[] {\n\treturn circles.filter((c) => c.currency.toLowerCase() === orderCurrency.toLowerCase());\n}\n\nfunction weightedRandomChoice<T>(arr: readonly T[], weights: readonly number[]): T {\n\tconst totalWeight = weights.reduce((sum, w) => sum + w, 0);\n\n\tif (totalWeight === 0) {\n\t\treturn arr[Math.floor(Math.random() * arr.length)];\n\t}\n\n\tlet rand = Math.random() * totalWeight;\n\tfor (let i = 0; i < arr.length; i++) {\n\t\trand -= weights[i];\n\t\tif (rand <= 0) {\n\t\t\treturn arr[i];\n\t\t}\n\t}\n\treturn arr[arr.length - 1];\n}\n\nexport function selectCircle(eligible: readonly CircleForRouting[]): CircleForRouting | null {\n\tif (eligible.length === 0) {\n\t\treturn null;\n\t}\n\n\tconst activeCircles = eligible.filter((c) => c.metrics.circleStatus === \"active\");\n\n\tconst isExplore = Math.random() < EPSILON;\n\n\tif (isExplore) {\n\t\t// Explore: all eligible circles with status-aware weights\n\t\tconst weights = eligible.map(circleWeight);\n\t\treturn weightedRandomChoice(eligible, weights);\n\t}\n\n\t// Exploit: only active circles, weighted by score\n\tif (activeCircles.length === 0) {\n\t\t// Fallback: no active circles, pick from all eligible with status-aware weights\n\t\tconst weights = eligible.map(circleWeight);\n\t\treturn weightedRandomChoice(eligible, weights);\n\t}\n\n\tconst weights = activeCircles.map((c) => c.metrics.circleScore);\n\treturn weightedRandomChoice(activeCircles, weights);\n}\n\nexport function selectCircleForOrderAsync(\n\tcircles: readonly CircleForRouting[],\n\torderCurrency: string,\n\tvalidateCircle: (circleId: bigint) => ResultAsync<boolean, unknown>,\n\tlogger: Logger = noopLogger,\n): ResultAsync<bigint, OrderRoutingError> {\n\tconst eligible = filterEligibleCircles(circles, orderCurrency);\n\tlet remaining = [...eligible];\n\n\tlogger.debug(\"filtering eligible circles\", {\n\t\ttotal: circles.length,\n\t\teligible: eligible.length,\n\t\tcurrency: orderCurrency,\n\t\tcircles: eligible,\n\t});\n\n\tif (eligible.length === 0) {\n\t\tlogger.warn(\"no eligible circles found for currency\", { currency: orderCurrency });\n\t}\n\n\tfunction attempt(attemptsLeft: number): ResultAsync<bigint, OrderRoutingError> {\n\t\tif (attemptsLeft <= 0 || remaining.length === 0) {\n\t\t\tlogger.warn(\"exhausted all attempts or circles\", {\n\t\t\t\tattemptsLeft,\n\t\t\t\tremainingCircles: remaining.length,\n\t\t\t});\n\t\t\treturn errAsync(\n\t\t\t\tnew OrderRoutingError(\"No eligible circles found\", {\n\t\t\t\t\tcode: \"NO_ELIGIBLE_CIRCLES\",\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\n\t\tconst selected = selectCircle(remaining);\n\t\tif (!selected) {\n\t\t\treturn errAsync(\n\t\t\t\tnew OrderRoutingError(\"No eligible circles found\", {\n\t\t\t\t\tcode: \"NO_ELIGIBLE_CIRCLES\",\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\n\t\tconst circleId = BigInt(selected.circleId);\n\n\t\tlogger.debug(\"selected circle, validating on-chain\", {\n\t\t\tcircleId: String(circleId),\n\t\t\tstatus: selected.metrics.circleStatus,\n\t\t\tscore: selected.metrics.circleScore,\n\t\t\tattemptsLeft,\n\t\t});\n\n\t\treturn validateCircle(circleId)\n\t\t\t.orElse((error) => {\n\t\t\t\tlogger.warn(\"validation errored, treating as ineligible\", {\n\t\t\t\t\tcircleId: String(circleId),\n\t\t\t\t\terror: String(error),\n\t\t\t\t});\n\t\t\t\treturn okAsync(false);\n\t\t\t})\n\t\t\t.andThen((isValid) => {\n\t\t\t\tif (isValid) {\n\t\t\t\t\tlogger.info(\"circle validated successfully\", { circleId: String(circleId) });\n\t\t\t\t\treturn okAsync(circleId);\n\t\t\t\t}\n\t\t\t\tlogger.debug(\"circle failed validation, retrying\", {\n\t\t\t\t\tcircleId: String(circleId),\n\t\t\t\t\tremainingCircles: remaining.length - 1,\n\t\t\t\t});\n\t\t\t\tremaining = remaining.filter((c) => c.circleId !== selected.circleId);\n\t\t\t\treturn attempt(attemptsLeft - 1);\n\t\t\t});\n\t}\n\n\treturn attempt(MAX_VALIDATION_ATTEMPTS);\n}\n","import { ResultAsync } from \"neverthrow\";\nimport { sleep } from \"../../lib\";\nimport { OrderRoutingError } from \"../errors\";\n\n/** Abort the fetch if the subgraph doesn't respond within 10 seconds. */\nconst DEFAULT_TIMEOUT_MS = 10_000;\n/** Retry up to 3 times after a transient failure (timeout or network error) before giving up. */\nconst MAX_RETRIES = 3;\n/** Wait 500ms before the first retry; scales linearly (500ms × attempt) on subsequent retries. */\nconst BACKOFF_MS = 500;\n\nexport interface SubgraphQueryParams {\n\treadonly query: string;\n\treadonly variables?: Record<string, unknown>;\n\t/** Fetch timeout in milliseconds. Defaults to 10 000. */\n\treadonly timeoutMs?: number;\n}\n\n/** Returns true for errors worth retrying (network failures, timeouts). */\nfunction isTransient(error: unknown): boolean {\n\tif (error instanceof OrderRoutingError) return false;\n\tif (error instanceof DOMException && error.name === \"AbortError\") return true;\n\tif (error instanceof TypeError) return true; // fetch network error\n\treturn false;\n}\n\nexport function querySubgraph(\n\turl: string,\n\tparams: SubgraphQueryParams,\n): ResultAsync<unknown, OrderRoutingError> {\n\tconst timeoutMs = params.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n\tconst fetchOnce = async () => {\n\t\tconst controller = new AbortController();\n\t\tconst timer = setTimeout(() => controller.abort(), timeoutMs);\n\n\t\ttry {\n\t\t\tconst response = await fetch(url, {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\theaders: { \"Content-Type\": \"application/json\" },\n\t\t\t\tbody: JSON.stringify({\n\t\t\t\t\tquery: params.query,\n\t\t\t\t\tvariables: params.variables,\n\t\t\t\t}),\n\t\t\t\tsignal: controller.signal,\n\t\t\t});\n\n\t\t\tif (!response.ok) {\n\t\t\t\tthrow new OrderRoutingError(`Subgraph request failed (status: ${response.status})`, {\n\t\t\t\t\tcode: \"SUBGRAPH_ERROR\",\n\t\t\t\t\tcause: response,\n\t\t\t\t\tcontext: { status: response.status },\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst json = await response.json();\n\n\t\t\tif (json.errors?.length > 0) {\n\t\t\t\tthrow new OrderRoutingError(\"Subgraph returned GraphQL errors\", {\n\t\t\t\t\tcode: \"SUBGRAPH_ERROR\",\n\t\t\t\t\tcause: json.errors,\n\t\t\t\t\tcontext: { errors: json.errors },\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (!json.data) {\n\t\t\t\tthrow new OrderRoutingError(\"Subgraph returned no data\", {\n\t\t\t\t\tcode: \"SUBGRAPH_ERROR\",\n\t\t\t\t\tcause: \"Missing data field in GraphQL response\",\n\t\t\t\t\tcontext: { response: json },\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn json.data;\n\t\t} finally {\n\t\t\tclearTimeout(timer);\n\t\t}\n\t};\n\n\tconst fetchWithRetry = async () => {\n\t\tfor (let attempt = 0; attempt <= MAX_RETRIES; attempt++) {\n\t\t\ttry {\n\t\t\t\treturn await fetchOnce();\n\t\t\t} catch (error) {\n\t\t\t\tconst lastAttempt = attempt === MAX_RETRIES;\n\t\t\t\tif (lastAttempt || !isTransient(error)) throw error;\n\t\t\t\tawait sleep(BACKOFF_MS * (attempt + 1));\n\t\t\t}\n\t\t}\n\t\t// Unreachable — the loop always returns or throws\n\t\tthrow new OrderRoutingError(\"Subgraph query exhausted retries\", {\n\t\t\tcode: \"SUBGRAPH_ERROR\",\n\t\t});\n\t};\n\n\treturn ResultAsync.fromPromise(fetchWithRetry(), (error) =>\n\t\terror instanceof OrderRoutingError\n\t\t\t? error\n\t\t\t: new OrderRoutingError(\"Subgraph query failed\", {\n\t\t\t\t\tcode: \"SUBGRAPH_ERROR\",\n\t\t\t\t\tcause: error,\n\t\t\t\t}),\n\t);\n}\n","export const CIRCLES_FOR_ROUTING_QUERY = /* GraphQL */ `\n query CirclesForRouting($currency: Bytes!) {\n circles(\n first: 1000\n where: {\n currency: $currency\n metrics_: {\n circleStatus_in: [\"active\", \"bootstrap\", \"paused\"]\n }\n }\n ) {\n circleId\n currency\n metrics {\n circleScore\n circleStatus\n scoreState {\n activeMerchantsCount\n }\n }\n }\n }\n`;\n","import { noopLogger } from \"../../lib\";\nimport { validate } from \"../../validation\";\nimport { OrderRoutingError } from \"../errors\";\nimport type { Logger } from \"../types\";\nimport { ZodCirclesForRoutingResponseSchema } from \"../validation\";\nimport { querySubgraph } from \"./client\";\nimport { CIRCLES_FOR_ROUTING_QUERY } from \"./queries\";\n\nexport function getCirclesForRouting(\n\tsubgraphUrl: string,\n\tcurrency: string,\n\tlogger: Logger = noopLogger,\n) {\n\tlogger.debug(\"fetching circles from subgraph\", { subgraphUrl, currency });\n\n\treturn querySubgraph(subgraphUrl, {\n\t\tquery: CIRCLES_FOR_ROUTING_QUERY,\n\t\tvariables: { currency },\n\t}).andThen((data) =>\n\t\tvalidate(\n\t\t\tZodCirclesForRoutingResponseSchema,\n\t\t\tdata,\n\t\t\t(message, cause, d) =>\n\t\t\t\tnew OrderRoutingError(message, { code: \"VALIDATION_ERROR\", cause, context: { data: d } }),\n\t\t).map((validated) => {\n\t\t\tconst circles = validated.circles.filter(\n\t\t\t\t(item) => Number(item.metrics.scoreState.activeMerchantsCount) > 0,\n\t\t\t);\n\t\t\tlogger.info(\"fetched circles from subgraph\", {\n\t\t\t\ttotal: validated.circles.length,\n\t\t\t\twithActiveMerchants: circles.length,\n\t\t\t\tcircles,\n\t\t\t});\n\t\t\treturn circles;\n\t\t}),\n\t);\n}\n\nexport { querySubgraph } from \"./client\";\nexport { CIRCLES_FOR_ROUTING_QUERY } from \"./queries\";\n"],"mappings":"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","names":["import_viem","import_neverthrow","import_viem","import_zod","import_neverthrow","import_viem","import_zod","import_neverthrow","import_viem","import_zod","import_neverthrow","import_viem","import_neverthrow","import_neverthrow","weights","import_neverthrow"]}
|
|
1
|
+
{"version":3,"sources":["../src/order-routing/index.ts","../src/order-routing/client.ts","../src/contracts/abis/index.ts","../src/contracts/abis/order-flow-facet.ts","../src/contracts/abis/p2p-config-facet.ts","../src/contracts/abis/reputation-manager.ts","../src/contracts/order-flow/index.ts","../src/lib/logger.ts","../src/lib/sleep.ts","../src/validation/errors.ts","../src/validation/schemas.ts","../src/order-routing/errors.ts","../src/order-routing/validation.ts","../src/contracts/p2p-config/index.ts","../src/profile/validation.ts","../src/contracts/reputation-manager/writes.ts","../src/zkkyc/validation.ts","../src/contracts/tx-limits/index.ts","../src/contracts/usdc/index.ts","../src/order-routing/routing.ts","../src/order-routing/subgraph/client.ts","../src/order-routing/subgraph/queries.ts","../src/order-routing/subgraph/index.ts"],"sourcesContent":["// ── Main entry point ────────────────────────────────────────────────────\n\nexport { createOrderRouter, type OrderRouter } from \"./client\";\n\n// ── Types ───────────────────────────────────────────────────────────────\n\nexport type { OrderRoutingConfig, SelectCircleParams } from \"./types\";\n\n// ── Errors ──────────────────────────────────────────────────────────────\n\nexport { OrderRoutingError, type OrderRoutingErrorCode } from \"./errors\";\n","import type { ResultAsync } from \"neverthrow\";\nimport { stringToHex } from \"viem\";\nimport { checkCircleEligibility } from \"../contracts\";\nimport { noopLogger } from \"../lib\";\nimport type { OrderRoutingError } from \"./errors\";\nimport { selectCircleForOrderAsync } from \"./routing\";\nimport { getCirclesForRouting } from \"./subgraph\";\nimport type { Logger, OrderRoutingConfig, SelectCircleParams } from \"./types\";\n\nexport interface OrderRouter {\n\t/**\n\t * Full flow: fetch circles from subgraph → epsilon-greedy selection →\n\t * on-chain eligibility validation → return circleId.\n\t */\n\tselectCircle(params: SelectCircleParams): ResultAsync<bigint, OrderRoutingError>;\n}\n\nexport function createOrderRouter(config: OrderRoutingConfig): OrderRouter {\n\tconst { subgraphUrl, publicClient, contractAddress } = config;\n\tconst logger: Logger = config.logger ?? noopLogger;\n\n\treturn {\n\t\tselectCircle(params: SelectCircleParams) {\n\t\t\tconst currencyHex = stringToHex(params.currency, { size: 32 });\n\n\t\t\tlogger.info(\"selectCircle started\", {\n\t\t\t\tcurrency: params.currency,\n\t\t\t\tuser: params.user,\n\t\t\t\torderType: String(params.orderType),\n\t\t\t});\n\n\t\t\treturn getCirclesForRouting(subgraphUrl, currencyHex, logger).andThen((circles) =>\n\t\t\t\tselectCircleForOrderAsync(\n\t\t\t\t\tcircles,\n\t\t\t\t\tcurrencyHex,\n\t\t\t\t\t(circleId) =>\n\t\t\t\t\t\tcheckCircleEligibility(\n\t\t\t\t\t\t\tpublicClient,\n\t\t\t\t\t\t\tcontractAddress,\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tcircleId,\n\t\t\t\t\t\t\t\tcurrency: currencyHex,\n\t\t\t\t\t\t\t\tuser: params.user,\n\t\t\t\t\t\t\t\tusdtAmount: params.usdtAmount,\n\t\t\t\t\t\t\t\tfiatAmount: params.fiatAmount,\n\t\t\t\t\t\t\t\torderType: params.orderType,\n\t\t\t\t\t\t\t\tpreferredPCConfigId: params.preferredPCConfigId,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tlogger,\n\t\t\t\t\t\t),\n\t\t\t\t\tlogger,\n\t\t\t\t),\n\t\t\t);\n\t\t},\n\t};\n}\n","import { erc20Abi } from \"viem\";\nimport { orderFlowFacetAbi } from \"./order-flow-facet\";\nimport { p2pConfigFacetAbi } from \"./p2p-config-facet\";\nimport { reputationManagerAbi } from \"./reputation-manager\";\n\nconst DIAMOND_ABI = [...orderFlowFacetAbi, ...p2pConfigFacetAbi] as const;\n\nexport const ABIS = {\n\tDIAMOND: DIAMOND_ABI,\n\tFACETS: {\n\t\tORDER_FLOW: orderFlowFacetAbi,\n\t\tCONFIG: p2pConfigFacetAbi,\n\t},\n\tEXTERNAL: {\n\t\tUSDC: erc20Abi,\n\t\tREPUTATION_MANAGER: reputationManagerAbi,\n\t},\n} as const;\n","export const orderFlowFacetAbi = [\n\t{\n\t\tinputs: [\n\t\t\t{ internalType: \"uint256\", name: \"circleId\", type: \"uint256\" },\n\t\t\t{ internalType: \"uint256\", name: \"assignUpto\", type: \"uint256\" },\n\t\t\t{ internalType: \"bytes32\", name: \"currency\", type: \"bytes32\" },\n\t\t\t{ internalType: \"address\", name: \"user\", type: \"address\" },\n\t\t\t{ internalType: \"uint256\", name: \"usdtAmount\", type: \"uint256\" },\n\t\t\t{ internalType: \"uint256\", name: \"fiatAmount\", type: \"uint256\" },\n\t\t\t{ internalType: \"int256\", name: \"orderType\", type: \"int256\" },\n\t\t\t{ internalType: \"uint256\", name: \"preferredPCConfigId\", type: \"uint256\" },\n\t\t],\n\t\tname: \"getAssignableMerchantsFromCircle\",\n\t\toutputs: [{ internalType: \"address[]\", name: \"\", type: \"address[]\" }],\n\t\tstateMutability: \"view\",\n\t\ttype: \"function\",\n\t},\n\t{\n\t\tinputs: [\n\t\t\t{ internalType: \"address\", name: \"_user\", type: \"address\" },\n\t\t\t{ internalType: \"bytes32\", name: \"_nativeCurrency\", type: \"bytes32\" },\n\t\t],\n\t\tname: \"userTxLimit\",\n\t\toutputs: [\n\t\t\t{ internalType: \"uint256\", name: \"\", type: \"uint256\" },\n\t\t\t{ internalType: \"uint256\", name: \"\", type: \"uint256\" },\n\t\t],\n\t\tstateMutability: \"view\",\n\t\ttype: \"function\",\n\t},\n] as const;\n","export const p2pConfigFacetAbi = [\n\t{\n\t\tinputs: [\n\t\t\t{\n\t\t\t\tinternalType: \"bytes32\",\n\t\t\t\tname: \"_currency\",\n\t\t\t\ttype: \"bytes32\",\n\t\t\t},\n\t\t],\n\t\tname: \"getPriceConfig\",\n\t\toutputs: [\n\t\t\t{\n\t\t\t\tcomponents: [\n\t\t\t\t\t{\n\t\t\t\t\t\tinternalType: \"uint256\",\n\t\t\t\t\t\tname: \"buyPrice\",\n\t\t\t\t\t\ttype: \"uint256\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tinternalType: \"uint256\",\n\t\t\t\t\t\tname: \"sellPrice\",\n\t\t\t\t\t\ttype: \"uint256\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tinternalType: \"int256\",\n\t\t\t\t\t\tname: \"buyPriceOffset\",\n\t\t\t\t\t\ttype: \"int256\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tinternalType: \"uint256\",\n\t\t\t\t\t\tname: \"baseSpread\",\n\t\t\t\t\t\ttype: \"uint256\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tinternalType: \"struct P2pConfigStorage.PriceConfig\",\n\t\t\t\tname: \"\",\n\t\t\t\ttype: \"tuple\",\n\t\t\t},\n\t\t],\n\t\tstateMutability: \"view\",\n\t\ttype: \"function\",\n\t},\n\t{\n\t\tinputs: [\n\t\t\t{\n\t\t\t\tinternalType: \"bytes32\",\n\t\t\t\tname: \"_nativeCurrency\",\n\t\t\t\ttype: \"bytes32\",\n\t\t\t},\n\t\t],\n\t\tname: \"getRpPerUsdtLimitRational\",\n\t\toutputs: [\n\t\t\t{\n\t\t\t\tinternalType: \"uint256\",\n\t\t\t\tname: \"numerator\",\n\t\t\t\ttype: \"uint256\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tinternalType: \"uint256\",\n\t\t\t\tname: \"denominator\",\n\t\t\t\ttype: \"uint256\",\n\t\t\t},\n\t\t],\n\t\tstateMutability: \"view\",\n\t\ttype: \"function\",\n\t},\n] as const;\n","export const reputationManagerAbi = [\n\t{\n\t\tinputs: [\n\t\t\t{\n\t\t\t\tinternalType: \"string\",\n\t\t\t\tname: \"_socialName\",\n\t\t\t\ttype: \"string\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tcomponents: [\n\t\t\t\t\t{\n\t\t\t\t\t\tcomponents: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tinternalType: \"string\",\n\t\t\t\t\t\t\t\tname: \"provider\",\n\t\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tinternalType: \"string\",\n\t\t\t\t\t\t\t\tname: \"parameters\",\n\t\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tinternalType: \"string\",\n\t\t\t\t\t\t\t\tname: \"context\",\n\t\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t\tinternalType: \"struct IReclaimSDK.ClaimInfo\",\n\t\t\t\t\t\tname: \"claimInfo\",\n\t\t\t\t\t\ttype: \"tuple\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tcomponents: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tcomponents: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tinternalType: \"bytes32\",\n\t\t\t\t\t\t\t\t\t\tname: \"identifier\",\n\t\t\t\t\t\t\t\t\t\ttype: \"bytes32\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tinternalType: \"address\",\n\t\t\t\t\t\t\t\t\t\tname: \"owner\",\n\t\t\t\t\t\t\t\t\t\ttype: \"address\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tinternalType: \"uint32\",\n\t\t\t\t\t\t\t\t\t\tname: \"timestampS\",\n\t\t\t\t\t\t\t\t\t\ttype: \"uint32\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tinternalType: \"uint32\",\n\t\t\t\t\t\t\t\t\t\tname: \"epoch\",\n\t\t\t\t\t\t\t\t\t\ttype: \"uint32\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\tinternalType: \"struct IReclaimSDK.CompleteClaimData\",\n\t\t\t\t\t\t\t\tname: \"claim\",\n\t\t\t\t\t\t\t\ttype: \"tuple\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tinternalType: \"bytes[]\",\n\t\t\t\t\t\t\t\tname: \"signatures\",\n\t\t\t\t\t\t\t\ttype: \"bytes[]\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t\tinternalType: \"struct IReclaimSDK.SignedClaim\",\n\t\t\t\t\t\tname: \"signedClaim\",\n\t\t\t\t\t\ttype: \"tuple\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tinternalType: \"struct IReclaimSDK.Proof[]\",\n\t\t\t\tname: \"proofs\",\n\t\t\t\ttype: \"tuple[]\",\n\t\t\t},\n\t\t],\n\t\tname: \"socialVerify\",\n\t\toutputs: [],\n\t\tstateMutability: \"nonpayable\",\n\t\ttype: \"function\",\n\t},\n\t{\n\t\tinputs: [\n\t\t\t{\n\t\t\t\tinternalType: \"uint256\",\n\t\t\t\tname: \"nullifierSeed\",\n\t\t\t\ttype: \"uint256\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tinternalType: \"uint256\",\n\t\t\t\tname: \"nullifier\",\n\t\t\t\ttype: \"uint256\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tinternalType: \"uint256\",\n\t\t\t\tname: \"timestamp\",\n\t\t\t\ttype: \"uint256\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tinternalType: \"uint256\",\n\t\t\t\tname: \"signal\",\n\t\t\t\ttype: \"uint256\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tinternalType: \"uint256[4]\",\n\t\t\t\tname: \"revealArray\",\n\t\t\t\ttype: \"uint256[4]\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tinternalType: \"uint256[8]\",\n\t\t\t\tname: \"groth16Proof\",\n\t\t\t\ttype: \"uint256[8]\",\n\t\t\t},\n\t\t],\n\t\tname: \"submitAnonAadharProof\",\n\t\toutputs: [],\n\t\tstateMutability: \"nonpayable\",\n\t\ttype: \"function\",\n\t},\n\t{\n\t\tinputs: [\n\t\t\t{\n\t\t\t\tcomponents: [\n\t\t\t\t\t{\n\t\t\t\t\t\tinternalType: \"bytes32\",\n\t\t\t\t\t\tname: \"version\",\n\t\t\t\t\t\ttype: \"bytes32\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tcomponents: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tinternalType: \"bytes32\",\n\t\t\t\t\t\t\t\tname: \"vkeyHash\",\n\t\t\t\t\t\t\t\ttype: \"bytes32\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tinternalType: \"bytes\",\n\t\t\t\t\t\t\t\tname: \"proof\",\n\t\t\t\t\t\t\t\ttype: \"bytes\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tinternalType: \"bytes32[]\",\n\t\t\t\t\t\t\t\tname: \"publicInputs\",\n\t\t\t\t\t\t\t\ttype: \"bytes32[]\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t\tinternalType: \"struct ProofVerificationData\",\n\t\t\t\t\t\tname: \"proofVerificationData\",\n\t\t\t\t\t\ttype: \"tuple\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tinternalType: \"bytes\",\n\t\t\t\t\t\tname: \"committedInputs\",\n\t\t\t\t\t\ttype: \"bytes\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tcomponents: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tinternalType: \"uint256\",\n\t\t\t\t\t\t\t\tname: \"validityPeriodInSeconds\",\n\t\t\t\t\t\t\t\ttype: \"uint256\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tinternalType: \"string\",\n\t\t\t\t\t\t\t\tname: \"domain\",\n\t\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tinternalType: \"string\",\n\t\t\t\t\t\t\t\tname: \"scope\",\n\t\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tinternalType: \"bool\",\n\t\t\t\t\t\t\t\tname: \"devMode\",\n\t\t\t\t\t\t\t\ttype: \"bool\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t\tinternalType: \"struct ServiceConfig\",\n\t\t\t\t\t\tname: \"serviceConfig\",\n\t\t\t\t\t\ttype: \"tuple\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tinternalType: \"struct ProofVerificationParams\",\n\t\t\t\tname: \"params\",\n\t\t\t\ttype: \"tuple\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tinternalType: \"bool\",\n\t\t\t\tname: \"isIDCard\",\n\t\t\t\ttype: \"bool\",\n\t\t\t},\n\t\t],\n\t\tname: \"zkPassportRegister\",\n\t\toutputs: [],\n\t\tstateMutability: \"nonpayable\",\n\t\ttype: \"function\",\n\t},\n] as const;\n","import { ResultAsync } from \"neverthrow\";\nimport type { Address } from \"viem\";\nimport { noopLogger } from \"../../lib\";\nimport { OrderRoutingError } from \"../../order-routing/errors\";\nimport type { CheckCircleEligibilityParams, Logger } from \"../../order-routing/types\";\nimport { ZodCheckCircleEligibilityParamsSchema } from \"../../order-routing/validation\";\nimport type { PublicClientLike } from \"../../types\";\nimport { validate } from \"../../validation\";\nimport { ABIS } from \"../abis\";\n\n/** Checks on-chain eligibility for a given circle by reading assignable merchants. */\nexport function checkCircleEligibility(\n\tpublicClient: PublicClientLike,\n\tcontractAddress: Address,\n\tparams: CheckCircleEligibilityParams,\n\tlogger: Logger = noopLogger,\n): ResultAsync<boolean, OrderRoutingError> {\n\treturn validate(\n\t\tZodCheckCircleEligibilityParamsSchema,\n\t\tparams,\n\t\t(message, cause, d) =>\n\t\t\tnew OrderRoutingError(message, { code: \"VALIDATION_ERROR\", cause, context: { data: d } }),\n\t)\n\t\t.asyncAndThen((validated) => {\n\t\t\tlogger.debug(\"checking on-chain eligibility\", {\n\t\t\t\tcircleId: String(validated.circleId),\n\t\t\t\tcontractAddress,\n\t\t\t});\n\n\t\t\treturn ResultAsync.fromPromise(\n\t\t\t\tpublicClient.readContract({\n\t\t\t\t\taddress: contractAddress,\n\t\t\t\t\tabi: ABIS.FACETS.ORDER_FLOW,\n\t\t\t\t\tfunctionName: \"getAssignableMerchantsFromCircle\",\n\t\t\t\t\targs: [\n\t\t\t\t\t\tvalidated.circleId,\n\t\t\t\t\t\t1n,\n\t\t\t\t\t\tvalidated.currency,\n\t\t\t\t\t\tvalidated.user as Address,\n\t\t\t\t\t\tvalidated.usdtAmount,\n\t\t\t\t\t\tvalidated.fiatAmount,\n\t\t\t\t\t\tvalidated.orderType,\n\t\t\t\t\t\tvalidated.preferredPCConfigId,\n\t\t\t\t\t],\n\t\t\t\t}),\n\t\t\t\t(error) =>\n\t\t\t\t\tnew OrderRoutingError(\"Eligibility check failed\", {\n\t\t\t\t\t\tcode: \"CONTRACT_READ_ERROR\",\n\t\t\t\t\t\tcause: error,\n\t\t\t\t\t\tcontext: { circleId: String(params.circleId) },\n\t\t\t\t\t}),\n\t\t\t);\n\t\t})\n\t\t.map((merchants) => {\n\t\t\tconst arr = merchants as readonly Address[];\n\t\t\tconst eligible = arr.length >= 1;\n\t\t\tlogger.debug(\"eligibility check result\", {\n\t\t\t\tcircleId: String(params.circleId),\n\t\t\t\tassignableMerchants: arr.length,\n\t\t\t\teligible,\n\t\t\t});\n\t\t\treturn eligible;\n\t\t});\n}\n","export interface Logger {\n\tdebug(message: string, data?: Record<string, unknown>): void;\n\tinfo(message: string, data?: Record<string, unknown>): void;\n\twarn(message: string, data?: Record<string, unknown>): void;\n\terror(message: string, data?: Record<string, unknown>): void;\n}\n\nconst noop = () => {};\n\nexport const noopLogger: Logger = {\n\tdebug: noop,\n\tinfo: noop,\n\twarn: noop,\n\terror: noop,\n};\n","/** Returns a promise that resolves after the given number of milliseconds. */\nexport function sleep(ms: number): Promise<void> {\n\treturn new Promise((resolve) => setTimeout(resolve, ms));\n}\n","export class SdkError<TCode extends string = string> extends Error {\n\treadonly code: TCode;\n\treadonly cause?: unknown;\n\treadonly context?: Record<string, unknown>;\n\n\tconstructor(\n\t\tmessage: string,\n\t\toptions: {\n\t\t\tcode: TCode;\n\t\t\tcause?: unknown;\n\t\t\tcontext?: Record<string, unknown>;\n\t\t},\n\t) {\n\t\tsuper(message);\n\t\tthis.name = \"SdkError\";\n\t\tthis.code = options.code;\n\t\tthis.cause = options.cause;\n\t\tthis.context = options.context;\n\t}\n}\n","import { err, ok, type Result } from \"neverthrow\";\nimport { isAddress } from \"viem\";\nimport { z } from \"zod\";\n\nexport const ZodAddressSchema = z\n\t.string()\n\t.refine((s) => isAddress(s), { message: \"Invalid Ethereum address\" });\n\nexport const ZodCurrencySchema = z.enum([\n\t\"IDR\",\n\t\"INR\",\n\t\"BRL\",\n\t\"ARS\",\n\t\"MEX\",\n\t\"VEN\",\n\t\"EUR\",\n\t\"NGN\",\n\t\"USD\",\n\t\"COP\",\n]);\n\nexport type CurrencyType = z.infer<typeof ZodCurrencySchema>;\n\nexport function validate<S extends z.ZodType, E>(\n\tschema: S,\n\tdata: unknown,\n\ttoError: (message: string, cause: unknown, data: unknown) => E,\n): Result<z.infer<S>, E> {\n\tconst result = schema.safeParse(data);\n\tif (result.success) {\n\t\treturn ok(result.data as z.infer<S>);\n\t}\n\treturn err(toError(z.prettifyError(result.error), result.error, data));\n}\n","import { SdkError } from \"../validation\";\n\nexport type OrderRoutingErrorCode =\n\t| \"NO_ELIGIBLE_CIRCLES\"\n\t| \"SUBGRAPH_ERROR\"\n\t| \"SUBGRAPH_NOT_CONFIGURED\"\n\t| \"VALIDATION_ERROR\"\n\t| \"CONTRACT_READ_ERROR\";\n\nexport class OrderRoutingError extends SdkError<OrderRoutingErrorCode> {\n\tconstructor(\n\t\tmessage: string,\n\t\toptions: {\n\t\t\tcode: OrderRoutingErrorCode;\n\t\t\tcause?: unknown;\n\t\t\tcontext?: Record<string, unknown>;\n\t\t},\n\t) {\n\t\tsuper(message, options);\n\t\tthis.name = \"OrderRoutingError\";\n\t}\n}\n","import { z } from \"zod\";\nimport { ZodAddressSchema } from \"../validation/schemas\";\n\n// ── Circle schemas ──────────────────────────────────────────────────────\n\nexport const ZodCircleScoreStateSchema = z.object({\n\tactiveMerchantsCount: z.coerce.number(),\n});\n\nexport const ZodCircleMetricsForRoutingSchema = z.object({\n\tcircleScore: z.coerce.number(),\n\tcircleStatus: z.string(),\n\tscoreState: ZodCircleScoreStateSchema,\n});\n\nexport const ZodCircleForRoutingSchema = z.object({\n\tcircleId: z.string(),\n\tcurrency: z.string(),\n\tmetrics: ZodCircleMetricsForRoutingSchema,\n});\n\nexport const ZodCirclesForRoutingResponseSchema = z.object({\n\tcircles: z.array(ZodCircleForRoutingSchema),\n});\n\n// ── Eligibility check schema ────────────────────────────────────────────\n\nexport const ZodCheckCircleEligibilityParamsSchema = z.object({\n\tcircleId: z.bigint(),\n\tcurrency: z.string(),\n\tuser: ZodAddressSchema,\n\tusdtAmount: z.bigint(),\n\tfiatAmount: z.bigint(),\n\torderType: z.bigint(),\n\tpreferredPCConfigId: z.bigint(),\n});\n\n// ── Select circle schema ────────────────────────────────────────────────\n\nexport const ZodSelectCircleParamsSchema = z.object({\n\tcurrency: z.string().min(1),\n\tuser: ZodAddressSchema,\n\tusdtAmount: z.bigint(),\n\tfiatAmount: z.bigint(),\n\torderType: z.bigint(),\n\tpreferredPCConfigId: z.bigint(),\n});\n","import { ResultAsync } from \"neverthrow\";\nimport { type Address, stringToHex } from \"viem\";\nimport { ProfileError } from \"../../profile/errors\";\nimport type { PriceConfig } from \"../../profile/types\";\nimport type { PriceConfigParams } from \"../../profile/validation\";\nimport { ZodPriceConfigParamsSchema } from \"../../profile/validation\";\nimport type { PublicClientLike } from \"../../types\";\nimport { validate } from \"../../validation\";\nimport { ABIS } from \"../abis\";\n\n/** Reads the price config (buy/sell prices) for a given currency. */\nexport function getPriceConfig(\n\tpublicClient: PublicClientLike,\n\tdiamondAddress: Address,\n\tparams: PriceConfigParams,\n): ResultAsync<PriceConfig, ProfileError> {\n\treturn validate(\n\t\tZodPriceConfigParamsSchema,\n\t\tparams,\n\t\t(message, cause, data) =>\n\t\t\tnew ProfileError(message, {\n\t\t\t\tcode: \"VALIDATION_ERROR\",\n\t\t\t\tcause,\n\t\t\t\tcontext: { params: data },\n\t\t\t}),\n\t).asyncAndThen((validated) =>\n\t\tResultAsync.fromPromise(\n\t\t\tpublicClient.readContract({\n\t\t\t\taddress: diamondAddress,\n\t\t\t\tabi: ABIS.FACETS.CONFIG,\n\t\t\t\tfunctionName: \"getPriceConfig\",\n\t\t\t\targs: [stringToHex(validated.currency, { size: 32 })],\n\t\t\t}) as Promise<PriceConfig>,\n\t\t\t(error) =>\n\t\t\t\tnew ProfileError(\"Failed to read price config\", {\n\t\t\t\t\tcode: \"CONTRACT_READ_ERROR\",\n\t\t\t\t\tcause: error,\n\t\t\t\t\tcontext: { currency: validated.currency, diamondAddress },\n\t\t\t\t}),\n\t\t),\n\t);\n}\n","import { z } from \"zod\";\nimport { ZodAddressSchema, ZodCurrencySchema } from \"../validation/schemas\";\n\nexport const ZodUsdcBalanceParamsSchema = z.object({\n\taddress: ZodAddressSchema,\n});\n\nexport type UsdcBalanceParams = z.infer<typeof ZodUsdcBalanceParamsSchema>;\n\nexport const ZodGetBalancesParamsSchema = z.object({\n\taddress: ZodAddressSchema,\n\tcurrency: ZodCurrencySchema,\n});\n\nexport type GetBalancesParams = z.infer<typeof ZodGetBalancesParamsSchema>;\n\nexport const ZodTxLimitsParamsSchema = z.object({\n\taddress: ZodAddressSchema,\n\tcurrency: ZodCurrencySchema,\n});\n\nexport type TxLimitsParams = z.infer<typeof ZodTxLimitsParamsSchema>;\n\nexport const ZodPriceConfigParamsSchema = z.object({\n\tcurrency: ZodCurrencySchema,\n});\n\nexport type PriceConfigParams = z.infer<typeof ZodPriceConfigParamsSchema>;\n","import { Result } from \"neverthrow\";\nimport { type Address, encodeFunctionData } from \"viem\";\nimport { validate } from \"../../validation\";\nimport { ZkkycError } from \"../../zkkyc/errors\";\nimport type {\n\tAnonAadharProofParams,\n\tSocialVerifyParams,\n\tZkPassportRegisterParams,\n} from \"../../zkkyc/validation\";\nimport {\n\tZodAnonAadharProofParamsSchema,\n\tZodSocialVerifyParamsSchema,\n\tZodZkPassportRegisterParamsSchema,\n} from \"../../zkkyc/validation\";\nimport { ABIS } from \"../abis\";\n\n/** Prepares a social verification transaction. */\nexport function prepareSocialVerify(\n\treputationManagerAddress: Address,\n\tparams: SocialVerifyParams,\n): Result<{ to: Address; data: `0x${string}` }, ZkkycError> {\n\treturn validate(\n\t\tZodSocialVerifyParamsSchema,\n\t\tparams,\n\t\t(message, cause, data) =>\n\t\t\tnew ZkkycError(message, { code: \"VALIDATION_ERROR\", cause, context: { params: data } }),\n\t).andThen((validated) =>\n\t\tResult.fromThrowable(\n\t\t\t() => ({\n\t\t\t\tto: reputationManagerAddress,\n\t\t\t\tdata: encodeFunctionData({\n\t\t\t\t\tabi: ABIS.EXTERNAL.REPUTATION_MANAGER,\n\t\t\t\t\tfunctionName: \"socialVerify\",\n\t\t\t\t\targs: [\n\t\t\t\t\t\tvalidated._socialName,\n\t\t\t\t\t\tvalidated.proofs.map((proof) => ({\n\t\t\t\t\t\t\t...proof,\n\t\t\t\t\t\t\tsignedClaim: {\n\t\t\t\t\t\t\t\t...proof.signedClaim,\n\t\t\t\t\t\t\t\tclaim: {\n\t\t\t\t\t\t\t\t\t...proof.signedClaim.claim,\n\t\t\t\t\t\t\t\t\tidentifier: proof.signedClaim.claim.identifier as `0x${string}`,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tsignatures: proof.signedClaim.signatures as readonly `0x${string}`[],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t})),\n\t\t\t\t\t],\n\t\t\t\t}),\n\t\t\t}),\n\t\t\t(error) =>\n\t\t\t\tnew ZkkycError(\"Failed to encode socialVerify\", {\n\t\t\t\t\tcode: \"ENCODE_ERROR\",\n\t\t\t\t\tcause: error,\n\t\t\t\t}),\n\t\t)(),\n\t);\n}\n\n/** Prepares a submit anon Aadhaar proof transaction. */\nexport function prepareSubmitAnonAadharProof(\n\treputationManagerAddress: Address,\n\tparams: AnonAadharProofParams,\n): Result<{ to: Address; data: `0x${string}` }, ZkkycError> {\n\treturn validate(\n\t\tZodAnonAadharProofParamsSchema,\n\t\tparams,\n\t\t(message, cause, data) =>\n\t\t\tnew ZkkycError(message, { code: \"VALIDATION_ERROR\", cause, context: { params: data } }),\n\t).andThen((validated) =>\n\t\tResult.fromThrowable(\n\t\t\t() => ({\n\t\t\t\tto: reputationManagerAddress,\n\t\t\t\tdata: encodeFunctionData({\n\t\t\t\t\tabi: ABIS.EXTERNAL.REPUTATION_MANAGER,\n\t\t\t\t\tfunctionName: \"submitAnonAadharProof\",\n\t\t\t\t\targs: [\n\t\t\t\t\t\tvalidated.nullifierSeed,\n\t\t\t\t\t\tvalidated.nullifier,\n\t\t\t\t\t\tvalidated.timestamp,\n\t\t\t\t\t\tvalidated.signal,\n\t\t\t\t\t\tvalidated.revealArray,\n\t\t\t\t\t\tvalidated.packedGroth16Proof,\n\t\t\t\t\t],\n\t\t\t\t}),\n\t\t\t}),\n\t\t\t(error) =>\n\t\t\t\tnew ZkkycError(\"Failed to encode submitAnonAadharProof\", {\n\t\t\t\t\tcode: \"ENCODE_ERROR\",\n\t\t\t\t\tcause: error,\n\t\t\t\t}),\n\t\t)(),\n\t);\n}\n\n/** Prepares a zkPassport registration transaction. */\nexport function prepareZkPassportRegister(\n\treputationManagerAddress: Address,\n\tparams: ZkPassportRegisterParams,\n): Result<{ to: Address; data: `0x${string}` }, ZkkycError> {\n\treturn validate(\n\t\tZodZkPassportRegisterParamsSchema,\n\t\tparams,\n\t\t(message, cause, data) =>\n\t\t\tnew ZkkycError(message, { code: \"VALIDATION_ERROR\", cause, context: { params: data } }),\n\t).andThen((validated) =>\n\t\tResult.fromThrowable(\n\t\t\t() => {\n\t\t\t\tconst { proofVerificationData, serviceConfig, committedInputs, version } = validated.params;\n\n\t\t\t\tconst proofVerificationParams = {\n\t\t\t\t\tversion: version as `0x${string}`,\n\t\t\t\t\tproofVerificationData: {\n\t\t\t\t\t\tvkeyHash: proofVerificationData.vkeyHash as `0x${string}`,\n\t\t\t\t\t\tproof: proofVerificationData.proof as `0x${string}`,\n\t\t\t\t\t\tpublicInputs: proofVerificationData.publicInputs as `0x${string}`[],\n\t\t\t\t\t},\n\t\t\t\t\tcommittedInputs: committedInputs as `0x${string}`,\n\t\t\t\t\tserviceConfig: {\n\t\t\t\t\t\tvalidityPeriodInSeconds: BigInt(serviceConfig.validityPeriodInSeconds),\n\t\t\t\t\t\tdomain: serviceConfig.domain,\n\t\t\t\t\t\tscope: serviceConfig.scope,\n\t\t\t\t\t\tdevMode: serviceConfig.devMode,\n\t\t\t\t\t},\n\t\t\t\t};\n\n\t\t\t\treturn {\n\t\t\t\t\tto: reputationManagerAddress,\n\t\t\t\t\tdata: encodeFunctionData({\n\t\t\t\t\t\tabi: ABIS.EXTERNAL.REPUTATION_MANAGER,\n\t\t\t\t\t\tfunctionName: \"zkPassportRegister\",\n\t\t\t\t\t\targs: [proofVerificationParams, validated.isIDCard],\n\t\t\t\t\t}),\n\t\t\t\t};\n\t\t\t},\n\t\t\t(error) =>\n\t\t\t\tnew ZkkycError(\"Failed to encode zkPassportRegister\", {\n\t\t\t\t\tcode: \"ENCODE_ERROR\",\n\t\t\t\t\tcause: error,\n\t\t\t\t}),\n\t\t)(),\n\t);\n}\n","import { z } from \"zod\";\nimport { ZodAddressSchema } from \"../validation\";\n\n// ── Write param schemas ──────────────────────────────────────────────────────\n\nexport const ZodAnonAadharProofParamsSchema = z.object({\n\tnullifierSeed: z.bigint(),\n\tnullifier: z.bigint(),\n\ttimestamp: z.bigint(),\n\tsignal: z.bigint(),\n\trevealArray: z.tuple([z.bigint(), z.bigint(), z.bigint(), z.bigint()]),\n\tpackedGroth16Proof: z.tuple([\n\t\tz.bigint(),\n\t\tz.bigint(),\n\t\tz.bigint(),\n\t\tz.bigint(),\n\t\tz.bigint(),\n\t\tz.bigint(),\n\t\tz.bigint(),\n\t\tz.bigint(),\n\t]),\n});\n\nexport type AnonAadharProofParams = z.infer<typeof ZodAnonAadharProofParamsSchema>;\n\nexport const ZodSocialVerifyParamsSchema = z.object({\n\t_socialName: z.string(),\n\tproofs: z.array(\n\t\tz.object({\n\t\t\tclaimInfo: z.object({\n\t\t\t\tprovider: z.string(),\n\t\t\t\tparameters: z.string(),\n\t\t\t\tcontext: z.string(),\n\t\t\t}),\n\t\t\tsignedClaim: z.object({\n\t\t\t\tclaim: z.object({\n\t\t\t\t\tidentifier: z.string(),\n\t\t\t\t\towner: ZodAddressSchema,\n\t\t\t\t\ttimestampS: z.number(),\n\t\t\t\t\tepoch: z.number(),\n\t\t\t\t}),\n\t\t\t\tsignatures: z.array(z.string()),\n\t\t\t}),\n\t\t}),\n\t),\n});\n\nexport type SocialVerifyParams = z.infer<typeof ZodSocialVerifyParamsSchema>;\n\n// Schema matching SolidityVerifierParameters from @zkpassport/sdk (structural definition)\nexport const ZodSolidityVerifierParametersSchema = z.object({\n\tversion: z.string().refine((val) => val.startsWith(\"0x\"), {\n\t\tmessage: \"Version must be a hex string\",\n\t}),\n\tproofVerificationData: z.object({\n\t\tvkeyHash: z.string().refine((val) => /^0x[a-fA-F0-9]{64}$/.test(val), {\n\t\t\tmessage: \"Invalid bytes32 hex string\",\n\t\t}),\n\t\tproof: z.string().refine((val) => val.startsWith(\"0x\"), {\n\t\t\tmessage: \"Proof must be a hex string\",\n\t\t}),\n\t\tpublicInputs: z.array(\n\t\t\tz.string().refine((val) => /^0x[a-fA-F0-9]{64}$/.test(val), {\n\t\t\t\tmessage: \"Each public input must be a valid bytes32 hex string\",\n\t\t\t}),\n\t\t),\n\t}),\n\tcommittedInputs: z.string().refine((val) => val.startsWith(\"0x\"), {\n\t\tmessage: \"Committed inputs must be a hex string\",\n\t}),\n\tserviceConfig: z.object({\n\t\tvalidityPeriodInSeconds: z.number().int().nonnegative(),\n\t\tdomain: z.string(),\n\t\tscope: z.string(),\n\t\tdevMode: z.boolean(),\n\t}),\n});\n\nexport type SolidityVerifierParameters = z.infer<typeof ZodSolidityVerifierParametersSchema>;\n\nexport const ZodZkPassportRegisterParamsSchema = z.object({\n\tparams: ZodSolidityVerifierParametersSchema,\n\tisIDCard: z.boolean(),\n});\n\nexport type ZkPassportRegisterParams = z.infer<typeof ZodZkPassportRegisterParamsSchema>;\n","import { ResultAsync } from \"neverthrow\";\nimport { type Address, formatUnits, stringToHex } from \"viem\";\nimport { ProfileError } from \"../../profile/errors\";\nimport type { PriceConfigParams, TxLimitsParams } from \"../../profile/validation\";\nimport { ZodPriceConfigParamsSchema, ZodTxLimitsParamsSchema } from \"../../profile/validation\";\nimport type { PublicClientLike } from \"../../types\";\nimport { validate } from \"../../validation\";\nimport { ABIS } from \"../abis\";\n\nexport interface TxLimits {\n\treadonly buyLimit: number;\n\treadonly sellLimit: number;\n}\n\nexport interface RpPerUsdtLimit {\n\treadonly numerator: bigint;\n\treadonly denominator: bigint;\n\t/** The USDC multiplier per RP: denominator / numerator. */\n\treadonly multiplier: number;\n}\n\n/** Reads the buy and sell transaction limits for a given address and currency. */\nexport function getTxLimits(\n\tpublicClient: PublicClientLike,\n\tdiamondAddress: Address,\n\tparams: TxLimitsParams,\n): ResultAsync<TxLimits, ProfileError> {\n\treturn validate(\n\t\tZodTxLimitsParamsSchema,\n\t\tparams,\n\t\t(message, cause, data) =>\n\t\t\tnew ProfileError(message, {\n\t\t\t\tcode: \"VALIDATION_ERROR\",\n\t\t\t\tcause,\n\t\t\t\tcontext: { params: data },\n\t\t\t}),\n\t).asyncAndThen((validated) =>\n\t\tResultAsync.fromPromise(\n\t\t\tpublicClient.readContract({\n\t\t\t\taddress: diamondAddress,\n\t\t\t\tabi: ABIS.FACETS.ORDER_FLOW,\n\t\t\t\tfunctionName: \"userTxLimit\",\n\t\t\t\targs: [validated.address, stringToHex(validated.currency, { size: 32 })],\n\t\t\t}) as Promise<readonly [bigint, bigint]>,\n\t\t\t(error) =>\n\t\t\t\tnew ProfileError(\"Failed to read tx limits\", {\n\t\t\t\t\tcode: \"CONTRACT_READ_ERROR\",\n\t\t\t\t\tcause: error,\n\t\t\t\t\tcontext: { address: validated.address, currency: validated.currency, diamondAddress },\n\t\t\t\t}),\n\t\t).map(([buyLimit, sellLimit]) => ({\n\t\t\tbuyLimit: Number(formatUnits(buyLimit, 6)),\n\t\t\tsellLimit: Number(formatUnits(sellLimit, 6)),\n\t\t})),\n\t);\n}\n/** Reads the RP-to-USDC limit ratio for a given currency from the Diamond contract. */\nexport function getRpPerUsdtLimitRational(\n\tpublicClient: PublicClientLike,\n\tdiamondAddress: Address,\n\tparams: PriceConfigParams,\n): ResultAsync<RpPerUsdtLimit, ProfileError> {\n\treturn validate(\n\t\tZodPriceConfigParamsSchema,\n\t\tparams,\n\t\t(message, cause, data) =>\n\t\t\tnew ProfileError(message, {\n\t\t\t\tcode: \"VALIDATION_ERROR\",\n\t\t\t\tcause,\n\t\t\t\tcontext: { params: data },\n\t\t\t}),\n\t).asyncAndThen((validated) =>\n\t\tResultAsync.fromPromise(\n\t\t\tpublicClient.readContract({\n\t\t\t\taddress: diamondAddress,\n\t\t\t\tabi: ABIS.DIAMOND,\n\t\t\t\tfunctionName: \"getRpPerUsdtLimitRational\",\n\t\t\t\targs: [stringToHex(validated.currency, { size: 32 })],\n\t\t\t}) as Promise<readonly [bigint, bigint]>,\n\t\t\t(error) =>\n\t\t\t\tnew ProfileError(\"Failed to read RP per USDT limit rational\", {\n\t\t\t\t\tcode: \"CONTRACT_READ_ERROR\",\n\t\t\t\t\tcause: error,\n\t\t\t\t\tcontext: { currency: validated.currency, diamondAddress },\n\t\t\t\t}),\n\t\t).map(([numerator, denominator]) => ({\n\t\t\tnumerator,\n\t\t\tdenominator,\n\t\t\tmultiplier: numerator > 0n ? Number(denominator) / Number(numerator) : 0,\n\t\t})),\n\t);\n}\n","import { ResultAsync } from \"neverthrow\";\nimport type { Address } from \"viem\";\nimport { ProfileError } from \"../../profile/errors\";\nimport type { UsdcBalanceParams } from \"../../profile/validation\";\nimport { ZodUsdcBalanceParamsSchema } from \"../../profile/validation\";\nimport type { PublicClientLike } from \"../../types\";\nimport { validate } from \"../../validation\";\nimport { ABIS } from \"../abis\";\n\n/** Reads the USDC balance for a given address. */\nexport function getUsdcBalance(\n\tpublicClient: PublicClientLike,\n\tusdcAddress: Address,\n\tparams: UsdcBalanceParams,\n): ResultAsync<bigint, ProfileError> {\n\treturn validate(\n\t\tZodUsdcBalanceParamsSchema,\n\t\tparams,\n\t\t(message, cause, data) =>\n\t\t\tnew ProfileError(message, {\n\t\t\t\tcode: \"VALIDATION_ERROR\",\n\t\t\t\tcause,\n\t\t\t\tcontext: { params: data },\n\t\t\t}),\n\t).asyncAndThen((validated) =>\n\t\tResultAsync.fromPromise(\n\t\t\tpublicClient.readContract({\n\t\t\t\taddress: usdcAddress,\n\t\t\t\tabi: ABIS.EXTERNAL.USDC,\n\t\t\t\tfunctionName: \"balanceOf\",\n\t\t\t\targs: [validated.address],\n\t\t\t}) as Promise<bigint>,\n\t\t\t(error) =>\n\t\t\t\tnew ProfileError(\"Failed to read USDC balance\", {\n\t\t\t\t\tcode: \"CONTRACT_READ_ERROR\",\n\t\t\t\t\tcause: error,\n\t\t\t\t\tcontext: { address: validated.address, usdcAddress },\n\t\t\t\t}),\n\t\t),\n\t);\n}\n","import { errAsync, okAsync, type ResultAsync } from \"neverthrow\";\nimport { noopLogger } from \"../lib\";\nimport { OrderRoutingError } from \"./errors\";\nimport type { CircleForRouting, Logger } from \"./types\";\n\nconst EPSILON = 0.25;\nconst RECOVERY_SCALE = 0.3;\nconst BOOTSTRAP_MAX_WEIGHT = 25;\nconst MAX_VALIDATION_ATTEMPTS = 3;\n\nexport function circleWeight(c: CircleForRouting): number {\n\tconst score = c.metrics.circleScore;\n\tif (c.metrics.circleStatus === \"paused\") {\n\t\treturn score * RECOVERY_SCALE;\n\t}\n\tif (c.metrics.circleStatus === \"bootstrap\") {\n\t\treturn Math.min(score, BOOTSTRAP_MAX_WEIGHT);\n\t}\n\treturn score;\n}\n\nexport function filterEligibleCircles(\n\tcircles: readonly CircleForRouting[],\n\torderCurrency: string,\n): CircleForRouting[] {\n\treturn circles.filter((c) => c.currency.toLowerCase() === orderCurrency.toLowerCase());\n}\n\nfunction weightedRandomChoice<T>(arr: readonly T[], weights: readonly number[]): T {\n\tconst totalWeight = weights.reduce((sum, w) => sum + w, 0);\n\n\tif (totalWeight === 0) {\n\t\treturn arr[Math.floor(Math.random() * arr.length)];\n\t}\n\n\tlet rand = Math.random() * totalWeight;\n\tfor (let i = 0; i < arr.length; i++) {\n\t\trand -= weights[i];\n\t\tif (rand <= 0) {\n\t\t\treturn arr[i];\n\t\t}\n\t}\n\treturn arr[arr.length - 1];\n}\n\nexport function selectCircle(eligible: readonly CircleForRouting[]): CircleForRouting | null {\n\tif (eligible.length === 0) {\n\t\treturn null;\n\t}\n\n\tconst activeCircles = eligible.filter((c) => c.metrics.circleStatus === \"active\");\n\n\tconst isExplore = Math.random() < EPSILON;\n\n\tif (isExplore) {\n\t\t// Explore: all eligible circles with status-aware weights\n\t\tconst weights = eligible.map(circleWeight);\n\t\treturn weightedRandomChoice(eligible, weights);\n\t}\n\n\t// Exploit: only active circles, weighted by score\n\tif (activeCircles.length === 0) {\n\t\t// Fallback: no active circles, pick from all eligible with status-aware weights\n\t\tconst weights = eligible.map(circleWeight);\n\t\treturn weightedRandomChoice(eligible, weights);\n\t}\n\n\tconst weights = activeCircles.map((c) => c.metrics.circleScore);\n\treturn weightedRandomChoice(activeCircles, weights);\n}\n\nexport function selectCircleForOrderAsync(\n\tcircles: readonly CircleForRouting[],\n\torderCurrency: string,\n\tvalidateCircle: (circleId: bigint) => ResultAsync<boolean, unknown>,\n\tlogger: Logger = noopLogger,\n): ResultAsync<bigint, OrderRoutingError> {\n\tconst eligible = filterEligibleCircles(circles, orderCurrency);\n\tlet remaining = [...eligible];\n\n\tlogger.debug(\"filtering eligible circles\", {\n\t\ttotal: circles.length,\n\t\teligible: eligible.length,\n\t\tcurrency: orderCurrency,\n\t\tcircles: eligible,\n\t});\n\n\tif (eligible.length === 0) {\n\t\tlogger.warn(\"no eligible circles found for currency\", { currency: orderCurrency });\n\t}\n\n\tfunction attempt(attemptsLeft: number): ResultAsync<bigint, OrderRoutingError> {\n\t\tif (attemptsLeft <= 0 || remaining.length === 0) {\n\t\t\tlogger.warn(\"exhausted all attempts or circles\", {\n\t\t\t\tattemptsLeft,\n\t\t\t\tremainingCircles: remaining.length,\n\t\t\t});\n\t\t\treturn errAsync(\n\t\t\t\tnew OrderRoutingError(\"No eligible circles found\", {\n\t\t\t\t\tcode: \"NO_ELIGIBLE_CIRCLES\",\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\n\t\tconst selected = selectCircle(remaining);\n\t\tif (!selected) {\n\t\t\treturn errAsync(\n\t\t\t\tnew OrderRoutingError(\"No eligible circles found\", {\n\t\t\t\t\tcode: \"NO_ELIGIBLE_CIRCLES\",\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\n\t\tconst circleId = BigInt(selected.circleId);\n\n\t\tlogger.debug(\"selected circle, validating on-chain\", {\n\t\t\tcircleId: String(circleId),\n\t\t\tstatus: selected.metrics.circleStatus,\n\t\t\tscore: selected.metrics.circleScore,\n\t\t\tattemptsLeft,\n\t\t});\n\n\t\treturn validateCircle(circleId)\n\t\t\t.orElse((error) => {\n\t\t\t\tlogger.warn(\"validation errored, treating as ineligible\", {\n\t\t\t\t\tcircleId: String(circleId),\n\t\t\t\t\terror: String(error),\n\t\t\t\t});\n\t\t\t\treturn okAsync(false);\n\t\t\t})\n\t\t\t.andThen((isValid) => {\n\t\t\t\tif (isValid) {\n\t\t\t\t\tlogger.info(\"circle validated successfully\", { circleId: String(circleId) });\n\t\t\t\t\treturn okAsync(circleId);\n\t\t\t\t}\n\t\t\t\tlogger.debug(\"circle failed validation, retrying\", {\n\t\t\t\t\tcircleId: String(circleId),\n\t\t\t\t\tremainingCircles: remaining.length - 1,\n\t\t\t\t});\n\t\t\t\tremaining = remaining.filter((c) => c.circleId !== selected.circleId);\n\t\t\t\treturn attempt(attemptsLeft - 1);\n\t\t\t});\n\t}\n\n\treturn attempt(MAX_VALIDATION_ATTEMPTS);\n}\n","import { ResultAsync } from \"neverthrow\";\nimport { sleep } from \"../../lib\";\nimport { OrderRoutingError } from \"../errors\";\n\n/** Abort the fetch if the subgraph doesn't respond within 10 seconds. */\nconst DEFAULT_TIMEOUT_MS = 10_000;\n/** Retry up to 3 times after a transient failure (timeout or network error) before giving up. */\nconst MAX_RETRIES = 3;\n/** Wait 500ms before the first retry; scales linearly (500ms × attempt) on subsequent retries. */\nconst BACKOFF_MS = 500;\n\nexport interface SubgraphQueryParams {\n\treadonly query: string;\n\treadonly variables?: Record<string, unknown>;\n\t/** Fetch timeout in milliseconds. Defaults to 10 000. */\n\treadonly timeoutMs?: number;\n}\n\n/** Returns true for errors worth retrying (network failures, timeouts). */\nfunction isTransient(error: unknown): boolean {\n\tif (error instanceof OrderRoutingError) return false;\n\tif (error instanceof DOMException && error.name === \"AbortError\") return true;\n\tif (error instanceof TypeError) return true; // fetch network error\n\treturn false;\n}\n\nexport function querySubgraph(\n\turl: string,\n\tparams: SubgraphQueryParams,\n): ResultAsync<unknown, OrderRoutingError> {\n\tconst timeoutMs = params.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n\tconst fetchOnce = async () => {\n\t\tconst controller = new AbortController();\n\t\tconst timer = setTimeout(() => controller.abort(), timeoutMs);\n\n\t\ttry {\n\t\t\tconst response = await fetch(url, {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\theaders: { \"Content-Type\": \"application/json\" },\n\t\t\t\tbody: JSON.stringify({\n\t\t\t\t\tquery: params.query,\n\t\t\t\t\tvariables: params.variables,\n\t\t\t\t}),\n\t\t\t\tsignal: controller.signal,\n\t\t\t});\n\n\t\t\tif (!response.ok) {\n\t\t\t\tthrow new OrderRoutingError(`Subgraph request failed (status: ${response.status})`, {\n\t\t\t\t\tcode: \"SUBGRAPH_ERROR\",\n\t\t\t\t\tcause: response,\n\t\t\t\t\tcontext: { status: response.status },\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst json = await response.json();\n\n\t\t\tif (json.errors?.length > 0) {\n\t\t\t\tthrow new OrderRoutingError(\"Subgraph returned GraphQL errors\", {\n\t\t\t\t\tcode: \"SUBGRAPH_ERROR\",\n\t\t\t\t\tcause: json.errors,\n\t\t\t\t\tcontext: { errors: json.errors },\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (!json.data) {\n\t\t\t\tthrow new OrderRoutingError(\"Subgraph returned no data\", {\n\t\t\t\t\tcode: \"SUBGRAPH_ERROR\",\n\t\t\t\t\tcause: \"Missing data field in GraphQL response\",\n\t\t\t\t\tcontext: { response: json },\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn json.data;\n\t\t} finally {\n\t\t\tclearTimeout(timer);\n\t\t}\n\t};\n\n\tconst fetchWithRetry = async () => {\n\t\tfor (let attempt = 0; attempt <= MAX_RETRIES; attempt++) {\n\t\t\ttry {\n\t\t\t\treturn await fetchOnce();\n\t\t\t} catch (error) {\n\t\t\t\tconst lastAttempt = attempt === MAX_RETRIES;\n\t\t\t\tif (lastAttempt || !isTransient(error)) throw error;\n\t\t\t\tawait sleep(BACKOFF_MS * (attempt + 1));\n\t\t\t}\n\t\t}\n\t\t// Unreachable — the loop always returns or throws\n\t\tthrow new OrderRoutingError(\"Subgraph query exhausted retries\", {\n\t\t\tcode: \"SUBGRAPH_ERROR\",\n\t\t});\n\t};\n\n\treturn ResultAsync.fromPromise(fetchWithRetry(), (error) =>\n\t\terror instanceof OrderRoutingError\n\t\t\t? error\n\t\t\t: new OrderRoutingError(\"Subgraph query failed\", {\n\t\t\t\t\tcode: \"SUBGRAPH_ERROR\",\n\t\t\t\t\tcause: error,\n\t\t\t\t}),\n\t);\n}\n","export const CIRCLES_FOR_ROUTING_QUERY = /* GraphQL */ `\n query CirclesForRouting($currency: Bytes!) {\n circles(\n first: 1000\n where: {\n currency: $currency\n metrics_: {\n circleStatus_in: [\"active\", \"bootstrap\", \"paused\"]\n }\n }\n ) {\n circleId\n currency\n metrics {\n circleScore\n circleStatus\n scoreState {\n activeMerchantsCount\n }\n }\n }\n }\n`;\n","import { noopLogger } from \"../../lib\";\nimport { validate } from \"../../validation\";\nimport { OrderRoutingError } from \"../errors\";\nimport type { Logger } from \"../types\";\nimport { ZodCirclesForRoutingResponseSchema } from \"../validation\";\nimport { querySubgraph } from \"./client\";\nimport { CIRCLES_FOR_ROUTING_QUERY } from \"./queries\";\n\nexport function getCirclesForRouting(\n\tsubgraphUrl: string,\n\tcurrency: string,\n\tlogger: Logger = noopLogger,\n) {\n\tlogger.debug(\"fetching circles from subgraph\", { subgraphUrl, currency });\n\n\treturn querySubgraph(subgraphUrl, {\n\t\tquery: CIRCLES_FOR_ROUTING_QUERY,\n\t\tvariables: { currency },\n\t}).andThen((data) =>\n\t\tvalidate(\n\t\t\tZodCirclesForRoutingResponseSchema,\n\t\t\tdata,\n\t\t\t(message, cause, d) =>\n\t\t\t\tnew OrderRoutingError(message, { code: \"VALIDATION_ERROR\", cause, context: { data: d } }),\n\t\t).map((validated) => {\n\t\t\tconst circles = validated.circles.filter(\n\t\t\t\t(item) => Number(item.metrics.scoreState.activeMerchantsCount) > 0,\n\t\t\t);\n\t\t\tlogger.info(\"fetched circles from subgraph\", {\n\t\t\t\ttotal: validated.circles.length,\n\t\t\t\twithActiveMerchants: circles.length,\n\t\t\t\tcircles,\n\t\t\t});\n\t\t\treturn circles;\n\t\t}),\n\t);\n}\n\nexport { querySubgraph } from \"./client\";\nexport { CIRCLES_FOR_ROUTING_QUERY } from \"./queries\";\n"],"mappings":"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","names":["import_viem","import_neverthrow","import_viem","import_zod","import_neverthrow","import_viem","import_zod","import_neverthrow","import_viem","import_zod","import_neverthrow","import_viem","import_neverthrow","import_neverthrow","weights","import_neverthrow"]}
|