Skip to main content

Client Reference

What this does

This page documents the published Zkp2pClient API surface for @zkp2p/sdk. Use it as the reference layer for custom integrations after you have read the higher-level walkthroughs:

Constructor

Create a client with new Zkp2pClient(opts).

FieldRequiredDescription
walletClientYesviem WalletClient with an attached account for signing
chainIdYesChain ID used for contract and API routing
rpcUrlNoOptional RPC override; otherwise the SDK uses the wallet client's chain transport
runtimeEnvNoRuntime environment: production, preproduction, or staging. Defaults to production
preferV2ByDefaultNoControls whether V2 contracts are preferred when both legacy and V2 are deployed
indexerUrlNoOverride for the indexer GraphQL endpoint
baseApiUrlNoOverride for ZKP2P service APIs
apiKeyNoCurator API key used by authenticated endpoints such as registerPayeeDetails() and auto-signing for signalIntent()
authorizationTokenNoOptional bearer token for hybrid authentication
getAuthorizationTokenNoAsync token provider for long-lived clients
indexerApiKeyNoOptional x-api-key header for indexer proxy authentication
timeouts.apiNoAPI timeout in milliseconds
import { Zkp2pClient } from '@zkp2p/sdk';

const client = new Zkp2pClient({
walletClient,
chainId: 8453,
runtimeEnv: 'production',
apiKey: 'YOUR_API_KEY',
indexerApiKey: 'YOUR_INDEXER_API_KEY',
});
API-backed methods

registerPayeeDetails() requires curator API access. signalIntent() can auto-fetch its gating signature when you provide apiKey or authorizationToken; if you do not want the SDK to make that request, pass gatingServiceSignature and signatureExpiration yourself.

Prepared transactions

Most write methods are "prepareable":

  • Calling the method directly sends the transaction and returns a hash
  • Calling .prepare() on the same method returns a PreparedTransaction with { to, data, value, chainId }
const prepared = await client.signalIntent.prepare({
depositId: 42n,
amount: 100_000000n,
toAddress: '0xYourRecipientAddress',
processorName: 'wise',
payeeDetails: '0xPayeeHash',
fiatCurrencyCode: 'USD',
conversionRate: 1_020000000000000000n,
});

await relayer.submit({
to: prepared.to,
data: prepared.data,
value: prepared.value,
});

createDeposit() is the main exception because it may also post curator data. Use prepareCreateDeposit() when you need calldata without sending:

const { depositDetails, prepared } = await client.prepareCreateDeposit({
token: '0x833589fcd6edb6e08f4c7c32d4f71b54bda02913',
amount: 1_000_000000n,
intentAmountRange: { min: 10_000000n, max: 500_000000n },
processorNames: ['wise'],
depositData: [{ email: 'maker@example.com' }],
conversionRates: [[
{ currency: 'USD', conversionRate: '1020000000000000000' },
]],
});

Payee registration

Use registerPayeeDetails() when you want to register payment details first and reuse the returned hashes in a later createDeposit() call.

ParameterTypeDescription
processorNamesstring[]Payment platforms such as wise, revolut, or venmo
depositDataArray<Record<string, string>>Processor-specific payment details in the same order as processorNames
const { hashedOnchainIds } = await client.registerPayeeDetails({
processorNames: ['wise', 'revolut'],
depositData: [
{ email: 'maker@example.com' },
{ tag: '@maker' },
],
});

await client.createDeposit({
token: '0x833589fcd6edb6e08f4c7c32d4f71b54bda02913',
amount: 1_000_000000n,
intentAmountRange: { min: 10_000000n, max: 500_000000n },
processorNames: ['wise', 'revolut'],
depositData: [
{ email: 'maker@example.com' },
{ tag: '@maker' },
],
conversionRates: [
[{ currency: 'USD', conversionRate: '1020000000000000000' }],
[{ currency: 'EUR', conversionRate: '950000000000000000' }],
],
payeeDetailsHashes: hashedOnchainIds,
});

Intent operations

signalIntent() / signalIntent.prepare()

Signals a taker-side intent and reserves liquidity from a deposit.

ParameterRequiredDescription
depositIdYesDeposit ID to use
amountYesToken amount in base units
toAddressYesRecipient address for the on-chain asset
processorNameYesPayment platform name
payeeDetailsYesHashed payee details for the deposit/payment method
fiatCurrencyCodeYesFiat currency such as USD or EUR
conversionRateYesAgreed conversion rate with 18 decimals
referralFeesNoMulti-recipient referral fee list
referrer / referrerFeeNoDeprecated legacy single-referrer fields
referrerFeeConfigNoRedirect/onramp-friendly referrer fee configuration
postIntentHookNoPost-intent hook contract address
preIntentHookDataNoData for a pre-intent hook
dataNoArbitrary bytes passed into hook-enabled flows
escrowAddressNoEscrow override when you want explicit routing
orchestratorAddressNoOrchestrator override
gatingServiceSignatureNoPre-obtained signature if you do not want SDK auto-fetching
signatureExpirationNoSignature expiration timestamp
txOverridesNoviem transaction overrides plus optional referrer code(s)

cancelIntent() / cancelIntent.prepare()

Cancels a signaled intent before fulfillment.

ParameterRequiredDescription
intentHashYes0x-prefixed 32-byte intent hash
orchestratorAddressNoExplicit orchestrator override
txOverridesNoviem transaction overrides

fulfillIntent() / fulfillIntent.prepare()

Fulfills a signaled intent with a payment proof. The SDK handles attestation encoding for you.

ParameterRequiredDescription
intentHashYes0x-prefixed 32-byte intent hash
proofYesReclaim proof object or JSON string
timestampBufferMsNoAllowed timestamp variance in milliseconds
attestationServiceUrlNoOverride for the attestation service
orchestratorAddressNoExplicit orchestrator override
postIntentHookDataNoHook payload passed to the orchestrator
txOverridesNoviem transaction overrides
callbacksNoUI lifecycle callbacks such as onAttestationStart, onTxSent, and onTxMined
precomputedAttestationNoPre-encoded attestation data for advanced flows

releaseFundsToPayer() / releaseFundsToPayer.prepare()

Manual release path for returning reserved funds to the deposit owner when an intent should not be fulfilled.

ParameterRequiredDescription
intentHashYes0x-prefixed 32-byte intent hash
orchestratorAddressNoExplicit orchestrator override
txOverridesNoviem transaction overrides

Vault and rate-manager operations

At the client layer, vaults are exposed as rate managers. These flows are most relevant when you are delegating deposits or managing shared pricing.

note

staging defaults to V2 routing. Several vault, delegation, and oracle-backed pricing features are V2-only, even though the SDK still supports legacy fallback for broader deposit and intent flows.

Create a vault

Use createRateManager() to create a new vault.

FieldRequiredDescription
config.managerYesManager address
config.feeRecipientYesAddress that receives manager fees
config.maxFeeYesMaximum allowed fee
config.feeYesCurrent fee
config.depositHookNoOptional deposit hook contract
config.minLiquidityNoMinimum USDC liquidity required for delegation
config.nameYesHuman-readable name
config.uriYesMetadata URI
txOverridesNoviem transaction overrides

Delegation methods

Use one of the delegation paths below depending on how the deposit is routed.

MethodUse it whenKey parameters
setDepositRateManager()Delegating through the controller/registry pathescrow, depositId, registry, rateManagerId
clearDepositRateManager()Clearing controller-based delegationescrow, depositId
setRateManager()Writing directly to EscrowV2depositId, rateManagerAddress, rateManagerId, escrowAddress?
clearRateManager()Clearing direct EscrowV2 delegationdepositId, escrowAddress?

Vault configuration

MethodDescriptionKey parameters
setVaultFee()Update vault manager feerateManagerId, newFee
setVaultMinRate()Set floor rate for one payment method/currency pairrateManagerId, paymentMethodHash, currencyHash, rate
setVaultMinRatesBatch()Batch version of setVaultMinRate()rateManagerId, paymentMethods, currencies, rates
setVaultConfig()Update manager, fee recipient, hook, name, or URIrateManagerId, newManager, newFeeRecipient, newHook?, newName, newUri

Payment method management

MethodDescriptionKey parameters
addPaymentMethods()Add new payment platforms to an existing depositdepositId, paymentMethods, paymentMethodData, currencies
setPaymentMethodActive()Activate or deactivate a payment methoddepositId, paymentMethod, isActive
removePaymentMethod()Convenience alias for deactivating a payment methoddepositId, paymentMethod

Currency management

MethodDescriptionKey parameters
addCurrencies()Add currencies to an existing payment methoddepositId, paymentMethod, currencies
deactivateCurrency()Disable a currency for a payment methoddepositId, paymentMethod, currencyCode
removeCurrency()Alias for deactivateCurrency()depositId, paymentMethod, currencyCode

Rate-manager reads

MethodReturnsNotes
getDepositRateManager(escrow, depositId){ registry, rateManagerId }Reads current delegation state
getManagerFee(escrow, depositId)bigintReads the effective manager fee
getEffectiveRate({ escrow, depositId, paymentMethod, fiatCurrency })bigintReads effective EscrowV2 rate after manager logic

For EscrowV2 pricing flows, the client also exposes setOracleRateConfig(), removeOracleRateConfig(), setOracleRateConfigBatch(), updateCurrencyConfigBatch(), and deactivateCurrenciesBatch().

Quote API

Use getQuote(req, opts?) to fetch available liquidity for a taker flow.

Request fieldRequiredDescription
paymentPlatformsYesPlatforms to search, such as ['wise', 'revolut']
fiatCurrencyYesFiat currency code
userYesTaker address
recipientYesAsset recipient address
destinationChainIdYesDestination chain ID
destinationTokenYesDestination token address
amountYesAmount as a string
referrerNoReferrer code for quote attribution
referrerFeeConfigNoReferrer fee recipient and BPS
useMultihopNoEnable multihop routing
quotesToReturnNoLimit quote count
isExactFiatNoTreat amount as fiat instead of token amount
escrowAddressesNoLimit search to specific escrows
includeNearbyQuotesNoInclude nearby suggestions when no exact quote is available
nearbySearchRangeNoMax percent deviation for nearby quote search
nearbyQuotesCountNoNumber of nearby suggestions above and below

The response includes:

  • responseObject.quotes: matched quotes
  • responseObject.nearbySuggestions: optional nearby matches when includeNearbyQuotes is enabled and no exact quote is available
  • signalIntentAmount: gross amount you should pass into signalIntent() when a referrer fee is applied
  • referrerFeeAmount: computed fee output for the supplied referrerFeeConfig
const quote = await client.getQuote({
paymentPlatforms: ['wise'],
fiatCurrency: 'USD',
user: '0xYourAddress',
recipient: '0xRecipientAddress',
destinationChainId: 8453,
destinationToken: '0x833589fcd6edb6e08f4c7c32d4f71b54bda02913',
amount: '100',
isExactFiat: true,
includeNearbyQuotes: true,
});

Taker tiers

Use getTakerTier(req, opts?) to fetch tiering, cooldown, and platform-limit data for a taker address.

Request fieldRequiredDescription
ownerYesTaker address
chainIdYesChain ID for tier evaluation

The response object includes:

  • tier: one of PEASANT, PEER, PLUS, PRO, PLATINUM, or PEER_PRESIDENT
  • perIntentCapBaseUnits and perIntentCapDisplay
  • cooldown metadata such as cooldownHours, cooldownActive, and nextIntentAvailableAt
  • platformLimits, including risk level and minimum required tier per payment platform

Querying on-chain data

For common read flows, start with the RPC-first methods:

  • getDeposits()
  • getAccountDeposits(owner)
  • getDeposit(depositId)
  • getDepositsById(ids)
  • getIntents()
  • getAccountIntents(owner)
  • getIntent(intentHash)
  • resolvePayeeHash(depositId, paymentMethodHash)
  • getFulfillIntentInputs(intentHash)
  • getDeployedAddresses()
  • getUsdcAddress()

For copy-paste examples around deposits and intents, see Offramp Integration.

Indexer

Use client.indexer when you need historical data, richer filtering, or pagination across all deposits and intents.

Common methods on client.indexer:

  • getDeposits(filter?, pagination?)
  • getDepositsWithRelations(filter?, pagination?, options?)
  • getDepositById(id, options?)
  • getOwnerIntents(owner, statuses?)
  • getIntentByHash(intentHash)
  • getExpiredIntents({ now, depositIds, limit? })
  • getFulfilledIntentEvents(intentHashes)
  • getIntentFulfillmentAmounts(intentHash)
  • getFulfillmentAndPayment(intentHash)
  • getDepositsByPayeeHash(payeeHash, options?)

For rate-manager analytics, the package also exports IndexerRateManagerService, which you can construct from client.indexer.client.

import { IndexerRateManagerService } from '@zkp2p/sdk';

const rateManagers = new IndexerRateManagerService(client.indexer.client);
const list = await rateManagers.fetchRateManagers({ limit: 20 });

The package also exports the standalone helper fetchFulfillmentAndPayment(client.indexer.client, intentHash).

Referrer fees

Use these helpers when you want to validate or normalize referrer fee settings before calling getQuote() or signalIntent().

HelperPurpose
assertValidReferrerFeeConfig(config, context)Throws if the config is invalid for getQuote or signalIntent
isValidReferrerFeeBps(value)Checks whether a BPS value is allowed
parseReferrerFeeConfig(recipient, feeBpsValue)Builds a ReferrerFeeConfig from loosely typed input
referrerFeeConfigToPreciseUnits(config)Converts the fee config into precise units for on-chain use

Attribution

The SDK includes ERC-8021 helpers for Base builder attribution.

HelperPurpose
getAttributionDataSuffix(referrer?)Builds the attribution suffix
appendAttributionToCalldata(calldata, referrer?)Appends attribution to existing calldata
encodeWithAttribution(request, referrer?)Encodes calldata and appends attribution in one step
sendTransactionWithAttribution(walletClient, request, referrer?, overrides?)Sends a transaction with appended attribution

Useful constants:

  • BASE_BUILDER_CODE
  • ZKP2P_IOS_REFERRER
  • ZKP2P_ANDROID_REFERRER

Contract helpers

HelperDescription
getContracts(chainId, env?)Returns deployed addresses and ABIs for escrow, orchestrator, verifier, ProtocolViewer, USDC, and related contracts
getRateManagerContracts(chainId, env?)Returns rate-manager registry/controller addresses and ABIs
getPaymentMethodsCatalog(chainId, env?)Returns the platform-to-hash catalog used for payment-method resolution
getGatingServiceAddress(chainId, env?)Returns the signer used for intent gating
HISTORICAL_ESCROW_ADDRESSESHistorical escrow addresses keyed by runtime deployment

Common companion helpers:

  • currencyInfo
  • getCurrencyInfoFromHash()
  • getCurrencyInfoFromCountryCode()
  • resolveFiatCurrencyBytes32()
  • resolvePaymentMethodHash()
  • resolvePaymentMethodHashFromCatalog()
  • resolvePaymentMethodNameFromHash()

Error handling

All SDK-specific errors extend ZKP2PError.

ClassCodeExtra fieldsUse it for
ZKP2PErrorAny ErrorCodedetails?, field?Shared base class
ValidationErrorVALIDATIONfield?, details?Invalid input
NetworkErrorNETWORKdetails?RPC or network failures
APIErrorAPIstatus?, details?Failed API requests
ContractErrorCONTRACTdetails?Contract call or simulation failures

Available error codes: VALIDATION, NETWORK, API, CONTRACT, UNKNOWN.

import {
APIError,
ContractError,
ValidationError,
ZKP2PError,
} from '@zkp2p/sdk';

try {
await client.createDeposit({ /* ... */ });
} catch (error) {
if (error instanceof ValidationError) {
console.error(error.field, error.message);
} else if (error instanceof APIError) {
console.error(error.status, error.message);
} else if (error instanceof ContractError) {
console.error(error.details);
} else if (error instanceof ZKP2PError) {
console.error(error.code, error.message);
}
}

Logging

Use setLogLevel() to adjust SDK logging.

import { setLogLevel } from '@zkp2p/sdk';

setLogLevel('debug'); // 'debug' | 'info' | 'error'

Help?

If you run into issues, join our Discord.