export interface PortalApiSuccessEnvelope { data: T metadata?: Record } export interface NoahInitiateKycRequest { returnUrl: string fiatOptions?: { fiatCurrencyCode: string }[] customerType?: 'Individual' | 'Business' metadata?: Record form?: Record } export interface NoahInitiateKycResponseData { hostedUrl: string } export type NoahInitiateKycResponse = PortalApiSuccessEnvelope export interface NoahInitiatePayinRequest { fiatCurrency: string cryptoCurrency: string network: string destinationAddress: string } export interface StreetAddress { city?: string country?: string line1?: string line2?: string postalCode?: string state?: string } export interface BankToAddressRelatedPaymentMethod { paymentMethodId: string paymentMethodType: string details?: { accountNumber?: string bankCode?: string } } export interface BankDetails { paymentMethodId: string paymentMethodType: string accountNumber: string network: string accountHolderName?: string bankCode?: string bankName?: string bankAddress?: StreetAddress reference?: string relatedPaymentMethods?: BankToAddressRelatedPaymentMethod[] } export interface NoahInitiatePayinResponseData { payinId: string bankDetails: BankDetails } export type NoahInitiatePayinResponse = PortalApiSuccessEnvelope export interface NoahSimulatePayinRequest { paymentMethodId: string fiatAmount: string fiatCurrency: string } export interface NoahSimulatePayinResponseData { fiatDepositId: string } export type NoahSimulatePayinResponse = PortalApiSuccessEnvelope export interface NoahGetPayoutCountriesResponseData { countries: Record } export type NoahGetPayoutCountriesResponse = PortalApiSuccessEnvelope export interface NoahGetPayoutChannelsRequest { country: string cryptoCurrency: string fiatCurrency: string fiatAmount?: string } export interface ChannelLimits { minLimit: string maxLimit?: string } export interface ChannelCalculated { totalFee: string } export interface Channel { id: string paymentMethodType: string fiatCurrency: string country: string limits: ChannelLimits rate: string processingSeconds: number calculated?: ChannelCalculated } export interface NoahGetPayoutChannelsResponseData { items: Channel[] pageToken?: string } export type NoahGetPayoutChannelsResponse = PortalApiSuccessEnvelope export interface NoahGetPayoutChannelFormResponseData { formSchema?: Record formMetadata?: { contentHash: string } } export type NoahGetPayoutChannelFormResponse = PortalApiSuccessEnvelope export interface PaymentMethodDetails { type: string accountNumber?: string bankCode?: string last4?: string scheme?: string identifierType?: string identifier?: string } export interface AccountHolderDetails { name?: string taxId?: string email?: string phoneNumber?: string address?: StreetAddress } export interface IssuerDetails { name?: string bankCode?: string bankName?: string } export interface PaymentMethod { id: string paymentMethodType: string details: PaymentMethodDetails accountHolderDetails?: AccountHolderDetails issuerDetails?: IssuerDetails } export interface NoahGetPaymentMethodsResponseData { paymentMethods: PaymentMethod[] pageToken?: string } export type NoahGetPaymentMethodsResponse = PortalApiSuccessEnvelope export interface NoahGetPayoutQuoteRequest { channelId: string cryptoCurrency: string fiatAmount: string form?: Record fiatCurrency?: string paymentMethodId?: string } export interface FormNextStep { stepId: string stepType: 'Ack' | 'DataEntry' schema: Record } export interface NoahGetPayoutQuoteResponseData { payoutId: string totalFee: string cryptoAmountEstimate: string formSessionId: string nextStep?: FormNextStep } export type NoahGetPayoutQuoteResponse = PortalApiSuccessEnvelope export interface AmountCondition { comparisonOperator: string value: string } export interface DepositSourceTriggerCondition { amountConditions: AmountCondition[] cryptoCurrency: string network: string destinationAddress: string } /** Supported Solana CAIP-2 IDs for payout deposit flows. */ export type NoahSolanaCaipId = | 'solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1' | 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp' export interface NoahSingleOnchainDepositSourceTriggerInput { Type: 'SingleOnchainDepositSourceTriggerInput' Conditions: { AmountConditions: { ComparisonOperator: string; Value: string }[] Network: string }[] SourceAddress: string Expiry: string Nonce: string } export interface NoahInitiatePayoutRequest { payoutId: string sourceAddress: string expiry: string nonce: string network: string trigger?: NoahSingleOnchainDepositSourceTriggerInput } export interface NoahInitiatePayoutResponseData { destinationAddress: string | null conditions: DepositSourceTriggerCondition[] } export type NoahInitiatePayoutResponse = PortalApiSuccessEnvelope