@usdctofiat/offramp 1.1.3 → 1.1.4

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/dist/react.cjs CHANGED
@@ -1,9 +1,7 @@
1
1
  "use strict";
2
- var __create = Object.create;
3
2
  var __defProp = Object.defineProperty;
4
3
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
4
  var __getOwnPropNames = Object.getOwnPropertyNames;
6
- var __getProtoOf = Object.getPrototypeOf;
7
5
  var __hasOwnProp = Object.prototype.hasOwnProperty;
8
6
  var __export = (target, all) => {
9
7
  for (var name in all)
@@ -17,14 +15,6 @@ var __copyProps = (to, from, except, desc) => {
17
15
  }
18
16
  return to;
19
17
  };
20
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
- // If the importer is in node compatibility mode or this is not an ESM
22
- // file that has been converted to a CommonJS file using a Babel-
23
- // compatible transform (i.e. "__esModule" has not been set), then set
24
- // "default" to the CommonJS "module.exports" for node compatibility.
25
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
- mod
27
- ));
28
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
19
 
30
20
  // src/react.ts
@@ -39,8 +29,8 @@ var import_react = require("react");
39
29
 
40
30
  // src/deposit.ts
41
31
  var import_viem3 = require("viem");
42
- var import_chains = require("viem/chains");
43
- var import_sdk4 = require("@zkp2p/sdk");
32
+ var import_chains3 = require("viem/chains");
33
+ var import_sdk5 = require("@zkp2p/sdk");
44
34
 
45
35
  // src/config.ts
46
36
  var import_sdk = require("@zkp2p/sdk");
@@ -382,6 +372,7 @@ function isUserCancellation(error) {
382
372
 
383
373
  // src/otc.ts
384
374
  var import_viem = require("viem");
375
+ var import_chains = require("viem/chains");
385
376
 
386
377
  // ../../node_modules/@zkp2p/contracts-v2/abis/base/WhitelistPreIntentHook.json
387
378
  var WhitelistPreIntentHook_default = [
@@ -726,6 +717,18 @@ var WhitelistPreIntentHook_default = [
726
717
  }
727
718
  ];
728
719
 
720
+ // src/sdk-client.ts
721
+ var import_sdk3 = require("@zkp2p/sdk");
722
+ function createSdkClient(walletClient) {
723
+ return new import_sdk3.OfframpClient({
724
+ walletClient,
725
+ chainId: BASE_CHAIN_ID,
726
+ runtimeEnv: RUNTIME_ENV,
727
+ rpcUrl: BASE_RPC_URL,
728
+ baseApiUrl: API_BASE_URL
729
+ });
730
+ }
731
+
729
732
  // src/otc.ts
730
733
  var WHITELIST_HOOK_ADDRESS = "0xda023Ea0d789A41BcF5866F7B6BBd2CaDF9b79B8";
731
734
  var OTC_BASE_URL = "https://usdctofiat.xyz";
@@ -743,12 +746,7 @@ async function enableOtc(walletClient, depositId, takerAddress, escrowAddress) {
743
746
  escrowAddress: escrow
744
747
  });
745
748
  if (currentHook !== import_viem.zeroAddress) {
746
- const isAlready = await readIsWhitelisted(
747
- walletClient,
748
- escrow,
749
- depositIdBig,
750
- taker
751
- );
749
+ const isAlready = await readIsWhitelisted(escrow, depositIdBig, taker);
752
750
  if (isAlready) {
753
751
  return {
754
752
  depositId,
@@ -798,13 +796,8 @@ async function writeContract(walletClient, functionName, args) {
798
796
  args
799
797
  });
800
798
  }
801
- async function readIsWhitelisted(walletClient, escrow, depositId, taker) {
802
- const { createPublicClient: createPublicClient2, http: http2 } = await import("viem");
803
- const { base: base2 } = await import("viem/chains");
804
- const publicClient = createPublicClient2({
805
- chain: base2,
806
- transport: http2("https://mainnet.base.org")
807
- });
799
+ async function readIsWhitelisted(escrow, depositId, taker) {
800
+ const publicClient = (0, import_viem.createPublicClient)({ chain: import_chains.base, transport: (0, import_viem.http)(BASE_RPC_URL) });
808
801
  return publicClient.readContract({
809
802
  address: WHITELIST_HOOK_ADDRESS,
810
803
  abi: WhitelistPreIntentHook_default,
@@ -815,13 +808,14 @@ async function readIsWhitelisted(walletClient, escrow, depositId, taker) {
815
808
 
816
809
  // src/queries.ts
817
810
  var import_viem2 = require("viem");
818
- var import_sdk3 = require("@zkp2p/sdk");
811
+ var import_chains2 = require("viem/chains");
812
+ var import_sdk4 = require("@zkp2p/sdk");
819
813
  var indexerService = null;
820
814
  function getIndexerService() {
821
815
  if (!indexerService) {
822
- const endpoint = (0, import_sdk3.defaultIndexerEndpoint)("PRODUCTION");
823
- const client = new import_sdk3.IndexerClient(endpoint);
824
- indexerService = new import_sdk3.IndexerDepositService(client);
816
+ const endpoint = (0, import_sdk4.defaultIndexerEndpoint)("PRODUCTION");
817
+ const client = new import_sdk4.IndexerClient(endpoint);
818
+ indexerService = new import_sdk4.IndexerDepositService(client);
825
819
  }
826
820
  return indexerService;
827
821
  }
@@ -855,7 +849,7 @@ function resolveMethodNames(hashes) {
855
849
  return Array.from(names);
856
850
  }
857
851
  function mapDeposit(d) {
858
- const delegationState = (0, import_sdk3.classifyDelegationState)(
852
+ const delegationState = (0, import_sdk4.classifyDelegationState)(
859
853
  d.rateManagerId ?? void 0,
860
854
  d.rateManagerAddress ?? void 0,
861
855
  DELEGATE_RATE_MANAGER_ID,
@@ -872,7 +866,7 @@ function mapDeposit(d) {
872
866
  fulfilledIntents: d.fulfilledIntents ?? 0,
873
867
  paymentMethods: resolveMethodNames(d.paymentMethods),
874
868
  currencies: d.currencies.map((c) => {
875
- const info = (0, import_sdk3.getCurrencyInfoFromHash)(c.currencyCode);
869
+ const info = (0, import_sdk4.getCurrencyInfoFromHash)(c.currencyCode);
876
870
  return info?.currencyCode ?? c.currencyCode;
877
871
  }),
878
872
  rateSource: d.currencies[0]?.rateSource || "unknown",
@@ -984,7 +978,7 @@ function attachOracleConfig(entries, conversionRates) {
984
978
  (group, gi) => group.map((entry, ci) => {
985
979
  const currency = conversionRates[gi]?.[ci]?.currency;
986
980
  if (!currency) return entry;
987
- const oracleConfig = (0, import_sdk4.getSpreadOracleConfig)(currency);
981
+ const oracleConfig = (0, import_sdk5.getSpreadOracleConfig)(currency);
988
982
  if (!oracleConfig) return entry;
989
983
  return {
990
984
  ...entry,
@@ -1006,15 +1000,6 @@ function extractTxHash2(result) {
1006
1000
  return result.transactionHash;
1007
1001
  throw new Error("Unexpected transaction result format");
1008
1002
  }
1009
- function createSdkClient(walletClient) {
1010
- return new import_sdk4.OfframpClient({
1011
- walletClient,
1012
- chainId: BASE_CHAIN_ID,
1013
- runtimeEnv: RUNTIME_ENV,
1014
- rpcUrl: BASE_RPC_URL,
1015
- baseApiUrl: API_BASE_URL
1016
- });
1017
- }
1018
1003
  async function findUndelegatedDeposit(walletAddress) {
1019
1004
  try {
1020
1005
  const service = getIndexerService();
@@ -1023,6 +1008,7 @@ async function findUndelegatedDeposit(walletAddress) {
1023
1008
  { limit: 50 }
1024
1009
  );
1025
1010
  const escrowLower = ESCROW_ADDRESS.toLowerCase();
1011
+ const delegateIdLower = DELEGATE_RATE_MANAGER_ID.toLowerCase();
1026
1012
  const undelegated = (raw || []).filter((d) => {
1027
1013
  if (d.status === "CLOSED") return false;
1028
1014
  if (d.escrowAddress.toLowerCase() !== escrowLower) return false;
@@ -1034,7 +1020,7 @@ async function findUndelegatedDeposit(walletAddress) {
1034
1020
  }
1035
1021
  })();
1036
1022
  if (remaining === 0n) return false;
1037
- return d.rateManagerId !== DELEGATE_RATE_MANAGER_ID;
1023
+ return (d.rateManagerId ?? "").toLowerCase() !== delegateIdLower;
1038
1024
  });
1039
1025
  undelegated.sort((a, b) => Number(BigInt(b.depositId) - BigInt(a.depositId)));
1040
1026
  return undelegated[0] ?? null;
@@ -1099,7 +1085,7 @@ async function offramp(walletClient, params, onProgress) {
1099
1085
  const minUnits = usdcToUnits(String(MIN_ORDER_USDC));
1100
1086
  const maxUnits = usdcToUnits(String(Math.min(amt, 2500)));
1101
1087
  try {
1102
- const publicClient = (0, import_viem3.createPublicClient)({ chain: import_chains.base, transport: (0, import_viem3.http)(BASE_RPC_URL) });
1088
+ const publicClient = (0, import_viem3.createPublicClient)({ chain: import_chains3.base, transport: (0, import_viem3.http)(BASE_RPC_URL) });
1103
1089
  const balance = await publicClient.readContract({
1104
1090
  address: USDC_ADDRESS,
1105
1091
  abi: [
@@ -1154,7 +1140,7 @@ async function offramp(walletClient, params, onProgress) {
1154
1140
  const conversionRates = [
1155
1141
  [{ currency: currencyCode, conversionRate: "1" }]
1156
1142
  ];
1157
- const baseCurrenciesOverride = (0, import_sdk4.mapConversionRatesToOnchainMinRate)(conversionRates, 1);
1143
+ const baseCurrenciesOverride = (0, import_sdk5.mapConversionRatesToOnchainMinRate)(conversionRates, 1);
1158
1144
  const currenciesOverride = attachOracleConfig(baseCurrenciesOverride, conversionRates);
1159
1145
  let hash;
1160
1146
  try {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/react.ts","../src/hooks/useOfframp.ts","../src/deposit.ts","../src/config.ts","../src/platforms.ts","../src/errors.ts","../src/otc.ts","../../../node_modules/@zkp2p/contracts-v2/abis/base/WhitelistPreIntentHook.json","../src/queries.ts"],"sourcesContent":["export { useOfframp } from \"./hooks/useOfframp\";\nexport type { UseOfframpReturn } from \"./hooks/useOfframp\";\n","import { useCallback, useRef, useState } from \"react\";\nimport type { WalletClient } from \"viem\";\nimport type { OfframpParams, OfframpResult, OfframpStep, DepositInfo } from \"../types\";\nimport { offramp as offrampFn } from \"../deposit\";\nimport { deposits as depositsFn, close as closeFn } from \"../queries\";\nimport { OfframpError } from \"../errors\";\n\nexport interface UseOfframpReturn {\n step: OfframpStep | null;\n txHash: string | null;\n depositId: string | null;\n error: OfframpError | null;\n isLoading: boolean;\n offramp: (walletClient: WalletClient, params: OfframpParams) => Promise<OfframpResult>;\n deposits: (walletAddress: string) => Promise<DepositInfo[]>;\n close: (walletClient: WalletClient, depositId: string, escrowAddress?: string) => Promise<string>;\n reset: () => void;\n}\n\nexport function useOfframp(): UseOfframpReturn {\n const [step, setStep] = useState<OfframpStep | null>(null);\n const [txHash, setTxHash] = useState<string | null>(null);\n const [depositId, setDepositId] = useState<string | null>(null);\n const [error, setError] = useState<OfframpError | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const lockRef = useRef(false);\n\n const reset = useCallback(() => {\n setStep(null);\n setTxHash(null);\n setDepositId(null);\n setError(null);\n setIsLoading(false);\n lockRef.current = false;\n }, []);\n\n const offramp = useCallback(\n async (walletClient: WalletClient, params: OfframpParams): Promise<OfframpResult> => {\n if (lockRef.current) throw new OfframpError(\"Deposit already in progress\", \"VALIDATION\");\n lockRef.current = true;\n setIsLoading(true);\n setError(null);\n setStep(null);\n setTxHash(null);\n setDepositId(null);\n\n try {\n const result = await offrampFn(walletClient, params, (progress) => {\n setStep(progress.step);\n if (progress.txHash) setTxHash(progress.txHash);\n if (progress.depositId) setDepositId(progress.depositId);\n });\n setDepositId(result.depositId);\n setTxHash(result.txHash);\n return result;\n } catch (err) {\n const offrampError =\n err instanceof OfframpError\n ? err\n : new OfframpError(\n err instanceof Error ? err.message : \"Offramp failed\",\n \"DEPOSIT_FAILED\",\n );\n setError(offrampError);\n throw err;\n } finally {\n setIsLoading(false);\n lockRef.current = false;\n }\n },\n [],\n );\n\n return {\n step,\n txHash,\n depositId,\n error,\n isLoading,\n offramp,\n deposits: depositsFn,\n close: closeFn,\n reset,\n };\n}\n","import type { WalletClient } from \"viem\";\nimport { createPublicClient, decodeEventLog, formatUnits, http, parseUnits, type Hex } from \"viem\";\nimport { base } from \"viem/chains\";\nimport {\n OfframpClient,\n getSpreadOracleConfig,\n mapConversionRatesToOnchainMinRate,\n type CurrencyType,\n} from \"@zkp2p/sdk\";\n\nimport {\n API_BASE_URL,\n BASE_CHAIN_ID,\n BASE_RPC_URL,\n DELEGATE_RATE_MANAGER_ID,\n ESCROW_ADDRESS,\n GATING_SERVICE_ADDRESS,\n INDEXER_INITIAL_DELAY_MS,\n INDEXER_MAX_ATTEMPTS,\n INDEXER_MAX_DELAY_MS,\n MIN_DEPOSIT_USDC,\n MIN_ORDER_USDC,\n PAYEE_REGISTRATION_TIMEOUT_MS,\n RATE_MANAGER_REGISTRY_ADDRESS,\n REFERRER,\n RUNTIME_ENV,\n USDC_ADDRESS,\n} from \"./config\";\nimport { buildDepositData, getPaymentMethodHash } from \"./platforms\";\nimport { OfframpError, isUserCancellation } from \"./errors\";\nimport { enableOtc } from \"./otc\";\nimport { getIndexerService } from \"./queries\";\nimport type { OfframpParams, OfframpResult, OnProgress } from \"./types\";\n\n/* ── Helpers ──────────────────────────────────────────────────────── */\n\nfunction usdcToUnits(amount: string): bigint {\n return parseUnits(amount, 6);\n}\n\nconst DEPOSIT_RECEIVED_ABI = [\n {\n type: \"event\" as const,\n name: \"DepositReceived\" as const,\n inputs: [\n { indexed: true, name: \"depositId\", type: \"uint256\" },\n { indexed: true, name: \"depositor\", type: \"address\" },\n { indexed: true, name: \"token\", type: \"address\" },\n { indexed: false, name: \"amount\", type: \"uint256\" },\n {\n indexed: false,\n name: \"intentAmountRange\",\n type: \"tuple\",\n components: [\n { name: \"min\", type: \"uint256\" },\n { name: \"max\", type: \"uint256\" },\n ],\n },\n { indexed: false, name: \"delegate\", type: \"address\" },\n { indexed: false, name: \"intentGuardian\", type: \"address\" },\n ],\n },\n] as const;\n\nfunction extractDepositIdFromLogs(logs: Array<{ topics?: Hex[]; data?: Hex }>): string | null {\n for (const log of logs) {\n if (!log?.topics?.length || !log.data) continue;\n try {\n const decoded = decodeEventLog({\n abi: DEPOSIT_RECEIVED_ABI,\n data: log.data,\n topics: log.topics as [Hex, ...Hex[]],\n });\n if (decoded.eventName !== \"DepositReceived\") continue;\n const args = decoded.args as { depositId?: bigint };\n if (typeof args.depositId === \"bigint\") return args.depositId.toString();\n } catch {\n continue;\n }\n }\n return null;\n}\n\nasync function registerPayeeDetails(\n processorName: string,\n depositData: Record<string, string>,\n): Promise<string> {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), PAYEE_REGISTRATION_TIMEOUT_MS);\n try {\n const res = await fetch(`${API_BASE_URL}/v1/makers/create`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ processorName, depositData }),\n signal: controller.signal,\n });\n if (!res.ok) {\n const txt = await res.text().catch(() => \"\");\n throw new Error(`makers/create failed (${res.status}): ${txt || res.statusText}`);\n }\n const json = (await res.json()) as {\n success: boolean;\n message: string;\n responseObject?: { hashedOnchainId: string };\n };\n if (!json.success || !json.responseObject?.hashedOnchainId) {\n throw new Error(json.message || \"makers/create returned no hashedOnchainId\");\n }\n return json.responseObject.hashedOnchainId;\n } finally {\n clearTimeout(timeout);\n }\n}\n\ntype OnchainCurrencyEntry = {\n code: `0x${string}`;\n minConversionRate: bigint;\n oracleRateConfig?: {\n adapter: `0x${string}`;\n adapterConfig: `0x${string}`;\n spreadBps: number;\n maxStaleness: number;\n };\n};\n\nfunction attachOracleConfig(\n entries: Array<Array<{ code: `0x${string}`; minConversionRate: bigint }>>,\n conversionRates: Array<Array<{ currency: CurrencyType; conversionRate: string }>>,\n): OnchainCurrencyEntry[][] {\n return entries.map((group, gi) =>\n group.map((entry, ci) => {\n const currency = conversionRates[gi]?.[ci]?.currency;\n if (!currency) return entry;\n const oracleConfig = getSpreadOracleConfig(currency);\n if (!oracleConfig) return entry;\n return {\n ...entry,\n oracleRateConfig: {\n adapter: oracleConfig.adapter,\n adapterConfig: oracleConfig.adapterConfig,\n spreadBps: 0,\n maxStaleness: oracleConfig.maxStaleness,\n },\n };\n }),\n );\n}\n\nfunction extractTxHash(result: unknown): string {\n if (typeof result === \"string\") return result;\n if (result && typeof result === \"object\" && \"hash\" in result)\n return (result as { hash: string }).hash;\n if (result && typeof result === \"object\" && \"transactionHash\" in result)\n return (result as { transactionHash: string }).transactionHash;\n throw new Error(\"Unexpected transaction result format\");\n}\n\n/* ── SDK client factory ───────────────────────────────────────────── */\n\nexport function createSdkClient(walletClient: WalletClient): OfframpClient {\n return new OfframpClient({\n walletClient: walletClient as any,\n chainId: BASE_CHAIN_ID,\n runtimeEnv: RUNTIME_ENV,\n rpcUrl: BASE_RPC_URL,\n baseApiUrl: API_BASE_URL,\n });\n}\n\n/* ── Resume check ─────────────────────────────────────────────────── */\n\ntype IndexerDeposit = {\n depositId: string;\n txHash?: string;\n status: string;\n remainingDeposits: string | null;\n escrowAddress: string;\n rateManagerId?: string | null;\n rateManagerAddress?: string | null;\n};\n\nasync function findUndelegatedDeposit(walletAddress: string): Promise<IndexerDeposit | null> {\n try {\n const service = getIndexerService();\n const raw = (await service.fetchDepositsWithRelations(\n { depositor: walletAddress as `0x${string}` },\n { limit: 50 },\n )) as IndexerDeposit[];\n\n const escrowLower = ESCROW_ADDRESS.toLowerCase();\n const undelegated = (raw || []).filter((d) => {\n if (d.status === \"CLOSED\") return false;\n if (d.escrowAddress.toLowerCase() !== escrowLower) return false;\n const remaining = (() => {\n try {\n return BigInt(d.remainingDeposits || \"0\");\n } catch {\n return 0n;\n }\n })();\n if (remaining === 0n) return false;\n return d.rateManagerId !== DELEGATE_RATE_MANAGER_ID;\n });\n // Most recent first\n undelegated.sort((a, b) => Number(BigInt(b.depositId) - BigInt(a.depositId)));\n return undelegated[0] ?? null;\n } catch {\n return null;\n }\n}\n\n/* ── Main offramp flow ────────────────────────────────────────────── */\n\n/**\n * Create a USDC-to-fiat offramp deposit and delegate it to the vault.\n *\n * **Resumable**: if an existing undelegated deposit is found for this wallet,\n * the flow skips directly to delegation instead of creating a new deposit.\n */\nexport async function offramp(\n walletClient: WalletClient,\n params: OfframpParams,\n onProgress?: OnProgress,\n): Promise<OfframpResult> {\n const { amount, platform, currency, identifier } = params;\n const platformId = platform.id;\n const currencyCode = currency.code;\n\n // 1. Validate\n if (!walletClient.account?.address) {\n throw new OfframpError(\"Wallet client has no account. Connect a wallet first.\", \"VALIDATION\");\n }\n const walletAddress = walletClient.account.address;\n\n const amt = parseFloat(amount);\n if (!Number.isFinite(amt) || amt < MIN_DEPOSIT_USDC) {\n throw new OfframpError(`Minimum deposit is ${MIN_DEPOSIT_USDC} USDC`, \"VALIDATION\");\n }\n\n if (!platform.currencies.includes(currencyCode)) {\n throw new OfframpError(`${currencyCode} is not supported on ${platform.name}`, \"UNSUPPORTED\");\n }\n\n const validation = platform.validate(identifier);\n if (!validation.valid) {\n throw new OfframpError(validation.error || \"Invalid identifier\", \"VALIDATION\");\n }\n const normalizedIdentifier = validation.normalized;\n\n const methodHash = getPaymentMethodHash(platformId);\n if (!methodHash) {\n throw new OfframpError(`${platform.name} is not currently supported`, \"UNSUPPORTED\");\n }\n\n // 2. Check for existing undelegated deposit (resume path)\n const existing = await findUndelegatedDeposit(walletAddress);\n if (existing) {\n onProgress?.({ step: \"resuming\", depositId: existing.depositId });\n\n const client = createSdkClient(walletClient);\n const txOverrides = { referrer: [REFERRER] };\n\n try {\n const result = await client.setRateManager({\n depositId: BigInt(existing.depositId),\n rateManagerAddress: RATE_MANAGER_REGISTRY_ADDRESS,\n rateManagerId: DELEGATE_RATE_MANAGER_ID,\n escrowAddress: existing.escrowAddress as `0x${string}`,\n txOverrides,\n });\n const txHash = extractTxHash(result);\n onProgress?.({ step: \"done\", txHash, depositId: existing.depositId });\n return { depositId: existing.depositId, txHash, resumed: true };\n } catch (err) {\n if (isUserCancellation(err))\n throw new OfframpError(\"User cancelled\", \"USER_CANCELLED\", \"resuming\", err);\n throw new OfframpError(\n \"Found undelegated deposit but delegation failed. Try again.\",\n \"DELEGATION_FAILED\",\n \"resuming\",\n err,\n { depositId: existing.depositId, txHash: existing.txHash },\n );\n }\n }\n\n // 3. Full flow — no existing deposit to resume\n const truncatedAmount = amt.toFixed(6).replace(/\\.?0+$/, \"\");\n const amountUnits = usdcToUnits(truncatedAmount);\n const minUnits = usdcToUnits(String(MIN_ORDER_USDC));\n const maxUnits = usdcToUnits(String(Math.min(amt, 2500)));\n\n // Pre-flight balance check\n try {\n const publicClient = createPublicClient({ chain: base, transport: http(BASE_RPC_URL) });\n const balance = await publicClient.readContract({\n address: USDC_ADDRESS,\n abi: [\n {\n name: \"balanceOf\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [{ name: \"account\", type: \"address\" }],\n outputs: [{ name: \"\", type: \"uint256\" }],\n },\n ] as const,\n functionName: \"balanceOf\",\n args: [walletAddress],\n });\n if (balance < amountUnits) {\n const available = Number(formatUnits(balance, 6));\n throw new OfframpError(\n `Insufficient USDC balance. Have ${available.toFixed(2)}, need ${truncatedAmount}.`,\n \"VALIDATION\",\n );\n }\n } catch (err) {\n if (err instanceof OfframpError) throw err;\n }\n\n const client = createSdkClient(walletClient);\n const txOverrides = { referrer: [REFERRER] };\n\n // Approve\n onProgress?.({ step: \"approving\" });\n try {\n await client.ensureAllowance({\n token: USDC_ADDRESS,\n amount: amountUnits,\n escrowAddress: ESCROW_ADDRESS,\n maxApprove: false,\n txOverrides,\n });\n } catch (err) {\n if (isUserCancellation(err))\n throw new OfframpError(\"User cancelled\", \"USER_CANCELLED\", \"approving\", err);\n const detail = err instanceof Error ? err.message : String(err);\n throw new OfframpError(`USDC approval failed: ${detail}`, \"APPROVAL_FAILED\", \"approving\", err);\n }\n\n // Register payee\n onProgress?.({ step: \"registering\" });\n let hashedOnchainId: string;\n try {\n const canonicalName = platformId.startsWith(\"zelle\") ? \"zelle\" : platformId;\n const depositData = buildDepositData(platformId, normalizedIdentifier);\n hashedOnchainId = await registerPayeeDetails(canonicalName, depositData);\n } catch (err) {\n throw new OfframpError(\"Payee registration failed\", \"REGISTRATION_FAILED\", \"registering\", err);\n }\n\n // Create deposit\n onProgress?.({ step: \"depositing\" });\n\n const conversionRates: Array<Array<{ currency: CurrencyType; conversionRate: string }>> = [\n [{ currency: currencyCode as CurrencyType, conversionRate: \"1\" }],\n ];\n\n const baseCurrenciesOverride = mapConversionRatesToOnchainMinRate(conversionRates, 1);\n const currenciesOverride = attachOracleConfig(baseCurrenciesOverride, conversionRates);\n\n let hash: `0x${string}`;\n try {\n const result = await client.createDeposit({\n token: USDC_ADDRESS,\n amount: amountUnits,\n retainOnEmpty: false,\n intentAmountRange: { min: minUnits, max: maxUnits },\n processorNames: [platformId],\n conversionRates,\n payeeDetailsHashes: [hashedOnchainId],\n paymentMethodsOverride: [methodHash],\n paymentMethodDataOverride: [\n {\n intentGatingService: GATING_SERVICE_ADDRESS,\n payeeDetails: hashedOnchainId as `0x${string}`,\n data: \"0x\" as `0x${string}`,\n },\n ],\n currenciesOverride,\n escrowAddress: ESCROW_ADDRESS,\n txOverrides,\n });\n if (!result?.hash) throw new Error(\"No transaction hash returned\");\n hash = result.hash;\n } catch (err) {\n if (isUserCancellation(err))\n throw new OfframpError(\"User cancelled\", \"USER_CANCELLED\", \"depositing\", err);\n const detail = err instanceof Error ? err.message : String(err);\n throw new OfframpError(\n `Deposit transaction failed: ${detail}`,\n \"DEPOSIT_FAILED\",\n \"depositing\",\n err,\n );\n }\n\n // Confirm\n onProgress?.({ step: \"confirming\", txHash: hash });\n let depositId = \"\";\n\n const receiptClient = client as {\n waitForTransactionReceipt?: (p: {\n hash: `0x${string}`;\n confirmations?: number;\n }) => Promise<{ logs: Array<{ topics?: Hex[]; data?: Hex }> }>;\n };\n if (typeof receiptClient.waitForTransactionReceipt === \"function\") {\n try {\n const receipt = await receiptClient.waitForTransactionReceipt({ hash, confirmations: 1 });\n depositId = extractDepositIdFromLogs(receipt.logs) || \"\";\n } catch {\n /* fall through to indexer */\n }\n }\n\n if (!depositId) {\n let delay = INDEXER_INITIAL_DELAY_MS;\n for (let attempt = 0; attempt < INDEXER_MAX_ATTEMPTS && !depositId; attempt++) {\n try {\n const deps = (await client.indexer.getDepositsWithRelations(\n { depositor: walletAddress },\n { limit: 25 },\n )) as Array<{ txHash?: string; depositId: string }>;\n const hit = deps.find((d) => (d?.txHash || \"\").toLowerCase() === hash.toLowerCase());\n if (hit) {\n depositId = String(hit.depositId);\n break;\n }\n } catch {\n /* continue */\n }\n await new Promise((r) => setTimeout(r, delay));\n delay = Math.min(INDEXER_MAX_DELAY_MS, Math.floor(delay * 1.7));\n }\n }\n\n if (!depositId) {\n throw new OfframpError(\n \"Deposit created on-chain but could not confirm deposit ID. Your funds are safe. Call offramp() again to resume delegation.\",\n \"CONFIRMATION_FAILED\",\n \"confirming\",\n undefined,\n { txHash: hash },\n );\n }\n\n // Delegate\n onProgress?.({ step: \"delegating\", txHash: hash, depositId });\n try {\n await client.setRateManager({\n depositId: BigInt(depositId),\n rateManagerAddress: RATE_MANAGER_REGISTRY_ADDRESS,\n rateManagerId: DELEGATE_RATE_MANAGER_ID,\n escrowAddress: ESCROW_ADDRESS,\n txOverrides,\n });\n } catch (delegationError) {\n if (isUserCancellation(delegationError)) {\n throw new OfframpError(\n \"User cancelled delegation\",\n \"USER_CANCELLED\",\n \"delegating\",\n delegationError,\n { txHash: hash, depositId },\n );\n }\n throw new OfframpError(\n \"Deposit created but delegation failed. Call offramp() again to resume delegation.\",\n \"DELEGATION_FAILED\",\n \"delegating\",\n delegationError,\n { txHash: hash, depositId },\n );\n }\n\n // OTC restriction (optional)\n let otcLink: string | undefined;\n if (params.otcTaker) {\n onProgress?.({ step: \"restricting\", txHash: hash, depositId });\n try {\n const otcResult = await enableOtc(walletClient, depositId, params.otcTaker);\n otcLink = otcResult.otcLink;\n } catch (otcError) {\n if (isUserCancellation(otcError)) {\n throw new OfframpError(\n \"User cancelled OTC restriction\",\n \"USER_CANCELLED\",\n \"restricting\",\n otcError,\n {\n txHash: hash,\n depositId,\n },\n );\n }\n throw new OfframpError(\n \"Deposit created and delegated but OTC restriction failed. Use enableOtc() to retry.\",\n \"DEPOSIT_FAILED\",\n \"restricting\",\n otcError,\n { txHash: hash, depositId },\n );\n }\n }\n\n onProgress?.({ step: \"done\", txHash: hash, depositId });\n return { depositId, txHash: hash, resumed: false, otcLink };\n}\n","import { getContracts, getGatingServiceAddress } from \"@zkp2p/sdk\";\n\nexport const BASE_CHAIN_ID = 8453;\nexport const RUNTIME_ENV = \"production\" as const;\nexport const API_BASE_URL = \"https://api.zkp2p.xyz\";\nexport const BASE_RPC_URL = \"https://mainnet.base.org\";\n\nconst contracts = getContracts(BASE_CHAIN_ID, RUNTIME_ENV);\nconst addresses = contracts.addresses;\n\nconst addrs = addresses as unknown as Record<string, string>;\nexport const USDC_ADDRESS = (addrs.token ||\n \"0x833589fcd6edb6e08f4c7c32d4f71b54bda02913\") as `0x${string}`;\nexport const ESCROW_ADDRESS = (addrs.escrowV2 || addrs.escrow || \"\") as `0x${string}`;\nexport const GATING_SERVICE_ADDRESS = getGatingServiceAddress(\n BASE_CHAIN_ID,\n RUNTIME_ENV,\n) as `0x${string}`;\n\nexport const DELEGATE_RATE_MANAGER_ID =\n \"0x8666d6fb0f6797c56e95339fd7ca82fdd348b9db200e10a4c4aa0a0b879fc41c\" as `0x${string}`;\nexport const RATE_MANAGER_REGISTRY_ADDRESS =\n \"0xeed7db23e724ac4590d6db6f78fda6db203535f3\" as `0x${string}`;\n\nexport const REFERRER = \"galleonlabs\";\n\nexport const MIN_DEPOSIT_USDC = 1;\nexport const MIN_ORDER_USDC = 1;\nexport const MAX_ORDER_USDC = 2500;\n\nexport const INDEXER_MAX_ATTEMPTS = 12;\nexport const INDEXER_INITIAL_DELAY_MS = 1000;\nexport const INDEXER_MAX_DELAY_MS = 10_000;\n\nexport const PAYEE_REGISTRATION_TIMEOUT_MS = 8000;\n","import {\n currencyInfo,\n getCurrencyInfoFromHash,\n getPaymentMethodsCatalog,\n resolvePaymentMethodHash,\n} from \"@zkp2p/sdk\";\nimport { z } from \"zod\";\nimport { BASE_CHAIN_ID, RUNTIME_ENV } from \"./config\";\n\n/* ── Internal types ───────────────────────────────────────────────── */\n\ntype CatalogEntry = { currencies?: string[]; paymentMethodHash?: `0x${string}` };\nconst PAYMENT_CATALOG = getPaymentMethodsCatalog(BASE_CHAIN_ID, RUNTIME_ENV) as Record<\n string,\n CatalogEntry\n>;\n\ntype CurrencyCode = keyof typeof currencyInfo;\n\nconst ZELLE_HASH_LOOKUP_NAMES = [\"zelle\", \"zelle-bofa\", \"zelle-chase\", \"zelle-citi\"] as const;\ntype PaymentMethodLookupName = PlatformId | (typeof ZELLE_HASH_LOOKUP_NAMES)[number];\n\ntype PlatformId =\n | \"venmo\"\n | \"cashapp\"\n | \"chime\"\n | \"revolut\"\n | \"wise\"\n | \"mercadopago\"\n | \"zelle\"\n | \"paypal\"\n | \"monzo\"\n | \"n26\";\n\n/* ── Platform entry type ──────────────────────────────────────────── */\n\nexport interface PlatformEntry {\n readonly id: PlatformId;\n readonly name: string;\n readonly currencies: readonly string[];\n readonly identifier: {\n readonly label: string;\n readonly placeholder: string;\n readonly help: string;\n };\n validate(input: string): { valid: boolean; normalized: string; error?: string };\n}\n\n/* ── Currency resolution ──────────────────────────────────────────── */\n\nconst FALLBACK_CURRENCIES: Record<PlatformId, string[]> = {\n venmo: [\"USD\"],\n cashapp: [\"USD\"],\n chime: [\"USD\"],\n revolut: [\n \"USD\",\n \"EUR\",\n \"GBP\",\n \"SGD\",\n \"NZD\",\n \"AUD\",\n \"CAD\",\n \"HKD\",\n \"MXN\",\n \"SAR\",\n \"AED\",\n \"THB\",\n \"TRY\",\n \"PLN\",\n \"CHF\",\n \"ZAR\",\n \"CZK\",\n \"CNY\",\n \"DKK\",\n \"HUF\",\n \"NOK\",\n \"RON\",\n \"SEK\",\n ],\n wise: [\n \"USD\",\n \"CNY\",\n \"EUR\",\n \"GBP\",\n \"AUD\",\n \"NZD\",\n \"CAD\",\n \"AED\",\n \"CHF\",\n \"ZAR\",\n \"SGD\",\n \"ILS\",\n \"HKD\",\n \"JPY\",\n \"PLN\",\n \"TRY\",\n \"IDR\",\n \"KES\",\n \"MYR\",\n \"MXN\",\n \"THB\",\n \"VND\",\n \"UGX\",\n \"CZK\",\n \"DKK\",\n \"HUF\",\n \"INR\",\n \"NOK\",\n \"PHP\",\n \"RON\",\n \"SEK\",\n ],\n mercadopago: [\"ARS\"],\n zelle: [\"USD\"],\n paypal: [\"USD\", \"EUR\", \"GBP\", \"SGD\", \"NZD\", \"AUD\", \"CAD\"],\n monzo: [\"GBP\"],\n n26: [\"EUR\"],\n};\n\nfunction gatherCatalogHashes(platform: PlatformId): string[] {\n if (platform === \"zelle\") {\n return Object.entries(PAYMENT_CATALOG)\n .filter(([key]) => key.startsWith(\"zelle\"))\n .flatMap(([, entry]) => entry.currencies ?? []);\n }\n return PAYMENT_CATALOG[platform]?.currencies ?? [];\n}\n\nfunction resolveSupportedCurrencies(platform: PlatformId): string[] {\n const codes = new Set<string>();\n for (const hash of gatherCatalogHashes(platform)) {\n const info = getCurrencyInfoFromHash(hash);\n if (info?.currencyCode && currencyInfo[info.currencyCode as CurrencyCode]) {\n codes.add(info.currencyCode);\n }\n }\n if (!codes.size) {\n for (const code of FALLBACK_CURRENCIES[platform] ?? []) codes.add(code);\n }\n return Array.from(codes).sort();\n}\n\n/* ── Validation schemas ───────────────────────────────────────────── */\n\ninterface PlatformBlueprint {\n id: PlatformId;\n name: string;\n identifierLabel: string;\n placeholder: string;\n helperText: string;\n validation: z.ZodType<string>;\n transform?: (value: string) => string;\n}\n\nconst BLUEPRINTS: Record<PlatformId, PlatformBlueprint> = {\n venmo: {\n id: \"venmo\",\n name: \"Venmo\",\n identifierLabel: \"Username\",\n placeholder: \"venmo username (no @)\",\n helperText: \"Username without @ (publicly discoverable)\",\n validation: z\n .string()\n .min(1)\n .regex(/^[a-zA-Z0-9_-]+$/),\n transform: (v) => v.replace(/^@+/, \"\"),\n },\n cashapp: {\n id: \"cashapp\",\n name: \"Cash App\",\n identifierLabel: \"Cashtag\",\n placeholder: \"cashtag (no $)\",\n helperText: \"Cashtag without $ (publicly discoverable)\",\n validation: z\n .string()\n .min(1)\n .regex(/^[a-zA-Z0-9]+$/),\n transform: (v) => v.replace(/^\\$+/, \"\"),\n },\n chime: {\n id: \"chime\",\n name: \"Chime\",\n identifierLabel: \"ChimeSign\",\n placeholder: \"$chimesign\",\n helperText: \"ChimeSign with $ (must be discoverable)\",\n validation: z\n .string()\n .min(2)\n .regex(/^\\$[a-zA-Z0-9]+$/),\n transform: (v) => {\n const t = v.trim().toLowerCase();\n return t.startsWith(\"$\") ? t : `$${t}`;\n },\n },\n revolut: {\n id: \"revolut\",\n name: \"Revolut\",\n identifierLabel: \"Revtag\",\n placeholder: \"revtag (no @)\",\n helperText: \"Revtag without @ (must be public)\",\n validation: z\n .string()\n .min(1)\n .regex(/^[a-zA-Z0-9]+$/),\n transform: (v) => v.replace(/^@+/, \"\").trim(),\n },\n wise: {\n id: \"wise\",\n name: \"Wise\",\n identifierLabel: \"Wisetag\",\n placeholder: \"wisetag (no @)\",\n helperText: \"Your Wise @wisetag (no @)\",\n validation: z\n .string()\n .min(1)\n .regex(/^[a-zA-Z0-9_-]+$/),\n transform: (v) => v.replace(/^@+/, \"\").trim(),\n },\n mercadopago: {\n id: \"mercadopago\",\n name: \"Mercado Pago\",\n identifierLabel: \"CVU\",\n placeholder: \"22-digit CVU\",\n helperText: \"CVU must be exactly 22 digits\",\n validation: z\n .string()\n .length(22)\n .regex(/^\\d{22}$/),\n },\n zelle: {\n id: \"zelle\",\n name: \"Zelle\",\n identifierLabel: \"Email\",\n placeholder: \"email\",\n helperText: \"Registered Zelle email\",\n validation: z.string().email(),\n },\n paypal: {\n id: \"paypal\",\n name: \"PayPal\",\n identifierLabel: \"Email\",\n placeholder: \"email\",\n helperText: \"Email linked to PayPal account\",\n validation: z.string().email(),\n },\n monzo: {\n id: \"monzo\",\n name: \"Monzo\",\n identifierLabel: \"Username\",\n placeholder: \"monzo.me username\",\n helperText: \"Your Monzo.me username\",\n validation: z\n .string()\n .min(1)\n .regex(/^[a-zA-Z0-9_-]+$/),\n },\n n26: {\n id: \"n26\",\n name: \"N26\",\n identifierLabel: \"IBAN\",\n placeholder: \"IBAN (e.g. DE89...)\",\n helperText: \"Your IBAN (spaces will be removed)\",\n validation: z\n .string()\n .min(15)\n .max(34)\n .regex(/^[A-Z]{2}[0-9]{2}[A-Z0-9]+$/i),\n transform: (v) => v.replace(/\\s/g, \"\").toUpperCase(),\n },\n};\n\n/* ── Build PLATFORMS const ────────────────────────────────────────── */\n\nfunction buildPlatformEntry(bp: PlatformBlueprint): PlatformEntry {\n const currencies = resolveSupportedCurrencies(bp.id);\n return {\n id: bp.id,\n name: bp.name,\n currencies,\n identifier: {\n label: bp.identifierLabel,\n placeholder: bp.placeholder,\n help: bp.helperText,\n },\n validate(input: string) {\n const transformed = bp.transform ? bp.transform(input) : input;\n const result = bp.validation.safeParse(transformed);\n if (!result.success) {\n return {\n valid: false,\n normalized: transformed,\n error: result.error.issues[0]?.message || \"Invalid input\",\n };\n }\n return { valid: true, normalized: transformed };\n },\n };\n}\n\n/** All supported payment platforms. Access via `PLATFORMS.REVOLUT`, `PLATFORMS.WISE`, etc. */\nexport const PLATFORMS = {\n VENMO: buildPlatformEntry(BLUEPRINTS.venmo),\n CASHAPP: buildPlatformEntry(BLUEPRINTS.cashapp),\n CHIME: buildPlatformEntry(BLUEPRINTS.chime),\n REVOLUT: buildPlatformEntry(BLUEPRINTS.revolut),\n WISE: buildPlatformEntry(BLUEPRINTS.wise),\n MERCADO_PAGO: buildPlatformEntry(BLUEPRINTS.mercadopago),\n ZELLE: buildPlatformEntry(BLUEPRINTS.zelle),\n PAYPAL: buildPlatformEntry(BLUEPRINTS.paypal),\n MONZO: buildPlatformEntry(BLUEPRINTS.monzo),\n N26: buildPlatformEntry(BLUEPRINTS.n26),\n} as const;\n\n/** Platform key type for PLATFORMS constant. */\nexport type PlatformKey = keyof typeof PLATFORMS;\n\n/* ── Internal helpers (used by deposit.ts) ─────────────────────────── */\n\nexport function getPlatformById(id: string): PlatformEntry | null {\n return Object.values(PLATFORMS).find((p) => p.id === id) ?? null;\n}\n\nfunction normalizePaymentMethodLookupName(platform: string): PaymentMethodLookupName | null {\n const normalized = platform.trim().toLowerCase();\n if (!normalized) return null;\n if (ZELLE_HASH_LOOKUP_NAMES.includes(normalized as (typeof ZELLE_HASH_LOOKUP_NAMES)[number])) {\n return normalized as PaymentMethodLookupName;\n }\n const ids: readonly string[] = Object.values(PLATFORMS).map((p) => p.id);\n return ids.includes(normalized) ? (normalized as PlatformId) : null;\n}\n\nfunction resolveCanonicalZelleHash(): `0x${string}` | null {\n const direct = PAYMENT_CATALOG.zelle?.paymentMethodHash;\n if (direct) return direct;\n const variant = Object.entries(PAYMENT_CATALOG).find(\n ([name, entry]) => name.startsWith(\"zelle\") && Boolean(entry.paymentMethodHash),\n );\n return variant?.[1]?.paymentMethodHash ?? null;\n}\n\nexport function getPaymentMethodHash(platform: string): `0x${string}` | null {\n const name = normalizePaymentMethodLookupName(platform);\n if (!name) return null;\n const catalogEntry = PAYMENT_CATALOG[name];\n if (catalogEntry?.paymentMethodHash) return catalogEntry.paymentMethodHash;\n if (name === \"zelle\" || name.startsWith(\"zelle-\")) return resolveCanonicalZelleHash();\n const sdkHash = resolvePaymentMethodHash(name);\n return sdkHash ? (sdkHash as `0x${string}`) : null;\n}\n\nexport function getPaymentMethodHashes(platform: string): `0x${string}`[] {\n if (platform !== \"zelle\") {\n const hash = getPaymentMethodHash(platform);\n return hash ? [hash] : [];\n }\n const hashes = new Set<`0x${string}`>();\n const generic = resolvePaymentMethodHash(\"zelle\") as `0x${string}` | undefined;\n if (generic) hashes.add(generic);\n const canonical = resolveCanonicalZelleHash();\n if (canonical) hashes.add(canonical);\n for (const [name, entry] of Object.entries(PAYMENT_CATALOG)) {\n if (name.startsWith(\"zelle\") && entry.paymentMethodHash) {\n hashes.add(entry.paymentMethodHash);\n }\n }\n return Array.from(hashes);\n}\n\nexport function buildDepositData(platform: string, identifier: string): Record<string, string> {\n switch (platform) {\n case \"venmo\":\n return { venmoUsername: identifier, telegramUsername: \"\" };\n case \"cashapp\":\n return { cashtag: identifier, telegramUsername: \"\" };\n case \"chime\":\n return { chimesign: identifier.toLowerCase(), telegramUsername: \"\" };\n case \"revolut\":\n return { revolutUsername: identifier, telegramUsername: \"\" };\n case \"wise\":\n return { wisetag: identifier, telegramUsername: \"\" };\n case \"mercadopago\":\n return { cvu: identifier, telegramUsername: \"\" };\n case \"zelle\":\n return { zelleEmail: identifier, telegramUsername: \"\" };\n case \"paypal\":\n return { paypalEmail: identifier, telegramUsername: \"\" };\n case \"monzo\":\n return { monzoMeUsername: identifier, telegramUsername: \"\" };\n case \"n26\":\n return { iban: identifier, telegramUsername: \"\" };\n default:\n return { identifier, telegramUsername: \"\" };\n }\n}\n","import type { OfframpStep } from \"./types\";\n\nexport type OfframpErrorCode =\n | \"VALIDATION\"\n | \"APPROVAL_FAILED\"\n | \"REGISTRATION_FAILED\"\n | \"DEPOSIT_FAILED\"\n | \"CONFIRMATION_FAILED\"\n | \"DELEGATION_FAILED\"\n | \"USER_CANCELLED\"\n | \"UNSUPPORTED\";\n\nexport class OfframpError extends Error {\n readonly code: OfframpErrorCode;\n readonly step?: OfframpStep;\n override readonly cause?: unknown;\n readonly txHash?: string;\n readonly depositId?: string;\n\n constructor(\n message: string,\n code: OfframpErrorCode,\n step?: OfframpStep,\n cause?: unknown,\n details?: { txHash?: string; depositId?: string },\n ) {\n super(message);\n this.name = \"OfframpError\";\n this.code = code;\n this.step = step;\n this.cause = cause;\n this.txHash = details?.txHash;\n this.depositId = details?.depositId;\n }\n}\n\nexport function isUserCancellation(error: unknown): boolean {\n if (!(error instanceof Error)) return false;\n const msg = error.message.toLowerCase();\n return (\n msg.includes(\"user rejected\") ||\n msg.includes(\"user denied\") ||\n msg.includes(\"user cancelled\") ||\n msg.includes(\"rejected the request\") ||\n msg.includes(\"action_rejected\")\n );\n}\n","import type { WalletClient } from \"viem\";\nimport { isAddress, zeroAddress, type Address } from \"viem\";\nimport WhitelistPreIntentHookABI from \"@zkp2p/contracts-v2/abis/base/WhitelistPreIntentHook.json\";\n\nimport { createSdkClient } from \"./deposit\";\nimport { ESCROW_ADDRESS, REFERRER } from \"./config\";\nimport { OfframpError, isUserCancellation } from \"./errors\";\n\nconst WHITELIST_HOOK_ADDRESS = \"0xda023Ea0d789A41BcF5866F7B6BBd2CaDF9b79B8\" as const;\n\nconst OTC_BASE_URL = \"https://usdctofiat.xyz\";\n\nexport interface EnableOtcResult {\n depositId: string;\n takerAddress: string;\n otcLink: string;\n}\n\n/**\n * Make a deposit private so only one taker wallet can trade against it.\n *\n * Sets the WhitelistPreIntentHook on the deposit and whitelists the taker.\n * If the deposit already has a different taker whitelisted, replaces it.\n *\n * @param walletClient - viem WalletClient with the deposit owner's account\n * @param depositId - The numeric deposit ID (from `OfframpResult.depositId`)\n * @param takerAddress - The Ethereum address allowed to take this order\n * @param escrowAddress - Optional escrow override (defaults to current V3 escrow)\n */\nexport async function enableOtc(\n walletClient: WalletClient,\n depositId: string,\n takerAddress: string,\n escrowAddress?: string,\n): Promise<EnableOtcResult> {\n if (!isAddress(takerAddress)) {\n throw new OfframpError(\"Invalid taker address\", \"VALIDATION\");\n }\n\n const escrow = (escrowAddress || ESCROW_ADDRESS) as Address;\n const taker = takerAddress as Address;\n const depositIdBig = BigInt(depositId);\n const client = createSdkClient(walletClient);\n const txOverrides = { referrer: [REFERRER] };\n\n try {\n // Check current hook state\n const currentHook = (await client.getDepositWhitelistHook(depositIdBig, {\n escrowAddress: escrow,\n })) as Address;\n\n // Remove any existing takers that aren't the desired one\n if (currentHook !== zeroAddress) {\n const isAlready = (await readIsWhitelisted(\n walletClient,\n escrow,\n depositIdBig,\n taker,\n )) as boolean;\n\n if (isAlready) {\n return {\n depositId,\n takerAddress: taker,\n otcLink: getOtcLink(depositId, escrow),\n };\n }\n }\n\n // Add taker to whitelist\n await writeContract(walletClient, \"addToWhitelist\", [escrow, depositIdBig, [taker]]);\n\n // Set hook if not already set\n if (currentHook === zeroAddress) {\n await client.setDepositWhitelistHook({\n depositId: depositIdBig,\n whitelistHook: WHITELIST_HOOK_ADDRESS,\n escrowAddress: escrow,\n txOverrides,\n });\n }\n\n return {\n depositId,\n takerAddress: taker,\n otcLink: getOtcLink(depositId, escrow),\n };\n } catch (err) {\n if (err instanceof OfframpError) throw err;\n if (isUserCancellation(err)) {\n throw new OfframpError(\"User cancelled\", \"USER_CANCELLED\", undefined, err, { depositId });\n }\n const detail = err instanceof Error ? err.message : String(err);\n throw new OfframpError(`Failed to enable OTC: ${detail}`, \"DEPOSIT_FAILED\", undefined, err, {\n depositId,\n });\n }\n}\n\n/**\n * Remove the OTC restriction and make the deposit public again.\n *\n * @param walletClient - viem WalletClient with the deposit owner's account\n * @param depositId - The numeric deposit ID\n * @param escrowAddress - Optional escrow override (defaults to current V3 escrow)\n */\nexport async function disableOtc(\n walletClient: WalletClient,\n depositId: string,\n escrowAddress?: string,\n): Promise<void> {\n const escrow = (escrowAddress || ESCROW_ADDRESS) as Address;\n const client = createSdkClient(walletClient);\n const txOverrides = { referrer: [REFERRER] };\n\n try {\n await client.setDepositWhitelistHook({\n depositId: BigInt(depositId),\n whitelistHook: zeroAddress,\n escrowAddress: escrow,\n txOverrides,\n });\n } catch (err) {\n if (isUserCancellation(err)) {\n throw new OfframpError(\"User cancelled\", \"USER_CANCELLED\", undefined, err, { depositId });\n }\n const detail = err instanceof Error ? err.message : String(err);\n throw new OfframpError(`Failed to disable OTC: ${detail}`, \"DEPOSIT_FAILED\", undefined, err, {\n depositId,\n });\n }\n}\n\n/**\n * Get the OTC deposit link that a taker opens to fill the order.\n *\n * @param depositId - The numeric deposit ID\n * @param escrowAddress - Optional escrow override (defaults to current V3 escrow)\n */\nexport function getOtcLink(depositId: string, escrowAddress?: string): string {\n const escrow = escrowAddress || ESCROW_ADDRESS;\n return `${OTC_BASE_URL}/deposit/${escrow}/${depositId}`;\n}\n\n/* ── Internal helpers ──────────────────────────────────────────────── */\n\nasync function writeContract(\n walletClient: WalletClient,\n functionName: string,\n args: unknown[],\n): Promise<void> {\n const wc = walletClient as unknown as {\n writeContract: (req: {\n address: Address;\n abi: unknown;\n functionName: string;\n args: unknown[];\n }) => Promise<string>;\n };\n if (typeof wc.writeContract !== \"function\") {\n throw new OfframpError(\"Wallet client does not support writeContract\", \"VALIDATION\");\n }\n await wc.writeContract({\n address: WHITELIST_HOOK_ADDRESS,\n abi: WhitelistPreIntentHookABI,\n functionName,\n args,\n });\n}\n\nasync function readIsWhitelisted(\n walletClient: WalletClient,\n escrow: Address,\n depositId: bigint,\n taker: Address,\n): Promise<unknown> {\n const { createPublicClient, http } = await import(\"viem\");\n const { base } = await import(\"viem/chains\");\n const publicClient = createPublicClient({\n chain: base,\n transport: http(\"https://mainnet.base.org\"),\n });\n return publicClient.readContract({\n address: WHITELIST_HOOK_ADDRESS,\n abi: WhitelistPreIntentHookABI,\n functionName: \"isWhitelisted\",\n args: [escrow, depositId, taker],\n });\n}\n","[\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"_orchestratorRegistry\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"constructor\"\n },\n {\n \"inputs\": [],\n \"name\": \"EmptyArray\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"taker\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"escrow\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"depositId\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"TakerNotInWhitelist\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"taker\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"escrow\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"depositId\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"TakerNotWhitelisted\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"caller\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"owner\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"delegate\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"UnauthorizedCallerOrDelegate\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"caller\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"UnauthorizedOrchestratorCaller\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"ZeroAddress\",\n \"type\": \"error\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"escrow\",\n \"type\": \"address\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"uint256\",\n \"name\": \"depositId\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"taker\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"TakerRemovedFromWhitelist\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"escrow\",\n \"type\": \"address\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"uint256\",\n \"name\": \"depositId\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"taker\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"TakerWhitelisted\",\n \"type\": \"event\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"_escrow\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"_depositId\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"address[]\",\n \"name\": \"_takers\",\n \"type\": \"address[]\"\n }\n ],\n \"name\": \"addToWhitelist\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"_escrow\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"_depositId\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"_taker\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"isWhitelisted\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"orchestratorRegistry\",\n \"outputs\": [\n {\n \"internalType\": \"contract IOrchestratorRegistry\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"_escrow\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"_depositId\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"address[]\",\n \"name\": \"_takers\",\n \"type\": \"address[]\"\n }\n ],\n \"name\": \"removeFromWhitelist\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"components\": [\n {\n \"internalType\": \"address\",\n \"name\": \"taker\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"escrow\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"depositId\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"amount\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"to\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"bytes32\",\n \"name\": \"paymentMethod\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"bytes32\",\n \"name\": \"fiatCurrency\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"conversionRate\",\n \"type\": \"uint256\"\n },\n {\n \"components\": [\n {\n \"internalType\": \"address\",\n \"name\": \"recipient\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"fee\",\n \"type\": \"uint256\"\n }\n ],\n \"internalType\": \"struct IReferralFee.ReferralFee[]\",\n \"name\": \"referralFees\",\n \"type\": \"tuple[]\"\n },\n {\n \"internalType\": \"bytes\",\n \"name\": \"preIntentHookData\",\n \"type\": \"bytes\"\n }\n ],\n \"internalType\": \"struct IPreIntentHook.PreIntentContext\",\n \"name\": \"_ctx\",\n \"type\": \"tuple\"\n }\n ],\n \"name\": \"validateSignalIntent\",\n \"outputs\": [],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"whitelist\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n }\n]","import type { WalletClient } from \"viem\";\nimport { formatUnits } from \"viem\";\nimport {\n classifyDelegationState,\n defaultIndexerEndpoint,\n getCurrencyInfoFromHash,\n IndexerClient,\n IndexerDepositService,\n} from \"@zkp2p/sdk\";\n\nimport type { DepositInfo, DepositStatus } from \"./types\";\nimport { createSdkClient } from \"./deposit\";\nimport { PLATFORMS, getPaymentMethodHashes } from \"./platforms\";\nimport {\n DELEGATE_RATE_MANAGER_ID,\n ESCROW_ADDRESS,\n RATE_MANAGER_REGISTRY_ADDRESS,\n REFERRER,\n} from \"./config\";\n\n/* ── Indexer singleton ────────────────────────────────────────────── */\n\nlet indexerService: IndexerDepositService | null = null;\n\nexport function getIndexerService(): IndexerDepositService {\n if (!indexerService) {\n const endpoint = defaultIndexerEndpoint(\"PRODUCTION\");\n const client = new IndexerClient(endpoint);\n indexerService = new IndexerDepositService(client);\n }\n return indexerService;\n}\n\n/* ── Helpers ──────────────────────────────────────────────────────── */\n\ntype IndexerDeposit = {\n id: string;\n depositId: string;\n txHash?: string;\n status: string;\n remainingDeposits: string | null;\n outstandingIntentAmount: string | null;\n totalAmountTaken: string | null;\n fulfilledIntents: number | null;\n escrowAddress: string;\n rateManagerId?: string | null;\n rateManagerAddress?: string | null;\n paymentMethods: Array<{ paymentMethodHash: string }>;\n currencies: Array<{ currencyCode: string; rateSource?: string | null }>;\n};\n\nfunction toBigInt(value: string | null | undefined): bigint {\n try {\n return BigInt(value || \"0\");\n } catch {\n return 0n;\n }\n}\n\nfunction toUsdc(value: string | null | undefined): number {\n return Number(formatUnits(toBigInt(value), 6));\n}\n\nfunction resolveStatus(deposit: IndexerDeposit): DepositStatus {\n if (deposit.status === \"CLOSED\") return \"closed\";\n if (toBigInt(deposit.remainingDeposits) === 0n) return \"empty\";\n return \"active\";\n}\n\nfunction resolveMethodNames(hashes: Array<{ paymentMethodHash: string }>): string[] {\n const names = new Set<string>();\n for (const { paymentMethodHash } of hashes) {\n const normalized = paymentMethodHash.toLowerCase();\n for (const platform of Object.values(PLATFORMS)) {\n const platformHashes = getPaymentMethodHashes(platform.id);\n if (platformHashes.some((h) => h.toLowerCase() === normalized)) {\n names.add(platform.name);\n break;\n }\n }\n }\n return Array.from(names);\n}\n\nfunction mapDeposit(d: IndexerDeposit): DepositInfo {\n const delegationState = classifyDelegationState(\n d.rateManagerId ?? undefined,\n d.rateManagerAddress ?? undefined,\n DELEGATE_RATE_MANAGER_ID,\n RATE_MANAGER_REGISTRY_ADDRESS,\n );\n return {\n depositId: d.depositId,\n compositeId: d.id,\n txHash: d.txHash,\n status: resolveStatus(d),\n remainingUsdc: toUsdc(d.remainingDeposits),\n outstandingUsdc: toUsdc(d.outstandingIntentAmount),\n totalTakenUsdc: toUsdc(d.totalAmountTaken),\n fulfilledIntents: d.fulfilledIntents ?? 0,\n paymentMethods: resolveMethodNames(d.paymentMethods),\n currencies: d.currencies.map((c) => {\n const info = getCurrencyInfoFromHash(c.currencyCode);\n return info?.currencyCode ?? c.currencyCode;\n }),\n rateSource: d.currencies[0]?.rateSource || \"unknown\",\n delegated: delegationState === \"delegated_here\",\n escrowAddress: d.escrowAddress,\n };\n}\n\nfunction extractTxHash(result: unknown): string {\n if (typeof result === \"string\") return result;\n if (result && typeof result === \"object\" && \"hash\" in result)\n return (result as { hash: string }).hash;\n if (result && typeof result === \"object\" && \"transactionHash\" in result)\n return (result as { transactionHash: string }).transactionHash;\n throw new Error(\"Unexpected transaction result format\");\n}\n\n/* ── Public functions ─────────────────────────────────────────────── */\n\n/**\n * List all deposits for a wallet address. Read-only, no wallet needed.\n * Returns active deposits first, then empty, then closed.\n */\nexport async function deposits(walletAddress: string): Promise<DepositInfo[]> {\n const service = getIndexerService();\n const raw = (await service.fetchDepositsWithRelations(\n { depositor: walletAddress as `0x${string}` },\n { limit: 100 },\n )) as IndexerDeposit[];\n\n const statusOrder: Record<DepositStatus, number> = { active: 0, empty: 1, closed: 2 };\n\n return (raw || []).map(mapDeposit).sort((a, b) => {\n const diff = statusOrder[a.status] - statusOrder[b.status];\n if (diff !== 0) return diff;\n return Number(BigInt(b.depositId) - BigInt(a.depositId));\n });\n}\n\n/**\n * Withdraw remaining USDC and close a deposit.\n *\n * @param walletClient - viem WalletClient with the deposit owner's account\n * @param depositId - The numeric deposit ID (from `DepositInfo.depositId`)\n */\nexport async function close(\n walletClient: WalletClient,\n depositId: string,\n escrowAddress?: string,\n): Promise<string> {\n const client = createSdkClient(walletClient);\n const result = await client.withdrawDeposit({\n depositId: BigInt(depositId),\n escrowAddress: (escrowAddress || ESCROW_ADDRESS) as `0x${string}`,\n txOverrides: { referrer: [REFERRER] },\n });\n return extractTxHash(result);\n}\n"],"mappings":"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","names":["import_viem","import_sdk","import_sdk","createPublicClient","http","base","import_viem","import_sdk","extractTxHash","client","txOverrides","offramp"]}
1
+ {"version":3,"sources":["../src/react.ts","../src/hooks/useOfframp.ts","../src/deposit.ts","../src/config.ts","../src/platforms.ts","../src/errors.ts","../src/otc.ts","../../../node_modules/@zkp2p/contracts-v2/abis/base/WhitelistPreIntentHook.json","../src/sdk-client.ts","../src/queries.ts"],"sourcesContent":["export { useOfframp } from \"./hooks/useOfframp\";\nexport type { UseOfframpReturn } from \"./hooks/useOfframp\";\n","import { useCallback, useRef, useState } from \"react\";\nimport type { WalletClient } from \"viem\";\nimport type { OfframpParams, OfframpResult, OfframpStep, DepositInfo } from \"../types\";\nimport { offramp as offrampFn } from \"../deposit\";\nimport { deposits as depositsFn, close as closeFn } from \"../queries\";\nimport { OfframpError } from \"../errors\";\n\nexport interface UseOfframpReturn {\n step: OfframpStep | null;\n txHash: string | null;\n depositId: string | null;\n error: OfframpError | null;\n isLoading: boolean;\n offramp: (walletClient: WalletClient, params: OfframpParams) => Promise<OfframpResult>;\n deposits: (walletAddress: string) => Promise<DepositInfo[]>;\n close: (walletClient: WalletClient, depositId: string, escrowAddress?: string) => Promise<string>;\n reset: () => void;\n}\n\nexport function useOfframp(): UseOfframpReturn {\n const [step, setStep] = useState<OfframpStep | null>(null);\n const [txHash, setTxHash] = useState<string | null>(null);\n const [depositId, setDepositId] = useState<string | null>(null);\n const [error, setError] = useState<OfframpError | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const lockRef = useRef(false);\n\n const reset = useCallback(() => {\n setStep(null);\n setTxHash(null);\n setDepositId(null);\n setError(null);\n setIsLoading(false);\n lockRef.current = false;\n }, []);\n\n const offramp = useCallback(\n async (walletClient: WalletClient, params: OfframpParams): Promise<OfframpResult> => {\n if (lockRef.current) throw new OfframpError(\"Deposit already in progress\", \"VALIDATION\");\n lockRef.current = true;\n setIsLoading(true);\n setError(null);\n setStep(null);\n setTxHash(null);\n setDepositId(null);\n\n try {\n const result = await offrampFn(walletClient, params, (progress) => {\n setStep(progress.step);\n if (progress.txHash) setTxHash(progress.txHash);\n if (progress.depositId) setDepositId(progress.depositId);\n });\n setDepositId(result.depositId);\n setTxHash(result.txHash);\n return result;\n } catch (err) {\n const offrampError =\n err instanceof OfframpError\n ? err\n : new OfframpError(\n err instanceof Error ? err.message : \"Offramp failed\",\n \"DEPOSIT_FAILED\",\n );\n setError(offrampError);\n throw err;\n } finally {\n setIsLoading(false);\n lockRef.current = false;\n }\n },\n [],\n );\n\n return {\n step,\n txHash,\n depositId,\n error,\n isLoading,\n offramp,\n deposits: depositsFn,\n close: closeFn,\n reset,\n };\n}\n","import type { WalletClient } from \"viem\";\nimport { createPublicClient, decodeEventLog, formatUnits, http, parseUnits, type Hex } from \"viem\";\nimport { base } from \"viem/chains\";\nimport {\n getSpreadOracleConfig,\n mapConversionRatesToOnchainMinRate,\n type CurrencyType,\n} from \"@zkp2p/sdk\";\n\nimport {\n API_BASE_URL,\n BASE_RPC_URL,\n DELEGATE_RATE_MANAGER_ID,\n ESCROW_ADDRESS,\n GATING_SERVICE_ADDRESS,\n INDEXER_INITIAL_DELAY_MS,\n INDEXER_MAX_ATTEMPTS,\n INDEXER_MAX_DELAY_MS,\n MIN_DEPOSIT_USDC,\n MIN_ORDER_USDC,\n PAYEE_REGISTRATION_TIMEOUT_MS,\n RATE_MANAGER_REGISTRY_ADDRESS,\n REFERRER,\n USDC_ADDRESS,\n} from \"./config\";\nimport { buildDepositData, getPaymentMethodHash } from \"./platforms\";\nimport { OfframpError, isUserCancellation } from \"./errors\";\nimport { enableOtc } from \"./otc\";\nimport { getIndexerService } from \"./queries\";\nimport { createSdkClient } from \"./sdk-client\";\nimport type { OfframpParams, OfframpResult, OnProgress } from \"./types\";\n\nexport { createSdkClient };\n\n/* ── Helpers ──────────────────────────────────────────────────────── */\n\nfunction usdcToUnits(amount: string): bigint {\n return parseUnits(amount, 6);\n}\n\nconst DEPOSIT_RECEIVED_ABI = [\n {\n type: \"event\" as const,\n name: \"DepositReceived\" as const,\n inputs: [\n { indexed: true, name: \"depositId\", type: \"uint256\" },\n { indexed: true, name: \"depositor\", type: \"address\" },\n { indexed: true, name: \"token\", type: \"address\" },\n { indexed: false, name: \"amount\", type: \"uint256\" },\n {\n indexed: false,\n name: \"intentAmountRange\",\n type: \"tuple\",\n components: [\n { name: \"min\", type: \"uint256\" },\n { name: \"max\", type: \"uint256\" },\n ],\n },\n { indexed: false, name: \"delegate\", type: \"address\" },\n { indexed: false, name: \"intentGuardian\", type: \"address\" },\n ],\n },\n] as const;\n\nfunction extractDepositIdFromLogs(logs: Array<{ topics?: Hex[]; data?: Hex }>): string | null {\n for (const log of logs) {\n if (!log?.topics?.length || !log.data) continue;\n try {\n const decoded = decodeEventLog({\n abi: DEPOSIT_RECEIVED_ABI,\n data: log.data,\n topics: log.topics as [Hex, ...Hex[]],\n });\n if (decoded.eventName !== \"DepositReceived\") continue;\n const args = decoded.args as { depositId?: bigint };\n if (typeof args.depositId === \"bigint\") return args.depositId.toString();\n } catch {\n continue;\n }\n }\n return null;\n}\n\nasync function registerPayeeDetails(\n processorName: string,\n depositData: Record<string, string>,\n): Promise<string> {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), PAYEE_REGISTRATION_TIMEOUT_MS);\n try {\n const res = await fetch(`${API_BASE_URL}/v1/makers/create`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ processorName, depositData }),\n signal: controller.signal,\n });\n if (!res.ok) {\n const txt = await res.text().catch(() => \"\");\n throw new Error(`makers/create failed (${res.status}): ${txt || res.statusText}`);\n }\n const json = (await res.json()) as {\n success: boolean;\n message: string;\n responseObject?: { hashedOnchainId: string };\n };\n if (!json.success || !json.responseObject?.hashedOnchainId) {\n throw new Error(json.message || \"makers/create returned no hashedOnchainId\");\n }\n return json.responseObject.hashedOnchainId;\n } finally {\n clearTimeout(timeout);\n }\n}\n\ntype OnchainCurrencyEntry = {\n code: `0x${string}`;\n minConversionRate: bigint;\n oracleRateConfig?: {\n adapter: `0x${string}`;\n adapterConfig: `0x${string}`;\n spreadBps: number;\n maxStaleness: number;\n };\n};\n\nfunction attachOracleConfig(\n entries: Array<Array<{ code: `0x${string}`; minConversionRate: bigint }>>,\n conversionRates: Array<Array<{ currency: CurrencyType; conversionRate: string }>>,\n): OnchainCurrencyEntry[][] {\n return entries.map((group, gi) =>\n group.map((entry, ci) => {\n const currency = conversionRates[gi]?.[ci]?.currency;\n if (!currency) return entry;\n const oracleConfig = getSpreadOracleConfig(currency);\n if (!oracleConfig) return entry;\n return {\n ...entry,\n oracleRateConfig: {\n adapter: oracleConfig.adapter,\n adapterConfig: oracleConfig.adapterConfig,\n spreadBps: 0,\n maxStaleness: oracleConfig.maxStaleness,\n },\n };\n }),\n );\n}\n\nfunction extractTxHash(result: unknown): string {\n if (typeof result === \"string\") return result;\n if (result && typeof result === \"object\" && \"hash\" in result)\n return (result as { hash: string }).hash;\n if (result && typeof result === \"object\" && \"transactionHash\" in result)\n return (result as { transactionHash: string }).transactionHash;\n throw new Error(\"Unexpected transaction result format\");\n}\n\n/* ── Resume check ─────────────────────────────────────────────────── */\n\ntype IndexerDeposit = {\n depositId: string;\n txHash?: string;\n status: string;\n remainingDeposits: string | null;\n escrowAddress: string;\n rateManagerId?: string | null;\n rateManagerAddress?: string | null;\n};\n\nasync function findUndelegatedDeposit(walletAddress: string): Promise<IndexerDeposit | null> {\n try {\n const service = getIndexerService();\n const raw = (await service.fetchDepositsWithRelations(\n { depositor: walletAddress as `0x${string}` },\n { limit: 50 },\n )) as IndexerDeposit[];\n\n const escrowLower = ESCROW_ADDRESS.toLowerCase();\n const delegateIdLower = DELEGATE_RATE_MANAGER_ID.toLowerCase();\n const undelegated = (raw || []).filter((d) => {\n if (d.status === \"CLOSED\") return false;\n if (d.escrowAddress.toLowerCase() !== escrowLower) return false;\n const remaining = (() => {\n try {\n return BigInt(d.remainingDeposits || \"0\");\n } catch {\n return 0n;\n }\n })();\n if (remaining === 0n) return false;\n return (d.rateManagerId ?? \"\").toLowerCase() !== delegateIdLower;\n });\n // Most recent first\n undelegated.sort((a, b) => Number(BigInt(b.depositId) - BigInt(a.depositId)));\n return undelegated[0] ?? null;\n } catch {\n return null;\n }\n}\n\n/* ── Main offramp flow ────────────────────────────────────────────── */\n\n/**\n * Create a USDC-to-fiat offramp deposit and delegate it to the vault.\n *\n * **Resumable**: if an existing undelegated deposit is found for this wallet,\n * the flow skips directly to delegation instead of creating a new deposit.\n */\nexport async function offramp(\n walletClient: WalletClient,\n params: OfframpParams,\n onProgress?: OnProgress,\n): Promise<OfframpResult> {\n const { amount, platform, currency, identifier } = params;\n const platformId = platform.id;\n const currencyCode = currency.code;\n\n // 1. Validate\n if (!walletClient.account?.address) {\n throw new OfframpError(\"Wallet client has no account. Connect a wallet first.\", \"VALIDATION\");\n }\n const walletAddress = walletClient.account.address;\n\n const amt = parseFloat(amount);\n if (!Number.isFinite(amt) || amt < MIN_DEPOSIT_USDC) {\n throw new OfframpError(`Minimum deposit is ${MIN_DEPOSIT_USDC} USDC`, \"VALIDATION\");\n }\n\n if (!platform.currencies.includes(currencyCode)) {\n throw new OfframpError(`${currencyCode} is not supported on ${platform.name}`, \"UNSUPPORTED\");\n }\n\n const validation = platform.validate(identifier);\n if (!validation.valid) {\n throw new OfframpError(validation.error || \"Invalid identifier\", \"VALIDATION\");\n }\n const normalizedIdentifier = validation.normalized;\n\n const methodHash = getPaymentMethodHash(platformId);\n if (!methodHash) {\n throw new OfframpError(`${platform.name} is not currently supported`, \"UNSUPPORTED\");\n }\n\n // 2. Check for existing undelegated deposit (resume path)\n const existing = await findUndelegatedDeposit(walletAddress);\n if (existing) {\n onProgress?.({ step: \"resuming\", depositId: existing.depositId });\n\n const client = createSdkClient(walletClient);\n const txOverrides = { referrer: [REFERRER] };\n\n try {\n const result = await client.setRateManager({\n depositId: BigInt(existing.depositId),\n rateManagerAddress: RATE_MANAGER_REGISTRY_ADDRESS,\n rateManagerId: DELEGATE_RATE_MANAGER_ID,\n escrowAddress: existing.escrowAddress as `0x${string}`,\n txOverrides,\n });\n const txHash = extractTxHash(result);\n onProgress?.({ step: \"done\", txHash, depositId: existing.depositId });\n return { depositId: existing.depositId, txHash, resumed: true };\n } catch (err) {\n if (isUserCancellation(err))\n throw new OfframpError(\"User cancelled\", \"USER_CANCELLED\", \"resuming\", err);\n throw new OfframpError(\n \"Found undelegated deposit but delegation failed. Try again.\",\n \"DELEGATION_FAILED\",\n \"resuming\",\n err,\n { depositId: existing.depositId, txHash: existing.txHash },\n );\n }\n }\n\n // 3. Full flow — no existing deposit to resume\n const truncatedAmount = amt.toFixed(6).replace(/\\.?0+$/, \"\");\n const amountUnits = usdcToUnits(truncatedAmount);\n const minUnits = usdcToUnits(String(MIN_ORDER_USDC));\n const maxUnits = usdcToUnits(String(Math.min(amt, 2500)));\n\n // Pre-flight balance check\n try {\n const publicClient = createPublicClient({ chain: base, transport: http(BASE_RPC_URL) });\n const balance = await publicClient.readContract({\n address: USDC_ADDRESS,\n abi: [\n {\n name: \"balanceOf\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [{ name: \"account\", type: \"address\" }],\n outputs: [{ name: \"\", type: \"uint256\" }],\n },\n ] as const,\n functionName: \"balanceOf\",\n args: [walletAddress],\n });\n if (balance < amountUnits) {\n const available = Number(formatUnits(balance, 6));\n throw new OfframpError(\n `Insufficient USDC balance. Have ${available.toFixed(2)}, need ${truncatedAmount}.`,\n \"VALIDATION\",\n );\n }\n } catch (err) {\n if (err instanceof OfframpError) throw err;\n }\n\n const client = createSdkClient(walletClient);\n const txOverrides = { referrer: [REFERRER] };\n\n // Approve\n onProgress?.({ step: \"approving\" });\n try {\n await client.ensureAllowance({\n token: USDC_ADDRESS,\n amount: amountUnits,\n escrowAddress: ESCROW_ADDRESS,\n maxApprove: false,\n txOverrides,\n });\n } catch (err) {\n if (isUserCancellation(err))\n throw new OfframpError(\"User cancelled\", \"USER_CANCELLED\", \"approving\", err);\n const detail = err instanceof Error ? err.message : String(err);\n throw new OfframpError(`USDC approval failed: ${detail}`, \"APPROVAL_FAILED\", \"approving\", err);\n }\n\n // Register payee\n onProgress?.({ step: \"registering\" });\n let hashedOnchainId: string;\n try {\n const canonicalName = platformId.startsWith(\"zelle\") ? \"zelle\" : platformId;\n const depositData = buildDepositData(platformId, normalizedIdentifier);\n hashedOnchainId = await registerPayeeDetails(canonicalName, depositData);\n } catch (err) {\n throw new OfframpError(\"Payee registration failed\", \"REGISTRATION_FAILED\", \"registering\", err);\n }\n\n // Create deposit\n onProgress?.({ step: \"depositing\" });\n\n const conversionRates: Array<Array<{ currency: CurrencyType; conversionRate: string }>> = [\n [{ currency: currencyCode as CurrencyType, conversionRate: \"1\" }],\n ];\n\n const baseCurrenciesOverride = mapConversionRatesToOnchainMinRate(conversionRates, 1);\n const currenciesOverride = attachOracleConfig(baseCurrenciesOverride, conversionRates);\n\n let hash: `0x${string}`;\n try {\n const result = await client.createDeposit({\n token: USDC_ADDRESS,\n amount: amountUnits,\n retainOnEmpty: false,\n intentAmountRange: { min: minUnits, max: maxUnits },\n processorNames: [platformId],\n conversionRates,\n payeeDetailsHashes: [hashedOnchainId],\n paymentMethodsOverride: [methodHash],\n paymentMethodDataOverride: [\n {\n intentGatingService: GATING_SERVICE_ADDRESS,\n payeeDetails: hashedOnchainId as `0x${string}`,\n data: \"0x\" as `0x${string}`,\n },\n ],\n currenciesOverride,\n escrowAddress: ESCROW_ADDRESS,\n txOverrides,\n });\n if (!result?.hash) throw new Error(\"No transaction hash returned\");\n hash = result.hash;\n } catch (err) {\n if (isUserCancellation(err))\n throw new OfframpError(\"User cancelled\", \"USER_CANCELLED\", \"depositing\", err);\n const detail = err instanceof Error ? err.message : String(err);\n throw new OfframpError(\n `Deposit transaction failed: ${detail}`,\n \"DEPOSIT_FAILED\",\n \"depositing\",\n err,\n );\n }\n\n // Confirm\n onProgress?.({ step: \"confirming\", txHash: hash });\n let depositId = \"\";\n\n const receiptClient = client as {\n waitForTransactionReceipt?: (p: {\n hash: `0x${string}`;\n confirmations?: number;\n }) => Promise<{ logs: Array<{ topics?: Hex[]; data?: Hex }> }>;\n };\n if (typeof receiptClient.waitForTransactionReceipt === \"function\") {\n try {\n const receipt = await receiptClient.waitForTransactionReceipt({ hash, confirmations: 1 });\n depositId = extractDepositIdFromLogs(receipt.logs) || \"\";\n } catch {\n /* fall through to indexer */\n }\n }\n\n if (!depositId) {\n let delay = INDEXER_INITIAL_DELAY_MS;\n for (let attempt = 0; attempt < INDEXER_MAX_ATTEMPTS && !depositId; attempt++) {\n try {\n const deps = (await client.indexer.getDepositsWithRelations(\n { depositor: walletAddress },\n { limit: 25 },\n )) as Array<{ txHash?: string; depositId: string }>;\n const hit = deps.find((d) => (d?.txHash || \"\").toLowerCase() === hash.toLowerCase());\n if (hit) {\n depositId = String(hit.depositId);\n break;\n }\n } catch {\n /* continue */\n }\n await new Promise((r) => setTimeout(r, delay));\n delay = Math.min(INDEXER_MAX_DELAY_MS, Math.floor(delay * 1.7));\n }\n }\n\n if (!depositId) {\n throw new OfframpError(\n \"Deposit created on-chain but could not confirm deposit ID. Your funds are safe. Call offramp() again to resume delegation.\",\n \"CONFIRMATION_FAILED\",\n \"confirming\",\n undefined,\n { txHash: hash },\n );\n }\n\n // Delegate\n onProgress?.({ step: \"delegating\", txHash: hash, depositId });\n try {\n await client.setRateManager({\n depositId: BigInt(depositId),\n rateManagerAddress: RATE_MANAGER_REGISTRY_ADDRESS,\n rateManagerId: DELEGATE_RATE_MANAGER_ID,\n escrowAddress: ESCROW_ADDRESS,\n txOverrides,\n });\n } catch (delegationError) {\n if (isUserCancellation(delegationError)) {\n throw new OfframpError(\n \"User cancelled delegation\",\n \"USER_CANCELLED\",\n \"delegating\",\n delegationError,\n { txHash: hash, depositId },\n );\n }\n throw new OfframpError(\n \"Deposit created but delegation failed. Call offramp() again to resume delegation.\",\n \"DELEGATION_FAILED\",\n \"delegating\",\n delegationError,\n { txHash: hash, depositId },\n );\n }\n\n // OTC restriction (optional)\n let otcLink: string | undefined;\n if (params.otcTaker) {\n onProgress?.({ step: \"restricting\", txHash: hash, depositId });\n try {\n const otcResult = await enableOtc(walletClient, depositId, params.otcTaker);\n otcLink = otcResult.otcLink;\n } catch (otcError) {\n if (isUserCancellation(otcError)) {\n throw new OfframpError(\n \"User cancelled OTC restriction\",\n \"USER_CANCELLED\",\n \"restricting\",\n otcError,\n {\n txHash: hash,\n depositId,\n },\n );\n }\n throw new OfframpError(\n \"Deposit created and delegated but OTC restriction failed. Use enableOtc() to retry.\",\n \"DEPOSIT_FAILED\",\n \"restricting\",\n otcError,\n { txHash: hash, depositId },\n );\n }\n }\n\n onProgress?.({ step: \"done\", txHash: hash, depositId });\n return { depositId, txHash: hash, resumed: false, otcLink };\n}\n","import { getContracts, getGatingServiceAddress } from \"@zkp2p/sdk\";\n\nexport const BASE_CHAIN_ID = 8453;\nexport const RUNTIME_ENV = \"production\" as const;\nexport const API_BASE_URL = \"https://api.zkp2p.xyz\";\nexport const BASE_RPC_URL = \"https://mainnet.base.org\";\n\nconst contracts = getContracts(BASE_CHAIN_ID, RUNTIME_ENV);\nconst addresses = contracts.addresses;\n\nconst addrs = addresses as unknown as Record<string, string>;\nexport const USDC_ADDRESS = (addrs.token ||\n \"0x833589fcd6edb6e08f4c7c32d4f71b54bda02913\") as `0x${string}`;\nexport const ESCROW_ADDRESS = (addrs.escrowV2 || addrs.escrow || \"\") as `0x${string}`;\nexport const GATING_SERVICE_ADDRESS = getGatingServiceAddress(\n BASE_CHAIN_ID,\n RUNTIME_ENV,\n) as `0x${string}`;\n\nexport const DELEGATE_RATE_MANAGER_ID =\n \"0x8666d6fb0f6797c56e95339fd7ca82fdd348b9db200e10a4c4aa0a0b879fc41c\" as `0x${string}`;\nexport const RATE_MANAGER_REGISTRY_ADDRESS =\n \"0xeed7db23e724ac4590d6db6f78fda6db203535f3\" as `0x${string}`;\n\nexport const REFERRER = \"galleonlabs\";\n\nexport const MIN_DEPOSIT_USDC = 1;\nexport const MIN_ORDER_USDC = 1;\nexport const MAX_ORDER_USDC = 2500;\n\nexport const INDEXER_MAX_ATTEMPTS = 12;\nexport const INDEXER_INITIAL_DELAY_MS = 1000;\nexport const INDEXER_MAX_DELAY_MS = 10_000;\n\nexport const PAYEE_REGISTRATION_TIMEOUT_MS = 8000;\n","import {\n currencyInfo,\n getCurrencyInfoFromHash,\n getPaymentMethodsCatalog,\n resolvePaymentMethodHash,\n} from \"@zkp2p/sdk\";\nimport { z } from \"zod\";\nimport { BASE_CHAIN_ID, RUNTIME_ENV } from \"./config\";\n\n/* ── Internal types ───────────────────────────────────────────────── */\n\ntype CatalogEntry = { currencies?: string[]; paymentMethodHash?: `0x${string}` };\nconst PAYMENT_CATALOG = getPaymentMethodsCatalog(BASE_CHAIN_ID, RUNTIME_ENV) as Record<\n string,\n CatalogEntry\n>;\n\ntype CurrencyCode = keyof typeof currencyInfo;\n\nconst ZELLE_HASH_LOOKUP_NAMES = [\"zelle\", \"zelle-bofa\", \"zelle-chase\", \"zelle-citi\"] as const;\ntype PaymentMethodLookupName = PlatformId | (typeof ZELLE_HASH_LOOKUP_NAMES)[number];\n\ntype PlatformId =\n | \"venmo\"\n | \"cashapp\"\n | \"chime\"\n | \"revolut\"\n | \"wise\"\n | \"mercadopago\"\n | \"zelle\"\n | \"paypal\"\n | \"monzo\"\n | \"n26\";\n\n/* ── Platform entry type ──────────────────────────────────────────── */\n\nexport interface PlatformEntry {\n readonly id: PlatformId;\n readonly name: string;\n readonly currencies: readonly string[];\n readonly identifier: {\n readonly label: string;\n readonly placeholder: string;\n readonly help: string;\n };\n validate(input: string): { valid: boolean; normalized: string; error?: string };\n}\n\n/* ── Currency resolution ──────────────────────────────────────────── */\n\nconst FALLBACK_CURRENCIES: Record<PlatformId, string[]> = {\n venmo: [\"USD\"],\n cashapp: [\"USD\"],\n chime: [\"USD\"],\n revolut: [\n \"USD\",\n \"EUR\",\n \"GBP\",\n \"SGD\",\n \"NZD\",\n \"AUD\",\n \"CAD\",\n \"HKD\",\n \"MXN\",\n \"SAR\",\n \"AED\",\n \"THB\",\n \"TRY\",\n \"PLN\",\n \"CHF\",\n \"ZAR\",\n \"CZK\",\n \"CNY\",\n \"DKK\",\n \"HUF\",\n \"NOK\",\n \"RON\",\n \"SEK\",\n ],\n wise: [\n \"USD\",\n \"CNY\",\n \"EUR\",\n \"GBP\",\n \"AUD\",\n \"NZD\",\n \"CAD\",\n \"AED\",\n \"CHF\",\n \"ZAR\",\n \"SGD\",\n \"ILS\",\n \"HKD\",\n \"JPY\",\n \"PLN\",\n \"TRY\",\n \"IDR\",\n \"KES\",\n \"MYR\",\n \"MXN\",\n \"THB\",\n \"VND\",\n \"UGX\",\n \"CZK\",\n \"DKK\",\n \"HUF\",\n \"INR\",\n \"NOK\",\n \"PHP\",\n \"RON\",\n \"SEK\",\n ],\n mercadopago: [\"ARS\"],\n zelle: [\"USD\"],\n paypal: [\"USD\", \"EUR\", \"GBP\", \"SGD\", \"NZD\", \"AUD\", \"CAD\"],\n monzo: [\"GBP\"],\n n26: [\"EUR\"],\n};\n\nfunction gatherCatalogHashes(platform: PlatformId): string[] {\n if (platform === \"zelle\") {\n return Object.entries(PAYMENT_CATALOG)\n .filter(([key]) => key.startsWith(\"zelle\"))\n .flatMap(([, entry]) => entry.currencies ?? []);\n }\n return PAYMENT_CATALOG[platform]?.currencies ?? [];\n}\n\nfunction resolveSupportedCurrencies(platform: PlatformId): string[] {\n const codes = new Set<string>();\n for (const hash of gatherCatalogHashes(platform)) {\n const info = getCurrencyInfoFromHash(hash);\n if (info?.currencyCode && currencyInfo[info.currencyCode as CurrencyCode]) {\n codes.add(info.currencyCode);\n }\n }\n if (!codes.size) {\n for (const code of FALLBACK_CURRENCIES[platform] ?? []) codes.add(code);\n }\n return Array.from(codes).sort();\n}\n\n/* ── Validation schemas ───────────────────────────────────────────── */\n\ninterface PlatformBlueprint {\n id: PlatformId;\n name: string;\n identifierLabel: string;\n placeholder: string;\n helperText: string;\n validation: z.ZodType<string>;\n transform?: (value: string) => string;\n}\n\nconst BLUEPRINTS: Record<PlatformId, PlatformBlueprint> = {\n venmo: {\n id: \"venmo\",\n name: \"Venmo\",\n identifierLabel: \"Username\",\n placeholder: \"venmo username (no @)\",\n helperText: \"Username without @ (publicly discoverable)\",\n validation: z\n .string()\n .min(1)\n .regex(/^[a-zA-Z0-9_-]+$/),\n transform: (v) => v.replace(/^@+/, \"\"),\n },\n cashapp: {\n id: \"cashapp\",\n name: \"Cash App\",\n identifierLabel: \"Cashtag\",\n placeholder: \"cashtag (no $)\",\n helperText: \"Cashtag without $ (publicly discoverable)\",\n validation: z\n .string()\n .min(1)\n .regex(/^[a-zA-Z0-9]+$/),\n transform: (v) => v.replace(/^\\$+/, \"\"),\n },\n chime: {\n id: \"chime\",\n name: \"Chime\",\n identifierLabel: \"ChimeSign\",\n placeholder: \"$chimesign\",\n helperText: \"ChimeSign with $ (must be discoverable)\",\n validation: z\n .string()\n .min(2)\n .regex(/^\\$[a-zA-Z0-9]+$/),\n transform: (v) => {\n const t = v.trim().toLowerCase();\n return t.startsWith(\"$\") ? t : `$${t}`;\n },\n },\n revolut: {\n id: \"revolut\",\n name: \"Revolut\",\n identifierLabel: \"Revtag\",\n placeholder: \"revtag (no @)\",\n helperText: \"Revtag without @ (must be public)\",\n validation: z\n .string()\n .min(1)\n .regex(/^[a-zA-Z0-9]+$/),\n transform: (v) => v.replace(/^@+/, \"\").trim(),\n },\n wise: {\n id: \"wise\",\n name: \"Wise\",\n identifierLabel: \"Wisetag\",\n placeholder: \"wisetag (no @)\",\n helperText: \"Your Wise @wisetag (no @)\",\n validation: z\n .string()\n .min(1)\n .regex(/^[a-zA-Z0-9_-]+$/),\n transform: (v) => v.replace(/^@+/, \"\").trim(),\n },\n mercadopago: {\n id: \"mercadopago\",\n name: \"Mercado Pago\",\n identifierLabel: \"CVU\",\n placeholder: \"22-digit CVU\",\n helperText: \"CVU must be exactly 22 digits\",\n validation: z\n .string()\n .length(22)\n .regex(/^\\d{22}$/),\n },\n zelle: {\n id: \"zelle\",\n name: \"Zelle\",\n identifierLabel: \"Email\",\n placeholder: \"email\",\n helperText: \"Registered Zelle email\",\n validation: z.string().email(),\n },\n paypal: {\n id: \"paypal\",\n name: \"PayPal\",\n identifierLabel: \"Email\",\n placeholder: \"email\",\n helperText: \"Email linked to PayPal account\",\n validation: z.string().email(),\n },\n monzo: {\n id: \"monzo\",\n name: \"Monzo\",\n identifierLabel: \"Username\",\n placeholder: \"monzo.me username\",\n helperText: \"Your Monzo.me username\",\n validation: z\n .string()\n .min(1)\n .regex(/^[a-zA-Z0-9_-]+$/),\n },\n n26: {\n id: \"n26\",\n name: \"N26\",\n identifierLabel: \"IBAN\",\n placeholder: \"IBAN (e.g. DE89...)\",\n helperText: \"Your IBAN (spaces will be removed)\",\n validation: z\n .string()\n .min(15)\n .max(34)\n .regex(/^[A-Z]{2}[0-9]{2}[A-Z0-9]+$/i),\n transform: (v) => v.replace(/\\s/g, \"\").toUpperCase(),\n },\n};\n\n/* ── Build PLATFORMS const ────────────────────────────────────────── */\n\nfunction buildPlatformEntry(bp: PlatformBlueprint): PlatformEntry {\n const currencies = resolveSupportedCurrencies(bp.id);\n return {\n id: bp.id,\n name: bp.name,\n currencies,\n identifier: {\n label: bp.identifierLabel,\n placeholder: bp.placeholder,\n help: bp.helperText,\n },\n validate(input: string) {\n const transformed = bp.transform ? bp.transform(input) : input;\n const result = bp.validation.safeParse(transformed);\n if (!result.success) {\n return {\n valid: false,\n normalized: transformed,\n error: result.error.issues[0]?.message || \"Invalid input\",\n };\n }\n return { valid: true, normalized: transformed };\n },\n };\n}\n\n/** All supported payment platforms. Access via `PLATFORMS.REVOLUT`, `PLATFORMS.WISE`, etc. */\nexport const PLATFORMS = {\n VENMO: buildPlatformEntry(BLUEPRINTS.venmo),\n CASHAPP: buildPlatformEntry(BLUEPRINTS.cashapp),\n CHIME: buildPlatformEntry(BLUEPRINTS.chime),\n REVOLUT: buildPlatformEntry(BLUEPRINTS.revolut),\n WISE: buildPlatformEntry(BLUEPRINTS.wise),\n MERCADO_PAGO: buildPlatformEntry(BLUEPRINTS.mercadopago),\n ZELLE: buildPlatformEntry(BLUEPRINTS.zelle),\n PAYPAL: buildPlatformEntry(BLUEPRINTS.paypal),\n MONZO: buildPlatformEntry(BLUEPRINTS.monzo),\n N26: buildPlatformEntry(BLUEPRINTS.n26),\n} as const;\n\n/** Platform key type for PLATFORMS constant. */\nexport type PlatformKey = keyof typeof PLATFORMS;\n\n/* ── Internal helpers (used by deposit.ts) ─────────────────────────── */\n\nexport function getPlatformById(id: string): PlatformEntry | null {\n return Object.values(PLATFORMS).find((p) => p.id === id) ?? null;\n}\n\nfunction normalizePaymentMethodLookupName(platform: string): PaymentMethodLookupName | null {\n const normalized = platform.trim().toLowerCase();\n if (!normalized) return null;\n if (ZELLE_HASH_LOOKUP_NAMES.includes(normalized as (typeof ZELLE_HASH_LOOKUP_NAMES)[number])) {\n return normalized as PaymentMethodLookupName;\n }\n const ids: readonly string[] = Object.values(PLATFORMS).map((p) => p.id);\n return ids.includes(normalized) ? (normalized as PlatformId) : null;\n}\n\nfunction resolveCanonicalZelleHash(): `0x${string}` | null {\n const direct = PAYMENT_CATALOG.zelle?.paymentMethodHash;\n if (direct) return direct;\n const variant = Object.entries(PAYMENT_CATALOG).find(\n ([name, entry]) => name.startsWith(\"zelle\") && Boolean(entry.paymentMethodHash),\n );\n return variant?.[1]?.paymentMethodHash ?? null;\n}\n\nexport function getPaymentMethodHash(platform: string): `0x${string}` | null {\n const name = normalizePaymentMethodLookupName(platform);\n if (!name) return null;\n const catalogEntry = PAYMENT_CATALOG[name];\n if (catalogEntry?.paymentMethodHash) return catalogEntry.paymentMethodHash;\n if (name === \"zelle\" || name.startsWith(\"zelle-\")) return resolveCanonicalZelleHash();\n const sdkHash = resolvePaymentMethodHash(name);\n return sdkHash ? (sdkHash as `0x${string}`) : null;\n}\n\nexport function getPaymentMethodHashes(platform: string): `0x${string}`[] {\n if (platform !== \"zelle\") {\n const hash = getPaymentMethodHash(platform);\n return hash ? [hash] : [];\n }\n const hashes = new Set<`0x${string}`>();\n const generic = resolvePaymentMethodHash(\"zelle\") as `0x${string}` | undefined;\n if (generic) hashes.add(generic);\n const canonical = resolveCanonicalZelleHash();\n if (canonical) hashes.add(canonical);\n for (const [name, entry] of Object.entries(PAYMENT_CATALOG)) {\n if (name.startsWith(\"zelle\") && entry.paymentMethodHash) {\n hashes.add(entry.paymentMethodHash);\n }\n }\n return Array.from(hashes);\n}\n\nexport function buildDepositData(platform: string, identifier: string): Record<string, string> {\n switch (platform) {\n case \"venmo\":\n return { venmoUsername: identifier, telegramUsername: \"\" };\n case \"cashapp\":\n return { cashtag: identifier, telegramUsername: \"\" };\n case \"chime\":\n return { chimesign: identifier.toLowerCase(), telegramUsername: \"\" };\n case \"revolut\":\n return { revolutUsername: identifier, telegramUsername: \"\" };\n case \"wise\":\n return { wisetag: identifier, telegramUsername: \"\" };\n case \"mercadopago\":\n return { cvu: identifier, telegramUsername: \"\" };\n case \"zelle\":\n return { zelleEmail: identifier, telegramUsername: \"\" };\n case \"paypal\":\n return { paypalEmail: identifier, telegramUsername: \"\" };\n case \"monzo\":\n return { monzoMeUsername: identifier, telegramUsername: \"\" };\n case \"n26\":\n return { iban: identifier, telegramUsername: \"\" };\n default:\n return { identifier, telegramUsername: \"\" };\n }\n}\n","import type { OfframpStep } from \"./types\";\n\nexport type OfframpErrorCode =\n | \"VALIDATION\"\n | \"APPROVAL_FAILED\"\n | \"REGISTRATION_FAILED\"\n | \"DEPOSIT_FAILED\"\n | \"CONFIRMATION_FAILED\"\n | \"DELEGATION_FAILED\"\n | \"USER_CANCELLED\"\n | \"UNSUPPORTED\";\n\nexport class OfframpError extends Error {\n readonly code: OfframpErrorCode;\n readonly step?: OfframpStep;\n override readonly cause?: unknown;\n readonly txHash?: string;\n readonly depositId?: string;\n\n constructor(\n message: string,\n code: OfframpErrorCode,\n step?: OfframpStep,\n cause?: unknown,\n details?: { txHash?: string; depositId?: string },\n ) {\n super(message);\n this.name = \"OfframpError\";\n this.code = code;\n this.step = step;\n this.cause = cause;\n this.txHash = details?.txHash;\n this.depositId = details?.depositId;\n }\n}\n\nexport function isUserCancellation(error: unknown): boolean {\n if (!(error instanceof Error)) return false;\n const msg = error.message.toLowerCase();\n return (\n msg.includes(\"user rejected\") ||\n msg.includes(\"user denied\") ||\n msg.includes(\"user cancelled\") ||\n msg.includes(\"rejected the request\") ||\n msg.includes(\"action_rejected\")\n );\n}\n","import type { WalletClient } from \"viem\";\nimport { createPublicClient, http, isAddress, zeroAddress, type Address } from \"viem\";\nimport { base } from \"viem/chains\";\nimport WhitelistPreIntentHookABI from \"@zkp2p/contracts-v2/abis/base/WhitelistPreIntentHook.json\";\n\nimport { createSdkClient } from \"./sdk-client\";\nimport { BASE_RPC_URL, ESCROW_ADDRESS, REFERRER } from \"./config\";\nimport { OfframpError, isUserCancellation } from \"./errors\";\n\nconst WHITELIST_HOOK_ADDRESS = \"0xda023Ea0d789A41BcF5866F7B6BBd2CaDF9b79B8\" as const;\n\nconst OTC_BASE_URL = \"https://usdctofiat.xyz\";\n\nexport interface EnableOtcResult {\n depositId: string;\n takerAddress: string;\n otcLink: string;\n}\n\n/**\n * Make a deposit private so only one taker wallet can trade against it.\n *\n * Sets the WhitelistPreIntentHook on the deposit and whitelists the taker.\n * If the deposit already has a different taker whitelisted, replaces it.\n *\n * @param walletClient - viem WalletClient with the deposit owner's account\n * @param depositId - The numeric deposit ID (from `OfframpResult.depositId`)\n * @param takerAddress - The Ethereum address allowed to take this order\n * @param escrowAddress - Optional escrow override (defaults to current V3 escrow)\n */\nexport async function enableOtc(\n walletClient: WalletClient,\n depositId: string,\n takerAddress: string,\n escrowAddress?: string,\n): Promise<EnableOtcResult> {\n if (!isAddress(takerAddress)) {\n throw new OfframpError(\"Invalid taker address\", \"VALIDATION\");\n }\n\n const escrow = (escrowAddress || ESCROW_ADDRESS) as Address;\n const taker = takerAddress as Address;\n const depositIdBig = BigInt(depositId);\n const client = createSdkClient(walletClient);\n const txOverrides = { referrer: [REFERRER] };\n\n try {\n // Check current hook state\n const currentHook = (await client.getDepositWhitelistHook(depositIdBig, {\n escrowAddress: escrow,\n })) as Address;\n\n // Remove any existing takers that aren't the desired one\n if (currentHook !== zeroAddress) {\n const isAlready = (await readIsWhitelisted(escrow, depositIdBig, taker)) as boolean;\n\n if (isAlready) {\n return {\n depositId,\n takerAddress: taker,\n otcLink: getOtcLink(depositId, escrow),\n };\n }\n }\n\n // Add taker to whitelist\n await writeContract(walletClient, \"addToWhitelist\", [escrow, depositIdBig, [taker]]);\n\n // Set hook if not already set\n if (currentHook === zeroAddress) {\n await client.setDepositWhitelistHook({\n depositId: depositIdBig,\n whitelistHook: WHITELIST_HOOK_ADDRESS,\n escrowAddress: escrow,\n txOverrides,\n });\n }\n\n return {\n depositId,\n takerAddress: taker,\n otcLink: getOtcLink(depositId, escrow),\n };\n } catch (err) {\n if (err instanceof OfframpError) throw err;\n if (isUserCancellation(err)) {\n throw new OfframpError(\"User cancelled\", \"USER_CANCELLED\", undefined, err, { depositId });\n }\n const detail = err instanceof Error ? err.message : String(err);\n throw new OfframpError(`Failed to enable OTC: ${detail}`, \"DEPOSIT_FAILED\", undefined, err, {\n depositId,\n });\n }\n}\n\n/**\n * Remove the OTC restriction and make the deposit public again.\n *\n * @param walletClient - viem WalletClient with the deposit owner's account\n * @param depositId - The numeric deposit ID\n * @param escrowAddress - Optional escrow override (defaults to current V3 escrow)\n */\nexport async function disableOtc(\n walletClient: WalletClient,\n depositId: string,\n escrowAddress?: string,\n): Promise<void> {\n const escrow = (escrowAddress || ESCROW_ADDRESS) as Address;\n const client = createSdkClient(walletClient);\n const txOverrides = { referrer: [REFERRER] };\n\n try {\n await client.setDepositWhitelistHook({\n depositId: BigInt(depositId),\n whitelistHook: zeroAddress,\n escrowAddress: escrow,\n txOverrides,\n });\n } catch (err) {\n if (isUserCancellation(err)) {\n throw new OfframpError(\"User cancelled\", \"USER_CANCELLED\", undefined, err, { depositId });\n }\n const detail = err instanceof Error ? err.message : String(err);\n throw new OfframpError(`Failed to disable OTC: ${detail}`, \"DEPOSIT_FAILED\", undefined, err, {\n depositId,\n });\n }\n}\n\n/**\n * Get the OTC deposit link that a taker opens to fill the order.\n *\n * @param depositId - The numeric deposit ID\n * @param escrowAddress - Optional escrow override (defaults to current V3 escrow)\n */\nexport function getOtcLink(depositId: string, escrowAddress?: string): string {\n const escrow = escrowAddress || ESCROW_ADDRESS;\n return `${OTC_BASE_URL}/deposit/${escrow}/${depositId}`;\n}\n\n/* ── Internal helpers ──────────────────────────────────────────────── */\n\nasync function writeContract(\n walletClient: WalletClient,\n functionName: string,\n args: unknown[],\n): Promise<void> {\n const wc = walletClient as unknown as {\n writeContract: (req: {\n address: Address;\n abi: unknown;\n functionName: string;\n args: unknown[];\n }) => Promise<string>;\n };\n if (typeof wc.writeContract !== \"function\") {\n throw new OfframpError(\"Wallet client does not support writeContract\", \"VALIDATION\");\n }\n await wc.writeContract({\n address: WHITELIST_HOOK_ADDRESS,\n abi: WhitelistPreIntentHookABI,\n functionName,\n args,\n });\n}\n\nasync function readIsWhitelisted(\n escrow: Address,\n depositId: bigint,\n taker: Address,\n): Promise<unknown> {\n const publicClient = createPublicClient({ chain: base, transport: http(BASE_RPC_URL) });\n return publicClient.readContract({\n address: WHITELIST_HOOK_ADDRESS,\n abi: WhitelistPreIntentHookABI,\n functionName: \"isWhitelisted\",\n args: [escrow, depositId, taker],\n });\n}\n","[\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"_orchestratorRegistry\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"constructor\"\n },\n {\n \"inputs\": [],\n \"name\": \"EmptyArray\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"taker\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"escrow\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"depositId\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"TakerNotInWhitelist\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"taker\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"escrow\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"depositId\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"TakerNotWhitelisted\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"caller\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"owner\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"delegate\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"UnauthorizedCallerOrDelegate\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"caller\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"UnauthorizedOrchestratorCaller\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"ZeroAddress\",\n \"type\": \"error\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"escrow\",\n \"type\": \"address\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"uint256\",\n \"name\": \"depositId\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"taker\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"TakerRemovedFromWhitelist\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"escrow\",\n \"type\": \"address\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"uint256\",\n \"name\": \"depositId\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"taker\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"TakerWhitelisted\",\n \"type\": \"event\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"_escrow\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"_depositId\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"address[]\",\n \"name\": \"_takers\",\n \"type\": \"address[]\"\n }\n ],\n \"name\": \"addToWhitelist\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"_escrow\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"_depositId\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"_taker\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"isWhitelisted\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"orchestratorRegistry\",\n \"outputs\": [\n {\n \"internalType\": \"contract IOrchestratorRegistry\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"_escrow\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"_depositId\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"address[]\",\n \"name\": \"_takers\",\n \"type\": \"address[]\"\n }\n ],\n \"name\": \"removeFromWhitelist\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"components\": [\n {\n \"internalType\": \"address\",\n \"name\": \"taker\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"escrow\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"depositId\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"amount\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"to\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"bytes32\",\n \"name\": \"paymentMethod\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"bytes32\",\n \"name\": \"fiatCurrency\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"conversionRate\",\n \"type\": \"uint256\"\n },\n {\n \"components\": [\n {\n \"internalType\": \"address\",\n \"name\": \"recipient\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"fee\",\n \"type\": \"uint256\"\n }\n ],\n \"internalType\": \"struct IReferralFee.ReferralFee[]\",\n \"name\": \"referralFees\",\n \"type\": \"tuple[]\"\n },\n {\n \"internalType\": \"bytes\",\n \"name\": \"preIntentHookData\",\n \"type\": \"bytes\"\n }\n ],\n \"internalType\": \"struct IPreIntentHook.PreIntentContext\",\n \"name\": \"_ctx\",\n \"type\": \"tuple\"\n }\n ],\n \"name\": \"validateSignalIntent\",\n \"outputs\": [],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"whitelist\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n }\n]","/**\n * SDK client factory.\n *\n * Extracted from `./deposit.ts` so both `otc.ts` and `queries.ts` can import\n * `createSdkClient` without closing a cycle back through `deposit.ts`.\n */\n\nimport type { WalletClient } from \"viem\";\nimport { OfframpClient } from \"@zkp2p/sdk\";\n\nimport { API_BASE_URL, BASE_CHAIN_ID, BASE_RPC_URL, RUNTIME_ENV } from \"./config\";\n\nexport function createSdkClient(walletClient: WalletClient): OfframpClient {\n return new OfframpClient({\n walletClient: walletClient as any,\n chainId: BASE_CHAIN_ID,\n runtimeEnv: RUNTIME_ENV,\n rpcUrl: BASE_RPC_URL,\n baseApiUrl: API_BASE_URL,\n });\n}\n","import type { Hex, WalletClient } from \"viem\";\nimport { concatHex, createPublicClient, encodeFunctionData, formatUnits, http } from \"viem\";\nimport { base } from \"viem/chains\";\nimport {\n classifyDelegationState,\n defaultIndexerEndpoint,\n getAttributionDataSuffix,\n getCurrencyInfoFromHash,\n IndexerClient,\n IndexerDepositService,\n} from \"@zkp2p/sdk\";\n\nimport type { DepositInfo, DepositStatus } from \"./types\";\nimport { createSdkClient } from \"./sdk-client\";\nimport { PLATFORMS, getPaymentMethodHashes } from \"./platforms\";\nimport {\n BASE_RPC_URL,\n DELEGATE_RATE_MANAGER_ID,\n ESCROW_ADDRESS,\n RATE_MANAGER_REGISTRY_ADDRESS,\n REFERRER,\n} from \"./config\";\n\n/* ── Indexer singleton ────────────────────────────────────────────── */\n\nlet indexerService: IndexerDepositService | null = null;\n\nexport function getIndexerService(): IndexerDepositService {\n if (!indexerService) {\n const endpoint = defaultIndexerEndpoint(\"PRODUCTION\");\n const client = new IndexerClient(endpoint);\n indexerService = new IndexerDepositService(client);\n }\n return indexerService;\n}\n\n/* ── Helpers ──────────────────────────────────────────────────────── */\n\ntype IndexerDeposit = {\n id: string;\n depositId: string;\n txHash?: string;\n status: string;\n remainingDeposits: string | null;\n outstandingIntentAmount: string | null;\n totalAmountTaken: string | null;\n fulfilledIntents: number | null;\n escrowAddress: string;\n rateManagerId?: string | null;\n rateManagerAddress?: string | null;\n paymentMethods: Array<{ paymentMethodHash: string }>;\n currencies: Array<{ currencyCode: string; rateSource?: string | null }>;\n};\n\nfunction toBigInt(value: string | null | undefined): bigint {\n try {\n return BigInt(value || \"0\");\n } catch {\n return 0n;\n }\n}\n\nfunction toUsdc(value: string | null | undefined): number {\n return Number(formatUnits(toBigInt(value), 6));\n}\n\nfunction resolveStatus(deposit: IndexerDeposit): DepositStatus {\n if (deposit.status === \"CLOSED\") return \"closed\";\n if (toBigInt(deposit.remainingDeposits) === 0n) return \"empty\";\n return \"active\";\n}\n\nfunction resolveMethodNames(hashes: Array<{ paymentMethodHash: string }>): string[] {\n const names = new Set<string>();\n for (const { paymentMethodHash } of hashes) {\n const normalized = paymentMethodHash.toLowerCase();\n for (const platform of Object.values(PLATFORMS)) {\n const platformHashes = getPaymentMethodHashes(platform.id);\n if (platformHashes.some((h) => h.toLowerCase() === normalized)) {\n names.add(platform.name);\n break;\n }\n }\n }\n return Array.from(names);\n}\n\nfunction mapDeposit(d: IndexerDeposit): DepositInfo {\n const delegationState = classifyDelegationState(\n d.rateManagerId ?? undefined,\n d.rateManagerAddress ?? undefined,\n DELEGATE_RATE_MANAGER_ID,\n RATE_MANAGER_REGISTRY_ADDRESS,\n );\n return {\n depositId: d.depositId,\n compositeId: d.id,\n txHash: d.txHash,\n status: resolveStatus(d),\n remainingUsdc: toUsdc(d.remainingDeposits),\n outstandingUsdc: toUsdc(d.outstandingIntentAmount),\n totalTakenUsdc: toUsdc(d.totalAmountTaken),\n fulfilledIntents: d.fulfilledIntents ?? 0,\n paymentMethods: resolveMethodNames(d.paymentMethods),\n currencies: d.currencies.map((c) => {\n const info = getCurrencyInfoFromHash(c.currencyCode);\n return info?.currencyCode ?? c.currencyCode;\n }),\n rateSource: d.currencies[0]?.rateSource || \"unknown\",\n delegated: delegationState === \"delegated_here\",\n escrowAddress: d.escrowAddress,\n };\n}\n\nfunction extractTxHash(result: unknown): string {\n if (typeof result === \"string\") return result;\n if (result && typeof result === \"object\" && \"hash\" in result)\n return (result as { hash: string }).hash;\n if (result && typeof result === \"object\" && \"transactionHash\" in result)\n return (result as { transactionHash: string }).transactionHash;\n throw new Error(\"Unexpected transaction result format\");\n}\n\nconst ESCROW_V2_ABI = [\n {\n name: \"clearRateManager\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [{ name: \"depositId\", type: \"uint256\" }],\n outputs: [],\n },\n] as const;\n\nfunction appendReferrerAttribution(calldata: Hex): Hex {\n return concatHex([calldata, getAttributionDataSuffix([REFERRER])]);\n}\n\n/* ── Public functions ─────────────────────────────────────────────── */\n\n/**\n * List all deposits for a wallet address. Read-only, no wallet needed.\n * Returns active deposits first, then empty, then closed.\n */\nexport async function deposits(walletAddress: string): Promise<DepositInfo[]> {\n const service = getIndexerService();\n const raw = (await service.fetchDepositsWithRelations(\n { depositor: walletAddress as `0x${string}` },\n { limit: 100 },\n )) as IndexerDeposit[];\n\n const statusOrder: Record<DepositStatus, number> = { active: 0, empty: 1, closed: 2 };\n\n return (raw || []).map(mapDeposit).sort((a, b) => {\n const diff = statusOrder[a.status] - statusOrder[b.status];\n if (diff !== 0) return diff;\n return Number(BigInt(b.depositId) - BigInt(a.depositId));\n });\n}\n\n/**\n * Withdraw remaining USDC and close a deposit.\n *\n * @param walletClient - viem WalletClient with the deposit owner's account\n * @param depositId - The numeric deposit ID (from `DepositInfo.depositId`)\n */\nexport async function close(\n walletClient: WalletClient,\n depositId: string,\n escrowAddress?: string,\n): Promise<string> {\n const client = createSdkClient(walletClient);\n const result = await client.withdrawDeposit({\n depositId: BigInt(depositId),\n escrowAddress: (escrowAddress || ESCROW_ADDRESS) as `0x${string}`,\n txOverrides: { referrer: [REFERRER] },\n });\n return extractTxHash(result);\n}\n\n/**\n * Delegate a deposit to the configured Delegate vault.\n *\n * @param walletClient - viem WalletClient with the deposit owner's account\n * @param depositId - The numeric deposit ID (from `DepositInfo.depositId`)\n */\nexport async function delegate(\n walletClient: WalletClient,\n depositId: string,\n escrowAddress?: string,\n): Promise<string> {\n const client = createSdkClient(walletClient);\n const result = await client.setRateManager({\n depositId: BigInt(depositId),\n rateManagerAddress: RATE_MANAGER_REGISTRY_ADDRESS,\n rateManagerId: DELEGATE_RATE_MANAGER_ID,\n escrowAddress: (escrowAddress || ESCROW_ADDRESS) as `0x${string}`,\n txOverrides: { referrer: [REFERRER] },\n });\n return extractTxHash(result);\n}\n\n/**\n * Remove Delegate rate management from a deposit.\n *\n * @param walletClient - viem WalletClient with the deposit owner's account\n * @param depositId - The numeric deposit ID (from `DepositInfo.depositId`)\n */\nexport async function undelegate(\n walletClient: WalletClient,\n depositId: string,\n escrowAddress?: string,\n): Promise<string> {\n const account = walletClient.account;\n if (!account) {\n throw new Error(\"Wallet client has no account. Connect a wallet first.\");\n }\n\n const data = appendReferrerAttribution(\n encodeFunctionData({\n abi: ESCROW_V2_ABI,\n functionName: \"clearRateManager\",\n args: [BigInt(depositId)],\n }),\n );\n\n const hash = await walletClient.sendTransaction({\n account,\n chain: base,\n data,\n to: (escrowAddress || ESCROW_ADDRESS) as `0x${string}`,\n });\n\n const publicClient = createPublicClient({\n chain: base,\n transport: http(BASE_RPC_URL),\n });\n\n try {\n const receipt = await publicClient.waitForTransactionReceipt({\n hash,\n confirmations: 1,\n timeout: 120_000,\n pollingInterval: 4_000,\n });\n\n if (receipt.status !== \"success\") {\n throw new Error(\"Undelegation transaction failed\");\n }\n } catch (err) {\n const isTimeout = err instanceof Error && err.message.toLowerCase().includes(\"timed out\");\n\n if (!isTimeout) {\n throw err;\n }\n }\n\n return hash;\n}\n"],"mappings":"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","names":["import_viem","import_chains","import_sdk","import_sdk","import_sdk","import_viem","import_chains","import_sdk","extractTxHash","client","txOverrides","offramp"]}
package/dist/react.js CHANGED
@@ -3,7 +3,7 @@ import {
3
3
  close,
4
4
  deposits,
5
5
  offramp
6
- } from "./chunk-QELK2M73.js";
6
+ } from "./chunk-OJY6DE3I.js";
7
7
 
8
8
  // src/hooks/useOfframp.ts
9
9
  import { useCallback, useRef, useState } from "react";