@liquidium/client 0.5.0 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +2 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/errors.ts","../src/core/types.ts","../src/core/config.ts","../src/core/transports/api-client.ts","../src/core/transports/canister-context.ts","../src/generated/canisters/lending/lending.did.js","../src/core/canisters/lending/actor.ts","../src/core/canisters/lending/error-mappers.ts","../src/core/evm.ts","../src/core/utils/time.ts","../src/core/utils/variant.ts","../src/core/wallet-actions.ts","../src/execute.ts","../src/core/utils/signature.ts","../src/modules/accounts/mappers.ts","../src/modules/accounts/accounts.ts","../src/core/utils/variant-tags.ts","../src/core/canisters/simple-loans/flexible-actor.ts","../src/core/sdk-api-paths.ts","../src/core/utils/bigint.ts","../src/modules/simple-loans/ref-code.ts","../src/modules/activities/types.ts","../src/modules/activities/activities.ts","../src/modules/history/history.ts","../src/core/utils/inflow-subaccount.ts","../src/modules/lending/evm-transactions.ts","../src/core/borrow-minimums.ts","../src/core/canisters/icrc/ledger.ts","../src/core/canisters/ckbtc/ledger.ts","../src/generated/canisters/ck-btc-minter/declaration.js","../src/core/canisters/ckbtc/minter.ts","../src/generated/canisters/deposit-accounts/deposit_accounts.did.js","../src/core/canisters/deposit-accounts/actor.ts","../src/core/canisters/lending/flexible-actor.ts","../src/core/canisters/lending/messages.ts","../src/core/pool-ledger-assets.ts","../src/core/same-asset-borrowing.ts","../src/core/status.ts","../src/core/withdraw-minimums.ts","../src/core/accounts.ts","../src/modules/lending/types.ts","../src/modules/lending/_internal/supply-targets.ts","../src/modules/lending/_internal/inflow-fee-rounding.ts","../src/core/address-validation.ts","../src/core/utils/retry.ts","../src/modules/lending/_internal/supply-flow.ts","../src/modules/lending/mappers.ts","../src/modules/lending/lending.ts","../src/core/rates.ts","../src/core/utils/asset-decimals.ts","../src/modules/market/mappers.ts","../src/modules/market/market.ts","../src/modules/positions/mappers.ts","../src/modules/positions/positions.ts","../src/modules/quote/types.ts","../src/modules/quote/quote.ts","../src/core/utils/api-response-parsers.ts","../src/modules/simple-loans/_internal/address-validation.ts","../src/modules/simple-loans/simple-loans.ts","../src/client.ts"],"names":["agent","HttpAgent","OutflowType","Actor","isAddress","getAddress","isHex","encodeBytesToHex","base64","base64nopad","Principal","idlLabelToId","encodeFunctionData","encodeIcrcAccount","idlFactory","decodeIcrcAccountText","AccountIdentifier","SubAccount","subaccount","validateBitcoinAddress","BitcoinAddressNetwork","isEthStablecoin","principal","QuoteValidationErrorCode","QuoteWarningCode","MILLISECONDS_PER_SECOND","RATE_SCALE","formatBpsAsPercent","createPublicClient","mainnet","http"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Stable string codes for {@link LiquidiumError}. Use for branching in application code.\n */\nexport const LiquidiumErrorCode = {\n // Protocol errors\n INVALID_TARGET_PRINCIPAL: \"INVALID_TARGET_PRINCIPAL\",\n INSUFFICIENT_COLLATERAL: \"INSUFFICIENT_COLLATERAL\",\n SIGNATURE_EXPIRY_TOO_FAR_IN_FUTURE: \"SIGNATURE_EXPIRY_TOO_FAR_IN_FUTURE\",\n MAX_LTV_EXCEEDED: \"MAX_LTV_EXCEEDED\",\n SIGNATURE_EXPIRED: \"SIGNATURE_EXPIRED\",\n ACCOUNT_ALREADY_LINKED: \"ACCOUNT_ALREADY_LINKED\",\n ACCOUNT_NOT_FOUND: \"ACCOUNT_NOT_FOUND\",\n CANNOT_REMOVE_SOLE_ACCOUNT: \"CANNOT_REMOVE_SOLE_ACCOUNT\",\n PROFILE_NOT_FOUND: \"PROFILE_NOT_FOUND\",\n PROFILE_ALREADY_EXISTS: \"PROFILE_ALREADY_EXISTS\",\n SIGNATURE_ERROR: \"SIGNATURE_ERROR\",\n POOL_NOT_FOUND: \"POOL_NOT_FOUND\",\n POOL_FROZEN: \"POOL_FROZEN\",\n POSITION_NOT_FOUND: \"POSITION_NOT_FOUND\",\n BORROW_CAP_EXCEEDED: \"BORROW_CAP_EXCEEDED\",\n SUPPLY_CAP_EXCEEDED: \"SUPPLY_CAP_EXCEEDED\",\n INSUFFICIENT_FUNDS: \"INSUFFICIENT_FUNDS\",\n HEALTH_FACTOR_TOO_LOW: \"HEALTH_FACTOR_TOO_LOW\",\n TRANSFER_FAILED: \"TRANSFER_FAILED\",\n LIQUIDATION_NOT_FOUND: \"LIQUIDATION_NOT_FOUND\",\n BORROWING_DISABLED: \"BORROWING_DISABLED\",\n NO_LIQUIDITY: \"NO_LIQUIDITY\",\n NOT_ALLOWED: \"NOT_ALLOWED\",\n\n // Signature verification\n INVALID_ETH_SIGNATURE: \"INVALID_ETH_SIGNATURE\",\n INVALID_BTC_SIGNATURE: \"INVALID_BTC_SIGNATURE\",\n INVALID_ETH_ADDRESS: \"INVALID_ETH_ADDRESS\",\n UNSUPPORTED_CHAIN: \"UNSUPPORTED_CHAIN\",\n\n // Client-side\n WITHDRAW_TOO_LOW: \"WITHDRAW_TOO_LOW\",\n REPAYMENT_EXCEEDS_DEBT: \"REPAYMENT_EXCEEDS_DEBT\",\n INVALID_ADDRESS: \"INVALID_ADDRESS\",\n DEPOSIT_ADDRESS_ERROR: \"DEPOSIT_ADDRESS_ERROR\",\n\n // Transport\n NETWORK_ERROR: \"NETWORK_ERROR\",\n SERVICE_UNAVAILABLE: \"SERVICE_UNAVAILABLE\",\n REQUEST_TIMEOUT: \"REQUEST_TIMEOUT\",\n CANISTER_REJECTED: \"CANISTER_REJECTED\",\n\n // Catch-all\n INTERNAL: \"INTERNAL\",\n VALIDATION_ERROR: \"VALIDATION_ERROR\",\n} as const;\n\nexport type LiquidiumErrorCode =\n (typeof LiquidiumErrorCode)[keyof typeof LiquidiumErrorCode];\n\n/** Optional debug identifiers attached to mapped SDK errors. */\nexport interface LiquidiumErrorContext {\n /** Backend trace id for support/debugging when available. */\n traceId?: string;\n /** SDK API request id for support/debugging when available. */\n requestId?: string;\n}\n\n/**\n * Typed error from the SDK or mapped protocol failures.\n *\n * Prefer checking `code` over parsing `message`.\n */\nexport class LiquidiumError extends Error {\n /** Machine-readable reason; compare to {@link LiquidiumErrorCode} values. */\n readonly code: LiquidiumErrorCode;\n /** Original error when the SDK wraps an underlying failure. */\n override readonly cause?: unknown;\n /** Backend trace id for support/debugging when available. */\n readonly traceId?: string;\n /** SDK API request id for support/debugging when available. */\n readonly requestId?: string;\n\n /**\n * @param code - Error code from {@link LiquidiumErrorCode}.\n * @param message - Human-readable detail (defaults to `code` when omitted).\n * @param cause - Optional underlying error.\n * @param context - Optional backend debug identifiers.\n */\n constructor(\n code: LiquidiumErrorCode,\n message?: string,\n cause?: unknown,\n context?: LiquidiumErrorContext\n ) {\n super(message ?? code);\n this.name = \"LiquidiumError\";\n this.code = code;\n this.cause = cause;\n this.traceId = context?.traceId;\n this.requestId = context?.requestId;\n }\n}\n","import type { Identity } from \"@icp-sdk/core/agent\";\nimport type { PublicClient } from \"viem\";\n\n/** Minimal viem-compatible client shape required for SDK EVM read calls. */\nexport type EvmReadClient = Pick<PublicClient, \"readContract\">;\n\n/**\n * Runtime options for `new LiquidiumClient(config)`.\n *\n * Canister-backed reads and SDK HTTP features work with `{}` defaults. Set\n * `apiBaseUrl` only when overriding the Liquidium production API root.\n */\nexport interface LiquidiumClientConfig {\n /** Preset canister IDs. Only `mainnet` is bundled. */\n environment?: Environment;\n /** ICP replica host override (defaults follow `@icp-sdk/core/agent`). */\n icHost?: string;\n /** Agent identity for signed canister calls. */\n identity?: Identity;\n /**\n * Base URL for the Liquidium SDK HTTP API root (e.g. `https://app.example.com/api/sdk`).\n * Defaults to the Liquidium production API root. Endpoint versions are owned\n * by this SDK package version.\n */\n apiBaseUrl?: string;\n /** Extra headers sent with every SDK API request. */\n headers?: Record<string, string>;\n /** Override individual canister principals for custom deployments. */\n canisterIds?: CanisterIdOverrides;\n /** Custom `fetch` implementation for SDK API requests. */\n fetch?: typeof fetch;\n /** Per-request timeout for SDK API calls in milliseconds. */\n timeoutMs?: number;\n /** Ethereum RPC URL used for public ERC-20 reads in EVM supply flows. */\n evmRpcUrl?: string;\n /** Optional headers for RPC providers that authenticate via HTTP headers. */\n evmRpcHeaders?: Record<string, string>;\n /** Existing viem public client or compatible read client for EVM reads. */\n evmPublicClient?: EvmReadClient;\n}\n\n/** Pool canister principal text values grouped by pool asset. */\nexport interface PoolCanisterIds {\n /** BTC pool canister principal. */\n btc: string;\n /** USDT pool canister principal. */\n usdt: string;\n /** USDC pool canister principal. */\n usdc: string;\n /** ICP pool canister principal. */\n icp: string;\n}\n\n/** Principal text values for canisters used by the client. */\nexport interface CanisterIds {\n /** Liquidium lending canister principal. */\n lending: string;\n /** Pool canister principals grouped by pool asset. */\n pools: PoolCanisterIds;\n /** ckETH minter deposit helper canister principal. */\n ethDeposit: string;\n /** Accountless Simple Loans canister principal. */\n simpleLoans: string;\n}\n\n/** Custom canister principal overrides accepted by client configuration. */\nexport type CanisterIdOverrides = Omit<Partial<CanisterIds>, \"pools\"> & {\n /** Partial grouped pool canister principal overrides. */\n pools?: Partial<PoolCanisterIds>;\n};\n\n/** Supported deployment environments with bundled canister ids. */\nexport const Environment = {\n mainnet: \"mainnet\",\n} as const;\n/** Supported deployment environment name. */\nexport type Environment = (typeof Environment)[keyof typeof Environment];\n\n/** Canonical asset symbols supported by state-mutating protocol flows. */\nexport const Asset = {\n BTC: \"BTC\",\n ICP: \"ICP\",\n USDC: \"USDC\",\n USDT: \"USDT\",\n} as const;\n/** Canonical asset symbol supported by state-mutating protocol flows. */\nexport type Asset = (typeof Asset)[keyof typeof Asset];\n\n/** Canonical chain identifiers used by wallet and protocol actions. */\nexport const Chain = {\n BTC: \"BTC\",\n ETH: \"ETH\",\n ICP: \"ICP\",\n} as const;\n/** Canonical chain identifier used by wallet and protocol actions. */\nexport type Chain = (typeof Chain)[keyof typeof Chain];\n\n/** Chains whose wallets can authorize Liquidium protocol actions. */\nexport type SigningChain = typeof Chain.BTC | typeof Chain.ETH;\n\n/** Supported asset and transfer-chain combinations. */\nexport type AssetIdentifier =\n | { chain: typeof Chain.BTC; asset: typeof Asset.BTC }\n | { chain: typeof Chain.ETH; asset: typeof Asset.USDC }\n | { chain: typeof Chain.ETH; asset: typeof Asset.USDT }\n | { chain: typeof Chain.ICP; asset: typeof Asset.BTC }\n | { chain: typeof Chain.ICP; asset: typeof Asset.ICP }\n | { chain: typeof Chain.ICP; asset: typeof Asset.USDC }\n | { chain: typeof Chain.ICP; asset: typeof Asset.USDT };\n\n/** Returns whether an asset and chain form a supported SDK identifier. */\nexport function isAssetIdentifier(identifier: {\n chain: string;\n asset: string;\n}): identifier is AssetIdentifier {\n switch (identifier.chain) {\n case Chain.BTC:\n return identifier.asset === Asset.BTC;\n case Chain.ETH:\n return identifier.asset === Asset.USDC || identifier.asset === Asset.USDT;\n case Chain.ICP:\n return (\n identifier.asset === Asset.BTC ||\n identifier.asset === Asset.ICP ||\n identifier.asset === Asset.USDC ||\n identifier.asset === Asset.USDT\n );\n default:\n return false;\n }\n}\n\n/** Inflow operation performed by a supply target. */\nexport const SupplyAction = {\n deposit: \"deposit\",\n repayment: \"repayment\",\n} as const;\n/** Inflow operation performed by a supply target. */\nexport type SupplyAction = (typeof SupplyAction)[keyof typeof SupplyAction];\n\n/** Outflow operation reported by the lending canister. */\nexport const OutflowType = {\n borrow: \"borrow\",\n feeClaim: \"feeClaim\",\n withdrawal: \"withdrawal\",\n} as const;\n/** Outflow operation reported by the lending canister. */\nexport type OutflowType = (typeof OutflowType)[keyof typeof OutflowType];\n\n/** Wallet address and chain pair linked to a Liquidium profile. */\nexport interface Wallet {\n /** Chain where the wallet address is valid. */\n chain: SigningChain;\n /** Wallet address as stored by the protocol. */\n address: string;\n}\n","import { LiquidiumError, LiquidiumErrorCode } from \"./errors\";\nimport {\n type CanisterIdOverrides,\n type CanisterIds,\n Environment,\n} from \"./types\";\n\nconst MAINNET_HOST = \"https://icp-api.io\";\nexport const DEFAULT_API_BASE_URL = \"https://app.liquidium.fi/api/sdk\";\nexport const DEFAULT_ENVIRONMENT: Environment = Environment.mainnet;\n\nconst MAINNET_CANISTER_IDS: CanisterIds = {\n lending: \"hyk4r-jqaaa-aaaar-qb4ca-cai\",\n pools: {\n btc: \"hkmli-faaaa-aaaar-qb4ba-cai\",\n usdt: \"hnnn4-iyaaa-aaaar-qb4bq-cai\",\n usdc: \"6sna2-oiaaa-aaaar-qb66q-cai\",\n icp: \"r2pk3-4yaaa-aaaar-qb7zq-cai\",\n },\n ethDeposit: \"z5jz7-nyaaa-aaaar-qb6pq-cai\",\n simpleLoans: \"u5rm3-niaaa-aaaar-qb7eq-cai\",\n};\n\nconst CANISTER_IDS_BY_ENVIRONMENT: Record<Environment, CanisterIds> = {\n mainnet: MAINNET_CANISTER_IDS,\n};\n\nconst SUPPORTED_CANISTER_ID_OVERRIDE_KEYS = new Set([\n \"lending\",\n \"pools\",\n \"ethDeposit\",\n \"simpleLoans\",\n]);\nconst SUPPORTED_POOL_CANISTER_ID_OVERRIDE_KEYS = new Set([\n \"btc\",\n \"usdt\",\n \"usdc\",\n \"icp\",\n]);\n\nexport function resolveHost(override?: string): string {\n return override ?? MAINNET_HOST;\n}\n\n/** Resolves environment canister ids with optional per-canister overrides. */\nexport function resolveCanisterIds(\n environment: Environment = DEFAULT_ENVIRONMENT,\n overrides?: CanisterIdOverrides\n): CanisterIds {\n const defaults = CANISTER_IDS_BY_ENVIRONMENT[environment];\n validateCanisterIdOverrides(overrides);\n\n const pools = {\n ...defaults.pools,\n ...overrides?.pools,\n };\n\n return {\n lending: overrides?.lending ?? defaults.lending,\n pools,\n ethDeposit: overrides?.ethDeposit ?? defaults.ethDeposit,\n simpleLoans: overrides?.simpleLoans ?? defaults.simpleLoans,\n };\n}\n\nfunction validateCanisterIdOverrides(overrides?: CanisterIdOverrides): void {\n if (!overrides) {\n return;\n }\n\n for (const key of Object.keys(overrides)) {\n if (!SUPPORTED_CANISTER_ID_OVERRIDE_KEYS.has(key)) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n `Unsupported canisterIds override: ${key}`\n );\n }\n }\n\n if (!overrides.pools) {\n return;\n }\n\n for (const key of Object.keys(overrides.pools)) {\n if (!SUPPORTED_POOL_CANISTER_ID_OVERRIDE_KEYS.has(key)) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n `Unsupported canisterIds.pools override: ${key}`\n );\n }\n }\n}\n\nexport const DEFAULT_TIMEOUT_MS = 30_000;\n\n/** Mainnet chain-key asset and ICP helper canister principals. */\nexport const CK_CANISTER_IDS = {\n BTC: {\n minter: \"mqygn-kiaaa-aaaar-qaadq-cai\",\n ledger: \"mxzaz-hqaaa-aaaar-qaada-cai\",\n index: \"n5wcd-faaaa-aaaar-qaaea-cai\",\n archive: \"nbsys-saaaa-aaaar-qaaga-cai\",\n },\n USDT: {\n ledger: \"cngnf-vqaaa-aaaar-qag4q-cai\",\n index: \"cefgz-dyaaa-aaaar-qag5a-cai\",\n },\n USDC: {\n ledger: \"xevnm-gaaaa-aaaar-qafnq-cai\",\n index: \"xrs4b-hiaaa-aaaar-qafoa-cai\",\n },\n ICP: {\n ledger: \"ryjl3-tyaaa-aaaaa-aaaba-cai\",\n index: \"qhbym-qaaaa-aaaaa-aaafq-cai\",\n },\n} as const;\n","import { LiquidiumError, LiquidiumErrorCode } from \"../errors\";\n\nconst DOM_EXCEPTION_ABORT_ERROR_NAME = \"AbortError\";\nconst HTTP_HEADER_CONTENT_TYPE = \"content-type\";\nconst HTTP_HEADER_REQUEST_ID = \"x-request-id\";\nconst HTTP_HEADER_TRACE_ID = \"x-trace-id\";\nconst HTTP_METHOD_GET = \"GET\";\nconst HTTP_METHOD_POST = \"POST\";\nconst MIME_TYPE_APPLICATION_JSON = \"application/json\";\n\nexport interface ApiClient {\n get<T>(path: string): Promise<T>;\n post<TResponse, TBody>(path: string, body: TBody): Promise<TResponse>;\n}\n\ninterface CreateApiClientOptions {\n baseUrl: string;\n headers?: Record<string, string>;\n timeoutMs: number;\n fetchFn?: typeof fetch;\n}\n\ninterface SendRequestOptions {\n baseUrl: string;\n fetchFn?: typeof fetch;\n headers?: Record<string, string>;\n timeoutMs: number;\n}\n\ninterface ApiRequest {\n path: string;\n method: typeof HTTP_METHOD_GET | typeof HTTP_METHOD_POST;\n body?: unknown;\n}\n\ninterface ResponseErrorContext {\n traceId?: string;\n requestId?: string;\n}\n\ninterface JsonErrorPayload {\n message?: unknown;\n}\n\nexport function createApiClient(opts: CreateApiClientOptions): ApiClient {\n const normalizedOpts = {\n ...opts,\n baseUrl: normalizeBaseUrl(opts.baseUrl),\n };\n\n return {\n async get<T>(path: string): Promise<T> {\n return await sendRequest<T>(normalizedOpts, {\n path,\n method: HTTP_METHOD_GET,\n });\n },\n async post<TResponse, TBody>(\n path: string,\n body: TBody\n ): Promise<TResponse> {\n return await sendRequest<TResponse>(normalizedOpts, {\n path,\n method: HTTP_METHOD_POST,\n body,\n });\n },\n };\n}\n\nfunction normalizeBaseUrl(baseUrl: string): string {\n return baseUrl.replace(/\\/+$/, \"\");\n}\n\nasync function sendRequest<TResponse>(\n opts: SendRequestOptions,\n request: ApiRequest\n): Promise<TResponse> {\n const url = `${opts.baseUrl}${request.path}`;\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), opts.timeoutMs);\n const fetchFn = opts.fetchFn ?? fetch;\n const requestHeaders = {\n ...opts.headers,\n ...(request.method === HTTP_METHOD_POST\n ? {\n [HTTP_HEADER_CONTENT_TYPE]: MIME_TYPE_APPLICATION_JSON,\n }\n : {}),\n };\n\n try {\n const response = await fetchFn(url, {\n method: request.method,\n headers:\n Object.keys(requestHeaders).length > 0 ? requestHeaders : undefined,\n body:\n request.method === HTTP_METHOD_POST\n ? JSON.stringify(request.body)\n : undefined,\n signal: controller.signal,\n });\n\n if (!response.ok) {\n const payload = await tryParseJson(response);\n const errorContext = getResponseErrorContext(response);\n const message =\n getErrorMessage(payload) ??\n `API request failed: ${response.status} ${response.statusText}`;\n\n throw new LiquidiumError(\n LiquidiumErrorCode.SERVICE_UNAVAILABLE,\n appendErrorContext(message, errorContext),\n undefined,\n errorContext\n );\n }\n\n return (await response.json()) as TResponse;\n } catch (error) {\n if (error instanceof LiquidiumError) {\n throw error;\n }\n\n if (\n error instanceof DOMException &&\n error.name === DOM_EXCEPTION_ABORT_ERROR_NAME\n ) {\n throw new LiquidiumError(\n LiquidiumErrorCode.REQUEST_TIMEOUT,\n `Request to ${request.path} timed out after ${opts.timeoutMs}ms`\n );\n }\n\n throw new LiquidiumError(\n LiquidiumErrorCode.NETWORK_ERROR,\n `Failed to reach API: ${String(error)}`,\n error\n );\n } finally {\n clearTimeout(timeout);\n }\n}\n\nasync function tryParseJson(response: Response): Promise<unknown> {\n try {\n return await response.json();\n } catch {\n return null;\n }\n}\n\nfunction getErrorMessage(payload: unknown): string | null {\n if (!payload || typeof payload !== \"object\") {\n return null;\n }\n\n const message = (payload as JsonErrorPayload).message;\n return typeof message === \"string\" && message.length > 0 ? message : null;\n}\n\nfunction getResponseErrorContext(response: Response): ResponseErrorContext {\n return {\n traceId: response.headers.get(HTTP_HEADER_TRACE_ID) ?? undefined,\n requestId: response.headers.get(HTTP_HEADER_REQUEST_ID) ?? undefined,\n };\n}\n\nfunction appendErrorContext(\n message: string,\n context: ResponseErrorContext\n): string {\n if (!context.traceId && !context.requestId) {\n return message;\n }\n\n const details = [\n context.traceId ? `traceId=${context.traceId}` : undefined,\n context.requestId ? `requestId=${context.requestId}` : undefined,\n ].filter((value): value is string => Boolean(value));\n\n return `${message} (${details.join(\", \")})`;\n}\n","import type { Identity } from \"@icp-sdk/core/agent\";\nimport { HttpAgent } from \"@icp-sdk/core/agent\";\nimport { resolveHost } from \"../config\";\nimport type { CanisterIds } from \"../types\";\n\nexport interface CanisterContext {\n agent: HttpAgent;\n canisterIds: CanisterIds;\n}\n\ninterface CreateCanisterContextOptions {\n icHost?: string;\n identity?: Identity;\n canisterIds: CanisterIds;\n}\n\nexport function createCanisterContext(\n opts: CreateCanisterContextOptions\n): CanisterContext {\n const host = resolveHost(opts.icHost);\n\n const agent = HttpAgent.createSync({\n host,\n identity: opts.identity,\n });\n\n return {\n agent,\n canisterIds: opts.canisterIds,\n };\n}\n","export const idlFactory = ({ IDL }) => {\n const Chains = IDL.Variant({\n 'BTC' : IDL.Null,\n 'ETH' : IDL.Null,\n 'ICP' : IDL.Null,\n 'SOL' : IDL.Null,\n });\n const WalletType = IDL.Variant({ 'Wallet' : Chains });\n const SignatureInfo = IDL.Record({\n 'signature' : IDL.Text,\n 'chain' : Chains,\n 'account' : IDL.Text,\n });\n const SignatureScheme = IDL.Variant({ 'Wallet' : SignatureInfo });\n const AddAccountRequest = IDL.Record({\n 'target_principal' : IDL.Principal,\n 'chain' : WalletType,\n 'wallet_signature' : SignatureScheme,\n 'expiry_timestamp' : IDL.Nat64,\n });\n const SignedRequest = IDL.Record({\n 'data' : AddAccountRequest,\n 'signature_info' : SignatureScheme,\n });\n const SignatureVerificationError = IDL.Variant({\n 'InvalidEthSignature' : IDL.Null,\n 'UnsupportedChain' : IDL.Null,\n 'InvalidSolSignature' : IDL.Null,\n 'InvalidEthAddress' : IDL.Null,\n 'CouldNotDecode' : IDL.Text,\n 'ProfileNotFound' : IDL.Null,\n 'InvalidBtcSignature' : IDL.Null,\n });\n const ProtocolError = IDL.Variant({\n 'PositionNotFound' : IDL.Null,\n 'Internal' : IDL.Text,\n 'InvalidAddress' : IDL.Text,\n 'InvalidTargetPrincipal' : IDL.Null,\n 'SignatureError' : SignatureVerificationError,\n 'SupplyCapExceeded' : IDL.Null,\n 'AccountNotFound' : IDL.Null,\n 'NotAllowed' : IDL.Text,\n 'PoolNotFound' : IDL.Text,\n 'FeeClaimReceiverNotConfigured' : IDL.Null,\n 'InsufficientCollateral' : IDL.Null,\n 'ProfileNotFound' : IDL.Null,\n 'SignatureExpiryTooFarInFuture' : IDL.Null,\n 'MaxLtvExceeded' : IDL.Null,\n 'ProfileAlreadyExists' : IDL.Null,\n 'LiquidationNotFound' : IDL.Text,\n 'HealthFactorTooLow' : IDL.Null,\n 'NoLiquidity' : IDL.Null,\n 'SignatureExpired' : IDL.Null,\n 'BorrowingDisabled' : IDL.Null,\n 'BorrowCapExceeded' : IDL.Null,\n 'PoolFrozen' : IDL.Null,\n 'TransferFailed' : IDL.Text,\n 'AccountAlreadyLinked' : IDL.Null,\n 'CannotRemoveSoleAccount' : IDL.Null,\n 'InsufficientFunds' : IDL.Null,\n });\n const Result = IDL.Variant({ 'Ok' : IDL.Null, 'Err' : ProtocolError });\n const IcrcAccount = IDL.Record({\n 'owner' : IDL.Principal,\n 'subaccount' : IDL.Opt(IDL.Vec(IDL.Nat8)),\n });\n const AccountType = IDL.Variant({\n 'Icrc' : IcrcAccount,\n 'Native' : IDL.Principal,\n 'AccountIdentifier' : IDL.Text,\n 'External' : IDL.Text,\n });\n const BorrowAssetRequest = IDL.Record({\n 'expiry_timestamp' : IDL.Nat64,\n 'account' : AccountType,\n 'pool_id' : IDL.Principal,\n 'amount' : IDL.Nat,\n });\n const SignedRequest_1 = IDL.Record({\n 'data' : BorrowAssetRequest,\n 'signature_info' : SignatureScheme,\n });\n const OutflowType = IDL.Variant({\n 'Withdraw' : IDL.Null,\n 'FeeClaim' : IDL.Null,\n 'Borrow' : IDL.Null,\n });\n const OutflowDetails = IDL.Record({\n 'id' : IDL.Text,\n 'txid' : IDL.Opt(IDL.Text),\n 'outflow_type' : OutflowType,\n 'outflow_ref' : IDL.Opt(IDL.Text),\n 'amount' : IDL.Nat,\n 'receiver' : AccountType,\n });\n const Result_1 = IDL.Variant({\n 'Ok' : OutflowDetails,\n 'Err' : ProtocolError,\n });\n const ClaimFeeRequest = IDL.Record({ 'pool_id' : IDL.Principal });\n const AssetType = IDL.Variant({\n 'CkAsset' : IDL.Principal,\n 'Unknown' : IDL.Null,\n });\n const Assets = IDL.Variant({\n 'BTC' : IDL.Null,\n 'ICP' : IDL.Null,\n 'SOL' : IDL.Null,\n 'USDC' : IDL.Null,\n 'USDT' : IDL.Null,\n });\n const LiquidatablePosition = IDL.Record({\n 'collateral_amount' : IDL.Nat,\n 'asset_type' : AssetType,\n 'debt_amount' : IDL.Nat,\n 'asset' : Assets,\n 'account' : IDL.Principal,\n 'pool_id' : IDL.Principal,\n 'protocol_fee' : IDL.Nat64,\n 'liquidation_bonus' : IDL.Nat64,\n 'liquidation_threshold' : IDL.Nat64,\n });\n const LiquidatableUser = IDL.Record({\n 'health_factor' : IDL.Nat,\n 'total_debt' : IDL.Nat,\n 'account' : IDL.Principal,\n 'positions' : IDL.Vec(LiquidatablePosition),\n 'weighted_liquidation_threshold' : IDL.Nat,\n });\n const RepaymentDetails = IDL.Record({\n 'id' : IDL.Text,\n 'txid' : IDL.Text,\n 'account' : IDL.Principal,\n 'timestamp' : IDL.Nat64,\n 'amount' : IDL.Nat,\n });\n const Wallet = IDL.Record({ 'chain' : WalletType, 'address' : IDL.Text });\n const ProfileCreatedEvent = IDL.Record({\n 'wallet' : Wallet,\n 'profile' : IDL.Principal,\n });\n const InflowType = IDL.Variant({\n 'Repayment' : IDL.Null,\n 'Deposit' : IDL.Null,\n });\n const InflowDetails = IDL.Record({\n 'id' : IDL.Text,\n 'inflow_type' : InflowType,\n 'txid' : IDL.Text,\n 'timestamp' : IDL.Nat64,\n 'amount' : IDL.Nat,\n 'receiver' : IDL.Principal,\n });\n const LiqTxTarget = IDL.Variant({\n 'Collateral' : IDL.Null,\n 'Change' : IDL.Null,\n });\n const Pool = IDL.Record({\n 'optimal_utilization_rate' : IDL.Nat,\n 'principal' : IDL.Principal,\n 'total_generated_interest_snapshot' : IDL.Nat,\n 'asset_type' : AssetType,\n 'supply_cap' : IDL.Opt(IDL.Nat),\n 'same_asset_borrowing' : IDL.Opt(IDL.Bool),\n 'asset' : Assets,\n 'rate_slope_before' : IDL.Nat,\n 'borrow_cap' : IDL.Opt(IDL.Nat),\n 'total_debt_at_last_sync' : IDL.Nat,\n 'supply_at_last_sync' : IDL.Nat,\n 'chain' : Chains,\n 'rate_slope_after' : IDL.Nat,\n 'reserve_factor' : IDL.Nat64,\n 'last_updated' : IDL.Opt(IDL.Nat64),\n 'lending_index' : IDL.Nat,\n 'protocol_liquidation_fee' : IDL.Nat64,\n 'treasury_supply_scaled' : IDL.Nat,\n 'same_asset_borrowing_dust_threshold' : IDL.Nat,\n 'borrow_index' : IDL.Nat,\n 'base_rate' : IDL.Nat,\n 'frozen' : IDL.Bool,\n 'liquidation_bonus' : IDL.Nat64,\n 'liquidation_threshold' : IDL.Nat64,\n 'max_ltv' : IDL.Nat64,\n 'repay_grace_period' : IDL.Opt(IDL.Nat64),\n 'pending_service_fees' : IDL.Nat,\n 'total_supply_at_last_sync' : IDL.Nat,\n });\n const LiquidationStatus = IDL.Variant({\n 'CollateralTransferFailed' : IDL.Text,\n 'FailedLiquidation' : IDL.Text,\n 'InflowProcessed' : IDL.Null,\n 'Success' : IDL.Null,\n 'CoreExecuted' : IDL.Null,\n 'ChangeTransferFailed' : IDL.Text,\n 'Pending' : IDL.Null,\n });\n const TransferStatus = IDL.Variant({\n 'Failed' : IDL.Text,\n 'Success' : IDL.Null,\n 'Pending' : IDL.Null,\n });\n const TxStatus = IDL.Record({\n 'status' : TransferStatus,\n 'tx_id' : IDL.Opt(IDL.Text),\n });\n const LiquidationAmounts = IDL.Record({\n 'debt_repaid' : IDL.Nat,\n 'collateral_received' : IDL.Nat,\n });\n const LiquidationResult = IDL.Record({\n 'id' : IDL.Nat,\n 'status' : LiquidationStatus,\n 'change_tx' : TxStatus,\n 'debt_asset' : AssetType,\n 'amounts' : LiquidationAmounts,\n 'collateral_asset' : AssetType,\n 'timestamp' : IDL.Nat64,\n 'collateral_tx' : TxStatus,\n });\n const LiquidationRequest = IDL.Record({\n 'debt_amount' : IDL.Nat,\n 'receiver_address' : IDL.Principal,\n 'collateral_pool_id' : IDL.Principal,\n 'borrower' : IDL.Principal,\n 'debt_pool_id' : IDL.Principal,\n 'buy_bad_debt' : IDL.Bool,\n });\n const ProtocolEventType = IDL.Variant({\n 'RepaymentRejected' : IDL.Record({\n 'pool' : IDL.Principal,\n 'error' : ProtocolError,\n 'details' : RepaymentDetails,\n }),\n 'AccountCreated' : ProfileCreatedEvent,\n 'DepositConfirmed' : IDL.Record({\n 'pool' : IDL.Principal,\n 'details' : InflowDetails,\n }),\n 'DepositRejected' : IDL.Record({\n 'pool' : IDL.Principal,\n 'error' : ProtocolError,\n 'details' : InflowDetails,\n }),\n 'AccountAdded' : Wallet,\n 'BorrowStateUpdated' : IDL.Bool,\n 'LiquidationUnderlyingWithdrawal' : IDL.Record({\n 'txid' : IDL.Text,\n 'target' : LiqTxTarget,\n 'liquidation_id' : IDL.Nat,\n 'account' : IDL.Text,\n 'pool_id' : IDL.Text,\n 'amount' : IDL.Nat,\n }),\n 'PoolUpdated' : Pool,\n 'RepaymentConfirmed' : IDL.Record({\n 'pool' : IDL.Principal,\n 'details' : RepaymentDetails,\n }),\n 'LiquidationExecuted' : IDL.Record({\n 'result' : LiquidationResult,\n 'request' : LiquidationRequest,\n }),\n 'WithdrawalConfirmed' : IDL.Record({\n 'pool' : IDL.Principal,\n 'details' : OutflowDetails,\n }),\n 'BorrowConfirmed' : IDL.Record({\n 'pool' : IDL.Principal,\n 'details' : OutflowDetails,\n }),\n 'PoolRegistered' : Pool,\n 'AccountRemoved' : Wallet,\n 'PoolRemoved' : IDL.Principal,\n });\n const ProtocolEvent = IDL.Record({\n 'id' : IDL.Nat,\n 'user' : IDL.Principal,\n 'timestamp' : IDL.Nat64,\n 'event_type' : ProtocolEventType,\n });\n const BorrowingPower = IDL.Record({\n 'max_borrowable_usd' : IDL.Nat,\n 'weighted_max_ltv' : IDL.Nat,\n });\n const Position = IDL.Record({\n 'asset' : Assets,\n 'total_debt_interest' : IDL.Nat,\n 'borrow_index_snapshot' : IDL.Nat,\n 'lending_index_snapshot' : IDL.Nat,\n 'debt_scaled' : IDL.Nat,\n 'total_earned_interest' : IDL.Nat,\n 'deposit_scaled' : IDL.Nat,\n 'pool_id' : IDL.Principal,\n 'unpaid_debt_interest' : IDL.Nat,\n 'last_update' : IDL.Nat64,\n 'user_profile' : IDL.Principal,\n });\n const UserStats = IDL.Record({\n 'debt' : IDL.Nat,\n 'collateral' : IDL.Nat,\n 'acumulated_interest' : IDL.Nat,\n 'borrowing_power' : BorrowingPower,\n 'positions' : IDL.Vec(Position),\n 'weighted_liquidation_threshold' : IDL.Nat,\n });\n const Result_2 = IDL.Variant({\n 'Ok' : LiquidationResult,\n 'Err' : ProtocolError,\n });\n const PositionView = IDL.Record({\n 'lending_index_now' : IDL.Nat,\n 'interest_since_snapshot' : IDL.Nat,\n 'asset' : Assets,\n 'total_debt_interest' : IDL.Nat,\n 'borrow_index_snapshot' : IDL.Nat,\n 'debt_native_now' : IDL.Nat,\n 'borrow_index_now' : IDL.Nat,\n 'lending_index_snapshot' : IDL.Nat,\n 'debt_scaled' : IDL.Nat,\n 'total_earned_interest' : IDL.Nat,\n 'deposit_scaled' : IDL.Nat,\n 'earned_since_snapshot' : IDL.Nat,\n 'deposited_native_now' : IDL.Nat,\n 'pool_id' : IDL.Principal,\n 'last_update' : IDL.Nat64,\n 'user_profile' : IDL.Principal,\n });\n const Result_3 = IDL.Variant({\n 'Ok' : IDL.Tuple(IDL.Nat, IDL.Nat32),\n 'Err' : IDL.Text,\n });\n const ListPositionsResponse = IDL.Record({\n 'total' : IDL.Nat64,\n 'next_cursor' : IDL.Opt(IDL.Tuple(IDL.Principal, IDL.Principal)),\n 'positions' : IDL.Vec(PositionView),\n });\n const ListProfilesResponse = IDL.Record({\n 'total' : IDL.Nat64,\n 'next_cursor' : IDL.Opt(IDL.Principal),\n 'profiles' : IDL.Vec(\n IDL.Tuple(IDL.Principal, IDL.Tuple(IDL.Nat, UserStats))\n ),\n });\n const PoolEvents = IDL.Variant({\n 'DepositConfirmed' : InflowDetails,\n 'RepaymentConfirmed' : RepaymentDetails,\n });\n const Result_4 = IDL.Variant({\n 'Ok' : IDL.Opt(IDL.Nat),\n 'Err' : ProtocolError,\n });\n const InitializeAccountRequest = IDL.Record({\n 'expiry_timestamp' : IDL.Nat64,\n });\n const SignedRequest_2 = IDL.Record({\n 'data' : InitializeAccountRequest,\n 'signature_info' : SignatureScheme,\n });\n const Result_5 = IDL.Variant({ 'Ok' : IDL.Principal, 'Err' : ProtocolError });\n const Result_6 = IDL.Variant({ 'Ok' : IDL.Null, 'Err' : IDL.Text });\n const RemoveAccountRequest = IDL.Record({\n 'wallet_address' : IDL.Text,\n 'expiry_timestamp' : IDL.Nat64,\n });\n const SignedRequest_3 = IDL.Record({\n 'data' : RemoveAccountRequest,\n 'signature_info' : SignatureScheme,\n });\n const ScanResult = IDL.Record({\n 'scanned' : IDL.Nat64,\n 'users' : IDL.Vec(LiquidatableUser),\n 'next_cursor' : IDL.Opt(IDL.Principal),\n });\n const Result_7 = IDL.Variant({ 'Ok' : IDL.Null, 'Err' : IDL.Text });\n const WithdrawRequest = IDL.Record({\n 'expiry_timestamp' : IDL.Nat64,\n 'account' : AccountType,\n 'pool_id' : IDL.Principal,\n 'amount' : IDL.Nat,\n });\n const SignedRequest_4 = IDL.Record({\n 'data' : WithdrawRequest,\n 'signature_info' : SignatureScheme,\n });\n const Result_8 = IDL.Variant({ 'Ok' : IDL.Nat, 'Err' : ProtocolError });\n return IDL.Service({\n 'add_admin' : IDL.Func([IDL.Principal], [], []),\n 'add_liquidator' : IDL.Func([IDL.Principal], [], []),\n 'add_wallet' : IDL.Func([IDL.Principal, SignedRequest], [Result], []),\n 'borrow_assets' : IDL.Func(\n [IDL.Principal, SignedRequest_1],\n [Result_1],\n [],\n ),\n 'claim_fee' : IDL.Func([ClaimFeeRequest], [Result_1], []),\n 'disable_borrowing' : IDL.Func([], [], []),\n 'disable_same_asset_borrowing' : IDL.Func([IDL.Principal], [], []),\n 'enable_borrowing' : IDL.Func([], [], []),\n 'enable_same_asset_borrowing' : IDL.Func([IDL.Principal], [], []),\n 'freeze_pool' : IDL.Func([IDL.Principal], [], []),\n 'get_admins' : IDL.Func([], [IDL.Vec(IDL.Principal)], ['query']),\n 'get_at_risk_positions' : IDL.Func(\n [IDL.Nat64, IDL.Nat64],\n [IDL.Vec(LiquidatableUser)],\n ['query'],\n ),\n 'get_borrowing_disabled' : IDL.Func([], [IDL.Bool], ['query']),\n 'get_event' : IDL.Func([IDL.Nat], [IDL.Opt(ProtocolEvent)], ['query']),\n 'get_health_factor' : IDL.Func(\n [IDL.Principal],\n [IDL.Nat, UserStats],\n ['query'],\n ),\n 'get_liquidation' : IDL.Func([IDL.Nat], [Result_2], ['query']),\n 'get_liquidators' : IDL.Func([], [IDL.Vec(IDL.Principal)], ['query']),\n 'get_nonce' : IDL.Func([IDL.Text], [IDL.Nat], ['query']),\n 'get_pool' : IDL.Func([IDL.Principal], [IDL.Opt(Pool)], ['query']),\n 'get_pool_rate' : IDL.Func(\n [IDL.Principal],\n [IDL.Opt(IDL.Tuple(IDL.Nat, IDL.Nat, IDL.Nat))],\n ['query'],\n ),\n 'get_position' : IDL.Func(\n [IDL.Principal, IDL.Principal],\n [IDL.Opt(PositionView)],\n ['query'],\n ),\n 'get_price' : IDL.Func([IDL.Text, IDL.Text], [Result_3], ['query']),\n 'get_prices' : IDL.Func(\n [],\n [IDL.Vec(IDL.Tuple(IDL.Text, IDL.Nat, IDL.Nat32))],\n ['query'],\n ),\n 'get_profile_stats' : IDL.Func([IDL.Principal], [UserStats], ['query']),\n 'get_profile_wallets' : IDL.Func(\n [IDL.Principal],\n [IDL.Vec(Wallet)],\n ['query'],\n ),\n 'get_protocol_fee_claim_receiver' : IDL.Func(\n [],\n [IDL.Opt(IDL.Principal)],\n ['query'],\n ),\n 'get_wallet_profile' : IDL.Func(\n [IDL.Text],\n [IDL.Opt(IDL.Principal)],\n ['query'],\n ),\n 'liquidate' : IDL.Func([LiquidationRequest], [Result_2], []),\n 'list_events' : IDL.Func(\n [IDL.Nat, IDL.Nat64],\n [IDL.Vec(IDL.Tuple(IDL.Nat, ProtocolEvent))],\n ['query'],\n ),\n 'list_pools' : IDL.Func([], [IDL.Vec(Pool)], ['query']),\n 'list_positions' : IDL.Func(\n [IDL.Opt(IDL.Tuple(IDL.Principal, IDL.Principal)), IDL.Nat64],\n [ListPositionsResponse],\n ['query'],\n ),\n 'list_profiles' : IDL.Func(\n [IDL.Opt(IDL.Principal), IDL.Nat64],\n [ListProfilesResponse],\n ['query'],\n ),\n 'notify_fee_claim_rollback' : IDL.Func([IDL.Nat], [], []),\n 'notify_pool_events' : IDL.Func(\n [IDL.Vec(PoolEvents)],\n [IDL.Vec(Result)],\n [],\n ),\n 'refresh_pool_transfer_fee' : IDL.Func([IDL.Principal], [Result_4], []),\n 'refund_stuck_liquidation' : IDL.Func([IDL.Nat], [Result_2], []),\n 'register_pool' : IDL.Func([Pool], [], []),\n 'register_profile' : IDL.Func([SignedRequest_2], [Result_5], []),\n 'remove_admin' : IDL.Func([IDL.Principal], [], []),\n 'remove_liquidator' : IDL.Func([IDL.Principal], [], []),\n 'remove_pool' : IDL.Func([IDL.Principal], [Result_6], []),\n 'remove_wallet' : IDL.Func([IDL.Principal, SignedRequest_3], [Result], []),\n 'scan_at_risk_positions' : IDL.Func(\n [IDL.Opt(IDL.Principal), IDL.Nat64, IDL.Nat64],\n [ScanResult],\n ['query'],\n ),\n 'set_base_rate' : IDL.Func([IDL.Principal, IDL.Nat], [], []),\n 'set_optimal_utilization_rate' : IDL.Func([IDL.Principal, IDL.Nat], [], []),\n 'set_pool_borrow_cap' : IDL.Func([IDL.Principal, IDL.Opt(IDL.Nat)], [], []),\n 'set_pool_liquidation_bonus' : IDL.Func([IDL.Principal, IDL.Nat64], [], []),\n 'set_pool_liquidation_threshold' : IDL.Func(\n [IDL.Principal, IDL.Nat64],\n [],\n [],\n ),\n 'set_pool_max_ltv' : IDL.Func([IDL.Principal, IDL.Nat64], [], []),\n 'set_pool_protocol_liquidation_fee' : IDL.Func(\n [IDL.Principal, IDL.Nat64],\n [],\n [],\n ),\n 'set_pool_reserve_factor' : IDL.Func([IDL.Principal, IDL.Nat64], [], []),\n 'set_pool_supply_cap' : IDL.Func([IDL.Principal, IDL.Opt(IDL.Nat)], [], []),\n 'set_protocol_fee_claim_receiver' : IDL.Func(\n [IDL.Principal],\n [Result_7],\n [],\n ),\n 'set_rate_slope_after' : IDL.Func([IDL.Principal, IDL.Nat], [], []),\n 'set_rate_slope_before' : IDL.Func([IDL.Principal, IDL.Nat], [], []),\n 'set_same_asset_borrow_dust_threshold' : IDL.Func(\n [IDL.Principal, IDL.Nat],\n [],\n [],\n ),\n 'unfreeze_pool' : IDL.Func([IDL.Principal], [], []),\n 'withdraw' : IDL.Func([IDL.Principal, SignedRequest_4], [Result_1], []),\n 'withdraw_stuck_pool_funds' : IDL.Func(\n [IDL.Principal, SignedRequest_4],\n [Result_8],\n [],\n ),\n });\n};\nexport const init = ({ IDL }) => { return [IDL.Opt(IDL.Text)]; };\n","import { Actor } from \"@icp-sdk/core/agent\";\nimport type {\n _SERVICE,\n BorrowingPower,\n ProtocolError as GeneratedProtocolError,\n SignatureVerificationError as GeneratedSignatureVerificationError,\n SignedRequest_2,\n Wallet,\n} from \"../../../generated/canisters/lending/lending.did\";\nimport { idlFactory } from \"../../../generated/canisters/lending/lending.did.js\";\nimport { LiquidiumError, LiquidiumErrorCode } from \"../../errors\";\nimport type { CanisterContext } from \"../../transports/canister-context\";\n\nexport type WalletRecord = Wallet;\nexport type BorrowingPowerRecord = BorrowingPower;\nexport type RegisterProfileRequest = SignedRequest_2;\nexport type PoolRateTuple = [bigint, bigint, bigint];\nexport type PriceRecord = [string, bigint, number];\nexport type ProtocolError = GeneratedProtocolError;\nexport type SignatureVerificationError = GeneratedSignatureVerificationError;\nexport type LendingActor = _SERVICE;\n\nexport function createLendingActor(\n canisterContext: CanisterContext\n): LendingActor {\n const canisterId = canisterContext.canisterIds.lending;\n\n if (!canisterId) {\n throw new LiquidiumError(\n LiquidiumErrorCode.SERVICE_UNAVAILABLE,\n \"Lending canister ID is not configured\"\n );\n }\n\n return Actor.createActor<LendingActor>(idlFactory, {\n agent: canisterContext.agent,\n canisterId,\n });\n}\n","import { LiquidiumError, LiquidiumErrorCode } from \"../../errors\";\nimport type { ProtocolError, SignatureVerificationError } from \"./actor\";\n\ntype VariantKey<T> = keyof UnionToIntersection<T> & string;\n\ntype UnionToIntersection<T> = (\n T extends unknown\n ? (value: T) => void\n : never\n) extends (value: infer Intersection) => void\n ? Intersection\n : never;\n\ninterface ErrorMapping {\n code: LiquidiumErrorCode;\n fallbackMessage?: string;\n}\n\nconst LENDING_CANISTER_PROTOCOL_RESULT_ERROR_MAP = {\n InvalidTargetPrincipal: { code: LiquidiumErrorCode.INVALID_TARGET_PRINCIPAL },\n InsufficientCollateral: { code: LiquidiumErrorCode.INSUFFICIENT_COLLATERAL },\n SignatureExpiryTooFarInFuture: {\n code: LiquidiumErrorCode.SIGNATURE_EXPIRY_TOO_FAR_IN_FUTURE,\n },\n MaxLtvExceeded: { code: LiquidiumErrorCode.MAX_LTV_EXCEEDED },\n SignatureExpired: { code: LiquidiumErrorCode.SIGNATURE_EXPIRED },\n AccountAlreadyLinked: { code: LiquidiumErrorCode.ACCOUNT_ALREADY_LINKED },\n AccountNotFound: { code: LiquidiumErrorCode.ACCOUNT_NOT_FOUND },\n CannotRemoveSoleAccount: {\n code: LiquidiumErrorCode.CANNOT_REMOVE_SOLE_ACCOUNT,\n },\n ProfileNotFound: { code: LiquidiumErrorCode.PROFILE_NOT_FOUND },\n ProfileAlreadyExists: { code: LiquidiumErrorCode.PROFILE_ALREADY_EXISTS },\n SignatureError: { code: LiquidiumErrorCode.SIGNATURE_ERROR },\n PoolNotFound: {\n code: LiquidiumErrorCode.POOL_NOT_FOUND,\n fallbackMessage: \"Pool not found\",\n },\n PoolFrozen: { code: LiquidiumErrorCode.POOL_FROZEN },\n PositionNotFound: { code: LiquidiumErrorCode.POSITION_NOT_FOUND },\n BorrowCapExceeded: { code: LiquidiumErrorCode.BORROW_CAP_EXCEEDED },\n SupplyCapExceeded: { code: LiquidiumErrorCode.SUPPLY_CAP_EXCEEDED },\n InsufficientFunds: { code: LiquidiumErrorCode.INSUFFICIENT_FUNDS },\n HealthFactorTooLow: { code: LiquidiumErrorCode.HEALTH_FACTOR_TOO_LOW },\n TransferFailed: {\n code: LiquidiumErrorCode.TRANSFER_FAILED,\n fallbackMessage: \"Transfer failed\",\n },\n LiquidationNotFound: {\n code: LiquidiumErrorCode.LIQUIDATION_NOT_FOUND,\n fallbackMessage: \"Liquidation not found\",\n },\n BorrowingDisabled: { code: LiquidiumErrorCode.BORROWING_DISABLED },\n NoLiquidity: { code: LiquidiumErrorCode.NO_LIQUIDITY },\n NotAllowed: {\n code: LiquidiumErrorCode.NOT_ALLOWED,\n fallbackMessage: \"Operation not allowed\",\n },\n InvalidAddress: {\n code: LiquidiumErrorCode.INVALID_ADDRESS,\n fallbackMessage: \"Invalid address\",\n },\n Internal: {\n code: LiquidiumErrorCode.INTERNAL,\n fallbackMessage: \"Internal protocol error\",\n },\n FeeClaimReceiverNotConfigured: {\n code: LiquidiumErrorCode.INTERNAL,\n fallbackMessage: \"Fee claim receiver is not configured\",\n },\n} as const satisfies Record<VariantKey<ProtocolError>, ErrorMapping>;\n\nconst LENDING_CANISTER_SIGNATURE_VERIFICATION_ERROR_MAP = {\n InvalidEthSignature: { code: LiquidiumErrorCode.INVALID_ETH_SIGNATURE },\n InvalidBtcSignature: { code: LiquidiumErrorCode.INVALID_BTC_SIGNATURE },\n InvalidEthAddress: { code: LiquidiumErrorCode.INVALID_ETH_ADDRESS },\n UnsupportedChain: { code: LiquidiumErrorCode.UNSUPPORTED_CHAIN },\n ProfileNotFound: { code: LiquidiumErrorCode.PROFILE_NOT_FOUND },\n CouldNotDecode: {\n code: LiquidiumErrorCode.SIGNATURE_ERROR,\n fallbackMessage: \"Could not decode signature\",\n },\n InvalidSolSignature: {\n code: LiquidiumErrorCode.SIGNATURE_ERROR,\n fallbackMessage: \"Invalid SOL signature\",\n },\n} as const satisfies Record<\n VariantKey<SignatureVerificationError>,\n ErrorMapping\n>;\n\n/** Maps lending canister `Result.Err(ProtocolError)` responses. */\nexport function mapLendingProtocolErrorToLiquidiumError(\n error: ProtocolError\n): LiquidiumError {\n const [key, payload] = getVariantEntry(error);\n\n if (key === \"SignatureError\") {\n return mapLendingSignatureVerificationErrorToLiquidiumError(\n payload as SignatureVerificationError\n );\n }\n\n return mapVariantToLiquidiumError(\n LENDING_CANISTER_PROTOCOL_RESULT_ERROR_MAP[key],\n payload\n );\n}\n\n/** Maps nested `ProtocolError.SignatureError` verification failures. */\nexport function mapLendingSignatureVerificationErrorToLiquidiumError(\n error: SignatureVerificationError\n): LiquidiumError {\n const [key, payload] = getVariantEntry(error);\n\n return mapVariantToLiquidiumError(\n LENDING_CANISTER_SIGNATURE_VERIFICATION_ERROR_MAP[key],\n payload\n );\n}\n\n/** Maps thrown/rejected canister calls, not typed protocol `Err` responses. */\nexport function mapCanisterCallErrorToLiquidiumError(\n methodName: string,\n cause: unknown\n): LiquidiumError {\n return new LiquidiumError(\n LiquidiumErrorCode.CANISTER_REJECTED,\n `Canister call failed: ${methodName}`,\n cause\n );\n}\n\nfunction getVariantEntry<T extends Record<string, unknown>>(\n variant: T\n): [VariantKey<T>, unknown] {\n const [entry] = Object.entries(variant) as [\n [VariantKey<T>, unknown],\n ...Array<[VariantKey<T>, unknown]>,\n ];\n\n return entry;\n}\n\nfunction mapVariantToLiquidiumError(\n mapping: ErrorMapping,\n payload: unknown\n): LiquidiumError {\n const message =\n typeof payload === \"string\"\n ? payload\n : (mapping.fallbackMessage ?? humanizeErrorCode(mapping.code));\n\n return new LiquidiumError(mapping.code, message);\n}\n\nfunction humanizeErrorCode(code: LiquidiumErrorCode): string {\n return code\n .toLowerCase()\n .replaceAll(\"_\", \" \")\n .replace(/^\\w/, (firstLetter) => firstLetter.toUpperCase());\n}\n","import { getAddress, isAddress } from \"viem\";\n\n/** Ethereum mainnet USDC contract address. */\nexport const USDC_CONTRACT_ADDRESS =\n \"0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48\";\n/** Ethereum mainnet USDT contract address. */\nexport const USDT_CONTRACT_ADDRESS =\n \"0xdac17f958d2ee523a2206206994597c13d831ec7\";\n/** Ethereum mainnet ckETH minter ERC-20 deposit helper contract address. */\nexport const CK_ETH_DEPOSIT_CONTRACT_ADDRESS =\n \"0x18901044688D3756C35Ed2b36D93e6a5B8e00E68\";\n\n/** Largest uint256 value, used for max-allowance ERC-20 approvals. */\nexport const MAX_UINT256 =\n 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffn;\n\n/** Minimal ERC-20 ABI used by the SDK for balance, allowance, approval, and transfers. */\nexport const ERC20_ABI = [\n {\n name: \"allowance\",\n type: \"function\",\n inputs: [\n { name: \"owner\", type: \"address\" },\n { name: \"spender\", type: \"address\" },\n ],\n outputs: [{ name: \"remaining\", type: \"uint256\" }],\n stateMutability: \"view\",\n },\n {\n name: \"balanceOf\",\n type: \"function\",\n inputs: [{ name: \"owner\", type: \"address\" }],\n outputs: [{ name: \"balance\", type: \"uint256\" }],\n stateMutability: \"view\",\n },\n {\n name: \"approve\",\n type: \"function\",\n inputs: [\n { name: \"spender\", type: \"address\" },\n { name: \"value\", type: \"uint256\" },\n ],\n outputs: [{ name: \"\", type: \"bool\" }],\n stateMutability: \"nonpayable\",\n },\n {\n name: \"transfer\",\n type: \"function\",\n inputs: [\n { name: \"to\", type: \"address\" },\n { name: \"value\", type: \"uint256\" },\n ],\n outputs: [{ name: \"\", type: \"bool\" }],\n stateMutability: \"nonpayable\",\n },\n] as const;\n\n/** ckETH minter deposit helper ABI used for ERC-20 deposits into ICRC accounts. */\nexport const CK_DEPOSIT_ABI = [\n {\n inputs: [\n { internalType: \"address\", name: \"erc20Address\", type: \"address\" },\n { internalType: \"uint256\", name: \"amount\", type: \"uint256\" },\n { internalType: \"bytes32\", name: \"principal\", type: \"bytes32\" },\n { internalType: \"bytes32\", name: \"subaccount\", type: \"bytes32\" },\n ],\n name: \"depositErc20\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n] as const;\n\n/** Returns an EIP-55 checksum address when `address` is valid EVM input. */\nexport function normalizeEvmAddress(address: string): string {\n if (!isAddress(address)) {\n return address;\n }\n\n return getAddress(address);\n}\n","const MILLISECONDS_PER_SECOND = 1_000;\nconst SIGNATURE_VALIDITY_5_MINUTES_IN_SECONDS = 5n * 60n;\n\nexport function computeExpiryTimestampFromNow(\n signatureValidityInSeconds: bigint = SIGNATURE_VALIDITY_5_MINUTES_IN_SECONDS\n): bigint {\n return (\n BigInt(Math.floor(Date.now() / MILLISECONDS_PER_SECOND)) +\n signatureValidityInSeconds\n );\n}\n","import { LiquidiumError, LiquidiumErrorCode } from \"../errors\";\n\nexport function getVariantKey(variant: object): string {\n const [variantKey] = Object.keys(variant);\n\n if (!variantKey) {\n throw new LiquidiumError(\n LiquidiumErrorCode.INTERNAL,\n \"Unexpected empty canister variant\"\n );\n }\n\n return variantKey;\n}\n","import type { IcrcAccount } from \"./accounts\";\nimport type { Asset, SigningChain } from \"./types\";\n\n/** Wallet capability required to execute a prepared SDK action. */\nexport const WalletExecutionKind = {\n signMessage: \"sign-message\",\n} as const;\n/** Wallet capability required to execute a prepared SDK action. */\nexport type WalletExecutionKind =\n (typeof WalletExecutionKind)[keyof typeof WalletExecutionKind];\n\n/** Protocol action represented by a prepared wallet action. */\nexport const WalletActionKind = {\n createAccount: \"create-account\",\n createBorrow: \"create-borrow\",\n createWithdraw: \"create-withdraw\",\n} as const;\n/** Protocol action represented by a prepared wallet action. */\nexport type WalletActionKind =\n (typeof WalletActionKind)[keyof typeof WalletActionKind];\n\n/** EVM transaction request passed to wallet adapters. */\nexport interface EthTransactionRequest {\n /** Destination address or contract address. */\n to: string;\n /** Hex-encoded calldata for contract interactions. */\n data?: string;\n /** Native ETH value in wei, serialized as a decimal string. */\n value?: string;\n /** Optional EVM chain id for wallet implementations that require it. */\n chainId?: number;\n}\n\n/** Message-signing request passed to wallet adapters. */\nexport interface SignMessageRequest {\n /** Chain for the signing wallet. */\n chain: SigningChain;\n /** Plaintext message to sign. */\n message: string;\n /** Optional account override for the signing wallet. */\n account?: string;\n /** SDK action type that produced this request. */\n actionType: string;\n}\n\n/** ETH transaction-sending request passed to wallet adapters. */\nexport interface SendEthTransactionRequest {\n /** ETH chain discriminator. */\n chain: \"ETH\";\n /** Transaction payload to send. */\n transaction: EthTransactionRequest;\n /** Optional account override for the sending wallet. */\n account?: string;\n /** SDK action type that produced this request. */\n actionType: string;\n}\n\n/** BTC transaction-sending request passed to wallet adapters. */\nexport interface SendBtcTransactionRequest {\n /** BTC chain discriminator. */\n chain: \"BTC\";\n /** Recipient BTC address. */\n toAddress: string;\n /** Amount in satoshis when the SDK knows the transfer amount. */\n amountSats?: bigint;\n /** Optional account override for the sending wallet. */\n account?: string;\n /** SDK action type that produced this request. */\n actionType: string;\n}\n\n/** ICRC ledger transfer payload passed to wallet adapters. */\nexport interface IcrcTransferDetails {\n /** Ledger canister principal that should receive the transfer call. */\n ledgerCanisterId: string;\n /** Recipient ICRC account. */\n to: IcrcAccount;\n /** Transfer amount in ledger base units. */\n amount: bigint;\n /** Optional ledger fee in base units. */\n fee?: bigint;\n /** Optional ledger memo bytes. */\n memo?: Uint8Array;\n}\n\n/** ICRC transaction-sending request passed to wallet adapters. */\nexport interface SendIcrcTransferRequest {\n /** ICRC transfers are submitted on the Internet Computer. */\n chain: \"ICP\";\n /** Asset represented by the target ledger transfer. */\n asset: Asset;\n /** Transfer details for the ledger call. */\n transfer: IcrcTransferDetails;\n /** Optional account override for the sending wallet. */\n account?: string;\n /** SDK action type that produced this request. */\n actionType: string;\n}\n\n/**\n * Optional wallet capabilities. Implement only what your flow uses:\n *\n * - `signMessage` - account creation, borrow, withdraw\n * - `sendBtcTransaction` / `sendEthTransaction` - automated native-asset transfer supply\n * - `sendIcrcTransfer` - automated ck-ledger and ICP ledger transfer supply\n * - `sendEthTransaction` - contract-interaction supply and ETH native-asset sends\n */\nexport interface WalletAdapter {\n /** Signs an SDK plaintext message and returns the wallet signature. BTC adapters may return base64 BIP-322 or hex-encoded signature bytes. */\n signMessage?: (request: SignMessageRequest) => Promise<string>;\n /** Sends an EVM transaction and returns its transaction hash. */\n sendEthTransaction?: (request: SendEthTransactionRequest) => Promise<string>;\n /** Sends a BTC transaction and returns its transaction id. */\n sendBtcTransaction?: (request: SendBtcTransactionRequest) => Promise<string>;\n /** Sends an ICRC ledger transfer and returns the ledger transaction reference. */\n sendIcrcTransfer?: (request: SendIcrcTransferRequest) => Promise<string>;\n}\n\n/** Signature payload submitted to a sign-message action. */\nexport interface SignatureInfo {\n /** Wallet signature over the action message. BTC signatures may be base64 BIP-322 or hex-encoded bytes. */\n signature: string;\n /** Chain used to produce the signature. */\n chain: SigningChain;\n /** Account that produced the signature, when different from the action default. */\n account?: string;\n}\n\n/** Prepared action that requires message signing before submit. */\nexport interface SignMessageWalletAction<TData, TResult> {\n /** Protocol action kind. */\n kind: WalletActionKind;\n /** Wallet capability required to execute the action. */\n executionKind: typeof WalletExecutionKind.signMessage;\n /** Adapter-facing action type. */\n actionType: string;\n /** Default account to pass to the wallet adapter. */\n account: string;\n /** Plaintext message that must be signed. */\n message: string;\n /** Original request data needed to submit the signed action. */\n data: TData;\n /** Submits the signature and resolves the protocol result. */\n submit(signatureInfo: SignatureInfo): Promise<TResult>;\n}\n\n/** Any prepared action returned by SDK methods and executable by {@link executeWith}. */\nexport type WalletAction<TResult> = SignMessageWalletAction<unknown, TResult>;\n","import { LiquidiumError, LiquidiumErrorCode } from \"./core/errors\";\nimport type { SigningChain } from \"./core/types\";\nimport {\n type WalletAction,\n type WalletAdapter,\n WalletExecutionKind,\n} from \"./core/wallet-actions\";\n\ninterface WalletExecutionKindCarrier {\n executionKind?: unknown;\n}\n\n/**\n * Wallet wiring for {@link executeWith}.\n *\n * `chain` and `account` override values embedded on the action when present;\n * message signing uses `options.account ?? action.account`.\n */\nexport interface ExecuteWithOptions {\n /** Must expose the methods required by the action's `executionKind`. */\n walletAdapter: WalletAdapter;\n /** Required for `sign-message` actions; forwarded to the adapter and submit payload. */\n chain?: SigningChain;\n /** Optional signing/sending account override. */\n account?: string;\n}\n\n/**\n * Returns an async function that runs a {@link WalletAction} end-to-end.\n *\n * - `sign-message`: needs `walletAdapter.signMessage` and `options.chain`.\n *\n * @param options - Adapter and optional chain/account overrides.\n * @returns A function that accepts a `WalletAction` and resolves with its submit result.\n */\nexport function executeWith(options: ExecuteWithOptions) {\n return async function execute<TResult>(\n action: WalletAction<TResult>\n ): Promise<TResult> {\n switch (action.executionKind) {\n case WalletExecutionKind.signMessage: {\n if (!options.walletAdapter.signMessage) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n \"Wallet adapter does not support message signing\"\n );\n }\n\n if (!options.chain) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n \"Message-signing actions require a chain\"\n );\n }\n\n const signature = await options.walletAdapter.signMessage({\n chain: options.chain,\n message: action.message,\n account: options.account ?? action.account,\n actionType: action.actionType,\n });\n\n return action.submit({\n signature,\n chain: options.chain,\n account: options.account ?? action.account,\n });\n }\n default:\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n `Unsupported wallet execution kind: ${String(\n (action as WalletExecutionKindCarrier).executionKind\n )}`\n );\n }\n };\n}\n","import { base64, base64nopad } from \"@scure/base\";\nimport { bytesToHex as encodeBytesToHex, isHex } from \"viem\";\nimport { LiquidiumError, LiquidiumErrorCode } from \"../errors\";\nimport { Chain, type SigningChain } from \"../types\";\n\nconst HEX_PREFIX = \"0x\";\nconst HEX_BYTE_CHAR_LENGTH = 2;\nconst BASE64_PADDING = \"=\";\n\nexport function normalizeWalletSignature(\n signature: string,\n chain: SigningChain\n): string {\n switch (chain) {\n case Chain.BTC:\n return normalizeBtcSignature(signature);\n case Chain.ETH:\n return normalizeHexSignature(signature);\n }\n}\n\nexport function normalizeHexSignature(signature: string): string {\n if (!isPrefixedHex(signature)) {\n return signature;\n }\n\n return signature.slice(HEX_PREFIX.length);\n}\n\nfunction normalizeBtcSignature(signature: string): string {\n const signatureWithoutPrefix = signature.startsWith(HEX_PREFIX)\n ? signature.slice(HEX_PREFIX.length)\n : signature;\n\n if (isHexBytes(signatureWithoutPrefix)) {\n return signatureWithoutPrefix;\n }\n\n if (signature.startsWith(HEX_PREFIX)) {\n throw invalidBtcSignatureFormatError();\n }\n\n return bytesToUnprefixedHex(decodeBase64Signature(signature));\n}\n\nfunction isHexBytes(signature: string): boolean {\n return (\n signature.length > 0 &&\n signature.length % HEX_BYTE_CHAR_LENGTH === 0 &&\n isHex(`${HEX_PREFIX}${signature}`)\n );\n}\n\nfunction decodeBase64Signature(signature: string): Uint8Array {\n try {\n const bytes = decodeBase64Bytes(signature);\n\n if (bytes.length === 0) {\n throw invalidBtcSignatureFormatError();\n }\n\n return bytes;\n } catch (error) {\n if (error instanceof LiquidiumError) {\n throw error;\n }\n\n throw invalidBtcSignatureFormatError(error);\n }\n}\n\nfunction bytesToUnprefixedHex(bytes: Uint8Array): string {\n return normalizeHexSignature(encodeBytesToHex(bytes));\n}\n\nfunction isPrefixedHex(signature: string): boolean {\n return signature.length > HEX_PREFIX.length && isHex(signature);\n}\n\nfunction decodeBase64Bytes(signature: string): Uint8Array {\n if (signature.includes(BASE64_PADDING)) {\n return base64.decode(signature);\n }\n\n return base64nopad.decode(signature);\n}\n\nfunction invalidBtcSignatureFormatError(cause?: unknown): LiquidiumError {\n return new LiquidiumError(\n LiquidiumErrorCode.SIGNATURE_ERROR,\n \"BTC signature must be hex or base64-encoded bytes\",\n cause\n );\n}\n","import type { RegisterProfileRequest } from \"../../core/canisters/lending/actor\";\nimport { LiquidiumError, LiquidiumErrorCode } from \"../../core/errors\";\nimport { Chain, type SigningChain } from \"../../core/types\";\nimport { normalizeWalletSignature } from \"../../core/utils/signature\";\nimport type { CreateAccountRequest } from \"./types\";\n\ninterface AccountBtcChainVariant {\n BTC: null;\n}\n\ninterface AccountEthChainVariant {\n ETH: null;\n}\n\ntype AccountChainVariant = AccountBtcChainVariant | AccountEthChainVariant;\n\nexport function mapCreateAccountRequestToRegisterProfileRequest(\n request: CreateAccountRequest\n): RegisterProfileRequest {\n const signingAccount = request.signatureInfo.account;\n if (!signingAccount) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n \"Account creation requires the signing account\"\n );\n }\n\n return {\n data: {\n expiry_timestamp: request.data.expiryTimestamp,\n },\n signature_info: {\n Wallet: {\n signature: normalizeWalletSignature(\n request.signatureInfo.signature,\n request.signatureInfo.chain\n ),\n chain: mapAccountChainToLendingChainVariant(\n request.signatureInfo.chain\n ),\n account: signingAccount,\n },\n },\n };\n}\n\nfunction mapAccountChainToLendingChainVariant(\n chain: SigningChain\n): AccountChainVariant {\n switch (chain) {\n case Chain.BTC:\n return { BTC: null };\n case Chain.ETH:\n return { ETH: null };\n }\n}\n","import { Principal } from \"@icp-sdk/core/principal\";\nimport {\n createLendingActor,\n type WalletRecord,\n} from \"../../core/canisters/lending/actor\";\nimport {\n mapCanisterCallErrorToLiquidiumError,\n mapLendingProtocolErrorToLiquidiumError,\n} from \"../../core/canisters/lending/error-mappers\";\nimport { LiquidiumError, LiquidiumErrorCode } from \"../../core/errors\";\nimport { normalizeEvmAddress } from \"../../core/evm\";\nimport type { CanisterContext } from \"../../core/transports/canister-context\";\nimport { Chain, type Wallet } from \"../../core/types\";\nimport { computeExpiryTimestampFromNow } from \"../../core/utils/time\";\nimport { getVariantKey } from \"../../core/utils/variant\";\nimport {\n WalletActionKind,\n WalletExecutionKind,\n} from \"../../core/wallet-actions\";\nimport { executeWith } from \"../../execute\";\nimport { mapCreateAccountRequestToRegisterProfileRequest } from \"./mappers\";\nimport type {\n CreateAccountAction,\n CreateAccountRequest,\n CreateProfileParams,\n PrepareCreateProfileOptions,\n} from \"./types\";\n\n/** Profile lifecycle and linked-wallet helpers. */\nexport class AccountsModule {\n constructor(private readonly canisterContext: CanisterContext) {}\n\n /**\n * Prepares a profile-creation action that can be signed and submitted later.\n *\n * Use this when you need direct control over the signing flow.\n *\n * @param options - `account` is the wallet address that will own the new profile.\n * @returns A signable {@link CreateAccountAction} with `submit` wired to the canister.\n */\n async prepareCreateProfile(\n options: PrepareCreateProfileOptions\n ): Promise<CreateAccountAction> {\n return await this.buildCreateProfileAction(options.account);\n }\n\n /**\n * Creates a Liquidium profile using the provided wallet adapter.\n *\n * This is the convenience form of `prepareCreateProfile(...)` plus execution.\n *\n * @param params - Wallet `account`, signing `chain`, and `walletAdapter` with `signMessage`.\n * @returns The new profile principal as text.\n */\n async createProfile(params: CreateProfileParams): Promise<string> {\n const account = normalizeProfileAccount(params.account);\n const action = await this.prepareCreateProfile({\n account,\n });\n\n return await executeWith({\n walletAdapter: params.walletAdapter,\n chain: params.chain,\n account,\n })(action);\n }\n\n /**\n * Resolves the Liquidium profile id linked to a wallet address.\n *\n * @param walletAddress - Wallet address string as registered with the protocol.\n * @returns Profile principal text, or `null` if none exists.\n */\n async getProfileId(walletAddress: string): Promise<string | null> {\n try {\n const account = normalizeProfileAccount(walletAddress);\n const profile = await createLendingActor(\n this.canisterContext\n ).get_wallet_profile(account);\n\n return profile[0]?.toText() ?? null;\n } catch (error) {\n if (error instanceof LiquidiumError) {\n throw error;\n }\n\n throw mapCanisterCallErrorToLiquidiumError(\"get_wallet_profile\", error);\n }\n }\n\n /**\n * Returns the current nonce for a wallet address.\n *\n * This is mainly useful for custom signing flows built on prepared actions.\n *\n * @param walletAddress - Wallet address used in `get_nonce` on the lending canister.\n * @returns The next signing nonce as a bigint.\n */\n async getWalletNonce(walletAddress: string): Promise<bigint> {\n try {\n const account = normalizeProfileAccount(walletAddress);\n return await createLendingActor(this.canisterContext).get_nonce(account);\n } catch (error) {\n if (error instanceof LiquidiumError) {\n throw error;\n }\n\n throw mapCanisterCallErrorToLiquidiumError(\"get_nonce\", error);\n }\n }\n\n /**\n * Lists the wallets currently linked to a profile.\n *\n * @param profileId - The Liquidium profile principal text.\n * @returns The wallets currently linked to the requested profile.\n */\n async listLinkedWallets(profileId: string): Promise<Wallet[]> {\n try {\n const wallets = await createLendingActor(\n this.canisterContext\n ).get_profile_wallets(Principal.fromText(profileId));\n\n return wallets.map(mapCanisterWalletToWallet);\n } catch (error) {\n if (error instanceof LiquidiumError) {\n throw error;\n }\n\n throw mapCanisterCallErrorToLiquidiumError(\"get_profile_wallets\", error);\n }\n }\n\n private async buildCreateProfileAction(\n account: string\n ): Promise<CreateAccountAction> {\n try {\n const normalizedAccount = normalizeProfileAccount(account);\n\n const nonce = await createLendingActor(this.canisterContext).get_nonce(\n normalizedAccount\n );\n const expiryTimestamp = computeExpiryTimestampFromNow();\n\n return {\n kind: WalletActionKind.createAccount,\n executionKind: WalletExecutionKind.signMessage,\n actionType: WalletActionKind.createAccount,\n account: normalizedAccount,\n message: createInitializeAccountMessage(expiryTimestamp, nonce),\n data: {\n expiryTimestamp,\n },\n submit: async (signatureInfo) => {\n return await this.submitCreateProfile({\n data: {\n expiryTimestamp,\n },\n signatureInfo: {\n ...signatureInfo,\n account: normalizeProfileAccount(\n signatureInfo.account ?? normalizedAccount\n ),\n },\n });\n },\n };\n } catch (error) {\n if (error instanceof LiquidiumError) {\n throw error;\n }\n\n throw mapCanisterCallErrorToLiquidiumError(\"get_nonce\", error);\n }\n }\n\n private async submitCreateProfile(\n request: CreateAccountRequest\n ): Promise<string> {\n try {\n const signingAccount = request.signatureInfo.account;\n if (!signingAccount) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n \"Account creation requires the signing account\"\n );\n }\n\n await assertWalletHasNoProfile(this.canisterContext, signingAccount);\n\n const result = await createLendingActor(\n this.canisterContext\n ).register_profile(\n mapCreateAccountRequestToRegisterProfileRequest(request)\n );\n\n if (\"Err\" in result) {\n throw mapLendingProtocolErrorToLiquidiumError(result.Err);\n }\n\n return result.Ok.toText();\n } catch (error) {\n if (error instanceof LiquidiumError) {\n throw error;\n }\n\n throw mapCanisterCallErrorToLiquidiumError(\"register_profile\", error);\n }\n }\n}\n\nfunction normalizeProfileAccount(account: string): string {\n return normalizeEvmAddress(account);\n}\n\nfunction createInitializeAccountMessage(\n expiryTimestamp: bigint,\n nonce: bigint\n): string {\n return `Liquidium: Initialize Account\n\nAction: Create new account\nExpires: ${expiryTimestamp}\nNonce: ${nonce}`;\n}\n\nasync function assertWalletHasNoProfile(\n canisterContext: CanisterContext,\n walletAddress: string\n): Promise<void> {\n const existingProfile =\n await createLendingActor(canisterContext).get_wallet_profile(walletAddress);\n const profileId = existingProfile[0]?.toText();\n\n if (!profileId) {\n return;\n }\n\n throw new LiquidiumError(\n LiquidiumErrorCode.PROFILE_ALREADY_EXISTS,\n `Wallet address is already linked to profile ${profileId}`\n );\n}\n\nfunction mapCanisterWalletToWallet(canisterWallet: WalletRecord): Wallet {\n const walletChain = getVariantKey(canisterWallet.chain.Wallet);\n\n switch (walletChain) {\n case Chain.BTC:\n case Chain.ETH:\n return {\n address: canisterWallet.address,\n chain: walletChain,\n };\n default:\n throw new LiquidiumError(\n LiquidiumErrorCode.INTERNAL,\n `Unsupported wallet chain returned for profile wallet: ${walletChain}`\n );\n }\n}\n","import { idlLabelToId } from \"@icp-sdk/core/candid\";\n\n// Asset and chain tags supported by this SDK version. Unknown tags returned by\n// the canister are ignored rather than causing the whole call to fail.\nexport const KNOWN_ASSET_TAGS = [\"BTC\", \"ICP\", \"USDC\", \"USDT\"] as const;\nexport const KNOWN_CHAIN_TAGS = [\"BTC\", \"ETH\", \"ICP\"] as const;\n\nexport type KnownAssetTag = (typeof KNOWN_ASSET_TAGS)[number];\nexport type KnownChainTag = (typeof KNOWN_CHAIN_TAGS)[number];\n\nexport function extractVariantTag<T extends string>(\n variant: object,\n knownTags: readonly T[]\n): T | null {\n const [key] = Object.keys(variant);\n\n if (!key) {\n return null;\n }\n\n // Known variants decoded by a matching IDL already use the tag name.\n if (knownTags.includes(key as T)) {\n return key as T;\n }\n\n // IDL.Unknown returns variants with hashed field names: _${hash}_\n const hashMatch = /^_(\\d+)_$/.exec(key);\n if (!hashMatch) {\n return null;\n }\n\n const hash = Number(hashMatch[1]);\n\n for (const tag of knownTags) {\n if (idlLabelToId(tag) === hash) {\n return tag;\n }\n }\n\n return null;\n}\n","import type { ActorMethod } from \"@icp-sdk/core/agent\";\nimport { Actor } from \"@icp-sdk/core/agent\";\nimport type { IDL } from \"@icp-sdk/core/candid\";\nimport type { Principal } from \"@icp-sdk/core/principal\";\nimport { LiquidiumError, LiquidiumErrorCode } from \"../../errors\";\nimport type { CanisterContext } from \"../../transports/canister-context\";\nimport { extractVariantTag, KNOWN_ASSET_TAGS } from \"../../utils/variant-tags\";\nimport type {\n CreateSimpleLoanCanisterRequest,\n HeadlessLoanCreatedEventPayload,\n HeadlessLoanEventType,\n HeadlessLoansConfig,\n SimpleLoanAccountType,\n SimpleLoanAuthorisation,\n SimpleLoansCanisterError,\n WarmedProfile,\n} from \"./actor\";\n\ninterface FlexibleSimpleLoanAccountIdentifierAccountType {\n AccountIdentifier: string;\n}\n\ninterface FlexibleSimpleLoanIcrcAccount {\n owner: Principal;\n subaccount: [] | [Uint8Array];\n}\n\ninterface FlexibleSimpleLoanIcrcAccountType {\n Icrc: FlexibleSimpleLoanIcrcAccount;\n}\n\ntype FlexibleSimpleLoanAccountType =\n | SimpleLoanAccountType\n | FlexibleSimpleLoanAccountIdentifierAccountType\n | FlexibleSimpleLoanIcrcAccountType;\n\nexport interface FlexibleCreateSimpleLoanCanisterResponse {\n loan_id: bigint;\n lending_profile: Principal;\n}\n\nexport interface FlexibleHeadlessLoanCreatedEventPayload {\n loan_id: bigint;\n borrow_destination: FlexibleSimpleLoanAccountType;\n lend_asset: object;\n borrow_amount: bigint;\n lend_pool_id: Principal;\n refund_destination: FlexibleSimpleLoanAccountType;\n ltv_max_bps: bigint;\n ltv_timer_s: bigint;\n lending_profile: Principal;\n borrow_pool_id: Principal;\n borrow_asset: object;\n}\n\nexport interface FlexibleHeadlessLoanCreatedEventType {\n LoanCreated: FlexibleHeadlessLoanCreatedEventPayload;\n}\n\nexport type FlexibleHeadlessLoanEventType =\n | FlexibleHeadlessLoanCreatedEventType\n | HeadlessLoanEventTypeWithoutAssets;\n\ntype HeadlessLoanEventTypeWithoutAssets = Exclude<\n HeadlessLoanEventType,\n { LoanCreated: HeadlessLoanCreatedEventPayload }\n>;\n\nexport interface FlexibleHeadlessLoanEvent {\n id: bigint;\n schema_version: number;\n timestamp: bigint;\n event_type: FlexibleHeadlessLoanEventType;\n}\n\nexport interface FlexibleSimpleLoanCanisterRecord {\n id: bigint;\n authorisation: SimpleLoanAuthorisation;\n borrow_destination: FlexibleSimpleLoanAccountType;\n started: boolean;\n lend_asset: object;\n created_at: bigint;\n schema_version: number;\n borrow_amount: bigint;\n lend_pool_id: Principal;\n refund_destination: FlexibleSimpleLoanAccountType;\n ltv_max_bps: bigint;\n ltv_timer_s: bigint;\n lending_profile: Principal;\n borrow_pool_id: Principal;\n borrow_asset: object;\n expires_at: [] | [bigint];\n deposit_detected_ts: [] | [bigint];\n}\n\nexport interface DecodedHeadlessLoanCreatedEventPayload {\n loan_id: bigint;\n borrow_destination: FlexibleSimpleLoanAccountType;\n lend_asset: string;\n borrow_amount: bigint;\n lend_pool_id: Principal;\n refund_destination: FlexibleSimpleLoanAccountType;\n ltv_max_bps: bigint;\n ltv_timer_s: bigint;\n lending_profile: Principal;\n borrow_pool_id: Principal;\n borrow_asset: string;\n}\n\nexport type DecodedHeadlessLoanEventType =\n | { LoanCreated: DecodedHeadlessLoanCreatedEventPayload }\n | HeadlessLoanEventTypeWithoutAssets;\n\nexport interface DecodedHeadlessLoanEvent {\n id: bigint;\n schema_version: number;\n timestamp: bigint;\n event_type: DecodedHeadlessLoanEventType;\n}\n\nexport interface DecodedSimpleLoanCanisterRecord {\n id: bigint;\n authorisation: SimpleLoanAuthorisation;\n borrow_destination: FlexibleSimpleLoanAccountType;\n started: boolean;\n lend_asset: string;\n created_at: bigint;\n schema_version: number;\n borrow_amount: bigint;\n lend_pool_id: Principal;\n refund_destination: FlexibleSimpleLoanAccountType;\n ltv_max_bps: bigint;\n ltv_timer_s: bigint;\n lending_profile: Principal;\n borrow_pool_id: Principal;\n borrow_asset: string;\n expires_at: [] | [bigint];\n deposit_detected_ts: [] | [bigint];\n}\n\ntype FlexibleResult<T> = { Ok: T } | { Err: SimpleLoansCanisterError };\n\nexport interface FlexibleSimpleLoansActor {\n create_loan: ActorMethod<\n [CreateSimpleLoanCanisterRequest],\n FlexibleResult<FlexibleCreateSimpleLoanCanisterResponse>\n >;\n count_warmed_profiles: ActorMethod<[], bigint>;\n get_config: ActorMethod<[], HeadlessLoansConfig>;\n get_event: ActorMethod<[bigint], [] | [FlexibleHeadlessLoanEvent]>;\n get_loan: ActorMethod<\n [bigint],\n FlexibleResult<FlexibleSimpleLoanCanisterRecord>\n >;\n list_access_list: ActorMethod<[], Principal[]>;\n list_events: ActorMethod<\n [bigint, bigint],\n Array<[bigint, FlexibleHeadlessLoanEvent]>\n >;\n list_warmed_profiles: ActorMethod<[], WarmedProfile[]>;\n}\n\nconst flexibleSimpleLoansIdlFactory: IDL.InterfaceFactory = ({ IDL }) => {\n const IcrcAccount = IDL.Record({\n owner: IDL.Principal,\n subaccount: IDL.Opt(IDL.Vec(IDL.Nat8)),\n });\n const AccountType = IDL.Variant({\n Icrc: IcrcAccount,\n Native: IDL.Principal,\n AccountIdentifier: IDL.Text,\n External: IDL.Text,\n });\n const SignatureVerificationError = IDL.Variant({\n InvalidEthSignature: IDL.Null,\n UnsupportedChain: IDL.Null,\n InvalidSolSignature: IDL.Null,\n InvalidEthAddress: IDL.Null,\n CouldNotDecode: IDL.Text,\n ProfileNotFound: IDL.Null,\n InvalidBtcSignature: IDL.Null,\n });\n const ProtocolError = IDL.Variant({\n PositionNotFound: IDL.Null,\n Internal: IDL.Text,\n InvalidAddress: IDL.Text,\n InvalidTargetPrincipal: IDL.Null,\n SignatureError: SignatureVerificationError,\n SupplyCapExceeded: IDL.Null,\n AccountNotFound: IDL.Null,\n NotAllowed: IDL.Text,\n PoolNotFound: IDL.Text,\n FeeClaimReceiverNotConfigured: IDL.Null,\n InsufficientCollateral: IDL.Null,\n ProfileNotFound: IDL.Null,\n SignatureExpiryTooFarInFuture: IDL.Null,\n MaxLtvExceeded: IDL.Null,\n ProfileAlreadyExists: IDL.Null,\n LiquidationNotFound: IDL.Text,\n HealthFactorTooLow: IDL.Null,\n NoLiquidity: IDL.Null,\n SignatureExpired: IDL.Null,\n BorrowingDisabled: IDL.Null,\n BorrowCapExceeded: IDL.Null,\n PoolFrozen: IDL.Null,\n TransferFailed: IDL.Text,\n AccountAlreadyLinked: IDL.Null,\n CannotRemoveSoleAccount: IDL.Null,\n InsufficientFunds: IDL.Null,\n });\n const SimpleLoansError = IDL.Variant({\n BorrowAmountRequired: IDL.Null,\n NoCollateralPosition: IDL.Record({ loan_id: IDL.Nat }),\n LtvTimerOutOfRange: IDL.Record({ max: IDL.Nat64 }),\n LtvMaxExceeded: IDL.Record({\n actual_bps: IDL.Nat64,\n max_bps: IDL.Nat64,\n }),\n MemoryLockFailed: IDL.Record({ reason: IDL.Text }),\n UnauthorizedAccessListCaller: IDL.Record({ caller: IDL.Principal }),\n LendingClient: IDL.Variant({\n CallFailed: IDL.Record({ method: IDL.Text, reason: IDL.Text }),\n CallRejected: IDL.Record({ method: IDL.Text, reason: IDL.Text }),\n DecodeFailed: IDL.Record({ method: IDL.Text, reason: IDL.Text }),\n }),\n LtvMaxOutOfRange: IDL.Record({ max: IDL.Nat64 }),\n AccountRequired: IDL.Record({ label: IDL.Text }),\n DepositTimerExceeded: IDL.Record({ loan_id: IDL.Nat }),\n LoanNotFound: IDL.Record({ loan_id: IDL.Nat }),\n LendingProtocolError: IDL.Record({\n error: ProtocolError,\n operation: IDL.Text,\n }),\n AuthorizationFailed: IDL.Record({ reason: IDL.Text }),\n DepositAlreadyProcessed: IDL.Record({ loan_id: IDL.Nat }),\n MissingPrice: IDL.Record({ symbol: IDL.Text }),\n InvalidLtvTimerS: IDL.Null,\n DebtNotFullyRepaid: IDL.Record({ loan_id: IDL.Nat }),\n EmptyCollateralPosition: IDL.Null,\n SigningFailed: IDL.Record({ reason: IDL.Text }),\n });\n const CreateLoanRequest = IDL.Record({\n borrow_destination: AccountType,\n lend_asset: IDL.Unknown,\n borrow_amount: IDL.Nat,\n lend_pool_id: IDL.Principal,\n refund_destination: AccountType,\n ltv_max_bps: IDL.Nat64,\n borrow_pool_id: IDL.Principal,\n borrow_asset: IDL.Unknown,\n ltv_timer_s: IDL.Nat64,\n });\n const CreateLoanResponse = IDL.Record({\n loan_id: IDL.Nat,\n lending_profile: IDL.Principal,\n });\n const CreateLoanResult = IDL.Variant({\n Ok: CreateLoanResponse,\n Err: SimpleLoansError,\n });\n const LoanLeg = IDL.Variant({ Lend: IDL.Null, Borrow: IDL.Null });\n const HeadlessLoanEventType = IDL.Variant({\n LoanCreated: IDL.Record({\n loan_id: IDL.Nat,\n borrow_destination: AccountType,\n lend_asset: IDL.Unknown,\n borrow_amount: IDL.Nat,\n lend_pool_id: IDL.Principal,\n refund_destination: AccountType,\n ltv_max_bps: IDL.Nat64,\n ltv_timer_s: IDL.Nat64,\n lending_profile: IDL.Principal,\n borrow_pool_id: IDL.Principal,\n borrow_asset: IDL.Unknown,\n }),\n FullLendWithdrawalRequested: IDL.Record({\n loan_id: IDL.Nat,\n account: AccountType,\n pool_id: IDL.Principal,\n }),\n BorrowRequested: IDL.Record({\n loan_id: IDL.Nat,\n account: AccountType,\n pool_id: IDL.Principal,\n amount: IDL.Nat,\n }),\n DepositTimerExceeded: IDL.Record({ loan_id: IDL.Nat }),\n StuckFundsWithdrawalRequested: IDL.Record({\n leg: LoanLeg,\n loan_id: IDL.Nat,\n account: AccountType,\n pool_id: IDL.Principal,\n amount: IDL.Nat,\n }),\n ProfileWarmed: IDL.Record({\n derivation_index: IDL.Vec(IDL.Nat8),\n warmed_profile_id: IDL.Nat,\n eth_address: IDL.Text,\n lending_profile: IDL.Principal,\n }),\n RepayComplete: CreateLoanResponse,\n DepositTimerStarted: IDL.Record({\n loan_id: IDL.Nat,\n timestamp: IDL.Nat64,\n }),\n });\n const HeadlessLoanEvent = IDL.Record({\n id: IDL.Nat,\n schema_version: IDL.Nat16,\n timestamp: IDL.Nat64,\n event_type: HeadlessLoanEventType,\n });\n const AuthorisationType = IDL.Variant({\n EthSignature: IDL.Record({\n derivation_index: IDL.Vec(IDL.Nat8),\n pubkey: IDL.Vec(IDL.Nat8),\n address: IDL.Text,\n }),\n });\n const Loan = IDL.Record({\n id: IDL.Nat,\n authorisation: AuthorisationType,\n borrow_destination: AccountType,\n started: IDL.Bool,\n lend_asset: IDL.Unknown,\n created_at: IDL.Nat64,\n schema_version: IDL.Nat16,\n borrow_amount: IDL.Nat,\n lend_pool_id: IDL.Principal,\n refund_destination: AccountType,\n ltv_max_bps: IDL.Nat64,\n ltv_timer_s: IDL.Nat64,\n lending_profile: IDL.Principal,\n expires_at: IDL.Opt(IDL.Nat64),\n borrow_pool_id: IDL.Principal,\n borrow_asset: IDL.Unknown,\n deposit_detected_ts: IDL.Opt(IDL.Nat64),\n });\n const LoanResult = IDL.Variant({ Ok: Loan, Err: SimpleLoansError });\n const HeadlessLoansConfig = IDL.Record({\n lending_canister: IDL.Principal,\n });\n const WarmedProfile = IDL.Record({\n id: IDL.Nat,\n authorisation: AuthorisationType,\n created_at: IDL.Nat64,\n lending_profile: IDL.Principal,\n });\n\n return IDL.Service({\n count_warmed_profiles: IDL.Func([], [IDL.Nat64], [\"query\"]),\n create_loan: IDL.Func([CreateLoanRequest], [CreateLoanResult], []),\n get_config: IDL.Func([], [HeadlessLoansConfig], [\"query\"]),\n get_event: IDL.Func([IDL.Nat], [IDL.Opt(HeadlessLoanEvent)], [\"query\"]),\n get_loan: IDL.Func([IDL.Nat], [LoanResult], [\"query\"]),\n list_access_list: IDL.Func([], [IDL.Vec(IDL.Principal)], [\"query\"]),\n list_events: IDL.Func(\n [IDL.Nat, IDL.Nat64],\n [IDL.Vec(IDL.Tuple(IDL.Nat, HeadlessLoanEvent))],\n [\"query\"]\n ),\n list_warmed_profiles: IDL.Func([], [IDL.Vec(WarmedProfile)], [\"query\"]),\n });\n};\n\nexport function createFlexibleSimpleLoansActor(\n canisterContext: CanisterContext\n): FlexibleSimpleLoansActor {\n const canisterId = canisterContext.canisterIds.simpleLoans;\n\n if (!canisterId) {\n throw new LiquidiumError(\n LiquidiumErrorCode.SERVICE_UNAVAILABLE,\n \"Simple Loans canister ID is not configured\"\n );\n }\n\n return Actor.createActor<FlexibleSimpleLoansActor>(\n flexibleSimpleLoansIdlFactory,\n {\n agent: canisterContext.agent,\n canisterId,\n }\n );\n}\n\nexport function decodeFlexibleSimpleLoanRecord(\n record: FlexibleSimpleLoanCanisterRecord\n): DecodedSimpleLoanCanisterRecord | null {\n const lend_asset = extractVariantTag(record.lend_asset, KNOWN_ASSET_TAGS);\n const borrow_asset = extractVariantTag(record.borrow_asset, KNOWN_ASSET_TAGS);\n\n if (!lend_asset || !borrow_asset) {\n return null;\n }\n\n return {\n id: record.id,\n authorisation: record.authorisation,\n borrow_destination: record.borrow_destination,\n started: record.started,\n lend_asset,\n created_at: record.created_at,\n schema_version: record.schema_version,\n borrow_amount: record.borrow_amount,\n lend_pool_id: record.lend_pool_id,\n refund_destination: record.refund_destination,\n ltv_max_bps: record.ltv_max_bps,\n ltv_timer_s: record.ltv_timer_s,\n lending_profile: record.lending_profile,\n borrow_pool_id: record.borrow_pool_id,\n borrow_asset,\n expires_at: record.expires_at,\n deposit_detected_ts: record.deposit_detected_ts,\n };\n}\n\nexport function decodeFlexibleHeadlessLoanEvent(\n event: FlexibleHeadlessLoanEvent\n): DecodedHeadlessLoanEvent | null {\n if (\"LoanCreated\" in event.event_type) {\n const decoded = decodeLoanCreatedEvent(event.event_type.LoanCreated);\n\n if (!decoded) {\n return null;\n }\n\n return {\n id: event.id,\n schema_version: event.schema_version,\n timestamp: event.timestamp,\n event_type: decoded,\n };\n }\n\n return {\n id: event.id,\n schema_version: event.schema_version,\n timestamp: event.timestamp,\n event_type: event.event_type as DecodedHeadlessLoanEventType,\n };\n}\n\nfunction decodeLoanCreatedEvent(\n payload: FlexibleHeadlessLoanCreatedEventPayload\n): DecodedHeadlessLoanEventType | null {\n const lend_asset = extractVariantTag(payload.lend_asset, KNOWN_ASSET_TAGS);\n const borrow_asset = extractVariantTag(\n payload.borrow_asset,\n KNOWN_ASSET_TAGS\n );\n\n if (!lend_asset || !borrow_asset) {\n return null;\n }\n\n return {\n LoanCreated: {\n loan_id: payload.loan_id,\n borrow_destination: payload.borrow_destination,\n lend_asset,\n borrow_amount: payload.borrow_amount,\n lend_pool_id: payload.lend_pool_id,\n refund_destination: payload.refund_destination,\n ltv_max_bps: payload.ltv_max_bps,\n ltv_timer_s: payload.ltv_timer_s,\n lending_profile: payload.lending_profile,\n borrow_pool_id: payload.borrow_pool_id,\n borrow_asset,\n },\n };\n}\n","/**\n * Path and query key constants for the Liquidium SDK HTTP API.\n */\n\nconst SDK_API_V1_PATH = \"/v1\";\nconst SDK_API_V2_PATH = \"/v2\";\n\nexport const SdkApiQueryParam = {\n cursor: \"cursor\",\n from: \"from\",\n filter: \"filter\",\n limit: \"limit\",\n market: \"market\",\n operations: \"operations\",\n poolId: \"poolId\",\n profileId: \"profileId\",\n states: \"states\",\n to: \"to\",\n} as const;\n\ninterface BuildActivitiesPathRequest {\n profileId: string;\n filter?: string;\n}\n\ninterface BuildActivityStatusPathRequest {\n profileId: string;\n id: string;\n}\n\ninterface BuildSimpleLoanFindPathRequest {\n query: string;\n}\n\ninterface BuildSimpleLoanCollateralHintPathRequest {\n loanId: bigint;\n}\n\nconst ACTIVITIES = `${SDK_API_V2_PATH}/activities`;\nconst HISTORY_USERS = `${SDK_API_V2_PATH}/history/users`;\nconst INFLOW = `${SDK_API_V2_PATH}/inflow`;\nconst SIMPLE_LOANS = `${SDK_API_V1_PATH}/instant-loans`;\n\nexport function buildHistoryUserTransactionsPath(\n user: string,\n query: URLSearchParams\n): string {\n const base = `${HISTORY_USERS}/${encodeURIComponent(user)}/transactions`;\n const qs = query.toString();\n return qs ? `${base}?${qs}` : base;\n}\n\nexport function buildHistoryUserLiquidationsPath(\n user: string,\n query: URLSearchParams\n): string {\n const base = `${HISTORY_USERS}/${encodeURIComponent(user)}/liquidations`;\n const qs = query.toString();\n return qs ? `${base}?${qs}` : base;\n}\n\nexport function buildActivitiesPath(\n request: BuildActivitiesPathRequest\n): string {\n const query = new URLSearchParams({\n [SdkApiQueryParam.profileId]: request.profileId,\n });\n if (request.filter) {\n query.set(SdkApiQueryParam.filter, request.filter);\n }\n\n return `${ACTIVITIES}?${query.toString()}`;\n}\n\nexport function buildActivityStatusPath(\n request: BuildActivityStatusPathRequest\n): string {\n const query = new URLSearchParams({\n [SdkApiQueryParam.profileId]: request.profileId,\n });\n\n return `${ACTIVITIES}/${encodeURIComponent(\n request.id\n )}/status?${query.toString()}`;\n}\n\nexport function buildSimpleLoanFindPath(\n request: BuildSimpleLoanFindPathRequest\n): string {\n const query = new URLSearchParams({ query: request.query });\n return `${SIMPLE_LOANS}/find?${query.toString()}`;\n}\n\nexport function buildSimpleLoanCollateralHintPath(\n request: BuildSimpleLoanCollateralHintPathRequest\n): string {\n return `${SIMPLE_LOANS}/${encodeURIComponent(\n request.loanId.toString()\n )}/collateral-hint`;\n}\n\nexport const SdkApiPath = {\n inflow: INFLOW,\n simpleLoans: SIMPLE_LOANS,\n} as const;\n","import { LiquidiumError, LiquidiumErrorCode } from \"../errors\";\n\nexport function ceilDivBigint(numerator: bigint, denominator: bigint): bigint {\n if (denominator === 0n) {\n throw new LiquidiumError(\n LiquidiumErrorCode.INTERNAL,\n \"ceilDivBigint called with zero denominator\"\n );\n }\n\n if (numerator === 0n) {\n return 0n;\n }\n\n const numeratorIsNegative = numerator < 0n;\n const denominatorIsNegative = denominator < 0n;\n const resultIsNegative = numeratorIsNegative !== denominatorIsNegative;\n\n const absNumerator = numeratorIsNegative ? -numerator : numerator;\n const absDenominator = denominatorIsNegative ? -denominator : denominator;\n\n if (resultIsNegative) {\n return -(absNumerator / absDenominator);\n }\n\n return (absNumerator + absDenominator - 1n) / absDenominator;\n}\n\nexport function parseBigInt(value: string, label: string): bigint {\n try {\n return BigInt(value);\n } catch (error) {\n throw new LiquidiumError(\n LiquidiumErrorCode.INTERNAL,\n `Invalid bigint returned for ${label}`,\n error\n );\n }\n}\n","/** Number of characters in a public simple loan reference. */\nexport const REF_LENGTH = 6;\n\n/** Crockford-style base32 alphabet used for public simple loan references. */\nexport const REF_ALPHABET = \"0123456789ABCDEFGHJKMNPQRSTVWXYZ\";\n\nconst BASE = 32n;\nconst MOD = BASE ** BigInt(REF_LENGTH);\nconst A = 1_103_515_245n;\nconst B = 123_456_789n;\nconst A_INVERSE = modInverse(A, MOD);\nconst ALPHABET_INDEX = new Map(\n [...REF_ALPHABET].map((character, index) => [character, BigInt(index)])\n);\n\n/**\n * Converts a canister loan id into a short user-facing reference.\n *\n * @param id - Canister loan id in the supported public-reference range.\n * @returns Fixed-length public reference string.\n */\nexport function publicIdFromInt(id: bigint): string {\n if (id < 0n || id >= MOD) throw new Error(\"id out of range\");\n return toBase32Fixed((id * A + B) % MOD);\n}\n\n/**\n * Decodes a short user-facing reference back into the canister loan id.\n *\n * @param ref - Fixed-length public reference string.\n * @returns Canister loan id represented by the reference.\n */\nexport function intFromPublicId(ref: string): bigint {\n const encodedId = fromBase32Fixed(ref.toUpperCase());\n const id = ((encodedId - B) * A_INVERSE) % MOD;\n return (id + MOD) % MOD;\n}\n\nfunction modInverse(value: bigint, modulo: bigint): bigint {\n let oldRemainder = value;\n let remainder = modulo;\n let oldCoefficient = 1n;\n let coefficient = 0n;\n\n while (remainder !== 0n) {\n const quotient = oldRemainder / remainder;\n\n [oldRemainder, remainder] = [\n remainder,\n oldRemainder - quotient * remainder,\n ];\n [oldCoefficient, coefficient] = [\n coefficient,\n oldCoefficient - quotient * coefficient,\n ];\n }\n\n if (oldRemainder !== 1n) throw new Error(\"value is not invertible\");\n\n return ((oldCoefficient % modulo) + modulo) % modulo;\n}\n\nfunction toBase32Fixed(value: bigint): string {\n let encoded = \"\";\n let remaining = value;\n for (let i = 0; i < REF_LENGTH; i++) {\n encoded = REF_ALPHABET[Number(remaining % BASE)] + encoded;\n remaining /= BASE;\n }\n return encoded;\n}\n\nfunction fromBase32Fixed(ref: string): bigint {\n if (ref.length !== REF_LENGTH) {\n throw new Error(`ref must be ${REF_LENGTH} characters`);\n }\n\n let decoded = 0n;\n for (const character of ref) {\n const value = ALPHABET_INDEX.get(character);\n if (value === undefined) {\n throw new Error(\"ref contains invalid character\");\n }\n\n decoded = decoded * BASE + value;\n }\n\n return decoded;\n}\n","import type { LiquidiumOperation, LiquidiumStatus } from \"../../core/status\";\nimport type { Chain } from \"../../core/types\";\n\n/** Activity list lifecycle filter. */\nexport const ActivityFilter = {\n active: \"active\",\n completed: \"completed\",\n all: \"all\",\n} as const;\n/** Activity list lifecycle filter. */\nexport type ActivityFilter =\n (typeof ActivityFilter)[keyof typeof ActivityFilter];\n\n/** Fee top-up state for an inflow activity. */\nexport interface ActivityTopUp {\n /** Whether another transfer is needed before processing can continue. */\n required: boolean;\n /** Total same-token deposited amount counted toward the current fee. */\n depositedAmount: bigint;\n /** Current deposit-address processing fee. */\n feeAmount: bigint;\n /** Additional amount needed before processing can start. */\n shortfallAmount: bigint;\n}\n\n/** Operation emitted by deposit or repayment inflows. */\nexport type InflowActivityOperation = Extract<\n LiquidiumOperation,\n \"deposit\" | \"repayment\"\n>;\n/** Operation emitted by borrow or withdrawal outflows. */\nexport type OutflowActivityOperation = Extract<\n LiquidiumOperation,\n \"borrow\" | \"withdrawal\"\n>;\n\nexport type InflowActivityStatus = LiquidiumStatus & {\n operation: InflowActivityOperation;\n};\nexport type OutflowActivityStatus = LiquidiumStatus & {\n operation: OutflowActivityOperation;\n};\n\ninterface BaseActivity {\n id: string;\n poolId: string;\n asset: string | null;\n chain: Chain | null;\n amount: bigint;\n timestampMs: number;\n /** Chain transaction ids associated with the activity when available. */\n txids?: string[];\n}\n\n/** Deposit or repayment activity returned by the activity API. */\nexport interface InflowActivity extends BaseActivity {\n /** Shared consumer-facing lifecycle status. */\n status: InflowActivityStatus;\n /** Fee top-up state when the inflow is below the current processing fee. */\n topUp?: ActivityTopUp;\n}\n\n/** Borrow or withdrawal activity returned by the activity API. */\nexport interface OutflowActivity extends BaseActivity {\n /** Shared consumer-facing lifecycle status. */\n status: OutflowActivityStatus;\n /** Outflows never carry top-up state. */\n topUp?: never;\n}\n\n/** Any activity returned by `activities.list` or `activities.getStatus`. */\nexport type Activity = InflowActivity | OutflowActivity;\n\n/** Shared request fields for listing activities. */\nexport interface BaseListActivitiesRequest {\n /** Optional lifecycle filter; defaults to `active`. */\n filter?: ActivityFilter;\n}\n\n/** Activity list request scoped to a Liquidium profile. */\nexport interface ListActivitiesByProfileRequest\n extends BaseListActivitiesRequest {\n /** Profile principal text to list activities for. */\n profileId: string;\n}\n\n/** Activity list request scoped to a simple loan short reference. */\nexport interface ListActivitiesByShortRefRequest\n extends BaseListActivitiesRequest {\n /** Simple loan short reference to list activities for. */\n shortRef: string;\n}\n\n/** Request for listing activities by profile id or simple loan short reference. */\nexport type ListActivitiesRequest =\n | ListActivitiesByProfileRequest\n | ListActivitiesByShortRefRequest;\n\n/** Shared request fields for an activity status lookup. */\nexport interface BaseGetActivityStatusRequest {\n /** Activity or receipt id to look up. */\n id: string;\n}\n\n/** Activity status lookup scoped to a Liquidium profile. */\nexport interface GetActivityStatusByProfileRequest\n extends BaseGetActivityStatusRequest {\n /** Profile principal text that owns the activity. */\n profileId: string;\n}\n\n/** Activity status lookup scoped to a simple loan short reference. */\nexport interface GetActivityStatusByShortRefRequest\n extends BaseGetActivityStatusRequest {\n /** Simple loan short reference that owns the activity. */\n shortRef: string;\n}\n\n/** Request for fetching one activity by id and owner identifier. */\nexport type GetActivityStatusRequest =\n | GetActivityStatusByProfileRequest\n | GetActivityStatusByShortRefRequest;\n\n/** Successful activity status lookup result. */\nexport interface ActivityStatusFoundResponse {\n /** Indicates the activity was found. */\n found: true;\n /** Matched activity. */\n activity: Activity;\n}\n\n/** Missing activity status lookup result. */\nexport interface ActivityStatusNotFoundResponse {\n /** Indicates the activity was not found. */\n found: false;\n /** Requested activity or receipt id. */\n id: string;\n}\n\n/** Result of an activity status lookup. */\nexport type GetActivityStatusResponse =\n | ActivityStatusFoundResponse\n | ActivityStatusNotFoundResponse;\n","import type { SimpleLoansCanisterError } from \"../../core/canisters/simple-loans/actor\";\nimport { createFlexibleSimpleLoansActor } from \"../../core/canisters/simple-loans/flexible-actor\";\nimport { LiquidiumError, LiquidiumErrorCode } from \"../../core/errors\";\nimport {\n buildActivitiesPath,\n buildActivityStatusPath,\n} from \"../../core/sdk-api-paths\";\nimport type { LiquidiumStatus } from \"../../core/status\";\nimport type { ApiClient } from \"../../core/transports/api-client\";\nimport type { CanisterContext } from \"../../core/transports/canister-context\";\nimport type { Chain } from \"../../core/types\";\nimport { parseBigInt } from \"../../core/utils/bigint\";\nimport { intFromPublicId } from \"../simple-loans/ref-code\";\nimport type {\n Activity,\n ActivityTopUp,\n GetActivityStatusRequest,\n GetActivityStatusResponse,\n InflowActivity,\n InflowActivityStatus,\n ListActivitiesRequest,\n OutflowActivity,\n OutflowActivityStatus,\n} from \"./types\";\nimport { ActivityFilter } from \"./types\";\n\ninterface ActivityTopUpWire\n extends Omit<\n ActivityTopUp,\n \"depositedAmount\" | \"feeAmount\" | \"shortfallAmount\"\n > {\n depositedAmount: string;\n feeAmount: string;\n shortfallAmount: string;\n}\n\ninterface ActivityWire {\n id: string;\n poolId: string;\n asset: string | null;\n chain: Chain | null;\n amount: string;\n timestampMs: number;\n txids?: string[];\n status: LiquidiumStatus;\n topUp?: ActivityTopUpWire;\n}\n\ninterface ListActivitiesResponseWire {\n activities: ActivityWire[];\n}\n\ninterface ActivityStatusFoundResponseWire {\n found: true;\n activity: ActivityWire;\n}\n\ninterface ActivityStatusNotFoundResponseWire {\n found: false;\n id: string;\n}\n\ntype ActivityStatusResponseWire =\n | ActivityStatusFoundResponseWire\n | ActivityStatusNotFoundResponseWire;\n\n/** Receipt-oriented activity list and status helpers. */\nexport class ActivitiesModule {\n constructor(\n private readonly apiClient: ApiClient | undefined,\n private readonly canisterContext: CanisterContext\n ) {}\n\n /**\n * Lists profile activities. Defaults to active activities.\n *\n * Uses the Liquidium SDK API.\n *\n * @param request - Profile id or simple loan short reference plus optional lifecycle filter.\n * @returns Activities owned by the resolved profile.\n */\n async list(request: ListActivitiesRequest): Promise<Activity[]> {\n const apiClient = this.requireApi();\n const profileId = await this.resolveProfileId(request);\n const response = await apiClient.get<ListActivitiesResponseWire>(\n buildActivitiesPath({\n profileId,\n filter: request.filter ?? ActivityFilter.active,\n })\n );\n\n return response.activities.map(mapActivity);\n }\n\n /**\n * Fetches the latest status for a single receipt/activity id.\n *\n * Uses the Liquidium SDK API.\n *\n * @param request - Activity id plus profile id or simple loan short reference.\n * @returns The activity when found, otherwise `{ found: false }` with the requested id.\n */\n async getStatus(\n request: GetActivityStatusRequest\n ): Promise<GetActivityStatusResponse> {\n const apiClient = this.requireApi();\n const profileId = await this.resolveProfileId(request);\n const response = await apiClient.get<ActivityStatusResponseWire>(\n buildActivityStatusPath({ id: request.id, profileId })\n );\n\n if (!response.found) {\n return { found: false, id: response.id };\n }\n\n return {\n found: true,\n activity: mapActivity(response.activity),\n };\n }\n\n private requireApi(): ApiClient {\n if (!this.apiClient) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n \"Activities require an API client\"\n );\n }\n\n return this.apiClient;\n }\n\n private async resolveProfileId(\n request: GetActivityStatusRequest | ListActivitiesRequest\n ): Promise<string> {\n if (\"profileId\" in request) {\n return request.profileId;\n }\n\n let loanId: bigint;\n try {\n loanId = intFromPublicId(request.shortRef.trim());\n } catch (error) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n \"Invalid simple loan reference\",\n error\n );\n }\n\n try {\n const result = await createFlexibleSimpleLoansActor(\n this.canisterContext\n ).get_loan(loanId);\n\n if (\"Err\" in result) {\n throw mapSimpleLoanLookupError(result.Err);\n }\n\n return result.Ok.lending_profile.toText();\n } catch (error) {\n if (error instanceof LiquidiumError) {\n throw error;\n }\n\n throw new LiquidiumError(\n LiquidiumErrorCode.CANISTER_REJECTED,\n \"Unable to resolve simple loan reference\",\n error\n );\n }\n }\n}\n\nfunction mapSimpleLoanLookupError(\n error: SimpleLoansCanisterError\n): LiquidiumError {\n const [key] = Object.entries(error)[0] ?? [\"Unknown\"];\n\n if (key === \"LoanNotFound\") {\n return new LiquidiumError(\n LiquidiumErrorCode.POSITION_NOT_FOUND,\n \"Simple loan not found\"\n );\n }\n\n return new LiquidiumError(LiquidiumErrorCode.INTERNAL, key);\n}\n\nfunction mapActivity(wire: ActivityWire): Activity {\n const amount = parseBigInt(wire.amount, \"activity amount\");\n\n if (isInflowOperation(wire.status.operation)) {\n const activity: InflowActivity = {\n id: wire.id,\n poolId: wire.poolId,\n asset: wire.asset,\n chain: wire.chain,\n amount,\n timestampMs: wire.timestampMs,\n status: wire.status as InflowActivityStatus,\n };\n\n if (wire.txids) {\n activity.txids = wire.txids;\n }\n\n if (wire.topUp) {\n activity.topUp = mapActivityTopUp(wire.topUp);\n }\n\n return activity;\n }\n\n if (isOutflowOperation(wire.status.operation)) {\n const activity: OutflowActivity = {\n id: wire.id,\n poolId: wire.poolId,\n asset: wire.asset,\n chain: wire.chain,\n amount,\n timestampMs: wire.timestampMs,\n status: wire.status as OutflowActivityStatus,\n };\n\n if (wire.txids) {\n activity.txids = wire.txids;\n }\n\n return activity;\n }\n\n throw new LiquidiumError(\n LiquidiumErrorCode.INTERNAL,\n `Invalid activity operation: ${wire.status.operation}`\n );\n}\n\nfunction isInflowOperation(operation: LiquidiumStatus[\"operation\"]): boolean {\n return operation === \"deposit\" || operation === \"repayment\";\n}\n\nfunction isOutflowOperation(operation: LiquidiumStatus[\"operation\"]): boolean {\n return operation === \"borrow\" || operation === \"withdrawal\";\n}\n\nfunction mapActivityTopUp(wire: ActivityTopUpWire): ActivityTopUp {\n return {\n required: wire.required,\n depositedAmount: parseBigInt(\n wire.depositedAmount,\n \"activity top-up deposited amount\"\n ),\n feeAmount: parseBigInt(wire.feeAmount, \"activity top-up fee amount\"),\n shortfallAmount: parseBigInt(\n wire.shortfallAmount,\n \"activity top-up shortfall amount\"\n ),\n };\n}\n","import { LiquidiumError, LiquidiumErrorCode } from \"../../core/errors\";\nimport {\n buildHistoryUserLiquidationsPath,\n buildHistoryUserTransactionsPath,\n SdkApiQueryParam,\n} from \"../../core/sdk-api-paths\";\nimport type { ApiClient } from \"../../core/transports/api-client\";\nimport { parseBigInt } from \"../../core/utils/bigint\";\nimport type {\n PaginatedResponse,\n UserHistoryResponse,\n UserLiquidationHistoryEntry,\n UserLiquidationHistoryFilters,\n UserTransactionHistoryEntry,\n UserTransactionHistoryFilters,\n} from \"./types\";\n\n/** Historical user transaction and liquidation data helpers. */\nexport class HistoryModule {\n constructor(private readonly apiClient: ApiClient | undefined) {}\n\n private requireApi(): ApiClient {\n if (!this.apiClient) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n \"History requires an API client\"\n );\n }\n\n return this.apiClient;\n }\n\n /**\n * Returns transaction history for a user.\n *\n * @param user - The Liquidium profile principal text.\n * @param filters - Optional pool, operation, state, time range, and pagination filters.\n * @returns Paginated user history entries.\n */\n async getUserTransactionHistory(\n user: string,\n filters: UserTransactionHistoryFilters = {}\n ): Promise<PaginatedResponse<UserTransactionHistoryEntry>> {\n const apiClient = this.requireApi();\n const query = new URLSearchParams();\n\n if (filters.cursor) {\n query.set(SdkApiQueryParam.cursor, filters.cursor);\n }\n if (filters.market) {\n query.set(SdkApiQueryParam.market, filters.market);\n }\n if (filters.poolId) {\n query.set(SdkApiQueryParam.poolId, filters.poolId);\n }\n if (filters.operations?.length) {\n query.set(SdkApiQueryParam.operations, filters.operations.join(\",\"));\n }\n if (filters.states?.length) {\n query.set(\n SdkApiQueryParam.states,\n createHistoryStateFilterParam(filters.states)\n );\n }\n if (filters.from) {\n query.set(SdkApiQueryParam.from, filters.from);\n }\n if (filters.to) {\n query.set(SdkApiQueryParam.to, filters.to);\n }\n if (filters.limit !== undefined) {\n query.set(SdkApiQueryParam.limit, String(filters.limit));\n }\n\n const requestPath = buildHistoryUserTransactionsPath(user, query);\n const response = await apiClient.get<UserHistoryResponse>(requestPath);\n\n return {\n items: response.items.map(mapUserTransactionHistoryEntry),\n nextCursor: response.nextCursor,\n };\n }\n\n /**\n * Returns liquidation history for a user.\n *\n * @param user - The Liquidium profile principal text.\n * @param filters - Optional pool, time range, and pagination filters.\n * @returns Paginated liquidation history entries.\n */\n async getLiquidationHistory(\n user: string,\n filters: UserLiquidationHistoryFilters = {}\n ): Promise<PaginatedResponse<UserLiquidationHistoryEntry>> {\n const apiClient = this.requireApi();\n const query = new URLSearchParams();\n if (filters.cursor) {\n query.set(SdkApiQueryParam.cursor, filters.cursor);\n }\n if (filters.market) {\n query.set(SdkApiQueryParam.market, filters.market);\n }\n if (filters.poolId) {\n query.set(SdkApiQueryParam.poolId, filters.poolId);\n }\n if (filters.from) {\n query.set(SdkApiQueryParam.from, filters.from);\n }\n if (filters.to) {\n query.set(SdkApiQueryParam.to, filters.to);\n }\n if (filters.limit !== undefined) {\n query.set(SdkApiQueryParam.limit, String(filters.limit));\n }\n\n const requestPath = buildHistoryUserLiquidationsPath(user, query);\n const response = await apiClient.get<UserHistoryResponse>(requestPath);\n\n return {\n items: response.items.map(mapUserLiquidationHistoryEntry),\n nextCursor: response.nextCursor,\n };\n }\n}\n\nfunction mapUserTransactionHistoryEntry(\n item: UserHistoryResponse[\"items\"][number]\n): UserTransactionHistoryEntry {\n return {\n id: item.id,\n amount: parseBigInt(item.amount, \"history user amount\"),\n poolId: item.poolId,\n timestamp: item.timestamp,\n status: item.status,\n txids: item.txids,\n };\n}\n\nfunction mapUserLiquidationHistoryEntry(\n item: UserHistoryResponse[\"items\"][number]\n): UserLiquidationHistoryEntry {\n if (\n item.status.operation !== \"liquidation\" ||\n item.status.state !== \"completed\"\n ) {\n throw new LiquidiumError(\n LiquidiumErrorCode.INTERNAL,\n `Invalid liquidation history status: ${item.status.state}`\n );\n }\n\n return {\n id: item.id,\n amount: parseBigInt(item.amount, \"history user amount\"),\n poolId: item.poolId,\n timestamp: item.timestamp,\n status: item.status,\n txids: item.txids,\n };\n}\n\nfunction createHistoryStateFilterParam(states: string[]): string {\n for (const state of states) {\n validateHistoryStateFilter(state);\n }\n\n return [...new Set(states)].join(\",\");\n}\n\nfunction validateHistoryStateFilter(state: string): void {\n switch (state) {\n case \"action_required\":\n case \"confirming\":\n case \"processing\":\n case \"completed\":\n case \"failed\":\n return;\n default:\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n `History state filter is not supported: ${state}`\n );\n }\n}\n","import type { Principal } from \"@icp-sdk/core/principal\";\nimport { LiquidiumError, LiquidiumErrorCode } from \"../errors\";\nimport { SupplyAction } from \"../types\";\n\nconst INFLOW_DEPOSIT_PREFIX = 0x1;\nconst INFLOW_REPAY_PREFIX = 0x2;\nconst MAX_PRINCIPAL_BYTES = 29;\nconst SUBACCOUNT_LENGTH = 32;\nconst PRINCIPAL_LENGTH_OFFSET = 2;\nconst PRINCIPAL_START_OFFSET = 3;\n\ninterface EncodeInflowSubaccountRequest {\n action: SupplyAction;\n principal: Principal;\n}\n\nexport function encodeInflowSubaccount(\n request: EncodeInflowSubaccountRequest\n): Uint8Array {\n const subaccount = new Uint8Array(SUBACCOUNT_LENGTH);\n const principalBytes = request.principal.toUint8Array();\n\n if (principalBytes.length > MAX_PRINCIPAL_BYTES) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n \"Principal length exceeds inflow subaccount capacity\"\n );\n }\n\n subaccount[0] =\n request.action === SupplyAction.deposit\n ? INFLOW_DEPOSIT_PREFIX\n : INFLOW_REPAY_PREFIX;\n subaccount[PRINCIPAL_LENGTH_OFFSET] = principalBytes.length;\n subaccount.set(principalBytes, PRINCIPAL_START_OFFSET);\n\n return subaccount;\n}\n","import { encodeIcrcAccount } from \"@icp-sdk/canisters/ledger/icrc\";\nimport { Principal } from \"@icp-sdk/core/principal\";\nimport { encodeFunctionData } from \"viem\";\nimport { LiquidiumError, LiquidiumErrorCode } from \"../../core/errors\";\nimport { CK_DEPOSIT_ABI, ERC20_ABI } from \"../../core/evm\";\nimport type { SupplyAction } from \"../../core/types\";\nimport { encodeInflowSubaccount } from \"../../core/utils/inflow-subaccount\";\nimport type {\n CreateTransferErc20TransactionParams,\n EvmContractTransaction,\n} from \"./types\";\n\n/** Parameters for an ERC-20 approve transaction. */\nexport interface CreateApproveTransactionParams {\n /** ERC-20 token contract address. */\n tokenAddress: string;\n /** Contract address approved to spend tokens. */\n spenderAddress: string;\n /** Approval amount in token base units. */\n amount: bigint;\n}\n\n/** Parameters for an ERC-20 deposit-helper transaction. */\nexport interface CreateDepositErc20TransactionParams {\n /** Deposit helper contract address. */\n depositContractAddress: string;\n /** ERC-20 token contract address. */\n tokenAddress: string;\n /** Deposit amount in token base units. */\n amount: bigint;\n /** Pool principal text receiving the inflow. */\n poolId: string;\n /** Liquidium profile principal text. */\n profileId: string;\n /** Expected ICRC destination account text. */\n destinationAccount: string;\n /** Deposit or repayment action for the inflow. */\n action: SupplyAction;\n}\n\n/** Builds calldata for an ERC-20 `approve(spender, amount)` transaction. */\nexport function createApproveTransaction(\n params: CreateApproveTransactionParams\n): EvmContractTransaction {\n return {\n to: params.tokenAddress,\n data: encodeFunctionData({\n abi: ERC20_ABI,\n functionName: \"approve\",\n args: [params.spenderAddress as `0x${string}`, params.amount],\n }),\n };\n}\n\n/** Builds calldata for an ERC-20 `transfer(recipient, amount)` transaction. */\nexport function createTransferErc20Transaction(\n params: CreateTransferErc20TransactionParams\n): EvmContractTransaction {\n return {\n to: params.tokenAddress,\n data: encodeFunctionData({\n abi: ERC20_ABI,\n functionName: \"transfer\",\n args: [params.recipientAddress as `0x${string}`, params.amount],\n }),\n };\n}\n\n/** Builds calldata for depositing ERC-20 funds into the ckETH deposit helper. */\nexport function createDepositErc20Transaction(\n params: CreateDepositErc20TransactionParams\n): EvmContractTransaction {\n const expectedDestinationAccount = encodeIcrcAccount({\n owner: Principal.fromText(params.poolId),\n subaccount: encodeInflowSubaccount({\n action: params.action,\n principal: Principal.fromText(params.profileId),\n }),\n });\n\n if (params.destinationAccount !== expectedDestinationAccount) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n \"ETH supply destination account does not match the expected inflow account\"\n );\n }\n\n const principalBytes32 = encodePrincipalToBytes32(\n Principal.fromText(params.poolId)\n );\n const subaccountHex = encodeBytes32Hex(\n encodeInflowSubaccount({\n action: params.action,\n principal: Principal.fromText(params.profileId),\n })\n );\n\n return {\n to: params.depositContractAddress,\n data: encodeFunctionData({\n abi: CK_DEPOSIT_ABI,\n functionName: \"depositErc20\",\n args: [\n params.tokenAddress as `0x${string}`,\n params.amount,\n principalBytes32,\n subaccountHex,\n ],\n }),\n };\n}\n\nfunction encodePrincipalToBytes32(principal: Principal): `0x${string}` {\n const principalBytes = principal.toUint8Array();\n if (principalBytes.length > 29) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n \"Principal length exceeds Ethereum bytes32 capacity\"\n );\n }\n\n const fixedBytes = new Uint8Array(32);\n fixedBytes[0] = principalBytes.length;\n fixedBytes.set(principalBytes, 1);\n\n return encodeBytes32Hex(fixedBytes);\n}\n\nfunction encodeBytes32Hex(bytes: Uint8Array): `0x${string}` {\n return `0x${Array.from(bytes, (byte) =>\n byte.toString(16).padStart(2, \"0\")\n ).join(\"\")}`;\n}\n","import { Asset } from \"./types\";\n\nconst MINIMUM_BTC_BORROW_AMOUNT_SATS = 5_100n;\nconst MINIMUM_STABLECOIN_BORROW_AMOUNT_BASE_UNITS = 1_000_000n;\n\n/** Minimum borrow amounts in each asset's base units. */\nexport const MIN_BORROW_AMOUNTS_BY_ASSET = {\n [Asset.BTC]: MINIMUM_BTC_BORROW_AMOUNT_SATS,\n [Asset.USDC]: MINIMUM_STABLECOIN_BORROW_AMOUNT_BASE_UNITS,\n [Asset.USDT]: MINIMUM_STABLECOIN_BORROW_AMOUNT_BASE_UNITS,\n} as const;\n\nexport type MinimumBorrowAsset = keyof typeof MIN_BORROW_AMOUNTS_BY_ASSET;\n\nexport interface BorrowAmountMinimumValidationParams {\n amount: bigint;\n asset: string;\n}\n\nexport interface BorrowAmountMinimumValidationError {\n asset: string;\n minimumAmount: bigint;\n message: string;\n}\n\n/**\n * Returns the minimum borrow amount for an asset in base units.\n *\n * Assets without a configured product minimum return `0n`.\n */\nexport function getMinimumBorrowAmount(asset: string): bigint {\n if (!isMinimumBorrowAsset(asset)) {\n return 0n;\n }\n\n return MIN_BORROW_AMOUNTS_BY_ASSET[asset];\n}\n\nexport function getBorrowAmountMinimumValidationError(\n params: BorrowAmountMinimumValidationParams\n): BorrowAmountMinimumValidationError | null {\n const minimumAmount = getMinimumBorrowAmount(params.asset);\n if (minimumAmount <= 0n || params.amount >= minimumAmount) {\n return null;\n }\n\n return {\n asset: params.asset,\n minimumAmount,\n message: formatMinimumBorrowAmountMessage(params.asset, minimumAmount),\n };\n}\n\nexport function formatMinimumBorrowAmountMessage(\n asset: string,\n minimumAmount: bigint\n): string {\n return `Borrow amount must be at least ${minimumAmount} base units for ${asset}`;\n}\n\nfunction isMinimumBorrowAsset(asset: string): asset is MinimumBorrowAsset {\n return Object.hasOwn(MIN_BORROW_AMOUNTS_BY_ASSET, asset);\n}\n","import { Actor, type ActorMethod } from \"@icp-sdk/core/agent\";\nimport type { IDL } from \"@icp-sdk/core/candid\";\nimport { LiquidiumError, LiquidiumErrorCode } from \"../../errors\";\nimport type { CanisterContext } from \"../../transports/canister-context\";\n\nexport interface IcrcLedgerActor {\n icrc1_fee: ActorMethod<[], bigint>;\n}\n\nconst idlFactory: IDL.InterfaceFactory = ({ IDL }) =>\n IDL.Service({\n icrc1_fee: IDL.Func([], [IDL.Nat], [\"query\"]),\n });\n\nexport function createIcrcLedgerActor(params: {\n canisterContext: CanisterContext;\n canisterId: string | undefined;\n ledgerName: string;\n}): IcrcLedgerActor {\n if (!params.canisterId) {\n throw new LiquidiumError(\n LiquidiumErrorCode.SERVICE_UNAVAILABLE,\n `${params.ledgerName} ledger canister ID is not configured`\n );\n }\n\n return Actor.createActor<IcrcLedgerActor>(idlFactory, {\n agent: params.canisterContext.agent,\n canisterId: params.canisterId,\n });\n}\n","import { CK_CANISTER_IDS } from \"../../config\";\nimport type { CanisterContext } from \"../../transports/canister-context\";\nimport { createIcrcLedgerActor, type IcrcLedgerActor } from \"../icrc/ledger\";\n\nexport type CkBtcLedgerActor = IcrcLedgerActor;\n\nexport function createCkBtcLedgerActor(\n canisterContext: CanisterContext\n): CkBtcLedgerActor {\n return createIcrcLedgerActor({\n canisterContext,\n canisterId: CK_CANISTER_IDS.BTC.ledger,\n ledgerName: \"ckBTC\",\n });\n}\n","export const idlFactory = ({ IDL }) => {\n const Mode = IDL.Variant({\n 'RestrictedTo' : IDL.Vec(IDL.Principal),\n 'DepositsRestrictedTo' : IDL.Vec(IDL.Principal),\n 'ReadOnly' : IDL.Null,\n 'GeneralAvailability' : IDL.Null,\n });\n const UpgradeArgs = IDL.Record({\n 'get_utxos_cache_expiration_seconds' : IDL.Opt(IDL.Nat64),\n 'kyt_principal' : IDL.Opt(IDL.Principal),\n 'mode' : IDL.Opt(Mode),\n 'retrieve_btc_min_amount' : IDL.Opt(IDL.Nat64),\n 'max_time_in_queue_nanos' : IDL.Opt(IDL.Nat64),\n 'check_fee' : IDL.Opt(IDL.Nat64),\n 'btc_checker_principal' : IDL.Opt(IDL.Principal),\n 'min_confirmations' : IDL.Opt(IDL.Nat32),\n 'kyt_fee' : IDL.Opt(IDL.Nat64),\n });\n const BtcNetwork = IDL.Variant({\n 'Mainnet' : IDL.Null,\n 'Regtest' : IDL.Null,\n 'Testnet' : IDL.Null,\n });\n const InitArgs = IDL.Record({\n 'get_utxos_cache_expiration_seconds' : IDL.Opt(IDL.Nat64),\n 'kyt_principal' : IDL.Opt(IDL.Principal),\n 'ecdsa_key_name' : IDL.Text,\n 'mode' : Mode,\n 'retrieve_btc_min_amount' : IDL.Nat64,\n 'ledger_id' : IDL.Principal,\n 'max_time_in_queue_nanos' : IDL.Nat64,\n 'btc_network' : BtcNetwork,\n 'check_fee' : IDL.Opt(IDL.Nat64),\n 'btc_checker_principal' : IDL.Opt(IDL.Principal),\n 'min_confirmations' : IDL.Opt(IDL.Nat32),\n 'kyt_fee' : IDL.Opt(IDL.Nat64),\n });\n const MinterArg = IDL.Variant({\n 'Upgrade' : IDL.Opt(UpgradeArgs),\n 'Init' : InitArgs,\n });\n const CanisterStatusType = IDL.Variant({\n 'stopped' : IDL.Null,\n 'stopping' : IDL.Null,\n 'running' : IDL.Null,\n });\n const LogVisibility = IDL.Variant({\n 'controllers' : IDL.Null,\n 'public' : IDL.Null,\n 'allowed_viewers' : IDL.Vec(IDL.Principal),\n });\n const DefiniteCanisterSettings = IDL.Record({\n 'freezing_threshold' : IDL.Nat,\n 'controllers' : IDL.Vec(IDL.Principal),\n 'reserved_cycles_limit' : IDL.Nat,\n 'log_visibility' : LogVisibility,\n 'wasm_memory_limit' : IDL.Nat,\n 'memory_allocation' : IDL.Nat,\n 'compute_allocation' : IDL.Nat,\n });\n const QueryStats = IDL.Record({\n 'response_payload_bytes_total' : IDL.Nat,\n 'num_instructions_total' : IDL.Nat,\n 'num_calls_total' : IDL.Nat,\n 'request_payload_bytes_total' : IDL.Nat,\n });\n const CanisterStatusResponse = IDL.Record({\n 'status' : CanisterStatusType,\n 'memory_size' : IDL.Nat,\n 'cycles' : IDL.Nat,\n 'settings' : DefiniteCanisterSettings,\n 'query_stats' : QueryStats,\n 'idle_cycles_burned_per_day' : IDL.Nat,\n 'module_hash' : IDL.Opt(IDL.Vec(IDL.Nat8)),\n 'reserved_cycles' : IDL.Nat,\n });\n const Account = IDL.Record({\n 'owner' : IDL.Principal,\n 'subaccount' : IDL.Opt(IDL.Vec(IDL.Nat8)),\n });\n const Utxo = IDL.Record({\n 'height' : IDL.Nat32,\n 'value' : IDL.Nat64,\n 'outpoint' : IDL.Record({ 'txid' : IDL.Vec(IDL.Nat8), 'vout' : IDL.Nat32 }),\n });\n const ReimbursementReason = IDL.Variant({\n 'CallFailed' : IDL.Null,\n 'TaintedDestination' : IDL.Record({\n 'kyt_fee' : IDL.Nat64,\n 'kyt_provider' : IDL.Principal,\n }),\n });\n const SuspendedReason = IDL.Variant({\n 'ValueTooSmall' : IDL.Null,\n 'Quarantined' : IDL.Null,\n });\n const BitcoinAddress = IDL.Variant({\n 'p2wsh_v0' : IDL.Vec(IDL.Nat8),\n 'p2tr_v1' : IDL.Vec(IDL.Nat8),\n 'p2sh' : IDL.Vec(IDL.Nat8),\n 'p2wpkh_v0' : IDL.Vec(IDL.Nat8),\n 'p2pkh' : IDL.Vec(IDL.Nat8),\n });\n const EventType = IDL.Variant({\n 'received_utxos' : IDL.Record({\n 'to_account' : Account,\n 'mint_txid' : IDL.Opt(IDL.Nat64),\n 'utxos' : IDL.Vec(Utxo),\n }),\n 'schedule_deposit_reimbursement' : IDL.Record({\n 'burn_block_index' : IDL.Nat64,\n 'account' : Account,\n 'amount' : IDL.Nat64,\n 'reason' : ReimbursementReason,\n }),\n 'sent_transaction' : IDL.Record({\n 'fee' : IDL.Opt(IDL.Nat64),\n 'change_output' : IDL.Opt(\n IDL.Record({ 'value' : IDL.Nat64, 'vout' : IDL.Nat32 })\n ),\n 'txid' : IDL.Vec(IDL.Nat8),\n 'utxos' : IDL.Vec(Utxo),\n 'requests' : IDL.Vec(IDL.Nat64),\n 'submitted_at' : IDL.Nat64,\n }),\n 'distributed_kyt_fee' : IDL.Record({\n 'block_index' : IDL.Nat64,\n 'amount' : IDL.Nat64,\n 'kyt_provider' : IDL.Principal,\n }),\n 'init' : InitArgs,\n 'upgrade' : UpgradeArgs,\n 'retrieve_btc_kyt_failed' : IDL.Record({\n 'block_index' : IDL.Nat64,\n 'owner' : IDL.Principal,\n 'uuid' : IDL.Text,\n 'address' : IDL.Text,\n 'amount' : IDL.Nat64,\n 'kyt_provider' : IDL.Principal,\n }),\n 'suspended_utxo' : IDL.Record({\n 'utxo' : Utxo,\n 'account' : Account,\n 'reason' : SuspendedReason,\n }),\n 'accepted_retrieve_btc_request' : IDL.Record({\n 'received_at' : IDL.Nat64,\n 'block_index' : IDL.Nat64,\n 'address' : BitcoinAddress,\n 'reimbursement_account' : IDL.Opt(Account),\n 'amount' : IDL.Nat64,\n 'kyt_provider' : IDL.Opt(IDL.Principal),\n }),\n 'checked_utxo' : IDL.Record({\n 'clean' : IDL.Bool,\n 'utxo' : Utxo,\n 'uuid' : IDL.Text,\n 'kyt_provider' : IDL.Opt(IDL.Principal),\n }),\n 'removed_retrieve_btc_request' : IDL.Record({ 'block_index' : IDL.Nat64 }),\n 'confirmed_transaction' : IDL.Record({ 'txid' : IDL.Vec(IDL.Nat8) }),\n 'replaced_transaction' : IDL.Record({\n 'fee' : IDL.Nat64,\n 'change_output' : IDL.Record({ 'value' : IDL.Nat64, 'vout' : IDL.Nat32 }),\n 'old_txid' : IDL.Vec(IDL.Nat8),\n 'new_txid' : IDL.Vec(IDL.Nat8),\n 'submitted_at' : IDL.Nat64,\n }),\n 'checked_utxo_v2' : IDL.Record({ 'utxo' : Utxo, 'account' : Account }),\n 'ignored_utxo' : IDL.Record({ 'utxo' : Utxo }),\n 'checked_utxo_mint_unknown' : IDL.Record({\n 'utxo' : Utxo,\n 'account' : Account,\n }),\n 'reimbursed_failed_deposit' : IDL.Record({\n 'burn_block_index' : IDL.Nat64,\n 'mint_block_index' : IDL.Nat64,\n }),\n });\n const Event = IDL.Record({\n 'timestamp' : IDL.Opt(IDL.Nat64),\n 'payload' : EventType,\n });\n const MinterInfo = IDL.Record({\n 'retrieve_btc_min_amount' : IDL.Nat64,\n 'min_confirmations' : IDL.Nat32,\n 'kyt_fee' : IDL.Nat64,\n });\n const RetrieveBtcArgs = IDL.Record({\n 'address' : IDL.Text,\n 'amount' : IDL.Nat64,\n });\n const RetrieveBtcOk = IDL.Record({ 'block_index' : IDL.Nat64 });\n const RetrieveBtcError = IDL.Variant({\n 'MalformedAddress' : IDL.Text,\n 'GenericError' : IDL.Record({\n 'error_message' : IDL.Text,\n 'error_code' : IDL.Nat64,\n }),\n 'TemporarilyUnavailable' : IDL.Text,\n 'AlreadyProcessing' : IDL.Null,\n 'AmountTooLow' : IDL.Nat64,\n 'InsufficientFunds' : IDL.Record({ 'balance' : IDL.Nat64 }),\n });\n const RetrieveBtcStatus = IDL.Variant({\n 'Signing' : IDL.Null,\n 'Confirmed' : IDL.Record({ 'txid' : IDL.Vec(IDL.Nat8) }),\n 'Sending' : IDL.Record({ 'txid' : IDL.Vec(IDL.Nat8) }),\n 'AmountTooLow' : IDL.Null,\n 'Unknown' : IDL.Null,\n 'Submitted' : IDL.Record({ 'txid' : IDL.Vec(IDL.Nat8) }),\n 'Pending' : IDL.Null,\n });\n const ReimbursementRequest = IDL.Record({\n 'account' : Account,\n 'amount' : IDL.Nat64,\n 'reason' : ReimbursementReason,\n });\n const ReimbursedDeposit = IDL.Record({\n 'account' : Account,\n 'mint_block_index' : IDL.Nat64,\n 'amount' : IDL.Nat64,\n 'reason' : ReimbursementReason,\n });\n const RetrieveBtcStatusV2 = IDL.Variant({\n 'Signing' : IDL.Null,\n 'Confirmed' : IDL.Record({ 'txid' : IDL.Vec(IDL.Nat8) }),\n 'Sending' : IDL.Record({ 'txid' : IDL.Vec(IDL.Nat8) }),\n 'AmountTooLow' : IDL.Null,\n 'WillReimburse' : ReimbursementRequest,\n 'Unknown' : IDL.Null,\n 'Submitted' : IDL.Record({ 'txid' : IDL.Vec(IDL.Nat8) }),\n 'Reimbursed' : ReimbursedDeposit,\n 'Pending' : IDL.Null,\n });\n const RetrieveBtcWithApprovalArgs = IDL.Record({\n 'from_subaccount' : IDL.Opt(IDL.Vec(IDL.Nat8)),\n 'address' : IDL.Text,\n 'amount' : IDL.Nat64,\n });\n const RetrieveBtcWithApprovalError = IDL.Variant({\n 'MalformedAddress' : IDL.Text,\n 'GenericError' : IDL.Record({\n 'error_message' : IDL.Text,\n 'error_code' : IDL.Nat64,\n }),\n 'TemporarilyUnavailable' : IDL.Text,\n 'InsufficientAllowance' : IDL.Record({ 'allowance' : IDL.Nat64 }),\n 'AlreadyProcessing' : IDL.Null,\n 'AmountTooLow' : IDL.Nat64,\n 'InsufficientFunds' : IDL.Record({ 'balance' : IDL.Nat64 }),\n });\n const UtxoStatus = IDL.Variant({\n 'ValueTooSmall' : Utxo,\n 'Tainted' : Utxo,\n 'Minted' : IDL.Record({\n 'minted_amount' : IDL.Nat64,\n 'block_index' : IDL.Nat64,\n 'utxo' : Utxo,\n }),\n 'Checked' : Utxo,\n });\n const Timestamp = IDL.Nat64;\n const SuspendedUtxo = IDL.Record({\n 'utxo' : Utxo,\n 'earliest_retry' : Timestamp,\n 'reason' : SuspendedReason,\n });\n const PendingUtxo = IDL.Record({\n 'confirmations' : IDL.Nat32,\n 'value' : IDL.Nat64,\n 'outpoint' : IDL.Record({ 'txid' : IDL.Vec(IDL.Nat8), 'vout' : IDL.Nat32 }),\n });\n const UpdateBalanceError = IDL.Variant({\n 'GenericError' : IDL.Record({\n 'error_message' : IDL.Text,\n 'error_code' : IDL.Nat64,\n }),\n 'TemporarilyUnavailable' : IDL.Text,\n 'AlreadyProcessing' : IDL.Null,\n 'NoNewUtxos' : IDL.Record({\n 'suspended_utxos' : IDL.Opt(IDL.Vec(SuspendedUtxo)),\n 'required_confirmations' : IDL.Nat32,\n 'pending_utxos' : IDL.Opt(IDL.Vec(PendingUtxo)),\n 'current_confirmations' : IDL.Opt(IDL.Nat32),\n }),\n });\n return IDL.Service({\n 'estimate_withdrawal_fee' : IDL.Func(\n [IDL.Record({ 'amount' : IDL.Opt(IDL.Nat64) })],\n [IDL.Record({ 'minter_fee' : IDL.Nat64, 'bitcoin_fee' : IDL.Nat64 })],\n ['query'],\n ),\n 'get_btc_address' : IDL.Func(\n [\n IDL.Record({\n 'owner' : IDL.Opt(IDL.Principal),\n 'subaccount' : IDL.Opt(IDL.Vec(IDL.Nat8)),\n }),\n ],\n [IDL.Text],\n [],\n ),\n 'get_canister_status' : IDL.Func([], [CanisterStatusResponse], []),\n 'get_deposit_fee' : IDL.Func([], [IDL.Nat64], ['query']),\n 'get_events' : IDL.Func(\n [IDL.Record({ 'start' : IDL.Nat64, 'length' : IDL.Nat64 })],\n [IDL.Vec(Event)],\n ['query'],\n ),\n 'get_known_utxos' : IDL.Func(\n [\n IDL.Record({\n 'owner' : IDL.Opt(IDL.Principal),\n 'subaccount' : IDL.Opt(IDL.Vec(IDL.Nat8)),\n }),\n ],\n [IDL.Vec(Utxo)],\n ['query'],\n ),\n 'get_minter_info' : IDL.Func([], [MinterInfo], ['query']),\n 'get_withdrawal_account' : IDL.Func([], [Account], []),\n 'retrieve_btc' : IDL.Func(\n [RetrieveBtcArgs],\n [IDL.Variant({ 'Ok' : RetrieveBtcOk, 'Err' : RetrieveBtcError })],\n [],\n ),\n 'retrieve_btc_status' : IDL.Func(\n [IDL.Record({ 'block_index' : IDL.Nat64 })],\n [RetrieveBtcStatus],\n ['query'],\n ),\n 'retrieve_btc_status_v2' : IDL.Func(\n [IDL.Record({ 'block_index' : IDL.Nat64 })],\n [RetrieveBtcStatusV2],\n ['query'],\n ),\n 'retrieve_btc_status_v2_by_account' : IDL.Func(\n [IDL.Opt(Account)],\n [\n IDL.Vec(\n IDL.Record({\n 'block_index' : IDL.Nat64,\n 'status_v2' : IDL.Opt(RetrieveBtcStatusV2),\n })\n ),\n ],\n ['query'],\n ),\n 'retrieve_btc_with_approval' : IDL.Func(\n [RetrieveBtcWithApprovalArgs],\n [\n IDL.Variant({\n 'Ok' : RetrieveBtcOk,\n 'Err' : RetrieveBtcWithApprovalError,\n }),\n ],\n [],\n ),\n 'update_balance' : IDL.Func(\n [\n IDL.Record({\n 'owner' : IDL.Opt(IDL.Principal),\n 'subaccount' : IDL.Opt(IDL.Vec(IDL.Nat8)),\n }),\n ],\n [\n IDL.Variant({\n 'Ok' : IDL.Vec(UtxoStatus),\n 'Err' : UpdateBalanceError,\n }),\n ],\n [],\n ),\n });\n};\n\nexport const init = ({ IDL }) => {\n const Mode = IDL.Variant({\n 'RestrictedTo' : IDL.Vec(IDL.Principal),\n 'DepositsRestrictedTo' : IDL.Vec(IDL.Principal),\n 'ReadOnly' : IDL.Null,\n 'GeneralAvailability' : IDL.Null,\n });\n const UpgradeArgs = IDL.Record({\n 'get_utxos_cache_expiration_seconds' : IDL.Opt(IDL.Nat64),\n 'kyt_principal' : IDL.Opt(IDL.Principal),\n 'mode' : IDL.Opt(Mode),\n 'retrieve_btc_min_amount' : IDL.Opt(IDL.Nat64),\n 'max_time_in_queue_nanos' : IDL.Opt(IDL.Nat64),\n 'check_fee' : IDL.Opt(IDL.Nat64),\n 'btc_checker_principal' : IDL.Opt(IDL.Principal),\n 'min_confirmations' : IDL.Opt(IDL.Nat32),\n 'kyt_fee' : IDL.Opt(IDL.Nat64),\n });\n const BtcNetwork = IDL.Variant({\n 'Mainnet' : IDL.Null,\n 'Regtest' : IDL.Null,\n 'Testnet' : IDL.Null,\n });\n const InitArgs = IDL.Record({\n 'get_utxos_cache_expiration_seconds' : IDL.Opt(IDL.Nat64),\n 'kyt_principal' : IDL.Opt(IDL.Principal),\n 'ecdsa_key_name' : IDL.Text,\n 'mode' : Mode,\n 'retrieve_btc_min_amount' : IDL.Nat64,\n 'ledger_id' : IDL.Principal,\n 'max_time_in_queue_nanos' : IDL.Nat64,\n 'btc_network' : BtcNetwork,\n 'check_fee' : IDL.Opt(IDL.Nat64),\n 'btc_checker_principal' : IDL.Opt(IDL.Principal),\n 'min_confirmations' : IDL.Opt(IDL.Nat32),\n 'kyt_fee' : IDL.Opt(IDL.Nat64),\n });\n const MinterArg = IDL.Variant({\n 'Upgrade' : IDL.Opt(UpgradeArgs),\n 'Init' : InitArgs,\n });\n return [MinterArg];\n};\n","import { Actor } from \"@icp-sdk/core/agent\";\nimport type { _SERVICE } from \"../../../generated/canisters/ck-btc-minter/declaration\";\nimport { idlFactory } from \"../../../generated/canisters/ck-btc-minter/declaration.js\";\nimport { CK_CANISTER_IDS } from \"../../config\";\nimport { LiquidiumError, LiquidiumErrorCode } from \"../../errors\";\nimport type { CanisterContext } from \"../../transports/canister-context\";\n\nexport type CkBtcMinterActor = _SERVICE;\n\nexport function createCkBtcMinterActor(\n canisterContext: CanisterContext\n): CkBtcMinterActor {\n const canisterId = CK_CANISTER_IDS.BTC.minter;\n\n if (!canisterId) {\n throw new LiquidiumError(\n LiquidiumErrorCode.SERVICE_UNAVAILABLE,\n \"ckBTC minter canister ID is not configured\"\n );\n }\n\n return Actor.createActor<CkBtcMinterActor>(idlFactory, {\n agent: canisterContext.agent,\n canisterId,\n });\n}\n","export const idlFactory = ({ IDL }) => {\n const DepositAccountErrors = IDL.Variant({\n 'Busy' : IDL.Null,\n 'NotFound' : IDL.Null,\n 'Other' : IDL.Text,\n 'Cooldown' : IDL.Record({ 'retry_after_secs' : IDL.Nat64 }),\n 'AddressDerivationFailed' : IDL.Null,\n 'InvalidEvmAddress' : IDL.Null,\n });\n const Result = IDL.Variant({ 'Ok' : IDL.Nat, 'Err' : DepositAccountErrors });\n const DepositStatus = IDL.Variant({\n 'Failed' : IDL.Text,\n 'Success' : IDL.Null,\n 'Pending' : IDL.Null,\n });\n const DepositAssetType = IDL.Variant({\n 'Native' : IDL.Null,\n 'ERC20' : IDL.Text,\n });\n const Account = IDL.Record({\n 'owner' : IDL.Principal,\n 'subaccount' : IDL.Opt(IDL.Vec(IDL.Nat8)),\n });\n const Deposit = IDL.Record({\n 'status' : DepositStatus,\n 'asset_type' : DepositAssetType,\n 'account' : Account,\n 'timestamp' : IDL.Nat64,\n 'amount' : IDL.Nat,\n });\n const Result_1 = IDL.Variant({\n 'Ok' : IDL.Vec(IDL.Tuple(IDL.Text, IDL.Text, Deposit)),\n 'Err' : DepositAccountErrors,\n });\n const Result_2 = IDL.Variant({\n 'Ok' : IDL.Text,\n 'Err' : DepositAccountErrors,\n });\n const QueueJobStatus = IDL.Variant({\n 'Queued' : IDL.Null,\n 'Failed' : IDL.Null,\n 'NoOp' : IDL.Null,\n 'Ready' : IDL.Null,\n 'RetryScheduled' : IDL.Null,\n 'Succeeded' : IDL.Null,\n 'Cancelled' : IDL.Null,\n 'Processing' : IDL.Null,\n 'Broadcasted' : IDL.Null,\n });\n const QueueRecoveryContext = IDL.Variant({\n 'FundingPending' : IDL.Record({\n 'funding_tx_hash' : IDL.Text,\n 'native_amount_wei' : IDL.Opt(IDL.Nat),\n }),\n 'ReadyNativeAmount' : IDL.Record({ 'native_amount_wei' : IDL.Nat }),\n });\n const QueueJob = IDL.Record({\n 'id' : IDL.Nat64,\n 'last_error' : IDL.Opt(IDL.Text),\n 'status' : QueueJobStatus,\n 'updated_at' : IDL.Nat64,\n 'asset_type' : DepositAssetType,\n 'next_attempt_at' : IDL.Nat64,\n 'token_address' : IDL.Opt(IDL.Text),\n 'attempts' : IDL.Nat32,\n 'created_at' : IDL.Nat64,\n 'address' : IDL.Text,\n 'account' : Account,\n 'tx_hash' : IDL.Opt(IDL.Text),\n 'recovery_context' : IDL.Opt(QueueRecoveryContext),\n });\n const BroadcastSuccessEvent = IDL.Record({\n 'broadcast_key' : IDL.Text,\n 'asset_type' : DepositAssetType,\n 'address' : IDL.Text,\n 'account' : Account,\n 'timestamp' : IDL.Nat64,\n 'queue_job_id' : IDL.Nat64,\n 'tx_hash' : IDL.Text,\n 'amount' : IDL.Nat,\n });\n const BroadcastConfirmedEvent = IDL.Record({\n 'broadcast_key' : IDL.Text,\n 'timestamp' : IDL.Nat64,\n 'queue_job_id' : IDL.Opt(IDL.Nat64),\n 'tx_hash' : IDL.Text,\n });\n const DustCleanupScheduledEvent = IDL.Record({\n 'address' : IDL.Text,\n 'timestamp' : IDL.Nat64,\n 'queue_job_id' : IDL.Nat64,\n });\n const DustCleanupFailedEvent = IDL.Record({\n 'attempts' : IDL.Nat8,\n 'address' : IDL.Text,\n 'timestamp' : IDL.Nat64,\n 'reason' : IDL.Text,\n });\n const BroadcastRejectedEvent = IDL.Record({\n 'broadcast_key' : IDL.Text,\n 'timestamp' : IDL.Nat64,\n 'queue_job_id' : IDL.Opt(IDL.Nat64),\n 'tx_hash' : IDL.Text,\n 'reason' : IDL.Text,\n });\n const BalanceDetectedEvent = IDL.Record({\n 'asset_type' : DepositAssetType,\n 'address' : IDL.Text,\n 'account' : Account,\n 'timestamp' : IDL.Nat64,\n 'queue_job_id' : IDL.Nat64,\n 'amount' : IDL.Nat,\n });\n const AssetRegisteredEvent = IDL.Record({\n 'decimals' : IDL.Nat32,\n 'asset_address' : IDL.Text,\n 'updated_existing' : IDL.Bool,\n 'timestamp' : IDL.Nat64,\n 'caller' : IDL.Principal,\n 'symbol' : IDL.Text,\n });\n const QueueJobFailedEvent = IDL.Record({\n 'asset_type' : DepositAssetType,\n 'attempts' : IDL.Nat32,\n 'address' : IDL.Text,\n 'account' : Account,\n 'timestamp' : IDL.Nat64,\n 'queue_job_id' : IDL.Nat64,\n 'reason' : IDL.Text,\n });\n const DepositAccountEvent = IDL.Variant({\n 'BroadcastSuccess' : BroadcastSuccessEvent,\n 'BroadcastConfirmed' : BroadcastConfirmedEvent,\n 'DustCleanupScheduled' : DustCleanupScheduledEvent,\n 'DustCleanupFailed' : DustCleanupFailedEvent,\n 'BroadcastRejected' : BroadcastRejectedEvent,\n 'BalanceDetected' : BalanceDetectedEvent,\n 'AssetRegistered' : AssetRegisteredEvent,\n 'QueueJobFailed' : QueueJobFailedEvent,\n });\n const AddressBinding = IDL.Record({\n 'token_address' : IDL.Opt(IDL.Text),\n 'account' : Account,\n });\n const Result_3 = IDL.Variant({\n 'Ok' : AddressBinding,\n 'Err' : DepositAccountErrors,\n });\n const Result_4 = IDL.Variant({\n 'Ok' : IDL.Null,\n 'Err' : DepositAccountErrors,\n });\n const Result_5 = IDL.Variant({\n 'Ok' : IDL.Nat64,\n 'Err' : DepositAccountErrors,\n });\n const Result_6 = IDL.Variant({\n 'Ok' : IDL.Nat,\n 'Err' : DepositAccountErrors,\n });\n return IDL.Service({\n 'estimate_deposit_fee' : IDL.Func([IDL.Opt(IDL.Text)], [Result], ['query']),\n 'get_broadcasted_txs' : IDL.Func([], [Result_1], ['query']),\n 'get_deposit_address' : IDL.Func(\n [Account, IDL.Opt(IDL.Text)],\n [Result_2],\n ['query'],\n ),\n 'get_funding_wallet_address' : IDL.Func([], [Result_2], ['query']),\n 'get_or_create_deposit_address' : IDL.Func(\n [Account, IDL.Opt(IDL.Text)],\n [Result_2],\n [],\n ),\n 'get_queue_job' : IDL.Func([IDL.Nat64], [IDL.Opt(QueueJob)], ['query']),\n 'get_queued_event' : IDL.Func(\n [IDL.Nat],\n [IDL.Opt(DepositAccountEvent)],\n ['query'],\n ),\n 'get_queued_events' : IDL.Func(\n [IDL.Nat64, IDL.Nat64],\n [IDL.Vec(IDL.Tuple(IDL.Nat, DepositAccountEvent))],\n ['query'],\n ),\n 'get_supported_assets' : IDL.Func(\n [],\n [IDL.Vec(IDL.Tuple(IDL.Text, IDL.Text, IDL.Nat32))],\n ['query'],\n ),\n 'get_user_by_address' : IDL.Func([IDL.Text], [Result_3], ['query']),\n 'list_queue_jobs' : IDL.Func(\n [IDL.Nat64, IDL.Nat32],\n [IDL.Vec(QueueJob)],\n ['query'],\n ),\n 'register_asset' : IDL.Func(\n [IDL.Text, IDL.Text, IDL.Nat32],\n [Result_4],\n [],\n ),\n 'set_proxy_contract_address_override' : IDL.Func(\n [IDL.Text],\n [Result_4],\n [],\n ),\n 'sync_address_nonce' : IDL.Func([IDL.Text], [Result_5], []),\n 'update_address' : IDL.Func([IDL.Text], [Result_6], []),\n });\n};\nexport const init = ({ IDL }) => { return []; };\n","import { Actor } from \"@icp-sdk/core/agent\";\nimport type {\n _SERVICE,\n DepositAccountErrors as GeneratedDepositAccountErrors,\n} from \"../../../generated/canisters/deposit-accounts/deposit_accounts.did\";\nimport { idlFactory } from \"../../../generated/canisters/deposit-accounts/deposit_accounts.did.js\";\nimport { LiquidiumError, LiquidiumErrorCode } from \"../../errors\";\nimport type { CanisterContext } from \"../../transports/canister-context\";\n\nexport type DepositAccountsActor = _SERVICE;\nexport type DepositAccountErrors = GeneratedDepositAccountErrors;\n\nexport function createDepositAccountsActor(\n canisterContext: CanisterContext\n): DepositAccountsActor {\n const canisterId = canisterContext.canisterIds.ethDeposit;\n\n if (!canisterId) {\n throw new LiquidiumError(\n LiquidiumErrorCode.SERVICE_UNAVAILABLE,\n \"ETH deposit canister ID is not configured\"\n );\n }\n\n return Actor.createActor<DepositAccountsActor>(idlFactory, {\n agent: canisterContext.agent,\n canisterId,\n });\n}\n","import { Actor } from \"@icp-sdk/core/agent\";\nimport type { IDL } from \"@icp-sdk/core/candid\";\nimport type { Principal } from \"@icp-sdk/core/principal\";\nimport { LiquidiumError, LiquidiumErrorCode } from \"../../errors\";\nimport type { CanisterContext } from \"../../transports/canister-context\";\nimport {\n extractVariantTag,\n KNOWN_ASSET_TAGS,\n KNOWN_CHAIN_TAGS,\n type KnownAssetTag,\n type KnownChainTag,\n} from \"../../utils/variant-tags\";\n\nconst flexibleLendingIdlFactory: IDL.InterfaceFactory = ({ IDL }) => {\n const PoolRecord = IDL.Record({\n principal: IDL.Principal,\n asset: IDL.Unknown,\n chain: IDL.Unknown,\n total_supply_at_last_sync: IDL.Nat,\n total_debt_at_last_sync: IDL.Nat,\n supply_cap: IDL.Opt(IDL.Nat),\n borrow_cap: IDL.Opt(IDL.Nat),\n max_ltv: IDL.Nat64,\n liquidation_threshold: IDL.Nat64,\n liquidation_bonus: IDL.Nat64,\n protocol_liquidation_fee: IDL.Nat64,\n reserve_factor: IDL.Nat64,\n base_rate: IDL.Nat,\n optimal_utilization_rate: IDL.Nat,\n rate_slope_before: IDL.Nat,\n rate_slope_after: IDL.Nat,\n lending_index: IDL.Nat,\n borrow_index: IDL.Nat,\n same_asset_borrowing: IDL.Opt(IDL.Bool),\n same_asset_borrowing_dust_threshold: IDL.Nat,\n frozen: IDL.Bool,\n last_updated: IDL.Opt(IDL.Nat64),\n });\n\n const BorrowingPowerRecord = IDL.Record({\n max_borrowable_usd: IDL.Nat,\n weighted_max_ltv: IDL.Nat,\n });\n\n const PositionRecord = IDL.Record({\n asset: IDL.Unknown,\n total_debt_interest: IDL.Nat,\n borrow_index_snapshot: IDL.Nat,\n lending_index_snapshot: IDL.Nat,\n debt_scaled: IDL.Nat,\n total_earned_interest: IDL.Nat,\n deposit_scaled: IDL.Nat,\n pool_id: IDL.Principal,\n unpaid_debt_interest: IDL.Nat,\n last_update: IDL.Nat64,\n user_profile: IDL.Principal,\n });\n\n const UserStatsRecord = IDL.Record({\n debt: IDL.Nat,\n collateral: IDL.Nat,\n acumulated_interest: IDL.Nat,\n borrowing_power: BorrowingPowerRecord,\n positions: IDL.Vec(PositionRecord),\n weighted_liquidation_threshold: IDL.Nat,\n });\n\n const PositionViewRecord = IDL.Record({\n lending_index_now: IDL.Nat,\n interest_since_snapshot: IDL.Nat,\n asset: IDL.Unknown,\n total_debt_interest: IDL.Nat,\n borrow_index_snapshot: IDL.Nat,\n debt_native_now: IDL.Nat,\n borrow_index_now: IDL.Nat,\n lending_index_snapshot: IDL.Nat,\n debt_scaled: IDL.Nat,\n total_earned_interest: IDL.Nat,\n deposit_scaled: IDL.Nat,\n earned_since_snapshot: IDL.Nat,\n deposited_native_now: IDL.Nat,\n pool_id: IDL.Principal,\n last_update: IDL.Nat64,\n user_profile: IDL.Principal,\n });\n\n return IDL.Service({\n list_pools: IDL.Func([], [IDL.Vec(PoolRecord)], [\"query\"]),\n get_pool_rate: IDL.Func(\n [IDL.Principal],\n [IDL.Opt(IDL.Tuple(IDL.Nat, IDL.Nat, IDL.Nat))],\n [\"query\"]\n ),\n get_health_factor: IDL.Func(\n [IDL.Principal],\n [IDL.Nat, UserStatsRecord],\n [\"query\"]\n ),\n get_profile_stats: IDL.Func([IDL.Principal], [UserStatsRecord], [\"query\"]),\n get_position: IDL.Func(\n [IDL.Principal, IDL.Principal],\n [IDL.Opt(PositionViewRecord)],\n [\"query\"]\n ),\n });\n};\n\nexport type FlexiblePool = {\n principal: Principal;\n asset: object;\n chain: object;\n total_supply_at_last_sync: bigint;\n total_debt_at_last_sync: bigint;\n supply_cap: [bigint] | [];\n borrow_cap: [bigint] | [];\n max_ltv: bigint;\n liquidation_threshold: bigint;\n liquidation_bonus: bigint;\n protocol_liquidation_fee: bigint;\n reserve_factor: bigint;\n base_rate: bigint;\n optimal_utilization_rate: bigint;\n rate_slope_before: bigint;\n rate_slope_after: bigint;\n lending_index: bigint;\n borrow_index: bigint;\n same_asset_borrowing: [boolean] | [];\n same_asset_borrowing_dust_threshold: bigint;\n frozen: boolean;\n last_updated: [bigint] | [];\n};\n\nexport type FlexibleBorrowingPower = {\n max_borrowable_usd: bigint;\n weighted_max_ltv: bigint;\n};\n\nexport type FlexiblePosition = {\n asset: object;\n total_debt_interest: bigint;\n borrow_index_snapshot: bigint;\n lending_index_snapshot: bigint;\n debt_scaled: bigint;\n total_earned_interest: bigint;\n deposit_scaled: bigint;\n pool_id: Principal;\n unpaid_debt_interest: bigint;\n last_update: bigint;\n user_profile: Principal;\n};\n\nexport type FlexibleUserStats = {\n debt: bigint;\n collateral: bigint;\n acumulated_interest: bigint;\n borrowing_power: FlexibleBorrowingPower;\n positions: FlexiblePosition[];\n weighted_liquidation_threshold: bigint;\n};\n\nexport type FlexiblePositionView = {\n lending_index_now: bigint;\n interest_since_snapshot: bigint;\n asset: object;\n total_debt_interest: bigint;\n borrow_index_snapshot: bigint;\n debt_native_now: bigint;\n borrow_index_now: bigint;\n lending_index_snapshot: bigint;\n debt_scaled: bigint;\n total_earned_interest: bigint;\n deposit_scaled: bigint;\n earned_since_snapshot: bigint;\n deposited_native_now: bigint;\n pool_id: Principal;\n last_update: bigint;\n user_profile: Principal;\n};\n\nexport interface FlexibleLendingActor {\n list_pools: () => Promise<FlexiblePool[]>;\n get_pool_rate: (\n poolId: Principal\n ) => Promise<[] | [[bigint, bigint, bigint]]>;\n get_health_factor: (\n profileId: Principal\n ) => Promise<[bigint, FlexibleUserStats]>;\n get_profile_stats: (profileId: Principal) => Promise<FlexibleUserStats>;\n get_position: (\n profileId: Principal,\n poolId: Principal\n ) => Promise<[] | [FlexiblePositionView]>;\n}\n\nexport interface DecodedPool {\n principal: Principal;\n asset: KnownAssetTag;\n chain: KnownChainTag;\n total_supply_at_last_sync: bigint;\n total_debt_at_last_sync: bigint;\n supply_cap: [bigint] | [];\n borrow_cap: [bigint] | [];\n max_ltv: bigint;\n liquidation_threshold: bigint;\n liquidation_bonus: bigint;\n protocol_liquidation_fee: bigint;\n reserve_factor: bigint;\n base_rate: bigint;\n optimal_utilization_rate: bigint;\n rate_slope_before: bigint;\n rate_slope_after: bigint;\n lending_index: bigint;\n borrow_index: bigint;\n same_asset_borrowing: [boolean] | [];\n same_asset_borrowing_dust_threshold: bigint;\n frozen: boolean;\n last_updated: [bigint] | [];\n}\n\nexport interface DecodedPosition {\n asset: KnownAssetTag;\n total_debt_interest: bigint;\n borrow_index_snapshot: bigint;\n lending_index_snapshot: bigint;\n debt_scaled: bigint;\n total_earned_interest: bigint;\n deposit_scaled: bigint;\n pool_id: Principal;\n unpaid_debt_interest: bigint;\n last_update: bigint;\n user_profile: Principal;\n}\n\nexport interface DecodedUserStats {\n debt: bigint;\n collateral: bigint;\n acumulated_interest: bigint;\n borrowing_power: FlexibleBorrowingPower;\n positions: DecodedPosition[];\n weighted_liquidation_threshold: bigint;\n}\n\nexport interface DecodedPositionView {\n lending_index_now: bigint;\n interest_since_snapshot: bigint;\n asset: KnownAssetTag;\n total_debt_interest: bigint;\n borrow_index_snapshot: bigint;\n debt_native_now: bigint;\n borrow_index_now: bigint;\n lending_index_snapshot: bigint;\n debt_scaled: bigint;\n total_earned_interest: bigint;\n deposit_scaled: bigint;\n earned_since_snapshot: bigint;\n deposited_native_now: bigint;\n pool_id: Principal;\n last_update: bigint;\n user_profile: Principal;\n}\n\nexport function createFlexibleLendingActor(\n canisterContext: CanisterContext\n): FlexibleLendingActor {\n const canisterId = canisterContext.canisterIds.lending;\n\n if (!canisterId) {\n throw new LiquidiumError(\n LiquidiumErrorCode.SERVICE_UNAVAILABLE,\n \"Lending canister ID is not configured\"\n );\n }\n\n return Actor.createActor(flexibleLendingIdlFactory, {\n agent: canisterContext.agent,\n canisterId,\n }) as FlexibleLendingActor;\n}\n\nexport function decodeFlexiblePool(pool: FlexiblePool): DecodedPool | null {\n const asset = extractVariantTag(pool.asset, KNOWN_ASSET_TAGS);\n const chain = extractVariantTag(pool.chain, KNOWN_CHAIN_TAGS);\n\n if (!asset || !chain) {\n return null;\n }\n\n return {\n principal: pool.principal,\n asset,\n chain,\n total_supply_at_last_sync: pool.total_supply_at_last_sync,\n total_debt_at_last_sync: pool.total_debt_at_last_sync,\n supply_cap: pool.supply_cap,\n borrow_cap: pool.borrow_cap,\n max_ltv: pool.max_ltv,\n liquidation_threshold: pool.liquidation_threshold,\n liquidation_bonus: pool.liquidation_bonus,\n protocol_liquidation_fee: pool.protocol_liquidation_fee,\n reserve_factor: pool.reserve_factor,\n base_rate: pool.base_rate,\n optimal_utilization_rate: pool.optimal_utilization_rate,\n rate_slope_before: pool.rate_slope_before,\n rate_slope_after: pool.rate_slope_after,\n lending_index: pool.lending_index,\n borrow_index: pool.borrow_index,\n same_asset_borrowing: pool.same_asset_borrowing,\n same_asset_borrowing_dust_threshold:\n pool.same_asset_borrowing_dust_threshold,\n frozen: pool.frozen,\n last_updated: pool.last_updated,\n };\n}\n\nexport function decodeFlexiblePosition(\n position: FlexiblePosition\n): DecodedPosition | null {\n const asset = extractVariantTag(position.asset, KNOWN_ASSET_TAGS);\n\n if (!asset) {\n return null;\n }\n\n return {\n asset,\n total_debt_interest: position.total_debt_interest,\n borrow_index_snapshot: position.borrow_index_snapshot,\n lending_index_snapshot: position.lending_index_snapshot,\n debt_scaled: position.debt_scaled,\n total_earned_interest: position.total_earned_interest,\n deposit_scaled: position.deposit_scaled,\n pool_id: position.pool_id,\n unpaid_debt_interest: position.unpaid_debt_interest,\n last_update: position.last_update,\n user_profile: position.user_profile,\n };\n}\n\nexport function decodeFlexiblePositionView(\n view: FlexiblePositionView\n): DecodedPositionView | null {\n const asset = extractVariantTag(view.asset, KNOWN_ASSET_TAGS);\n\n if (!asset) {\n return null;\n }\n\n return {\n lending_index_now: view.lending_index_now,\n interest_since_snapshot: view.interest_since_snapshot,\n asset,\n total_debt_interest: view.total_debt_interest,\n borrow_index_snapshot: view.borrow_index_snapshot,\n debt_native_now: view.debt_native_now,\n borrow_index_now: view.borrow_index_now,\n lending_index_snapshot: view.lending_index_snapshot,\n debt_scaled: view.debt_scaled,\n total_earned_interest: view.total_earned_interest,\n deposit_scaled: view.deposit_scaled,\n earned_since_snapshot: view.earned_since_snapshot,\n deposited_native_now: view.deposited_native_now,\n pool_id: view.pool_id,\n last_update: view.last_update,\n user_profile: view.user_profile,\n };\n}\n\nexport function decodeFlexibleUserStats(\n stats: FlexibleUserStats\n): DecodedUserStats {\n return {\n debt: stats.debt,\n collateral: stats.collateral,\n acumulated_interest: stats.acumulated_interest,\n borrowing_power: stats.borrowing_power,\n positions: stats.positions\n .map(decodeFlexiblePosition)\n .filter((position): position is DecodedPosition => position !== null),\n weighted_liquidation_threshold: stats.weighted_liquidation_threshold,\n };\n}\n","export interface MessageAccount {\n type: \"AccountIdentifier\" | \"External\" | \"Icrc\" | \"Native\";\n data: string;\n}\n\ninterface OutflowMessageRequest {\n pool_id: string;\n amount: string;\n account: MessageAccount;\n expiry_timestamp: bigint;\n}\n\nexport function createBorrowAssetMessage(\n request: OutflowMessageRequest,\n nonce: bigint\n): string {\n return `Liquidium: Borrow Assets\n\nAction: Borrow from pool\nPool ID: ${request.pool_id}\nAmount: ${request.amount}\n${accountTypeToString(request.account)}\nExpires: ${request.expiry_timestamp}\nNonce: ${nonce}`;\n}\n\nexport function createWithdrawAssetMessage(\n request: OutflowMessageRequest,\n nonce: bigint\n): string {\n return `Liquidium: Withdraw Assets\n\nAction: Withdraw from pool\nPool ID: ${request.pool_id}\nAmount: ${request.amount}\n${accountTypeToString(request.account)}\nExpires: ${request.expiry_timestamp}\nNonce: ${nonce}`;\n}\n\nfunction accountTypeToString(accountType: MessageAccount): string {\n switch (accountType.type) {\n case \"External\":\n return `Address:${accountType.data}`;\n case \"Icrc\":\n return `Icrc:${accountType.data}`;\n case \"AccountIdentifier\":\n return `AccountId:${accountType.data}`;\n case \"Native\":\n return `Principal:${accountType.data}`;\n }\n}\n","import { CK_CANISTER_IDS } from \"./config\";\nimport { LiquidiumError, LiquidiumErrorCode } from \"./errors\";\nimport { Asset, Chain } from \"./types\";\n\nexport type PoolLedgerTransferAsset = Extract<\n Asset,\n \"BTC\" | \"ICP\" | \"USDC\" | \"USDT\"\n>;\nexport type PoolLedgerTransferChain = Extract<Chain, \"BTC\" | \"ETH\" | \"ICP\">;\n\nexport interface PoolLedgerAssetRoute {\n ledgerCanisterId: string;\n asset: PoolLedgerTransferAsset;\n chain: PoolLedgerTransferChain;\n}\n\n// Public asset symbols identify pool assets. On the IC side, BTC/USDT/USDC\n// resolve directly to their ck ledger canisters; native-chain transfers are\n// ingress paths into those same ledger-backed pool assets.\nexport function getPoolLedgerAssetRoute(params: {\n asset: string;\n chain: string;\n}): PoolLedgerAssetRoute {\n if (\n params.asset === Asset.BTC &&\n (params.chain === Chain.BTC || params.chain === Chain.ICP)\n ) {\n return {\n ledgerCanisterId: CK_CANISTER_IDS.BTC.ledger,\n asset: Asset.BTC,\n chain: params.chain,\n };\n }\n\n if (\n params.asset === Asset.USDT &&\n (params.chain === Chain.ETH || params.chain === Chain.ICP)\n ) {\n return {\n ledgerCanisterId: CK_CANISTER_IDS.USDT.ledger,\n asset: Asset.USDT,\n chain: params.chain,\n };\n }\n\n if (\n params.asset === Asset.USDC &&\n (params.chain === Chain.ETH || params.chain === Chain.ICP)\n ) {\n return {\n ledgerCanisterId: CK_CANISTER_IDS.USDC.ledger,\n asset: Asset.USDC,\n chain: params.chain,\n };\n }\n\n if (params.asset === Asset.ICP && params.chain === Chain.ICP) {\n return {\n ledgerCanisterId: CK_CANISTER_IDS.ICP.ledger,\n asset: Asset.ICP,\n chain: Chain.ICP,\n };\n }\n\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n `IC ledger transfers are not supported for ${params.asset} on ${params.chain}`\n );\n}\n\nexport function isPoolLedgerAsset(params: {\n asset: string;\n chain: string;\n}): boolean {\n try {\n getPoolLedgerAssetRoute(params);\n return true;\n } catch (error) {\n if (error instanceof LiquidiumError) {\n return false;\n }\n\n throw error;\n }\n}\n","import { LiquidiumError, LiquidiumErrorCode } from \"./errors\";\n\nexport interface SameAssetBorrowingPolicy {\n sameAssetBorrowing: boolean;\n sameAssetBorrowingDustThreshold: bigint;\n}\n\ninterface ValidateSameAssetBorrowingParams {\n borrowAsset: string;\n collateralAsset: string;\n collateralAmount: bigint;\n poolId: string;\n policy: SameAssetBorrowingPolicy;\n}\n\nexport interface SameAssetBorrowingValidationError {\n message: string;\n}\n\nexport function guardSameAssetBorrowing(\n params: ValidateSameAssetBorrowingParams\n): void {\n const validationError = getSameAssetBorrowingValidationError(params);\n if (!validationError) {\n return;\n }\n\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n validationError.message\n );\n}\n\nexport function getSameAssetBorrowingValidationError({\n borrowAsset,\n collateralAsset,\n collateralAmount,\n poolId,\n policy,\n}: ValidateSameAssetBorrowingParams):\n | SameAssetBorrowingValidationError\n | undefined {\n if (borrowAsset !== collateralAsset) {\n return undefined;\n }\n\n if (policy.sameAssetBorrowing) {\n return undefined;\n }\n\n if (collateralAmount <= 0n) {\n return undefined;\n }\n\n if (collateralAmount < policy.sameAssetBorrowingDustThreshold) {\n return undefined;\n }\n\n return {\n message: `Same asset borrowing not allowed for pool ${poolId}`,\n };\n}\n","/** Lifecycle operation represented by a Liquidium status. */\nexport type LiquidiumOperation =\n | \"deposit\"\n | \"borrow\"\n | \"repayment\"\n | \"withdrawal\"\n | \"liquidation\";\n\n/** Lifecycle state represented by a Liquidium status. */\nexport type LiquidiumState =\n | \"action_required\"\n | \"confirming\"\n | \"processing\"\n | \"active\"\n | \"completed\"\n | \"failed\"\n | \"expired\";\n\n/** Shared lifecycle status returned by SDK methods that expose flow state. */\nexport interface LiquidiumStatus {\n /** Operation currently represented by the status. */\n operation: LiquidiumOperation;\n /** Current lifecycle state for the operation. */\n state: LiquidiumState;\n /** Observed chain confirmations, or null when unavailable or not applicable. */\n confirmations: number | null;\n /** Required confirmations, or null when unavailable or not applicable. */\n requiredConfirmations: number | null;\n}\n\ninterface CreateLiquidiumStatusParams {\n operation: LiquidiumOperation;\n state: LiquidiumState;\n confirmations?: number | null;\n requiredConfirmations?: number | null;\n}\n\nexport function createLiquidiumStatus(\n params: CreateLiquidiumStatusParams\n): LiquidiumStatus {\n return {\n operation: params.operation,\n state: params.state,\n confirmations: params.confirmations ?? null,\n requiredConfirmations: params.requiredConfirmations ?? null,\n };\n}\n","import { Asset } from \"./types\";\n\nconst MINIMUM_BTC_WITHDRAW_AMOUNT_SATS = 5_000n;\nconst MINIMUM_STABLECOIN_WITHDRAW_AMOUNT_BASE_UNITS = 1_000_000n;\n\n/** Minimum withdraw amounts in each asset's base units. */\nexport const MIN_WITHDRAW_AMOUNTS_BY_ASSET = {\n [Asset.BTC]: MINIMUM_BTC_WITHDRAW_AMOUNT_SATS,\n [Asset.USDC]: MINIMUM_STABLECOIN_WITHDRAW_AMOUNT_BASE_UNITS,\n [Asset.USDT]: MINIMUM_STABLECOIN_WITHDRAW_AMOUNT_BASE_UNITS,\n} as const;\n\nexport type MinimumWithdrawAsset = keyof typeof MIN_WITHDRAW_AMOUNTS_BY_ASSET;\n\nexport interface WithdrawAmountMinimumValidationParams {\n amount: bigint;\n asset: string;\n}\n\nexport interface WithdrawAmountMinimumValidationError {\n asset: string;\n minimumAmount: bigint;\n message: string;\n}\n\n/**\n * Returns the minimum withdraw amount for an asset in base units.\n *\n * Assets without a configured product minimum return `0n`.\n */\nexport function getMinimumWithdrawAmount(asset: string): bigint {\n if (!isMinimumWithdrawAsset(asset)) {\n return 0n;\n }\n\n return MIN_WITHDRAW_AMOUNTS_BY_ASSET[asset];\n}\n\nexport function getWithdrawAmountMinimumValidationError(\n params: WithdrawAmountMinimumValidationParams\n): WithdrawAmountMinimumValidationError | null {\n const minimumAmount = getMinimumWithdrawAmount(params.asset);\n if (minimumAmount <= 0n || params.amount >= minimumAmount) {\n return null;\n }\n\n return {\n asset: params.asset,\n minimumAmount,\n message: formatMinimumWithdrawAmountMessage(params.asset, minimumAmount),\n };\n}\n\nexport function formatMinimumWithdrawAmountMessage(\n asset: string,\n minimumAmount: bigint\n): string {\n return `Withdraw amount must be at least ${minimumAmount} base units for ${asset}`;\n}\n\nfunction isMinimumWithdrawAsset(asset: string): asset is MinimumWithdrawAsset {\n return Object.hasOwn(MIN_WITHDRAW_AMOUNTS_BY_ASSET, asset);\n}\n","import { AccountIdentifier, SubAccount } from \"@icp-sdk/canisters/ledger/icp\";\nimport {\n decodeIcrcAccount as decodeIcrcAccountText,\n encodeIcrcAccount,\n} from \"@icp-sdk/canisters/ledger/icrc\";\nimport { Principal } from \"@icp-sdk/core/principal\";\n\n/** Account type hint for Liquidium account inputs and normalized account responses. */\nexport const LiquidiumAccountType = {\n ChainAddress: \"ChainAddress\",\n IcPrincipal: \"IcPrincipal\",\n IcpAccountIdentifier: \"IcpAccountIdentifier\",\n IcrcAccount: \"IcrcAccount\",\n} as const;\n/** Account type hint for Liquidium account inputs and normalized account responses. */\nexport type LiquidiumAccountType =\n (typeof LiquidiumAccountType)[keyof typeof LiquidiumAccountType];\n\n/** Chain-native destination account, such as a BTC or EVM address. */\nexport interface ChainAddressAccount {\n /** Account type. */\n type: \"ChainAddress\";\n /** Chain-native address. */\n address: string;\n}\n\n/** IC principal account. */\nexport interface IcPrincipalAccount {\n /** Account type. */\n type: \"IcPrincipal\";\n /** Principal text. */\n address: string;\n}\n\n/** Legacy ICP ledger account identifier. */\nexport interface IcpAccountIdentifierAccount {\n /** Account type. */\n type: \"IcpAccountIdentifier\";\n /** ICP ledger account identifier text. */\n address: string;\n}\n\n/** ICRC account display shape shared by lending and Simple Loans responses. */\nexport interface IcrcAccount {\n /** Account type. */\n type: \"IcrcAccount\";\n /** ICRC account owner principal text. */\n owner: string;\n /** Optional ICRC subaccount bytes. */\n subaccount?: Uint8Array;\n /** Text-encoded ICRC account for display. */\n address: string;\n}\n\n/** Normalized Liquidium account returned by SDK flows. */\nexport type LiquidiumAccount =\n | ChainAddressAccount\n | IcPrincipalAccount\n | IcpAccountIdentifierAccount\n | IcrcAccount;\n\n/** Address input with an optional account type hint. */\nexport interface LiquidiumAccountReference {\n /** Address, principal, ICRC account, or ICP account identifier. */\n address: string;\n /** Account type hint. Use string shorthand when the SDK should auto-detect. */\n type: LiquidiumAccountType;\n}\n\n/** Account input accepted by SDK flows that can auto-detect string addresses. */\nexport type LiquidiumAccountInput = string | LiquidiumAccountReference;\n\nexport interface CanisterNativeAccount {\n Native: Principal;\n}\n\nexport interface CanisterExternalAccount {\n External: string;\n}\n\nexport interface CanisterAccountIdentifierAccount {\n AccountIdentifier: string;\n}\n\nexport interface CanisterIcrcAccount {\n Icrc: {\n owner: Principal;\n subaccount: [] | [Uint8Array | number[]];\n };\n}\n\nexport type CanisterLiquidiumAccount =\n | CanisterNativeAccount\n | CanisterExternalAccount\n | CanisterAccountIdentifierAccount\n | CanisterIcrcAccount;\n\nexport interface DecodedIcrcAccount {\n owner: Principal;\n subaccount?: Uint8Array;\n account: IcrcAccount;\n}\n\nexport function createIcrcAccount(params: {\n owner: Principal;\n subaccount?: Uint8Array;\n}): IcrcAccount {\n return {\n type: \"IcrcAccount\",\n owner: params.owner.toText(),\n subaccount: params.subaccount,\n address: encodeIcrcAccount({\n owner: params.owner,\n subaccount: params.subaccount,\n }),\n };\n}\n\nexport function mapCanisterAccountToLiquidiumAccount(\n account: CanisterLiquidiumAccount\n): LiquidiumAccount {\n if (\"Native\" in account) {\n return { type: \"IcPrincipal\", address: account.Native.toText() };\n }\n\n if (\"AccountIdentifier\" in account) {\n return {\n type: \"IcpAccountIdentifier\",\n address: account.AccountIdentifier,\n };\n }\n\n if (\"Icrc\" in account) {\n const subaccount = normalizeOptionalSubaccount(account.Icrc.subaccount[0]);\n\n return {\n type: \"IcrcAccount\",\n owner: account.Icrc.owner.toText(),\n subaccount,\n address: encodeIcrcAccount({\n owner: account.Icrc.owner,\n subaccount,\n }),\n };\n }\n\n return { type: \"ChainAddress\", address: account.External };\n}\n\nexport function decodeIcrcAccountAddress(address: string): DecodedIcrcAccount {\n const decoded = decodeIcrcAccountText(address);\n const owner = Principal.fromText(decoded.owner.toText());\n const subaccount = decoded.subaccount\n ? Uint8Array.from(decoded.subaccount)\n : undefined;\n\n return {\n owner,\n subaccount,\n account: createIcrcAccount({ owner, subaccount }),\n };\n}\n\nexport function encodeIcpAccountIdentifier(params: {\n owner: Principal;\n subaccount?: Uint8Array;\n}): string {\n return AccountIdentifier.fromPrincipal({\n principal: params.owner,\n subAccount: params.subaccount\n ? SubAccount.fromBytes(params.subaccount)\n : undefined,\n }).toHex();\n}\n\nexport function normalizeIcpAccountIdentifier(address: string): string {\n return AccountIdentifier.fromHex(address).toHex();\n}\n\nfunction normalizeOptionalSubaccount(\n subaccount: Uint8Array | number[] | undefined\n): Uint8Array | undefined {\n if (!subaccount) {\n return undefined;\n }\n\n return subaccount instanceof Uint8Array\n ? subaccount\n : Uint8Array.from(subaccount);\n}\n","import type {\n LiquidiumAccount,\n LiquidiumAccountInput,\n} from \"../../core/accounts\";\nimport type { LiquidiumOperation, LiquidiumStatus } from \"../../core/status\";\nimport type {\n Asset,\n AssetIdentifier,\n Chain,\n OutflowType,\n SigningChain,\n SupplyAction,\n} from \"../../core/types\";\nimport type {\n SignMessageWalletAction,\n WalletActionKind,\n WalletAdapter,\n WalletExecutionKind,\n} from \"../../core/wallet-actions\";\n\n/** Wallet execution dependencies for borrow and withdraw convenience methods. */\nexport interface WalletExecutionParams {\n /** Chain used by the signing wallet. */\n signerChain: SigningChain;\n /** Wallet adapter used to execute the prepared action. */\n signerWalletAdapter: WalletAdapter;\n}\n\n/** EVM transaction payload returned by lending transaction builders. */\nexport interface EvmContractTransaction {\n /** Contract address to call. */\n to: string;\n /** Hex-encoded calldata. */\n data: string;\n}\n\n/** Parameters for an ERC-20 transfer transaction. */\nexport interface CreateTransferErc20TransactionParams {\n /** ERC-20 token contract address. */\n tokenAddress: string;\n /** Destination EVM address. */\n recipientAddress: string;\n /** Transfer amount in token base units. */\n amount: bigint;\n}\n\n/**\n * Receipt for a borrow or withdrawal outflow submitted to the lending canister.\n *\n * `id` is the outflow reference to show users immediately. `txid` may be unset until\n * the protocol assigns a chain transaction id. `outflowRef` is an optional protocol reference.\n */\nexport interface OutflowDetails {\n /** Protocol outflow id. */\n id: string;\n /** Borrow, withdrawal, or fee-claim discriminator. */\n outflowType: OutflowType;\n /** Optional protocol outflow reference. */\n outflowRef?: string;\n /** Chain transaction id when already assigned by the protocol. */\n txid?: string;\n /** Outflow amount in the pool asset's base units. */\n amount: bigint;\n /** Outflow destination account. */\n receiver: LiquidiumAccount;\n}\n\n/** Borrow receipt. */\nexport type BorrowOutflowDetails = OutflowDetails & {\n outflowType: \"borrow\";\n /** Shared lifecycle status for the borrow outflow receipt. */\n status: LiquidiumStatus;\n};\n\n/** Withdraw receipt. */\nexport type WithdrawOutflowDetails = OutflowDetails & {\n outflowType: \"withdrawal\";\n /** Shared lifecycle status for the withdraw outflow receipt. */\n status: LiquidiumStatus;\n};\n\n/**\n * Fields to build a borrow request. `amount` is in the borrow pool asset's base units\n * (e.g. satoshis, token smallest units).\n */\nexport interface CreateBorrowRequest {\n /** Liquidium profile principal text. */\n profileId: string;\n /** Borrow pool principal text. */\n poolId: string;\n /** Amount to borrow in the borrow asset's base units. */\n amount: bigint;\n /** Chain where borrowed funds should arrive. */\n chain: Chain;\n /** Destination that receives the borrowed asset. */\n receiver: LiquidiumAccountInput;\n /** Wallet address that signs the borrow authorization. */\n signerWalletAddress: string;\n}\n\n/** Prepared borrow request data embedded in the signable action. */\nexport interface CreateBorrowData extends CreateBorrowRequest {\n /** Unix expiry timestamp in seconds, included in the signed message. */\n expiryTimestamp: bigint;\n}\n\n/** Prepared action for creating a borrow outflow. */\nexport interface BorrowAction\n extends SignMessageWalletAction<CreateBorrowData, BorrowOutflowDetails> {\n /** Protocol action kind. */\n kind: typeof WalletActionKind.createBorrow;\n /** Required wallet capability. */\n executionKind: typeof WalletExecutionKind.signMessage;\n /** Adapter-facing action type. */\n actionType: typeof WalletActionKind.createBorrow;\n}\n\n/** Fields to build a withdraw request. `amount` is in the pool asset's base units. */\nexport interface CreateWithdrawRequest {\n /** Liquidium profile principal text. */\n profileId: string;\n /** Pool principal text to withdraw from. */\n poolId: string;\n /**\n * Amount to withdraw in the pool asset's base units. BTC withdrawals require\n * at least 5,000 sats. USDC and USDT withdrawals require at least 1 token.\n */\n amount: bigint;\n /** Chain where withdrawn funds should arrive. */\n chain: Chain;\n /** Destination that receives the withdrawn asset. */\n receiver: LiquidiumAccountInput;\n /** Wallet address that signs the withdraw authorization. */\n signerWalletAddress: string;\n}\n\n/** Prepared withdraw request data embedded in the signable action. */\nexport interface CreateWithdrawData extends CreateWithdrawRequest {\n /** Unix expiry timestamp in seconds, included in the signed message. */\n expiryTimestamp: bigint;\n}\n\n/** Prepared action for creating a withdraw outflow. */\nexport interface WithdrawAction\n extends SignMessageWalletAction<CreateWithdrawData, WithdrawOutflowDetails> {\n /** Protocol action kind. */\n kind: typeof WalletActionKind.createWithdraw;\n /** Required wallet capability. */\n executionKind: typeof WalletExecutionKind.signMessage;\n /** Adapter-facing action type. */\n actionType: typeof WalletActionKind.createWithdraw;\n}\n\n/** Supply execution plan selected by the SDK. */\nexport const SupplyPlanType = {\n contractInteraction: \"contractInteraction\",\n transfer: \"transfer\",\n} as const;\n/** Supply execution plan selected by the SDK. */\nexport type SupplyPlanType =\n (typeof SupplyPlanType)[keyof typeof SupplyPlanType];\n\n/** Supply destination returned by `lending.supply(...)`. */\nexport type SupplyTarget = AssetIdentifier & {\n /** Pool principal text receiving the inflow. */\n poolId: string;\n /** Deposit or repayment action for the inflow. */\n action: SupplyAction;\n /** Address to use for this chain and asset pair. */\n address: string;\n /** Legacy account identifier for ICP ledger transfers. */\n icpAccountIdentifier?: string;\n};\n\ninterface BaseSupplyFlowRequest {\n profileId: string;\n poolId: string;\n action: SupplyAction;\n /** Transfer chain to use. Pass ICP for ck-ledger transfers. */\n chain: Chain;\n}\n\n/** Manual transfer-based `lending.supply` request. */\nexport interface ManualTransferSupplyFlowRequest extends BaseSupplyFlowRequest {\n /** Transfer supply uses the default mechanism and does not accept this field. */\n mechanism?: never;\n /** Manual supply does not broadcast through a wallet adapter. */\n walletAdapter?: never;\n /** Manual supply does not accept a sender account. */\n account?: never;\n /** Manual supply does not accept an execution amount. */\n amount?: never;\n}\n\n/** Wallet-executed transfer-based `lending.supply` request. */\nexport interface WalletTransferSupplyFlowRequest extends BaseSupplyFlowRequest {\n /** Transfer supply uses the default mechanism and does not accept this field. */\n mechanism?: never;\n /** Wallet adapter used to broadcast the transfer. */\n walletAdapter: Pick<\n WalletAdapter,\n \"sendBtcTransaction\" | \"sendEthTransaction\" | \"sendIcrcTransfer\"\n >;\n /** Sender wallet account. */\n account: string;\n /** Transfer amount in the target asset's base units. */\n amount: bigint;\n}\n\n/** Transfer-based supply request, either manual or wallet-executed. */\nexport type TransferSupplyFlowRequest =\n | ManualTransferSupplyFlowRequest\n | WalletTransferSupplyFlowRequest;\n\n/** Input for contract-interaction `lending.supply`, which always executes now. */\nexport interface ContractInteractionSupplyFlowRequest\n extends BaseSupplyFlowRequest {\n /** Contract-interaction mechanism discriminator. */\n mechanism: typeof SupplyPlanType.contractInteraction;\n /** Contract interaction is only supported for ETH stablecoin pools. */\n chain: typeof Chain.ETH;\n /** ETH wallet adapter used to approve and deposit ERC-20 assets. */\n walletAdapter: Pick<WalletAdapter, \"sendEthTransaction\">;\n /** Sender EVM wallet address. */\n account: string;\n /** Deposit or repayment amount in token base units. */\n amount: bigint;\n}\n\n/** Request accepted by `lending.supply(...)`. */\nexport type SupplyFlowRequest =\n | TransferSupplyFlowRequest\n | ContractInteractionSupplyFlowRequest;\n\n/**\n * Supply receipt returned by `lending.supply(...)`.\n *\n * - `txid` is populated when the SDK broadcast the transaction on your behalf\n * (wallet-adapter path). When undefined, the caller is expected to broadcast\n * themselves and call {@link SupplyFlow.submit} for flows that require txid\n * registration.\n * - If post-broadcast inflow registration fails after the SDK broadcasts the\n * transaction, `txid` is still returned so callers can track the transaction.\n * - `submit` registers a broadcast txid with the SDK API when needed. ETH\n * stablecoin deposit-address transfers are indexed from ERC-20 transfer logs,\n * so `submit` acknowledges the txid without posting it to the inflow endpoint.\n *\n * The SDK does not poll inflow status. When you have a `txid`, it is your\n * responsibility to track confirmation state with your own polling.\n */\nexport interface SupplyFlow {\n /** Execution plan used by the supply flow. */\n type: SupplyPlanType;\n /** Destination where funds should be sent or were sent. */\n target: SupplyTarget;\n /** Transaction id when the SDK broadcast the transaction. */\n txid?: string;\n /** Shared lifecycle status for the supply flow. */\n status: LiquidiumStatus;\n /** Registers a broadcast transaction id when the flow requires an indexing hint. */\n submit(request: SubmitSupplyFlowInflowRequest): Promise<SubmitInflowResponse>;\n}\n\n/** Canonical inflow operation accepted by direct inflow submission. */\nexport type InflowOperation = Extract<\n LiquidiumOperation,\n \"deposit\" | \"repayment\"\n>;\n\n/** Body for `SupplyFlow.submit`. The supply flow supplies the inflow operation. */\nexport interface SubmitSupplyFlowInflowRequest {\n /** Broadcast transaction id or hash. */\n txid: string;\n /** Chain where the transaction was broadcast, when not implied by the flow. */\n chain?: Extract<Chain, \"BTC\" | \"ETH\">;\n}\n\n/** Body for direct `lending.submitInflow`. */\nexport interface SubmitInflowRequest extends SubmitSupplyFlowInflowRequest {\n /** Deposit or repayment operation represented by the transaction. */\n operation: InflowOperation;\n}\n\n/** Acknowledgement from the SDK API after submitting an inflow hint. */\nexport interface SubmitInflowResponse {\n /** Transaction id accepted by the SDK API. */\n txid: string;\n}\n\n/** Chain and asset pair for estimating an inflow target fee. */\nexport type EstimateInflowFeeRequest = AssetIdentifier;\n\n/** Request for an ETH stablecoin deposit address. */\nexport interface GetDepositAddressRequest {\n /** Liquidium profile principal text. */\n profileId: string;\n /** Pool principal text receiving the inflow. */\n poolId: string;\n /** ETH stablecoin asset. */\n asset: typeof Asset.USDC | typeof Asset.USDT;\n /** Deposit or repayment action for the inflow. */\n action: SupplyAction;\n}\n\n/** Fee estimate for an inflow target, rounded up to the asset's fee unit. */\nexport interface InflowFeeEstimate {\n /** Estimated total fee rounded up in the asset's base units. */\n totalFee: bigint;\n}\n\n/** Request for ERC-20 approval and deposit planning. */\nexport interface GetEvmSupplyContextRequest {\n /** Liquidium profile principal text. */\n profileId: string;\n /** Pool principal text receiving the inflow. */\n poolId: string;\n /** EVM wallet address that will send funds. */\n walletAddress: string;\n /** Supply amount in token base units. */\n amount: bigint;\n /** Deposit or repayment action for the inflow. */\n action: SupplyAction;\n}\n\n/** Approval strategy required before an ERC-20 deposit contract call. */\nexport const EvmSupplyApprovalStrategy = {\n approveMax: \"approve-max\",\n none: \"none\",\n resetThenApproveMax: \"reset-then-approve-max\",\n} as const;\n/** Approval strategy required before an ERC-20 deposit contract call. */\nexport type EvmSupplyApprovalStrategy =\n (typeof EvmSupplyApprovalStrategy)[keyof typeof EvmSupplyApprovalStrategy];\n\n/** ERC-20 supply planning data returned by `lending.getEvmSupplyContext(...)`. */\nexport interface EvmSupplyContext {\n /** Liquidium profile principal text. */\n profileId: string;\n /** Pool principal text receiving the inflow. */\n poolId: string;\n /** Normalized EVM wallet address. */\n walletAddress: string;\n /** Deposit or repayment action for the inflow. */\n action: SupplyAction;\n /** Supported ETH stablecoin asset. */\n asset: typeof Asset.USDC | typeof Asset.USDT;\n /** ETH chain discriminator. */\n chain: typeof Chain.ETH;\n /** Requested amount serialized in token base units. */\n amount: string;\n /** ERC-20 token contract address. */\n tokenAddress: string;\n /** Contract address that must be approved as spender. */\n spenderAddress: string;\n /** Deposit helper contract address. */\n depositContractAddress: string;\n /** Current token balance serialized in base units. */\n balance: string;\n /** Current allowance serialized in base units. */\n allowance: string;\n /** Whether an approval transaction is needed before deposit. */\n requiresApproval: boolean;\n /** Approval sequence the caller should perform. */\n approvalStrategy: EvmSupplyApprovalStrategy;\n}\n","import { Principal } from \"@icp-sdk/core/principal\";\nimport {\n createIcrcAccount,\n encodeIcpAccountIdentifier,\n} from \"../../../core/accounts\";\nimport { createCkBtcMinterActor } from \"../../../core/canisters/ckbtc/minter\";\nimport {\n createDepositAccountsActor,\n type DepositAccountErrors,\n} from \"../../../core/canisters/deposit-accounts/actor\";\nimport {\n createFlexibleLendingActor,\n type DecodedPool,\n decodeFlexiblePool,\n} from \"../../../core/canisters/lending/flexible-actor\";\nimport { LiquidiumError, LiquidiumErrorCode } from \"../../../core/errors\";\nimport {\n USDC_CONTRACT_ADDRESS,\n USDT_CONTRACT_ADDRESS,\n} from \"../../../core/evm\";\nimport type { CanisterContext } from \"../../../core/transports/canister-context\";\nimport {\n Asset,\n type AssetIdentifier,\n Chain,\n type SupplyAction,\n} from \"../../../core/types\";\nimport { encodeInflowSubaccount } from \"../../../core/utils/inflow-subaccount\";\nimport { SupplyPlanType, type SupplyTarget } from \"../types\";\n\nexport interface ResolveSupplyTargetRequest {\n profileId: string;\n poolId: string;\n action: SupplyAction;\n mechanism: SupplyPlanType | null;\n chain?: Chain;\n}\n\ntype SupplyTargetRequest = AssetIdentifier & {\n poolId: string;\n action: SupplyAction;\n};\n\ninterface ResolveSupplyMechanismParams {\n identifier: AssetIdentifier;\n mechanism: SupplyPlanType | null;\n}\n\nexport async function resolveSupplyTargetForPool(\n canisterContext: CanisterContext,\n request: ResolveSupplyTargetRequest,\n selectedPool: DecodedPool\n): Promise<SupplyTarget> {\n const identifier = resolveSupplyAssetIdentifier({\n asset: selectedPool.asset,\n poolChain: selectedPool.chain,\n transferChain: request.chain ?? selectedPool.chain,\n });\n const mechanism = resolveSupplyMechanism({\n identifier,\n mechanism: request.mechanism,\n });\n const targetRequest: SupplyTargetRequest = {\n ...identifier,\n poolId: request.poolId,\n action: request.action,\n };\n\n if (mechanism === SupplyPlanType.contractInteraction) {\n return getIcrcAccountSupplyTarget(request.profileId, targetRequest);\n }\n\n if (identifier.chain === Chain.ICP) {\n return identifier.asset === Asset.ICP\n ? getIcpLedgerSupplyTarget(request.profileId, targetRequest)\n : getIcrcAccountSupplyTarget(request.profileId, targetRequest);\n }\n\n return await getChainAddressSupplyTarget(\n canisterContext,\n request.profileId,\n targetRequest\n );\n}\n\nfunction resolveSupplyMechanism(\n params: ResolveSupplyMechanismParams\n): SupplyPlanType {\n if (params.mechanism !== SupplyPlanType.contractInteraction) {\n return SupplyPlanType.transfer;\n }\n\n if (\n params.identifier.chain === Chain.ETH &&\n (params.identifier.asset === Asset.USDC ||\n params.identifier.asset === Asset.USDT)\n ) {\n return SupplyPlanType.contractInteraction;\n }\n\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n `Contract-interaction supply is not supported for ${params.identifier.asset} on ${params.identifier.chain}`\n );\n}\n\nexport function isEthStablecoin(asset: string, chain: string): boolean {\n return chain === Chain.ETH && (asset === Asset.USDC || asset === Asset.USDT);\n}\n\nexport function getEthStablecoinContractAddress(asset: string): string {\n if (asset === Asset.USDC) {\n return USDC_CONTRACT_ADDRESS;\n }\n\n if (asset === Asset.USDT) {\n return USDT_CONTRACT_ADDRESS;\n }\n\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n `ETH stablecoin contract address is not configured for ${asset}`\n );\n}\n\nexport function mapDepositAccountErrorToLiquidiumError(\n error: DepositAccountErrors\n): LiquidiumError {\n if (\"InvalidEvmAddress\" in error) {\n return new LiquidiumError(\n LiquidiumErrorCode.INVALID_ADDRESS,\n \"Invalid EVM deposit address\"\n );\n }\n\n if (\"Busy\" in error) {\n return new LiquidiumError(\n LiquidiumErrorCode.SERVICE_UNAVAILABLE,\n \"Deposit address service is busy\"\n );\n }\n\n if (\"Cooldown\" in error) {\n return new LiquidiumError(\n LiquidiumErrorCode.SERVICE_UNAVAILABLE,\n `Deposit address service is cooling down for ${error.Cooldown.retry_after_secs.toString()} seconds`\n );\n }\n\n if (\"Other\" in error) {\n return new LiquidiumError(\n LiquidiumErrorCode.DEPOSIT_ADDRESS_ERROR,\n error.Other\n );\n }\n\n if (\"AddressDerivationFailed\" in error) {\n return new LiquidiumError(\n LiquidiumErrorCode.DEPOSIT_ADDRESS_ERROR,\n \"Deposit address derivation failed\"\n );\n }\n\n if (\"NotFound\" in error) {\n return new LiquidiumError(\n LiquidiumErrorCode.DEPOSIT_ADDRESS_ERROR,\n \"Deposit address not found\"\n );\n }\n\n return new LiquidiumError(\n LiquidiumErrorCode.DEPOSIT_ADDRESS_ERROR,\n \"Deposit address canister returned an unknown error\"\n );\n}\n\nexport async function getPoolById(\n canisterContext: CanisterContext,\n poolId: string\n): Promise<DecodedPool> {\n const pools = await createFlexibleLendingActor(canisterContext).list_pools();\n const selectedPool = pools.find((pool) => pool.principal.toText() === poolId);\n const decodedPool = selectedPool ? decodeFlexiblePool(selectedPool) : null;\n\n if (!decodedPool) {\n throw new LiquidiumError(\n LiquidiumErrorCode.POOL_NOT_FOUND,\n `Pool not found: ${poolId}`\n );\n }\n\n return decodedPool;\n}\n\ninterface ResolveSupplyAssetIdentifierParams {\n asset: string;\n poolChain: string;\n transferChain: string;\n}\n\nfunction resolveSupplyAssetIdentifier(\n params: ResolveSupplyAssetIdentifierParams\n): AssetIdentifier {\n if (params.asset === Asset.BTC && params.poolChain === Chain.BTC) {\n if (params.transferChain === Chain.BTC) {\n return { asset: Asset.BTC, chain: Chain.BTC };\n }\n\n if (params.transferChain === Chain.ICP) {\n return { asset: Asset.BTC, chain: Chain.ICP };\n }\n }\n\n if (\n (params.asset === Asset.USDC || params.asset === Asset.USDT) &&\n params.poolChain === Chain.ETH\n ) {\n if (params.transferChain === Chain.ETH) {\n return { asset: params.asset, chain: Chain.ETH };\n }\n\n if (params.transferChain === Chain.ICP) {\n return { asset: params.asset, chain: Chain.ICP };\n }\n }\n\n if (\n params.asset === Asset.ICP &&\n params.poolChain === Chain.ICP &&\n params.transferChain === Chain.ICP\n ) {\n return { asset: Asset.ICP, chain: Chain.ICP };\n }\n\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n `Supply is not supported for ${params.asset} pool on ${params.poolChain} using ${params.transferChain}`\n );\n}\n\nasync function getChainAddressSupplyTarget(\n canisterContext: CanisterContext,\n profileId: string,\n request: SupplyTargetRequest\n): Promise<SupplyTarget> {\n if (request.chain === Chain.ETH) {\n const tokenAddress = getEthStablecoinContractAddress(request.asset);\n const subaccount = encodeInflowSubaccount({\n action: request.action,\n principal: Principal.fromText(profileId),\n });\n const result = await createDepositAccountsActor(\n canisterContext\n ).get_deposit_address(\n {\n owner: Principal.fromText(request.poolId),\n subaccount: [subaccount],\n },\n [tokenAddress]\n );\n\n if (\"Err\" in result) {\n throw mapDepositAccountErrorToLiquidiumError(result.Err);\n }\n\n return {\n poolId: request.poolId,\n asset: request.asset,\n chain: request.chain,\n action: request.action,\n address: result.Ok,\n };\n }\n\n const configuredBtcPoolId = canisterContext.canisterIds.pools.btc;\n if (request.poolId !== configuredBtcPoolId) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n `Chain-address BTC inflow targets require the configured BTC pool ${configuredBtcPoolId}, received ${request.poolId}`\n );\n }\n\n const subaccount = encodeInflowSubaccount({\n action: request.action,\n principal: Principal.fromText(profileId),\n });\n const address = await createCkBtcMinterActor(canisterContext).get_btc_address(\n {\n owner: [Principal.fromText(configuredBtcPoolId)],\n subaccount: [subaccount],\n }\n );\n\n return { ...request, address };\n}\n\nfunction getIcrcAccountSupplyTarget(\n profileId: string,\n request: SupplyTargetRequest\n): SupplyTarget {\n const account = createInflowIcrcAccount(profileId, request);\n\n return { ...request, address: account.address };\n}\n\nfunction getIcpLedgerSupplyTarget(\n profileId: string,\n request: SupplyTargetRequest\n): SupplyTarget {\n const poolPrincipal = Principal.fromText(request.poolId);\n const subaccount = encodeInflowSubaccount({\n action: request.action,\n principal: Principal.fromText(profileId),\n });\n const account = createIcrcAccount({\n owner: poolPrincipal,\n subaccount,\n });\n\n return {\n poolId: request.poolId,\n asset: Asset.ICP,\n chain: Chain.ICP,\n action: request.action,\n address: account.address,\n icpAccountIdentifier: encodeIcpAccountIdentifier({\n owner: poolPrincipal,\n subaccount,\n }),\n };\n}\n\nfunction createInflowIcrcAccount(\n profileId: string,\n request: SupplyTargetRequest\n) {\n return createIcrcAccount({\n owner: Principal.fromText(request.poolId),\n subaccount: encodeInflowSubaccount({\n action: request.action,\n principal: Principal.fromText(profileId),\n }),\n });\n}\n","import { Asset, Chain } from \"../../../core/types\";\nimport { ceilDivBigint } from \"../../../core/utils/bigint\";\nimport type { EstimateInflowFeeRequest } from \"../types\";\nimport { isEthStablecoin } from \"./supply-targets\";\n\nconst ETH_STABLECOIN_INFLOW_FEE_ROUND_UP_TO_NEAREST_10_CENTS = 100_000n;\nconst BTC_INFLOW_FEE_ROUND_UP_TO_NEAREST_SATS = 500n;\n\n/**\n * Rounds an inflow fee estimate up to the configured unit for its asset.\n *\n * ETH stablecoin fees use 6 decimals, so 100_000 base units is $0.10.\n * BTC fees use sats, so the fee is rounded up to the nearest 500 sats.\n */\nexport function roundInflowFeeEstimate(\n request: EstimateInflowFeeRequest,\n totalFee: bigint\n): bigint {\n if (totalFee <= 0n) {\n return 0n;\n }\n\n if (isEthStablecoin(request.asset, request.chain)) {\n return roundUpToNearest(\n totalFee,\n ETH_STABLECOIN_INFLOW_FEE_ROUND_UP_TO_NEAREST_10_CENTS\n );\n }\n\n if (request.asset === Asset.BTC && request.chain === Chain.BTC) {\n return roundUpToNearest(totalFee, BTC_INFLOW_FEE_ROUND_UP_TO_NEAREST_SATS);\n }\n\n return totalFee;\n}\n\n/** Rounds a positive bigint up to the nearest multiple of the rounding unit. */\nfunction roundUpToNearest(amount: bigint, roundingUnit: bigint): bigint {\n return ceilDivBigint(amount, roundingUnit) * roundingUnit;\n}\n","import {\n Network as BitcoinAddressNetwork,\n validate as validateBitcoinAddress,\n} from \"bitcoin-address-validation\";\nimport { getAddress, isAddress } from \"viem\";\nimport { LiquidiumError, LiquidiumErrorCode } from \"./errors\";\nimport { Asset, Chain } from \"./types\";\n\nexport type EvmAddress = `0x${string}`;\n\ninterface NormalizeExternalAddressParams {\n address: string;\n asset: string;\n chain: string;\n}\n\nconst BTC_MAINNET_ADDRESS_ERROR = \"Address must be a valid mainnet BTC address\";\nconst EVM_ADDRESS_ERROR = \"Address must be a valid EVM address\";\nconst ADDRESS_CHAIN_MISMATCH_ERROR = \"Address chain must match asset\";\n\nexport function normalizeExternalAddress(\n params: NormalizeExternalAddressParams\n): string {\n if (params.asset === Asset.BTC) {\n if (params.chain !== Chain.BTC) {\n throw new LiquidiumError(\n LiquidiumErrorCode.INVALID_ADDRESS,\n ADDRESS_CHAIN_MISMATCH_ERROR\n );\n }\n\n if (\n !validateBitcoinAddress(params.address, BitcoinAddressNetwork.mainnet)\n ) {\n throw new LiquidiumError(\n LiquidiumErrorCode.INVALID_ADDRESS,\n BTC_MAINNET_ADDRESS_ERROR\n );\n }\n\n return params.address;\n }\n\n if (isEthStablecoin(params.asset)) {\n if (params.chain !== Chain.ETH) {\n throw new LiquidiumError(\n LiquidiumErrorCode.INVALID_ADDRESS,\n ADDRESS_CHAIN_MISMATCH_ERROR\n );\n }\n\n if (!isAddress(params.address)) {\n throw new LiquidiumError(\n LiquidiumErrorCode.INVALID_ADDRESS,\n EVM_ADDRESS_ERROR\n );\n }\n\n return getAddress(params.address);\n }\n\n return params.address;\n}\n\nexport function normalizeAndValidateEvmAddress(\n address: string,\n errorMessage: string\n): EvmAddress {\n if (!isAddress(address)) {\n throw new LiquidiumError(LiquidiumErrorCode.INVALID_ADDRESS, errorMessage);\n }\n\n return getAddress(address) as EvmAddress;\n}\n\nfunction isEthStablecoin(asset: string): boolean {\n return asset === Asset.USDC || asset === Asset.USDT;\n}\n","import { LiquidiumError, LiquidiumErrorCode } from \"../errors\";\n\nconst MIN_ATTEMPTS = 1;\nconst MIN_INITIAL_RETRY_DELAY_MS = 0;\nconst MIN_BACKOFF_MULTIPLIER = 1;\n\nexport type RetryWithBackoffOptions<T> = {\n execute: () => Promise<T>;\n maxAttempts: number;\n initialRetryDelayMs: number;\n backoffMultiplier: number;\n shouldRetryError: (error: unknown) => boolean;\n waitForDelayMs?: (delayMs: number) => Promise<void>;\n};\n\nexport async function retryWithBackoff<T>(\n options: RetryWithBackoffOptions<T>\n): Promise<T> {\n assertValidRetryOptions(options);\n\n const waitForDelayMs = options.waitForDelayMs ?? defaultWaitForDelayMs;\n let retryDelayMs = options.initialRetryDelayMs;\n\n for (let attempt = 1; attempt <= options.maxAttempts; attempt += 1) {\n try {\n return await options.execute();\n } catch (error) {\n const isLastAttempt = attempt === options.maxAttempts;\n if (isLastAttempt || !options.shouldRetryError(error)) {\n throw error;\n }\n\n await waitForDelayMs(retryDelayMs);\n retryDelayMs *= options.backoffMultiplier;\n }\n }\n\n throw new LiquidiumError(\n LiquidiumErrorCode.INTERNAL,\n \"Retry exhausted unexpectedly\"\n );\n}\n\nasync function defaultWaitForDelayMs(delayMs: number): Promise<void> {\n await new Promise<void>((resolve) => {\n setTimeout(resolve, delayMs);\n });\n}\n\nfunction assertValidRetryOptions<T>(options: RetryWithBackoffOptions<T>): void {\n if (options.maxAttempts < MIN_ATTEMPTS) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n `Retry maxAttempts must be at least ${MIN_ATTEMPTS}, received ${options.maxAttempts}`\n );\n }\n\n if (options.initialRetryDelayMs < MIN_INITIAL_RETRY_DELAY_MS) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n \"Retry initialRetryDelayMs must be a non-negative number\"\n );\n }\n\n if (options.backoffMultiplier < MIN_BACKOFF_MULTIPLIER) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n `Retry backoffMultiplier must be at least ${MIN_BACKOFF_MULTIPLIER}, received ${options.backoffMultiplier}`\n );\n }\n}\n","import { decodeIcrcAccountAddress } from \"../../../core/accounts\";\nimport {\n type EvmAddress,\n normalizeAndValidateEvmAddress,\n} from \"../../../core/address-validation\";\nimport { LiquidiumError, LiquidiumErrorCode } from \"../../../core/errors\";\nimport {\n CK_ETH_DEPOSIT_CONTRACT_ADDRESS,\n ERC20_ABI,\n MAX_UINT256,\n} from \"../../../core/evm\";\nimport { getPoolLedgerAssetRoute } from \"../../../core/pool-ledger-assets\";\nimport { createLiquidiumStatus } from \"../../../core/status\";\nimport type { CanisterContext } from \"../../../core/transports/canister-context\";\nimport {\n type Asset,\n Chain,\n type EvmReadClient,\n SupplyAction,\n} from \"../../../core/types\";\nimport { retryWithBackoff } from \"../../../core/utils/retry\";\nimport type {\n EthTransactionRequest,\n IcrcTransferDetails,\n WalletAdapter,\n} from \"../../../core/wallet-actions\";\nimport {\n createApproveTransaction,\n createDepositErc20Transaction,\n createTransferErc20Transaction,\n} from \"../evm-transactions\";\nimport type {\n ContractInteractionSupplyFlowRequest,\n EvmSupplyApprovalStrategy,\n EvmSupplyContext,\n GetEvmSupplyContextRequest,\n InflowOperation,\n SubmitInflowRequest,\n SubmitInflowResponse,\n SubmitSupplyFlowInflowRequest,\n SupplyFlow,\n SupplyFlowRequest,\n SupplyPlanType,\n SupplyTarget,\n WalletTransferSupplyFlowRequest,\n} from \"../types\";\nimport {\n EvmSupplyApprovalStrategy as ApprovalStrategy,\n SupplyPlanType as PlanType,\n} from \"../types\";\nimport {\n getEthStablecoinContractAddress,\n getPoolById,\n isEthStablecoin,\n resolveSupplyTargetForPool,\n} from \"./supply-targets\";\n\nconst SUBMIT_INFLOW_MAX_ATTEMPTS = 4;\nconst SUBMIT_INFLOW_INITIAL_RETRY_DELAY_MS = 1_500;\nconst SUBMIT_INFLOW_RETRY_BACKOFF_MULTIPLIER = 2;\nconst ETH_APPROVAL_POLL_INTERVAL_MS = 2_000;\nconst ETH_APPROVAL_MAX_POLLS = 30;\ntype SubmitInflowDefaults = Omit<SubmitInflowRequest, \"txid\">;\ntype AllowanceExpectation = \"zero\" | \"sufficient\";\n\ninterface SupplyFlowExecutorParams {\n canisterContext: CanisterContext;\n evmReadClient: EvmReadClient | undefined;\n requireApi(): void;\n submitInflow(request: SubmitInflowRequest): Promise<SubmitInflowResponse>;\n}\n\ninterface GetEvmSupplyContextForPoolParams {\n request: GetEvmSupplyContextRequest;\n asset: string;\n chain: string;\n}\n\ninterface SendAndSubmitTransferSupplyInflowParams {\n request: WalletTransferSupplyFlowRequest;\n target: SupplyTarget;\n defaultSubmitInflowRequest: SubmitInflowDefaults | null;\n}\n\ninterface SubmitSupplyFlowInflowParams {\n target: SupplyTarget;\n mechanism: SupplyPlanType;\n defaultSubmitInflowRequest: SubmitInflowDefaults | null;\n submitRequest: SubmitSupplyFlowInflowRequest;\n}\n\ninterface ExecuteContractSupplyParams {\n request: ContractInteractionSupplyFlowRequest;\n target: SupplyTarget;\n defaultSubmitInflowRequest: SubmitInflowDefaults | null;\n}\n\ninterface SendChainAddressSupplyTransactionParams {\n walletAdapter: Pick<\n WalletAdapter,\n \"sendBtcTransaction\" | \"sendEthTransaction\"\n >;\n chain: string;\n asset: string;\n toAddress: string;\n amount: bigint;\n senderAccount: string;\n action: SupplyAction;\n}\n\ninterface SendIcrcSupplyTransactionParams {\n walletAdapter: Pick<WalletAdapter, \"sendIcrcTransfer\">;\n asset: Asset;\n chain: typeof Chain.ICP;\n transfer: IcrcTransferDetails;\n senderAccount: string;\n action: SupplyAction;\n}\n\ninterface WaitForExpectedAllowanceParams {\n walletAddress: string;\n tokenAddress: string;\n spenderAddress: string;\n amount: bigint;\n expectation: AllowanceExpectation;\n}\n\ninterface ReadErc20AllowanceParams {\n evmReadClient: EvmReadClient;\n tokenAddress: string;\n ownerAddress: string;\n spenderAddress: string;\n}\n\ninterface ReadErc20BalanceParams {\n evmReadClient: EvmReadClient;\n tokenAddress: string;\n ownerAddress: string;\n}\n\ninterface ApprovalStrategyParams {\n allowance: bigint;\n amount: bigint;\n}\n\ninterface DefaultSubmitInflowRequestParams {\n action: SupplyAction;\n chain: string;\n}\n\ninterface ShouldSubmitInflowParams {\n target: SupplyTarget;\n mechanism: SupplyPlanType;\n}\n\nexport class SupplyFlowExecutor {\n constructor(private readonly params: SupplyFlowExecutorParams) {}\n\n async create(request: SupplyFlowRequest): Promise<SupplyFlow> {\n const requestedMechanism = request.mechanism ?? null;\n if (\n requestedMechanism === null &&\n request.walletAdapter === undefined &&\n (request.account !== undefined || request.amount !== undefined)\n ) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n \"Wallet-executed supply requires walletAdapter, account, and amount\"\n );\n }\n\n const selectedPool = await getPoolById(\n this.params.canisterContext,\n request.poolId\n );\n const target = await resolveSupplyTargetForPool(\n this.params.canisterContext,\n {\n profileId: request.profileId,\n poolId: request.poolId,\n action: request.action,\n mechanism: requestedMechanism,\n chain: request.chain,\n },\n selectedPool\n );\n const mechanism =\n requestedMechanism === PlanType.contractInteraction\n ? PlanType.contractInteraction\n : PlanType.transfer;\n const defaultSubmitInflowRequest = getDefaultSubmitInflowRequest({\n action: request.action,\n chain:\n mechanism === PlanType.contractInteraction ? Chain.ETH : target.chain,\n });\n\n let txid: string | undefined;\n switch (mechanism) {\n case PlanType.transfer:\n if (isWalletTransferSupplyRequest(request)) {\n txid = await this.sendAndSubmitTransferSupplyInflow({\n request,\n target,\n defaultSubmitInflowRequest,\n });\n }\n break;\n case PlanType.contractInteraction:\n if (!isContractInteractionSupplyRequest(request)) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n \"Contract-interaction supply requires contract-interaction request fields\"\n );\n }\n\n txid = await this.executeContractSupply({\n request,\n target,\n defaultSubmitInflowRequest,\n });\n break;\n }\n\n return {\n type: mechanism,\n target,\n txid,\n status: createLiquidiumStatus({\n operation: mapSupplyActionToStatusOperation(request.action),\n state: txid ? \"confirming\" : \"action_required\",\n }),\n submit: async (submitRequest) => {\n return await this.submitSupplyFlowInflow({\n target,\n mechanism,\n defaultSubmitInflowRequest,\n submitRequest,\n });\n },\n };\n }\n\n async getEvmSupplyContext(\n request: GetEvmSupplyContextRequest\n ): Promise<EvmSupplyContext> {\n const selectedPool = await getPoolById(\n this.params.canisterContext,\n request.poolId\n );\n\n return await this.getEvmSupplyContextForPool({\n request,\n asset: selectedPool.asset,\n chain: selectedPool.chain,\n });\n }\n\n private async getEvmSupplyContextForPool(\n params: GetEvmSupplyContextForPoolParams\n ): Promise<EvmSupplyContext> {\n const { request, asset, chain } = params;\n const evmReadClient = this.requireEvmReadClient(\n \"EVM supply context requires an EVM RPC URL or public client\"\n );\n const walletAddress = normalizeAndValidateEvmAddress(\n request.walletAddress,\n \"Invalid EVM wallet address\"\n );\n\n if (request.amount <= 0n) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n \"EVM supply context requires a positive amount\"\n );\n }\n\n if (!isEthStablecoin(asset, chain)) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n `EVM supply context only supports ETH stablecoin pools, received ${asset} on ${chain}`\n );\n }\n\n const tokenAddress = getEthStablecoinContractAddress(asset);\n const spenderAddress = CK_ETH_DEPOSIT_CONTRACT_ADDRESS;\n const [allowance, balance] = await Promise.all([\n readErc20Allowance({\n evmReadClient,\n tokenAddress,\n ownerAddress: walletAddress,\n spenderAddress,\n }),\n readErc20Balance({\n evmReadClient,\n tokenAddress,\n ownerAddress: walletAddress,\n }),\n ]);\n const approvalStrategy = getApprovalStrategy({\n allowance,\n amount: request.amount,\n });\n\n return {\n profileId: request.profileId,\n poolId: request.poolId,\n walletAddress,\n action: request.action,\n asset: asset as typeof Asset.USDC | typeof Asset.USDT,\n chain: Chain.ETH,\n amount: request.amount.toString(),\n tokenAddress,\n spenderAddress,\n depositContractAddress: CK_ETH_DEPOSIT_CONTRACT_ADDRESS,\n balance: balance.toString(),\n allowance: allowance.toString(),\n requiresApproval: approvalStrategy !== ApprovalStrategy.none,\n approvalStrategy,\n };\n }\n\n private async sendAndSubmitTransferSupplyInflow(\n params: SendAndSubmitTransferSupplyInflowParams\n ): Promise<string> {\n const { request, target, defaultSubmitInflowRequest } = params;\n\n if (!request.walletAdapter) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n \"Wallet-executed supply requires a wallet adapter\"\n );\n }\n\n const account = request.account?.trim();\n if (!account) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n \"Wallet-executed transfer supply requires an account\"\n );\n }\n\n if (!request.amount || request.amount <= 0n) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n \"Wallet-executed supply requires a positive amount\"\n );\n }\n\n const txid =\n target.chain === Chain.ICP\n ? await this.sendIcrcSupplyTransaction({\n walletAdapter: request.walletAdapter,\n asset: target.asset,\n chain: target.chain,\n transfer: {\n ledgerCanisterId:\n getPoolLedgerAssetRoute(target).ledgerCanisterId,\n to: decodeIcrcAccountAddress(target.address).account,\n amount: request.amount,\n },\n senderAccount: account,\n action: request.action,\n })\n : await this.sendChainAddressSupplyTransaction({\n walletAdapter: request.walletAdapter,\n chain: target.chain,\n toAddress: target.address,\n amount: request.amount,\n senderAccount: account,\n asset: target.asset,\n action: request.action,\n });\n\n if (shouldSubmitInflow({ target, mechanism: PlanType.transfer })) {\n try {\n await this.submitInflowWithRetry(txid, defaultSubmitInflowRequest);\n } catch {\n // The transfer is already broadcast and cannot be rolled back.\n // Return the txid so callers can track it even if the indexing hint fails.\n }\n }\n\n return txid;\n }\n\n private async submitSupplyFlowInflow(\n params: SubmitSupplyFlowInflowParams\n ): Promise<SubmitInflowResponse> {\n if (!shouldSubmitInflow(params)) {\n return {\n txid: params.submitRequest.txid,\n };\n }\n\n const defaultSubmitInflowRequest = params.defaultSubmitInflowRequest;\n if (!defaultSubmitInflowRequest) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n \"Supply flow submit requires an inflow operation\"\n );\n }\n\n return await this.params.submitInflow({\n ...defaultSubmitInflowRequest,\n ...params.submitRequest,\n });\n }\n\n private async executeContractSupply(\n params: ExecuteContractSupplyParams\n ): Promise<string> {\n const { request, target, defaultSubmitInflowRequest } = params;\n\n if (!isEthStablecoin(target.asset, target.chain)) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n \"Contract-interaction supply is only supported for ETH stablecoin targets\"\n );\n }\n\n const walletAddressInput = request.account?.trim();\n if (!walletAddressInput) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n \"Contract-interaction supply requires an account\"\n );\n }\n const walletAddress = normalizeAndValidateEvmAddress(\n walletAddressInput,\n \"Invalid EVM wallet address\"\n );\n\n if (!request.amount || request.amount <= 0n) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n \"Contract-interaction supply requires a positive amount\"\n );\n }\n\n const walletAdapter = request.walletAdapter;\n if (!walletAdapter?.sendEthTransaction) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n \"Contract-interaction supply requires an ETH wallet adapter\"\n );\n }\n\n this.params.requireApi();\n this.requireEvmReadClient(\n \"Contract-interaction supply requires an EVM RPC URL or public client\"\n );\n\n const evmSupplyContext = await this.getEvmSupplyContextForPool({\n request: {\n profileId: request.profileId,\n poolId: request.poolId,\n walletAddress,\n amount: request.amount,\n action: request.action,\n },\n asset: target.asset,\n chain: target.chain,\n });\n const supplyAmount = BigInt(evmSupplyContext.amount);\n\n if (BigInt(evmSupplyContext.balance) < supplyAmount) {\n throw new LiquidiumError(\n LiquidiumErrorCode.INSUFFICIENT_FUNDS,\n `Insufficient ${evmSupplyContext.asset} balance for ${request.action}`\n );\n }\n\n if (\n evmSupplyContext.approvalStrategy === ApprovalStrategy.resetThenApproveMax\n ) {\n await this.sendEthContractTransaction(\n walletAdapter,\n walletAddress,\n createApproveTransaction({\n tokenAddress: evmSupplyContext.tokenAddress,\n spenderAddress: evmSupplyContext.spenderAddress,\n amount: 0n,\n }),\n `supply-${request.action}-approve-reset`\n );\n\n await this.waitForExpectedAllowance({\n walletAddress,\n tokenAddress: evmSupplyContext.tokenAddress,\n spenderAddress: evmSupplyContext.spenderAddress,\n amount: supplyAmount,\n expectation: \"zero\",\n });\n }\n\n if (evmSupplyContext.approvalStrategy !== ApprovalStrategy.none) {\n await this.sendEthContractTransaction(\n walletAdapter,\n walletAddress,\n createApproveTransaction({\n tokenAddress: evmSupplyContext.tokenAddress,\n spenderAddress: evmSupplyContext.spenderAddress,\n amount: MAX_UINT256,\n }),\n `supply-${request.action}-approve-max`\n );\n\n await this.waitForExpectedAllowance({\n walletAddress,\n tokenAddress: evmSupplyContext.tokenAddress,\n spenderAddress: evmSupplyContext.spenderAddress,\n amount: supplyAmount,\n expectation: \"sufficient\",\n });\n }\n\n const depositTxid = await this.sendEthContractTransaction(\n walletAdapter,\n walletAddress,\n createDepositErc20Transaction({\n depositContractAddress: evmSupplyContext.depositContractAddress,\n tokenAddress: evmSupplyContext.tokenAddress,\n amount: supplyAmount,\n poolId: request.poolId,\n profileId: request.profileId,\n destinationAccount: target.address,\n action: request.action,\n }),\n `supply-${request.action}-deposit-erc20`\n );\n\n try {\n await this.submitInflowWithRetry(depositTxid, defaultSubmitInflowRequest);\n } catch {\n // The deposit transaction is already broadcast and cannot be rolled back.\n // Return the txid so callers can track it even if the indexing hint fails.\n }\n\n return depositTxid;\n }\n\n private async sendChainAddressSupplyTransaction(\n params: SendChainAddressSupplyTransactionParams\n ): Promise<string> {\n switch (params.chain) {\n case Chain.BTC: {\n if (!params.walletAdapter.sendBtcTransaction) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n \"BTC wallet adapter does not support transaction sending\"\n );\n }\n\n return await params.walletAdapter.sendBtcTransaction({\n chain: Chain.BTC,\n toAddress: params.toAddress,\n amountSats: params.amount,\n account: params.senderAccount,\n actionType: `supply-${params.action}`,\n });\n }\n case Chain.ETH: {\n if (!params.walletAdapter.sendEthTransaction) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n \"ETH wallet adapter does not support transaction sending\"\n );\n }\n\n if (isEthStablecoin(params.asset, params.chain)) {\n return await params.walletAdapter.sendEthTransaction({\n chain: Chain.ETH,\n account: params.senderAccount,\n actionType: `supply-${params.action}`,\n transaction: createTransferErc20Transaction({\n tokenAddress: getEthStablecoinContractAddress(params.asset),\n recipientAddress: params.toAddress,\n amount: params.amount,\n }),\n });\n }\n\n return await params.walletAdapter.sendEthTransaction({\n chain: Chain.ETH,\n account: params.senderAccount,\n actionType: `supply-${params.action}`,\n transaction: {\n to: params.toAddress,\n value: params.amount.toString(),\n },\n });\n }\n default:\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n `Chain-address wallet execution is not supported for ${params.chain}`\n );\n }\n }\n\n private async sendIcrcSupplyTransaction(\n params: SendIcrcSupplyTransactionParams\n ): Promise<string> {\n if (!params.walletAdapter.sendIcrcTransfer) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n \"ICRC wallet adapter does not support ledger transfers\"\n );\n }\n\n const route = getPoolLedgerAssetRoute({\n asset: params.asset,\n chain: params.chain,\n });\n\n return await params.walletAdapter.sendIcrcTransfer({\n chain: Chain.ICP,\n asset: route.asset,\n transfer: {\n ...params.transfer,\n ledgerCanisterId: route.ledgerCanisterId,\n },\n account: params.senderAccount,\n actionType: `supply-${params.action}`,\n });\n }\n\n private async submitInflowWithRetry(\n txid: string,\n extraRequest: SubmitInflowDefaults | null\n ): Promise<void> {\n if (!extraRequest) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n \"Inflow submission requires an operation\"\n );\n }\n\n await retryWithBackoff({\n execute: async () => {\n await this.params.submitInflow({ txid, ...extraRequest });\n },\n maxAttempts: SUBMIT_INFLOW_MAX_ATTEMPTS,\n initialRetryDelayMs: SUBMIT_INFLOW_INITIAL_RETRY_DELAY_MS,\n backoffMultiplier: SUBMIT_INFLOW_RETRY_BACKOFF_MULTIPLIER,\n shouldRetryError: isRetriableInflowSubmitError,\n });\n }\n\n private async sendEthContractTransaction(\n walletAdapter: Pick<WalletAdapter, \"sendEthTransaction\">,\n walletAddress: string,\n request: EthTransactionRequest,\n actionType: string\n ): Promise<string> {\n if (!walletAdapter.sendEthTransaction) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n \"ETH wallet adapter does not support transaction sending\"\n );\n }\n\n return await walletAdapter.sendEthTransaction({\n chain: Chain.ETH,\n account: walletAddress,\n actionType,\n transaction: request,\n });\n }\n\n private async waitForExpectedAllowance(\n params: WaitForExpectedAllowanceParams\n ): Promise<void> {\n const evmReadClient = this.requireEvmReadClient(\n \"Contract-interaction supply requires an EVM RPC URL or public client\"\n );\n let lastPollingError: unknown;\n\n for (\n let pollIndex = 0;\n pollIndex < ETH_APPROVAL_MAX_POLLS;\n pollIndex += 1\n ) {\n try {\n const allowance = await readErc20Allowance({\n evmReadClient,\n tokenAddress: params.tokenAddress,\n ownerAddress: params.walletAddress,\n spenderAddress: params.spenderAddress,\n });\n const matchesExpectation =\n params.expectation === \"zero\"\n ? allowance === 0n\n : allowance >= params.amount;\n\n if (matchesExpectation) {\n return;\n }\n } catch (error) {\n lastPollingError = error;\n }\n\n await delay(ETH_APPROVAL_POLL_INTERVAL_MS);\n }\n\n const lastPollingErrorMessage = getUnknownErrorMessage(lastPollingError);\n throw new LiquidiumError(\n LiquidiumErrorCode.SERVICE_UNAVAILABLE,\n lastPollingErrorMessage\n ? `Timed out waiting for ${params.expectation} ETH allowance update. Last polling error: ${lastPollingErrorMessage}`\n : `Timed out waiting for ${params.expectation} ETH allowance update`\n );\n }\n\n private requireEvmReadClient(message: string): EvmReadClient {\n if (!this.params.evmReadClient) {\n throw new LiquidiumError(LiquidiumErrorCode.VALIDATION_ERROR, message);\n }\n\n return this.params.evmReadClient;\n }\n}\n\nasync function readErc20Allowance(\n params: ReadErc20AllowanceParams\n): Promise<bigint> {\n const allowance = await params.evmReadClient.readContract({\n address: params.tokenAddress as EvmAddress,\n abi: ERC20_ABI,\n functionName: \"allowance\",\n args: [\n params.ownerAddress as EvmAddress,\n params.spenderAddress as EvmAddress,\n ],\n });\n\n return BigInt(allowance);\n}\n\nasync function readErc20Balance(\n params: ReadErc20BalanceParams\n): Promise<bigint> {\n const balance = await params.evmReadClient.readContract({\n address: params.tokenAddress as EvmAddress,\n abi: ERC20_ABI,\n functionName: \"balanceOf\",\n args: [params.ownerAddress as EvmAddress],\n });\n\n return BigInt(balance);\n}\n\nfunction getApprovalStrategy(\n params: ApprovalStrategyParams\n): EvmSupplyApprovalStrategy {\n if (params.allowance >= params.amount) {\n return ApprovalStrategy.none;\n }\n\n if (params.allowance === 0n) {\n return ApprovalStrategy.approveMax;\n }\n\n return ApprovalStrategy.resetThenApproveMax;\n}\n\nasync function delay(timeoutMs: number): Promise<void> {\n await new Promise<void>((resolve) => setTimeout(resolve, timeoutMs));\n}\n\nfunction isRetriableInflowSubmitError(error: unknown): boolean {\n if (!(error instanceof LiquidiumError)) {\n return false;\n }\n\n return error.code === LiquidiumErrorCode.SERVICE_UNAVAILABLE;\n}\n\nfunction getUnknownErrorMessage(error: unknown): string | null {\n if (error instanceof Error) {\n return error.message;\n }\n\n if (typeof error === \"string\") {\n return error;\n }\n\n return null;\n}\n\nfunction getDefaultSubmitInflowRequest(\n params: DefaultSubmitInflowRequestParams\n): SubmitInflowDefaults | null {\n if (params.chain !== Chain.BTC && params.chain !== Chain.ETH) {\n return null;\n }\n\n return {\n chain: params.chain,\n operation: mapSupplyActionToStatusOperation(params.action),\n };\n}\n\nfunction isWalletTransferSupplyRequest(\n request: SupplyFlowRequest\n): request is WalletTransferSupplyFlowRequest {\n return (\n request.mechanism !== PlanType.contractInteraction &&\n request.walletAdapter !== undefined\n );\n}\n\nfunction isContractInteractionSupplyRequest(\n request: SupplyFlowRequest\n): request is ContractInteractionSupplyFlowRequest {\n return request.mechanism === PlanType.contractInteraction;\n}\n\nfunction mapSupplyActionToStatusOperation(\n action: SupplyAction\n): InflowOperation {\n return action === SupplyAction.repayment ? \"repayment\" : \"deposit\";\n}\n\nfunction shouldSubmitInflow(params: ShouldSubmitInflowParams): boolean {\n if (params.mechanism !== PlanType.transfer) {\n return true;\n }\n\n if (params.target.chain === Chain.ICP) {\n return false;\n }\n\n return !isEthStablecoin(params.target.asset, params.target.chain);\n}\n","import { Principal } from \"@icp-sdk/core/principal\";\nimport {\n type CanisterLiquidiumAccount,\n decodeIcrcAccountAddress,\n type LiquidiumAccountInput,\n type LiquidiumAccountType,\n mapCanisterAccountToLiquidiumAccount,\n normalizeIcpAccountIdentifier,\n} from \"../../core/accounts\";\nimport { normalizeExternalAddress } from \"../../core/address-validation\";\nimport { LiquidiumError, LiquidiumErrorCode } from \"../../core/errors\";\nimport { Chain, OutflowType, type SigningChain } from \"../../core/types\";\nimport { getVariantKey } from \"../../core/utils/variant\";\nimport type { OutflowDetails } from \"./types\";\n\ntype MessageAccountType = \"AccountIdentifier\" | \"External\" | \"Icrc\" | \"Native\";\n\nexport interface LendingBtcChainVariant {\n BTC: null;\n}\n\nexport interface LendingEthChainVariant {\n ETH: null;\n}\n\nexport type LendingChainVariant =\n | LendingBtcChainVariant\n | LendingEthChainVariant;\n\nexport interface ParsedOutflowDestination {\n address: string;\n accountType: LiquidiumAccountType;\n canisterAccount: CanisterLiquidiumAccount;\n messageAccount: {\n type: MessageAccountType;\n data: string;\n };\n}\n\nexport interface ParseOutflowDestinationParams {\n destination: LiquidiumAccountInput;\n asset: string;\n poolChain: string;\n destinationChain: string;\n}\n\ninterface NormalizedOutflowDestinationInput {\n address: string;\n type: LiquidiumAccountType | null;\n}\n\nexport interface CanisterOutflowRecord {\n id: string;\n txid: [] | [string];\n outflow_type: Record<string, null>;\n outflow_ref: [] | [string];\n amount: bigint;\n receiver: CanisterLiquidiumAccount;\n}\n\nexport function mapCanisterOutflowDetails(\n outflow: CanisterOutflowRecord\n): OutflowDetails {\n const rawOutflowType = getVariantKey(outflow.outflow_type);\n\n return {\n id: outflow.id,\n outflowType: normalizeOutflowType(rawOutflowType),\n outflowRef: outflow.outflow_ref[0],\n txid: outflow.txid[0],\n amount: outflow.amount,\n receiver: mapCanisterAccountType(outflow.receiver),\n };\n}\n\nexport function mapCanisterAccountType(\n receiver: CanisterLiquidiumAccount\n): OutflowDetails[\"receiver\"] {\n return mapCanisterAccountToLiquidiumAccount(receiver);\n}\n\nexport function parseOutflowDestination(\n params: ParseOutflowDestinationParams\n): ParsedOutflowDestination {\n const destination = normalizeOutflowDestinationInput(params.destination);\n const parsedAccount = destination.type\n ? parseOutflowDestinationWithHint(destination)\n : parseOutflowDestinationAutomatically(destination.address);\n\n assertDestinationTypeSupportedByChain({\n accountType: parsedAccount.accountType,\n poolChain: params.poolChain,\n destinationChain: params.destinationChain,\n });\n\n if (parsedAccount.accountType !== \"ChainAddress\") {\n return parsedAccount;\n }\n\n const externalAddress = normalizeExternalAddress({\n address: parsedAccount.address,\n asset: params.asset,\n chain: params.destinationChain,\n });\n\n return {\n address: externalAddress,\n accountType: \"ChainAddress\",\n canisterAccount: { External: externalAddress },\n messageAccount: { type: \"External\", data: externalAddress },\n };\n}\n\nexport function normalizeOutflowType(\n rawOutflowType: string\n): OutflowDetails[\"outflowType\"] {\n switch (rawOutflowType) {\n case \"Withdraw\":\n return OutflowType.withdrawal;\n case \"Borrow\":\n return OutflowType.borrow;\n case \"FeeClaim\":\n return OutflowType.feeClaim;\n default:\n throw new LiquidiumError(\n LiquidiumErrorCode.INTERNAL,\n `Unsupported outflow type: ${rawOutflowType}`\n );\n }\n}\n\nexport function mapWalletChainToLendingChain(\n chain: SigningChain\n): LendingChainVariant {\n switch (chain) {\n case Chain.BTC:\n return { BTC: null };\n case Chain.ETH:\n return { ETH: null };\n }\n\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n `Message signing is not supported for ${String(chain)}`\n );\n}\n\nfunction normalizeOutflowDestinationInput(\n destination: LiquidiumAccountInput\n): NormalizedOutflowDestinationInput {\n if (typeof destination === \"string\") {\n return { address: destination, type: null };\n }\n\n return destination;\n}\n\nfunction parseOutflowDestinationWithHint(\n destination: NormalizedOutflowDestinationInput\n): ParsedOutflowDestination {\n try {\n switch (destination.type) {\n case \"ChainAddress\":\n return parseExternalDestination(destination.address);\n case \"IcPrincipal\":\n return parseIcPrincipalDestination(destination.address);\n case \"IcrcAccount\":\n return parseIcrcDestination(destination.address);\n case \"IcpAccountIdentifier\":\n return parseAccountIdentifierDestination(destination.address);\n default:\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n `Unsupported outflow account type: ${String(destination.type)}`\n );\n }\n } catch (error) {\n if (error instanceof LiquidiumError) {\n throw error;\n }\n\n throw new LiquidiumError(\n LiquidiumErrorCode.INVALID_ADDRESS,\n `Invalid ${destination.type} outflow destination`\n );\n }\n}\n\nfunction parseOutflowDestinationAutomatically(\n address: string\n): ParsedOutflowDestination {\n const parsers = [\n parseAccountIdentifierDestination,\n parseIcPrincipalDestination,\n parseIcrcDestination,\n ];\n\n for (const parser of parsers) {\n try {\n return parser(address);\n } catch {}\n }\n\n return parseExternalDestination(address);\n}\n\nfunction parseExternalDestination(address: string): ParsedOutflowDestination {\n return {\n address,\n accountType: \"ChainAddress\",\n canisterAccount: { External: address },\n messageAccount: { type: \"External\", data: address },\n };\n}\n\nfunction parseIcPrincipalDestination(\n address: string\n): ParsedOutflowDestination {\n const principal = Principal.fromText(address);\n const principalText = principal.toText();\n\n return {\n address: principalText,\n accountType: \"IcPrincipal\",\n canisterAccount: { Native: principal },\n messageAccount: { type: \"Native\", data: principalText },\n };\n}\n\nfunction parseIcrcDestination(address: string): ParsedOutflowDestination {\n const decoded = decodeIcrcAccountAddress(address);\n\n return {\n address: decoded.account.address,\n accountType: \"IcrcAccount\",\n canisterAccount: {\n Icrc: {\n owner: decoded.owner,\n subaccount: decoded.subaccount ? [decoded.subaccount] : [],\n },\n },\n messageAccount: { type: \"Icrc\", data: decoded.account.address },\n };\n}\n\nfunction parseAccountIdentifierDestination(\n address: string\n): ParsedOutflowDestination {\n const accountIdentifier = normalizeIcpAccountIdentifier(address);\n\n return {\n address: accountIdentifier,\n accountType: \"IcpAccountIdentifier\",\n canisterAccount: { AccountIdentifier: accountIdentifier },\n messageAccount: { type: \"AccountIdentifier\", data: accountIdentifier },\n };\n}\n\nfunction assertDestinationTypeSupportedByChain(params: {\n accountType: LiquidiumAccountType;\n poolChain: string;\n destinationChain: string;\n}): void {\n if (params.poolChain === Chain.BTC || params.poolChain === Chain.ETH) {\n if (\n params.destinationChain === params.poolChain &&\n params.accountType === \"ChainAddress\"\n ) {\n return;\n }\n\n if (\n params.destinationChain === Chain.ICP &&\n params.accountType === \"IcPrincipal\"\n ) {\n return;\n }\n }\n\n if (params.poolChain === Chain.ICP && params.destinationChain === Chain.ICP) {\n if (\n params.accountType === \"IcpAccountIdentifier\" ||\n params.accountType === \"IcrcAccount\" ||\n params.accountType === \"IcPrincipal\"\n ) {\n return;\n }\n }\n\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n \"Target pool does not support this address type\"\n );\n}\n","import { Principal } from \"@icp-sdk/core/principal\";\nimport type {\n CanisterLiquidiumAccount,\n LiquidiumAccountInput,\n} from \"../../core/accounts\";\nimport { getBorrowAmountMinimumValidationError } from \"../../core/borrow-minimums\";\nimport { createCkBtcLedgerActor } from \"../../core/canisters/ckbtc/ledger\";\nimport { createCkBtcMinterActor } from \"../../core/canisters/ckbtc/minter\";\nimport { createDepositAccountsActor } from \"../../core/canisters/deposit-accounts/actor\";\nimport { createIcrcLedgerActor } from \"../../core/canisters/icrc/ledger\";\nimport { createLendingActor } from \"../../core/canisters/lending/actor\";\nimport {\n mapCanisterCallErrorToLiquidiumError,\n mapLendingProtocolErrorToLiquidiumError,\n} from \"../../core/canisters/lending/error-mappers\";\nimport {\n createFlexibleLendingActor,\n type DecodedPool,\n decodeFlexiblePositionView,\n} from \"../../core/canisters/lending/flexible-actor\";\nimport {\n createBorrowAssetMessage,\n createWithdrawAssetMessage,\n} from \"../../core/canisters/lending/messages\";\nimport { LiquidiumError, LiquidiumErrorCode } from \"../../core/errors\";\nimport { normalizeEvmAddress } from \"../../core/evm\";\nimport {\n getPoolLedgerAssetRoute,\n type PoolLedgerAssetRoute,\n} from \"../../core/pool-ledger-assets\";\nimport { guardSameAssetBorrowing } from \"../../core/same-asset-borrowing\";\nimport { SdkApiPath } from \"../../core/sdk-api-paths\";\nimport {\n createLiquidiumStatus,\n type LiquidiumOperation,\n} from \"../../core/status\";\nimport type { ApiClient } from \"../../core/transports/api-client\";\nimport type { CanisterContext } from \"../../core/transports/canister-context\";\nimport {\n Asset,\n Chain,\n type EvmReadClient,\n OutflowType,\n} from \"../../core/types\";\nimport { encodeInflowSubaccount } from \"../../core/utils/inflow-subaccount\";\nimport { normalizeWalletSignature } from \"../../core/utils/signature\";\nimport { computeExpiryTimestampFromNow } from \"../../core/utils/time\";\nimport {\n type SignatureInfo,\n WalletActionKind,\n WalletExecutionKind,\n} from \"../../core/wallet-actions\";\nimport { getWithdrawAmountMinimumValidationError } from \"../../core/withdraw-minimums\";\nimport { executeWith } from \"../../execute\";\nimport { roundInflowFeeEstimate } from \"./_internal/inflow-fee-rounding\";\nimport { SupplyFlowExecutor } from \"./_internal/supply-flow\";\nimport {\n getEthStablecoinContractAddress,\n getPoolById,\n isEthStablecoin,\n mapDepositAccountErrorToLiquidiumError,\n} from \"./_internal/supply-targets\";\nimport {\n mapCanisterOutflowDetails,\n mapWalletChainToLendingChain,\n parseOutflowDestination,\n} from \"./mappers\";\nimport type {\n BorrowAction,\n BorrowOutflowDetails,\n CreateBorrowRequest,\n CreateWithdrawRequest,\n EstimateInflowFeeRequest,\n EvmSupplyContext,\n GetDepositAddressRequest,\n GetEvmSupplyContextRequest,\n InflowFeeEstimate,\n OutflowDetails,\n SubmitInflowRequest,\n SubmitInflowResponse,\n SupplyFlow,\n SupplyFlowRequest,\n WalletExecutionParams,\n WithdrawAction,\n WithdrawOutflowDetails,\n} from \"./types\";\n\ninterface OutflowActionData {\n profileId: string;\n poolId: string;\n amount: bigint;\n chain: Chain;\n receiver: LiquidiumAccountInput;\n signerWalletAddress: string;\n expiryTimestamp: bigint;\n}\n\ninterface OutflowSubmissionData extends OutflowActionData {\n receiverAccount: CanisterLiquidiumAccount;\n}\n\ninterface ResolveOutflowDestinationInputParams {\n receiver: LiquidiumAccountInput;\n errorMessage: string;\n}\n\ninterface GuardBorrowSameAssetPolicyParams {\n profileId: string;\n pool: DecodedPool;\n}\n\n/** Borrow, withdraw, supply, inflow reporting, and fee-estimation helpers. */\nexport class LendingModule {\n constructor(\n private readonly canisterContext: CanisterContext,\n private readonly apiClient: ApiClient | undefined,\n private readonly evmReadClient: EvmReadClient | undefined\n ) {}\n\n /**\n * Prepares a withdraw action that can be signed and submitted later.\n *\n * Use this when you need explicit control over signing and submission.\n * @param request - Profile, pool, amount (pool asset base units), outflow address, and signer wallet.\n * @returns A signable {@link WithdrawAction} with `submit` wired to the canister.\n */\n async prepareWithdraw(\n request: CreateWithdrawRequest\n ): Promise<WithdrawAction> {\n const destination = resolveOutflowDestinationInput({\n receiver: request.receiver,\n errorMessage: \"Withdraw requires a custom outflow account\",\n });\n const signerAccount = normalizeEvmAddress(\n request.signerWalletAddress.trim()\n );\n if (!signerAccount) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n \"Withdraw requires a signer account\"\n );\n }\n if (request.amount <= 0n) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n \"Withdraw amount must be greater than 0\"\n );\n }\n const selectedPool = await getPoolById(\n this.canisterContext,\n request.poolId\n );\n const selectedAsset = selectedPool.asset;\n const minimumWithdrawAmountError = getWithdrawAmountMinimumValidationError({\n amount: request.amount,\n asset: selectedAsset,\n });\n if (minimumWithdrawAmountError) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n minimumWithdrawAmountError.message\n );\n }\n const receiver = parseOutflowDestination({\n destination,\n asset: selectedAsset,\n poolChain: selectedPool.chain,\n destinationChain: request.chain,\n });\n\n const lendingActor = createLendingActor(this.canisterContext);\n\n try {\n const expiryTimestamp = computeExpiryTimestampFromNow();\n const nonce = await lendingActor.get_nonce(signerAccount);\n const withdrawActionData: OutflowActionData = {\n profileId: request.profileId,\n poolId: request.poolId,\n amount: request.amount,\n chain: request.chain,\n receiver: {\n address: receiver.address,\n type: receiver.accountType,\n },\n signerWalletAddress: signerAccount,\n expiryTimestamp,\n };\n const withdrawSubmissionData: OutflowSubmissionData = {\n ...withdrawActionData,\n receiverAccount: receiver.canisterAccount,\n };\n\n return {\n kind: WalletActionKind.createWithdraw,\n executionKind: WalletExecutionKind.signMessage,\n actionType: WalletActionKind.createWithdraw,\n account: signerAccount,\n message: createWithdrawAssetMessage(\n {\n pool_id: request.poolId,\n amount: request.amount.toString(),\n account: receiver.messageAccount,\n expiry_timestamp: expiryTimestamp,\n },\n nonce\n ),\n data: withdrawActionData,\n submit: async (signatureInfo: SignatureInfo) => {\n return await this.submitWithdraw(\n withdrawSubmissionData,\n signatureInfo\n );\n },\n };\n } catch (error) {\n if (error instanceof LiquidiumError) {\n throw error;\n }\n\n throw mapCanisterCallErrorToLiquidiumError(\"get_nonce\", error);\n }\n }\n\n private async submitWithdraw(\n request: OutflowSubmissionData,\n signatureInfo: SignatureInfo\n ): Promise<WithdrawOutflowDetails> {\n try {\n const result = await createLendingActor(this.canisterContext).withdraw(\n Principal.fromText(request.profileId),\n {\n data: {\n expiry_timestamp: request.expiryTimestamp,\n account: request.receiverAccount,\n pool_id: Principal.fromText(request.poolId),\n amount: request.amount,\n },\n signature_info: {\n Wallet: {\n signature: normalizeWalletSignature(\n signatureInfo.signature,\n signatureInfo.chain\n ),\n chain: mapWalletChainToLendingChain(signatureInfo.chain),\n account: request.signerWalletAddress,\n },\n },\n }\n );\n\n if (\"Err\" in result) {\n throw mapLendingProtocolErrorToLiquidiumError(result.Err);\n }\n\n return mapExpectedOutflowDetails(\n mapCanisterOutflowDetails(result.Ok),\n OutflowType.withdrawal,\n \"withdraw\"\n );\n } catch (error) {\n if (error instanceof LiquidiumError) {\n throw error;\n }\n\n throw mapCanisterCallErrorToLiquidiumError(\"withdraw\", error);\n }\n }\n\n /**\n * Creates a withdraw outflow using the provided wallet adapter.\n *\n * This is the convenience form of `prepareWithdraw(...)` plus execution.\n *\n * @param params - Withdraw request fields plus `signerChain` and `signerWalletAdapter`.\n * @returns The canister {@link OutflowDetails} for the completed withdraw.\n */\n async withdraw(\n params: CreateWithdrawRequest & WalletExecutionParams\n ): Promise<WithdrawOutflowDetails> {\n const action = await this.prepareWithdraw(params);\n\n return await executeWith({\n walletAdapter: params.signerWalletAdapter,\n chain: params.signerChain,\n account: action.account,\n })(action);\n }\n\n /**\n * Prepares a borrow action that can be signed and submitted later.\n *\n * Use this when you need explicit control over signing and submission.\n * When the selected pool disables same-asset borrowing, preparation rejects\n * profiles whose supplied balance in that pool is at or above its dust threshold.\n *\n * @param request - Profile, pool, amount (borrow asset base units), outflow address, and signer wallet.\n * @returns A signable {@link BorrowAction} with `submit` wired to the canister.\n */\n async prepareBorrow(request: CreateBorrowRequest): Promise<BorrowAction> {\n const destination = resolveOutflowDestinationInput({\n receiver: request.receiver,\n errorMessage: \"Borrow requires a custom outflow account\",\n });\n const signerAccount = normalizeEvmAddress(\n request.signerWalletAddress.trim()\n );\n if (!signerAccount) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n \"Borrow requires a signer account\"\n );\n }\n if (request.amount <= 0n) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n \"Borrow amount must be greater than 0\"\n );\n }\n const selectedPool = await getPoolById(\n this.canisterContext,\n request.poolId\n );\n const selectedAsset = selectedPool.asset;\n const minimumBorrowAmountError = getBorrowAmountMinimumValidationError({\n amount: request.amount,\n asset: selectedAsset,\n });\n if (minimumBorrowAmountError) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n minimumBorrowAmountError.message\n );\n }\n const receiver = parseOutflowDestination({\n destination,\n asset: selectedAsset,\n poolChain: selectedPool.chain,\n destinationChain: request.chain,\n });\n await this.guardBorrowSameAssetPolicy({\n profileId: request.profileId,\n pool: selectedPool,\n });\n\n const lendingActor = createLendingActor(this.canisterContext);\n\n try {\n const expiryTimestamp = computeExpiryTimestampFromNow();\n const nonce = await lendingActor.get_nonce(signerAccount);\n const borrowActionData: OutflowActionData = {\n profileId: request.profileId,\n poolId: request.poolId,\n amount: request.amount,\n chain: request.chain,\n receiver: {\n address: receiver.address,\n type: receiver.accountType,\n },\n signerWalletAddress: signerAccount,\n expiryTimestamp,\n };\n const borrowSubmissionData: OutflowSubmissionData = {\n ...borrowActionData,\n receiverAccount: receiver.canisterAccount,\n };\n\n return {\n kind: WalletActionKind.createBorrow,\n executionKind: WalletExecutionKind.signMessage,\n actionType: WalletActionKind.createBorrow,\n account: signerAccount,\n message: createBorrowAssetMessage(\n {\n pool_id: request.poolId,\n amount: request.amount.toString(),\n account: receiver.messageAccount,\n expiry_timestamp: expiryTimestamp,\n },\n nonce\n ),\n data: borrowActionData,\n submit: async (signatureInfo: SignatureInfo) => {\n return await this.submitBorrow(borrowSubmissionData, signatureInfo);\n },\n };\n } catch (error) {\n if (error instanceof LiquidiumError) {\n throw error;\n }\n\n throw mapCanisterCallErrorToLiquidiumError(\"get_nonce\", error);\n }\n }\n\n private async submitBorrow(\n request: OutflowSubmissionData,\n signatureInfo: SignatureInfo\n ): Promise<BorrowOutflowDetails> {\n try {\n const result = await createLendingActor(\n this.canisterContext\n ).borrow_assets(Principal.fromText(request.profileId), {\n data: {\n expiry_timestamp: request.expiryTimestamp,\n account: request.receiverAccount,\n pool_id: Principal.fromText(request.poolId),\n amount: request.amount,\n },\n signature_info: {\n Wallet: {\n signature: normalizeWalletSignature(\n signatureInfo.signature,\n signatureInfo.chain\n ),\n chain: mapWalletChainToLendingChain(signatureInfo.chain),\n account: request.signerWalletAddress,\n },\n },\n });\n\n if (\"Err\" in result) {\n throw mapLendingProtocolErrorToLiquidiumError(result.Err);\n }\n\n return mapExpectedOutflowDetails(\n mapCanisterOutflowDetails(result.Ok),\n OutflowType.borrow,\n \"borrow_assets\"\n );\n } catch (error) {\n if (error instanceof LiquidiumError) {\n throw error;\n }\n\n throw mapCanisterCallErrorToLiquidiumError(\"borrow_assets\", error);\n }\n }\n\n /**\n * Creates a borrow outflow using the provided wallet adapter.\n *\n * This is the convenience form of `prepareBorrow(...)` plus execution.\n * Same-asset policy validation runs before the wallet is asked to sign.\n *\n * @param params - Borrow request fields plus `signerChain` and `signerWalletAdapter`.\n * @returns The lending canister receipt as {@link OutflowDetails}.\n *\n * @remarks\n * `id` is always present. `txid` may be missing on the first response; the SDK does not\n * poll for it. Use history or app-level polling if you need the chain transaction id.\n */\n async borrow(\n params: CreateBorrowRequest & WalletExecutionParams\n ): Promise<BorrowOutflowDetails> {\n const action = await this.prepareBorrow(params);\n\n return await executeWith({\n walletAdapter: params.signerWalletAdapter,\n chain: params.signerChain,\n account: action.account,\n })(action);\n }\n\n /**\n * Resolves a supply target for a deposit or repayment and optionally broadcasts it.\n *\n * Transfer mode can return manual broadcast instructions when wallet fields are\n * omitted. Contract-interaction mode always requires `walletAdapter`, `account`,\n * and `amount` because it must prepare and submit approval/deposit calls.\n *\n * The SDK does not poll for inflow status. When a `txid` is returned, it is the\n * caller's responsibility to track confirmation state using their own polling.\n *\n * @returns A {@link SupplyFlow} receipt with `type`, `target`, `submit`, and\n * an optional `txid` present when the SDK broadcast for you.\n */\n async supply(request: SupplyFlowRequest): Promise<SupplyFlow> {\n return await this.createSupplyFlowExecutor().create(request);\n }\n\n /**\n * Fetches ERC-20 supply planning data with the configured EVM read client.\n *\n * Requires `evmRpcUrl` or `evmPublicClient` on the client. Used internally by\n * contract-interaction `supply`.\n *\n * @param request - Profile, pool, wallet, amount (token base units), and action.\n * @returns Locally computed {@link EvmSupplyContext} for approvals and deposit.\n */\n async getEvmSupplyContext(\n request: GetEvmSupplyContextRequest\n ): Promise<EvmSupplyContext> {\n return await this.createSupplyFlowExecutor().getEvmSupplyContext(request);\n }\n\n /**\n * Returns the read-only deposit address for an ETH stablecoin inflow target.\n *\n * This is a query call that does not create or mutate state. Use it when you\n * need the deposit address without hitting the authorization-gated update path.\n *\n * @param request - Profile, pool, asset, and supply action.\n * @returns The EVM deposit address for the derived account.\n */\n async getDepositAddress(request: GetDepositAddressRequest): Promise<string> {\n if (!isEthStablecoin(request.asset, Chain.ETH)) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n \"getDepositAddress is only supported for ETH stablecoins\"\n );\n }\n\n const tokenAddress = getEthStablecoinContractAddress(request.asset);\n const subaccount = encodeInflowSubaccount({\n action: request.action,\n principal: Principal.fromText(request.profileId),\n });\n\n const result = await createDepositAccountsActor(\n this.canisterContext\n ).get_deposit_address(\n {\n owner: Principal.fromText(request.poolId),\n subaccount: [subaccount],\n },\n [tokenAddress]\n );\n\n if (\"Err\" in result) {\n throw mapDepositAccountErrorToLiquidiumError(result.Err);\n }\n\n return result.Ok;\n }\n\n /**\n * Estimates the network/deposit fee for an inflow target.\n *\n * ETH stablecoin deposit-address estimates are served by the deposit-address\n * canister. BTC estimates include the ckBTC minter deposit fee and ledger fee.\n * ICP-chain estimates return the corresponding ICRC ledger fee.\n *\n * @param request - Asset and chain pair to estimate for.\n * @returns Total fee estimate rounded up in the asset's base units.\n */\n async estimateInflowFee(\n request: EstimateInflowFeeRequest\n ): Promise<InflowFeeEstimate> {\n if (request.chain === Chain.ICP) {\n const ledgerFee = await this.estimateIcrcLedgerFee(request);\n return {\n totalFee: roundInflowFeeEstimate(request, ledgerFee),\n };\n }\n\n if (isEthStablecoin(request.asset, request.chain)) {\n const result = await createDepositAccountsActor(\n this.canisterContext\n ).estimate_deposit_fee([getEthStablecoinContractAddress(request.asset)]);\n\n if (\"Err\" in result) {\n throw mapDepositAccountErrorToLiquidiumError(result.Err);\n }\n\n return {\n totalFee: roundInflowFeeEstimate(request, result.Ok),\n };\n }\n\n if (request.asset === Asset.BTC && request.chain === Chain.BTC) {\n const estimate = await this.estimateBtcInflowFee();\n return {\n totalFee: roundInflowFeeEstimate(request, estimate.totalFee),\n };\n }\n\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n `Inflow fee estimates are not supported for ${request.asset} on ${request.chain}`\n );\n }\n\n private async estimateBtcInflowFee(): Promise<InflowFeeEstimate> {\n const [minterFee, ledgerFee] = await Promise.all([\n createCkBtcMinterActor(this.canisterContext).get_deposit_fee(),\n createCkBtcLedgerActor(this.canisterContext).icrc1_fee(),\n ]);\n\n return { totalFee: minterFee + ledgerFee };\n }\n\n private async estimateIcrcLedgerFee(\n request: EstimateInflowFeeRequest\n ): Promise<bigint> {\n const route = getInflowFeeLedgerAssetRoute(request);\n\n return await createIcrcLedgerActor({\n canisterContext: this.canisterContext,\n canisterId: route.ledgerCanisterId,\n ledgerName: `${request.asset} ${request.chain}`,\n }).icrc1_fee();\n }\n\n /**\n * Submits an inflow transaction id for faster indexing.\n *\n * Uses the Liquidium SDK API.\n *\n * @param request - Broadcast `txid` plus inflow `operation` and optional `chain`.\n * @returns Acknowledgement including the submitted `txid`.\n */\n async submitInflow(\n request: SubmitInflowRequest\n ): Promise<SubmitInflowResponse> {\n if (\n request.chain !== undefined &&\n request.chain !== Chain.BTC &&\n request.chain !== Chain.ETH\n ) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n `Inflow submission is not supported for ${String(request.chain)}`\n );\n }\n\n const apiClient = this.requireApi();\n\n const response = await apiClient.post<\n SubmitInflowResponse,\n SubmitInflowRequest\n >(SdkApiPath.inflow, request);\n\n return {\n txid: response.txid,\n };\n }\n\n /**\n * Returns whether borrowing is currently disabled by the protocol.\n *\n * @returns `true` when the lending canister reports borrowing disabled.\n */\n async isBorrowingDisabled(): Promise<boolean> {\n try {\n return await createLendingActor(\n this.canisterContext\n ).get_borrowing_disabled();\n } catch (error) {\n if (error instanceof LiquidiumError) {\n throw error;\n }\n\n throw mapCanisterCallErrorToLiquidiumError(\n \"get_borrowing_disabled\",\n error\n );\n }\n }\n\n private requireApi(): ApiClient {\n if (!this.apiClient) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n \"Lending API actions require an API client\"\n );\n }\n\n return this.apiClient;\n }\n\n private createSupplyFlowExecutor(): SupplyFlowExecutor {\n return new SupplyFlowExecutor({\n canisterContext: this.canisterContext,\n evmReadClient: this.evmReadClient,\n requireApi: () => {\n this.requireApi();\n },\n submitInflow: async (request) => await this.submitInflow(request),\n });\n }\n\n private async guardBorrowSameAssetPolicy(\n params: GuardBorrowSameAssetPolicyParams\n ): Promise<void> {\n const sameAssetBorrowing = params.pool.same_asset_borrowing[0] ?? false;\n if (sameAssetBorrowing) {\n return;\n }\n\n const lendingActor = createFlexibleLendingActor(this.canisterContext);\n let positionResult: Awaited<ReturnType<typeof lendingActor.get_position>>;\n try {\n positionResult = await lendingActor.get_position(\n Principal.fromText(params.profileId),\n params.pool.principal\n );\n } catch (error) {\n throw mapCanisterCallErrorToLiquidiumError(\"get_position\", error);\n }\n const position = positionResult[0]\n ? decodeFlexiblePositionView(positionResult[0])\n : null;\n\n guardSameAssetBorrowing({\n borrowAsset: params.pool.asset,\n collateralAsset: params.pool.asset,\n collateralAmount: position?.deposited_native_now ?? 0n,\n poolId: params.pool.principal.toText(),\n policy: {\n sameAssetBorrowing,\n sameAssetBorrowingDustThreshold:\n params.pool.same_asset_borrowing_dust_threshold,\n },\n });\n }\n}\n\nfunction getInflowFeeLedgerAssetRoute(\n request: EstimateInflowFeeRequest\n): PoolLedgerAssetRoute {\n if (request.chain !== Chain.ICP) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n `IC ledger inflow fees are not supported for ${request.asset} on ${request.chain}`\n );\n }\n\n return getPoolLedgerAssetRoute(request);\n}\n\nfunction resolveOutflowDestinationInput(\n params: ResolveOutflowDestinationInputParams\n): LiquidiumAccountInput {\n const receiver = params.receiver;\n const address =\n typeof receiver === \"string\" ? receiver.trim() : receiver.address.trim();\n\n if (!address) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n params.errorMessage\n );\n }\n\n if (typeof receiver === \"string\") {\n return address;\n }\n\n return {\n address,\n type: receiver.type,\n };\n}\n\nfunction mapExpectedOutflowDetails(\n details: OutflowDetails,\n expectedOutflowType: typeof OutflowType.borrow,\n operation: string\n): BorrowOutflowDetails;\nfunction mapExpectedOutflowDetails(\n details: OutflowDetails,\n expectedOutflowType: typeof OutflowType.withdrawal,\n operation: string\n): WithdrawOutflowDetails;\nfunction mapExpectedOutflowDetails(\n details: OutflowDetails,\n expectedOutflowType:\n | typeof OutflowType.borrow\n | typeof OutflowType.withdrawal,\n operation: string\n): BorrowOutflowDetails | WithdrawOutflowDetails {\n if (details.outflowType !== expectedOutflowType) {\n throw new LiquidiumError(\n LiquidiumErrorCode.INTERNAL,\n `${operation} returned unexpected outflow type ${details.outflowType}`\n );\n }\n\n return {\n ...details,\n status: createLiquidiumStatus({\n operation: mapOutflowTypeToStatusOperation(expectedOutflowType),\n state: details.txid ? \"confirming\" : \"processing\",\n }),\n } as BorrowOutflowDetails | WithdrawOutflowDetails;\n}\n\nfunction mapOutflowTypeToStatusOperation(\n outflowType: typeof OutflowType.borrow | typeof OutflowType.withdrawal\n): LiquidiumOperation {\n return outflowType;\n}\n","/** Fixed-point scale used by protocol rate values. */\nexport const RATE_SCALE = 1_000_000_000_000_000_000_000_000_000n;\n/** Number of decimal places represented by {@link RATE_SCALE}. */\nexport const RATE_DECIMALS = BigInt(RATE_SCALE.toString().length - 1);\n","import { LiquidiumError, LiquidiumErrorCode } from \"../errors\";\n\nconst ASSET_NATIVE_DECIMALS: Record<string, bigint> = {\n BTC: 8n,\n ICP: 8n,\n USDC: 6n,\n USDT: 6n,\n SOL: 9n,\n};\n\nexport function getAssetNativeDecimals(asset: string): bigint {\n const decimals = ASSET_NATIVE_DECIMALS[asset];\n\n if (decimals === undefined) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n `Native decimals are not configured for asset: ${asset}`\n );\n }\n\n return decimals;\n}\n","import type {\n PoolRateTuple,\n PriceRecord,\n} from \"../../core/canisters/lending/actor\";\nimport type { DecodedPool } from \"../../core/canisters/lending/flexible-actor\";\nimport { RATE_DECIMALS } from \"../../core/rates\";\nimport { getAssetNativeDecimals } from \"../../core/utils/asset-decimals\";\nimport type { AssetPrices, Pool, PoolRate } from \"./types\";\n\nconst DECIMAL_BASE = 10;\nconst PAIR_SEPARATOR = \"_\";\nconst USDT_SYMBOL = \"USDT\";\n\nexport function mapDecodedPoolToPool(\n pool: DecodedPool,\n rate: PoolRateTuple\n): Pool {\n const totalSupply = pool.total_supply_at_last_sync;\n const totalDebt = pool.total_debt_at_last_sync;\n const availableLiquidity =\n totalSupply > totalDebt ? totalSupply - totalDebt : 0n;\n\n return {\n id: pool.principal.toString(),\n asset: pool.asset,\n chain: pool.chain,\n decimals: getAssetNativeDecimals(pool.asset),\n frozen: pool.frozen,\n totalSupply,\n totalDebt,\n availableLiquidity,\n supplyCap: pool.supply_cap[0],\n borrowCap: pool.borrow_cap[0],\n maxLtv: pool.max_ltv,\n liquidationThreshold: pool.liquidation_threshold,\n liquidationBonus: pool.liquidation_bonus,\n protocolLiquidationFee: pool.protocol_liquidation_fee,\n reserveFactor: pool.reserve_factor,\n rateDecimals: RATE_DECIMALS,\n lendingRate: rate[1],\n borrowingRate: rate[0],\n utilizationRate: rate[2],\n baseRate: pool.base_rate,\n optimalUtilizationRate: pool.optimal_utilization_rate,\n rateSlopeBefore: pool.rate_slope_before,\n rateSlopeAfter: pool.rate_slope_after,\n lendingIndex: pool.lending_index,\n borrowIndex: pool.borrow_index,\n sameAssetBorrowing: pool.same_asset_borrowing[0] ?? false,\n sameAssetBorrowingDustThreshold: pool.same_asset_borrowing_dust_threshold,\n lastUpdated: pool.last_updated[0],\n };\n}\n\nexport function mapGetPricesResponseToAssetPrices(\n prices: PriceRecord[]\n): AssetPrices {\n const pairPricesByName = new Map(\n prices.map(([pair, price, decimals]) => [\n pair,\n formatPrice(price, decimals),\n ])\n );\n const assetPrices: AssetPrices = {};\n\n for (const [pairName, pairPrice] of pairPricesByName) {\n const [baseAsset, quoteAsset] = pairName.split(PAIR_SEPARATOR);\n\n if (!baseAsset || !quoteAsset || quoteAsset !== USDT_SYMBOL) {\n continue;\n }\n\n assetPrices[baseAsset] = pairPrice;\n }\n\n return assetPrices;\n}\n\nexport function mapGetPoolRateResponseToPoolRate(\n rate: PoolRateTuple\n): PoolRate {\n return {\n rateDecimals: RATE_DECIMALS,\n borrowRate: rate[0],\n lendRate: rate[1],\n utilizationRate: rate[2],\n };\n}\n\nfunction formatPrice(price: bigint, decimals: number): number {\n const decimalScale = DECIMAL_BASE ** decimals;\n\n return Number(price) / decimalScale;\n}\n","import { Principal } from \"@icp-sdk/core/principal\";\nimport {\n createLendingActor,\n type PoolRateTuple,\n} from \"../../core/canisters/lending/actor\";\nimport {\n createFlexibleLendingActor,\n type DecodedPool,\n decodeFlexiblePool,\n type FlexiblePool,\n} from \"../../core/canisters/lending/flexible-actor\";\nimport { LiquidiumError, LiquidiumErrorCode } from \"../../core/errors\";\nimport type { CanisterContext } from \"../../core/transports/canister-context\";\nimport { Asset, Chain, isAssetIdentifier } from \"../../core/types\";\nimport {\n mapDecodedPoolToPool,\n mapGetPoolRateResponseToPoolRate,\n mapGetPricesResponseToAssetPrices,\n} from \"./mappers\";\nimport type { AssetPrices, FindPoolQuery, Pool, PoolRate } from \"./types\";\n\nconst ZERO_POOL_RATE: PoolRateTuple = [0n, 0n, 0n];\nconst BACKING_POOL_CHAIN_BY_ASSET = {\n [Asset.BTC]: Chain.BTC,\n [Asset.ICP]: Chain.ICP,\n [Asset.USDC]: Chain.ETH,\n [Asset.USDT]: Chain.ETH,\n} satisfies Record<Asset, Chain>;\n\n/** Pool metadata, prices, and current rate helpers. */\nexport class MarketModule {\n constructor(private readonly canisterContext: CanisterContext) {}\n\n /**\n * Lists SDK-supported pools with their current rates.\n *\n * Unsupported asset or chain variants returned by the canister are omitted.\n *\n * @returns Supported lending pools enriched with their current rate data.\n */\n async listPools(): Promise<Pool[]> {\n try {\n const flexibleActor = createFlexibleLendingActor(this.canisterContext);\n const rawPools = await flexibleActor.list_pools();\n\n const decodedPools = decodeSupportedFlexiblePools(rawPools);\n\n return await Promise.all(\n decodedPools.map(async (pool) => {\n const poolRate = await flexibleActor.get_pool_rate(pool.principal);\n const resolvedPoolRate = poolRate[0] ?? ZERO_POOL_RATE;\n\n return mapDecodedPoolToPool(pool, resolvedPoolRate);\n })\n );\n } catch (error) {\n if (error instanceof LiquidiumError) {\n throw error;\n }\n\n throw new LiquidiumError(\n LiquidiumErrorCode.CANISTER_REJECTED,\n \"Canister call failed: list_pools\",\n error\n );\n }\n }\n\n /**\n * Returns the latest asset prices reported by the protocol.\n *\n * @returns The latest protocol price map keyed by market asset symbol.\n */\n async getAssetPrices(): Promise<AssetPrices> {\n try {\n return mapGetPricesResponseToAssetPrices(\n await createLendingActor(this.canisterContext).get_prices()\n );\n } catch (error) {\n if (error instanceof LiquidiumError) {\n throw error;\n }\n\n throw new LiquidiumError(\n LiquidiumErrorCode.CANISTER_REJECTED,\n \"Canister call failed: get_prices\",\n error\n );\n }\n }\n\n /**\n * Resolves a single backing pool for the given Chain + Asset identifier.\n *\n * Native and chain-key identifiers share a pool. For example, both\n * `ETH/USDT` and `ICP/USDT` resolve to the USDT lending pool.\n *\n * @param query - The market asset and chain pair to match.\n * @returns The single pool that matches the requested asset and chain.\n */\n async findPool(query: FindPoolQuery): Promise<Pool> {\n const identifier = { chain: query.chain, asset: query.asset };\n\n if (!isAssetIdentifier(identifier)) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n `Unsupported asset identifier: ${identifier.chain}/${identifier.asset}`\n );\n }\n\n const pools = await this.listPools();\n const backingPoolChain = BACKING_POOL_CHAIN_BY_ASSET[identifier.asset];\n const matchedPools = pools.filter(\n (pool) =>\n pool.asset === identifier.asset && pool.chain === backingPoolChain\n );\n\n if (matchedPools.length === 0) {\n throw new LiquidiumError(\n LiquidiumErrorCode.POOL_NOT_FOUND,\n `Pool not found for asset ${query.asset} on chain ${query.chain}`\n );\n }\n\n if (matchedPools.length > 1) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n `Multiple pools found for asset ${query.asset} on chain ${query.chain}. Select a specific pool id.`\n );\n }\n\n return matchedPools[0];\n }\n\n /**\n * Returns the full pool record for the given asset and chain pair.\n *\n * Convenience wrapper over {@link MarketModule.findPool}. `listPools()` already\n * enriches each pool with its current rate data, so no extra canister call is made.\n *\n * @param query - The market asset and chain pair to match.\n * @returns The matching pool enriched with current rate data.\n */\n async getReserveData(query: FindPoolQuery): Promise<Pool> {\n return await this.findPool(query);\n }\n\n /**\n * Returns the current borrow, lend, and utilization rates for a pool.\n *\n * @param poolId - The pool principal text.\n * @returns The borrow, lend, and utilization rates for the requested pool.\n */\n async getPoolRate(poolId: string): Promise<PoolRate> {\n try {\n const rate = await createLendingActor(this.canisterContext).get_pool_rate(\n Principal.fromText(poolId)\n );\n\n if (!rate[0]) {\n throw new LiquidiumError(\n LiquidiumErrorCode.POOL_NOT_FOUND,\n `Pool not found: ${poolId}`\n );\n }\n\n return mapGetPoolRateResponseToPoolRate(rate[0]);\n } catch (error) {\n if (error instanceof LiquidiumError) {\n throw error;\n }\n\n throw new LiquidiumError(\n LiquidiumErrorCode.CANISTER_REJECTED,\n \"Canister call failed: get_pool_rate\",\n error\n );\n }\n }\n}\n\nfunction decodeSupportedFlexiblePools(rawPools: FlexiblePool[]): DecodedPool[] {\n const decodedPools: DecodedPool[] = [];\n\n for (const rawPool of rawPools) {\n const decodedPool = decodeFlexiblePool(rawPool);\n\n // The canister may expose assets/chains before the SDK supports their flows.\n // Keep market.listPools() scoped to pools this SDK can safely map and use.\n if (!decodedPool) {\n continue;\n }\n\n decodedPools.push(decodedPool);\n }\n\n return decodedPools;\n}\n","import type { BorrowingPowerRecord } from \"../../core/canisters/lending/actor\";\nimport type {\n DecodedPositionView,\n DecodedUserStats,\n} from \"../../core/canisters/lending/flexible-actor\";\nimport { getAssetNativeDecimals } from \"../../core/utils/asset-decimals\";\nimport type { BorrowingPower, Position, UserStats } from \"./types\";\n\nexport const USD_VALUE_SCALE_DECIMALS = 27n;\n\ninterface UserStatsLike {\n debt: bigint;\n collateral: bigint;\n weighted_liquidation_threshold: bigint;\n borrowing_power: BorrowingPowerRecord;\n}\n\nexport function mapDecodedPositionViewToPosition(\n view: DecodedPositionView\n): Position {\n const nativeDecimals = getAssetNativeDecimals(view.asset);\n\n return {\n poolId: view.pool_id.toText(),\n asset: view.asset,\n deposited: view.deposited_native_now,\n depositedDecimals: nativeDecimals,\n borrowed: view.debt_native_now,\n borrowedDecimals: nativeDecimals,\n earnedInterest: view.total_earned_interest + view.earned_since_snapshot,\n debtInterest: view.total_debt_interest + view.interest_since_snapshot,\n lastUpdate: view.last_update,\n };\n}\n\nexport function mapBorrowingPowerRecordToBorrowingPower(\n record: BorrowingPowerRecord\n): BorrowingPower {\n return {\n weightedMaxLtv: record.weighted_max_ltv,\n maxBorrowableUsd: record.max_borrowable_usd,\n maxBorrowableUsdDecimals: USD_VALUE_SCALE_DECIMALS,\n };\n}\n\nexport function mapDecodedUserStatsToUserStats(\n stats: DecodedUserStats\n): UserStats {\n return mapUserStatsLikeToUserStats(stats);\n}\n\nfunction mapUserStatsLikeToUserStats(stats: UserStatsLike): UserStats {\n return {\n debt: stats.debt,\n debtDecimals: USD_VALUE_SCALE_DECIMALS,\n collateral: stats.collateral,\n collateralDecimals: USD_VALUE_SCALE_DECIMALS,\n weightedLiquidationThreshold: stats.weighted_liquidation_threshold,\n borrowingPower: mapBorrowingPowerRecordToBorrowingPower(\n stats.borrowing_power\n ),\n };\n}\n","import { Principal } from \"@icp-sdk/core/principal\";\nimport { mapCanisterCallErrorToLiquidiumError } from \"../../core/canisters/lending/error-mappers\";\nimport {\n createFlexibleLendingActor,\n decodeFlexiblePositionView,\n decodeFlexibleUserStats,\n} from \"../../core/canisters/lending/flexible-actor\";\nimport { LiquidiumError } from \"../../core/errors\";\nimport type { CanisterContext } from \"../../core/transports/canister-context\";\nimport type { MarketModule } from \"../market/market\";\nimport type { Pool } from \"../market/types\";\nimport {\n mapDecodedPositionViewToPosition,\n mapDecodedUserStatsToUserStats,\n USD_VALUE_SCALE_DECIMALS,\n} from \"./mappers\";\nimport type {\n FullWithdrawAmount,\n HealthFactor,\n MaxRepayAmount,\n Position,\n UserPositionSummary,\n UserReserve,\n UserStats,\n} from \"./types\";\n\nconst BPS_SCALE = 10000n;\nconst DEFAULT_REPAY_BUFFER_BPS = 10n;\n\n/** Profile position, health factor, and reserve valuation helpers. */\nexport class PositionsModule {\n constructor(\n private readonly canisterContext: CanisterContext,\n readonly market: MarketModule\n ) {}\n\n /**\n * Returns a single position for a profile and pool.\n *\n * @param profileId - The Liquidium profile principal text.\n * @param poolId - The pool principal text.\n * @returns The position for the requested profile and pool, or `null` when no position exists.\n */\n async getPosition(\n profileId: string,\n poolId: string\n ): Promise<Position | null> {\n try {\n const result = await createFlexibleLendingActor(\n this.canisterContext\n ).get_position(Principal.fromText(profileId), Principal.fromText(poolId));\n\n const view = result[0];\n if (!view) {\n return null;\n }\n\n const decodedView = decodeFlexiblePositionView(view);\n if (!decodedView) {\n return null;\n }\n\n return mapDecodedPositionViewToPosition(decodedView);\n } catch (error) {\n if (error instanceof LiquidiumError) {\n throw error;\n }\n\n throw mapCanisterCallErrorToLiquidiumError(\"get_position\", error);\n }\n }\n\n /**\n * Lists all positions for a profile.\n *\n * @param profileId - The Liquidium profile principal text.\n * @returns All positions currently associated with the requested profile.\n */\n async listPositions(profileId: string): Promise<Position[]> {\n try {\n const actor = createFlexibleLendingActor(this.canisterContext);\n const profilePrincipal = Principal.fromText(profileId);\n const stats = await actor.get_profile_stats(profilePrincipal);\n const decodedStats = decodeFlexibleUserStats(stats);\n\n const positionViews = await Promise.all(\n decodedStats.positions.map((position) =>\n actor.get_position(profilePrincipal, position.pool_id)\n )\n );\n\n return positionViews\n .map((result) => result[0])\n .filter((view): view is NonNullable<typeof view> => view !== undefined)\n .map(decodeFlexiblePositionView)\n .filter((view): view is NonNullable<typeof view> => view !== null)\n .map(mapDecodedPositionViewToPosition);\n } catch (error) {\n if (error instanceof LiquidiumError) {\n throw error;\n }\n\n throw mapCanisterCallErrorToLiquidiumError(\"list_positions\", error);\n }\n }\n\n /**\n * Returns the current health factor for a profile.\n *\n * @param profileId - The Liquidium profile principal text.\n * @returns The current health factor for the requested profile.\n */\n async getHealthFactor(profileId: string): Promise<HealthFactor> {\n try {\n const [healthFactor, userStatsRecord] = await createFlexibleLendingActor(\n this.canisterContext\n ).get_health_factor(Principal.fromText(profileId));\n\n return {\n healthFactor,\n userStats: mapDecodedUserStatsToUserStats(\n decodeFlexibleUserStats(userStatsRecord)\n ),\n };\n } catch (error) {\n if (error instanceof LiquidiumError) {\n throw error;\n }\n\n throw mapCanisterCallErrorToLiquidiumError(\"get_health_factor\", error);\n }\n }\n\n /**\n * Returns aggregate borrowing and collateral stats for a profile.\n *\n * @param profileId - The Liquidium profile principal text.\n * @returns Aggregate debt, collateral, and borrowing power metrics for the requested profile.\n */\n async getUserStats(profileId: string): Promise<UserStats> {\n try {\n const result = await createFlexibleLendingActor(\n this.canisterContext\n ).get_profile_stats(Principal.fromText(profileId));\n\n return mapDecodedUserStatsToUserStats(decodeFlexibleUserStats(result));\n } catch (error) {\n if (error instanceof LiquidiumError) {\n throw error;\n }\n\n throw mapCanisterCallErrorToLiquidiumError(\"get_profile_stats\", error);\n }\n }\n\n /**\n * Returns an aggregate summary of a profile's position.\n *\n * Single canister round-trip (`get_health_factor`). Derived fields:\n * `availableBorrowsUsd = max(0, maxBorrowableUsd - debt)`,\n * `netWorthUsd = collateral - debt` (may be negative if underwater),\n * `currentLtvBps = debt * 10_000 / collateral` (0 when collateral is 0).\n *\n * @param profileId - The Liquidium profile principal text.\n * @returns Derived position summary for the requested profile.\n */\n async getUserPositionSummary(\n profileId: string\n ): Promise<UserPositionSummary> {\n const { healthFactor, userStats } = await this.getHealthFactor(profileId);\n\n const collateral = userStats.collateral;\n const debt = userStats.debt;\n const maxBorrowableUsd = userStats.borrowingPower.maxBorrowableUsd;\n const availableBorrowsUsd =\n maxBorrowableUsd > debt ? maxBorrowableUsd - debt : 0n;\n const netWorthUsd = collateral - debt;\n const currentLtvBps =\n collateral > 0n ? (debt * BPS_SCALE) / collateral : 0n;\n\n return {\n totalCollateralUsd: collateral,\n totalDebtUsd: debt,\n availableBorrowsUsd,\n netWorthUsd,\n usdDecimals: USD_VALUE_SCALE_DECIMALS,\n currentLtvBps,\n weightedMaxLtvBps: userStats.borrowingPower.weightedMaxLtv,\n weightedLiquidationThresholdBps: userStats.weightedLiquidationThreshold,\n healthFactor,\n };\n }\n\n /**\n * Returns the per-reserve breakdown of a profile's supplies and borrows,\n * joined with pool metadata, rates, and current USD prices.\n *\n * USD values are scaled to 27 decimals.\n *\n * @param profileId - The Liquidium profile principal text.\n * @returns Per-reserve position rows joined with pool metadata and USD values.\n */\n async getUserReserves(profileId: string): Promise<UserReserve[]> {\n const [positions, pools, prices] = await Promise.all([\n this.listPositions(profileId),\n this.market.listPools(),\n this.market.getAssetPrices(),\n ]);\n\n const poolsById = new Map<string, Pool>(\n pools.map((pool) => [pool.id, pool])\n );\n\n return positions.flatMap((position) => {\n const pool = poolsById.get(position.poolId);\n if (!pool) {\n return [];\n }\n\n const priceUsd = prices[position.asset] ?? 0;\n\n return [\n {\n position,\n pool,\n priceUsd,\n suppliedUsd: nativeAmountToUsdScaled(\n position.deposited,\n position.depositedDecimals,\n priceUsd\n ),\n borrowedUsd: nativeAmountToUsdScaled(\n position.borrowed + position.debtInterest,\n position.borrowedDecimals,\n priceUsd\n ),\n usdDecimals: USD_VALUE_SCALE_DECIMALS,\n },\n ];\n });\n }\n\n /**\n * Returns the full repayment amount for a position, with a small buffer to\n * account for interest that accrues between quote and submit.\n *\n * @param profileId - The Liquidium profile principal text.\n * @param poolId - The pool principal text.\n * @param bufferBps - Optional buffer in basis points (default 10 = 0.1%).\n * @returns Buffered repayment amount in the borrowed asset's base units.\n */\n async getMaxRepayAmount(\n profileId: string,\n poolId: string,\n bufferBps: bigint = DEFAULT_REPAY_BUFFER_BPS\n ): Promise<MaxRepayAmount> {\n const position = await this.getPosition(profileId, poolId);\n if (!position) {\n return { amount: 0n, decimals: 0n };\n }\n\n const rawDebt = position.borrowed + position.debtInterest;\n if (rawDebt <= 0n) {\n return { amount: 0n, decimals: position.borrowedDecimals };\n }\n\n const buffered = (rawDebt * (BPS_SCALE + bufferBps)) / BPS_SCALE;\n\n return { amount: buffered, decimals: position.borrowedDecimals };\n }\n\n /**\n * Returns the current full withdraw amount for a position.\n *\n * `Position.deposited` already reflects the current supplied balance at the\n * latest lending index; do not add `earnedInterest` to this amount.\n * Pass `amount` to withdraw calls and use `decimals` for display formatting.\n *\n * @param profileId - The Liquidium profile principal text.\n * @param poolId - The pool principal text.\n * @returns Full withdraw amount in the supplied asset's base units.\n */\n async getFullWithdrawAmount(\n profileId: string,\n poolId: string\n ): Promise<FullWithdrawAmount> {\n const position = await this.getPosition(profileId, poolId);\n if (!position) {\n return { amount: 0n, decimals: 0n };\n }\n\n return { amount: position.deposited, decimals: position.depositedDecimals };\n }\n}\n\nfunction nativeAmountToUsdScaled(\n amount: bigint,\n nativeDecimals: bigint,\n priceUsd: number\n): bigint {\n if (amount <= 0n || priceUsd <= 0) {\n return 0n;\n }\n\n const priceScaleDecimals = 12n;\n const priceScale = 10n ** priceScaleDecimals;\n const priceScaled = BigInt(Math.round(priceUsd * Number(priceScale)));\n const nativeToUsdScale = USD_VALUE_SCALE_DECIMALS - nativeDecimals;\n\n return (amount * priceScaled * 10n ** nativeToUsdScale) / priceScale;\n}\n","/** Input for calculating required collateral from a target LTV. */\nexport interface QuoteRequest {\n /** Requested borrow amount in borrow asset base units. */\n borrowAmount: bigint;\n /** Pool principal text for the borrow side. */\n borrowPoolId: string;\n /** Pool principal text for the collateral side. */\n collateralPoolId: string;\n /** Target loan-to-value ratio in basis points. */\n targetLtvBps: bigint;\n}\n\n/** Input for calculating LTV from explicit borrow and collateral amounts. */\nexport interface CalculateLtvRequest {\n /** Requested borrow amount in borrow asset base units. */\n borrowAmount: bigint;\n /** Pool principal text for the borrow side. */\n borrowPoolId: string;\n /** Collateral amount in collateral asset base units. */\n collateralAmount: bigint;\n /** Pool principal text for the collateral side. */\n collateralPoolId: string;\n}\n\n/** Validation error produced by quote helpers. */\nexport interface QuoteValidationError {\n /** Stable machine-readable validation code. */\n code: QuoteValidationErrorCode;\n /** Human-readable validation message. */\n message: string;\n}\n\n/** Stable validation codes produced by quote helpers. */\nexport enum QuoteValidationErrorCode {\n INVALID_LTV = \"INVALID_LTV\",\n LTV_EXCEEDS_MAX = \"LTV_EXCEEDS_MAX\",\n SAME_ASSET_NOT_ALLOWED = \"SAME_ASSET_NOT_ALLOWED\",\n BORROW_AMOUNT_TOO_LOW = \"BORROW_AMOUNT_TOO_LOW\",\n PRICE_NOT_AVAILABLE = \"PRICE_NOT_AVAILABLE\",\n POOL_NOT_FOUND = \"POOL_NOT_FOUND\",\n UNKNOWN = \"UNKNOWN\",\n}\n\n/** Non-blocking warning produced by quote helpers. */\nexport interface QuoteWarning {\n /** Stable machine-readable warning code. */\n code: QuoteWarningCode;\n /** Human-readable warning message. */\n message: string;\n}\n\n/** Stable warning codes produced by quote helpers. */\nexport enum QuoteWarningCode {\n HIGH_LTV = \"HIGH_LTV\",\n SAME_ASSET_BORROWING = \"SAME_ASSET_BORROWING\",\n}\n\n/** Quote result for a requested borrow amount and target LTV. */\nexport interface QuoteResult {\n /** Requested borrow amount in borrow asset base units. */\n borrowAmount: bigint;\n /** Borrow value in internal USD units. */\n borrowUsd: bigint;\n /** Required collateral amount in collateral asset base units. */\n requiredCollateralAmount: bigint;\n /** Required collateral value in internal USD units. */\n requiredCollateralUsd: bigint;\n /** Maximum allowed LTV in basis points for the collateral pool. */\n maxAllowedLtvBps: bigint;\n /** Requested target LTV in basis points. */\n targetLtvBps: bigint;\n /** Pool principal text for the borrow side. */\n borrowPoolId: string;\n /** Pool principal text for the collateral side. */\n collateralPoolId: string;\n /** Borrow asset symbol. */\n borrowAsset: string;\n /** Collateral asset symbol. */\n collateralAsset: string;\n /** Blocking validation errors. Empty when the quote is usable. */\n validationErrors: QuoteValidationError[];\n /** Non-blocking quote warnings. */\n warnings: QuoteWarning[];\n}\n\n/** LTV calculation result for explicit borrow and collateral amounts. */\nexport interface LtvCalculation {\n /** Requested borrow amount in borrow asset base units. */\n borrowAmount: bigint;\n /** Collateral amount in collateral asset base units. */\n collateralAmount: bigint;\n /** Borrow value in internal USD units. */\n borrowUsd: bigint;\n /** Collateral value in internal USD units. */\n collateralUsd: bigint;\n /** Computed LTV in basis points. */\n ltvBps: bigint;\n /** Maximum allowed LTV in basis points for the collateral pool. */\n maxAllowedLtvBps: bigint;\n /** Pool principal text for the borrow side. */\n borrowPoolId: string;\n /** Pool principal text for the collateral side. */\n collateralPoolId: string;\n /** Borrow asset symbol. */\n borrowAsset: string;\n /** Collateral asset symbol. */\n collateralAsset: string;\n /** Blocking validation errors. Empty when the calculation is usable. */\n validationErrors: QuoteValidationError[];\n}\n","import { getBorrowAmountMinimumValidationError } from \"../../core/borrow-minimums\";\nimport { getSameAssetBorrowingValidationError } from \"../../core/same-asset-borrowing\";\nimport { ceilDivBigint } from \"../../core/utils/bigint\";\nimport type { AssetPrices, Pool } from \"../market/types\";\nimport type {\n CalculateLtvRequest,\n LtvCalculation,\n QuoteRequest,\n QuoteResult,\n QuoteValidationError,\n QuoteWarning,\n} from \"./types\";\nimport { QuoteValidationErrorCode, QuoteWarningCode } from \"./types\";\n\nconst BASIS_POINTS_DENOMINATOR = 10_000n;\nconst BPS_PER_PERCENT = 100n;\nconst MIN_LTV_BPS = 0n;\nconst HIGH_LTV_WARNING_THRESHOLD_BPS = 8_000n;\nconst INTERNAL_USD_DECIMAL_PLACES = 8;\nconst PRICE_SCALE_DECIMAL_PLACES = 8;\n\ninterface CreateQuoteResultParams {\n borrowAmount: bigint;\n borrowPoolId: string;\n collateralPoolId: string;\n borrowUsd: bigint;\n requiredCollateralAmount: bigint;\n requiredCollateralUsd: bigint;\n maxAllowedLtvBps: bigint;\n targetLtvBps: bigint;\n borrowAsset: string;\n collateralAsset: string;\n validationErrors: QuoteValidationError[];\n warnings: QuoteWarning[];\n}\n\ninterface CreateLtvCalculationParams {\n request: CalculateLtvRequest;\n borrowUsd: bigint;\n collateralUsd: bigint;\n ltvBps: bigint;\n maxAllowedLtvBps: bigint;\n borrowAsset: string;\n collateralAsset: string;\n validationErrors: QuoteValidationError[];\n}\n\ninterface ComputeUsdInternalFromBaseUnitsParams {\n amountBaseUnits: bigint;\n priceScaled: bigint;\n assetDecimalPlaces: number;\n}\n\ninterface ComputeBaseUnitsFromUsdInternalCeilParams {\n usdInternal: bigint;\n priceScaled: bigint;\n assetDecimalPlaces: number;\n}\n\n/** Pure quote helpers for LTV and required-collateral calculations. */\nexport class QuoteModule {\n /**\n * Calculates current LTV from caller-supplied borrow and collateral amounts.\n *\n * Amount fields are base units. USD fields are scaled to 8 decimal places.\n *\n * @param request - Borrow and collateral pool ids plus base-unit amounts.\n * @param pools - Available pools, usually from `client.market.listPools()`.\n * @param prices - USD price map, usually from `client.market.getAssetPrices()`.\n * @returns LTV calculation plus validation errors when inputs are unusable.\n */\n calculateLtv(\n request: CalculateLtvRequest,\n pools: Pool[],\n prices: AssetPrices\n ): LtvCalculation {\n const validationErrors: QuoteValidationError[] = [];\n const borrowPool = pools.find((pool) => pool.id === request.borrowPoolId);\n const collateralPool = pools.find(\n (pool) => pool.id === request.collateralPoolId\n );\n\n if (!borrowPool) {\n validationErrors.push({\n code: QuoteValidationErrorCode.POOL_NOT_FOUND,\n message: `Borrow pool not found: ${request.borrowPoolId}`,\n });\n }\n\n if (!collateralPool) {\n validationErrors.push({\n code: QuoteValidationErrorCode.POOL_NOT_FOUND,\n message: `Collateral pool not found: ${request.collateralPoolId}`,\n });\n }\n\n if (!borrowPool || !collateralPool) {\n return createLtvCalculation({\n request,\n borrowUsd: 0n,\n collateralUsd: 0n,\n ltvBps: 0n,\n maxAllowedLtvBps: 0n,\n borrowAsset: \"\",\n collateralAsset: \"\",\n validationErrors,\n });\n }\n\n const borrowPrice = prices[borrowPool.asset];\n const collateralPrice = prices[collateralPool.asset];\n\n if (!isValidPrice(borrowPrice)) {\n validationErrors.push({\n code: QuoteValidationErrorCode.PRICE_NOT_AVAILABLE,\n message: `Price not available for borrow asset: ${borrowPool.asset}`,\n });\n }\n\n if (!isValidPrice(collateralPrice)) {\n validationErrors.push({\n code: QuoteValidationErrorCode.PRICE_NOT_AVAILABLE,\n message: `Price not available for collateral asset: ${collateralPool.asset}`,\n });\n }\n\n const borrowAmountError = createBorrowAmountValidationError({\n amount: request.borrowAmount,\n asset: borrowPool.asset,\n });\n if (borrowAmountError) {\n validationErrors.push(borrowAmountError);\n }\n\n if (request.collateralAmount <= 0n) {\n validationErrors.push({\n code: QuoteValidationErrorCode.INVALID_LTV,\n message: \"Collateral amount must be greater than 0\",\n });\n }\n\n const sameAssetBorrowingError = getSameAssetBorrowingValidationError({\n borrowAsset: borrowPool.asset,\n collateralAsset: collateralPool.asset,\n collateralAmount: request.collateralAmount,\n poolId: request.borrowPoolId,\n policy: borrowPool,\n });\n if (sameAssetBorrowingError) {\n validationErrors.push({\n code: QuoteValidationErrorCode.SAME_ASSET_NOT_ALLOWED,\n message: sameAssetBorrowingError.message,\n });\n }\n\n if (validationErrors.length > 0) {\n return createLtvCalculation({\n request,\n borrowUsd: 0n,\n collateralUsd: 0n,\n ltvBps: 0n,\n maxAllowedLtvBps: collateralPool.maxLtv,\n borrowAsset: borrowPool.asset,\n collateralAsset: collateralPool.asset,\n validationErrors,\n });\n }\n\n const borrowUsd = computeUsdInternalFromBaseUnits({\n amountBaseUnits: request.borrowAmount,\n priceScaled: scalePriceUsdToBigint(borrowPrice as number),\n assetDecimalPlaces: getPoolDecimalPlaces(borrowPool),\n });\n const collateralUsd = computeUsdInternalFromBaseUnits({\n amountBaseUnits: request.collateralAmount,\n priceScaled: scalePriceUsdToBigint(collateralPrice as number),\n assetDecimalPlaces: getPoolDecimalPlaces(collateralPool),\n });\n\n if (collateralUsd <= 0n) {\n validationErrors.push({\n code: QuoteValidationErrorCode.INVALID_LTV,\n message: \"Collateral value must be greater than 0\",\n });\n\n return createLtvCalculation({\n request,\n borrowUsd,\n collateralUsd,\n ltvBps: 0n,\n maxAllowedLtvBps: collateralPool.maxLtv,\n borrowAsset: borrowPool.asset,\n collateralAsset: collateralPool.asset,\n validationErrors,\n });\n }\n\n return createLtvCalculation({\n request,\n borrowUsd,\n collateralUsd,\n ltvBps: roundDivBigint(\n borrowUsd * BASIS_POINTS_DENOMINATOR,\n collateralUsd\n ),\n maxAllowedLtvBps: collateralPool.maxLtv,\n borrowAsset: borrowPool.asset,\n collateralAsset: collateralPool.asset,\n validationErrors,\n });\n }\n\n /**\n * Calculates a loan quote based on borrow amount, LTV, and pool selections.\n *\n * All arithmetic is performed in bigint. `requiredCollateralAmount` and\n * `requiredCollateralUsd` are rounded UP so the caller never under-collateralizes\n * due to integer truncation. `borrowUsd` is floored for display.\n *\n * @param request - Quote request parameters.\n * @param pools - All available pools (use MarketModule.listPools() to fetch).\n * @param prices - Asset prices in USD (use MarketModule.getAssetPrices() to fetch).\n * @returns Quote result with required collateral and validation state.\n */\n getQuote(\n request: QuoteRequest,\n pools: Pool[],\n prices: AssetPrices\n ): QuoteResult {\n const { borrowAmount, borrowPoolId, collateralPoolId, targetLtvBps } =\n request;\n\n const validationErrors: QuoteValidationError[] = [];\n const warnings: QuoteWarning[] = [];\n\n const borrowPool = pools.find((p) => p.id === borrowPoolId);\n const collateralPool = pools.find((p) => p.id === collateralPoolId);\n\n if (!borrowPool) {\n validationErrors.push({\n code: QuoteValidationErrorCode.POOL_NOT_FOUND,\n message: `Borrow pool not found: ${borrowPoolId}`,\n });\n }\n\n if (!collateralPool) {\n validationErrors.push({\n code: QuoteValidationErrorCode.POOL_NOT_FOUND,\n message: `Collateral pool not found: ${collateralPoolId}`,\n });\n }\n\n if (!borrowPool || !collateralPool) {\n return createQuoteResult({\n borrowAmount,\n borrowPoolId,\n collateralPoolId,\n borrowUsd: 0n,\n requiredCollateralAmount: 0n,\n requiredCollateralUsd: 0n,\n maxAllowedLtvBps: 0n,\n targetLtvBps,\n borrowAsset: \"\",\n collateralAsset: \"\",\n validationErrors,\n warnings,\n });\n }\n\n const borrowAsset = borrowPool.asset;\n const collateralAsset = collateralPool.asset;\n const borrowPrice = prices[borrowAsset];\n const collateralPrice = prices[collateralAsset];\n\n if (\n borrowPrice === undefined ||\n !Number.isFinite(borrowPrice) ||\n borrowPrice <= 0\n ) {\n validationErrors.push({\n code: QuoteValidationErrorCode.PRICE_NOT_AVAILABLE,\n message: `Price not available for borrow asset: ${borrowAsset}`,\n });\n }\n\n if (\n collateralPrice === undefined ||\n !Number.isFinite(collateralPrice) ||\n collateralPrice <= 0\n ) {\n validationErrors.push({\n code: QuoteValidationErrorCode.PRICE_NOT_AVAILABLE,\n message: `Price not available for collateral asset: ${collateralAsset}`,\n });\n }\n\n const borrowAmountError = createBorrowAmountValidationError({\n amount: borrowAmount,\n asset: borrowAsset,\n });\n if (borrowAmountError) {\n validationErrors.push(borrowAmountError);\n }\n\n if (targetLtvBps <= MIN_LTV_BPS) {\n validationErrors.push({\n code: QuoteValidationErrorCode.INVALID_LTV,\n message: `LTV must be greater than 0`,\n });\n }\n\n if (targetLtvBps > BASIS_POINTS_DENOMINATOR) {\n validationErrors.push({\n code: QuoteValidationErrorCode.INVALID_LTV,\n message: `LTV must not exceed ${formatBpsAsPercent(BASIS_POINTS_DENOMINATOR)}%`,\n });\n }\n\n const maxAllowedLtvBps = collateralPool.maxLtv;\n if (targetLtvBps > maxAllowedLtvBps) {\n validationErrors.push({\n code: QuoteValidationErrorCode.LTV_EXCEEDS_MAX,\n message: `Target LTV ${formatBpsAsPercent(targetLtvBps)}% exceeds max allowed ${formatBpsAsPercent(maxAllowedLtvBps)}%`,\n });\n }\n\n const isSameAssetBorrowingRequest = borrowAsset === collateralAsset;\n if (targetLtvBps >= HIGH_LTV_WARNING_THRESHOLD_BPS) {\n warnings.push({\n code: QuoteWarningCode.HIGH_LTV,\n message: `LTV above ${formatBpsAsPercent(HIGH_LTV_WARNING_THRESHOLD_BPS)}% may put your position at higher risk of liquidation`,\n });\n }\n\n if (validationErrors.length > 0) {\n return createQuoteResult({\n borrowAmount,\n borrowPoolId,\n collateralPoolId,\n borrowUsd: 0n,\n requiredCollateralAmount: 0n,\n requiredCollateralUsd: 0n,\n maxAllowedLtvBps,\n targetLtvBps,\n borrowAsset,\n collateralAsset,\n validationErrors,\n warnings,\n });\n }\n\n const borrowAssetDecimals = getPoolDecimalPlaces(borrowPool);\n const collateralAssetDecimals = getPoolDecimalPlaces(collateralPool);\n const borrowPriceScaled = scalePriceUsdToBigint(borrowPrice as number);\n const collateralPriceScaled = scalePriceUsdToBigint(\n collateralPrice as number\n );\n\n const borrowUsdInternal = computeUsdInternalFromBaseUnits({\n amountBaseUnits: borrowAmount,\n priceScaled: borrowPriceScaled,\n assetDecimalPlaces: borrowAssetDecimals,\n });\n\n const requiredCollateralUsdInternal = ceilDivBigint(\n borrowUsdInternal * BASIS_POINTS_DENOMINATOR,\n targetLtvBps\n );\n\n const requiredCollateralAmount = computeBaseUnitsFromUsdInternalCeil({\n usdInternal: requiredCollateralUsdInternal,\n priceScaled: collateralPriceScaled,\n assetDecimalPlaces: collateralAssetDecimals,\n });\n\n const sameAssetBorrowingError = getSameAssetBorrowingValidationError({\n borrowAsset,\n collateralAsset,\n collateralAmount: requiredCollateralAmount,\n poolId: borrowPoolId,\n policy: borrowPool,\n });\n if (sameAssetBorrowingError) {\n validationErrors.push({\n code: QuoteValidationErrorCode.SAME_ASSET_NOT_ALLOWED,\n message: sameAssetBorrowingError.message,\n });\n }\n\n if (isSameAssetBorrowingRequest && !sameAssetBorrowingError) {\n warnings.push({\n code: QuoteWarningCode.SAME_ASSET_BORROWING,\n message: `Using same asset for borrow and collateral`,\n });\n }\n\n return createQuoteResult({\n borrowAmount,\n borrowPoolId,\n collateralPoolId,\n borrowUsd: borrowUsdInternal,\n requiredCollateralAmount,\n requiredCollateralUsd: requiredCollateralUsdInternal,\n maxAllowedLtvBps,\n targetLtvBps,\n borrowAsset,\n collateralAsset,\n validationErrors,\n warnings,\n });\n }\n}\n\nfunction createLtvCalculation(\n params: CreateLtvCalculationParams\n): LtvCalculation {\n return {\n borrowAmount: params.request.borrowAmount,\n collateralAmount: params.request.collateralAmount,\n borrowUsd: params.borrowUsd,\n collateralUsd: params.collateralUsd,\n ltvBps: params.ltvBps,\n maxAllowedLtvBps: params.maxAllowedLtvBps,\n borrowPoolId: params.request.borrowPoolId,\n collateralPoolId: params.request.collateralPoolId,\n borrowAsset: params.borrowAsset,\n collateralAsset: params.collateralAsset,\n validationErrors: params.validationErrors,\n };\n}\n\nfunction createQuoteResult(params: CreateQuoteResultParams): QuoteResult {\n return {\n borrowAmount: params.borrowAmount,\n borrowUsd: params.borrowUsd,\n requiredCollateralAmount: params.requiredCollateralAmount,\n requiredCollateralUsd: params.requiredCollateralUsd,\n maxAllowedLtvBps: params.maxAllowedLtvBps,\n targetLtvBps: params.targetLtvBps,\n borrowPoolId: params.borrowPoolId,\n collateralPoolId: params.collateralPoolId,\n borrowAsset: params.borrowAsset,\n collateralAsset: params.collateralAsset,\n validationErrors: params.validationErrors,\n warnings: params.warnings,\n };\n}\n\nfunction createBorrowAmountValidationError(params: {\n amount: bigint;\n asset: string;\n}): QuoteValidationError | null {\n if (params.amount <= 0n) {\n return {\n code: QuoteValidationErrorCode.BORROW_AMOUNT_TOO_LOW,\n message: \"Borrow amount must be greater than 0\",\n };\n }\n\n const minimumBorrowAmountError =\n getBorrowAmountMinimumValidationError(params);\n if (!minimumBorrowAmountError) {\n return null;\n }\n\n return {\n code: QuoteValidationErrorCode.BORROW_AMOUNT_TOO_LOW,\n message: minimumBorrowAmountError.message,\n };\n}\n\nfunction computeUsdInternalFromBaseUnits(\n params: ComputeUsdInternalFromBaseUnitsParams\n): bigint {\n const { amountBaseUnits, priceScaled, assetDecimalPlaces } = params;\n const scaleDiff = INTERNAL_USD_DECIMAL_PLACES - PRICE_SCALE_DECIMAL_PLACES;\n const numerator = amountBaseUnits * priceScaled;\n const assetDecimalFactor = 10n ** BigInt(assetDecimalPlaces);\n\n if (scaleDiff >= 0) {\n return (numerator * 10n ** BigInt(scaleDiff)) / assetDecimalFactor;\n }\n\n return numerator / (assetDecimalFactor * 10n ** BigInt(-scaleDiff));\n}\n\nfunction computeBaseUnitsFromUsdInternalCeil(\n params: ComputeBaseUnitsFromUsdInternalCeilParams\n): bigint {\n const { usdInternal, priceScaled, assetDecimalPlaces } = params;\n const scaleDiff = INTERNAL_USD_DECIMAL_PLACES - PRICE_SCALE_DECIMAL_PLACES;\n const assetDecimalFactor = 10n ** BigInt(assetDecimalPlaces);\n\n if (scaleDiff >= 0) {\n return ceilDivBigint(\n usdInternal * assetDecimalFactor,\n priceScaled * 10n ** BigInt(scaleDiff)\n );\n }\n\n return ceilDivBigint(\n usdInternal * assetDecimalFactor * 10n ** BigInt(-scaleDiff),\n priceScaled\n );\n}\n\nfunction roundDivBigint(numerator: bigint, denominator: bigint): bigint {\n return (numerator + denominator / 2n) / denominator;\n}\n\nfunction scalePriceUsdToBigint(priceUsd: number): bigint {\n const scaled = Math.round(priceUsd * 10 ** PRICE_SCALE_DECIMAL_PLACES);\n return BigInt(scaled);\n}\n\nfunction isValidPrice(price: number | undefined): price is number {\n return typeof price === \"number\" && Number.isFinite(price) && price > 0;\n}\n\nfunction getPoolDecimalPlaces(pool: Pool): number {\n return Number(pool.decimals);\n}\n\nfunction formatBpsAsPercent(bps: bigint): string {\n const whole = bps / BPS_PER_PERCENT;\n const fractional = bps % BPS_PER_PERCENT;\n if (fractional === 0n) {\n return whole.toString();\n }\n\n const padded = fractional.toString().padStart(2, \"0\").replace(/0+$/, \"\");\n return `${whole}.${padded}`;\n}\n","import { LiquidiumError, LiquidiumErrorCode } from \"../errors\";\n\nconst MILLISECONDS_PER_SECOND = 1_000;\n\nexport interface ApiResponseFieldContext {\n context: string;\n label: string;\n}\n\nexport function parseNonEmptyApiString(\n value: string | undefined,\n field: ApiResponseFieldContext\n): string {\n if (!value) {\n throwInvalidApiResponseField(field);\n }\n\n return value;\n}\n\nexport function parseUnsignedApiBigint(\n value: string | undefined,\n field: ApiResponseFieldContext\n): bigint {\n if (!value || !/^\\d+$/.test(value)) {\n throwInvalidApiResponseField(field);\n }\n\n return BigInt(value);\n}\n\nexport function parseIsoApiTimestampToUnixSeconds(\n value: string | undefined,\n field: ApiResponseFieldContext\n): bigint {\n const timestamp = parseNonEmptyApiString(value, field);\n const timestampMilliseconds = Date.parse(timestamp);\n\n if (!Number.isFinite(timestampMilliseconds)) {\n throwInvalidApiResponseField(field);\n }\n\n return BigInt(Math.floor(timestampMilliseconds / MILLISECONDS_PER_SECOND));\n}\n\nexport function parseApiStringUnion<const TValue extends string>(\n value: string | undefined,\n allowedValues: readonly TValue[],\n field: ApiResponseFieldContext\n): TValue {\n if (value !== undefined && allowedValues.includes(value as TValue)) {\n return value as TValue;\n }\n\n throwInvalidApiResponseField(field);\n}\n\nfunction throwInvalidApiResponseField(field: ApiResponseFieldContext): never {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n `Invalid ${field.context} ${field.label}`\n );\n}\n","import { normalizeExternalAddress } from \"../../../core/address-validation\";\nimport type { Chain } from \"../../../core/types\";\nimport type { SimpleLoanAsset } from \"../types\";\n\nexport function validateSimpleLoanBorrowDestination(\n address: string,\n asset: SimpleLoanAsset,\n chain: Chain\n): string {\n return normalizeExternalAddress({\n address,\n asset,\n chain,\n });\n}\n\nexport function validateSimpleLoanRefundDestination(\n address: string,\n asset: SimpleLoanAsset,\n chain: Chain\n): string {\n return normalizeExternalAddress({\n address,\n asset,\n chain,\n });\n}\n","import { Principal } from \"@icp-sdk/core/principal\";\nimport {\n decodeIcrcAccountAddress,\n mapCanisterAccountToLiquidiumAccount,\n normalizeIcpAccountIdentifier,\n} from \"../../core/accounts\";\nimport { mapCanisterCallErrorToLiquidiumError } from \"../../core/canisters/lending/error-mappers\";\nimport type {\n SimpleLoanAuthorisation,\n SimpleLoanLeg as SimpleLoanCanisterLeg,\n SimpleLoansCanisterError,\n WarmedProfile,\n} from \"../../core/canisters/simple-loans/actor\";\nimport {\n createFlexibleSimpleLoansActor,\n type DecodedHeadlessLoanEvent,\n type DecodedHeadlessLoanEventType,\n type DecodedSimpleLoanCanisterRecord,\n decodeFlexibleHeadlessLoanEvent,\n decodeFlexibleSimpleLoanRecord,\n} from \"../../core/canisters/simple-loans/flexible-actor\";\nimport { LiquidiumError, LiquidiumErrorCode } from \"../../core/errors\";\nimport {\n buildSimpleLoanCollateralHintPath,\n buildSimpleLoanFindPath,\n SdkApiPath,\n} from \"../../core/sdk-api-paths\";\nimport { createLiquidiumStatus, type LiquidiumStatus } from \"../../core/status\";\nimport type { ApiClient } from \"../../core/transports/api-client\";\nimport type { CanisterContext } from \"../../core/transports/canister-context\";\nimport {\n type AssetIdentifier,\n type Chain,\n Asset as CoreAsset,\n Chain as CoreChain,\n isAssetIdentifier,\n SupplyAction,\n} from \"../../core/types\";\nimport {\n parseApiStringUnion,\n parseIsoApiTimestampToUnixSeconds,\n parseNonEmptyApiString,\n parseUnsignedApiBigint,\n} from \"../../core/utils/api-response-parsers\";\nimport { getAssetNativeDecimals } from \"../../core/utils/asset-decimals\";\nimport { getVariantKey } from \"../../core/utils/variant\";\nimport type { ActivitiesModule, Activity } from \"../activities\";\nimport { ActivityFilter } from \"../activities\";\nimport {\n getPoolById,\n resolveSupplyTargetForPool,\n} from \"../lending/_internal/supply-targets\";\nimport type { LendingModule } from \"../lending/lending\";\nimport { SupplyPlanType, type SupplyTarget } from \"../lending/types\";\nimport type { PositionsModule } from \"../positions\";\nimport type { Position } from \"../positions/types\";\nimport { QuoteModule } from \"../quote\";\nimport { QuoteValidationErrorCode } from \"../quote/types\";\nimport {\n validateSimpleLoanBorrowDestination,\n validateSimpleLoanRefundDestination,\n} from \"./_internal/address-validation\";\nimport { intFromPublicId, publicIdFromInt } from \"./ref-code\";\nimport type {\n CreateSimpleLoanRequest,\n SimpleLoan,\n SimpleLoanAccount,\n SimpleLoanAsset,\n SimpleLoanAuthorization,\n SimpleLoanConfig,\n SimpleLoanDestination,\n SimpleLoanEvent,\n SimpleLoanEventType,\n SimpleLoanFindBorrow,\n SimpleLoanFindCollateral,\n SimpleLoanFindResult,\n SimpleLoanGetRequest,\n SimpleLoanInitialDeposit,\n SimpleLoanInitialDepositTargetQuote,\n SimpleLoanLeg,\n SimpleLoanListEventsRequest,\n SimpleLoanRepaymentTargetQuote,\n SimpleLoanWarmedProfile,\n} from \"./types\";\n\nconst REPAYMENT_BUFFER_SECONDS = 86_400n;\nconst RATE_SCALE = 10n ** 27n;\nconst SECONDS_PER_YEAR = 31_536_000n;\nconst MILLISECONDS_PER_SECOND = 1_000;\nconst ETH_STABLECOIN_INFLOW_FEE_FALLBACK = 1_500_000n;\nconst SIMPLE_LOAN_MIN_SLIPPAGE_BUFFER_BPS = 200n;\nconst SIMPLE_LOAN_FIND_QUERY_MAX_LENGTH = 256;\nconst SIMPLE_LOAN_WIRE_CONTEXT = \"simple loan\";\nconst SIMPLE_LOAN_ASSETS = [\n CoreAsset.BTC,\n CoreAsset.ICP,\n CoreAsset.USDC,\n CoreAsset.USDT,\n] as const satisfies readonly SimpleLoanAsset[];\nconst SIMPLE_LOAN_CHAINS = [\n CoreChain.BTC,\n CoreChain.ETH,\n CoreChain.ICP,\n] as const;\n\nconst ICP_ACCOUNT_IDENTIFIER_HEX_LENGTH = 64;\n\ninterface SimpleLoanLtvPolicy {\n ltvBps: bigint;\n minLtvMaxBps: bigint;\n maxLtvMaxBps: bigint;\n}\n\ninterface SimpleLoanFindCandidateWire {\n loan_id: string;\n short_ref: string;\n created_at: string;\n lend_asset: string;\n borrow_asset: string;\n collateral_amount: string;\n lend_pool_ic_id: string;\n borrow_pool_ic_id: string;\n profile: string;\n}\n\ninterface SimpleLoanFindCandidate {\n loanId: bigint;\n ref: string;\n createdAt: bigint;\n collateral: SimpleLoanFindCollateral;\n borrow: SimpleLoanFindBorrow;\n profileId: string;\n}\n\ninterface SimpleLoanCreateRequestWire {\n collateralPoolId: string;\n borrowPoolId: string;\n collateralAsset: SimpleLoanAsset;\n borrowAsset: SimpleLoanAsset;\n collateralAmount: string;\n borrowAmount: string;\n ltvMaxBps: string;\n depositWindowSeconds: string;\n borrowDestination: SimpleLoanApiAccountType;\n refundDestination: SimpleLoanApiAccountType;\n}\n\ninterface SimpleLoanApiExternalAccountType {\n External: string;\n}\n\ninterface SimpleLoanApiNativeAccountType {\n Native: string;\n}\n\ninterface SimpleLoanApiAccountIdentifierAccountType {\n AccountIdentifier: string;\n}\n\ninterface SimpleLoanApiIcrcAccountType {\n Icrc: string;\n}\n\ntype SimpleLoanApiAccountType =\n | SimpleLoanApiExternalAccountType\n | SimpleLoanApiNativeAccountType\n | SimpleLoanApiAccountIdentifierAccountType\n | SimpleLoanApiIcrcAccountType;\n\ninterface SimpleLoanCollateralHintWire {\n collateralAmountHint: string;\n}\n\ninterface V1SimpleLoanFindResponseWire {\n success: true;\n candidates: SimpleLoanFindCandidateWire[];\n}\n\ninterface LegacySimpleLoanFindResponseWire {\n success: true;\n loans: SimpleLoanFindCandidateWire[];\n}\n\ntype SimpleLoanFindResponseWire =\n | V1SimpleLoanFindResponseWire\n | LegacySimpleLoanFindResponseWire;\n\ninterface V1SimpleLoanCollateralHintResponseWire\n extends SimpleLoanCollateralHintWire {\n success: true;\n}\n\ninterface V1SimpleLoanCreateResponseWire {\n success: true;\n loan: SimpleLoanWire;\n}\n\ninterface SimpleLoanWireCollateral {\n amountHint: string;\n}\n\ninterface SimpleLoanWire {\n loanId: string;\n collateral: SimpleLoanWireCollateral;\n}\n\ninterface SimpleLoanHydrationInput {\n loanId: bigint;\n profileId: string;\n ltvMaxBps: bigint;\n depositWindowSeconds: bigint;\n collateralPoolId: string;\n collateralAmount: bigint;\n borrowPoolId: string;\n collateralAsset: SimpleLoanAsset;\n borrowAsset: SimpleLoanAsset;\n borrowAmount: bigint;\n borrowDestination: SimpleLoanAccount;\n refundDestination: SimpleLoanAccount;\n started: boolean;\n depositDetectedTimestamp: bigint | null;\n expiryTimestamp: bigint | null;\n borrowChain: Chain;\n}\n\ninterface SimpleLoanHydrationChainOptions {\n borrowChain?: Chain;\n}\n\ninterface SimpleLoanInitialDepositQuoteInput {\n collateralAmount: bigint;\n decimals: bigint;\n asset: SimpleLoanAsset;\n targets: Partial<Record<Chain, SupplyTarget>>;\n detectedTimestamp: bigint | null;\n expiryTimestamp: bigint | null;\n}\n\ninterface ResolveSimpleLoanInflowTargetsRequest {\n profileId: string;\n poolId: string;\n action: SupplyAction;\n}\n\ninterface ResolvedSimpleLoanInflowTargets {\n targets: Partial<Record<Chain, SupplyTarget>>;\n}\n\ninterface RepaymentInflowFeeEstimate {\n totalFee: bigint;\n estimateAvailable: boolean;\n}\n\ninterface DeriveSimpleLoanStatusInput {\n started: boolean;\n depositDetectedTimestamp: bigint | null;\n expiryTimestamp: bigint | null;\n collateralAmount: bigint;\n totalDebtAmount: bigint;\n activeActivities: Activity[];\n}\n\ninterface DeriveDepositExpiryTimestampInput {\n depositDetectedTimestamp: bigint | null;\n depositWindowSeconds: bigint;\n}\n\ninterface LtvCalculationErrorDetails {\n code: QuoteValidationErrorCode;\n message: string;\n}\n\ntype ExternalDestinationNormalizer = (\n address: string,\n asset: SimpleLoanAsset,\n chain: Chain\n) => string;\n\ntype SimpleLoanOutflowRole = \"borrow\" | \"refund\";\n\ninterface ResolveSimpleLoanDestinationParams {\n destination: SimpleLoanDestination;\n asset: SimpleLoanAsset;\n role: SimpleLoanOutflowRole;\n chain: Chain;\n normalizeExternalDestination: ExternalDestinationNormalizer;\n}\n\n/**\n * A loan was created remotely, but the SDK could not load its enriched state.\n * Retry with `simpleLoans.get({ loanId })`; do not create the loan again.\n */\nexport class SimpleLoanCreatedError extends Error {\n readonly code = \"SIMPLE_LOAN_HYDRATION_FAILED\" as const;\n readonly loanId: bigint;\n readonly ref: string;\n override readonly cause: unknown;\n\n constructor(loanId: bigint, cause: unknown) {\n const ref = publicIdFromInt(loanId);\n super(\n `Simple loan ${ref} was created, but its enriched state could not be loaded`\n );\n this.name = \"SimpleLoanCreatedError\";\n this.loanId = loanId;\n this.ref = ref;\n this.cause = cause;\n }\n}\n\n/** Accountless Simple Loans creation, lookup, recovery, and canister query helpers. */\nexport class SimpleLoansModule {\n constructor(\n private readonly canisterContext: CanisterContext,\n private readonly apiClient: ApiClient | undefined,\n private readonly activities: ActivitiesModule,\n private readonly lending: LendingModule,\n private readonly positions: PositionsModule\n ) {}\n\n /**\n * Creates a profileless simple loan and returns canonical canister state plus\n * generated initial-deposit and repayment quote targets.\n *\n * Choose `collateralPoolId` and `borrowPoolId` from\n * `client.market.listPools()`, convert UI amounts to base units with the\n * selected pool decimals, and call `client.quote.calculateLtv(...)` before\n * creation to block invalid LTV input.\n *\n * `borrow.destination` receives the borrowed asset after the loan starts.\n * `refund.destination` receives collateral refunds or withdrawals. Use\n * `depositWindowSeconds` for the user-facing collateral deposit timeout; the\n * SDK maps it to the canister's internal `ltv_timer_s` field.\n * Pool assets and same-asset borrowing policy are validated before creation.\n *\n * @param request - Collateral, borrow, refund, LTV limit, timeout, and inflow options.\n * @returns Hydrated loan state plus generated initial-deposit and repayment quote targets.\n */\n async create(request: CreateSimpleLoanRequest): Promise<SimpleLoan> {\n validateCreateRequest(request);\n const borrowDestination = resolveSimpleLoanDestination({\n destination: request.borrow.destination,\n asset: request.borrow.asset,\n role: \"borrow\",\n chain: request.borrow.chain,\n normalizeExternalDestination: validateSimpleLoanBorrowDestination,\n });\n const refundDestination = resolveSimpleLoanDestination({\n destination: request.refund.destination,\n asset: request.collateral.asset,\n role: \"refund\",\n chain: request.refund.chain,\n normalizeExternalDestination: validateSimpleLoanRefundDestination,\n });\n const apiClient = this.requireApi(\"Simple loan creation\");\n\n await this.validateSimpleLoanLtvPolicy(request);\n\n const response = await apiClient.post<\n V1SimpleLoanCreateResponseWire,\n SimpleLoanCreateRequestWire\n >(SdkApiPath.simpleLoans, {\n collateralPoolId: request.collateral.poolId,\n borrowPoolId: request.borrow.poolId,\n collateralAsset: request.collateral.asset,\n borrowAsset: request.borrow.asset,\n collateralAmount: request.collateral.amount.toString(),\n borrowAmount: request.borrow.amount.toString(),\n ltvMaxBps: request.ltvMaxBps.toString(),\n depositWindowSeconds: request.depositWindowSeconds.toString(),\n borrowDestination,\n refundDestination,\n });\n\n const loanId = parseUnsignedApiBigint(response.loan.loanId, {\n context: SIMPLE_LOAN_WIRE_CONTEXT,\n label: \"loan ID\",\n });\n\n try {\n const collateralAmount = parseUnsignedApiBigint(\n response.loan.collateral.amountHint,\n {\n context: SIMPLE_LOAN_WIRE_CONTEXT,\n label: \"collateral amount\",\n }\n );\n const record = await this.getLoanRecord(loanId);\n\n return await this.mapLoanRecord(record, collateralAmount, {\n borrowChain: request.borrow.chain,\n });\n } catch (cause) {\n throw new SimpleLoanCreatedError(loanId, cause);\n }\n }\n\n /**\n * Resolves canonical canister state by loan id or short reference.\n *\n * References are decoded locally, then the corresponding loan id is loaded\n * from the Simple Loans canister.\n *\n * @param request - Canister loan id or short public reference.\n * @returns Hydrated loan state plus generated initial-deposit and repayment quote targets.\n */\n async get(request: SimpleLoanGetRequest): Promise<SimpleLoan> {\n const loanId =\n \"loanId\" in request ? request.loanId : decodeRef(request.ref);\n\n const record = await this.getLoanRecord(loanId);\n const collateralAmount = await this.getCollateralAmountHint(loanId);\n\n return await this.mapLoanRecord(record, collateralAmount);\n }\n\n /**\n * Finds simple loans by short reference, numeric loan id string, address, or transaction id.\n *\n * Search returns lightweight matches. Call `get({ loanId })` or `get({ ref })`\n * when the user selects a match and you need hydrated loan state.\n *\n * @param query - Short reference, address, transaction id/hash, or numeric loan id string.\n * @returns Matching loan ids and references from the search index.\n */\n async find(query: string): Promise<SimpleLoanFindResult[]> {\n const validatedQuery = validateSimpleLoanFindQuery(query);\n const candidates = await this.findCandidateLoansByQuery(validatedQuery);\n\n return uniqueSimpleLoanFindCandidates(candidates).map((candidate) => ({\n loanId: candidate.loanId,\n ref: candidate.ref,\n createdAt: candidate.createdAt,\n collateral: candidate.collateral,\n borrow: candidate.borrow,\n profileId: candidate.profileId,\n }));\n }\n\n /**\n * Returns the active Simple Loans canister config via direct query.\n *\n * @returns Active canister configuration.\n */\n async getConfig(): Promise<SimpleLoanConfig> {\n try {\n const config = await createFlexibleSimpleLoansActor(\n this.canisterContext\n ).get_config();\n\n return {\n lendingCanisterId: config.lending_canister.toText(),\n };\n } catch (error) {\n throw mapCanisterCallErrorToLiquidiumError(\"get_config\", error);\n }\n }\n\n /**\n * Returns a single canister event by id via direct query.\n *\n * @param eventId - Event id to load.\n * @returns The event when found, otherwise `null`.\n */\n async getEvent(eventId: bigint): Promise<SimpleLoanEvent | null> {\n try {\n const event = await createFlexibleSimpleLoansActor(\n this.canisterContext\n ).get_event(eventId);\n\n const decoded = event[0]\n ? decodeFlexibleHeadlessLoanEvent(event[0])\n : null;\n\n return decoded ? mapSimpleLoanEvent(decoded) : null;\n } catch (error) {\n throw mapCanisterCallErrorToLiquidiumError(\"get_event\", error);\n }\n }\n\n /**\n * Returns a page of canister events via direct query.\n *\n * @param request - Start event id and maximum number of events to return.\n * @returns Canister events in ascending id order.\n */\n async listEvents(\n request: SimpleLoanListEventsRequest\n ): Promise<SimpleLoanEvent[]> {\n try {\n const events = await createFlexibleSimpleLoansActor(\n this.canisterContext\n ).list_events(request.start, request.limit);\n\n return events\n .map(([, event]) => decodeFlexibleHeadlessLoanEvent(event))\n .filter((event): event is DecodedHeadlessLoanEvent => event !== null)\n .map((event) => mapSimpleLoanEvent(event));\n } catch (error) {\n throw mapCanisterCallErrorToLiquidiumError(\"list_events\", error);\n }\n }\n\n /**\n * Returns principals authorized for protected update callbacks.\n *\n * @returns Principal text values on the canister access list.\n */\n async listAccessList(): Promise<string[]> {\n try {\n const principals = await createFlexibleSimpleLoansActor(\n this.canisterContext\n ).list_access_list();\n\n return principals.map((principal) => principal.toText());\n } catch (error) {\n throw mapCanisterCallErrorToLiquidiumError(\"list_access_list\", error);\n }\n }\n\n /**\n * Returns the current size of the warmed-profile pool via direct query.\n *\n * @returns Number of warmed profiles available on the canister.\n */\n async countWarmedProfiles(): Promise<bigint> {\n try {\n return await createFlexibleSimpleLoansActor(\n this.canisterContext\n ).count_warmed_profiles();\n } catch (error) {\n throw mapCanisterCallErrorToLiquidiumError(\n \"count_warmed_profiles\",\n error\n );\n }\n }\n\n /**\n * Returns warmed profiles currently available for future simple loans.\n *\n * @returns Warmed profile records available for assignment.\n */\n async listWarmedProfiles(): Promise<SimpleLoanWarmedProfile[]> {\n try {\n const profiles = await createFlexibleSimpleLoansActor(\n this.canisterContext\n ).list_warmed_profiles();\n\n return profiles.map(mapWarmedProfile);\n } catch (error) {\n throw mapCanisterCallErrorToLiquidiumError(\"list_warmed_profiles\", error);\n }\n }\n\n private async findCandidateLoansByQuery(\n query: string\n ): Promise<SimpleLoanFindCandidate[]> {\n const apiClient = this.requireApi(\"Simple loan find\");\n const response = await apiClient.get<SimpleLoanFindResponseWire>(\n buildSimpleLoanFindPath({ query })\n );\n\n const candidates =\n \"candidates\" in response ? response.candidates : response.loans;\n\n return candidates.map(mapCandidateWire);\n }\n\n private async getLoanRecord(\n loanId: bigint\n ): Promise<DecodedSimpleLoanCanisterRecord> {\n try {\n const result = await createFlexibleSimpleLoansActor(\n this.canisterContext\n ).get_loan(loanId);\n\n if (\"Err\" in result) {\n throw mapSimpleLoansErrorToLiquidiumError(result.Err);\n }\n\n const decoded = decodeFlexibleSimpleLoanRecord(result.Ok);\n if (!decoded) {\n throw new LiquidiumError(\n LiquidiumErrorCode.POOL_NOT_FOUND,\n `Simple loan ${loanId.toString()} uses an unsupported asset`\n );\n }\n\n return decoded;\n } catch (error) {\n if (error instanceof LiquidiumError) {\n throw error;\n }\n\n throw mapCanisterCallErrorToLiquidiumError(\"get_loan\", error);\n }\n }\n\n private async mapLoanRecord(\n record: DecodedSimpleLoanCanisterRecord,\n collateralAmount: bigint,\n chainOptions: SimpleLoanHydrationChainOptions = {}\n ): Promise<SimpleLoan> {\n const borrowDestination = accountFromCanister(record.borrow_destination);\n const collateralAsset = parseSimpleLoanAsset(\n record.lend_asset,\n \"collateral asset\"\n );\n const borrowAsset = parseSimpleLoanAsset(\n record.borrow_asset,\n \"borrow asset\"\n );\n\n return await this.hydrateLoan({\n loanId: record.id,\n profileId: record.lending_profile.toText(),\n ltvMaxBps: record.ltv_max_bps,\n depositWindowSeconds: record.ltv_timer_s,\n collateralPoolId: record.lend_pool_id.toText(),\n collateralAmount,\n borrowPoolId: record.borrow_pool_id.toText(),\n collateralAsset,\n borrowAsset,\n borrowAmount: record.borrow_amount,\n borrowDestination,\n refundDestination: accountFromCanister(record.refund_destination),\n started: record.started,\n depositDetectedTimestamp: record.deposit_detected_ts[0] ?? null,\n expiryTimestamp:\n record.expires_at[0] ??\n deriveDepositExpiryTimestamp({\n depositDetectedTimestamp: record.deposit_detected_ts[0] ?? null,\n depositWindowSeconds: record.ltv_timer_s,\n }),\n borrowChain:\n chainOptions.borrowChain ??\n inferSimpleLoanDeliveryChain(borrowDestination, borrowAsset),\n });\n }\n\n private async getCollateralAmountHint(loanId: bigint): Promise<bigint> {\n const apiClient = this.requireApi(\"Simple loan collateral hint\");\n const response =\n await apiClient.get<V1SimpleLoanCollateralHintResponseWire>(\n buildSimpleLoanCollateralHintPath({ loanId })\n );\n\n return parseUnsignedApiBigint(response.collateralAmountHint, {\n context: SIMPLE_LOAN_WIRE_CONTEXT,\n label: \"collateral amount\",\n });\n }\n\n private async hydrateLoan(\n input: SimpleLoanHydrationInput\n ): Promise<SimpleLoan> {\n const profileId = input.profileId;\n const collateralPoolId = input.collateralPoolId;\n const borrowPoolId = input.borrowPoolId;\n const collateralAsset = input.collateralAsset;\n const borrowAsset = input.borrowAsset;\n\n const [\n depositTargetSet,\n repaymentTargetSet,\n collateralPosition,\n borrowPosition,\n borrowPoolRate,\n activeActivities,\n ] = await Promise.all([\n this.resolveSimpleLoanInflowTargets({\n profileId,\n poolId: collateralPoolId,\n action: SupplyAction.deposit,\n }),\n this.resolveSimpleLoanInflowTargets({\n profileId,\n poolId: borrowPoolId,\n action: SupplyAction.repayment,\n }),\n this.positions.getPosition(profileId, collateralPoolId),\n this.positions.getPosition(profileId, borrowPoolId),\n this.positions.market.getPoolRate(borrowPoolId),\n this.activities.list({ profileId, filter: ActivityFilter.active }),\n ]);\n\n const totalDebtAmount = calculateTotalDebtAmount(borrowPosition);\n const interestBufferAmount = calculateInterestBufferAmount(\n borrowPosition,\n borrowPoolRate.borrowRate\n );\n\n const currentCollateralAmount = collateralPosition?.deposited ?? 0n;\n\n const collateralAmount = input.collateralAmount;\n const collateralDecimals =\n collateralPosition?.depositedDecimals ??\n getAssetNativeDecimals(collateralAsset);\n const collateralInterestAmount = collateralPosition?.earnedInterest ?? 0n;\n\n const borrowedAmount = borrowPosition?.borrowed ?? 0n;\n const borrowedDecimals =\n borrowPosition?.borrowedDecimals ?? getAssetNativeDecimals(borrowAsset);\n\n const debtInterestAmount = borrowPosition?.debtInterest ?? 0n;\n\n const status = deriveSimpleLoanStatus({\n started: input.started,\n depositDetectedTimestamp: input.depositDetectedTimestamp,\n expiryTimestamp: input.expiryTimestamp,\n collateralAmount: currentCollateralAmount,\n totalDebtAmount,\n activeActivities,\n });\n\n const initialDeposit = await this.createInitialDepositQuote({\n collateralAmount,\n decimals: collateralDecimals,\n asset: collateralAsset,\n targets: depositTargetSet.targets,\n detectedTimestamp: input.depositDetectedTimestamp,\n expiryTimestamp: input.expiryTimestamp,\n });\n\n const repaymentTargets = await this.createRepaymentTargetQuotes({\n baseRepaymentAmount: totalDebtAmount + interestBufferAmount,\n asset: borrowAsset,\n targets: repaymentTargetSet.targets,\n });\n\n const repayment = {\n decimals: borrowedDecimals,\n debtAmount: totalDebtAmount,\n interestBufferAmount,\n interestBufferSeconds: REPAYMENT_BUFFER_SECONDS,\n asset: borrowAsset,\n targets: repaymentTargets,\n };\n const borrowIdentifier = getSimpleLoanAssetIdentifier(\n borrowAsset,\n input.borrowChain,\n \"borrow\"\n );\n\n return {\n loanId: input.loanId,\n ref: publicIdFromInt(input.loanId),\n status,\n profileId,\n terms: {\n ltvMaxBps: input.ltvMaxBps,\n depositWindowSeconds: input.depositWindowSeconds,\n },\n collateral: {\n asset: collateralAsset,\n poolId: collateralPoolId,\n decimals: collateralDecimals,\n amount: collateralAmount,\n },\n borrow: {\n ...borrowIdentifier,\n poolId: borrowPoolId,\n decimals: borrowedDecimals,\n amount: input.borrowAmount,\n destination: input.borrowDestination,\n },\n refundDestination: input.refundDestination,\n initialDeposit,\n repayment,\n position: {\n collateralAmount: currentCollateralAmount,\n collateralDecimals,\n collateralInterestAmount,\n borrowedAmount,\n borrowedDecimals,\n debtInterestAmount,\n totalDebtAmount,\n },\n };\n }\n\n private async createInitialDepositQuote(\n input: SimpleLoanInitialDepositQuoteInput\n ): Promise<SimpleLoanInitialDeposit> {\n const targets: Partial<Record<Chain, SimpleLoanInitialDepositTargetQuote>> =\n {};\n\n for (const chain of SIMPLE_LOAN_CHAINS) {\n const target = input.targets[chain];\n if (!target) continue;\n assertTargetAsset(target, input.asset);\n\n const inflowFee = await this.lending.estimateInflowFee(target);\n targets[chain] = {\n amount: input.collateralAmount + inflowFee.totalFee,\n inflowFeeAmount: inflowFee.totalFee,\n target,\n };\n }\n\n return {\n decimals: input.decimals,\n collateralAmount: input.collateralAmount,\n asset: input.asset,\n targets,\n detectedTimestamp: input.detectedTimestamp,\n expiryTimestamp: input.expiryTimestamp,\n };\n }\n\n private async resolveSimpleLoanInflowTargets(\n request: ResolveSimpleLoanInflowTargetsRequest\n ): Promise<ResolvedSimpleLoanInflowTargets> {\n const selectedPool = await getPoolById(\n this.canisterContext,\n request.poolId\n );\n const baseRequest = {\n profileId: request.profileId,\n poolId: request.poolId,\n action: request.action,\n mechanism: SupplyPlanType.transfer,\n };\n const poolChainTarget = await resolveSupplyTargetForPool(\n this.canisterContext,\n baseRequest,\n selectedPool\n );\n const poolChain = poolChainTarget.chain;\n const targets: Partial<Record<Chain, SupplyTarget>> = {\n [poolChain]: poolChainTarget,\n };\n\n if (poolChain === CoreChain.ICP) {\n return { targets };\n }\n\n const icpTarget = await resolveSupplyTargetForPool(\n this.canisterContext,\n { ...baseRequest, chain: CoreChain.ICP },\n selectedPool\n );\n\n targets[CoreChain.ICP] = icpTarget;\n return { targets };\n }\n\n private async createRepaymentTargetQuotes(input: {\n baseRepaymentAmount: bigint;\n asset: SimpleLoanAsset;\n targets: Partial<Record<Chain, SupplyTarget>>;\n }): Promise<Partial<Record<Chain, SimpleLoanRepaymentTargetQuote>>> {\n const quotes: Partial<Record<Chain, SimpleLoanRepaymentTargetQuote>> = {};\n\n for (const chain of SIMPLE_LOAN_CHAINS) {\n const target = input.targets[chain];\n if (!target) continue;\n assertTargetAsset(target, input.asset);\n\n const repaymentInflowFee =\n input.baseRepaymentAmount > 0n\n ? await this.estimateRepaymentInflowFee(target)\n : { totalFee: 0n, estimateAvailable: false };\n\n quotes[chain] = {\n amount: input.baseRepaymentAmount + repaymentInflowFee.totalFee,\n inflowFeeAmount: repaymentInflowFee.totalFee,\n inflowFeeEstimateAvailable: repaymentInflowFee.estimateAvailable,\n target,\n };\n }\n\n return quotes;\n }\n\n private async estimateRepaymentInflowFee(\n target: SupplyTarget\n ): Promise<RepaymentInflowFeeEstimate> {\n try {\n const fee = await this.lending.estimateInflowFee(target);\n return { totalFee: fee.totalFee, estimateAvailable: true };\n } catch {\n return {\n totalFee: getRepaymentInflowFeeFallback(target.asset, target.chain),\n estimateAvailable: false,\n };\n }\n }\n\n private requireApi(action: string): ApiClient {\n if (!this.apiClient) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n `${action} requires an API client`\n );\n }\n\n return this.apiClient;\n }\n\n private async validateSimpleLoanLtvPolicy(\n request: CreateSimpleLoanRequest\n ): Promise<void> {\n const ltvCalculation = await this.calculateSimpleLoanLtv(request);\n\n if (request.ltvMaxBps < ltvCalculation.minLtvMaxBps) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n `Simple loan max LTV ${formatBpsAsPercent(request.ltvMaxBps)} is below minimum allowed ${formatBpsAsPercent(ltvCalculation.minLtvMaxBps)} (current implied LTV ${formatBpsAsPercent(ltvCalculation.ltvBps)} + ${formatBpsAsPercent(SIMPLE_LOAN_MIN_SLIPPAGE_BUFFER_BPS)} buffer)`\n );\n }\n\n if (request.ltvMaxBps > ltvCalculation.maxLtvMaxBps) {\n throw new LiquidiumError(\n LiquidiumErrorCode.MAX_LTV_EXCEEDED,\n `Simple loan max LTV ${formatBpsAsPercent(request.ltvMaxBps)} exceeds collateral pool max ${formatBpsAsPercent(ltvCalculation.maxLtvMaxBps)}`\n );\n }\n }\n\n private async calculateSimpleLoanLtv(\n request: CreateSimpleLoanRequest\n ): Promise<SimpleLoanLtvPolicy> {\n const [pools, assetPrices] = await Promise.all([\n this.positions.market.listPools(),\n this.positions.market.getAssetPrices(),\n ]);\n const collateralPool = pools.find(\n (pool) => pool.id === request.collateral.poolId\n );\n const borrowPool = pools.find((pool) => pool.id === request.borrow.poolId);\n\n if (collateralPool && collateralPool.asset !== request.collateral.asset) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n \"Simple loan collateral asset does not match its pool\"\n );\n }\n\n if (borrowPool && borrowPool.asset !== request.borrow.asset) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n \"Simple loan borrow asset does not match its pool\"\n );\n }\n\n const ltvCalculation = new QuoteModule().calculateLtv(\n {\n borrowAmount: request.borrow.amount,\n borrowPoolId: request.borrow.poolId,\n collateralAmount: request.collateral.amount,\n collateralPoolId: request.collateral.poolId,\n },\n pools,\n assetPrices\n );\n\n if (ltvCalculation.validationErrors.length > 0) {\n throwLtvCalculationError(ltvCalculation.validationErrors[0]);\n }\n\n const minLtvMaxBps =\n ltvCalculation.ltvBps + SIMPLE_LOAN_MIN_SLIPPAGE_BUFFER_BPS;\n\n return {\n ltvBps: ltvCalculation.ltvBps,\n minLtvMaxBps,\n maxLtvMaxBps: ltvCalculation.maxAllowedLtvBps,\n };\n }\n}\n\nfunction getRepaymentInflowFeeFallback(\n asset: SimpleLoanAsset,\n chain: Chain\n): bigint {\n if (chain === \"ETH\" && (asset === \"USDT\" || asset === \"USDC\")) {\n return ETH_STABLECOIN_INFLOW_FEE_FALLBACK;\n }\n\n return 0n;\n}\n\nfunction assertTargetAsset(\n target: SupplyTarget,\n expectedAsset: SimpleLoanAsset\n): void {\n if (target.asset === expectedAsset) {\n return;\n }\n\n throw new LiquidiumError(\n LiquidiumErrorCode.INTERNAL,\n `Simple loan pool target asset ${target.asset} does not match ${expectedAsset}`\n );\n}\n\nfunction calculateInterestBufferAmount(\n borrowPosition: Position | null,\n annualBorrowRate: bigint\n): bigint {\n const totalDebtAmount = calculateTotalDebtAmount(borrowPosition);\n if (totalDebtAmount <= 0n || annualBorrowRate <= 0n) {\n return 0n;\n }\n\n const interestBuffer =\n (totalDebtAmount * annualBorrowRate * REPAYMENT_BUFFER_SECONDS) /\n RATE_SCALE /\n SECONDS_PER_YEAR;\n\n return interestBuffer > 1n ? interestBuffer : 1n;\n}\n\nfunction calculateTotalDebtAmount(borrowPosition: Position | null): bigint {\n if (!borrowPosition) {\n return 0n;\n }\n\n return borrowPosition.borrowed + borrowPosition.debtInterest;\n}\n\nfunction deriveSimpleLoanStatus(\n input: DeriveSimpleLoanStatusInput\n): LiquidiumStatus {\n const activeActivityStatus = deriveActiveSimpleLoanActivityStatus(input);\n if (activeActivityStatus) {\n return activeActivityStatus;\n }\n\n if (input.totalDebtAmount > 0n) {\n return createLiquidiumStatus({\n operation: \"repayment\",\n state: \"active\",\n });\n }\n\n if (input.started) {\n return createLiquidiumStatus({\n operation: \"repayment\",\n state: \"completed\",\n });\n }\n\n if (isSimpleLoanDepositExpired(input)) {\n return createLiquidiumStatus({\n operation: \"deposit\",\n state: \"expired\",\n });\n }\n\n if (input.collateralAmount > 0n) {\n return createLiquidiumStatus({\n operation: \"deposit\",\n state: \"processing\",\n });\n }\n\n if (input.depositDetectedTimestamp !== null) {\n return createLiquidiumStatus({\n operation: \"deposit\",\n state: \"confirming\",\n });\n }\n\n return createLiquidiumStatus({\n operation: \"deposit\",\n state: \"action_required\",\n });\n}\n\nfunction deriveActiveSimpleLoanActivityStatus(\n input: DeriveSimpleLoanStatusInput\n): LiquidiumStatus | null {\n if (!input.started) {\n return findActiveActivityStatus(input.activeActivities, \"deposit\");\n }\n\n const borrowStatus = findActiveActivityStatus(\n input.activeActivities,\n \"borrow\"\n );\n if (borrowStatus) {\n return borrowStatus;\n }\n\n return findActiveActivityStatus(input.activeActivities, \"repayment\");\n}\n\nfunction findActiveActivityStatus(\n activities: Activity[],\n operation: LiquidiumStatus[\"operation\"]\n): LiquidiumStatus | null {\n const activity = activities.find(\n (candidate) => candidate.status.operation === operation\n );\n\n return activity?.status ?? null;\n}\n\nfunction isSimpleLoanDepositExpired(\n input: DeriveSimpleLoanStatusInput\n): boolean {\n if (input.started || input.depositDetectedTimestamp === null) {\n return false;\n }\n\n if (input.expiryTimestamp === null) {\n return false;\n }\n\n return input.expiryTimestamp <= getCurrentUnixTimestampSeconds();\n}\n\nfunction getCurrentUnixTimestampSeconds(): bigint {\n return BigInt(Math.floor(Date.now() / MILLISECONDS_PER_SECOND));\n}\n\nfunction deriveDepositExpiryTimestamp(\n input: DeriveDepositExpiryTimestampInput\n): bigint | null {\n if (input.depositDetectedTimestamp === null) {\n return null;\n }\n\n return input.depositDetectedTimestamp + input.depositWindowSeconds;\n}\n\nfunction validateCreateRequest(request: CreateSimpleLoanRequest): void {\n getSimpleLoanAssetIdentifier(\n request.borrow.asset,\n request.borrow.chain,\n \"borrow\"\n );\n getSimpleLoanAssetIdentifier(\n request.collateral.asset,\n request.refund.chain,\n \"refund\"\n );\n\n if (request.collateral.amount <= 0n) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n \"Simple loan collateral amount must be greater than zero\"\n );\n }\n if (request.borrow.amount <= 0n) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n \"Simple loan borrow amount must be greater than zero\"\n );\n }\n if (request.ltvMaxBps <= 0n) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n \"Simple loan max LTV must be greater than zero\"\n );\n }\n if (request.depositWindowSeconds <= 0n) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n \"Simple loan deposit window must be greater than zero seconds\"\n );\n }\n}\n\nfunction throwLtvCalculationError(\n error: LtvCalculationErrorDetails | undefined\n): never {\n throw new LiquidiumError(\n error?.code === QuoteValidationErrorCode.POOL_NOT_FOUND\n ? LiquidiumErrorCode.POOL_NOT_FOUND\n : LiquidiumErrorCode.VALIDATION_ERROR,\n error?.message ?? \"Unable to calculate simple loan LTV\"\n );\n}\n\nfunction inferSimpleLoanDeliveryChain(\n destination: SimpleLoanAccount,\n asset: SimpleLoanAsset\n): Chain {\n if (destination.type !== \"ChainAddress\") {\n return CoreChain.ICP;\n }\n\n if (asset === CoreAsset.BTC) {\n return CoreChain.BTC;\n }\n\n if (asset === CoreAsset.USDC || asset === CoreAsset.USDT) {\n return CoreChain.ETH;\n }\n\n return CoreChain.ICP;\n}\n\nfunction resolveSimpleLoanDestination(\n params: ResolveSimpleLoanDestinationParams\n): SimpleLoanApiAccountType {\n getSimpleLoanAssetIdentifier(params.asset, params.chain, params.role);\n\n if (typeof params.destination === \"string\") {\n return resolveSimpleLoanStringDestination({\n destination: params.destination,\n asset: params.asset,\n role: params.role,\n chain: params.chain,\n normalizeExternalDestination: params.normalizeExternalDestination,\n });\n }\n\n assertSimpleLoanDestinationTypeMatchesChain({\n destinationType: params.destination.type,\n asset: params.asset,\n role: params.role,\n chain: params.chain,\n });\n\n switch (params.destination.type) {\n case \"ChainAddress\":\n assertExternalSimpleLoanDestinationSupported(params.asset);\n\n return {\n External: params.normalizeExternalDestination(\n normalizeSimpleLoanDestinationAddress(params.destination.address),\n params.asset,\n params.chain\n ),\n };\n case \"IcPrincipal\":\n return {\n Native: normalizeSimpleLoanPrincipal(\n normalizeSimpleLoanDestinationAddress(params.destination.address)\n ),\n };\n case \"IcpAccountIdentifier\":\n return parseAccountIdentifierSimpleLoanDestination(\n normalizeSimpleLoanDestinationAddress(params.destination.address)\n );\n case \"IcrcAccount\":\n return parseIcrcSimpleLoanDestination(\n normalizeSimpleLoanDestinationAddress(params.destination.address)\n );\n }\n}\n\nfunction resolveSimpleLoanStringDestination(params: {\n destination: string;\n asset: SimpleLoanAsset;\n role: SimpleLoanOutflowRole;\n chain: Chain;\n normalizeExternalDestination: ExternalDestinationNormalizer;\n}): SimpleLoanApiAccountType {\n const address = normalizeSimpleLoanDestinationAddress(params.destination);\n\n if (params.chain === CoreChain.ICP && params.asset !== CoreAsset.ICP) {\n try {\n return parsePrincipalSimpleLoanDestination(address);\n } catch {\n throwInvalidCkSimpleLoanDestination(params.role);\n }\n }\n\n if (params.chain !== CoreChain.ICP) {\n assertExternalSimpleLoanDestinationSupported(params.asset);\n\n return {\n External: params.normalizeExternalDestination(\n address,\n params.asset,\n params.chain\n ),\n };\n }\n\n for (const parser of [\n parseAccountIdentifierSimpleLoanDestination,\n parsePrincipalSimpleLoanDestination,\n parseIcrcSimpleLoanDestination,\n ]) {\n try {\n return parser(address);\n } catch {}\n }\n\n throwInvalidIcpSimpleLoanDestination();\n}\n\nfunction getSimpleLoanAssetIdentifier(\n asset: SimpleLoanAsset,\n chain: Chain,\n role: SimpleLoanOutflowRole\n): AssetIdentifier {\n const identifier = { asset, chain };\n if (isAssetIdentifier(identifier)) {\n return identifier;\n }\n\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n `${chain} simple loan ${role} delivery is not supported for ${asset}`\n );\n}\n\nfunction assertSimpleLoanDestinationTypeMatchesChain(params: {\n destinationType: Exclude<SimpleLoanDestination, string>[\"type\"];\n asset: SimpleLoanAsset;\n role: SimpleLoanOutflowRole;\n chain: Chain;\n}): void {\n if (params.chain === CoreChain.ICP && params.asset !== CoreAsset.ICP) {\n if (params.destinationType === \"IcPrincipal\") {\n return;\n }\n\n throwInvalidCkSimpleLoanDestination(params.role);\n }\n\n if (params.chain === CoreChain.ICP && params.asset === CoreAsset.ICP) {\n if (params.destinationType !== \"ChainAddress\") {\n return;\n }\n\n throwInvalidIcpSimpleLoanDestination();\n }\n\n if (params.destinationType === \"ChainAddress\") {\n return;\n }\n\n if (params.destinationType === \"IcPrincipal\") {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n `${params.chain} simple loan ${params.role} destination must be an external chain address for ${params.asset}`\n );\n }\n\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n `${params.asset} simple loan ${params.role} destination only supports ChainAddress or IcPrincipal destinations`\n );\n}\n\nfunction throwInvalidCkSimpleLoanDestination(\n role: SimpleLoanOutflowRole\n): never {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n `ICP simple loan ${role} destination must be an IC principal`\n );\n}\n\nfunction assertExternalSimpleLoanDestinationSupported(\n asset: SimpleLoanAsset\n): void {\n if (asset !== CoreAsset.ICP) {\n return;\n }\n\n throwInvalidIcpSimpleLoanDestination();\n}\n\nfunction throwInvalidIcpSimpleLoanDestination(): never {\n throw new LiquidiumError(\n LiquidiumErrorCode.INVALID_ADDRESS,\n \"ICP simple loan destination must be an IC principal, ICP account identifier, or ICRC account\"\n );\n}\n\nfunction parsePrincipalSimpleLoanDestination(\n address: string\n): SimpleLoanApiAccountType {\n return { Native: normalizeSimpleLoanPrincipal(address) };\n}\n\nfunction parseAccountIdentifierSimpleLoanDestination(\n address: string\n): SimpleLoanApiAccountType {\n if (address.length !== ICP_ACCOUNT_IDENTIFIER_HEX_LENGTH) {\n throw new LiquidiumError(\n LiquidiumErrorCode.INVALID_ADDRESS,\n \"Invalid ICP account identifier\"\n );\n }\n\n try {\n return { AccountIdentifier: normalizeIcpAccountIdentifier(address) };\n } catch {\n throw new LiquidiumError(\n LiquidiumErrorCode.INVALID_ADDRESS,\n \"Invalid ICP account identifier\"\n );\n }\n}\n\nfunction parseIcrcSimpleLoanDestination(\n address: string\n): SimpleLoanApiAccountType {\n let decoded: ReturnType<typeof decodeIcrcAccountAddress>;\n\n try {\n decoded = decodeIcrcAccountAddress(address);\n } catch {\n throw new LiquidiumError(\n LiquidiumErrorCode.INVALID_ADDRESS,\n \"Invalid simple loan ICRC destination\"\n );\n }\n\n return { Icrc: decoded.account.address };\n}\n\nfunction normalizeSimpleLoanPrincipal(address: string): string {\n try {\n return Principal.fromText(address).toText();\n } catch {\n throw new LiquidiumError(\n LiquidiumErrorCode.INVALID_ADDRESS,\n \"Invalid simple loan IC principal destination\"\n );\n }\n}\n\nfunction normalizeSimpleLoanDestinationAddress(address: string): string {\n const trimmedAddress = address.trim();\n\n if (!trimmedAddress) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n \"Simple loan account address must be non-empty\"\n );\n }\n\n return trimmedAddress;\n}\n\nfunction accountFromCanister(\n account: DecodedSimpleLoanCanisterRecord[\"borrow_destination\"]\n): SimpleLoanAccount {\n return mapCanisterAccountToLiquidiumAccount(account);\n}\n\nfunction mapSimpleLoanEvent(event: DecodedHeadlessLoanEvent): SimpleLoanEvent {\n return {\n id: event.id,\n schemaVersion: event.schema_version,\n timestamp: event.timestamp,\n eventType: mapSimpleLoanEventType(event.event_type),\n };\n}\n\nfunction mapSimpleLoanEventType(\n eventType: DecodedHeadlessLoanEventType\n): SimpleLoanEventType {\n if (\"LoanCreated\" in eventType) {\n const event = eventType.LoanCreated;\n return {\n type: \"LoanCreated\",\n loanId: event.loan_id,\n borrowDestination: accountFromCanister(event.borrow_destination),\n collateralAsset: parseSimpleLoanAsset(\n event.lend_asset,\n \"event collateral asset\"\n ),\n borrowAmount: event.borrow_amount,\n collateralPoolId: event.lend_pool_id.toText(),\n refundDestination: accountFromCanister(event.refund_destination),\n ltvMaxBps: event.ltv_max_bps,\n depositWindowSeconds: event.ltv_timer_s,\n profileId: event.lending_profile.toText(),\n borrowPoolId: event.borrow_pool_id.toText(),\n borrowAsset: parseSimpleLoanAsset(\n event.borrow_asset,\n \"event borrow asset\"\n ),\n };\n }\n\n if (\"FullLendWithdrawalRequested\" in eventType) {\n const event = eventType.FullLendWithdrawalRequested;\n return {\n type: \"FullLendWithdrawalRequested\",\n loanId: event.loan_id,\n account: accountFromCanister(event.account),\n poolId: event.pool_id.toText(),\n };\n }\n\n if (\"BorrowRequested\" in eventType) {\n const event = eventType.BorrowRequested;\n return {\n type: \"BorrowRequested\",\n loanId: event.loan_id,\n account: accountFromCanister(event.account),\n poolId: event.pool_id.toText(),\n amount: event.amount,\n };\n }\n\n if (\"DepositTimerExceeded\" in eventType) {\n return {\n type: \"DepositTimerExceeded\",\n loanId: eventType.DepositTimerExceeded.loan_id,\n };\n }\n\n if (\"StuckFundsWithdrawalRequested\" in eventType) {\n const event = eventType.StuckFundsWithdrawalRequested;\n return {\n type: \"StuckFundsWithdrawalRequested\",\n leg: legFromCanister(event.leg),\n loanId: event.loan_id,\n account: accountFromCanister(event.account),\n poolId: event.pool_id.toText(),\n amount: event.amount,\n };\n }\n\n if (\"ProfileWarmed\" in eventType) {\n const event = eventType.ProfileWarmed;\n return {\n type: \"ProfileWarmed\",\n derivationIndex: event.derivation_index,\n warmedProfileId: event.warmed_profile_id,\n ethAddress: event.eth_address,\n profileId: event.lending_profile.toText(),\n };\n }\n\n if (\"RepayComplete\" in eventType) {\n return {\n type: \"RepayComplete\",\n loanId: eventType.RepayComplete.loan_id,\n profileId: eventType.RepayComplete.lending_profile.toText(),\n };\n }\n\n return {\n type: \"DepositTimerStarted\",\n loanId: eventType.DepositTimerStarted.loan_id,\n timestamp: eventType.DepositTimerStarted.timestamp,\n };\n}\n\nfunction mapWarmedProfile(profile: WarmedProfile): SimpleLoanWarmedProfile {\n return {\n id: profile.id,\n authorization: authorizationFromCanister(profile.authorisation),\n createdAt: profile.created_at,\n profileId: profile.lending_profile.toText(),\n };\n}\n\nfunction authorizationFromCanister(\n authorization: SimpleLoanAuthorisation\n): SimpleLoanAuthorization {\n return {\n type: \"EthSignature\",\n derivationIndex: authorization.EthSignature.derivation_index,\n publicKey: authorization.EthSignature.pubkey,\n address: authorization.EthSignature.address,\n };\n}\n\nfunction legFromCanister(leg: SimpleLoanCanisterLeg): SimpleLoanLeg {\n return getVariantKey(leg) as SimpleLoanLeg;\n}\n\nfunction decodeRef(ref: string): bigint {\n try {\n return intFromPublicId(ref.trim());\n } catch (error) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n \"Invalid simple loan reference\",\n error\n );\n }\n}\n\nfunction validateSimpleLoanFindQuery(query: unknown): string {\n if (typeof query !== \"string\") {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n \"Simple loan find query must be a string\"\n );\n }\n\n const trimmedQuery = query.trim();\n if (!trimmedQuery) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n \"Simple loan find query must be non-empty\"\n );\n }\n if (trimmedQuery.length > SIMPLE_LOAN_FIND_QUERY_MAX_LENGTH) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n `Simple loan find query must be at most ${SIMPLE_LOAN_FIND_QUERY_MAX_LENGTH.toString()} characters`\n );\n }\n\n return trimmedQuery;\n}\n\nfunction uniqueSimpleLoanFindCandidates(\n candidates: SimpleLoanFindCandidate[]\n): SimpleLoanFindCandidate[] {\n const candidatesByLoanId = new Map<bigint, SimpleLoanFindCandidate>();\n\n for (const candidate of candidates) {\n if (!candidatesByLoanId.has(candidate.loanId)) {\n candidatesByLoanId.set(candidate.loanId, candidate);\n }\n }\n\n return [...candidatesByLoanId.values()];\n}\n\nfunction mapCandidateWire(\n wire: SimpleLoanFindCandidateWire\n): SimpleLoanFindCandidate {\n return {\n loanId: parseUnsignedApiBigint(wire.loan_id, {\n context: SIMPLE_LOAN_WIRE_CONTEXT,\n label: \"loan ID\",\n }),\n ref: parseNonEmptyApiString(wire.short_ref, {\n context: SIMPLE_LOAN_WIRE_CONTEXT,\n label: \"short reference\",\n }),\n createdAt: parseIsoApiTimestampToUnixSeconds(wire.created_at, {\n context: SIMPLE_LOAN_WIRE_CONTEXT,\n label: \"creation timestamp\",\n }),\n collateral: {\n poolId: parseNonEmptyApiString(wire.lend_pool_ic_id, {\n context: SIMPLE_LOAN_WIRE_CONTEXT,\n label: \"lend pool ID\",\n }),\n asset: parseApiStringUnion(wire.lend_asset, SIMPLE_LOAN_ASSETS, {\n context: SIMPLE_LOAN_WIRE_CONTEXT,\n label: \"lend asset\",\n }),\n amount: parseUnsignedApiBigint(wire.collateral_amount, {\n context: SIMPLE_LOAN_WIRE_CONTEXT,\n label: \"collateral amount\",\n }),\n },\n borrow: {\n poolId: parseNonEmptyApiString(wire.borrow_pool_ic_id, {\n context: SIMPLE_LOAN_WIRE_CONTEXT,\n label: \"borrow pool ID\",\n }),\n asset: parseApiStringUnion(wire.borrow_asset, SIMPLE_LOAN_ASSETS, {\n context: SIMPLE_LOAN_WIRE_CONTEXT,\n label: \"borrow asset\",\n }),\n },\n profileId: parseNonEmptyApiString(wire.profile, {\n context: SIMPLE_LOAN_WIRE_CONTEXT,\n label: \"profile ID\",\n }),\n };\n}\n\nfunction parseSimpleLoanAsset(value: string, label: string): SimpleLoanAsset {\n return parseApiStringUnion(value, SIMPLE_LOAN_ASSETS, {\n context: SIMPLE_LOAN_WIRE_CONTEXT,\n label,\n });\n}\n\nfunction mapSimpleLoansErrorToLiquidiumError(\n error: SimpleLoansCanisterError\n): LiquidiumError {\n const [key, payload] = Object.entries(error)[0] as [string, unknown];\n\n switch (key) {\n case \"LoanNotFound\":\n case \"NoCollateralPosition\":\n return new LiquidiumError(\n LiquidiumErrorCode.POSITION_NOT_FOUND,\n stringifyErrorPayload(payload)\n );\n case \"LtvMaxExceeded\":\n case \"LtvMaxOutOfRange\":\n return new LiquidiumError(\n LiquidiumErrorCode.MAX_LTV_EXCEEDED,\n stringifyErrorPayload(payload)\n );\n case \"LtvTimerOutOfRange\":\n case \"InvalidLtvTimerS\":\n return new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n stringifyErrorPayload(payload) ?? key\n );\n case \"AccountRequired\":\n return new LiquidiumError(\n LiquidiumErrorCode.INVALID_ADDRESS,\n stringifyErrorPayload(payload)\n );\n case \"BorrowAmountRequired\":\n return new LiquidiumError(\n LiquidiumErrorCode.BORROW_CAP_EXCEEDED,\n stringifyErrorPayload(payload)\n );\n case \"AuthorizationFailed\":\n case \"UnauthorizedAccessListCaller\":\n return new LiquidiumError(\n LiquidiumErrorCode.NOT_ALLOWED,\n stringifyErrorPayload(payload)\n );\n default:\n return new LiquidiumError(\n LiquidiumErrorCode.INTERNAL,\n stringifyErrorPayload(payload) ?? key\n );\n }\n}\n\nfunction stringifyErrorPayload(payload: unknown): string | undefined {\n if (payload === null || payload === undefined) return undefined;\n if (typeof payload === \"string\") return payload;\n\n return JSON.stringify(payload, (_key, value) => {\n if (typeof value === \"bigint\") return value.toString();\n if (value && typeof value === \"object\" && \"toText\" in value) {\n return (value as { toText: () => string }).toText();\n }\n\n return value;\n });\n}\n\nfunction formatBpsAsPercent(value: bigint): string {\n const sign = value < 0n ? \"-\" : \"\";\n const absoluteValue = value < 0n ? -value : value;\n const wholePart = absoluteValue / 100n;\n const fractionalPart = (absoluteValue % 100n).toString().padStart(2, \"0\");\n\n return `${sign}${wholePart.toString()}.${fractionalPart}%`;\n}\n","import { createPublicClient, http } from \"viem\";\nimport { mainnet } from \"viem/chains\";\nimport {\n DEFAULT_API_BASE_URL,\n DEFAULT_ENVIRONMENT,\n DEFAULT_TIMEOUT_MS,\n resolveCanisterIds,\n} from \"./core/config\";\nimport type { ApiClient } from \"./core/transports/api-client\";\nimport { createApiClient } from \"./core/transports/api-client\";\nimport type { CanisterContext } from \"./core/transports/canister-context\";\nimport { createCanisterContext } from \"./core/transports/canister-context\";\nimport type { EvmReadClient, LiquidiumClientConfig } from \"./core/types\";\nimport { AccountsModule } from \"./modules/accounts\";\nimport { ActivitiesModule } from \"./modules/activities\";\nimport { HistoryModule } from \"./modules/history\";\nimport { LendingModule } from \"./modules/lending\";\nimport { MarketModule } from \"./modules/market\";\nimport { PositionsModule } from \"./modules/positions\";\nimport { QuoteModule } from \"./modules/quote\";\nimport { SimpleLoansModule } from \"./modules/simple-loans\";\n\n/**\n * Root client for Liquidium protocol integration (canister + optional HTTP API).\n *\n * Construct with `new LiquidiumClient(config)`.\n */\nexport class LiquidiumClient {\n /** Profile lifecycle: create, resolve, linked wallets. */\n readonly accounts: AccountsModule;\n /** Borrow, withdraw, supply, inflow reporting and tracking. */\n readonly lending: LendingModule;\n /** Per-pool positions, health, aggregate stats. */\n readonly positions: PositionsModule;\n /** Pool list, prices, pool rate lookups. */\n readonly market: MarketModule;\n /** Receipt-oriented activity status and activity lists. */\n readonly activities: ActivitiesModule;\n /** Pool and user history through the Liquidium SDK API. */\n readonly history: HistoryModule;\n /** Accountless Simple Loans backed by generated deposit/repay targets. */\n readonly simpleLoans: SimpleLoansModule;\n /** Pure quote helpers from market inputs. */\n readonly quote: QuoteModule;\n\n private readonly canisterContext: CanisterContext;\n private readonly apiClient: ApiClient | undefined;\n private readonly evmReadClient: EvmReadClient | undefined;\n\n /**\n * Creates a Liquidium SDK client.\n *\n * @param config - Runtime transport, canister, API, identity, and EVM read options.\n */\n constructor(config: LiquidiumClientConfig = {}) {\n const environment = config.environment ?? DEFAULT_ENVIRONMENT;\n const canisterIds = resolveCanisterIds(environment, config.canisterIds);\n const timeoutMs = config.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n this.canisterContext = createCanisterContext({\n icHost: config.icHost,\n identity: config.identity,\n canisterIds,\n });\n\n this.apiClient = createApiClient({\n baseUrl: config.apiBaseUrl ?? DEFAULT_API_BASE_URL,\n headers: config.headers,\n fetchFn: config.fetch,\n timeoutMs,\n });\n\n this.evmReadClient = resolveEvmReadClient(config);\n\n this.accounts = new AccountsModule(this.canisterContext);\n this.lending = new LendingModule(\n this.canisterContext,\n this.apiClient,\n this.evmReadClient\n );\n this.market = new MarketModule(this.canisterContext);\n this.positions = new PositionsModule(this.canisterContext, this.market);\n this.activities = new ActivitiesModule(\n this.apiClient,\n this.canisterContext\n );\n this.history = new HistoryModule(this.apiClient);\n this.simpleLoans = new SimpleLoansModule(\n this.canisterContext,\n this.apiClient,\n this.activities,\n this.lending,\n this.positions\n );\n this.quote = new QuoteModule();\n }\n}\n\nfunction resolveEvmReadClient(\n config: LiquidiumClientConfig\n): EvmReadClient | undefined {\n if (config.evmPublicClient) {\n return config.evmPublicClient;\n }\n\n if (!config.evmRpcUrl) {\n return undefined;\n }\n\n return createPublicClient({\n chain: mainnet,\n transport: http(config.evmRpcUrl, {\n fetchOptions: config.evmRpcHeaders\n ? { headers: config.evmRpcHeaders }\n : undefined,\n }),\n });\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/core/errors.ts","../src/core/types.ts","../src/core/config.ts","../src/core/transports/api-client.ts","../src/core/transports/canister-context.ts","../src/generated/canisters/lending/lending.did.js","../src/core/canisters/lending/actor.ts","../src/core/canisters/lending/error-mappers.ts","../src/core/evm.ts","../src/core/utils/time.ts","../src/core/utils/variant.ts","../src/core/wallet-actions.ts","../src/execute.ts","../src/core/utils/signature.ts","../src/modules/accounts/mappers.ts","../src/modules/accounts/accounts.ts","../src/core/utils/variant-tags.ts","../src/core/canisters/simple-loans/flexible-actor.ts","../src/core/sdk-api-paths.ts","../src/core/utils/bigint.ts","../src/modules/simple-loans/ref-code.ts","../src/modules/activities/types.ts","../src/modules/activities/activities.ts","../src/modules/history/history.ts","../src/core/utils/inflow-subaccount.ts","../src/modules/lending/evm-transactions.ts","../src/core/borrow-minimums.ts","../src/core/canisters/icrc/ledger.ts","../src/core/canisters/ckbtc/ledger.ts","../src/generated/canisters/ck-btc-minter/declaration.js","../src/core/canisters/ckbtc/minter.ts","../src/generated/canisters/deposit-accounts/deposit_accounts.did.js","../src/core/canisters/deposit-accounts/actor.ts","../src/core/canisters/lending/flexible-actor.ts","../src/core/canisters/lending/messages.ts","../src/core/pool-ledger-assets.ts","../src/core/same-asset-borrowing.ts","../src/core/status.ts","../src/core/withdraw-minimums.ts","../src/core/accounts.ts","../src/modules/lending/types.ts","../src/modules/lending/_internal/supply-targets.ts","../src/modules/lending/_internal/inflow-fee-rounding.ts","../src/core/address-validation.ts","../src/core/utils/retry.ts","../src/modules/lending/_internal/supply-flow.ts","../src/modules/lending/mappers.ts","../src/modules/lending/lending.ts","../src/core/rates.ts","../src/core/utils/asset-decimals.ts","../src/modules/market/mappers.ts","../src/modules/market/market.ts","../src/modules/positions/mappers.ts","../src/modules/positions/positions.ts","../src/modules/quote/types.ts","../src/modules/quote/quote.ts","../src/core/utils/api-response-parsers.ts","../src/modules/simple-loans/_internal/address-validation.ts","../src/modules/simple-loans/simple-loans.ts","../src/client.ts"],"names":["agent","HttpAgent","OutflowType","Actor","isAddress","getAddress","isHex","encodeBytesToHex","base64","base64nopad","Principal","idlLabelToId","encodeFunctionData","encodeIcrcAccount","idlFactory","decodeIcrcAccountText","AccountIdentifier","SubAccount","subaccount","validateBitcoinAddress","BitcoinAddressNetwork","isEthStablecoin","principal","QuoteValidationErrorCode","QuoteWarningCode","MILLISECONDS_PER_SECOND","RATE_SCALE","formatBpsAsPercent","createPublicClient","mainnet","http"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Stable string codes for {@link LiquidiumError}. Use for branching in application code.\n */\nexport const LiquidiumErrorCode = {\n // Protocol errors\n INVALID_TARGET_PRINCIPAL: \"INVALID_TARGET_PRINCIPAL\",\n INSUFFICIENT_COLLATERAL: \"INSUFFICIENT_COLLATERAL\",\n SIGNATURE_EXPIRY_TOO_FAR_IN_FUTURE: \"SIGNATURE_EXPIRY_TOO_FAR_IN_FUTURE\",\n MAX_LTV_EXCEEDED: \"MAX_LTV_EXCEEDED\",\n SIGNATURE_EXPIRED: \"SIGNATURE_EXPIRED\",\n ACCOUNT_ALREADY_LINKED: \"ACCOUNT_ALREADY_LINKED\",\n ACCOUNT_NOT_FOUND: \"ACCOUNT_NOT_FOUND\",\n CANNOT_REMOVE_SOLE_ACCOUNT: \"CANNOT_REMOVE_SOLE_ACCOUNT\",\n PROFILE_NOT_FOUND: \"PROFILE_NOT_FOUND\",\n PROFILE_ALREADY_EXISTS: \"PROFILE_ALREADY_EXISTS\",\n SIGNATURE_ERROR: \"SIGNATURE_ERROR\",\n POOL_NOT_FOUND: \"POOL_NOT_FOUND\",\n POOL_FROZEN: \"POOL_FROZEN\",\n POSITION_NOT_FOUND: \"POSITION_NOT_FOUND\",\n BORROW_CAP_EXCEEDED: \"BORROW_CAP_EXCEEDED\",\n SUPPLY_CAP_EXCEEDED: \"SUPPLY_CAP_EXCEEDED\",\n INSUFFICIENT_FUNDS: \"INSUFFICIENT_FUNDS\",\n HEALTH_FACTOR_TOO_LOW: \"HEALTH_FACTOR_TOO_LOW\",\n TRANSFER_FAILED: \"TRANSFER_FAILED\",\n LIQUIDATION_NOT_FOUND: \"LIQUIDATION_NOT_FOUND\",\n BORROWING_DISABLED: \"BORROWING_DISABLED\",\n NO_LIQUIDITY: \"NO_LIQUIDITY\",\n NOT_ALLOWED: \"NOT_ALLOWED\",\n\n // Signature verification\n INVALID_ETH_SIGNATURE: \"INVALID_ETH_SIGNATURE\",\n INVALID_BTC_SIGNATURE: \"INVALID_BTC_SIGNATURE\",\n INVALID_ETH_ADDRESS: \"INVALID_ETH_ADDRESS\",\n UNSUPPORTED_CHAIN: \"UNSUPPORTED_CHAIN\",\n\n // Client-side\n WITHDRAW_TOO_LOW: \"WITHDRAW_TOO_LOW\",\n REPAYMENT_EXCEEDS_DEBT: \"REPAYMENT_EXCEEDS_DEBT\",\n INVALID_ADDRESS: \"INVALID_ADDRESS\",\n DEPOSIT_ADDRESS_ERROR: \"DEPOSIT_ADDRESS_ERROR\",\n\n // Transport\n NETWORK_ERROR: \"NETWORK_ERROR\",\n SERVICE_UNAVAILABLE: \"SERVICE_UNAVAILABLE\",\n REQUEST_TIMEOUT: \"REQUEST_TIMEOUT\",\n CANISTER_REJECTED: \"CANISTER_REJECTED\",\n\n // Catch-all\n INTERNAL: \"INTERNAL\",\n VALIDATION_ERROR: \"VALIDATION_ERROR\",\n} as const;\n\nexport type LiquidiumErrorCode =\n (typeof LiquidiumErrorCode)[keyof typeof LiquidiumErrorCode];\n\n/** Optional debug identifiers attached to mapped SDK errors. */\nexport interface LiquidiumErrorContext {\n /** Backend trace id for support/debugging when available. */\n traceId?: string;\n /** SDK API request id for support/debugging when available. */\n requestId?: string;\n}\n\n/**\n * Typed error from the SDK or mapped protocol failures.\n *\n * Prefer checking `code` over parsing `message`.\n */\nexport class LiquidiumError extends Error {\n /** Machine-readable reason; compare to {@link LiquidiumErrorCode} values. */\n readonly code: LiquidiumErrorCode;\n /** Original error when the SDK wraps an underlying failure. */\n override readonly cause?: unknown;\n /** Backend trace id for support/debugging when available. */\n readonly traceId?: string;\n /** SDK API request id for support/debugging when available. */\n readonly requestId?: string;\n\n /**\n * @param code - Error code from {@link LiquidiumErrorCode}.\n * @param message - Human-readable detail (defaults to `code` when omitted).\n * @param cause - Optional underlying error.\n * @param context - Optional backend debug identifiers.\n */\n constructor(\n code: LiquidiumErrorCode,\n message?: string,\n cause?: unknown,\n context?: LiquidiumErrorContext\n ) {\n super(message ?? code);\n this.name = \"LiquidiumError\";\n this.code = code;\n this.cause = cause;\n this.traceId = context?.traceId;\n this.requestId = context?.requestId;\n }\n}\n","import type { Identity } from \"@icp-sdk/core/agent\";\nimport type { PublicClient } from \"viem\";\n\n/** Minimal viem-compatible client shape required for SDK EVM read calls. */\nexport type EvmReadClient = Pick<PublicClient, \"readContract\">;\n\n/**\n * Runtime options for `new LiquidiumClient(config)`.\n *\n * Canister-backed reads and SDK HTTP features work with `{}` defaults. Set\n * `apiBaseUrl` only when overriding the Liquidium production API root.\n */\nexport interface LiquidiumClientConfig {\n /** Preset canister IDs. Only `mainnet` is bundled. */\n environment?: Environment;\n /** ICP replica host override (defaults follow `@icp-sdk/core/agent`). */\n icHost?: string;\n /** Agent identity for signed canister calls. */\n identity?: Identity;\n /**\n * Base URL for the Liquidium SDK HTTP API root (e.g. `https://app.example.com/api/sdk`).\n * Defaults to the Liquidium production API root. Endpoint versions are owned\n * by this SDK package version.\n */\n apiBaseUrl?: string;\n /** Extra headers sent with every SDK API request. */\n headers?: Record<string, string>;\n /** Override individual canister principals for custom deployments. */\n canisterIds?: CanisterIdOverrides;\n /** Custom `fetch` implementation for SDK API requests. */\n fetch?: typeof fetch;\n /** Per-request timeout for SDK API calls in milliseconds. */\n timeoutMs?: number;\n /** Ethereum RPC URL used for public ERC-20 reads in EVM supply flows. */\n evmRpcUrl?: string;\n /** Optional headers for RPC providers that authenticate via HTTP headers. */\n evmRpcHeaders?: Record<string, string>;\n /** Existing viem public client or compatible read client for EVM reads. */\n evmPublicClient?: EvmReadClient;\n}\n\n/** Pool canister principal text values grouped by pool asset. */\nexport interface PoolCanisterIds {\n /** BTC pool canister principal. */\n btc: string;\n /** USDT pool canister principal. */\n usdt: string;\n /** USDC pool canister principal. */\n usdc: string;\n /** ICP pool canister principal. */\n icp: string;\n}\n\n/** Principal text values for canisters used by the client. */\nexport interface CanisterIds {\n /** Liquidium lending canister principal. */\n lending: string;\n /** Pool canister principals grouped by pool asset. */\n pools: PoolCanisterIds;\n /** ckETH minter deposit helper canister principal. */\n ethDeposit: string;\n /** Accountless Simple Loans canister principal. */\n simpleLoans: string;\n}\n\n/** Custom canister principal overrides accepted by client configuration. */\nexport type CanisterIdOverrides = Omit<Partial<CanisterIds>, \"pools\"> & {\n /** Partial grouped pool canister principal overrides. */\n pools?: Partial<PoolCanisterIds>;\n};\n\n/** Supported deployment environments with bundled canister ids. */\nexport const Environment = {\n mainnet: \"mainnet\",\n} as const;\n/** Supported deployment environment name. */\nexport type Environment = (typeof Environment)[keyof typeof Environment];\n\n/** Canonical asset symbols supported by state-mutating protocol flows. */\nexport const Asset = {\n BTC: \"BTC\",\n ICP: \"ICP\",\n USDC: \"USDC\",\n USDT: \"USDT\",\n} as const;\n/** Canonical asset symbol supported by state-mutating protocol flows. */\nexport type Asset = (typeof Asset)[keyof typeof Asset];\n\n/** Canonical chain identifiers used by wallet and protocol actions. */\nexport const Chain = {\n BTC: \"BTC\",\n ETH: \"ETH\",\n ICP: \"ICP\",\n} as const;\n/** Canonical chain identifier used by wallet and protocol actions. */\nexport type Chain = (typeof Chain)[keyof typeof Chain];\n\n/** Chains whose wallets can authorize Liquidium protocol actions. */\nexport type SigningChain = typeof Chain.BTC | typeof Chain.ETH;\n\n/** Supported asset and transfer-chain combinations. */\nexport type AssetIdentifier =\n | { chain: typeof Chain.BTC; asset: typeof Asset.BTC }\n | { chain: typeof Chain.ETH; asset: typeof Asset.USDC }\n | { chain: typeof Chain.ETH; asset: typeof Asset.USDT }\n | { chain: typeof Chain.ICP; asset: typeof Asset.BTC }\n | { chain: typeof Chain.ICP; asset: typeof Asset.ICP }\n | { chain: typeof Chain.ICP; asset: typeof Asset.USDC }\n | { chain: typeof Chain.ICP; asset: typeof Asset.USDT };\n\n/** Returns whether an asset and chain form a supported SDK identifier. */\nexport function isAssetIdentifier(identifier: {\n chain: string;\n asset: string;\n}): identifier is AssetIdentifier {\n switch (identifier.chain) {\n case Chain.BTC:\n return identifier.asset === Asset.BTC;\n case Chain.ETH:\n return identifier.asset === Asset.USDC || identifier.asset === Asset.USDT;\n case Chain.ICP:\n return (\n identifier.asset === Asset.BTC ||\n identifier.asset === Asset.ICP ||\n identifier.asset === Asset.USDC ||\n identifier.asset === Asset.USDT\n );\n default:\n return false;\n }\n}\n\n/** Inflow operation performed by a supply target. */\nexport const SupplyAction = {\n deposit: \"deposit\",\n repayment: \"repayment\",\n} as const;\n/** Inflow operation performed by a supply target. */\nexport type SupplyAction = (typeof SupplyAction)[keyof typeof SupplyAction];\n\n/** Outflow operation reported by the lending canister. */\nexport const OutflowType = {\n borrow: \"borrow\",\n feeClaim: \"feeClaim\",\n withdrawal: \"withdrawal\",\n} as const;\n/** Outflow operation reported by the lending canister. */\nexport type OutflowType = (typeof OutflowType)[keyof typeof OutflowType];\n\n/** Wallet address and chain pair linked to a Liquidium profile. */\nexport interface Wallet {\n /** Chain where the wallet address is valid. */\n chain: SigningChain;\n /** Wallet address as stored by the protocol. */\n address: string;\n}\n","import { LiquidiumError, LiquidiumErrorCode } from \"./errors\";\nimport {\n type CanisterIdOverrides,\n type CanisterIds,\n Environment,\n} from \"./types\";\n\nconst MAINNET_HOST = \"https://icp-api.io\";\nexport const DEFAULT_API_BASE_URL = \"https://app.liquidium.fi/api/sdk\";\nexport const DEFAULT_ENVIRONMENT: Environment = Environment.mainnet;\n\nconst MAINNET_CANISTER_IDS: CanisterIds = {\n lending: \"hyk4r-jqaaa-aaaar-qb4ca-cai\",\n pools: {\n btc: \"hkmli-faaaa-aaaar-qb4ba-cai\",\n usdt: \"hnnn4-iyaaa-aaaar-qb4bq-cai\",\n usdc: \"6sna2-oiaaa-aaaar-qb66q-cai\",\n icp: \"r2pk3-4yaaa-aaaar-qb7zq-cai\",\n },\n ethDeposit: \"z5jz7-nyaaa-aaaar-qb6pq-cai\",\n simpleLoans: \"u5rm3-niaaa-aaaar-qb7eq-cai\",\n};\n\nconst CANISTER_IDS_BY_ENVIRONMENT: Record<Environment, CanisterIds> = {\n mainnet: MAINNET_CANISTER_IDS,\n};\n\nconst SUPPORTED_CANISTER_ID_OVERRIDE_KEYS = new Set([\n \"lending\",\n \"pools\",\n \"ethDeposit\",\n \"simpleLoans\",\n]);\nconst SUPPORTED_POOL_CANISTER_ID_OVERRIDE_KEYS = new Set([\n \"btc\",\n \"usdt\",\n \"usdc\",\n \"icp\",\n]);\n\nexport function resolveHost(override?: string): string {\n return override ?? MAINNET_HOST;\n}\n\n/** Resolves environment canister ids with optional per-canister overrides. */\nexport function resolveCanisterIds(\n environment: Environment = DEFAULT_ENVIRONMENT,\n overrides?: CanisterIdOverrides\n): CanisterIds {\n const defaults = CANISTER_IDS_BY_ENVIRONMENT[environment];\n validateCanisterIdOverrides(overrides);\n\n const pools = {\n ...defaults.pools,\n ...overrides?.pools,\n };\n\n return {\n lending: overrides?.lending ?? defaults.lending,\n pools,\n ethDeposit: overrides?.ethDeposit ?? defaults.ethDeposit,\n simpleLoans: overrides?.simpleLoans ?? defaults.simpleLoans,\n };\n}\n\nfunction validateCanisterIdOverrides(overrides?: CanisterIdOverrides): void {\n if (!overrides) {\n return;\n }\n\n for (const key of Object.keys(overrides)) {\n if (!SUPPORTED_CANISTER_ID_OVERRIDE_KEYS.has(key)) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n `Unsupported canisterIds override: ${key}`\n );\n }\n }\n\n if (!overrides.pools) {\n return;\n }\n\n for (const key of Object.keys(overrides.pools)) {\n if (!SUPPORTED_POOL_CANISTER_ID_OVERRIDE_KEYS.has(key)) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n `Unsupported canisterIds.pools override: ${key}`\n );\n }\n }\n}\n\nexport const DEFAULT_TIMEOUT_MS = 30_000;\n\n/** Mainnet chain-key asset and ICP helper canister principals. */\nexport const CK_CANISTER_IDS = {\n BTC: {\n minter: \"mqygn-kiaaa-aaaar-qaadq-cai\",\n ledger: \"mxzaz-hqaaa-aaaar-qaada-cai\",\n index: \"n5wcd-faaaa-aaaar-qaaea-cai\",\n archive: \"nbsys-saaaa-aaaar-qaaga-cai\",\n },\n USDT: {\n ledger: \"cngnf-vqaaa-aaaar-qag4q-cai\",\n index: \"cefgz-dyaaa-aaaar-qag5a-cai\",\n },\n USDC: {\n ledger: \"xevnm-gaaaa-aaaar-qafnq-cai\",\n index: \"xrs4b-hiaaa-aaaar-qafoa-cai\",\n },\n ICP: {\n ledger: \"ryjl3-tyaaa-aaaaa-aaaba-cai\",\n index: \"qhbym-qaaaa-aaaaa-aaafq-cai\",\n },\n} as const;\n","import { LiquidiumError, LiquidiumErrorCode } from \"../errors\";\n\nconst DOM_EXCEPTION_ABORT_ERROR_NAME = \"AbortError\";\nconst HTTP_HEADER_CONTENT_TYPE = \"content-type\";\nconst HTTP_HEADER_REQUEST_ID = \"x-request-id\";\nconst HTTP_HEADER_TRACE_ID = \"x-trace-id\";\nconst HTTP_METHOD_GET = \"GET\";\nconst HTTP_METHOD_POST = \"POST\";\nconst MIME_TYPE_APPLICATION_JSON = \"application/json\";\n\nexport interface ApiClient {\n get<T>(path: string): Promise<T>;\n post<TResponse, TBody>(path: string, body: TBody): Promise<TResponse>;\n}\n\ninterface CreateApiClientOptions {\n baseUrl: string;\n headers?: Record<string, string>;\n timeoutMs: number;\n fetchFn?: typeof fetch;\n}\n\ninterface SendRequestOptions {\n baseUrl: string;\n fetchFn?: typeof fetch;\n headers?: Record<string, string>;\n timeoutMs: number;\n}\n\ninterface ApiRequest {\n path: string;\n method: typeof HTTP_METHOD_GET | typeof HTTP_METHOD_POST;\n body?: unknown;\n}\n\ninterface ResponseErrorContext {\n traceId?: string;\n requestId?: string;\n}\n\ninterface JsonErrorPayload {\n message?: unknown;\n}\n\nexport function createApiClient(opts: CreateApiClientOptions): ApiClient {\n const normalizedOpts = {\n ...opts,\n baseUrl: normalizeBaseUrl(opts.baseUrl),\n };\n\n return {\n async get<T>(path: string): Promise<T> {\n return await sendRequest<T>(normalizedOpts, {\n path,\n method: HTTP_METHOD_GET,\n });\n },\n async post<TResponse, TBody>(\n path: string,\n body: TBody\n ): Promise<TResponse> {\n return await sendRequest<TResponse>(normalizedOpts, {\n path,\n method: HTTP_METHOD_POST,\n body,\n });\n },\n };\n}\n\nfunction normalizeBaseUrl(baseUrl: string): string {\n return baseUrl.replace(/\\/+$/, \"\");\n}\n\nasync function sendRequest<TResponse>(\n opts: SendRequestOptions,\n request: ApiRequest\n): Promise<TResponse> {\n const url = `${opts.baseUrl}${request.path}`;\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), opts.timeoutMs);\n const fetchFn = opts.fetchFn ?? fetch;\n const requestHeaders = {\n ...opts.headers,\n ...(request.method === HTTP_METHOD_POST\n ? {\n [HTTP_HEADER_CONTENT_TYPE]: MIME_TYPE_APPLICATION_JSON,\n }\n : {}),\n };\n\n try {\n const response = await fetchFn(url, {\n method: request.method,\n headers:\n Object.keys(requestHeaders).length > 0 ? requestHeaders : undefined,\n body:\n request.method === HTTP_METHOD_POST\n ? JSON.stringify(request.body)\n : undefined,\n signal: controller.signal,\n });\n\n if (!response.ok) {\n const payload = await tryParseJson(response);\n const errorContext = getResponseErrorContext(response);\n const message =\n getErrorMessage(payload) ??\n `API request failed: ${response.status} ${response.statusText}`;\n\n throw new LiquidiumError(\n LiquidiumErrorCode.SERVICE_UNAVAILABLE,\n appendErrorContext(message, errorContext),\n undefined,\n errorContext\n );\n }\n\n return (await response.json()) as TResponse;\n } catch (error) {\n if (error instanceof LiquidiumError) {\n throw error;\n }\n\n if (\n error instanceof DOMException &&\n error.name === DOM_EXCEPTION_ABORT_ERROR_NAME\n ) {\n throw new LiquidiumError(\n LiquidiumErrorCode.REQUEST_TIMEOUT,\n `Request to ${request.path} timed out after ${opts.timeoutMs}ms`\n );\n }\n\n throw new LiquidiumError(\n LiquidiumErrorCode.NETWORK_ERROR,\n `Failed to reach API: ${String(error)}`,\n error\n );\n } finally {\n clearTimeout(timeout);\n }\n}\n\nasync function tryParseJson(response: Response): Promise<unknown> {\n try {\n return await response.json();\n } catch {\n return null;\n }\n}\n\nfunction getErrorMessage(payload: unknown): string | null {\n if (!payload || typeof payload !== \"object\") {\n return null;\n }\n\n const message = (payload as JsonErrorPayload).message;\n return typeof message === \"string\" && message.length > 0 ? message : null;\n}\n\nfunction getResponseErrorContext(response: Response): ResponseErrorContext {\n return {\n traceId: response.headers.get(HTTP_HEADER_TRACE_ID) ?? undefined,\n requestId: response.headers.get(HTTP_HEADER_REQUEST_ID) ?? undefined,\n };\n}\n\nfunction appendErrorContext(\n message: string,\n context: ResponseErrorContext\n): string {\n if (!context.traceId && !context.requestId) {\n return message;\n }\n\n const details = [\n context.traceId ? `traceId=${context.traceId}` : undefined,\n context.requestId ? `requestId=${context.requestId}` : undefined,\n ].filter((value): value is string => Boolean(value));\n\n return `${message} (${details.join(\", \")})`;\n}\n","import type { Identity } from \"@icp-sdk/core/agent\";\nimport { HttpAgent } from \"@icp-sdk/core/agent\";\nimport { resolveHost } from \"../config\";\nimport type { CanisterIds } from \"../types\";\n\nexport interface CanisterContext {\n agent: HttpAgent;\n canisterIds: CanisterIds;\n}\n\ninterface CreateCanisterContextOptions {\n icHost?: string;\n identity?: Identity;\n canisterIds: CanisterIds;\n}\n\nexport function createCanisterContext(\n opts: CreateCanisterContextOptions\n): CanisterContext {\n const host = resolveHost(opts.icHost);\n\n const agent = HttpAgent.createSync({\n host,\n identity: opts.identity,\n });\n\n return {\n agent,\n canisterIds: opts.canisterIds,\n };\n}\n","export const idlFactory = ({ IDL }) => {\n const Chains = IDL.Variant({\n 'BTC' : IDL.Null,\n 'ETH' : IDL.Null,\n 'ICP' : IDL.Null,\n 'SOL' : IDL.Null,\n });\n const WalletType = IDL.Variant({ 'Wallet' : Chains });\n const SignatureInfo = IDL.Record({\n 'signature' : IDL.Text,\n 'chain' : Chains,\n 'account' : IDL.Text,\n });\n const SignatureScheme = IDL.Variant({ 'Wallet' : SignatureInfo });\n const AddAccountRequest = IDL.Record({\n 'target_principal' : IDL.Principal,\n 'chain' : WalletType,\n 'wallet_signature' : SignatureScheme,\n 'expiry_timestamp' : IDL.Nat64,\n });\n const SignedRequest = IDL.Record({\n 'data' : AddAccountRequest,\n 'signature_info' : SignatureScheme,\n });\n const SignatureVerificationError = IDL.Variant({\n 'InvalidEthSignature' : IDL.Null,\n 'UnsupportedChain' : IDL.Null,\n 'InvalidSolSignature' : IDL.Null,\n 'InvalidEthAddress' : IDL.Null,\n 'CouldNotDecode' : IDL.Text,\n 'ProfileNotFound' : IDL.Null,\n 'InvalidBtcSignature' : IDL.Null,\n });\n const ProtocolError = IDL.Variant({\n 'PositionNotFound' : IDL.Null,\n 'Internal' : IDL.Text,\n 'InvalidAddress' : IDL.Text,\n 'InvalidTargetPrincipal' : IDL.Null,\n 'SignatureError' : SignatureVerificationError,\n 'SupplyCapExceeded' : IDL.Null,\n 'AccountNotFound' : IDL.Null,\n 'NotAllowed' : IDL.Text,\n 'PoolNotFound' : IDL.Text,\n 'FeeClaimReceiverNotConfigured' : IDL.Null,\n 'InsufficientCollateral' : IDL.Null,\n 'ProfileNotFound' : IDL.Null,\n 'SignatureExpiryTooFarInFuture' : IDL.Null,\n 'MaxLtvExceeded' : IDL.Null,\n 'ProfileAlreadyExists' : IDL.Null,\n 'LiquidationNotFound' : IDL.Text,\n 'HealthFactorTooLow' : IDL.Null,\n 'NoLiquidity' : IDL.Null,\n 'SignatureExpired' : IDL.Null,\n 'BorrowingDisabled' : IDL.Null,\n 'BorrowCapExceeded' : IDL.Null,\n 'PoolFrozen' : IDL.Null,\n 'TransferFailed' : IDL.Text,\n 'AccountAlreadyLinked' : IDL.Null,\n 'CannotRemoveSoleAccount' : IDL.Null,\n 'InsufficientFunds' : IDL.Null,\n });\n const Result = IDL.Variant({ 'Ok' : IDL.Null, 'Err' : ProtocolError });\n const IcrcAccount = IDL.Record({\n 'owner' : IDL.Principal,\n 'subaccount' : IDL.Opt(IDL.Vec(IDL.Nat8)),\n });\n const AccountType = IDL.Variant({\n 'Icrc' : IcrcAccount,\n 'Native' : IDL.Principal,\n 'AccountIdentifier' : IDL.Text,\n 'External' : IDL.Text,\n });\n const BorrowAssetRequest = IDL.Record({\n 'expiry_timestamp' : IDL.Nat64,\n 'account' : AccountType,\n 'pool_id' : IDL.Principal,\n 'amount' : IDL.Nat,\n });\n const SignedRequest_1 = IDL.Record({\n 'data' : BorrowAssetRequest,\n 'signature_info' : SignatureScheme,\n });\n const OutflowType = IDL.Variant({\n 'Withdraw' : IDL.Null,\n 'FeeClaim' : IDL.Null,\n 'Borrow' : IDL.Null,\n });\n const OutflowDetails = IDL.Record({\n 'id' : IDL.Text,\n 'txid' : IDL.Opt(IDL.Text),\n 'outflow_type' : OutflowType,\n 'outflow_ref' : IDL.Opt(IDL.Text),\n 'amount' : IDL.Nat,\n 'receiver' : AccountType,\n });\n const Result_1 = IDL.Variant({\n 'Ok' : OutflowDetails,\n 'Err' : ProtocolError,\n });\n const ClaimFeeRequest = IDL.Record({ 'pool_id' : IDL.Principal });\n const AssetType = IDL.Variant({\n 'CkAsset' : IDL.Principal,\n 'Unknown' : IDL.Null,\n });\n const Assets = IDL.Variant({\n 'BTC' : IDL.Null,\n 'ICP' : IDL.Null,\n 'SOL' : IDL.Null,\n 'USDC' : IDL.Null,\n 'USDT' : IDL.Null,\n });\n const LiquidatablePosition = IDL.Record({\n 'collateral_amount' : IDL.Nat,\n 'asset_type' : AssetType,\n 'debt_amount' : IDL.Nat,\n 'asset' : Assets,\n 'account' : IDL.Principal,\n 'pool_id' : IDL.Principal,\n 'protocol_fee' : IDL.Nat64,\n 'liquidation_bonus' : IDL.Nat64,\n 'liquidation_threshold' : IDL.Nat64,\n });\n const LiquidatableUser = IDL.Record({\n 'health_factor' : IDL.Nat,\n 'total_debt' : IDL.Nat,\n 'account' : IDL.Principal,\n 'positions' : IDL.Vec(LiquidatablePosition),\n 'weighted_liquidation_threshold' : IDL.Nat,\n });\n const RepaymentDetails = IDL.Record({\n 'id' : IDL.Text,\n 'txid' : IDL.Text,\n 'account' : IDL.Principal,\n 'timestamp' : IDL.Nat64,\n 'amount' : IDL.Nat,\n });\n const Wallet = IDL.Record({ 'chain' : WalletType, 'address' : IDL.Text });\n const ProfileCreatedEvent = IDL.Record({\n 'wallet' : Wallet,\n 'profile' : IDL.Principal,\n });\n const InflowType = IDL.Variant({\n 'Repayment' : IDL.Null,\n 'Deposit' : IDL.Null,\n });\n const InflowDetails = IDL.Record({\n 'id' : IDL.Text,\n 'inflow_type' : InflowType,\n 'txid' : IDL.Text,\n 'timestamp' : IDL.Nat64,\n 'amount' : IDL.Nat,\n 'receiver' : IDL.Principal,\n });\n const LiqTxTarget = IDL.Variant({\n 'Collateral' : IDL.Null,\n 'Change' : IDL.Null,\n });\n const Pool = IDL.Record({\n 'optimal_utilization_rate' : IDL.Nat,\n 'principal' : IDL.Principal,\n 'total_generated_interest_snapshot' : IDL.Nat,\n 'asset_type' : AssetType,\n 'supply_cap' : IDL.Opt(IDL.Nat),\n 'same_asset_borrowing' : IDL.Opt(IDL.Bool),\n 'asset' : Assets,\n 'rate_slope_before' : IDL.Nat,\n 'borrow_cap' : IDL.Opt(IDL.Nat),\n 'total_debt_at_last_sync' : IDL.Nat,\n 'supply_at_last_sync' : IDL.Nat,\n 'chain' : Chains,\n 'rate_slope_after' : IDL.Nat,\n 'reserve_factor' : IDL.Nat64,\n 'last_updated' : IDL.Opt(IDL.Nat64),\n 'lending_index' : IDL.Nat,\n 'protocol_liquidation_fee' : IDL.Nat64,\n 'treasury_supply_scaled' : IDL.Nat,\n 'same_asset_borrowing_dust_threshold' : IDL.Nat,\n 'borrow_index' : IDL.Nat,\n 'base_rate' : IDL.Nat,\n 'frozen' : IDL.Bool,\n 'liquidation_bonus' : IDL.Nat64,\n 'liquidation_threshold' : IDL.Nat64,\n 'max_ltv' : IDL.Nat64,\n 'repay_grace_period' : IDL.Opt(IDL.Nat64),\n 'pending_service_fees' : IDL.Nat,\n 'total_supply_at_last_sync' : IDL.Nat,\n });\n const LiquidationStatus = IDL.Variant({\n 'CollateralTransferFailed' : IDL.Text,\n 'FailedLiquidation' : IDL.Text,\n 'InflowProcessed' : IDL.Null,\n 'Success' : IDL.Null,\n 'CoreExecuted' : IDL.Null,\n 'ChangeTransferFailed' : IDL.Text,\n 'Pending' : IDL.Null,\n });\n const TransferStatus = IDL.Variant({\n 'Failed' : IDL.Text,\n 'Success' : IDL.Null,\n 'Pending' : IDL.Null,\n });\n const TxStatus = IDL.Record({\n 'status' : TransferStatus,\n 'tx_id' : IDL.Opt(IDL.Text),\n });\n const LiquidationAmounts = IDL.Record({\n 'debt_repaid' : IDL.Nat,\n 'collateral_received' : IDL.Nat,\n });\n const LiquidationResult = IDL.Record({\n 'id' : IDL.Nat,\n 'status' : LiquidationStatus,\n 'change_tx' : TxStatus,\n 'debt_asset' : AssetType,\n 'amounts' : LiquidationAmounts,\n 'collateral_asset' : AssetType,\n 'timestamp' : IDL.Nat64,\n 'collateral_tx' : TxStatus,\n });\n const LiquidationRequest = IDL.Record({\n 'debt_amount' : IDL.Nat,\n 'receiver_address' : IDL.Principal,\n 'collateral_pool_id' : IDL.Principal,\n 'borrower' : IDL.Principal,\n 'debt_pool_id' : IDL.Principal,\n 'buy_bad_debt' : IDL.Bool,\n });\n const ProtocolEventType = IDL.Variant({\n 'RepaymentRejected' : IDL.Record({\n 'pool' : IDL.Principal,\n 'error' : ProtocolError,\n 'details' : RepaymentDetails,\n }),\n 'AccountCreated' : ProfileCreatedEvent,\n 'DepositConfirmed' : IDL.Record({\n 'pool' : IDL.Principal,\n 'details' : InflowDetails,\n }),\n 'DepositRejected' : IDL.Record({\n 'pool' : IDL.Principal,\n 'error' : ProtocolError,\n 'details' : InflowDetails,\n }),\n 'AccountAdded' : Wallet,\n 'BorrowStateUpdated' : IDL.Bool,\n 'LiquidationUnderlyingWithdrawal' : IDL.Record({\n 'txid' : IDL.Text,\n 'target' : LiqTxTarget,\n 'liquidation_id' : IDL.Nat,\n 'account' : IDL.Text,\n 'pool_id' : IDL.Text,\n 'amount' : IDL.Nat,\n }),\n 'PoolUpdated' : Pool,\n 'RepaymentConfirmed' : IDL.Record({\n 'pool' : IDL.Principal,\n 'details' : RepaymentDetails,\n }),\n 'LiquidationExecuted' : IDL.Record({\n 'result' : LiquidationResult,\n 'request' : LiquidationRequest,\n }),\n 'WithdrawalConfirmed' : IDL.Record({\n 'pool' : IDL.Principal,\n 'details' : OutflowDetails,\n }),\n 'BorrowConfirmed' : IDL.Record({\n 'pool' : IDL.Principal,\n 'details' : OutflowDetails,\n }),\n 'PoolRegistered' : Pool,\n 'AccountRemoved' : Wallet,\n 'PoolRemoved' : IDL.Principal,\n });\n const ProtocolEvent = IDL.Record({\n 'id' : IDL.Nat,\n 'user' : IDL.Principal,\n 'timestamp' : IDL.Nat64,\n 'event_type' : ProtocolEventType,\n });\n const BorrowingPower = IDL.Record({\n 'max_borrowable_usd' : IDL.Nat,\n 'weighted_max_ltv' : IDL.Nat,\n });\n const Position = IDL.Record({\n 'asset' : Assets,\n 'total_debt_interest' : IDL.Nat,\n 'borrow_index_snapshot' : IDL.Nat,\n 'lending_index_snapshot' : IDL.Nat,\n 'debt_scaled' : IDL.Nat,\n 'total_earned_interest' : IDL.Nat,\n 'deposit_scaled' : IDL.Nat,\n 'pool_id' : IDL.Principal,\n 'unpaid_debt_interest' : IDL.Nat,\n 'last_update' : IDL.Nat64,\n 'user_profile' : IDL.Principal,\n });\n const UserStats = IDL.Record({\n 'debt' : IDL.Nat,\n 'collateral' : IDL.Nat,\n 'acumulated_interest' : IDL.Nat,\n 'borrowing_power' : BorrowingPower,\n 'positions' : IDL.Vec(Position),\n 'weighted_liquidation_threshold' : IDL.Nat,\n });\n const Result_2 = IDL.Variant({\n 'Ok' : LiquidationResult,\n 'Err' : ProtocolError,\n });\n const PositionView = IDL.Record({\n 'lending_index_now' : IDL.Nat,\n 'interest_since_snapshot' : IDL.Nat,\n 'asset' : Assets,\n 'total_debt_interest' : IDL.Nat,\n 'borrow_index_snapshot' : IDL.Nat,\n 'debt_native_now' : IDL.Nat,\n 'borrow_index_now' : IDL.Nat,\n 'lending_index_snapshot' : IDL.Nat,\n 'debt_scaled' : IDL.Nat,\n 'total_earned_interest' : IDL.Nat,\n 'deposit_scaled' : IDL.Nat,\n 'earned_since_snapshot' : IDL.Nat,\n 'deposited_native_now' : IDL.Nat,\n 'pool_id' : IDL.Principal,\n 'last_update' : IDL.Nat64,\n 'user_profile' : IDL.Principal,\n });\n const Result_3 = IDL.Variant({\n 'Ok' : IDL.Tuple(IDL.Nat, IDL.Nat32),\n 'Err' : IDL.Text,\n });\n const ListPositionsResponse = IDL.Record({\n 'total' : IDL.Nat64,\n 'next_cursor' : IDL.Opt(IDL.Tuple(IDL.Principal, IDL.Principal)),\n 'positions' : IDL.Vec(PositionView),\n });\n const ListProfilesResponse = IDL.Record({\n 'total' : IDL.Nat64,\n 'next_cursor' : IDL.Opt(IDL.Principal),\n 'profiles' : IDL.Vec(\n IDL.Tuple(IDL.Principal, IDL.Tuple(IDL.Nat, UserStats))\n ),\n });\n const PoolEvents = IDL.Variant({\n 'DepositConfirmed' : InflowDetails,\n 'RepaymentConfirmed' : RepaymentDetails,\n });\n const Result_4 = IDL.Variant({\n 'Ok' : IDL.Opt(IDL.Nat),\n 'Err' : ProtocolError,\n });\n const InitializeAccountRequest = IDL.Record({\n 'expiry_timestamp' : IDL.Nat64,\n });\n const SignedRequest_2 = IDL.Record({\n 'data' : InitializeAccountRequest,\n 'signature_info' : SignatureScheme,\n });\n const Result_5 = IDL.Variant({ 'Ok' : IDL.Principal, 'Err' : ProtocolError });\n const Result_6 = IDL.Variant({ 'Ok' : IDL.Null, 'Err' : IDL.Text });\n const RemoveAccountRequest = IDL.Record({\n 'wallet_address' : IDL.Text,\n 'expiry_timestamp' : IDL.Nat64,\n });\n const SignedRequest_3 = IDL.Record({\n 'data' : RemoveAccountRequest,\n 'signature_info' : SignatureScheme,\n });\n const ScanResult = IDL.Record({\n 'scanned' : IDL.Nat64,\n 'users' : IDL.Vec(LiquidatableUser),\n 'next_cursor' : IDL.Opt(IDL.Principal),\n });\n const Result_7 = IDL.Variant({ 'Ok' : IDL.Null, 'Err' : IDL.Text });\n const WithdrawRequest = IDL.Record({\n 'expiry_timestamp' : IDL.Nat64,\n 'account' : AccountType,\n 'pool_id' : IDL.Principal,\n 'amount' : IDL.Nat,\n });\n const SignedRequest_4 = IDL.Record({\n 'data' : WithdrawRequest,\n 'signature_info' : SignatureScheme,\n });\n const Result_8 = IDL.Variant({ 'Ok' : IDL.Nat, 'Err' : ProtocolError });\n return IDL.Service({\n 'add_admin' : IDL.Func([IDL.Principal], [], []),\n 'add_liquidator' : IDL.Func([IDL.Principal], [], []),\n 'add_wallet' : IDL.Func([IDL.Principal, SignedRequest], [Result], []),\n 'borrow_assets' : IDL.Func(\n [IDL.Principal, SignedRequest_1],\n [Result_1],\n [],\n ),\n 'claim_fee' : IDL.Func([ClaimFeeRequest], [Result_1], []),\n 'disable_borrowing' : IDL.Func([], [], []),\n 'disable_same_asset_borrowing' : IDL.Func([IDL.Principal], [], []),\n 'enable_borrowing' : IDL.Func([], [], []),\n 'enable_same_asset_borrowing' : IDL.Func([IDL.Principal], [], []),\n 'freeze_pool' : IDL.Func([IDL.Principal], [], []),\n 'get_admins' : IDL.Func([], [IDL.Vec(IDL.Principal)], ['query']),\n 'get_at_risk_positions' : IDL.Func(\n [IDL.Nat64, IDL.Nat64],\n [IDL.Vec(LiquidatableUser)],\n ['query'],\n ),\n 'get_borrowing_disabled' : IDL.Func([], [IDL.Bool], ['query']),\n 'get_event' : IDL.Func([IDL.Nat], [IDL.Opt(ProtocolEvent)], ['query']),\n 'get_health_factor' : IDL.Func(\n [IDL.Principal],\n [IDL.Nat, UserStats],\n ['query'],\n ),\n 'get_liquidation' : IDL.Func([IDL.Nat], [Result_2], ['query']),\n 'get_liquidators' : IDL.Func([], [IDL.Vec(IDL.Principal)], ['query']),\n 'get_nonce' : IDL.Func([IDL.Text], [IDL.Nat], ['query']),\n 'get_pool' : IDL.Func([IDL.Principal], [IDL.Opt(Pool)], ['query']),\n 'get_pool_rate' : IDL.Func(\n [IDL.Principal],\n [IDL.Opt(IDL.Tuple(IDL.Nat, IDL.Nat, IDL.Nat))],\n ['query'],\n ),\n 'get_position' : IDL.Func(\n [IDL.Principal, IDL.Principal],\n [IDL.Opt(PositionView)],\n ['query'],\n ),\n 'get_price' : IDL.Func([IDL.Text, IDL.Text], [Result_3], ['query']),\n 'get_prices' : IDL.Func(\n [],\n [IDL.Vec(IDL.Tuple(IDL.Text, IDL.Nat, IDL.Nat32))],\n ['query'],\n ),\n 'get_profile_stats' : IDL.Func([IDL.Principal], [UserStats], ['query']),\n 'get_profile_wallets' : IDL.Func(\n [IDL.Principal],\n [IDL.Vec(Wallet)],\n ['query'],\n ),\n 'get_protocol_fee_claim_receiver' : IDL.Func(\n [],\n [IDL.Opt(IDL.Principal)],\n ['query'],\n ),\n 'get_wallet_profile' : IDL.Func(\n [IDL.Text],\n [IDL.Opt(IDL.Principal)],\n ['query'],\n ),\n 'liquidate' : IDL.Func([LiquidationRequest], [Result_2], []),\n 'list_events' : IDL.Func(\n [IDL.Nat, IDL.Nat64],\n [IDL.Vec(IDL.Tuple(IDL.Nat, ProtocolEvent))],\n ['query'],\n ),\n 'list_pools' : IDL.Func([], [IDL.Vec(Pool)], ['query']),\n 'list_positions' : IDL.Func(\n [IDL.Opt(IDL.Tuple(IDL.Principal, IDL.Principal)), IDL.Nat64],\n [ListPositionsResponse],\n ['query'],\n ),\n 'list_profiles' : IDL.Func(\n [IDL.Opt(IDL.Principal), IDL.Nat64],\n [ListProfilesResponse],\n ['query'],\n ),\n 'notify_fee_claim_rollback' : IDL.Func([IDL.Nat], [], []),\n 'notify_pool_events' : IDL.Func(\n [IDL.Vec(PoolEvents)],\n [IDL.Vec(Result)],\n [],\n ),\n 'refresh_pool_transfer_fee' : IDL.Func([IDL.Principal], [Result_4], []),\n 'refund_stuck_liquidation' : IDL.Func([IDL.Nat], [Result_2], []),\n 'register_pool' : IDL.Func([Pool], [], []),\n 'register_profile' : IDL.Func([SignedRequest_2], [Result_5], []),\n 'remove_admin' : IDL.Func([IDL.Principal], [], []),\n 'remove_liquidator' : IDL.Func([IDL.Principal], [], []),\n 'remove_pool' : IDL.Func([IDL.Principal], [Result_6], []),\n 'remove_wallet' : IDL.Func([IDL.Principal, SignedRequest_3], [Result], []),\n 'scan_at_risk_positions' : IDL.Func(\n [IDL.Opt(IDL.Principal), IDL.Nat64, IDL.Nat64],\n [ScanResult],\n ['query'],\n ),\n 'set_base_rate' : IDL.Func([IDL.Principal, IDL.Nat], [], []),\n 'set_optimal_utilization_rate' : IDL.Func([IDL.Principal, IDL.Nat], [], []),\n 'set_pool_borrow_cap' : IDL.Func([IDL.Principal, IDL.Opt(IDL.Nat)], [], []),\n 'set_pool_liquidation_bonus' : IDL.Func([IDL.Principal, IDL.Nat64], [], []),\n 'set_pool_liquidation_threshold' : IDL.Func(\n [IDL.Principal, IDL.Nat64],\n [],\n [],\n ),\n 'set_pool_max_ltv' : IDL.Func([IDL.Principal, IDL.Nat64], [], []),\n 'set_pool_protocol_liquidation_fee' : IDL.Func(\n [IDL.Principal, IDL.Nat64],\n [],\n [],\n ),\n 'set_pool_reserve_factor' : IDL.Func([IDL.Principal, IDL.Nat64], [], []),\n 'set_pool_supply_cap' : IDL.Func([IDL.Principal, IDL.Opt(IDL.Nat)], [], []),\n 'set_protocol_fee_claim_receiver' : IDL.Func(\n [IDL.Principal],\n [Result_7],\n [],\n ),\n 'set_rate_slope_after' : IDL.Func([IDL.Principal, IDL.Nat], [], []),\n 'set_rate_slope_before' : IDL.Func([IDL.Principal, IDL.Nat], [], []),\n 'set_same_asset_borrow_dust_threshold' : IDL.Func(\n [IDL.Principal, IDL.Nat],\n [],\n [],\n ),\n 'unfreeze_pool' : IDL.Func([IDL.Principal], [], []),\n 'withdraw' : IDL.Func([IDL.Principal, SignedRequest_4], [Result_1], []),\n 'withdraw_stuck_pool_funds' : IDL.Func(\n [IDL.Principal, SignedRequest_4],\n [Result_8],\n [],\n ),\n });\n};\nexport const init = ({ IDL }) => { return [IDL.Opt(IDL.Text)]; };\n","import { Actor } from \"@icp-sdk/core/agent\";\nimport type {\n _SERVICE,\n BorrowingPower,\n ProtocolError as GeneratedProtocolError,\n SignatureVerificationError as GeneratedSignatureVerificationError,\n SignedRequest_2,\n Wallet,\n} from \"../../../generated/canisters/lending/lending.did\";\nimport { idlFactory } from \"../../../generated/canisters/lending/lending.did.js\";\nimport { LiquidiumError, LiquidiumErrorCode } from \"../../errors\";\nimport type { CanisterContext } from \"../../transports/canister-context\";\n\nexport type WalletRecord = Wallet;\nexport type BorrowingPowerRecord = BorrowingPower;\nexport type RegisterProfileRequest = SignedRequest_2;\nexport type PoolRateTuple = [bigint, bigint, bigint];\nexport type PriceRecord = [string, bigint, number];\nexport type ProtocolError = GeneratedProtocolError;\nexport type SignatureVerificationError = GeneratedSignatureVerificationError;\nexport type LendingActor = _SERVICE;\n\nexport function createLendingActor(\n canisterContext: CanisterContext\n): LendingActor {\n const canisterId = canisterContext.canisterIds.lending;\n\n if (!canisterId) {\n throw new LiquidiumError(\n LiquidiumErrorCode.SERVICE_UNAVAILABLE,\n \"Lending canister ID is not configured\"\n );\n }\n\n return Actor.createActor<LendingActor>(idlFactory, {\n agent: canisterContext.agent,\n canisterId,\n });\n}\n","import { LiquidiumError, LiquidiumErrorCode } from \"../../errors\";\nimport type { ProtocolError, SignatureVerificationError } from \"./actor\";\n\ntype VariantKey<T> = keyof UnionToIntersection<T> & string;\n\ntype UnionToIntersection<T> = (\n T extends unknown\n ? (value: T) => void\n : never\n) extends (value: infer Intersection) => void\n ? Intersection\n : never;\n\ninterface ErrorMapping {\n code: LiquidiumErrorCode;\n fallbackMessage?: string;\n}\n\nconst LENDING_CANISTER_PROTOCOL_RESULT_ERROR_MAP = {\n InvalidTargetPrincipal: { code: LiquidiumErrorCode.INVALID_TARGET_PRINCIPAL },\n InsufficientCollateral: { code: LiquidiumErrorCode.INSUFFICIENT_COLLATERAL },\n SignatureExpiryTooFarInFuture: {\n code: LiquidiumErrorCode.SIGNATURE_EXPIRY_TOO_FAR_IN_FUTURE,\n },\n MaxLtvExceeded: { code: LiquidiumErrorCode.MAX_LTV_EXCEEDED },\n SignatureExpired: { code: LiquidiumErrorCode.SIGNATURE_EXPIRED },\n AccountAlreadyLinked: { code: LiquidiumErrorCode.ACCOUNT_ALREADY_LINKED },\n AccountNotFound: { code: LiquidiumErrorCode.ACCOUNT_NOT_FOUND },\n CannotRemoveSoleAccount: {\n code: LiquidiumErrorCode.CANNOT_REMOVE_SOLE_ACCOUNT,\n },\n ProfileNotFound: { code: LiquidiumErrorCode.PROFILE_NOT_FOUND },\n ProfileAlreadyExists: { code: LiquidiumErrorCode.PROFILE_ALREADY_EXISTS },\n SignatureError: { code: LiquidiumErrorCode.SIGNATURE_ERROR },\n PoolNotFound: {\n code: LiquidiumErrorCode.POOL_NOT_FOUND,\n fallbackMessage: \"Pool not found\",\n },\n PoolFrozen: { code: LiquidiumErrorCode.POOL_FROZEN },\n PositionNotFound: { code: LiquidiumErrorCode.POSITION_NOT_FOUND },\n BorrowCapExceeded: { code: LiquidiumErrorCode.BORROW_CAP_EXCEEDED },\n SupplyCapExceeded: { code: LiquidiumErrorCode.SUPPLY_CAP_EXCEEDED },\n InsufficientFunds: { code: LiquidiumErrorCode.INSUFFICIENT_FUNDS },\n HealthFactorTooLow: { code: LiquidiumErrorCode.HEALTH_FACTOR_TOO_LOW },\n TransferFailed: {\n code: LiquidiumErrorCode.TRANSFER_FAILED,\n fallbackMessage: \"Transfer failed\",\n },\n LiquidationNotFound: {\n code: LiquidiumErrorCode.LIQUIDATION_NOT_FOUND,\n fallbackMessage: \"Liquidation not found\",\n },\n BorrowingDisabled: { code: LiquidiumErrorCode.BORROWING_DISABLED },\n NoLiquidity: { code: LiquidiumErrorCode.NO_LIQUIDITY },\n NotAllowed: {\n code: LiquidiumErrorCode.NOT_ALLOWED,\n fallbackMessage: \"Operation not allowed\",\n },\n InvalidAddress: {\n code: LiquidiumErrorCode.INVALID_ADDRESS,\n fallbackMessage: \"Invalid address\",\n },\n Internal: {\n code: LiquidiumErrorCode.INTERNAL,\n fallbackMessage: \"Internal protocol error\",\n },\n FeeClaimReceiverNotConfigured: {\n code: LiquidiumErrorCode.INTERNAL,\n fallbackMessage: \"Fee claim receiver is not configured\",\n },\n} as const satisfies Record<VariantKey<ProtocolError>, ErrorMapping>;\n\nconst LENDING_CANISTER_SIGNATURE_VERIFICATION_ERROR_MAP = {\n InvalidEthSignature: { code: LiquidiumErrorCode.INVALID_ETH_SIGNATURE },\n InvalidBtcSignature: { code: LiquidiumErrorCode.INVALID_BTC_SIGNATURE },\n InvalidEthAddress: { code: LiquidiumErrorCode.INVALID_ETH_ADDRESS },\n UnsupportedChain: { code: LiquidiumErrorCode.UNSUPPORTED_CHAIN },\n ProfileNotFound: { code: LiquidiumErrorCode.PROFILE_NOT_FOUND },\n CouldNotDecode: {\n code: LiquidiumErrorCode.SIGNATURE_ERROR,\n fallbackMessage: \"Could not decode signature\",\n },\n InvalidSolSignature: {\n code: LiquidiumErrorCode.SIGNATURE_ERROR,\n fallbackMessage: \"Invalid SOL signature\",\n },\n} as const satisfies Record<\n VariantKey<SignatureVerificationError>,\n ErrorMapping\n>;\n\n/** Maps lending canister `Result.Err(ProtocolError)` responses. */\nexport function mapLendingProtocolErrorToLiquidiumError(\n error: ProtocolError\n): LiquidiumError {\n const [key, payload] = getVariantEntry(error);\n\n if (key === \"SignatureError\") {\n return mapLendingSignatureVerificationErrorToLiquidiumError(\n payload as SignatureVerificationError\n );\n }\n\n return mapVariantToLiquidiumError(\n LENDING_CANISTER_PROTOCOL_RESULT_ERROR_MAP[key],\n payload\n );\n}\n\n/** Maps nested `ProtocolError.SignatureError` verification failures. */\nexport function mapLendingSignatureVerificationErrorToLiquidiumError(\n error: SignatureVerificationError\n): LiquidiumError {\n const [key, payload] = getVariantEntry(error);\n\n return mapVariantToLiquidiumError(\n LENDING_CANISTER_SIGNATURE_VERIFICATION_ERROR_MAP[key],\n payload\n );\n}\n\n/** Maps thrown/rejected canister calls, not typed protocol `Err` responses. */\nexport function mapCanisterCallErrorToLiquidiumError(\n methodName: string,\n cause: unknown\n): LiquidiumError {\n return new LiquidiumError(\n LiquidiumErrorCode.CANISTER_REJECTED,\n `Canister call failed: ${methodName}`,\n cause\n );\n}\n\nfunction getVariantEntry<T extends Record<string, unknown>>(\n variant: T\n): [VariantKey<T>, unknown] {\n const [entry] = Object.entries(variant) as [\n [VariantKey<T>, unknown],\n ...Array<[VariantKey<T>, unknown]>,\n ];\n\n return entry;\n}\n\nfunction mapVariantToLiquidiumError(\n mapping: ErrorMapping,\n payload: unknown\n): LiquidiumError {\n const message =\n typeof payload === \"string\"\n ? payload\n : (mapping.fallbackMessage ?? humanizeErrorCode(mapping.code));\n\n return new LiquidiumError(mapping.code, message);\n}\n\nfunction humanizeErrorCode(code: LiquidiumErrorCode): string {\n return code\n .toLowerCase()\n .replaceAll(\"_\", \" \")\n .replace(/^\\w/, (firstLetter) => firstLetter.toUpperCase());\n}\n","import { getAddress, isAddress } from \"viem\";\n\n/** Ethereum mainnet USDC contract address. */\nexport const USDC_CONTRACT_ADDRESS =\n \"0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48\";\n/** Ethereum mainnet USDT contract address. */\nexport const USDT_CONTRACT_ADDRESS =\n \"0xdac17f958d2ee523a2206206994597c13d831ec7\";\n/** Ethereum mainnet ckETH minter ERC-20 deposit helper contract address. */\nexport const CK_ETH_DEPOSIT_CONTRACT_ADDRESS =\n \"0x18901044688D3756C35Ed2b36D93e6a5B8e00E68\";\n\n/** Largest uint256 value, used for max-allowance ERC-20 approvals. */\nexport const MAX_UINT256 =\n 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffn;\n\n/** Minimal ERC-20 ABI used by the SDK for balance, allowance, approval, and transfers. */\nexport const ERC20_ABI = [\n {\n name: \"allowance\",\n type: \"function\",\n inputs: [\n { name: \"owner\", type: \"address\" },\n { name: \"spender\", type: \"address\" },\n ],\n outputs: [{ name: \"remaining\", type: \"uint256\" }],\n stateMutability: \"view\",\n },\n {\n name: \"balanceOf\",\n type: \"function\",\n inputs: [{ name: \"owner\", type: \"address\" }],\n outputs: [{ name: \"balance\", type: \"uint256\" }],\n stateMutability: \"view\",\n },\n {\n name: \"approve\",\n type: \"function\",\n inputs: [\n { name: \"spender\", type: \"address\" },\n { name: \"value\", type: \"uint256\" },\n ],\n outputs: [{ name: \"\", type: \"bool\" }],\n stateMutability: \"nonpayable\",\n },\n {\n name: \"transfer\",\n type: \"function\",\n inputs: [\n { name: \"to\", type: \"address\" },\n { name: \"value\", type: \"uint256\" },\n ],\n outputs: [{ name: \"\", type: \"bool\" }],\n stateMutability: \"nonpayable\",\n },\n] as const;\n\n/** ckETH minter deposit helper ABI used for ERC-20 deposits into ICRC accounts. */\nexport const CK_DEPOSIT_ABI = [\n {\n inputs: [\n { internalType: \"address\", name: \"erc20Address\", type: \"address\" },\n { internalType: \"uint256\", name: \"amount\", type: \"uint256\" },\n { internalType: \"bytes32\", name: \"principal\", type: \"bytes32\" },\n { internalType: \"bytes32\", name: \"subaccount\", type: \"bytes32\" },\n ],\n name: \"depositErc20\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n] as const;\n\n/** Returns an EIP-55 checksum address when `address` is valid EVM input. */\nexport function normalizeEvmAddress(address: string): string {\n if (!isAddress(address)) {\n return address;\n }\n\n return getAddress(address);\n}\n","const MILLISECONDS_PER_SECOND = 1_000;\nconst SIGNATURE_VALIDITY_5_MINUTES_IN_SECONDS = 5n * 60n;\n\nexport function computeExpiryTimestampFromNow(\n signatureValidityInSeconds: bigint = SIGNATURE_VALIDITY_5_MINUTES_IN_SECONDS\n): bigint {\n return (\n BigInt(Math.floor(Date.now() / MILLISECONDS_PER_SECOND)) +\n signatureValidityInSeconds\n );\n}\n","import { LiquidiumError, LiquidiumErrorCode } from \"../errors\";\n\nexport function getVariantKey(variant: object): string {\n const [variantKey] = Object.keys(variant);\n\n if (!variantKey) {\n throw new LiquidiumError(\n LiquidiumErrorCode.INTERNAL,\n \"Unexpected empty canister variant\"\n );\n }\n\n return variantKey;\n}\n","import type { IcrcAccount } from \"./accounts\";\nimport type { Asset, SigningChain } from \"./types\";\n\n/** Wallet capability required to execute a prepared SDK action. */\nexport const WalletExecutionKind = {\n signMessage: \"sign-message\",\n} as const;\n/** Wallet capability required to execute a prepared SDK action. */\nexport type WalletExecutionKind =\n (typeof WalletExecutionKind)[keyof typeof WalletExecutionKind];\n\n/** Protocol action represented by a prepared wallet action. */\nexport const WalletActionKind = {\n createAccount: \"create-account\",\n createBorrow: \"create-borrow\",\n createWithdraw: \"create-withdraw\",\n} as const;\n/** Protocol action represented by a prepared wallet action. */\nexport type WalletActionKind =\n (typeof WalletActionKind)[keyof typeof WalletActionKind];\n\n/** EVM transaction request passed to wallet adapters. */\nexport interface EthTransactionRequest {\n /** Destination address or contract address. */\n to: string;\n /** Hex-encoded calldata for contract interactions. */\n data?: string;\n /** Native ETH value in wei, serialized as a decimal string. */\n value?: string;\n /** Optional EVM chain id for wallet implementations that require it. */\n chainId?: number;\n}\n\n/** Message-signing request passed to wallet adapters. */\nexport interface SignMessageRequest {\n /** Chain for the signing wallet. */\n chain: SigningChain;\n /** Plaintext message to sign. */\n message: string;\n /** Optional account override for the signing wallet. */\n account?: string;\n /** SDK action type that produced this request. */\n actionType: string;\n}\n\n/** ETH transaction-sending request passed to wallet adapters. */\nexport interface SendEthTransactionRequest {\n /** ETH chain discriminator. */\n chain: \"ETH\";\n /** Transaction payload to send. */\n transaction: EthTransactionRequest;\n /** Optional account override for the sending wallet. */\n account?: string;\n /** SDK action type that produced this request. */\n actionType: string;\n}\n\n/** BTC transaction-sending request passed to wallet adapters. */\nexport interface SendBtcTransactionRequest {\n /** BTC chain discriminator. */\n chain: \"BTC\";\n /** Recipient BTC address. */\n toAddress: string;\n /** Amount in satoshis when the SDK knows the transfer amount. */\n amountSats?: bigint;\n /** Optional account override for the sending wallet. */\n account?: string;\n /** SDK action type that produced this request. */\n actionType: string;\n}\n\n/** ICRC ledger transfer payload passed to wallet adapters. */\nexport interface IcrcTransferDetails {\n /** Ledger canister principal that should receive the transfer call. */\n ledgerCanisterId: string;\n /** Recipient ICRC account. */\n to: IcrcAccount;\n /** Transfer amount in ledger base units. */\n amount: bigint;\n /** Optional ledger fee in base units. */\n fee?: bigint;\n /** Optional ledger memo bytes. */\n memo?: Uint8Array;\n}\n\n/** ICRC transaction-sending request passed to wallet adapters. */\nexport interface SendIcrcTransferRequest {\n /** ICRC transfers are submitted on the Internet Computer. */\n chain: \"ICP\";\n /** Asset represented by the target ledger transfer. */\n asset: Asset;\n /** Transfer details for the ledger call. */\n transfer: IcrcTransferDetails;\n /** Optional account override for the sending wallet. */\n account?: string;\n /** SDK action type that produced this request. */\n actionType: string;\n}\n\n/**\n * Optional wallet capabilities. Implement only what your flow uses:\n *\n * - `signMessage` - account creation, borrow, withdraw\n * - `sendBtcTransaction` / `sendEthTransaction` - automated native-asset transfer supply\n * - `sendIcrcTransfer` - automated ck-ledger and ICP ledger transfer supply\n * - `sendEthTransaction` - contract-interaction supply and ETH native-asset sends\n */\nexport interface WalletAdapter {\n /** Signs an SDK plaintext message and returns the wallet signature. BTC adapters may return base64 BIP-322 or hex-encoded signature bytes. */\n signMessage?: (request: SignMessageRequest) => Promise<string>;\n /** Sends an EVM transaction and returns its transaction hash. */\n sendEthTransaction?: (request: SendEthTransactionRequest) => Promise<string>;\n /** Sends a BTC transaction and returns its transaction id. */\n sendBtcTransaction?: (request: SendBtcTransactionRequest) => Promise<string>;\n /** Sends an ICRC ledger transfer and returns the ledger transaction reference. */\n sendIcrcTransfer?: (request: SendIcrcTransferRequest) => Promise<string>;\n}\n\n/** Signature payload submitted to a sign-message action. */\nexport interface SignatureInfo {\n /** Wallet signature over the action message. BTC signatures may be base64 BIP-322 or hex-encoded bytes. */\n signature: string;\n /** Chain used to produce the signature. */\n chain: SigningChain;\n /** Account that produced the signature, when different from the action default. */\n account?: string;\n}\n\n/** Prepared action that requires message signing before submit. */\nexport interface SignMessageWalletAction<TData, TResult> {\n /** Protocol action kind. */\n kind: WalletActionKind;\n /** Wallet capability required to execute the action. */\n executionKind: typeof WalletExecutionKind.signMessage;\n /** Adapter-facing action type. */\n actionType: string;\n /** Default account to pass to the wallet adapter. */\n account: string;\n /** Plaintext message that must be signed. */\n message: string;\n /** Original request data needed to submit the signed action. */\n data: TData;\n /** Submits the signature and resolves the protocol result. */\n submit(signatureInfo: SignatureInfo): Promise<TResult>;\n}\n\n/** Any prepared action returned by SDK methods and executable by {@link executeWith}. */\nexport type WalletAction<TResult> = SignMessageWalletAction<unknown, TResult>;\n","import { LiquidiumError, LiquidiumErrorCode } from \"./core/errors\";\nimport type { SigningChain } from \"./core/types\";\nimport {\n type WalletAction,\n type WalletAdapter,\n WalletExecutionKind,\n} from \"./core/wallet-actions\";\n\ninterface WalletExecutionKindCarrier {\n executionKind?: unknown;\n}\n\n/**\n * Wallet wiring for {@link executeWith}.\n *\n * `chain` and `account` override values embedded on the action when present;\n * message signing uses `options.account ?? action.account`.\n */\nexport interface ExecuteWithOptions {\n /** Must expose the methods required by the action's `executionKind`. */\n walletAdapter: WalletAdapter;\n /** Required for `sign-message` actions; forwarded to the adapter and submit payload. */\n chain?: SigningChain;\n /** Optional signing/sending account override. */\n account?: string;\n}\n\n/**\n * Returns an async function that runs a {@link WalletAction} end-to-end.\n *\n * - `sign-message`: needs `walletAdapter.signMessage` and `options.chain`.\n *\n * @param options - Adapter and optional chain/account overrides.\n * @returns A function that accepts a `WalletAction` and resolves with its submit result.\n */\nexport function executeWith(options: ExecuteWithOptions) {\n return async function execute<TResult>(\n action: WalletAction<TResult>\n ): Promise<TResult> {\n switch (action.executionKind) {\n case WalletExecutionKind.signMessage: {\n if (!options.walletAdapter.signMessage) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n \"Wallet adapter does not support message signing\"\n );\n }\n\n if (!options.chain) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n \"Message-signing actions require a chain\"\n );\n }\n\n const signature = await options.walletAdapter.signMessage({\n chain: options.chain,\n message: action.message,\n account: options.account ?? action.account,\n actionType: action.actionType,\n });\n\n return action.submit({\n signature,\n chain: options.chain,\n account: options.account ?? action.account,\n });\n }\n default:\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n `Unsupported wallet execution kind: ${String(\n (action as WalletExecutionKindCarrier).executionKind\n )}`\n );\n }\n };\n}\n","import { base64, base64nopad } from \"@scure/base\";\nimport { bytesToHex as encodeBytesToHex, isHex } from \"viem\";\nimport { LiquidiumError, LiquidiumErrorCode } from \"../errors\";\nimport { Chain, type SigningChain } from \"../types\";\n\nconst HEX_PREFIX = \"0x\";\nconst HEX_BYTE_CHAR_LENGTH = 2;\nconst BASE64_PADDING = \"=\";\n\nexport function normalizeWalletSignature(\n signature: string,\n chain: SigningChain\n): string {\n switch (chain) {\n case Chain.BTC:\n return normalizeBtcSignature(signature);\n case Chain.ETH:\n return normalizeHexSignature(signature);\n }\n}\n\nexport function normalizeHexSignature(signature: string): string {\n if (!isPrefixedHex(signature)) {\n return signature;\n }\n\n return signature.slice(HEX_PREFIX.length);\n}\n\nfunction normalizeBtcSignature(signature: string): string {\n const signatureWithoutPrefix = signature.startsWith(HEX_PREFIX)\n ? signature.slice(HEX_PREFIX.length)\n : signature;\n\n if (isHexBytes(signatureWithoutPrefix)) {\n return signatureWithoutPrefix;\n }\n\n if (signature.startsWith(HEX_PREFIX)) {\n throw invalidBtcSignatureFormatError();\n }\n\n return bytesToUnprefixedHex(decodeBase64Signature(signature));\n}\n\nfunction isHexBytes(signature: string): boolean {\n return (\n signature.length > 0 &&\n signature.length % HEX_BYTE_CHAR_LENGTH === 0 &&\n isHex(`${HEX_PREFIX}${signature}`)\n );\n}\n\nfunction decodeBase64Signature(signature: string): Uint8Array {\n try {\n const bytes = decodeBase64Bytes(signature);\n\n if (bytes.length === 0) {\n throw invalidBtcSignatureFormatError();\n }\n\n return bytes;\n } catch (error) {\n if (error instanceof LiquidiumError) {\n throw error;\n }\n\n throw invalidBtcSignatureFormatError(error);\n }\n}\n\nfunction bytesToUnprefixedHex(bytes: Uint8Array): string {\n return normalizeHexSignature(encodeBytesToHex(bytes));\n}\n\nfunction isPrefixedHex(signature: string): boolean {\n return signature.length > HEX_PREFIX.length && isHex(signature);\n}\n\nfunction decodeBase64Bytes(signature: string): Uint8Array {\n if (signature.includes(BASE64_PADDING)) {\n return base64.decode(signature);\n }\n\n return base64nopad.decode(signature);\n}\n\nfunction invalidBtcSignatureFormatError(cause?: unknown): LiquidiumError {\n return new LiquidiumError(\n LiquidiumErrorCode.SIGNATURE_ERROR,\n \"BTC signature must be hex or base64-encoded bytes\",\n cause\n );\n}\n","import type { RegisterProfileRequest } from \"../../core/canisters/lending/actor\";\nimport { LiquidiumError, LiquidiumErrorCode } from \"../../core/errors\";\nimport { Chain, type SigningChain } from \"../../core/types\";\nimport { normalizeWalletSignature } from \"../../core/utils/signature\";\nimport type { CreateAccountRequest } from \"./types\";\n\ninterface AccountBtcChainVariant {\n BTC: null;\n}\n\ninterface AccountEthChainVariant {\n ETH: null;\n}\n\ntype AccountChainVariant = AccountBtcChainVariant | AccountEthChainVariant;\n\nexport function mapCreateAccountRequestToRegisterProfileRequest(\n request: CreateAccountRequest\n): RegisterProfileRequest {\n const signingAccount = request.signatureInfo.account;\n if (!signingAccount) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n \"Account creation requires the signing account\"\n );\n }\n\n return {\n data: {\n expiry_timestamp: request.data.expiryTimestamp,\n },\n signature_info: {\n Wallet: {\n signature: normalizeWalletSignature(\n request.signatureInfo.signature,\n request.signatureInfo.chain\n ),\n chain: mapAccountChainToLendingChainVariant(\n request.signatureInfo.chain\n ),\n account: signingAccount,\n },\n },\n };\n}\n\nfunction mapAccountChainToLendingChainVariant(\n chain: SigningChain\n): AccountChainVariant {\n switch (chain) {\n case Chain.BTC:\n return { BTC: null };\n case Chain.ETH:\n return { ETH: null };\n }\n}\n","import { Principal } from \"@icp-sdk/core/principal\";\nimport {\n createLendingActor,\n type WalletRecord,\n} from \"../../core/canisters/lending/actor\";\nimport {\n mapCanisterCallErrorToLiquidiumError,\n mapLendingProtocolErrorToLiquidiumError,\n} from \"../../core/canisters/lending/error-mappers\";\nimport { LiquidiumError, LiquidiumErrorCode } from \"../../core/errors\";\nimport { normalizeEvmAddress } from \"../../core/evm\";\nimport type { CanisterContext } from \"../../core/transports/canister-context\";\nimport { Chain, type Wallet } from \"../../core/types\";\nimport { computeExpiryTimestampFromNow } from \"../../core/utils/time\";\nimport { getVariantKey } from \"../../core/utils/variant\";\nimport {\n WalletActionKind,\n WalletExecutionKind,\n} from \"../../core/wallet-actions\";\nimport { executeWith } from \"../../execute\";\nimport { mapCreateAccountRequestToRegisterProfileRequest } from \"./mappers\";\nimport type {\n CreateAccountAction,\n CreateAccountRequest,\n CreateProfileParams,\n PrepareCreateProfileOptions,\n} from \"./types\";\n\n/** Profile lifecycle and linked-wallet helpers. */\nexport class AccountsModule {\n constructor(private readonly canisterContext: CanisterContext) {}\n\n /**\n * Prepares a profile-creation action that can be signed and submitted later.\n *\n * Use this when you need direct control over the signing flow.\n *\n * @param options - `account` is the wallet address that will own the new profile.\n * @returns A signable {@link CreateAccountAction} with `submit` wired to the canister.\n */\n async prepareCreateProfile(\n options: PrepareCreateProfileOptions\n ): Promise<CreateAccountAction> {\n return await this.buildCreateProfileAction(options.account);\n }\n\n /**\n * Creates a Liquidium profile using the provided wallet adapter.\n *\n * This is the convenience form of `prepareCreateProfile(...)` plus execution.\n *\n * @param params - Wallet `account`, signing `chain`, and `walletAdapter` with `signMessage`.\n * @returns The new profile principal as text.\n */\n async createProfile(params: CreateProfileParams): Promise<string> {\n const account = normalizeProfileAccount(params.account);\n const action = await this.prepareCreateProfile({\n account,\n });\n\n return await executeWith({\n walletAdapter: params.walletAdapter,\n chain: params.chain,\n account,\n })(action);\n }\n\n /**\n * Resolves the Liquidium profile id linked to a wallet address.\n *\n * @param walletAddress - Wallet address string as registered with the protocol.\n * @returns Profile principal text, or `null` if none exists.\n */\n async getProfileId(walletAddress: string): Promise<string | null> {\n try {\n const account = normalizeProfileAccount(walletAddress);\n const profile = await createLendingActor(\n this.canisterContext\n ).get_wallet_profile(account);\n\n return profile[0]?.toText() ?? null;\n } catch (error) {\n if (error instanceof LiquidiumError) {\n throw error;\n }\n\n throw mapCanisterCallErrorToLiquidiumError(\"get_wallet_profile\", error);\n }\n }\n\n /**\n * Returns the current nonce for a wallet address.\n *\n * This is mainly useful for custom signing flows built on prepared actions.\n *\n * @param walletAddress - Wallet address used in `get_nonce` on the lending canister.\n * @returns The next signing nonce as a bigint.\n */\n async getWalletNonce(walletAddress: string): Promise<bigint> {\n try {\n const account = normalizeProfileAccount(walletAddress);\n return await createLendingActor(this.canisterContext).get_nonce(account);\n } catch (error) {\n if (error instanceof LiquidiumError) {\n throw error;\n }\n\n throw mapCanisterCallErrorToLiquidiumError(\"get_nonce\", error);\n }\n }\n\n /**\n * Lists the wallets currently linked to a profile.\n *\n * @param profileId - The Liquidium profile principal text.\n * @returns The wallets currently linked to the requested profile.\n */\n async listLinkedWallets(profileId: string): Promise<Wallet[]> {\n try {\n const wallets = await createLendingActor(\n this.canisterContext\n ).get_profile_wallets(Principal.fromText(profileId));\n\n return wallets.map(mapCanisterWalletToWallet);\n } catch (error) {\n if (error instanceof LiquidiumError) {\n throw error;\n }\n\n throw mapCanisterCallErrorToLiquidiumError(\"get_profile_wallets\", error);\n }\n }\n\n private async buildCreateProfileAction(\n account: string\n ): Promise<CreateAccountAction> {\n try {\n const normalizedAccount = normalizeProfileAccount(account);\n\n const nonce = await createLendingActor(this.canisterContext).get_nonce(\n normalizedAccount\n );\n const expiryTimestamp = computeExpiryTimestampFromNow();\n\n return {\n kind: WalletActionKind.createAccount,\n executionKind: WalletExecutionKind.signMessage,\n actionType: WalletActionKind.createAccount,\n account: normalizedAccount,\n message: createInitializeAccountMessage(expiryTimestamp, nonce),\n data: {\n expiryTimestamp,\n },\n submit: async (signatureInfo) => {\n return await this.submitCreateProfile({\n data: {\n expiryTimestamp,\n },\n signatureInfo: {\n ...signatureInfo,\n account: normalizeProfileAccount(\n signatureInfo.account ?? normalizedAccount\n ),\n },\n });\n },\n };\n } catch (error) {\n if (error instanceof LiquidiumError) {\n throw error;\n }\n\n throw mapCanisterCallErrorToLiquidiumError(\"get_nonce\", error);\n }\n }\n\n private async submitCreateProfile(\n request: CreateAccountRequest\n ): Promise<string> {\n try {\n const signingAccount = request.signatureInfo.account;\n if (!signingAccount) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n \"Account creation requires the signing account\"\n );\n }\n\n await assertWalletHasNoProfile(this.canisterContext, signingAccount);\n\n const result = await createLendingActor(\n this.canisterContext\n ).register_profile(\n mapCreateAccountRequestToRegisterProfileRequest(request)\n );\n\n if (\"Err\" in result) {\n throw mapLendingProtocolErrorToLiquidiumError(result.Err);\n }\n\n return result.Ok.toText();\n } catch (error) {\n if (error instanceof LiquidiumError) {\n throw error;\n }\n\n throw mapCanisterCallErrorToLiquidiumError(\"register_profile\", error);\n }\n }\n}\n\nfunction normalizeProfileAccount(account: string): string {\n return normalizeEvmAddress(account);\n}\n\nfunction createInitializeAccountMessage(\n expiryTimestamp: bigint,\n nonce: bigint\n): string {\n return `Liquidium: Initialize Account\n\nAction: Create new account\nExpires: ${expiryTimestamp}\nNonce: ${nonce}`;\n}\n\nasync function assertWalletHasNoProfile(\n canisterContext: CanisterContext,\n walletAddress: string\n): Promise<void> {\n const existingProfile =\n await createLendingActor(canisterContext).get_wallet_profile(walletAddress);\n const profileId = existingProfile[0]?.toText();\n\n if (!profileId) {\n return;\n }\n\n throw new LiquidiumError(\n LiquidiumErrorCode.PROFILE_ALREADY_EXISTS,\n `Wallet address is already linked to profile ${profileId}`\n );\n}\n\nfunction mapCanisterWalletToWallet(canisterWallet: WalletRecord): Wallet {\n const walletChain = getVariantKey(canisterWallet.chain.Wallet);\n\n switch (walletChain) {\n case Chain.BTC:\n case Chain.ETH:\n return {\n address: canisterWallet.address,\n chain: walletChain,\n };\n default:\n throw new LiquidiumError(\n LiquidiumErrorCode.INTERNAL,\n `Unsupported wallet chain returned for profile wallet: ${walletChain}`\n );\n }\n}\n","import { idlLabelToId } from \"@icp-sdk/core/candid\";\n\n// Asset and chain tags supported by this SDK version. Unknown tags returned by\n// the canister are ignored rather than causing the whole call to fail.\nexport const KNOWN_ASSET_TAGS = [\"BTC\", \"ICP\", \"USDC\", \"USDT\"] as const;\nexport const KNOWN_CHAIN_TAGS = [\"BTC\", \"ETH\", \"ICP\"] as const;\n\nexport type KnownAssetTag = (typeof KNOWN_ASSET_TAGS)[number];\nexport type KnownChainTag = (typeof KNOWN_CHAIN_TAGS)[number];\n\nexport function extractVariantTag<T extends string>(\n variant: object,\n knownTags: readonly T[]\n): T | null {\n const [key] = Object.keys(variant);\n\n if (!key) {\n return null;\n }\n\n // Known variants decoded by a matching IDL already use the tag name.\n if (knownTags.includes(key as T)) {\n return key as T;\n }\n\n // IDL.Unknown returns variants with hashed field names: _${hash}_\n const hashMatch = /^_(\\d+)_$/.exec(key);\n if (!hashMatch) {\n return null;\n }\n\n const hash = Number(hashMatch[1]);\n\n for (const tag of knownTags) {\n if (idlLabelToId(tag) === hash) {\n return tag;\n }\n }\n\n return null;\n}\n","import type { ActorMethod } from \"@icp-sdk/core/agent\";\nimport { Actor } from \"@icp-sdk/core/agent\";\nimport type { IDL } from \"@icp-sdk/core/candid\";\nimport type { Principal } from \"@icp-sdk/core/principal\";\nimport { LiquidiumError, LiquidiumErrorCode } from \"../../errors\";\nimport type { CanisterContext } from \"../../transports/canister-context\";\nimport { extractVariantTag, KNOWN_ASSET_TAGS } from \"../../utils/variant-tags\";\nimport type {\n CreateSimpleLoanCanisterRequest,\n HeadlessLoanCreatedEventPayload,\n HeadlessLoanEventType,\n HeadlessLoansConfig,\n SimpleLoanAccountType,\n SimpleLoanAuthorisation,\n SimpleLoansCanisterError,\n WarmedProfile,\n} from \"./actor\";\n\ninterface FlexibleSimpleLoanAccountIdentifierAccountType {\n AccountIdentifier: string;\n}\n\ninterface FlexibleSimpleLoanIcrcAccount {\n owner: Principal;\n subaccount: [] | [Uint8Array];\n}\n\ninterface FlexibleSimpleLoanIcrcAccountType {\n Icrc: FlexibleSimpleLoanIcrcAccount;\n}\n\ntype FlexibleSimpleLoanAccountType =\n | SimpleLoanAccountType\n | FlexibleSimpleLoanAccountIdentifierAccountType\n | FlexibleSimpleLoanIcrcAccountType;\n\nexport interface FlexibleCreateSimpleLoanCanisterResponse {\n loan_id: bigint;\n lending_profile: Principal;\n}\n\nexport interface FlexibleHeadlessLoanCreatedEventPayload {\n loan_id: bigint;\n borrow_destination: FlexibleSimpleLoanAccountType;\n lend_asset: object;\n borrow_amount: bigint;\n lend_pool_id: Principal;\n refund_destination: FlexibleSimpleLoanAccountType;\n ltv_max_bps: bigint;\n ltv_timer_s: bigint;\n lending_profile: Principal;\n borrow_pool_id: Principal;\n borrow_asset: object;\n}\n\nexport interface FlexibleHeadlessLoanCreatedEventType {\n LoanCreated: FlexibleHeadlessLoanCreatedEventPayload;\n}\n\nexport type FlexibleHeadlessLoanEventType =\n | FlexibleHeadlessLoanCreatedEventType\n | HeadlessLoanEventTypeWithoutAssets;\n\ntype HeadlessLoanEventTypeWithoutAssets = Exclude<\n HeadlessLoanEventType,\n { LoanCreated: HeadlessLoanCreatedEventPayload }\n>;\n\nexport interface FlexibleHeadlessLoanEvent {\n id: bigint;\n schema_version: number;\n timestamp: bigint;\n event_type: FlexibleHeadlessLoanEventType;\n}\n\nexport interface FlexibleSimpleLoanCanisterRecord {\n id: bigint;\n authorisation: SimpleLoanAuthorisation;\n borrow_destination: FlexibleSimpleLoanAccountType;\n started: boolean;\n lend_asset: object;\n created_at: bigint;\n schema_version: number;\n borrow_amount: bigint;\n lend_pool_id: Principal;\n refund_destination: FlexibleSimpleLoanAccountType;\n ltv_max_bps: bigint;\n ltv_timer_s: bigint;\n lending_profile: Principal;\n borrow_pool_id: Principal;\n borrow_asset: object;\n expires_at: [] | [bigint];\n deposit_detected_ts: [] | [bigint];\n}\n\nexport interface DecodedHeadlessLoanCreatedEventPayload {\n loan_id: bigint;\n borrow_destination: FlexibleSimpleLoanAccountType;\n lend_asset: string;\n borrow_amount: bigint;\n lend_pool_id: Principal;\n refund_destination: FlexibleSimpleLoanAccountType;\n ltv_max_bps: bigint;\n ltv_timer_s: bigint;\n lending_profile: Principal;\n borrow_pool_id: Principal;\n borrow_asset: string;\n}\n\nexport type DecodedHeadlessLoanEventType =\n | { LoanCreated: DecodedHeadlessLoanCreatedEventPayload }\n | HeadlessLoanEventTypeWithoutAssets;\n\nexport interface DecodedHeadlessLoanEvent {\n id: bigint;\n schema_version: number;\n timestamp: bigint;\n event_type: DecodedHeadlessLoanEventType;\n}\n\nexport interface DecodedSimpleLoanCanisterRecord {\n id: bigint;\n authorisation: SimpleLoanAuthorisation;\n borrow_destination: FlexibleSimpleLoanAccountType;\n started: boolean;\n lend_asset: string;\n created_at: bigint;\n schema_version: number;\n borrow_amount: bigint;\n lend_pool_id: Principal;\n refund_destination: FlexibleSimpleLoanAccountType;\n ltv_max_bps: bigint;\n ltv_timer_s: bigint;\n lending_profile: Principal;\n borrow_pool_id: Principal;\n borrow_asset: string;\n expires_at: [] | [bigint];\n deposit_detected_ts: [] | [bigint];\n}\n\ntype FlexibleResult<T> = { Ok: T } | { Err: SimpleLoansCanisterError };\n\nexport interface FlexibleSimpleLoansActor {\n create_loan: ActorMethod<\n [CreateSimpleLoanCanisterRequest],\n FlexibleResult<FlexibleCreateSimpleLoanCanisterResponse>\n >;\n count_warmed_profiles: ActorMethod<[], bigint>;\n get_config: ActorMethod<[], HeadlessLoansConfig>;\n get_event: ActorMethod<[bigint], [] | [FlexibleHeadlessLoanEvent]>;\n get_loan: ActorMethod<\n [bigint],\n FlexibleResult<FlexibleSimpleLoanCanisterRecord>\n >;\n list_access_list: ActorMethod<[], Principal[]>;\n list_events: ActorMethod<\n [bigint, bigint],\n Array<[bigint, FlexibleHeadlessLoanEvent]>\n >;\n list_warmed_profiles: ActorMethod<[], WarmedProfile[]>;\n}\n\nconst flexibleSimpleLoansIdlFactory: IDL.InterfaceFactory = ({ IDL }) => {\n const IcrcAccount = IDL.Record({\n owner: IDL.Principal,\n subaccount: IDL.Opt(IDL.Vec(IDL.Nat8)),\n });\n const AccountType = IDL.Variant({\n Icrc: IcrcAccount,\n Native: IDL.Principal,\n AccountIdentifier: IDL.Text,\n External: IDL.Text,\n });\n const SignatureVerificationError = IDL.Variant({\n InvalidEthSignature: IDL.Null,\n UnsupportedChain: IDL.Null,\n InvalidSolSignature: IDL.Null,\n InvalidEthAddress: IDL.Null,\n CouldNotDecode: IDL.Text,\n ProfileNotFound: IDL.Null,\n InvalidBtcSignature: IDL.Null,\n });\n const ProtocolError = IDL.Variant({\n PositionNotFound: IDL.Null,\n Internal: IDL.Text,\n InvalidAddress: IDL.Text,\n InvalidTargetPrincipal: IDL.Null,\n SignatureError: SignatureVerificationError,\n SupplyCapExceeded: IDL.Null,\n AccountNotFound: IDL.Null,\n NotAllowed: IDL.Text,\n PoolNotFound: IDL.Text,\n FeeClaimReceiverNotConfigured: IDL.Null,\n InsufficientCollateral: IDL.Null,\n ProfileNotFound: IDL.Null,\n SignatureExpiryTooFarInFuture: IDL.Null,\n MaxLtvExceeded: IDL.Null,\n ProfileAlreadyExists: IDL.Null,\n LiquidationNotFound: IDL.Text,\n HealthFactorTooLow: IDL.Null,\n NoLiquidity: IDL.Null,\n SignatureExpired: IDL.Null,\n BorrowingDisabled: IDL.Null,\n BorrowCapExceeded: IDL.Null,\n PoolFrozen: IDL.Null,\n TransferFailed: IDL.Text,\n AccountAlreadyLinked: IDL.Null,\n CannotRemoveSoleAccount: IDL.Null,\n InsufficientFunds: IDL.Null,\n });\n const SimpleLoansError = IDL.Variant({\n BorrowAmountRequired: IDL.Null,\n NoCollateralPosition: IDL.Record({ loan_id: IDL.Nat }),\n LtvTimerOutOfRange: IDL.Record({ max: IDL.Nat64 }),\n LtvMaxExceeded: IDL.Record({\n actual_bps: IDL.Nat64,\n max_bps: IDL.Nat64,\n }),\n MemoryLockFailed: IDL.Record({ reason: IDL.Text }),\n UnauthorizedAccessListCaller: IDL.Record({ caller: IDL.Principal }),\n LendingClient: IDL.Variant({\n CallFailed: IDL.Record({ method: IDL.Text, reason: IDL.Text }),\n CallRejected: IDL.Record({ method: IDL.Text, reason: IDL.Text }),\n DecodeFailed: IDL.Record({ method: IDL.Text, reason: IDL.Text }),\n }),\n LtvMaxOutOfRange: IDL.Record({ max: IDL.Nat64 }),\n AccountRequired: IDL.Record({ label: IDL.Text }),\n DepositTimerExceeded: IDL.Record({ loan_id: IDL.Nat }),\n LoanNotFound: IDL.Record({ loan_id: IDL.Nat }),\n LendingProtocolError: IDL.Record({\n error: ProtocolError,\n operation: IDL.Text,\n }),\n AuthorizationFailed: IDL.Record({ reason: IDL.Text }),\n DepositAlreadyProcessed: IDL.Record({ loan_id: IDL.Nat }),\n MissingPrice: IDL.Record({ symbol: IDL.Text }),\n InvalidLtvTimerS: IDL.Null,\n DebtNotFullyRepaid: IDL.Record({ loan_id: IDL.Nat }),\n EmptyCollateralPosition: IDL.Null,\n SigningFailed: IDL.Record({ reason: IDL.Text }),\n });\n const CreateLoanRequest = IDL.Record({\n borrow_destination: AccountType,\n lend_asset: IDL.Unknown,\n borrow_amount: IDL.Nat,\n lend_pool_id: IDL.Principal,\n refund_destination: AccountType,\n ltv_max_bps: IDL.Nat64,\n borrow_pool_id: IDL.Principal,\n borrow_asset: IDL.Unknown,\n ltv_timer_s: IDL.Nat64,\n });\n const CreateLoanResponse = IDL.Record({\n loan_id: IDL.Nat,\n lending_profile: IDL.Principal,\n });\n const CreateLoanResult = IDL.Variant({\n Ok: CreateLoanResponse,\n Err: SimpleLoansError,\n });\n const LoanLeg = IDL.Variant({ Lend: IDL.Null, Borrow: IDL.Null });\n const HeadlessLoanEventType = IDL.Variant({\n LoanCreated: IDL.Record({\n loan_id: IDL.Nat,\n borrow_destination: AccountType,\n lend_asset: IDL.Unknown,\n borrow_amount: IDL.Nat,\n lend_pool_id: IDL.Principal,\n refund_destination: AccountType,\n ltv_max_bps: IDL.Nat64,\n ltv_timer_s: IDL.Nat64,\n lending_profile: IDL.Principal,\n borrow_pool_id: IDL.Principal,\n borrow_asset: IDL.Unknown,\n }),\n FullLendWithdrawalRequested: IDL.Record({\n loan_id: IDL.Nat,\n account: AccountType,\n pool_id: IDL.Principal,\n }),\n BorrowRequested: IDL.Record({\n loan_id: IDL.Nat,\n account: AccountType,\n pool_id: IDL.Principal,\n amount: IDL.Nat,\n }),\n DepositTimerExceeded: IDL.Record({ loan_id: IDL.Nat }),\n StuckFundsWithdrawalRequested: IDL.Record({\n leg: LoanLeg,\n loan_id: IDL.Nat,\n account: AccountType,\n pool_id: IDL.Principal,\n amount: IDL.Nat,\n }),\n ProfileWarmed: IDL.Record({\n derivation_index: IDL.Vec(IDL.Nat8),\n warmed_profile_id: IDL.Nat,\n eth_address: IDL.Text,\n lending_profile: IDL.Principal,\n }),\n RepayComplete: CreateLoanResponse,\n DepositTimerStarted: IDL.Record({\n loan_id: IDL.Nat,\n timestamp: IDL.Nat64,\n }),\n });\n const HeadlessLoanEvent = IDL.Record({\n id: IDL.Nat,\n schema_version: IDL.Nat16,\n timestamp: IDL.Nat64,\n event_type: HeadlessLoanEventType,\n });\n const AuthorisationType = IDL.Variant({\n EthSignature: IDL.Record({\n derivation_index: IDL.Vec(IDL.Nat8),\n pubkey: IDL.Vec(IDL.Nat8),\n address: IDL.Text,\n }),\n });\n const Loan = IDL.Record({\n id: IDL.Nat,\n authorisation: AuthorisationType,\n borrow_destination: AccountType,\n started: IDL.Bool,\n lend_asset: IDL.Unknown,\n created_at: IDL.Nat64,\n schema_version: IDL.Nat16,\n borrow_amount: IDL.Nat,\n lend_pool_id: IDL.Principal,\n refund_destination: AccountType,\n ltv_max_bps: IDL.Nat64,\n ltv_timer_s: IDL.Nat64,\n lending_profile: IDL.Principal,\n expires_at: IDL.Opt(IDL.Nat64),\n borrow_pool_id: IDL.Principal,\n borrow_asset: IDL.Unknown,\n deposit_detected_ts: IDL.Opt(IDL.Nat64),\n });\n const LoanResult = IDL.Variant({ Ok: Loan, Err: SimpleLoansError });\n const HeadlessLoansConfig = IDL.Record({\n lending_canister: IDL.Principal,\n });\n const WarmedProfile = IDL.Record({\n id: IDL.Nat,\n authorisation: AuthorisationType,\n created_at: IDL.Nat64,\n lending_profile: IDL.Principal,\n });\n\n return IDL.Service({\n count_warmed_profiles: IDL.Func([], [IDL.Nat64], [\"query\"]),\n create_loan: IDL.Func([CreateLoanRequest], [CreateLoanResult], []),\n get_config: IDL.Func([], [HeadlessLoansConfig], [\"query\"]),\n get_event: IDL.Func([IDL.Nat], [IDL.Opt(HeadlessLoanEvent)], [\"query\"]),\n get_loan: IDL.Func([IDL.Nat], [LoanResult], [\"query\"]),\n list_access_list: IDL.Func([], [IDL.Vec(IDL.Principal)], [\"query\"]),\n list_events: IDL.Func(\n [IDL.Nat, IDL.Nat64],\n [IDL.Vec(IDL.Tuple(IDL.Nat, HeadlessLoanEvent))],\n [\"query\"]\n ),\n list_warmed_profiles: IDL.Func([], [IDL.Vec(WarmedProfile)], [\"query\"]),\n });\n};\n\nexport function createFlexibleSimpleLoansActor(\n canisterContext: CanisterContext\n): FlexibleSimpleLoansActor {\n const canisterId = canisterContext.canisterIds.simpleLoans;\n\n if (!canisterId) {\n throw new LiquidiumError(\n LiquidiumErrorCode.SERVICE_UNAVAILABLE,\n \"Simple Loans canister ID is not configured\"\n );\n }\n\n return Actor.createActor<FlexibleSimpleLoansActor>(\n flexibleSimpleLoansIdlFactory,\n {\n agent: canisterContext.agent,\n canisterId,\n }\n );\n}\n\nexport function decodeFlexibleSimpleLoanRecord(\n record: FlexibleSimpleLoanCanisterRecord\n): DecodedSimpleLoanCanisterRecord | null {\n const lend_asset = extractVariantTag(record.lend_asset, KNOWN_ASSET_TAGS);\n const borrow_asset = extractVariantTag(record.borrow_asset, KNOWN_ASSET_TAGS);\n\n if (!lend_asset || !borrow_asset) {\n return null;\n }\n\n return {\n id: record.id,\n authorisation: record.authorisation,\n borrow_destination: record.borrow_destination,\n started: record.started,\n lend_asset,\n created_at: record.created_at,\n schema_version: record.schema_version,\n borrow_amount: record.borrow_amount,\n lend_pool_id: record.lend_pool_id,\n refund_destination: record.refund_destination,\n ltv_max_bps: record.ltv_max_bps,\n ltv_timer_s: record.ltv_timer_s,\n lending_profile: record.lending_profile,\n borrow_pool_id: record.borrow_pool_id,\n borrow_asset,\n expires_at: record.expires_at,\n deposit_detected_ts: record.deposit_detected_ts,\n };\n}\n\nexport function decodeFlexibleHeadlessLoanEvent(\n event: FlexibleHeadlessLoanEvent\n): DecodedHeadlessLoanEvent | null {\n if (\"LoanCreated\" in event.event_type) {\n const decoded = decodeLoanCreatedEvent(event.event_type.LoanCreated);\n\n if (!decoded) {\n return null;\n }\n\n return {\n id: event.id,\n schema_version: event.schema_version,\n timestamp: event.timestamp,\n event_type: decoded,\n };\n }\n\n return {\n id: event.id,\n schema_version: event.schema_version,\n timestamp: event.timestamp,\n event_type: event.event_type as DecodedHeadlessLoanEventType,\n };\n}\n\nfunction decodeLoanCreatedEvent(\n payload: FlexibleHeadlessLoanCreatedEventPayload\n): DecodedHeadlessLoanEventType | null {\n const lend_asset = extractVariantTag(payload.lend_asset, KNOWN_ASSET_TAGS);\n const borrow_asset = extractVariantTag(\n payload.borrow_asset,\n KNOWN_ASSET_TAGS\n );\n\n if (!lend_asset || !borrow_asset) {\n return null;\n }\n\n return {\n LoanCreated: {\n loan_id: payload.loan_id,\n borrow_destination: payload.borrow_destination,\n lend_asset,\n borrow_amount: payload.borrow_amount,\n lend_pool_id: payload.lend_pool_id,\n refund_destination: payload.refund_destination,\n ltv_max_bps: payload.ltv_max_bps,\n ltv_timer_s: payload.ltv_timer_s,\n lending_profile: payload.lending_profile,\n borrow_pool_id: payload.borrow_pool_id,\n borrow_asset,\n },\n };\n}\n","/**\n * Path and query key constants for the Liquidium SDK HTTP API.\n */\n\nconst SDK_API_V1_PATH = \"/v1\";\nconst SDK_API_V2_PATH = \"/v2\";\n\nexport const SdkApiQueryParam = {\n cursor: \"cursor\",\n from: \"from\",\n filter: \"filter\",\n limit: \"limit\",\n market: \"market\",\n operations: \"operations\",\n poolId: \"poolId\",\n profileId: \"profileId\",\n states: \"states\",\n to: \"to\",\n} as const;\n\ninterface BuildActivitiesPathRequest {\n profileId: string;\n filter?: string;\n}\n\ninterface BuildActivityStatusPathRequest {\n profileId: string;\n id: string;\n}\n\ninterface BuildSimpleLoanFindPathRequest {\n query: string;\n}\n\ninterface BuildSimpleLoanCollateralHintPathRequest {\n loanId: bigint;\n}\n\nconst ACTIVITIES = `${SDK_API_V2_PATH}/activities`;\nconst HISTORY_USERS = `${SDK_API_V2_PATH}/history/users`;\nconst INFLOW = `${SDK_API_V2_PATH}/inflow`;\nconst SIMPLE_LOANS = `${SDK_API_V1_PATH}/instant-loans`;\n\nexport function buildHistoryUserTransactionsPath(\n user: string,\n query: URLSearchParams\n): string {\n const base = `${HISTORY_USERS}/${encodeURIComponent(user)}/transactions`;\n const qs = query.toString();\n return qs ? `${base}?${qs}` : base;\n}\n\nexport function buildHistoryUserLiquidationsPath(\n user: string,\n query: URLSearchParams\n): string {\n const base = `${HISTORY_USERS}/${encodeURIComponent(user)}/liquidations`;\n const qs = query.toString();\n return qs ? `${base}?${qs}` : base;\n}\n\nexport function buildActivitiesPath(\n request: BuildActivitiesPathRequest\n): string {\n const query = new URLSearchParams({\n [SdkApiQueryParam.profileId]: request.profileId,\n });\n if (request.filter) {\n query.set(SdkApiQueryParam.filter, request.filter);\n }\n\n return `${ACTIVITIES}?${query.toString()}`;\n}\n\nexport function buildActivityStatusPath(\n request: BuildActivityStatusPathRequest\n): string {\n const query = new URLSearchParams({\n [SdkApiQueryParam.profileId]: request.profileId,\n });\n\n return `${ACTIVITIES}/${encodeURIComponent(\n request.id\n )}/status?${query.toString()}`;\n}\n\nexport function buildSimpleLoanFindPath(\n request: BuildSimpleLoanFindPathRequest\n): string {\n const query = new URLSearchParams({ query: request.query });\n return `${SIMPLE_LOANS}/find?${query.toString()}`;\n}\n\nexport function buildSimpleLoanCollateralHintPath(\n request: BuildSimpleLoanCollateralHintPathRequest\n): string {\n return `${SIMPLE_LOANS}/${encodeURIComponent(\n request.loanId.toString()\n )}/collateral-hint`;\n}\n\nexport const SdkApiPath = {\n inflow: INFLOW,\n simpleLoans: SIMPLE_LOANS,\n} as const;\n","import { LiquidiumError, LiquidiumErrorCode } from \"../errors\";\n\nexport function ceilDivBigint(numerator: bigint, denominator: bigint): bigint {\n if (denominator === 0n) {\n throw new LiquidiumError(\n LiquidiumErrorCode.INTERNAL,\n \"ceilDivBigint called with zero denominator\"\n );\n }\n\n if (numerator === 0n) {\n return 0n;\n }\n\n const numeratorIsNegative = numerator < 0n;\n const denominatorIsNegative = denominator < 0n;\n const resultIsNegative = numeratorIsNegative !== denominatorIsNegative;\n\n const absNumerator = numeratorIsNegative ? -numerator : numerator;\n const absDenominator = denominatorIsNegative ? -denominator : denominator;\n\n if (resultIsNegative) {\n return -(absNumerator / absDenominator);\n }\n\n return (absNumerator + absDenominator - 1n) / absDenominator;\n}\n\nexport function parseBigInt(value: string, label: string): bigint {\n try {\n return BigInt(value);\n } catch (error) {\n throw new LiquidiumError(\n LiquidiumErrorCode.INTERNAL,\n `Invalid bigint returned for ${label}`,\n error\n );\n }\n}\n","/** Number of characters in a public simple loan reference. */\nexport const REF_LENGTH = 6;\n\n/** Crockford-style base32 alphabet used for public simple loan references. */\nexport const REF_ALPHABET = \"0123456789ABCDEFGHJKMNPQRSTVWXYZ\";\n\nconst BASE = 32n;\nconst MOD = BASE ** BigInt(REF_LENGTH);\nconst A = 1_103_515_245n;\nconst B = 123_456_789n;\nconst A_INVERSE = modInverse(A, MOD);\nconst ALPHABET_INDEX = new Map(\n [...REF_ALPHABET].map((character, index) => [character, BigInt(index)])\n);\n\n/**\n * Converts a canister loan id into a short user-facing reference.\n *\n * @param id - Canister loan id in the supported public-reference range.\n * @returns Fixed-length public reference string.\n */\nexport function publicIdFromInt(id: bigint): string {\n if (id < 0n || id >= MOD) throw new Error(\"id out of range\");\n return toBase32Fixed((id * A + B) % MOD);\n}\n\n/**\n * Decodes a short user-facing reference back into the canister loan id.\n *\n * @param ref - Fixed-length public reference string.\n * @returns Canister loan id represented by the reference.\n */\nexport function intFromPublicId(ref: string): bigint {\n const encodedId = fromBase32Fixed(ref.toUpperCase());\n const id = ((encodedId - B) * A_INVERSE) % MOD;\n return (id + MOD) % MOD;\n}\n\nfunction modInverse(value: bigint, modulo: bigint): bigint {\n let oldRemainder = value;\n let remainder = modulo;\n let oldCoefficient = 1n;\n let coefficient = 0n;\n\n while (remainder !== 0n) {\n const quotient = oldRemainder / remainder;\n\n [oldRemainder, remainder] = [\n remainder,\n oldRemainder - quotient * remainder,\n ];\n [oldCoefficient, coefficient] = [\n coefficient,\n oldCoefficient - quotient * coefficient,\n ];\n }\n\n if (oldRemainder !== 1n) throw new Error(\"value is not invertible\");\n\n return ((oldCoefficient % modulo) + modulo) % modulo;\n}\n\nfunction toBase32Fixed(value: bigint): string {\n let encoded = \"\";\n let remaining = value;\n for (let i = 0; i < REF_LENGTH; i++) {\n encoded = REF_ALPHABET[Number(remaining % BASE)] + encoded;\n remaining /= BASE;\n }\n return encoded;\n}\n\nfunction fromBase32Fixed(ref: string): bigint {\n if (ref.length !== REF_LENGTH) {\n throw new Error(`ref must be ${REF_LENGTH} characters`);\n }\n\n let decoded = 0n;\n for (const character of ref) {\n const value = ALPHABET_INDEX.get(character);\n if (value === undefined) {\n throw new Error(\"ref contains invalid character\");\n }\n\n decoded = decoded * BASE + value;\n }\n\n return decoded;\n}\n","import type { LiquidiumOperation, LiquidiumStatus } from \"../../core/status\";\nimport type { Chain } from \"../../core/types\";\n\n/** Activity list lifecycle filter. */\nexport const ActivityFilter = {\n active: \"active\",\n completed: \"completed\",\n all: \"all\",\n} as const;\n/** Activity list lifecycle filter. */\nexport type ActivityFilter =\n (typeof ActivityFilter)[keyof typeof ActivityFilter];\n\n/** Fee top-up state for an inflow activity. */\nexport interface ActivityTopUp {\n /** Whether another transfer is needed before processing can continue. */\n required: boolean;\n /** Total same-token deposited amount counted toward the current fee. */\n depositedAmount: bigint;\n /** Current deposit-address processing fee. */\n feeAmount: bigint;\n /** Additional amount needed before processing can start. */\n shortfallAmount: bigint;\n}\n\n/** Operation emitted by deposit or repayment inflows. */\nexport type InflowActivityOperation = Extract<\n LiquidiumOperation,\n \"deposit\" | \"repayment\"\n>;\n/** Operation emitted by borrow or withdrawal outflows. */\nexport type OutflowActivityOperation = Extract<\n LiquidiumOperation,\n \"borrow\" | \"withdrawal\"\n>;\n\nexport type InflowActivityStatus = LiquidiumStatus & {\n operation: InflowActivityOperation;\n};\nexport type OutflowActivityStatus = LiquidiumStatus & {\n operation: OutflowActivityOperation;\n};\n\ninterface BaseActivity {\n id: string;\n poolId: string;\n asset: string | null;\n chain: Chain | null;\n amount: bigint;\n timestampMs: number;\n /** Chain transaction ids associated with the activity when available. */\n txids?: string[];\n}\n\n/** Deposit or repayment activity returned by the activity API. */\nexport interface InflowActivity extends BaseActivity {\n /** Shared consumer-facing lifecycle status. */\n status: InflowActivityStatus;\n /** Fee top-up state when the inflow is below the current processing fee. */\n topUp?: ActivityTopUp;\n}\n\n/** Borrow or withdrawal activity returned by the activity API. */\nexport interface OutflowActivity extends BaseActivity {\n /** Shared consumer-facing lifecycle status. */\n status: OutflowActivityStatus;\n /** Outflows never carry top-up state. */\n topUp?: never;\n}\n\n/** Any activity returned by `activities.list` or `activities.getStatus`. */\nexport type Activity = InflowActivity | OutflowActivity;\n\n/** Shared request fields for listing activities. */\nexport interface BaseListActivitiesRequest {\n /** Optional lifecycle filter; defaults to `active`. */\n filter?: ActivityFilter;\n}\n\n/** Activity list request scoped to a Liquidium profile. */\nexport interface ListActivitiesByProfileRequest\n extends BaseListActivitiesRequest {\n /** Profile principal text to list activities for. */\n profileId: string;\n}\n\n/** Activity list request scoped to a simple loan short reference. */\nexport interface ListActivitiesByShortRefRequest\n extends BaseListActivitiesRequest {\n /** Simple loan short reference to list activities for. */\n shortRef: string;\n}\n\n/** Request for listing activities by profile id or simple loan short reference. */\nexport type ListActivitiesRequest =\n | ListActivitiesByProfileRequest\n | ListActivitiesByShortRefRequest;\n\n/** Shared request fields for an activity status lookup. */\nexport interface BaseGetActivityStatusRequest {\n /** Activity or receipt id to look up. */\n id: string;\n}\n\n/** Activity status lookup scoped to a Liquidium profile. */\nexport interface GetActivityStatusByProfileRequest\n extends BaseGetActivityStatusRequest {\n /** Profile principal text that owns the activity. */\n profileId: string;\n}\n\n/** Activity status lookup scoped to a simple loan short reference. */\nexport interface GetActivityStatusByShortRefRequest\n extends BaseGetActivityStatusRequest {\n /** Simple loan short reference that owns the activity. */\n shortRef: string;\n}\n\n/** Request for fetching one activity by id and owner identifier. */\nexport type GetActivityStatusRequest =\n | GetActivityStatusByProfileRequest\n | GetActivityStatusByShortRefRequest;\n\n/** Successful activity status lookup result. */\nexport interface ActivityStatusFoundResponse {\n /** Indicates the activity was found. */\n found: true;\n /** Matched activity. */\n activity: Activity;\n}\n\n/** Missing activity status lookup result. */\nexport interface ActivityStatusNotFoundResponse {\n /** Indicates the activity was not found. */\n found: false;\n /** Requested activity or receipt id. */\n id: string;\n}\n\n/** Result of an activity status lookup. */\nexport type GetActivityStatusResponse =\n | ActivityStatusFoundResponse\n | ActivityStatusNotFoundResponse;\n","import type { SimpleLoansCanisterError } from \"../../core/canisters/simple-loans/actor\";\nimport { createFlexibleSimpleLoansActor } from \"../../core/canisters/simple-loans/flexible-actor\";\nimport { LiquidiumError, LiquidiumErrorCode } from \"../../core/errors\";\nimport {\n buildActivitiesPath,\n buildActivityStatusPath,\n} from \"../../core/sdk-api-paths\";\nimport type { LiquidiumStatus } from \"../../core/status\";\nimport type { ApiClient } from \"../../core/transports/api-client\";\nimport type { CanisterContext } from \"../../core/transports/canister-context\";\nimport type { Chain } from \"../../core/types\";\nimport { parseBigInt } from \"../../core/utils/bigint\";\nimport { intFromPublicId } from \"../simple-loans/ref-code\";\nimport type {\n Activity,\n ActivityTopUp,\n GetActivityStatusRequest,\n GetActivityStatusResponse,\n InflowActivity,\n InflowActivityStatus,\n ListActivitiesRequest,\n OutflowActivity,\n OutflowActivityStatus,\n} from \"./types\";\nimport { ActivityFilter } from \"./types\";\n\ninterface ActivityTopUpWire\n extends Omit<\n ActivityTopUp,\n \"depositedAmount\" | \"feeAmount\" | \"shortfallAmount\"\n > {\n depositedAmount: string;\n feeAmount: string;\n shortfallAmount: string;\n}\n\ninterface ActivityWire {\n id: string;\n poolId: string;\n asset: string | null;\n chain: Chain | null;\n amount: string;\n timestampMs: number;\n txids?: string[];\n status: LiquidiumStatus;\n topUp?: ActivityTopUpWire;\n}\n\ninterface ListActivitiesResponseWire {\n activities: ActivityWire[];\n}\n\ninterface ActivityStatusFoundResponseWire {\n found: true;\n activity: ActivityWire;\n}\n\ninterface ActivityStatusNotFoundResponseWire {\n found: false;\n id: string;\n}\n\ntype ActivityStatusResponseWire =\n | ActivityStatusFoundResponseWire\n | ActivityStatusNotFoundResponseWire;\n\n/** Receipt-oriented activity list and status helpers. */\nexport class ActivitiesModule {\n constructor(\n private readonly apiClient: ApiClient | undefined,\n private readonly canisterContext: CanisterContext\n ) {}\n\n /**\n * Lists profile activities. Defaults to active activities.\n *\n * Uses the Liquidium SDK API.\n *\n * @param request - Profile id or simple loan short reference plus optional lifecycle filter.\n * @returns Activities owned by the resolved profile.\n */\n async list(request: ListActivitiesRequest): Promise<Activity[]> {\n const apiClient = this.requireApi();\n const profileId = await this.resolveProfileId(request);\n const response = await apiClient.get<ListActivitiesResponseWire>(\n buildActivitiesPath({\n profileId,\n filter: request.filter ?? ActivityFilter.active,\n })\n );\n\n return response.activities.map(mapActivity);\n }\n\n /**\n * Fetches the latest status for a single receipt/activity id.\n *\n * Uses the Liquidium SDK API.\n *\n * @param request - Activity id plus profile id or simple loan short reference.\n * @returns The activity when found, otherwise `{ found: false }` with the requested id.\n */\n async getStatus(\n request: GetActivityStatusRequest\n ): Promise<GetActivityStatusResponse> {\n const apiClient = this.requireApi();\n const profileId = await this.resolveProfileId(request);\n const response = await apiClient.get<ActivityStatusResponseWire>(\n buildActivityStatusPath({ id: request.id, profileId })\n );\n\n if (!response.found) {\n return { found: false, id: response.id };\n }\n\n return {\n found: true,\n activity: mapActivity(response.activity),\n };\n }\n\n private requireApi(): ApiClient {\n if (!this.apiClient) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n \"Activities require an API client\"\n );\n }\n\n return this.apiClient;\n }\n\n private async resolveProfileId(\n request: GetActivityStatusRequest | ListActivitiesRequest\n ): Promise<string> {\n if (\"profileId\" in request) {\n return request.profileId;\n }\n\n let loanId: bigint;\n try {\n loanId = intFromPublicId(request.shortRef.trim());\n } catch (error) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n \"Invalid simple loan reference\",\n error\n );\n }\n\n try {\n const result = await createFlexibleSimpleLoansActor(\n this.canisterContext\n ).get_loan(loanId);\n\n if (\"Err\" in result) {\n throw mapSimpleLoanLookupError(result.Err);\n }\n\n return result.Ok.lending_profile.toText();\n } catch (error) {\n if (error instanceof LiquidiumError) {\n throw error;\n }\n\n throw new LiquidiumError(\n LiquidiumErrorCode.CANISTER_REJECTED,\n \"Unable to resolve simple loan reference\",\n error\n );\n }\n }\n}\n\nfunction mapSimpleLoanLookupError(\n error: SimpleLoansCanisterError\n): LiquidiumError {\n const [key] = Object.entries(error)[0] ?? [\"Unknown\"];\n\n if (key === \"LoanNotFound\") {\n return new LiquidiumError(\n LiquidiumErrorCode.POSITION_NOT_FOUND,\n \"Simple loan not found\"\n );\n }\n\n return new LiquidiumError(LiquidiumErrorCode.INTERNAL, key);\n}\n\nfunction mapActivity(wire: ActivityWire): Activity {\n const amount = parseBigInt(wire.amount, \"activity amount\");\n\n if (isInflowOperation(wire.status.operation)) {\n const activity: InflowActivity = {\n id: wire.id,\n poolId: wire.poolId,\n asset: wire.asset,\n chain: wire.chain,\n amount,\n timestampMs: wire.timestampMs,\n status: wire.status as InflowActivityStatus,\n };\n\n if (wire.txids) {\n activity.txids = wire.txids;\n }\n\n if (wire.topUp) {\n activity.topUp = mapActivityTopUp(wire.topUp);\n }\n\n return activity;\n }\n\n if (isOutflowOperation(wire.status.operation)) {\n const activity: OutflowActivity = {\n id: wire.id,\n poolId: wire.poolId,\n asset: wire.asset,\n chain: wire.chain,\n amount,\n timestampMs: wire.timestampMs,\n status: wire.status as OutflowActivityStatus,\n };\n\n if (wire.txids) {\n activity.txids = wire.txids;\n }\n\n return activity;\n }\n\n throw new LiquidiumError(\n LiquidiumErrorCode.INTERNAL,\n `Invalid activity operation: ${wire.status.operation}`\n );\n}\n\nfunction isInflowOperation(operation: LiquidiumStatus[\"operation\"]): boolean {\n return operation === \"deposit\" || operation === \"repayment\";\n}\n\nfunction isOutflowOperation(operation: LiquidiumStatus[\"operation\"]): boolean {\n return operation === \"borrow\" || operation === \"withdrawal\";\n}\n\nfunction mapActivityTopUp(wire: ActivityTopUpWire): ActivityTopUp {\n return {\n required: wire.required,\n depositedAmount: parseBigInt(\n wire.depositedAmount,\n \"activity top-up deposited amount\"\n ),\n feeAmount: parseBigInt(wire.feeAmount, \"activity top-up fee amount\"),\n shortfallAmount: parseBigInt(\n wire.shortfallAmount,\n \"activity top-up shortfall amount\"\n ),\n };\n}\n","import { LiquidiumError, LiquidiumErrorCode } from \"../../core/errors\";\nimport {\n buildHistoryUserLiquidationsPath,\n buildHistoryUserTransactionsPath,\n SdkApiQueryParam,\n} from \"../../core/sdk-api-paths\";\nimport type { ApiClient } from \"../../core/transports/api-client\";\nimport { parseBigInt } from \"../../core/utils/bigint\";\nimport type {\n PaginatedResponse,\n UserHistoryResponse,\n UserLiquidationHistoryEntry,\n UserLiquidationHistoryFilters,\n UserTransactionHistoryEntry,\n UserTransactionHistoryFilters,\n} from \"./types\";\n\n/** Historical user transaction and liquidation data helpers. */\nexport class HistoryModule {\n constructor(private readonly apiClient: ApiClient | undefined) {}\n\n private requireApi(): ApiClient {\n if (!this.apiClient) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n \"History requires an API client\"\n );\n }\n\n return this.apiClient;\n }\n\n /**\n * Returns transaction history for a user.\n *\n * @param user - The Liquidium profile principal text.\n * @param filters - Optional pool, operation, state, time range, and pagination filters.\n * @returns Paginated user history entries.\n */\n async getUserTransactionHistory(\n user: string,\n filters: UserTransactionHistoryFilters = {}\n ): Promise<PaginatedResponse<UserTransactionHistoryEntry>> {\n const apiClient = this.requireApi();\n const query = new URLSearchParams();\n\n if (filters.cursor) {\n query.set(SdkApiQueryParam.cursor, filters.cursor);\n }\n if (filters.market) {\n query.set(SdkApiQueryParam.market, filters.market);\n }\n if (filters.poolId) {\n query.set(SdkApiQueryParam.poolId, filters.poolId);\n }\n if (filters.operations?.length) {\n query.set(SdkApiQueryParam.operations, filters.operations.join(\",\"));\n }\n if (filters.states?.length) {\n query.set(\n SdkApiQueryParam.states,\n createHistoryStateFilterParam(filters.states)\n );\n }\n if (filters.from) {\n query.set(SdkApiQueryParam.from, filters.from);\n }\n if (filters.to) {\n query.set(SdkApiQueryParam.to, filters.to);\n }\n if (filters.limit !== undefined) {\n query.set(SdkApiQueryParam.limit, String(filters.limit));\n }\n\n const requestPath = buildHistoryUserTransactionsPath(user, query);\n const response = await apiClient.get<UserHistoryResponse>(requestPath);\n\n return {\n items: response.items.map(mapUserTransactionHistoryEntry),\n nextCursor: response.nextCursor,\n };\n }\n\n /**\n * Returns liquidation history for a user.\n *\n * @param user - The Liquidium profile principal text.\n * @param filters - Optional pool, time range, and pagination filters.\n * @returns Paginated liquidation history entries.\n */\n async getLiquidationHistory(\n user: string,\n filters: UserLiquidationHistoryFilters = {}\n ): Promise<PaginatedResponse<UserLiquidationHistoryEntry>> {\n const apiClient = this.requireApi();\n const query = new URLSearchParams();\n if (filters.cursor) {\n query.set(SdkApiQueryParam.cursor, filters.cursor);\n }\n if (filters.market) {\n query.set(SdkApiQueryParam.market, filters.market);\n }\n if (filters.poolId) {\n query.set(SdkApiQueryParam.poolId, filters.poolId);\n }\n if (filters.from) {\n query.set(SdkApiQueryParam.from, filters.from);\n }\n if (filters.to) {\n query.set(SdkApiQueryParam.to, filters.to);\n }\n if (filters.limit !== undefined) {\n query.set(SdkApiQueryParam.limit, String(filters.limit));\n }\n\n const requestPath = buildHistoryUserLiquidationsPath(user, query);\n const response = await apiClient.get<UserHistoryResponse>(requestPath);\n\n return {\n items: response.items.map(mapUserLiquidationHistoryEntry),\n nextCursor: response.nextCursor,\n };\n }\n}\n\nfunction mapUserTransactionHistoryEntry(\n item: UserHistoryResponse[\"items\"][number]\n): UserTransactionHistoryEntry {\n return {\n id: item.id,\n amount: parseBigInt(item.amount, \"history user amount\"),\n poolId: item.poolId,\n timestamp: item.timestamp,\n status: item.status,\n txids: item.txids,\n };\n}\n\nfunction mapUserLiquidationHistoryEntry(\n item: UserHistoryResponse[\"items\"][number]\n): UserLiquidationHistoryEntry {\n if (\n item.status.operation !== \"liquidation\" ||\n item.status.state !== \"completed\"\n ) {\n throw new LiquidiumError(\n LiquidiumErrorCode.INTERNAL,\n `Invalid liquidation history status: ${item.status.state}`\n );\n }\n\n return {\n id: item.id,\n amount: parseBigInt(item.amount, \"history user amount\"),\n poolId: item.poolId,\n timestamp: item.timestamp,\n status: item.status,\n txids: item.txids,\n };\n}\n\nfunction createHistoryStateFilterParam(states: string[]): string {\n for (const state of states) {\n validateHistoryStateFilter(state);\n }\n\n return [...new Set(states)].join(\",\");\n}\n\nfunction validateHistoryStateFilter(state: string): void {\n switch (state) {\n case \"action_required\":\n case \"confirming\":\n case \"processing\":\n case \"completed\":\n case \"failed\":\n return;\n default:\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n `History state filter is not supported: ${state}`\n );\n }\n}\n","import type { Principal } from \"@icp-sdk/core/principal\";\nimport { LiquidiumError, LiquidiumErrorCode } from \"../errors\";\nimport { SupplyAction } from \"../types\";\n\nconst INFLOW_DEPOSIT_PREFIX = 0x1;\nconst INFLOW_REPAY_PREFIX = 0x2;\nconst MAX_PRINCIPAL_BYTES = 29;\nconst SUBACCOUNT_LENGTH = 32;\nconst PRINCIPAL_LENGTH_OFFSET = 2;\nconst PRINCIPAL_START_OFFSET = 3;\n\ninterface EncodeInflowSubaccountRequest {\n action: SupplyAction;\n principal: Principal;\n}\n\nexport function encodeInflowSubaccount(\n request: EncodeInflowSubaccountRequest\n): Uint8Array {\n const subaccount = new Uint8Array(SUBACCOUNT_LENGTH);\n const principalBytes = request.principal.toUint8Array();\n\n if (principalBytes.length > MAX_PRINCIPAL_BYTES) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n \"Principal length exceeds inflow subaccount capacity\"\n );\n }\n\n subaccount[0] =\n request.action === SupplyAction.deposit\n ? INFLOW_DEPOSIT_PREFIX\n : INFLOW_REPAY_PREFIX;\n subaccount[PRINCIPAL_LENGTH_OFFSET] = principalBytes.length;\n subaccount.set(principalBytes, PRINCIPAL_START_OFFSET);\n\n return subaccount;\n}\n","import { encodeIcrcAccount } from \"@icp-sdk/canisters/ledger/icrc\";\nimport { Principal } from \"@icp-sdk/core/principal\";\nimport { encodeFunctionData } from \"viem\";\nimport { LiquidiumError, LiquidiumErrorCode } from \"../../core/errors\";\nimport { CK_DEPOSIT_ABI, ERC20_ABI } from \"../../core/evm\";\nimport type { SupplyAction } from \"../../core/types\";\nimport { encodeInflowSubaccount } from \"../../core/utils/inflow-subaccount\";\nimport type {\n CreateTransferErc20TransactionParams,\n EvmContractTransaction,\n} from \"./types\";\n\n/** Parameters for an ERC-20 approve transaction. */\nexport interface CreateApproveTransactionParams {\n /** ERC-20 token contract address. */\n tokenAddress: string;\n /** Contract address approved to spend tokens. */\n spenderAddress: string;\n /** Approval amount in token base units. */\n amount: bigint;\n}\n\n/** Parameters for an ERC-20 deposit-helper transaction. */\nexport interface CreateDepositErc20TransactionParams {\n /** Deposit helper contract address. */\n depositContractAddress: string;\n /** ERC-20 token contract address. */\n tokenAddress: string;\n /** Deposit amount in token base units. */\n amount: bigint;\n /** Pool principal text receiving the inflow. */\n poolId: string;\n /** Liquidium profile principal text. */\n profileId: string;\n /** Expected ICRC destination account text. */\n destinationAccount: string;\n /** Deposit or repayment action for the inflow. */\n action: SupplyAction;\n}\n\n/** Builds calldata for an ERC-20 `approve(spender, amount)` transaction. */\nexport function createApproveTransaction(\n params: CreateApproveTransactionParams\n): EvmContractTransaction {\n return {\n to: params.tokenAddress,\n data: encodeFunctionData({\n abi: ERC20_ABI,\n functionName: \"approve\",\n args: [params.spenderAddress as `0x${string}`, params.amount],\n }),\n };\n}\n\n/** Builds calldata for an ERC-20 `transfer(recipient, amount)` transaction. */\nexport function createTransferErc20Transaction(\n params: CreateTransferErc20TransactionParams\n): EvmContractTransaction {\n return {\n to: params.tokenAddress,\n data: encodeFunctionData({\n abi: ERC20_ABI,\n functionName: \"transfer\",\n args: [params.recipientAddress as `0x${string}`, params.amount],\n }),\n };\n}\n\n/** Builds calldata for depositing ERC-20 funds into the ckETH deposit helper. */\nexport function createDepositErc20Transaction(\n params: CreateDepositErc20TransactionParams\n): EvmContractTransaction {\n const expectedDestinationAccount = encodeIcrcAccount({\n owner: Principal.fromText(params.poolId),\n subaccount: encodeInflowSubaccount({\n action: params.action,\n principal: Principal.fromText(params.profileId),\n }),\n });\n\n if (params.destinationAccount !== expectedDestinationAccount) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n \"ETH supply destination account does not match the expected inflow account\"\n );\n }\n\n const principalBytes32 = encodePrincipalToBytes32(\n Principal.fromText(params.poolId)\n );\n const subaccountHex = encodeBytes32Hex(\n encodeInflowSubaccount({\n action: params.action,\n principal: Principal.fromText(params.profileId),\n })\n );\n\n return {\n to: params.depositContractAddress,\n data: encodeFunctionData({\n abi: CK_DEPOSIT_ABI,\n functionName: \"depositErc20\",\n args: [\n params.tokenAddress as `0x${string}`,\n params.amount,\n principalBytes32,\n subaccountHex,\n ],\n }),\n };\n}\n\nfunction encodePrincipalToBytes32(principal: Principal): `0x${string}` {\n const principalBytes = principal.toUint8Array();\n if (principalBytes.length > 29) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n \"Principal length exceeds Ethereum bytes32 capacity\"\n );\n }\n\n const fixedBytes = new Uint8Array(32);\n fixedBytes[0] = principalBytes.length;\n fixedBytes.set(principalBytes, 1);\n\n return encodeBytes32Hex(fixedBytes);\n}\n\nfunction encodeBytes32Hex(bytes: Uint8Array): `0x${string}` {\n return `0x${Array.from(bytes, (byte) =>\n byte.toString(16).padStart(2, \"0\")\n ).join(\"\")}`;\n}\n","import { Asset } from \"./types\";\n\nconst MINIMUM_BTC_BORROW_AMOUNT_SATS = 5_100n;\nconst MINIMUM_STABLECOIN_BORROW_AMOUNT_BASE_UNITS = 1_000_000n;\n\n/** Minimum borrow amounts in each asset's base units. */\nexport const MIN_BORROW_AMOUNTS_BY_ASSET = {\n [Asset.BTC]: MINIMUM_BTC_BORROW_AMOUNT_SATS,\n [Asset.USDC]: MINIMUM_STABLECOIN_BORROW_AMOUNT_BASE_UNITS,\n [Asset.USDT]: MINIMUM_STABLECOIN_BORROW_AMOUNT_BASE_UNITS,\n} as const;\n\nexport type MinimumBorrowAsset = keyof typeof MIN_BORROW_AMOUNTS_BY_ASSET;\n\nexport interface BorrowAmountMinimumValidationParams {\n amount: bigint;\n asset: string;\n}\n\nexport interface BorrowAmountMinimumValidationError {\n asset: string;\n minimumAmount: bigint;\n message: string;\n}\n\n/**\n * Returns the minimum borrow amount for an asset in base units.\n *\n * Assets without a configured product minimum return `0n`.\n */\nexport function getMinimumBorrowAmount(asset: string): bigint {\n if (!isMinimumBorrowAsset(asset)) {\n return 0n;\n }\n\n return MIN_BORROW_AMOUNTS_BY_ASSET[asset];\n}\n\nexport function getBorrowAmountMinimumValidationError(\n params: BorrowAmountMinimumValidationParams\n): BorrowAmountMinimumValidationError | null {\n const minimumAmount = getMinimumBorrowAmount(params.asset);\n if (minimumAmount <= 0n || params.amount >= minimumAmount) {\n return null;\n }\n\n return {\n asset: params.asset,\n minimumAmount,\n message: formatMinimumBorrowAmountMessage(params.asset, minimumAmount),\n };\n}\n\nexport function formatMinimumBorrowAmountMessage(\n asset: string,\n minimumAmount: bigint\n): string {\n return `Borrow amount must be at least ${minimumAmount} base units for ${asset}`;\n}\n\nfunction isMinimumBorrowAsset(asset: string): asset is MinimumBorrowAsset {\n return Object.hasOwn(MIN_BORROW_AMOUNTS_BY_ASSET, asset);\n}\n","import { Actor, type ActorMethod } from \"@icp-sdk/core/agent\";\nimport type { IDL } from \"@icp-sdk/core/candid\";\nimport { LiquidiumError, LiquidiumErrorCode } from \"../../errors\";\nimport type { CanisterContext } from \"../../transports/canister-context\";\n\nexport interface IcrcLedgerActor {\n icrc1_fee: ActorMethod<[], bigint>;\n}\n\nconst idlFactory: IDL.InterfaceFactory = ({ IDL }) =>\n IDL.Service({\n icrc1_fee: IDL.Func([], [IDL.Nat], [\"query\"]),\n });\n\nexport function createIcrcLedgerActor(params: {\n canisterContext: CanisterContext;\n canisterId: string | undefined;\n ledgerName: string;\n}): IcrcLedgerActor {\n if (!params.canisterId) {\n throw new LiquidiumError(\n LiquidiumErrorCode.SERVICE_UNAVAILABLE,\n `${params.ledgerName} ledger canister ID is not configured`\n );\n }\n\n return Actor.createActor<IcrcLedgerActor>(idlFactory, {\n agent: params.canisterContext.agent,\n canisterId: params.canisterId,\n });\n}\n","import { CK_CANISTER_IDS } from \"../../config\";\nimport type { CanisterContext } from \"../../transports/canister-context\";\nimport { createIcrcLedgerActor, type IcrcLedgerActor } from \"../icrc/ledger\";\n\nexport type CkBtcLedgerActor = IcrcLedgerActor;\n\nexport function createCkBtcLedgerActor(\n canisterContext: CanisterContext\n): CkBtcLedgerActor {\n return createIcrcLedgerActor({\n canisterContext,\n canisterId: CK_CANISTER_IDS.BTC.ledger,\n ledgerName: \"ckBTC\",\n });\n}\n","export const idlFactory = ({ IDL }) => {\n const Mode = IDL.Variant({\n 'RestrictedTo' : IDL.Vec(IDL.Principal),\n 'DepositsRestrictedTo' : IDL.Vec(IDL.Principal),\n 'ReadOnly' : IDL.Null,\n 'GeneralAvailability' : IDL.Null,\n });\n const UpgradeArgs = IDL.Record({\n 'get_utxos_cache_expiration_seconds' : IDL.Opt(IDL.Nat64),\n 'kyt_principal' : IDL.Opt(IDL.Principal),\n 'mode' : IDL.Opt(Mode),\n 'retrieve_btc_min_amount' : IDL.Opt(IDL.Nat64),\n 'max_time_in_queue_nanos' : IDL.Opt(IDL.Nat64),\n 'check_fee' : IDL.Opt(IDL.Nat64),\n 'btc_checker_principal' : IDL.Opt(IDL.Principal),\n 'min_confirmations' : IDL.Opt(IDL.Nat32),\n 'kyt_fee' : IDL.Opt(IDL.Nat64),\n });\n const BtcNetwork = IDL.Variant({\n 'Mainnet' : IDL.Null,\n 'Regtest' : IDL.Null,\n 'Testnet' : IDL.Null,\n });\n const InitArgs = IDL.Record({\n 'get_utxos_cache_expiration_seconds' : IDL.Opt(IDL.Nat64),\n 'kyt_principal' : IDL.Opt(IDL.Principal),\n 'ecdsa_key_name' : IDL.Text,\n 'mode' : Mode,\n 'retrieve_btc_min_amount' : IDL.Nat64,\n 'ledger_id' : IDL.Principal,\n 'max_time_in_queue_nanos' : IDL.Nat64,\n 'btc_network' : BtcNetwork,\n 'check_fee' : IDL.Opt(IDL.Nat64),\n 'btc_checker_principal' : IDL.Opt(IDL.Principal),\n 'min_confirmations' : IDL.Opt(IDL.Nat32),\n 'kyt_fee' : IDL.Opt(IDL.Nat64),\n });\n const MinterArg = IDL.Variant({\n 'Upgrade' : IDL.Opt(UpgradeArgs),\n 'Init' : InitArgs,\n });\n const CanisterStatusType = IDL.Variant({\n 'stopped' : IDL.Null,\n 'stopping' : IDL.Null,\n 'running' : IDL.Null,\n });\n const LogVisibility = IDL.Variant({\n 'controllers' : IDL.Null,\n 'public' : IDL.Null,\n 'allowed_viewers' : IDL.Vec(IDL.Principal),\n });\n const DefiniteCanisterSettings = IDL.Record({\n 'freezing_threshold' : IDL.Nat,\n 'controllers' : IDL.Vec(IDL.Principal),\n 'reserved_cycles_limit' : IDL.Nat,\n 'log_visibility' : LogVisibility,\n 'wasm_memory_limit' : IDL.Nat,\n 'memory_allocation' : IDL.Nat,\n 'compute_allocation' : IDL.Nat,\n });\n const QueryStats = IDL.Record({\n 'response_payload_bytes_total' : IDL.Nat,\n 'num_instructions_total' : IDL.Nat,\n 'num_calls_total' : IDL.Nat,\n 'request_payload_bytes_total' : IDL.Nat,\n });\n const CanisterStatusResponse = IDL.Record({\n 'status' : CanisterStatusType,\n 'memory_size' : IDL.Nat,\n 'cycles' : IDL.Nat,\n 'settings' : DefiniteCanisterSettings,\n 'query_stats' : QueryStats,\n 'idle_cycles_burned_per_day' : IDL.Nat,\n 'module_hash' : IDL.Opt(IDL.Vec(IDL.Nat8)),\n 'reserved_cycles' : IDL.Nat,\n });\n const Account = IDL.Record({\n 'owner' : IDL.Principal,\n 'subaccount' : IDL.Opt(IDL.Vec(IDL.Nat8)),\n });\n const Utxo = IDL.Record({\n 'height' : IDL.Nat32,\n 'value' : IDL.Nat64,\n 'outpoint' : IDL.Record({ 'txid' : IDL.Vec(IDL.Nat8), 'vout' : IDL.Nat32 }),\n });\n const ReimbursementReason = IDL.Variant({\n 'CallFailed' : IDL.Null,\n 'TaintedDestination' : IDL.Record({\n 'kyt_fee' : IDL.Nat64,\n 'kyt_provider' : IDL.Principal,\n }),\n });\n const SuspendedReason = IDL.Variant({\n 'ValueTooSmall' : IDL.Null,\n 'Quarantined' : IDL.Null,\n });\n const BitcoinAddress = IDL.Variant({\n 'p2wsh_v0' : IDL.Vec(IDL.Nat8),\n 'p2tr_v1' : IDL.Vec(IDL.Nat8),\n 'p2sh' : IDL.Vec(IDL.Nat8),\n 'p2wpkh_v0' : IDL.Vec(IDL.Nat8),\n 'p2pkh' : IDL.Vec(IDL.Nat8),\n });\n const EventType = IDL.Variant({\n 'received_utxos' : IDL.Record({\n 'to_account' : Account,\n 'mint_txid' : IDL.Opt(IDL.Nat64),\n 'utxos' : IDL.Vec(Utxo),\n }),\n 'schedule_deposit_reimbursement' : IDL.Record({\n 'burn_block_index' : IDL.Nat64,\n 'account' : Account,\n 'amount' : IDL.Nat64,\n 'reason' : ReimbursementReason,\n }),\n 'sent_transaction' : IDL.Record({\n 'fee' : IDL.Opt(IDL.Nat64),\n 'change_output' : IDL.Opt(\n IDL.Record({ 'value' : IDL.Nat64, 'vout' : IDL.Nat32 })\n ),\n 'txid' : IDL.Vec(IDL.Nat8),\n 'utxos' : IDL.Vec(Utxo),\n 'requests' : IDL.Vec(IDL.Nat64),\n 'submitted_at' : IDL.Nat64,\n }),\n 'distributed_kyt_fee' : IDL.Record({\n 'block_index' : IDL.Nat64,\n 'amount' : IDL.Nat64,\n 'kyt_provider' : IDL.Principal,\n }),\n 'init' : InitArgs,\n 'upgrade' : UpgradeArgs,\n 'retrieve_btc_kyt_failed' : IDL.Record({\n 'block_index' : IDL.Nat64,\n 'owner' : IDL.Principal,\n 'uuid' : IDL.Text,\n 'address' : IDL.Text,\n 'amount' : IDL.Nat64,\n 'kyt_provider' : IDL.Principal,\n }),\n 'suspended_utxo' : IDL.Record({\n 'utxo' : Utxo,\n 'account' : Account,\n 'reason' : SuspendedReason,\n }),\n 'accepted_retrieve_btc_request' : IDL.Record({\n 'received_at' : IDL.Nat64,\n 'block_index' : IDL.Nat64,\n 'address' : BitcoinAddress,\n 'reimbursement_account' : IDL.Opt(Account),\n 'amount' : IDL.Nat64,\n 'kyt_provider' : IDL.Opt(IDL.Principal),\n }),\n 'checked_utxo' : IDL.Record({\n 'clean' : IDL.Bool,\n 'utxo' : Utxo,\n 'uuid' : IDL.Text,\n 'kyt_provider' : IDL.Opt(IDL.Principal),\n }),\n 'removed_retrieve_btc_request' : IDL.Record({ 'block_index' : IDL.Nat64 }),\n 'confirmed_transaction' : IDL.Record({ 'txid' : IDL.Vec(IDL.Nat8) }),\n 'replaced_transaction' : IDL.Record({\n 'fee' : IDL.Nat64,\n 'change_output' : IDL.Record({ 'value' : IDL.Nat64, 'vout' : IDL.Nat32 }),\n 'old_txid' : IDL.Vec(IDL.Nat8),\n 'new_txid' : IDL.Vec(IDL.Nat8),\n 'submitted_at' : IDL.Nat64,\n }),\n 'checked_utxo_v2' : IDL.Record({ 'utxo' : Utxo, 'account' : Account }),\n 'ignored_utxo' : IDL.Record({ 'utxo' : Utxo }),\n 'checked_utxo_mint_unknown' : IDL.Record({\n 'utxo' : Utxo,\n 'account' : Account,\n }),\n 'reimbursed_failed_deposit' : IDL.Record({\n 'burn_block_index' : IDL.Nat64,\n 'mint_block_index' : IDL.Nat64,\n }),\n });\n const Event = IDL.Record({\n 'timestamp' : IDL.Opt(IDL.Nat64),\n 'payload' : EventType,\n });\n const MinterInfo = IDL.Record({\n 'retrieve_btc_min_amount' : IDL.Nat64,\n 'min_confirmations' : IDL.Nat32,\n 'kyt_fee' : IDL.Nat64,\n });\n const RetrieveBtcArgs = IDL.Record({\n 'address' : IDL.Text,\n 'amount' : IDL.Nat64,\n });\n const RetrieveBtcOk = IDL.Record({ 'block_index' : IDL.Nat64 });\n const RetrieveBtcError = IDL.Variant({\n 'MalformedAddress' : IDL.Text,\n 'GenericError' : IDL.Record({\n 'error_message' : IDL.Text,\n 'error_code' : IDL.Nat64,\n }),\n 'TemporarilyUnavailable' : IDL.Text,\n 'AlreadyProcessing' : IDL.Null,\n 'AmountTooLow' : IDL.Nat64,\n 'InsufficientFunds' : IDL.Record({ 'balance' : IDL.Nat64 }),\n });\n const RetrieveBtcStatus = IDL.Variant({\n 'Signing' : IDL.Null,\n 'Confirmed' : IDL.Record({ 'txid' : IDL.Vec(IDL.Nat8) }),\n 'Sending' : IDL.Record({ 'txid' : IDL.Vec(IDL.Nat8) }),\n 'AmountTooLow' : IDL.Null,\n 'Unknown' : IDL.Null,\n 'Submitted' : IDL.Record({ 'txid' : IDL.Vec(IDL.Nat8) }),\n 'Pending' : IDL.Null,\n });\n const ReimbursementRequest = IDL.Record({\n 'account' : Account,\n 'amount' : IDL.Nat64,\n 'reason' : ReimbursementReason,\n });\n const ReimbursedDeposit = IDL.Record({\n 'account' : Account,\n 'mint_block_index' : IDL.Nat64,\n 'amount' : IDL.Nat64,\n 'reason' : ReimbursementReason,\n });\n const RetrieveBtcStatusV2 = IDL.Variant({\n 'Signing' : IDL.Null,\n 'Confirmed' : IDL.Record({ 'txid' : IDL.Vec(IDL.Nat8) }),\n 'Sending' : IDL.Record({ 'txid' : IDL.Vec(IDL.Nat8) }),\n 'AmountTooLow' : IDL.Null,\n 'WillReimburse' : ReimbursementRequest,\n 'Unknown' : IDL.Null,\n 'Submitted' : IDL.Record({ 'txid' : IDL.Vec(IDL.Nat8) }),\n 'Reimbursed' : ReimbursedDeposit,\n 'Pending' : IDL.Null,\n });\n const RetrieveBtcWithApprovalArgs = IDL.Record({\n 'from_subaccount' : IDL.Opt(IDL.Vec(IDL.Nat8)),\n 'address' : IDL.Text,\n 'amount' : IDL.Nat64,\n });\n const RetrieveBtcWithApprovalError = IDL.Variant({\n 'MalformedAddress' : IDL.Text,\n 'GenericError' : IDL.Record({\n 'error_message' : IDL.Text,\n 'error_code' : IDL.Nat64,\n }),\n 'TemporarilyUnavailable' : IDL.Text,\n 'InsufficientAllowance' : IDL.Record({ 'allowance' : IDL.Nat64 }),\n 'AlreadyProcessing' : IDL.Null,\n 'AmountTooLow' : IDL.Nat64,\n 'InsufficientFunds' : IDL.Record({ 'balance' : IDL.Nat64 }),\n });\n const UtxoStatus = IDL.Variant({\n 'ValueTooSmall' : Utxo,\n 'Tainted' : Utxo,\n 'Minted' : IDL.Record({\n 'minted_amount' : IDL.Nat64,\n 'block_index' : IDL.Nat64,\n 'utxo' : Utxo,\n }),\n 'Checked' : Utxo,\n });\n const Timestamp = IDL.Nat64;\n const SuspendedUtxo = IDL.Record({\n 'utxo' : Utxo,\n 'earliest_retry' : Timestamp,\n 'reason' : SuspendedReason,\n });\n const PendingUtxo = IDL.Record({\n 'confirmations' : IDL.Nat32,\n 'value' : IDL.Nat64,\n 'outpoint' : IDL.Record({ 'txid' : IDL.Vec(IDL.Nat8), 'vout' : IDL.Nat32 }),\n });\n const UpdateBalanceError = IDL.Variant({\n 'GenericError' : IDL.Record({\n 'error_message' : IDL.Text,\n 'error_code' : IDL.Nat64,\n }),\n 'TemporarilyUnavailable' : IDL.Text,\n 'AlreadyProcessing' : IDL.Null,\n 'NoNewUtxos' : IDL.Record({\n 'suspended_utxos' : IDL.Opt(IDL.Vec(SuspendedUtxo)),\n 'required_confirmations' : IDL.Nat32,\n 'pending_utxos' : IDL.Opt(IDL.Vec(PendingUtxo)),\n 'current_confirmations' : IDL.Opt(IDL.Nat32),\n }),\n });\n return IDL.Service({\n 'estimate_withdrawal_fee' : IDL.Func(\n [IDL.Record({ 'amount' : IDL.Opt(IDL.Nat64) })],\n [IDL.Record({ 'minter_fee' : IDL.Nat64, 'bitcoin_fee' : IDL.Nat64 })],\n ['query'],\n ),\n 'get_btc_address' : IDL.Func(\n [\n IDL.Record({\n 'owner' : IDL.Opt(IDL.Principal),\n 'subaccount' : IDL.Opt(IDL.Vec(IDL.Nat8)),\n }),\n ],\n [IDL.Text],\n [],\n ),\n 'get_canister_status' : IDL.Func([], [CanisterStatusResponse], []),\n 'get_deposit_fee' : IDL.Func([], [IDL.Nat64], ['query']),\n 'get_events' : IDL.Func(\n [IDL.Record({ 'start' : IDL.Nat64, 'length' : IDL.Nat64 })],\n [IDL.Vec(Event)],\n ['query'],\n ),\n 'get_known_utxos' : IDL.Func(\n [\n IDL.Record({\n 'owner' : IDL.Opt(IDL.Principal),\n 'subaccount' : IDL.Opt(IDL.Vec(IDL.Nat8)),\n }),\n ],\n [IDL.Vec(Utxo)],\n ['query'],\n ),\n 'get_minter_info' : IDL.Func([], [MinterInfo], ['query']),\n 'get_withdrawal_account' : IDL.Func([], [Account], []),\n 'retrieve_btc' : IDL.Func(\n [RetrieveBtcArgs],\n [IDL.Variant({ 'Ok' : RetrieveBtcOk, 'Err' : RetrieveBtcError })],\n [],\n ),\n 'retrieve_btc_status' : IDL.Func(\n [IDL.Record({ 'block_index' : IDL.Nat64 })],\n [RetrieveBtcStatus],\n ['query'],\n ),\n 'retrieve_btc_status_v2' : IDL.Func(\n [IDL.Record({ 'block_index' : IDL.Nat64 })],\n [RetrieveBtcStatusV2],\n ['query'],\n ),\n 'retrieve_btc_status_v2_by_account' : IDL.Func(\n [IDL.Opt(Account)],\n [\n IDL.Vec(\n IDL.Record({\n 'block_index' : IDL.Nat64,\n 'status_v2' : IDL.Opt(RetrieveBtcStatusV2),\n })\n ),\n ],\n ['query'],\n ),\n 'retrieve_btc_with_approval' : IDL.Func(\n [RetrieveBtcWithApprovalArgs],\n [\n IDL.Variant({\n 'Ok' : RetrieveBtcOk,\n 'Err' : RetrieveBtcWithApprovalError,\n }),\n ],\n [],\n ),\n 'update_balance' : IDL.Func(\n [\n IDL.Record({\n 'owner' : IDL.Opt(IDL.Principal),\n 'subaccount' : IDL.Opt(IDL.Vec(IDL.Nat8)),\n }),\n ],\n [\n IDL.Variant({\n 'Ok' : IDL.Vec(UtxoStatus),\n 'Err' : UpdateBalanceError,\n }),\n ],\n [],\n ),\n });\n};\n\nexport const init = ({ IDL }) => {\n const Mode = IDL.Variant({\n 'RestrictedTo' : IDL.Vec(IDL.Principal),\n 'DepositsRestrictedTo' : IDL.Vec(IDL.Principal),\n 'ReadOnly' : IDL.Null,\n 'GeneralAvailability' : IDL.Null,\n });\n const UpgradeArgs = IDL.Record({\n 'get_utxos_cache_expiration_seconds' : IDL.Opt(IDL.Nat64),\n 'kyt_principal' : IDL.Opt(IDL.Principal),\n 'mode' : IDL.Opt(Mode),\n 'retrieve_btc_min_amount' : IDL.Opt(IDL.Nat64),\n 'max_time_in_queue_nanos' : IDL.Opt(IDL.Nat64),\n 'check_fee' : IDL.Opt(IDL.Nat64),\n 'btc_checker_principal' : IDL.Opt(IDL.Principal),\n 'min_confirmations' : IDL.Opt(IDL.Nat32),\n 'kyt_fee' : IDL.Opt(IDL.Nat64),\n });\n const BtcNetwork = IDL.Variant({\n 'Mainnet' : IDL.Null,\n 'Regtest' : IDL.Null,\n 'Testnet' : IDL.Null,\n });\n const InitArgs = IDL.Record({\n 'get_utxos_cache_expiration_seconds' : IDL.Opt(IDL.Nat64),\n 'kyt_principal' : IDL.Opt(IDL.Principal),\n 'ecdsa_key_name' : IDL.Text,\n 'mode' : Mode,\n 'retrieve_btc_min_amount' : IDL.Nat64,\n 'ledger_id' : IDL.Principal,\n 'max_time_in_queue_nanos' : IDL.Nat64,\n 'btc_network' : BtcNetwork,\n 'check_fee' : IDL.Opt(IDL.Nat64),\n 'btc_checker_principal' : IDL.Opt(IDL.Principal),\n 'min_confirmations' : IDL.Opt(IDL.Nat32),\n 'kyt_fee' : IDL.Opt(IDL.Nat64),\n });\n const MinterArg = IDL.Variant({\n 'Upgrade' : IDL.Opt(UpgradeArgs),\n 'Init' : InitArgs,\n });\n return [MinterArg];\n};\n","import { Actor } from \"@icp-sdk/core/agent\";\nimport type { _SERVICE } from \"../../../generated/canisters/ck-btc-minter/declaration\";\nimport { idlFactory } from \"../../../generated/canisters/ck-btc-minter/declaration.js\";\nimport { CK_CANISTER_IDS } from \"../../config\";\nimport { LiquidiumError, LiquidiumErrorCode } from \"../../errors\";\nimport type { CanisterContext } from \"../../transports/canister-context\";\n\nexport type CkBtcMinterActor = _SERVICE;\n\nexport function createCkBtcMinterActor(\n canisterContext: CanisterContext\n): CkBtcMinterActor {\n const canisterId = CK_CANISTER_IDS.BTC.minter;\n\n if (!canisterId) {\n throw new LiquidiumError(\n LiquidiumErrorCode.SERVICE_UNAVAILABLE,\n \"ckBTC minter canister ID is not configured\"\n );\n }\n\n return Actor.createActor<CkBtcMinterActor>(idlFactory, {\n agent: canisterContext.agent,\n canisterId,\n });\n}\n","export const idlFactory = ({ IDL }) => {\n const DepositAccountErrors = IDL.Variant({\n 'Busy' : IDL.Null,\n 'NotFound' : IDL.Null,\n 'Other' : IDL.Text,\n 'Cooldown' : IDL.Record({ 'retry_after_secs' : IDL.Nat64 }),\n 'AddressDerivationFailed' : IDL.Null,\n 'InvalidEvmAddress' : IDL.Null,\n });\n const Result = IDL.Variant({ 'Ok' : IDL.Nat, 'Err' : DepositAccountErrors });\n const DepositStatus = IDL.Variant({\n 'Failed' : IDL.Text,\n 'Success' : IDL.Null,\n 'Pending' : IDL.Null,\n });\n const DepositAssetType = IDL.Variant({\n 'Native' : IDL.Null,\n 'ERC20' : IDL.Text,\n });\n const Account = IDL.Record({\n 'owner' : IDL.Principal,\n 'subaccount' : IDL.Opt(IDL.Vec(IDL.Nat8)),\n });\n const Deposit = IDL.Record({\n 'status' : DepositStatus,\n 'asset_type' : DepositAssetType,\n 'account' : Account,\n 'timestamp' : IDL.Nat64,\n 'amount' : IDL.Nat,\n });\n const Result_1 = IDL.Variant({\n 'Ok' : IDL.Vec(IDL.Tuple(IDL.Text, IDL.Text, Deposit)),\n 'Err' : DepositAccountErrors,\n });\n const Result_2 = IDL.Variant({\n 'Ok' : IDL.Text,\n 'Err' : DepositAccountErrors,\n });\n const QueueJobStatus = IDL.Variant({\n 'Queued' : IDL.Null,\n 'Failed' : IDL.Null,\n 'NoOp' : IDL.Null,\n 'Ready' : IDL.Null,\n 'RetryScheduled' : IDL.Null,\n 'Succeeded' : IDL.Null,\n 'Cancelled' : IDL.Null,\n 'Processing' : IDL.Null,\n 'Broadcasted' : IDL.Null,\n });\n const QueueRecoveryContext = IDL.Variant({\n 'FundingPending' : IDL.Record({\n 'funding_tx_hash' : IDL.Text,\n 'native_amount_wei' : IDL.Opt(IDL.Nat),\n }),\n 'ReadyNativeAmount' : IDL.Record({ 'native_amount_wei' : IDL.Nat }),\n });\n const QueueJob = IDL.Record({\n 'id' : IDL.Nat64,\n 'last_error' : IDL.Opt(IDL.Text),\n 'status' : QueueJobStatus,\n 'updated_at' : IDL.Nat64,\n 'asset_type' : DepositAssetType,\n 'next_attempt_at' : IDL.Nat64,\n 'token_address' : IDL.Opt(IDL.Text),\n 'attempts' : IDL.Nat32,\n 'created_at' : IDL.Nat64,\n 'address' : IDL.Text,\n 'account' : Account,\n 'tx_hash' : IDL.Opt(IDL.Text),\n 'recovery_context' : IDL.Opt(QueueRecoveryContext),\n });\n const BroadcastSuccessEvent = IDL.Record({\n 'broadcast_key' : IDL.Text,\n 'asset_type' : DepositAssetType,\n 'address' : IDL.Text,\n 'account' : Account,\n 'timestamp' : IDL.Nat64,\n 'queue_job_id' : IDL.Nat64,\n 'tx_hash' : IDL.Text,\n 'amount' : IDL.Nat,\n });\n const BroadcastConfirmedEvent = IDL.Record({\n 'broadcast_key' : IDL.Text,\n 'timestamp' : IDL.Nat64,\n 'queue_job_id' : IDL.Opt(IDL.Nat64),\n 'tx_hash' : IDL.Text,\n });\n const DustCleanupScheduledEvent = IDL.Record({\n 'address' : IDL.Text,\n 'timestamp' : IDL.Nat64,\n 'queue_job_id' : IDL.Nat64,\n });\n const DustCleanupFailedEvent = IDL.Record({\n 'attempts' : IDL.Nat8,\n 'address' : IDL.Text,\n 'timestamp' : IDL.Nat64,\n 'reason' : IDL.Text,\n });\n const BroadcastRejectedEvent = IDL.Record({\n 'broadcast_key' : IDL.Text,\n 'timestamp' : IDL.Nat64,\n 'queue_job_id' : IDL.Opt(IDL.Nat64),\n 'tx_hash' : IDL.Text,\n 'reason' : IDL.Text,\n });\n const BalanceDetectedEvent = IDL.Record({\n 'asset_type' : DepositAssetType,\n 'address' : IDL.Text,\n 'account' : Account,\n 'timestamp' : IDL.Nat64,\n 'queue_job_id' : IDL.Nat64,\n 'amount' : IDL.Nat,\n });\n const AssetRegisteredEvent = IDL.Record({\n 'decimals' : IDL.Nat32,\n 'asset_address' : IDL.Text,\n 'updated_existing' : IDL.Bool,\n 'timestamp' : IDL.Nat64,\n 'caller' : IDL.Principal,\n 'symbol' : IDL.Text,\n });\n const QueueJobFailedEvent = IDL.Record({\n 'asset_type' : DepositAssetType,\n 'attempts' : IDL.Nat32,\n 'address' : IDL.Text,\n 'account' : Account,\n 'timestamp' : IDL.Nat64,\n 'queue_job_id' : IDL.Nat64,\n 'reason' : IDL.Text,\n });\n const DepositAccountEvent = IDL.Variant({\n 'BroadcastSuccess' : BroadcastSuccessEvent,\n 'BroadcastConfirmed' : BroadcastConfirmedEvent,\n 'DustCleanupScheduled' : DustCleanupScheduledEvent,\n 'DustCleanupFailed' : DustCleanupFailedEvent,\n 'BroadcastRejected' : BroadcastRejectedEvent,\n 'BalanceDetected' : BalanceDetectedEvent,\n 'AssetRegistered' : AssetRegisteredEvent,\n 'QueueJobFailed' : QueueJobFailedEvent,\n });\n const AddressBinding = IDL.Record({\n 'token_address' : IDL.Opt(IDL.Text),\n 'account' : Account,\n });\n const Result_3 = IDL.Variant({\n 'Ok' : AddressBinding,\n 'Err' : DepositAccountErrors,\n });\n const Result_4 = IDL.Variant({\n 'Ok' : IDL.Null,\n 'Err' : DepositAccountErrors,\n });\n const Result_5 = IDL.Variant({\n 'Ok' : IDL.Nat64,\n 'Err' : DepositAccountErrors,\n });\n const Result_6 = IDL.Variant({\n 'Ok' : IDL.Nat,\n 'Err' : DepositAccountErrors,\n });\n return IDL.Service({\n 'estimate_deposit_fee' : IDL.Func([IDL.Opt(IDL.Text)], [Result], ['query']),\n 'get_broadcasted_txs' : IDL.Func([], [Result_1], ['query']),\n 'get_deposit_address' : IDL.Func(\n [Account, IDL.Opt(IDL.Text)],\n [Result_2],\n ['query'],\n ),\n 'get_funding_wallet_address' : IDL.Func([], [Result_2], ['query']),\n 'get_or_create_deposit_address' : IDL.Func(\n [Account, IDL.Opt(IDL.Text)],\n [Result_2],\n [],\n ),\n 'get_queue_job' : IDL.Func([IDL.Nat64], [IDL.Opt(QueueJob)], ['query']),\n 'get_queued_event' : IDL.Func(\n [IDL.Nat],\n [IDL.Opt(DepositAccountEvent)],\n ['query'],\n ),\n 'get_queued_events' : IDL.Func(\n [IDL.Nat64, IDL.Nat64],\n [IDL.Vec(IDL.Tuple(IDL.Nat, DepositAccountEvent))],\n ['query'],\n ),\n 'get_supported_assets' : IDL.Func(\n [],\n [IDL.Vec(IDL.Tuple(IDL.Text, IDL.Text, IDL.Nat32))],\n ['query'],\n ),\n 'get_user_by_address' : IDL.Func([IDL.Text], [Result_3], ['query']),\n 'list_queue_jobs' : IDL.Func(\n [IDL.Nat64, IDL.Nat32],\n [IDL.Vec(QueueJob)],\n ['query'],\n ),\n 'register_asset' : IDL.Func(\n [IDL.Text, IDL.Text, IDL.Nat32],\n [Result_4],\n [],\n ),\n 'set_proxy_contract_address_override' : IDL.Func(\n [IDL.Text],\n [Result_4],\n [],\n ),\n 'sync_address_nonce' : IDL.Func([IDL.Text], [Result_5], []),\n 'update_address' : IDL.Func([IDL.Text], [Result_6], []),\n });\n};\nexport const init = ({ IDL }) => { return []; };\n","import { Actor } from \"@icp-sdk/core/agent\";\nimport type {\n _SERVICE,\n DepositAccountErrors as GeneratedDepositAccountErrors,\n} from \"../../../generated/canisters/deposit-accounts/deposit_accounts.did\";\nimport { idlFactory } from \"../../../generated/canisters/deposit-accounts/deposit_accounts.did.js\";\nimport { LiquidiumError, LiquidiumErrorCode } from \"../../errors\";\nimport type { CanisterContext } from \"../../transports/canister-context\";\n\nexport type DepositAccountsActor = _SERVICE;\nexport type DepositAccountErrors = GeneratedDepositAccountErrors;\n\nexport function createDepositAccountsActor(\n canisterContext: CanisterContext\n): DepositAccountsActor {\n const canisterId = canisterContext.canisterIds.ethDeposit;\n\n if (!canisterId) {\n throw new LiquidiumError(\n LiquidiumErrorCode.SERVICE_UNAVAILABLE,\n \"ETH deposit canister ID is not configured\"\n );\n }\n\n return Actor.createActor<DepositAccountsActor>(idlFactory, {\n agent: canisterContext.agent,\n canisterId,\n });\n}\n","import { Actor } from \"@icp-sdk/core/agent\";\nimport type { IDL } from \"@icp-sdk/core/candid\";\nimport type { Principal } from \"@icp-sdk/core/principal\";\nimport { LiquidiumError, LiquidiumErrorCode } from \"../../errors\";\nimport type { CanisterContext } from \"../../transports/canister-context\";\nimport {\n extractVariantTag,\n KNOWN_ASSET_TAGS,\n KNOWN_CHAIN_TAGS,\n type KnownAssetTag,\n type KnownChainTag,\n} from \"../../utils/variant-tags\";\n\nconst flexibleLendingIdlFactory: IDL.InterfaceFactory = ({ IDL }) => {\n const PoolRecord = IDL.Record({\n principal: IDL.Principal,\n asset: IDL.Unknown,\n chain: IDL.Unknown,\n total_supply_at_last_sync: IDL.Nat,\n total_debt_at_last_sync: IDL.Nat,\n supply_cap: IDL.Opt(IDL.Nat),\n borrow_cap: IDL.Opt(IDL.Nat),\n max_ltv: IDL.Nat64,\n liquidation_threshold: IDL.Nat64,\n liquidation_bonus: IDL.Nat64,\n protocol_liquidation_fee: IDL.Nat64,\n reserve_factor: IDL.Nat64,\n base_rate: IDL.Nat,\n optimal_utilization_rate: IDL.Nat,\n rate_slope_before: IDL.Nat,\n rate_slope_after: IDL.Nat,\n lending_index: IDL.Nat,\n borrow_index: IDL.Nat,\n same_asset_borrowing: IDL.Opt(IDL.Bool),\n same_asset_borrowing_dust_threshold: IDL.Nat,\n frozen: IDL.Bool,\n last_updated: IDL.Opt(IDL.Nat64),\n });\n\n const BorrowingPowerRecord = IDL.Record({\n max_borrowable_usd: IDL.Nat,\n weighted_max_ltv: IDL.Nat,\n });\n\n const PositionRecord = IDL.Record({\n asset: IDL.Unknown,\n total_debt_interest: IDL.Nat,\n borrow_index_snapshot: IDL.Nat,\n lending_index_snapshot: IDL.Nat,\n debt_scaled: IDL.Nat,\n total_earned_interest: IDL.Nat,\n deposit_scaled: IDL.Nat,\n pool_id: IDL.Principal,\n unpaid_debt_interest: IDL.Nat,\n last_update: IDL.Nat64,\n user_profile: IDL.Principal,\n });\n\n const UserStatsRecord = IDL.Record({\n debt: IDL.Nat,\n collateral: IDL.Nat,\n acumulated_interest: IDL.Nat,\n borrowing_power: BorrowingPowerRecord,\n positions: IDL.Vec(PositionRecord),\n weighted_liquidation_threshold: IDL.Nat,\n });\n\n const PositionViewRecord = IDL.Record({\n lending_index_now: IDL.Nat,\n interest_since_snapshot: IDL.Nat,\n asset: IDL.Unknown,\n total_debt_interest: IDL.Nat,\n borrow_index_snapshot: IDL.Nat,\n debt_native_now: IDL.Nat,\n borrow_index_now: IDL.Nat,\n lending_index_snapshot: IDL.Nat,\n debt_scaled: IDL.Nat,\n total_earned_interest: IDL.Nat,\n deposit_scaled: IDL.Nat,\n earned_since_snapshot: IDL.Nat,\n deposited_native_now: IDL.Nat,\n pool_id: IDL.Principal,\n last_update: IDL.Nat64,\n user_profile: IDL.Principal,\n });\n\n return IDL.Service({\n list_pools: IDL.Func([], [IDL.Vec(PoolRecord)], [\"query\"]),\n get_pool_rate: IDL.Func(\n [IDL.Principal],\n [IDL.Opt(IDL.Tuple(IDL.Nat, IDL.Nat, IDL.Nat))],\n [\"query\"]\n ),\n get_health_factor: IDL.Func(\n [IDL.Principal],\n [IDL.Nat, UserStatsRecord],\n [\"query\"]\n ),\n get_profile_stats: IDL.Func([IDL.Principal], [UserStatsRecord], [\"query\"]),\n get_position: IDL.Func(\n [IDL.Principal, IDL.Principal],\n [IDL.Opt(PositionViewRecord)],\n [\"query\"]\n ),\n });\n};\n\nexport type FlexiblePool = {\n principal: Principal;\n asset: object;\n chain: object;\n total_supply_at_last_sync: bigint;\n total_debt_at_last_sync: bigint;\n supply_cap: [bigint] | [];\n borrow_cap: [bigint] | [];\n max_ltv: bigint;\n liquidation_threshold: bigint;\n liquidation_bonus: bigint;\n protocol_liquidation_fee: bigint;\n reserve_factor: bigint;\n base_rate: bigint;\n optimal_utilization_rate: bigint;\n rate_slope_before: bigint;\n rate_slope_after: bigint;\n lending_index: bigint;\n borrow_index: bigint;\n same_asset_borrowing: [boolean] | [];\n same_asset_borrowing_dust_threshold: bigint;\n frozen: boolean;\n last_updated: [bigint] | [];\n};\n\nexport type FlexibleBorrowingPower = {\n max_borrowable_usd: bigint;\n weighted_max_ltv: bigint;\n};\n\nexport type FlexiblePosition = {\n asset: object;\n total_debt_interest: bigint;\n borrow_index_snapshot: bigint;\n lending_index_snapshot: bigint;\n debt_scaled: bigint;\n total_earned_interest: bigint;\n deposit_scaled: bigint;\n pool_id: Principal;\n unpaid_debt_interest: bigint;\n last_update: bigint;\n user_profile: Principal;\n};\n\nexport type FlexibleUserStats = {\n debt: bigint;\n collateral: bigint;\n acumulated_interest: bigint;\n borrowing_power: FlexibleBorrowingPower;\n positions: FlexiblePosition[];\n weighted_liquidation_threshold: bigint;\n};\n\nexport type FlexiblePositionView = {\n lending_index_now: bigint;\n interest_since_snapshot: bigint;\n asset: object;\n total_debt_interest: bigint;\n borrow_index_snapshot: bigint;\n debt_native_now: bigint;\n borrow_index_now: bigint;\n lending_index_snapshot: bigint;\n debt_scaled: bigint;\n total_earned_interest: bigint;\n deposit_scaled: bigint;\n earned_since_snapshot: bigint;\n deposited_native_now: bigint;\n pool_id: Principal;\n last_update: bigint;\n user_profile: Principal;\n};\n\nexport interface FlexibleLendingActor {\n list_pools: () => Promise<FlexiblePool[]>;\n get_pool_rate: (\n poolId: Principal\n ) => Promise<[] | [[bigint, bigint, bigint]]>;\n get_health_factor: (\n profileId: Principal\n ) => Promise<[bigint, FlexibleUserStats]>;\n get_profile_stats: (profileId: Principal) => Promise<FlexibleUserStats>;\n get_position: (\n profileId: Principal,\n poolId: Principal\n ) => Promise<[] | [FlexiblePositionView]>;\n}\n\nexport interface DecodedPool {\n principal: Principal;\n asset: KnownAssetTag;\n chain: KnownChainTag;\n total_supply_at_last_sync: bigint;\n total_debt_at_last_sync: bigint;\n supply_cap: [bigint] | [];\n borrow_cap: [bigint] | [];\n max_ltv: bigint;\n liquidation_threshold: bigint;\n liquidation_bonus: bigint;\n protocol_liquidation_fee: bigint;\n reserve_factor: bigint;\n base_rate: bigint;\n optimal_utilization_rate: bigint;\n rate_slope_before: bigint;\n rate_slope_after: bigint;\n lending_index: bigint;\n borrow_index: bigint;\n same_asset_borrowing: [boolean] | [];\n same_asset_borrowing_dust_threshold: bigint;\n frozen: boolean;\n last_updated: [bigint] | [];\n}\n\nexport interface DecodedPosition {\n asset: KnownAssetTag;\n total_debt_interest: bigint;\n borrow_index_snapshot: bigint;\n lending_index_snapshot: bigint;\n debt_scaled: bigint;\n total_earned_interest: bigint;\n deposit_scaled: bigint;\n pool_id: Principal;\n unpaid_debt_interest: bigint;\n last_update: bigint;\n user_profile: Principal;\n}\n\nexport interface DecodedUserStats {\n debt: bigint;\n collateral: bigint;\n acumulated_interest: bigint;\n borrowing_power: FlexibleBorrowingPower;\n positions: DecodedPosition[];\n weighted_liquidation_threshold: bigint;\n}\n\nexport interface DecodedPositionView {\n lending_index_now: bigint;\n interest_since_snapshot: bigint;\n asset: KnownAssetTag;\n total_debt_interest: bigint;\n borrow_index_snapshot: bigint;\n debt_native_now: bigint;\n borrow_index_now: bigint;\n lending_index_snapshot: bigint;\n debt_scaled: bigint;\n total_earned_interest: bigint;\n deposit_scaled: bigint;\n earned_since_snapshot: bigint;\n deposited_native_now: bigint;\n pool_id: Principal;\n last_update: bigint;\n user_profile: Principal;\n}\n\nexport function createFlexibleLendingActor(\n canisterContext: CanisterContext\n): FlexibleLendingActor {\n const canisterId = canisterContext.canisterIds.lending;\n\n if (!canisterId) {\n throw new LiquidiumError(\n LiquidiumErrorCode.SERVICE_UNAVAILABLE,\n \"Lending canister ID is not configured\"\n );\n }\n\n return Actor.createActor(flexibleLendingIdlFactory, {\n agent: canisterContext.agent,\n canisterId,\n }) as FlexibleLendingActor;\n}\n\nexport function decodeFlexiblePool(pool: FlexiblePool): DecodedPool | null {\n const asset = extractVariantTag(pool.asset, KNOWN_ASSET_TAGS);\n const chain = extractVariantTag(pool.chain, KNOWN_CHAIN_TAGS);\n\n if (!asset || !chain) {\n return null;\n }\n\n return {\n principal: pool.principal,\n asset,\n chain,\n total_supply_at_last_sync: pool.total_supply_at_last_sync,\n total_debt_at_last_sync: pool.total_debt_at_last_sync,\n supply_cap: pool.supply_cap,\n borrow_cap: pool.borrow_cap,\n max_ltv: pool.max_ltv,\n liquidation_threshold: pool.liquidation_threshold,\n liquidation_bonus: pool.liquidation_bonus,\n protocol_liquidation_fee: pool.protocol_liquidation_fee,\n reserve_factor: pool.reserve_factor,\n base_rate: pool.base_rate,\n optimal_utilization_rate: pool.optimal_utilization_rate,\n rate_slope_before: pool.rate_slope_before,\n rate_slope_after: pool.rate_slope_after,\n lending_index: pool.lending_index,\n borrow_index: pool.borrow_index,\n same_asset_borrowing: pool.same_asset_borrowing,\n same_asset_borrowing_dust_threshold:\n pool.same_asset_borrowing_dust_threshold,\n frozen: pool.frozen,\n last_updated: pool.last_updated,\n };\n}\n\nexport function decodeFlexiblePosition(\n position: FlexiblePosition\n): DecodedPosition | null {\n const asset = extractVariantTag(position.asset, KNOWN_ASSET_TAGS);\n\n if (!asset) {\n return null;\n }\n\n return {\n asset,\n total_debt_interest: position.total_debt_interest,\n borrow_index_snapshot: position.borrow_index_snapshot,\n lending_index_snapshot: position.lending_index_snapshot,\n debt_scaled: position.debt_scaled,\n total_earned_interest: position.total_earned_interest,\n deposit_scaled: position.deposit_scaled,\n pool_id: position.pool_id,\n unpaid_debt_interest: position.unpaid_debt_interest,\n last_update: position.last_update,\n user_profile: position.user_profile,\n };\n}\n\nexport function decodeFlexiblePositionView(\n view: FlexiblePositionView\n): DecodedPositionView | null {\n const asset = extractVariantTag(view.asset, KNOWN_ASSET_TAGS);\n\n if (!asset) {\n return null;\n }\n\n return {\n lending_index_now: view.lending_index_now,\n interest_since_snapshot: view.interest_since_snapshot,\n asset,\n total_debt_interest: view.total_debt_interest,\n borrow_index_snapshot: view.borrow_index_snapshot,\n debt_native_now: view.debt_native_now,\n borrow_index_now: view.borrow_index_now,\n lending_index_snapshot: view.lending_index_snapshot,\n debt_scaled: view.debt_scaled,\n total_earned_interest: view.total_earned_interest,\n deposit_scaled: view.deposit_scaled,\n earned_since_snapshot: view.earned_since_snapshot,\n deposited_native_now: view.deposited_native_now,\n pool_id: view.pool_id,\n last_update: view.last_update,\n user_profile: view.user_profile,\n };\n}\n\nexport function decodeFlexibleUserStats(\n stats: FlexibleUserStats\n): DecodedUserStats {\n return {\n debt: stats.debt,\n collateral: stats.collateral,\n acumulated_interest: stats.acumulated_interest,\n borrowing_power: stats.borrowing_power,\n positions: stats.positions\n .map(decodeFlexiblePosition)\n .filter((position): position is DecodedPosition => position !== null),\n weighted_liquidation_threshold: stats.weighted_liquidation_threshold,\n };\n}\n","export interface MessageAccount {\n type: \"AccountIdentifier\" | \"External\" | \"Icrc\" | \"Native\";\n data: string;\n}\n\ninterface OutflowMessageRequest {\n pool_id: string;\n amount: string;\n account: MessageAccount;\n expiry_timestamp: bigint;\n}\n\nexport function createBorrowAssetMessage(\n request: OutflowMessageRequest,\n nonce: bigint\n): string {\n return `Liquidium: Borrow Assets\n\nAction: Borrow from pool\nPool ID: ${request.pool_id}\nAmount: ${request.amount}\n${accountTypeToString(request.account)}\nExpires: ${request.expiry_timestamp}\nNonce: ${nonce}`;\n}\n\nexport function createWithdrawAssetMessage(\n request: OutflowMessageRequest,\n nonce: bigint\n): string {\n return `Liquidium: Withdraw Assets\n\nAction: Withdraw from pool\nPool ID: ${request.pool_id}\nAmount: ${request.amount}\n${accountTypeToString(request.account)}\nExpires: ${request.expiry_timestamp}\nNonce: ${nonce}`;\n}\n\nfunction accountTypeToString(accountType: MessageAccount): string {\n switch (accountType.type) {\n case \"External\":\n return `Address:${accountType.data}`;\n case \"Icrc\":\n return `Icrc:${accountType.data}`;\n case \"AccountIdentifier\":\n return `AccountId:${accountType.data}`;\n case \"Native\":\n return `Principal:${accountType.data}`;\n }\n}\n","import { CK_CANISTER_IDS } from \"./config\";\nimport { LiquidiumError, LiquidiumErrorCode } from \"./errors\";\nimport { Asset, Chain } from \"./types\";\n\nexport type PoolLedgerTransferAsset = Extract<\n Asset,\n \"BTC\" | \"ICP\" | \"USDC\" | \"USDT\"\n>;\nexport type PoolLedgerTransferChain = Extract<Chain, \"BTC\" | \"ETH\" | \"ICP\">;\n\nexport interface PoolLedgerAssetRoute {\n ledgerCanisterId: string;\n asset: PoolLedgerTransferAsset;\n chain: PoolLedgerTransferChain;\n}\n\n// Public asset symbols identify pool assets. On the IC side, BTC/USDT/USDC\n// resolve directly to their ck ledger canisters; native-chain transfers are\n// ingress paths into those same ledger-backed pool assets.\nexport function getPoolLedgerAssetRoute(params: {\n asset: string;\n chain: string;\n}): PoolLedgerAssetRoute {\n if (\n params.asset === Asset.BTC &&\n (params.chain === Chain.BTC || params.chain === Chain.ICP)\n ) {\n return {\n ledgerCanisterId: CK_CANISTER_IDS.BTC.ledger,\n asset: Asset.BTC,\n chain: params.chain,\n };\n }\n\n if (\n params.asset === Asset.USDT &&\n (params.chain === Chain.ETH || params.chain === Chain.ICP)\n ) {\n return {\n ledgerCanisterId: CK_CANISTER_IDS.USDT.ledger,\n asset: Asset.USDT,\n chain: params.chain,\n };\n }\n\n if (\n params.asset === Asset.USDC &&\n (params.chain === Chain.ETH || params.chain === Chain.ICP)\n ) {\n return {\n ledgerCanisterId: CK_CANISTER_IDS.USDC.ledger,\n asset: Asset.USDC,\n chain: params.chain,\n };\n }\n\n if (params.asset === Asset.ICP && params.chain === Chain.ICP) {\n return {\n ledgerCanisterId: CK_CANISTER_IDS.ICP.ledger,\n asset: Asset.ICP,\n chain: Chain.ICP,\n };\n }\n\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n `IC ledger transfers are not supported for ${params.asset} on ${params.chain}`\n );\n}\n\nexport function isPoolLedgerAsset(params: {\n asset: string;\n chain: string;\n}): boolean {\n try {\n getPoolLedgerAssetRoute(params);\n return true;\n } catch (error) {\n if (error instanceof LiquidiumError) {\n return false;\n }\n\n throw error;\n }\n}\n","import { LiquidiumError, LiquidiumErrorCode } from \"./errors\";\n\nexport interface SameAssetBorrowingPolicy {\n sameAssetBorrowing: boolean;\n sameAssetBorrowingDustThreshold: bigint;\n}\n\ninterface ValidateSameAssetBorrowingParams {\n borrowAsset: string;\n collateralAsset: string;\n collateralAmount: bigint;\n poolId: string;\n policy: SameAssetBorrowingPolicy;\n}\n\nexport interface SameAssetBorrowingValidationError {\n message: string;\n}\n\nexport function guardSameAssetBorrowing(\n params: ValidateSameAssetBorrowingParams\n): void {\n const validationError = getSameAssetBorrowingValidationError(params);\n if (!validationError) {\n return;\n }\n\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n validationError.message\n );\n}\n\nexport function getSameAssetBorrowingValidationError({\n borrowAsset,\n collateralAsset,\n collateralAmount,\n poolId,\n policy,\n}: ValidateSameAssetBorrowingParams):\n | SameAssetBorrowingValidationError\n | undefined {\n if (borrowAsset !== collateralAsset) {\n return undefined;\n }\n\n if (policy.sameAssetBorrowing) {\n return undefined;\n }\n\n if (collateralAmount <= 0n) {\n return undefined;\n }\n\n if (collateralAmount < policy.sameAssetBorrowingDustThreshold) {\n return undefined;\n }\n\n return {\n message: `Same asset borrowing not allowed for pool ${poolId}`,\n };\n}\n","/** Lifecycle operation represented by a Liquidium status. */\nexport type LiquidiumOperation =\n | \"deposit\"\n | \"borrow\"\n | \"repayment\"\n | \"withdrawal\"\n | \"liquidation\";\n\n/** Lifecycle state represented by a Liquidium status. */\nexport type LiquidiumState =\n | \"action_required\"\n | \"confirming\"\n | \"processing\"\n | \"active\"\n | \"completed\"\n | \"failed\"\n | \"expired\";\n\n/** Shared lifecycle status returned by SDK methods that expose flow state. */\nexport interface LiquidiumStatus {\n /** Operation currently represented by the status. */\n operation: LiquidiumOperation;\n /** Current lifecycle state for the operation. */\n state: LiquidiumState;\n /** Observed chain confirmations, or null when unavailable or not applicable. */\n confirmations: number | null;\n /** Required confirmations, or null when unavailable or not applicable. */\n requiredConfirmations: number | null;\n}\n\ninterface CreateLiquidiumStatusParams {\n operation: LiquidiumOperation;\n state: LiquidiumState;\n confirmations?: number | null;\n requiredConfirmations?: number | null;\n}\n\nexport function createLiquidiumStatus(\n params: CreateLiquidiumStatusParams\n): LiquidiumStatus {\n return {\n operation: params.operation,\n state: params.state,\n confirmations: params.confirmations ?? null,\n requiredConfirmations: params.requiredConfirmations ?? null,\n };\n}\n","import { Asset } from \"./types\";\n\nconst MINIMUM_BTC_WITHDRAW_AMOUNT_SATS = 5_000n;\nconst MINIMUM_STABLECOIN_WITHDRAW_AMOUNT_BASE_UNITS = 1_000_000n;\n\n/** Minimum withdraw amounts in each asset's base units. */\nexport const MIN_WITHDRAW_AMOUNTS_BY_ASSET = {\n [Asset.BTC]: MINIMUM_BTC_WITHDRAW_AMOUNT_SATS,\n [Asset.USDC]: MINIMUM_STABLECOIN_WITHDRAW_AMOUNT_BASE_UNITS,\n [Asset.USDT]: MINIMUM_STABLECOIN_WITHDRAW_AMOUNT_BASE_UNITS,\n} as const;\n\nexport type MinimumWithdrawAsset = keyof typeof MIN_WITHDRAW_AMOUNTS_BY_ASSET;\n\nexport interface WithdrawAmountMinimumValidationParams {\n amount: bigint;\n asset: string;\n}\n\nexport interface WithdrawAmountMinimumValidationError {\n asset: string;\n minimumAmount: bigint;\n message: string;\n}\n\n/**\n * Returns the minimum withdraw amount for an asset in base units.\n *\n * Assets without a configured product minimum return `0n`.\n */\nexport function getMinimumWithdrawAmount(asset: string): bigint {\n if (!isMinimumWithdrawAsset(asset)) {\n return 0n;\n }\n\n return MIN_WITHDRAW_AMOUNTS_BY_ASSET[asset];\n}\n\nexport function getWithdrawAmountMinimumValidationError(\n params: WithdrawAmountMinimumValidationParams\n): WithdrawAmountMinimumValidationError | null {\n const minimumAmount = getMinimumWithdrawAmount(params.asset);\n if (minimumAmount <= 0n || params.amount >= minimumAmount) {\n return null;\n }\n\n return {\n asset: params.asset,\n minimumAmount,\n message: formatMinimumWithdrawAmountMessage(params.asset, minimumAmount),\n };\n}\n\nexport function formatMinimumWithdrawAmountMessage(\n asset: string,\n minimumAmount: bigint\n): string {\n return `Withdraw amount must be at least ${minimumAmount} base units for ${asset}`;\n}\n\nfunction isMinimumWithdrawAsset(asset: string): asset is MinimumWithdrawAsset {\n return Object.hasOwn(MIN_WITHDRAW_AMOUNTS_BY_ASSET, asset);\n}\n","import { AccountIdentifier, SubAccount } from \"@icp-sdk/canisters/ledger/icp\";\nimport {\n decodeIcrcAccount as decodeIcrcAccountText,\n encodeIcrcAccount,\n} from \"@icp-sdk/canisters/ledger/icrc\";\nimport { Principal } from \"@icp-sdk/core/principal\";\n\n/** Account type hint for Liquidium account inputs and normalized account responses. */\nexport const LiquidiumAccountType = {\n ChainAddress: \"ChainAddress\",\n IcPrincipal: \"IcPrincipal\",\n IcpAccountIdentifier: \"IcpAccountIdentifier\",\n IcrcAccount: \"IcrcAccount\",\n} as const;\n/** Account type hint for Liquidium account inputs and normalized account responses. */\nexport type LiquidiumAccountType =\n (typeof LiquidiumAccountType)[keyof typeof LiquidiumAccountType];\n\n/** Chain-native destination account, such as a BTC or EVM address. */\nexport interface ChainAddressAccount {\n /** Account type. */\n type: \"ChainAddress\";\n /** Chain-native address. */\n address: string;\n}\n\n/** IC principal account. */\nexport interface IcPrincipalAccount {\n /** Account type. */\n type: \"IcPrincipal\";\n /** Principal text. */\n address: string;\n}\n\n/** Legacy ICP ledger account identifier. */\nexport interface IcpAccountIdentifierAccount {\n /** Account type. */\n type: \"IcpAccountIdentifier\";\n /** ICP ledger account identifier text. */\n address: string;\n}\n\n/** ICRC account display shape shared by lending and Simple Loans responses. */\nexport interface IcrcAccount {\n /** Account type. */\n type: \"IcrcAccount\";\n /** ICRC account owner principal text. */\n owner: string;\n /** Optional ICRC subaccount bytes. */\n subaccount?: Uint8Array;\n /** Text-encoded ICRC account for display. */\n address: string;\n}\n\n/** Normalized Liquidium account returned by SDK flows. */\nexport type LiquidiumAccount =\n | ChainAddressAccount\n | IcPrincipalAccount\n | IcpAccountIdentifierAccount\n | IcrcAccount;\n\n/** Address input with an optional account type hint. */\nexport interface LiquidiumAccountReference {\n /** Address, principal, ICRC account, or ICP account identifier. */\n address: string;\n /** Account type hint. Use string shorthand when the SDK should auto-detect. */\n type: LiquidiumAccountType;\n}\n\n/** Account input accepted by SDK flows that can auto-detect string addresses. */\nexport type LiquidiumAccountInput = string | LiquidiumAccountReference;\n\nexport interface CanisterNativeAccount {\n Native: Principal;\n}\n\nexport interface CanisterExternalAccount {\n External: string;\n}\n\nexport interface CanisterAccountIdentifierAccount {\n AccountIdentifier: string;\n}\n\nexport interface CanisterIcrcAccount {\n Icrc: {\n owner: Principal;\n subaccount: [] | [Uint8Array | number[]];\n };\n}\n\nexport type CanisterLiquidiumAccount =\n | CanisterNativeAccount\n | CanisterExternalAccount\n | CanisterAccountIdentifierAccount\n | CanisterIcrcAccount;\n\nexport interface DecodedIcrcAccount {\n owner: Principal;\n subaccount?: Uint8Array;\n account: IcrcAccount;\n}\n\nexport function createIcrcAccount(params: {\n owner: Principal;\n subaccount?: Uint8Array;\n}): IcrcAccount {\n return {\n type: \"IcrcAccount\",\n owner: params.owner.toText(),\n subaccount: params.subaccount,\n address: encodeIcrcAccount({\n owner: params.owner,\n subaccount: params.subaccount,\n }),\n };\n}\n\nexport function mapCanisterAccountToLiquidiumAccount(\n account: CanisterLiquidiumAccount\n): LiquidiumAccount {\n if (\"Native\" in account) {\n return { type: \"IcPrincipal\", address: account.Native.toText() };\n }\n\n if (\"AccountIdentifier\" in account) {\n return {\n type: \"IcpAccountIdentifier\",\n address: account.AccountIdentifier,\n };\n }\n\n if (\"Icrc\" in account) {\n const subaccount = normalizeOptionalSubaccount(account.Icrc.subaccount[0]);\n\n return {\n type: \"IcrcAccount\",\n owner: account.Icrc.owner.toText(),\n subaccount,\n address: encodeIcrcAccount({\n owner: account.Icrc.owner,\n subaccount,\n }),\n };\n }\n\n return { type: \"ChainAddress\", address: account.External };\n}\n\nexport function decodeIcrcAccountAddress(address: string): DecodedIcrcAccount {\n const decoded = decodeIcrcAccountText(address);\n const owner = Principal.fromText(decoded.owner.toText());\n const subaccount = decoded.subaccount\n ? Uint8Array.from(decoded.subaccount)\n : undefined;\n\n return {\n owner,\n subaccount,\n account: createIcrcAccount({ owner, subaccount }),\n };\n}\n\nexport function encodeIcpAccountIdentifier(params: {\n owner: Principal;\n subaccount?: Uint8Array;\n}): string {\n return AccountIdentifier.fromPrincipal({\n principal: params.owner,\n subAccount: params.subaccount\n ? SubAccount.fromBytes(params.subaccount)\n : undefined,\n }).toHex();\n}\n\nexport function normalizeIcpAccountIdentifier(address: string): string {\n return AccountIdentifier.fromHex(address).toHex();\n}\n\nfunction normalizeOptionalSubaccount(\n subaccount: Uint8Array | number[] | undefined\n): Uint8Array | undefined {\n if (!subaccount) {\n return undefined;\n }\n\n return subaccount instanceof Uint8Array\n ? subaccount\n : Uint8Array.from(subaccount);\n}\n","import type {\n LiquidiumAccount,\n LiquidiumAccountInput,\n} from \"../../core/accounts\";\nimport type { LiquidiumOperation, LiquidiumStatus } from \"../../core/status\";\nimport type {\n Asset,\n AssetIdentifier,\n Chain,\n OutflowType,\n SigningChain,\n SupplyAction,\n} from \"../../core/types\";\nimport type {\n SignMessageWalletAction,\n WalletActionKind,\n WalletAdapter,\n WalletExecutionKind,\n} from \"../../core/wallet-actions\";\n\n/** Wallet execution dependencies for borrow and withdraw convenience methods. */\nexport interface WalletExecutionParams {\n /** Chain used by the signing wallet. */\n signerChain: SigningChain;\n /** Wallet adapter used to execute the prepared action. */\n signerWalletAdapter: WalletAdapter;\n}\n\n/** EVM transaction payload returned by lending transaction builders. */\nexport interface EvmContractTransaction {\n /** Contract address to call. */\n to: string;\n /** Hex-encoded calldata. */\n data: string;\n}\n\n/** Parameters for an ERC-20 transfer transaction. */\nexport interface CreateTransferErc20TransactionParams {\n /** ERC-20 token contract address. */\n tokenAddress: string;\n /** Destination EVM address. */\n recipientAddress: string;\n /** Transfer amount in token base units. */\n amount: bigint;\n}\n\n/**\n * Receipt for a borrow or withdrawal outflow submitted to the lending canister.\n *\n * `id` is the outflow reference to show users immediately. `txid` may be unset until\n * the protocol assigns a chain transaction id. `outflowRef` is an optional protocol reference.\n */\nexport interface OutflowDetails {\n /** Protocol outflow id. */\n id: string;\n /** Borrow, withdrawal, or fee-claim discriminator. */\n outflowType: OutflowType;\n /** Optional protocol outflow reference. */\n outflowRef?: string;\n /** Chain transaction id when already assigned by the protocol. */\n txid?: string;\n /** Outflow amount in the pool asset's base units. */\n amount: bigint;\n /** Outflow destination account. */\n receiver: LiquidiumAccount;\n}\n\n/** Borrow receipt. */\nexport type BorrowOutflowDetails = OutflowDetails & {\n outflowType: \"borrow\";\n /** Shared lifecycle status for the borrow outflow receipt. */\n status: LiquidiumStatus;\n};\n\n/** Withdraw receipt. */\nexport type WithdrawOutflowDetails = OutflowDetails & {\n outflowType: \"withdrawal\";\n /** Shared lifecycle status for the withdraw outflow receipt. */\n status: LiquidiumStatus;\n};\n\n/**\n * Fields to build a borrow request. `amount` is in the borrow pool asset's base units\n * (e.g. satoshis, token smallest units).\n */\nexport interface CreateBorrowRequest {\n /** Liquidium profile principal text. */\n profileId: string;\n /** Borrow pool principal text. */\n poolId: string;\n /** Amount to borrow in the borrow asset's base units. */\n amount: bigint;\n /** Chain where borrowed funds should arrive. */\n chain: Chain;\n /** Destination that receives the borrowed asset. */\n receiver: LiquidiumAccountInput;\n /** Wallet address that signs the borrow authorization. */\n signerWalletAddress: string;\n}\n\n/** Prepared borrow request data embedded in the signable action. */\nexport interface CreateBorrowData extends CreateBorrowRequest {\n /** Unix expiry timestamp in seconds, included in the signed message. */\n expiryTimestamp: bigint;\n}\n\n/** Prepared action for creating a borrow outflow. */\nexport interface BorrowAction\n extends SignMessageWalletAction<CreateBorrowData, BorrowOutflowDetails> {\n /** Protocol action kind. */\n kind: typeof WalletActionKind.createBorrow;\n /** Required wallet capability. */\n executionKind: typeof WalletExecutionKind.signMessage;\n /** Adapter-facing action type. */\n actionType: typeof WalletActionKind.createBorrow;\n}\n\n/** Fields to build a withdraw request. `amount` is in the pool asset's base units. */\nexport interface CreateWithdrawRequest {\n /** Liquidium profile principal text. */\n profileId: string;\n /** Pool principal text to withdraw from. */\n poolId: string;\n /**\n * Amount to withdraw in the pool asset's base units. BTC withdrawals require\n * at least 5,000 sats. USDC and USDT withdrawals require at least 1 token.\n */\n amount: bigint;\n /** Chain where withdrawn funds should arrive. */\n chain: Chain;\n /** Destination that receives the withdrawn asset. */\n receiver: LiquidiumAccountInput;\n /** Wallet address that signs the withdraw authorization. */\n signerWalletAddress: string;\n}\n\n/** Prepared withdraw request data embedded in the signable action. */\nexport interface CreateWithdrawData extends CreateWithdrawRequest {\n /** Unix expiry timestamp in seconds, included in the signed message. */\n expiryTimestamp: bigint;\n}\n\n/** Prepared action for creating a withdraw outflow. */\nexport interface WithdrawAction\n extends SignMessageWalletAction<CreateWithdrawData, WithdrawOutflowDetails> {\n /** Protocol action kind. */\n kind: typeof WalletActionKind.createWithdraw;\n /** Required wallet capability. */\n executionKind: typeof WalletExecutionKind.signMessage;\n /** Adapter-facing action type. */\n actionType: typeof WalletActionKind.createWithdraw;\n}\n\n/** Supply execution plan selected by the SDK. */\nexport const SupplyPlanType = {\n contractInteraction: \"contractInteraction\",\n transfer: \"transfer\",\n} as const;\n/** Supply execution plan selected by the SDK. */\nexport type SupplyPlanType =\n (typeof SupplyPlanType)[keyof typeof SupplyPlanType];\n\n/** Supply destination returned by `lending.supply(...)`. */\nexport type SupplyTarget = AssetIdentifier & {\n /** Pool principal text receiving the inflow. */\n poolId: string;\n /** Deposit or repayment action for the inflow. */\n action: SupplyAction;\n /** Address to use for this chain and asset pair. */\n address: string;\n /** Legacy account identifier for ICP ledger transfers. */\n icpAccountIdentifier?: string;\n};\n\ninterface BaseSupplyFlowRequest {\n profileId: string;\n poolId: string;\n action: SupplyAction;\n /** Transfer chain to use. Pass ICP for ck-ledger transfers. */\n chain: Chain;\n}\n\n/** Manual transfer-based `lending.supply` request. */\nexport interface ManualTransferSupplyFlowRequest extends BaseSupplyFlowRequest {\n /** Transfer supply uses the default mechanism and does not accept this field. */\n mechanism?: never;\n /** Manual supply does not broadcast through a wallet adapter. */\n walletAdapter?: never;\n /** Manual supply does not accept a sender account. */\n account?: never;\n /** Manual supply does not accept an execution amount. */\n amount?: never;\n}\n\n/** Wallet-executed transfer-based `lending.supply` request. */\nexport interface WalletTransferSupplyFlowRequest extends BaseSupplyFlowRequest {\n /** Transfer supply uses the default mechanism and does not accept this field. */\n mechanism?: never;\n /** Wallet adapter used to broadcast the transfer. */\n walletAdapter: Pick<\n WalletAdapter,\n \"sendBtcTransaction\" | \"sendEthTransaction\" | \"sendIcrcTransfer\"\n >;\n /** Sender wallet account. */\n account: string;\n /** Transfer amount in the target asset's base units. */\n amount: bigint;\n}\n\n/** Transfer-based supply request, either manual or wallet-executed. */\nexport type TransferSupplyFlowRequest =\n | ManualTransferSupplyFlowRequest\n | WalletTransferSupplyFlowRequest;\n\n/** Input for contract-interaction `lending.supply`, which always executes now. */\nexport interface ContractInteractionSupplyFlowRequest\n extends BaseSupplyFlowRequest {\n /** Contract-interaction mechanism discriminator. */\n mechanism: typeof SupplyPlanType.contractInteraction;\n /** Contract interaction is only supported for ETH stablecoin pools. */\n chain: typeof Chain.ETH;\n /** ETH wallet adapter used to approve and deposit ERC-20 assets. */\n walletAdapter: Pick<WalletAdapter, \"sendEthTransaction\">;\n /** Sender EVM wallet address. */\n account: string;\n /** Deposit or repayment amount in token base units. */\n amount: bigint;\n}\n\n/** Request accepted by `lending.supply(...)`. */\nexport type SupplyFlowRequest =\n | TransferSupplyFlowRequest\n | ContractInteractionSupplyFlowRequest;\n\n/**\n * Supply receipt returned by `lending.supply(...)`.\n *\n * - `txid` is populated when the SDK broadcast the transaction on your behalf\n * (wallet-adapter path). When undefined, the caller is expected to broadcast\n * themselves and call {@link SupplyFlow.submit} for flows that require txid\n * registration.\n * - If post-broadcast inflow registration fails after the SDK broadcasts the\n * transaction, `txid` is still returned so callers can track the transaction.\n * - `submit` registers a broadcast txid with the SDK API when needed. ETH\n * stablecoin deposit-address transfers are indexed from ERC-20 transfer logs,\n * so `submit` acknowledges the txid without posting it to the inflow endpoint.\n *\n * The SDK does not poll inflow status. When you have a `txid`, it is your\n * responsibility to track confirmation state with your own polling.\n */\nexport interface SupplyFlow {\n /** Execution plan used by the supply flow. */\n type: SupplyPlanType;\n /** Destination where funds should be sent or were sent. */\n target: SupplyTarget;\n /** Transaction id when the SDK broadcast the transaction. */\n txid?: string;\n /** Shared lifecycle status for the supply flow. */\n status: LiquidiumStatus;\n /** Registers a broadcast transaction id when the flow requires an indexing hint. */\n submit(request: SubmitSupplyFlowInflowRequest): Promise<SubmitInflowResponse>;\n}\n\n/** Canonical inflow operation accepted by direct inflow submission. */\nexport type InflowOperation = Extract<\n LiquidiumOperation,\n \"deposit\" | \"repayment\"\n>;\n\n/** Body for `SupplyFlow.submit`. The supply flow supplies the inflow operation. */\nexport interface SubmitSupplyFlowInflowRequest {\n /** Broadcast transaction id or hash. */\n txid: string;\n /** Chain where the transaction was broadcast, when not implied by the flow. */\n chain?: Extract<Chain, \"BTC\" | \"ETH\">;\n}\n\n/** Body for direct `lending.submitInflow`. */\nexport interface SubmitInflowRequest extends SubmitSupplyFlowInflowRequest {\n /** Deposit or repayment operation represented by the transaction. */\n operation: InflowOperation;\n}\n\n/** Acknowledgement from the SDK API after submitting an inflow hint. */\nexport interface SubmitInflowResponse {\n /** Transaction id accepted by the SDK API. */\n txid: string;\n}\n\n/** Chain and asset pair for estimating an inflow target fee. */\nexport type EstimateInflowFeeRequest = AssetIdentifier;\n\n/** Request for an ETH stablecoin deposit address. */\nexport interface GetDepositAddressRequest {\n /** Liquidium profile principal text. */\n profileId: string;\n /** Pool principal text receiving the inflow. */\n poolId: string;\n /** ETH stablecoin asset. */\n asset: typeof Asset.USDC | typeof Asset.USDT;\n /** Deposit or repayment action for the inflow. */\n action: SupplyAction;\n}\n\n/** Fee estimate for an inflow target, rounded up to the asset's fee unit. */\nexport interface InflowFeeEstimate {\n /** Estimated total fee rounded up in the asset's base units. */\n totalFee: bigint;\n}\n\n/** Request for ERC-20 approval and deposit planning. */\nexport interface GetEvmSupplyContextRequest {\n /** Liquidium profile principal text. */\n profileId: string;\n /** Pool principal text receiving the inflow. */\n poolId: string;\n /** EVM wallet address that will send funds. */\n walletAddress: string;\n /** Supply amount in token base units. */\n amount: bigint;\n /** Deposit or repayment action for the inflow. */\n action: SupplyAction;\n}\n\n/** Approval strategy required before an ERC-20 deposit contract call. */\nexport const EvmSupplyApprovalStrategy = {\n approveMax: \"approve-max\",\n none: \"none\",\n resetThenApproveMax: \"reset-then-approve-max\",\n} as const;\n/** Approval strategy required before an ERC-20 deposit contract call. */\nexport type EvmSupplyApprovalStrategy =\n (typeof EvmSupplyApprovalStrategy)[keyof typeof EvmSupplyApprovalStrategy];\n\n/** ERC-20 supply planning data returned by `lending.getEvmSupplyContext(...)`. */\nexport interface EvmSupplyContext {\n /** Liquidium profile principal text. */\n profileId: string;\n /** Pool principal text receiving the inflow. */\n poolId: string;\n /** Normalized EVM wallet address. */\n walletAddress: string;\n /** Deposit or repayment action for the inflow. */\n action: SupplyAction;\n /** Supported ETH stablecoin asset. */\n asset: typeof Asset.USDC | typeof Asset.USDT;\n /** ETH chain discriminator. */\n chain: typeof Chain.ETH;\n /** Requested amount serialized in token base units. */\n amount: string;\n /** ERC-20 token contract address. */\n tokenAddress: string;\n /** Contract address that must be approved as spender. */\n spenderAddress: string;\n /** Deposit helper contract address. */\n depositContractAddress: string;\n /** Current token balance serialized in base units. */\n balance: string;\n /** Current allowance serialized in base units. */\n allowance: string;\n /** Whether an approval transaction is needed before deposit. */\n requiresApproval: boolean;\n /** Approval sequence the caller should perform. */\n approvalStrategy: EvmSupplyApprovalStrategy;\n}\n","import { Principal } from \"@icp-sdk/core/principal\";\nimport {\n createIcrcAccount,\n encodeIcpAccountIdentifier,\n} from \"../../../core/accounts\";\nimport { createCkBtcMinterActor } from \"../../../core/canisters/ckbtc/minter\";\nimport {\n createDepositAccountsActor,\n type DepositAccountErrors,\n} from \"../../../core/canisters/deposit-accounts/actor\";\nimport {\n createFlexibleLendingActor,\n type DecodedPool,\n decodeFlexiblePool,\n} from \"../../../core/canisters/lending/flexible-actor\";\nimport { LiquidiumError, LiquidiumErrorCode } from \"../../../core/errors\";\nimport {\n USDC_CONTRACT_ADDRESS,\n USDT_CONTRACT_ADDRESS,\n} from \"../../../core/evm\";\nimport type { CanisterContext } from \"../../../core/transports/canister-context\";\nimport {\n Asset,\n type AssetIdentifier,\n Chain,\n type SupplyAction,\n} from \"../../../core/types\";\nimport { encodeInflowSubaccount } from \"../../../core/utils/inflow-subaccount\";\nimport { SupplyPlanType, type SupplyTarget } from \"../types\";\n\nexport interface ResolveSupplyTargetRequest {\n profileId: string;\n poolId: string;\n action: SupplyAction;\n mechanism: SupplyPlanType | null;\n chain?: Chain;\n}\n\ntype SupplyTargetRequest = AssetIdentifier & {\n poolId: string;\n action: SupplyAction;\n};\n\ninterface ResolveSupplyMechanismParams {\n identifier: AssetIdentifier;\n mechanism: SupplyPlanType | null;\n}\n\nexport async function resolveSupplyTargetForPool(\n canisterContext: CanisterContext,\n request: ResolveSupplyTargetRequest,\n selectedPool: DecodedPool\n): Promise<SupplyTarget> {\n const identifier = resolveSupplyAssetIdentifier({\n asset: selectedPool.asset,\n poolChain: selectedPool.chain,\n transferChain: request.chain ?? selectedPool.chain,\n });\n const mechanism = resolveSupplyMechanism({\n identifier,\n mechanism: request.mechanism,\n });\n const targetRequest: SupplyTargetRequest = {\n ...identifier,\n poolId: request.poolId,\n action: request.action,\n };\n\n if (mechanism === SupplyPlanType.contractInteraction) {\n return getIcrcAccountSupplyTarget(request.profileId, targetRequest);\n }\n\n if (identifier.chain === Chain.ICP) {\n return identifier.asset === Asset.ICP\n ? getIcpLedgerSupplyTarget(request.profileId, targetRequest)\n : getIcrcAccountSupplyTarget(request.profileId, targetRequest);\n }\n\n return await getChainAddressSupplyTarget(\n canisterContext,\n request.profileId,\n targetRequest\n );\n}\n\nfunction resolveSupplyMechanism(\n params: ResolveSupplyMechanismParams\n): SupplyPlanType {\n if (params.mechanism !== SupplyPlanType.contractInteraction) {\n return SupplyPlanType.transfer;\n }\n\n if (\n params.identifier.chain === Chain.ETH &&\n (params.identifier.asset === Asset.USDC ||\n params.identifier.asset === Asset.USDT)\n ) {\n return SupplyPlanType.contractInteraction;\n }\n\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n `Contract-interaction supply is not supported for ${params.identifier.asset} on ${params.identifier.chain}`\n );\n}\n\nexport function isEthStablecoin(asset: string, chain: string): boolean {\n return chain === Chain.ETH && (asset === Asset.USDC || asset === Asset.USDT);\n}\n\nexport function getEthStablecoinContractAddress(asset: string): string {\n if (asset === Asset.USDC) {\n return USDC_CONTRACT_ADDRESS;\n }\n\n if (asset === Asset.USDT) {\n return USDT_CONTRACT_ADDRESS;\n }\n\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n `ETH stablecoin contract address is not configured for ${asset}`\n );\n}\n\nexport function mapDepositAccountErrorToLiquidiumError(\n error: DepositAccountErrors\n): LiquidiumError {\n if (\"InvalidEvmAddress\" in error) {\n return new LiquidiumError(\n LiquidiumErrorCode.INVALID_ADDRESS,\n \"Invalid EVM deposit address\"\n );\n }\n\n if (\"Busy\" in error) {\n return new LiquidiumError(\n LiquidiumErrorCode.SERVICE_UNAVAILABLE,\n \"Deposit address service is busy\"\n );\n }\n\n if (\"Cooldown\" in error) {\n return new LiquidiumError(\n LiquidiumErrorCode.SERVICE_UNAVAILABLE,\n `Deposit address service is cooling down for ${error.Cooldown.retry_after_secs.toString()} seconds`\n );\n }\n\n if (\"Other\" in error) {\n return new LiquidiumError(\n LiquidiumErrorCode.DEPOSIT_ADDRESS_ERROR,\n error.Other\n );\n }\n\n if (\"AddressDerivationFailed\" in error) {\n return new LiquidiumError(\n LiquidiumErrorCode.DEPOSIT_ADDRESS_ERROR,\n \"Deposit address derivation failed\"\n );\n }\n\n if (\"NotFound\" in error) {\n return new LiquidiumError(\n LiquidiumErrorCode.DEPOSIT_ADDRESS_ERROR,\n \"Deposit address not found\"\n );\n }\n\n return new LiquidiumError(\n LiquidiumErrorCode.DEPOSIT_ADDRESS_ERROR,\n \"Deposit address canister returned an unknown error\"\n );\n}\n\nexport async function getPoolById(\n canisterContext: CanisterContext,\n poolId: string\n): Promise<DecodedPool> {\n const pools = await createFlexibleLendingActor(canisterContext).list_pools();\n const selectedPool = pools.find((pool) => pool.principal.toText() === poolId);\n const decodedPool = selectedPool ? decodeFlexiblePool(selectedPool) : null;\n\n if (!decodedPool) {\n throw new LiquidiumError(\n LiquidiumErrorCode.POOL_NOT_FOUND,\n `Pool not found: ${poolId}`\n );\n }\n\n return decodedPool;\n}\n\ninterface ResolveSupplyAssetIdentifierParams {\n asset: string;\n poolChain: string;\n transferChain: string;\n}\n\nfunction resolveSupplyAssetIdentifier(\n params: ResolveSupplyAssetIdentifierParams\n): AssetIdentifier {\n if (params.asset === Asset.BTC && params.poolChain === Chain.BTC) {\n if (params.transferChain === Chain.BTC) {\n return { asset: Asset.BTC, chain: Chain.BTC };\n }\n\n if (params.transferChain === Chain.ICP) {\n return { asset: Asset.BTC, chain: Chain.ICP };\n }\n }\n\n if (\n (params.asset === Asset.USDC || params.asset === Asset.USDT) &&\n params.poolChain === Chain.ETH\n ) {\n if (params.transferChain === Chain.ETH) {\n return { asset: params.asset, chain: Chain.ETH };\n }\n\n if (params.transferChain === Chain.ICP) {\n return { asset: params.asset, chain: Chain.ICP };\n }\n }\n\n if (\n params.asset === Asset.ICP &&\n params.poolChain === Chain.ICP &&\n params.transferChain === Chain.ICP\n ) {\n return { asset: Asset.ICP, chain: Chain.ICP };\n }\n\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n `Supply is not supported for ${params.asset} pool on ${params.poolChain} using ${params.transferChain}`\n );\n}\n\nasync function getChainAddressSupplyTarget(\n canisterContext: CanisterContext,\n profileId: string,\n request: SupplyTargetRequest\n): Promise<SupplyTarget> {\n if (request.chain === Chain.ETH) {\n const tokenAddress = getEthStablecoinContractAddress(request.asset);\n const subaccount = encodeInflowSubaccount({\n action: request.action,\n principal: Principal.fromText(profileId),\n });\n const result = await createDepositAccountsActor(\n canisterContext\n ).get_deposit_address(\n {\n owner: Principal.fromText(request.poolId),\n subaccount: [subaccount],\n },\n [tokenAddress]\n );\n\n if (\"Err\" in result) {\n throw mapDepositAccountErrorToLiquidiumError(result.Err);\n }\n\n return {\n poolId: request.poolId,\n asset: request.asset,\n chain: request.chain,\n action: request.action,\n address: result.Ok,\n };\n }\n\n const configuredBtcPoolId = canisterContext.canisterIds.pools.btc;\n if (request.poolId !== configuredBtcPoolId) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n `Chain-address BTC inflow targets require the configured BTC pool ${configuredBtcPoolId}, received ${request.poolId}`\n );\n }\n\n const subaccount = encodeInflowSubaccount({\n action: request.action,\n principal: Principal.fromText(profileId),\n });\n const address = await createCkBtcMinterActor(canisterContext).get_btc_address(\n {\n owner: [Principal.fromText(configuredBtcPoolId)],\n subaccount: [subaccount],\n }\n );\n\n return { ...request, address };\n}\n\nfunction getIcrcAccountSupplyTarget(\n profileId: string,\n request: SupplyTargetRequest\n): SupplyTarget {\n const account = createInflowIcrcAccount(profileId, request);\n\n return { ...request, address: account.address };\n}\n\nfunction getIcpLedgerSupplyTarget(\n profileId: string,\n request: SupplyTargetRequest\n): SupplyTarget {\n const poolPrincipal = Principal.fromText(request.poolId);\n const subaccount = encodeInflowSubaccount({\n action: request.action,\n principal: Principal.fromText(profileId),\n });\n const account = createIcrcAccount({\n owner: poolPrincipal,\n subaccount,\n });\n\n return {\n poolId: request.poolId,\n asset: Asset.ICP,\n chain: Chain.ICP,\n action: request.action,\n address: account.address,\n icpAccountIdentifier: encodeIcpAccountIdentifier({\n owner: poolPrincipal,\n subaccount,\n }),\n };\n}\n\nfunction createInflowIcrcAccount(\n profileId: string,\n request: SupplyTargetRequest\n) {\n return createIcrcAccount({\n owner: Principal.fromText(request.poolId),\n subaccount: encodeInflowSubaccount({\n action: request.action,\n principal: Principal.fromText(profileId),\n }),\n });\n}\n","import { Asset, Chain } from \"../../../core/types\";\nimport { ceilDivBigint } from \"../../../core/utils/bigint\";\nimport type { EstimateInflowFeeRequest } from \"../types\";\nimport { isEthStablecoin } from \"./supply-targets\";\n\nconst ETH_STABLECOIN_INFLOW_FEE_ROUND_UP_TO_NEAREST_10_CENTS = 100_000n;\nconst BTC_INFLOW_FEE_ROUND_UP_TO_NEAREST_SATS = 500n;\n\n/**\n * Rounds an inflow fee estimate up to the configured unit for its asset.\n *\n * ETH stablecoin fees use 6 decimals, so 100_000 base units is $0.10.\n * BTC fees use sats, so the fee is rounded up to the nearest 500 sats.\n */\nexport function roundInflowFeeEstimate(\n request: EstimateInflowFeeRequest,\n totalFee: bigint\n): bigint {\n if (totalFee <= 0n) {\n return 0n;\n }\n\n if (isEthStablecoin(request.asset, request.chain)) {\n return roundUpToNearest(\n totalFee,\n ETH_STABLECOIN_INFLOW_FEE_ROUND_UP_TO_NEAREST_10_CENTS\n );\n }\n\n if (request.asset === Asset.BTC && request.chain === Chain.BTC) {\n return roundUpToNearest(totalFee, BTC_INFLOW_FEE_ROUND_UP_TO_NEAREST_SATS);\n }\n\n return totalFee;\n}\n\n/** Rounds a positive bigint up to the nearest multiple of the rounding unit. */\nfunction roundUpToNearest(amount: bigint, roundingUnit: bigint): bigint {\n return ceilDivBigint(amount, roundingUnit) * roundingUnit;\n}\n","import {\n Network as BitcoinAddressNetwork,\n validate as validateBitcoinAddress,\n} from \"bitcoin-address-validation\";\nimport { getAddress, isAddress } from \"viem\";\nimport { LiquidiumError, LiquidiumErrorCode } from \"./errors\";\nimport { Asset, Chain } from \"./types\";\n\nexport type EvmAddress = `0x${string}`;\n\ninterface NormalizeExternalAddressParams {\n address: string;\n asset: string;\n chain: string;\n}\n\nconst BTC_MAINNET_ADDRESS_ERROR = \"Address must be a valid mainnet BTC address\";\nconst EVM_ADDRESS_ERROR = \"Address must be a valid EVM address\";\nconst ADDRESS_CHAIN_MISMATCH_ERROR = \"Address chain must match asset\";\n\nexport function normalizeExternalAddress(\n params: NormalizeExternalAddressParams\n): string {\n if (params.asset === Asset.BTC) {\n if (params.chain !== Chain.BTC) {\n throw new LiquidiumError(\n LiquidiumErrorCode.INVALID_ADDRESS,\n ADDRESS_CHAIN_MISMATCH_ERROR\n );\n }\n\n if (\n !validateBitcoinAddress(params.address, BitcoinAddressNetwork.mainnet)\n ) {\n throw new LiquidiumError(\n LiquidiumErrorCode.INVALID_ADDRESS,\n BTC_MAINNET_ADDRESS_ERROR\n );\n }\n\n return params.address;\n }\n\n if (isEthStablecoin(params.asset)) {\n if (params.chain !== Chain.ETH) {\n throw new LiquidiumError(\n LiquidiumErrorCode.INVALID_ADDRESS,\n ADDRESS_CHAIN_MISMATCH_ERROR\n );\n }\n\n if (!isAddress(params.address)) {\n throw new LiquidiumError(\n LiquidiumErrorCode.INVALID_ADDRESS,\n EVM_ADDRESS_ERROR\n );\n }\n\n return getAddress(params.address);\n }\n\n return params.address;\n}\n\nexport function normalizeAndValidateEvmAddress(\n address: string,\n errorMessage: string\n): EvmAddress {\n if (!isAddress(address)) {\n throw new LiquidiumError(LiquidiumErrorCode.INVALID_ADDRESS, errorMessage);\n }\n\n return getAddress(address) as EvmAddress;\n}\n\nfunction isEthStablecoin(asset: string): boolean {\n return asset === Asset.USDC || asset === Asset.USDT;\n}\n","import { LiquidiumError, LiquidiumErrorCode } from \"../errors\";\n\nconst MIN_ATTEMPTS = 1;\nconst MIN_INITIAL_RETRY_DELAY_MS = 0;\nconst MIN_BACKOFF_MULTIPLIER = 1;\n\nexport type RetryWithBackoffOptions<T> = {\n execute: () => Promise<T>;\n maxAttempts: number;\n initialRetryDelayMs: number;\n backoffMultiplier: number;\n shouldRetryError: (error: unknown) => boolean;\n waitForDelayMs?: (delayMs: number) => Promise<void>;\n};\n\nexport async function retryWithBackoff<T>(\n options: RetryWithBackoffOptions<T>\n): Promise<T> {\n assertValidRetryOptions(options);\n\n const waitForDelayMs = options.waitForDelayMs ?? defaultWaitForDelayMs;\n let retryDelayMs = options.initialRetryDelayMs;\n\n for (let attempt = 1; attempt <= options.maxAttempts; attempt += 1) {\n try {\n return await options.execute();\n } catch (error) {\n const isLastAttempt = attempt === options.maxAttempts;\n if (isLastAttempt || !options.shouldRetryError(error)) {\n throw error;\n }\n\n await waitForDelayMs(retryDelayMs);\n retryDelayMs *= options.backoffMultiplier;\n }\n }\n\n throw new LiquidiumError(\n LiquidiumErrorCode.INTERNAL,\n \"Retry exhausted unexpectedly\"\n );\n}\n\nasync function defaultWaitForDelayMs(delayMs: number): Promise<void> {\n await new Promise<void>((resolve) => {\n setTimeout(resolve, delayMs);\n });\n}\n\nfunction assertValidRetryOptions<T>(options: RetryWithBackoffOptions<T>): void {\n if (options.maxAttempts < MIN_ATTEMPTS) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n `Retry maxAttempts must be at least ${MIN_ATTEMPTS}, received ${options.maxAttempts}`\n );\n }\n\n if (options.initialRetryDelayMs < MIN_INITIAL_RETRY_DELAY_MS) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n \"Retry initialRetryDelayMs must be a non-negative number\"\n );\n }\n\n if (options.backoffMultiplier < MIN_BACKOFF_MULTIPLIER) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n `Retry backoffMultiplier must be at least ${MIN_BACKOFF_MULTIPLIER}, received ${options.backoffMultiplier}`\n );\n }\n}\n","import { decodeIcrcAccountAddress } from \"../../../core/accounts\";\nimport {\n type EvmAddress,\n normalizeAndValidateEvmAddress,\n} from \"../../../core/address-validation\";\nimport { LiquidiumError, LiquidiumErrorCode } from \"../../../core/errors\";\nimport {\n CK_ETH_DEPOSIT_CONTRACT_ADDRESS,\n ERC20_ABI,\n MAX_UINT256,\n} from \"../../../core/evm\";\nimport { getPoolLedgerAssetRoute } from \"../../../core/pool-ledger-assets\";\nimport { createLiquidiumStatus } from \"../../../core/status\";\nimport type { CanisterContext } from \"../../../core/transports/canister-context\";\nimport {\n type Asset,\n Chain,\n type EvmReadClient,\n SupplyAction,\n} from \"../../../core/types\";\nimport { retryWithBackoff } from \"../../../core/utils/retry\";\nimport type {\n EthTransactionRequest,\n IcrcTransferDetails,\n WalletAdapter,\n} from \"../../../core/wallet-actions\";\nimport {\n createApproveTransaction,\n createDepositErc20Transaction,\n createTransferErc20Transaction,\n} from \"../evm-transactions\";\nimport type {\n ContractInteractionSupplyFlowRequest,\n EvmSupplyApprovalStrategy,\n EvmSupplyContext,\n GetEvmSupplyContextRequest,\n InflowOperation,\n SubmitInflowRequest,\n SubmitInflowResponse,\n SubmitSupplyFlowInflowRequest,\n SupplyFlow,\n SupplyFlowRequest,\n SupplyPlanType,\n SupplyTarget,\n WalletTransferSupplyFlowRequest,\n} from \"../types\";\nimport {\n EvmSupplyApprovalStrategy as ApprovalStrategy,\n SupplyPlanType as PlanType,\n} from \"../types\";\nimport {\n getEthStablecoinContractAddress,\n getPoolById,\n isEthStablecoin,\n resolveSupplyTargetForPool,\n} from \"./supply-targets\";\n\nconst SUBMIT_INFLOW_MAX_ATTEMPTS = 4;\nconst SUBMIT_INFLOW_INITIAL_RETRY_DELAY_MS = 1_500;\nconst SUBMIT_INFLOW_RETRY_BACKOFF_MULTIPLIER = 2;\nconst ETH_APPROVAL_POLL_INTERVAL_MS = 2_000;\nconst ETH_APPROVAL_MAX_POLLS = 30;\ntype SubmitInflowDefaults = Omit<SubmitInflowRequest, \"txid\">;\ntype AllowanceExpectation = \"zero\" | \"sufficient\";\n\ninterface SupplyFlowExecutorParams {\n canisterContext: CanisterContext;\n evmReadClient: EvmReadClient | undefined;\n requireApi(): void;\n submitInflow(request: SubmitInflowRequest): Promise<SubmitInflowResponse>;\n}\n\ninterface GetEvmSupplyContextForPoolParams {\n request: GetEvmSupplyContextRequest;\n asset: string;\n chain: string;\n}\n\ninterface SendAndSubmitTransferSupplyInflowParams {\n request: WalletTransferSupplyFlowRequest;\n target: SupplyTarget;\n defaultSubmitInflowRequest: SubmitInflowDefaults | null;\n}\n\ninterface SubmitSupplyFlowInflowParams {\n target: SupplyTarget;\n mechanism: SupplyPlanType;\n defaultSubmitInflowRequest: SubmitInflowDefaults | null;\n submitRequest: SubmitSupplyFlowInflowRequest;\n}\n\ninterface ExecuteContractSupplyParams {\n request: ContractInteractionSupplyFlowRequest;\n target: SupplyTarget;\n defaultSubmitInflowRequest: SubmitInflowDefaults | null;\n}\n\ninterface SendChainAddressSupplyTransactionParams {\n walletAdapter: Pick<\n WalletAdapter,\n \"sendBtcTransaction\" | \"sendEthTransaction\"\n >;\n chain: string;\n asset: string;\n toAddress: string;\n amount: bigint;\n senderAccount: string;\n action: SupplyAction;\n}\n\ninterface SendIcrcSupplyTransactionParams {\n walletAdapter: Pick<WalletAdapter, \"sendIcrcTransfer\">;\n asset: Asset;\n chain: typeof Chain.ICP;\n transfer: IcrcTransferDetails;\n senderAccount: string;\n action: SupplyAction;\n}\n\ninterface WaitForExpectedAllowanceParams {\n walletAddress: string;\n tokenAddress: string;\n spenderAddress: string;\n amount: bigint;\n expectation: AllowanceExpectation;\n}\n\ninterface ReadErc20AllowanceParams {\n evmReadClient: EvmReadClient;\n tokenAddress: string;\n ownerAddress: string;\n spenderAddress: string;\n}\n\ninterface ReadErc20BalanceParams {\n evmReadClient: EvmReadClient;\n tokenAddress: string;\n ownerAddress: string;\n}\n\ninterface ApprovalStrategyParams {\n allowance: bigint;\n amount: bigint;\n}\n\ninterface DefaultSubmitInflowRequestParams {\n action: SupplyAction;\n chain: string;\n}\n\ninterface ShouldSubmitInflowParams {\n target: SupplyTarget;\n mechanism: SupplyPlanType;\n}\n\nexport class SupplyFlowExecutor {\n constructor(private readonly params: SupplyFlowExecutorParams) {}\n\n async create(request: SupplyFlowRequest): Promise<SupplyFlow> {\n const requestedMechanism = request.mechanism ?? null;\n if (\n requestedMechanism === null &&\n request.walletAdapter === undefined &&\n (request.account !== undefined || request.amount !== undefined)\n ) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n \"Wallet-executed supply requires walletAdapter, account, and amount\"\n );\n }\n\n const selectedPool = await getPoolById(\n this.params.canisterContext,\n request.poolId\n );\n const target = await resolveSupplyTargetForPool(\n this.params.canisterContext,\n {\n profileId: request.profileId,\n poolId: request.poolId,\n action: request.action,\n mechanism: requestedMechanism,\n chain: request.chain,\n },\n selectedPool\n );\n const mechanism =\n requestedMechanism === PlanType.contractInteraction\n ? PlanType.contractInteraction\n : PlanType.transfer;\n const defaultSubmitInflowRequest = getDefaultSubmitInflowRequest({\n action: request.action,\n chain:\n mechanism === PlanType.contractInteraction ? Chain.ETH : target.chain,\n });\n\n let txid: string | undefined;\n switch (mechanism) {\n case PlanType.transfer:\n if (isWalletTransferSupplyRequest(request)) {\n txid = await this.sendAndSubmitTransferSupplyInflow({\n request,\n target,\n defaultSubmitInflowRequest,\n });\n }\n break;\n case PlanType.contractInteraction:\n if (!isContractInteractionSupplyRequest(request)) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n \"Contract-interaction supply requires contract-interaction request fields\"\n );\n }\n\n txid = await this.executeContractSupply({\n request,\n target,\n defaultSubmitInflowRequest,\n });\n break;\n }\n\n return {\n type: mechanism,\n target,\n txid,\n status: createLiquidiumStatus({\n operation: mapSupplyActionToStatusOperation(request.action),\n state: txid ? \"confirming\" : \"action_required\",\n }),\n submit: async (submitRequest) => {\n return await this.submitSupplyFlowInflow({\n target,\n mechanism,\n defaultSubmitInflowRequest,\n submitRequest,\n });\n },\n };\n }\n\n async getEvmSupplyContext(\n request: GetEvmSupplyContextRequest\n ): Promise<EvmSupplyContext> {\n const selectedPool = await getPoolById(\n this.params.canisterContext,\n request.poolId\n );\n\n return await this.getEvmSupplyContextForPool({\n request,\n asset: selectedPool.asset,\n chain: selectedPool.chain,\n });\n }\n\n private async getEvmSupplyContextForPool(\n params: GetEvmSupplyContextForPoolParams\n ): Promise<EvmSupplyContext> {\n const { request, asset, chain } = params;\n const evmReadClient = this.requireEvmReadClient(\n \"EVM supply context requires an EVM RPC URL or public client\"\n );\n const walletAddress = normalizeAndValidateEvmAddress(\n request.walletAddress,\n \"Invalid EVM wallet address\"\n );\n\n if (request.amount <= 0n) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n \"EVM supply context requires a positive amount\"\n );\n }\n\n if (!isEthStablecoin(asset, chain)) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n `EVM supply context only supports ETH stablecoin pools, received ${asset} on ${chain}`\n );\n }\n\n const tokenAddress = getEthStablecoinContractAddress(asset);\n const spenderAddress = CK_ETH_DEPOSIT_CONTRACT_ADDRESS;\n const [allowance, balance] = await Promise.all([\n readErc20Allowance({\n evmReadClient,\n tokenAddress,\n ownerAddress: walletAddress,\n spenderAddress,\n }),\n readErc20Balance({\n evmReadClient,\n tokenAddress,\n ownerAddress: walletAddress,\n }),\n ]);\n const approvalStrategy = getApprovalStrategy({\n allowance,\n amount: request.amount,\n });\n\n return {\n profileId: request.profileId,\n poolId: request.poolId,\n walletAddress,\n action: request.action,\n asset: asset as typeof Asset.USDC | typeof Asset.USDT,\n chain: Chain.ETH,\n amount: request.amount.toString(),\n tokenAddress,\n spenderAddress,\n depositContractAddress: CK_ETH_DEPOSIT_CONTRACT_ADDRESS,\n balance: balance.toString(),\n allowance: allowance.toString(),\n requiresApproval: approvalStrategy !== ApprovalStrategy.none,\n approvalStrategy,\n };\n }\n\n private async sendAndSubmitTransferSupplyInflow(\n params: SendAndSubmitTransferSupplyInflowParams\n ): Promise<string> {\n const { request, target, defaultSubmitInflowRequest } = params;\n\n if (!request.walletAdapter) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n \"Wallet-executed supply requires a wallet adapter\"\n );\n }\n\n const account = request.account?.trim();\n if (!account) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n \"Wallet-executed transfer supply requires an account\"\n );\n }\n\n if (!request.amount || request.amount <= 0n) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n \"Wallet-executed supply requires a positive amount\"\n );\n }\n\n const txid =\n target.chain === Chain.ICP\n ? await this.sendIcrcSupplyTransaction({\n walletAdapter: request.walletAdapter,\n asset: target.asset,\n chain: target.chain,\n transfer: {\n ledgerCanisterId:\n getPoolLedgerAssetRoute(target).ledgerCanisterId,\n to: decodeIcrcAccountAddress(target.address).account,\n amount: request.amount,\n },\n senderAccount: account,\n action: request.action,\n })\n : await this.sendChainAddressSupplyTransaction({\n walletAdapter: request.walletAdapter,\n chain: target.chain,\n toAddress: target.address,\n amount: request.amount,\n senderAccount: account,\n asset: target.asset,\n action: request.action,\n });\n\n if (shouldSubmitInflow({ target, mechanism: PlanType.transfer })) {\n try {\n await this.submitInflowWithRetry(txid, defaultSubmitInflowRequest);\n } catch {\n // The transfer is already broadcast and cannot be rolled back.\n // Return the txid so callers can track it even if the indexing hint fails.\n }\n }\n\n return txid;\n }\n\n private async submitSupplyFlowInflow(\n params: SubmitSupplyFlowInflowParams\n ): Promise<SubmitInflowResponse> {\n if (!shouldSubmitInflow(params)) {\n return {\n txid: params.submitRequest.txid,\n };\n }\n\n const defaultSubmitInflowRequest = params.defaultSubmitInflowRequest;\n if (!defaultSubmitInflowRequest) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n \"Supply flow submit requires an inflow operation\"\n );\n }\n\n return await this.params.submitInflow({\n ...defaultSubmitInflowRequest,\n ...params.submitRequest,\n });\n }\n\n private async executeContractSupply(\n params: ExecuteContractSupplyParams\n ): Promise<string> {\n const { request, target, defaultSubmitInflowRequest } = params;\n\n if (!isEthStablecoin(target.asset, target.chain)) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n \"Contract-interaction supply is only supported for ETH stablecoin targets\"\n );\n }\n\n const walletAddressInput = request.account?.trim();\n if (!walletAddressInput) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n \"Contract-interaction supply requires an account\"\n );\n }\n const walletAddress = normalizeAndValidateEvmAddress(\n walletAddressInput,\n \"Invalid EVM wallet address\"\n );\n\n if (!request.amount || request.amount <= 0n) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n \"Contract-interaction supply requires a positive amount\"\n );\n }\n\n const walletAdapter = request.walletAdapter;\n if (!walletAdapter?.sendEthTransaction) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n \"Contract-interaction supply requires an ETH wallet adapter\"\n );\n }\n\n this.params.requireApi();\n this.requireEvmReadClient(\n \"Contract-interaction supply requires an EVM RPC URL or public client\"\n );\n\n const evmSupplyContext = await this.getEvmSupplyContextForPool({\n request: {\n profileId: request.profileId,\n poolId: request.poolId,\n walletAddress,\n amount: request.amount,\n action: request.action,\n },\n asset: target.asset,\n chain: target.chain,\n });\n const supplyAmount = BigInt(evmSupplyContext.amount);\n\n if (BigInt(evmSupplyContext.balance) < supplyAmount) {\n throw new LiquidiumError(\n LiquidiumErrorCode.INSUFFICIENT_FUNDS,\n `Insufficient ${evmSupplyContext.asset} balance for ${request.action}`\n );\n }\n\n if (\n evmSupplyContext.approvalStrategy === ApprovalStrategy.resetThenApproveMax\n ) {\n await this.sendEthContractTransaction(\n walletAdapter,\n walletAddress,\n createApproveTransaction({\n tokenAddress: evmSupplyContext.tokenAddress,\n spenderAddress: evmSupplyContext.spenderAddress,\n amount: 0n,\n }),\n `supply-${request.action}-approve-reset`\n );\n\n await this.waitForExpectedAllowance({\n walletAddress,\n tokenAddress: evmSupplyContext.tokenAddress,\n spenderAddress: evmSupplyContext.spenderAddress,\n amount: supplyAmount,\n expectation: \"zero\",\n });\n }\n\n if (evmSupplyContext.approvalStrategy !== ApprovalStrategy.none) {\n await this.sendEthContractTransaction(\n walletAdapter,\n walletAddress,\n createApproveTransaction({\n tokenAddress: evmSupplyContext.tokenAddress,\n spenderAddress: evmSupplyContext.spenderAddress,\n amount: MAX_UINT256,\n }),\n `supply-${request.action}-approve-max`\n );\n\n await this.waitForExpectedAllowance({\n walletAddress,\n tokenAddress: evmSupplyContext.tokenAddress,\n spenderAddress: evmSupplyContext.spenderAddress,\n amount: supplyAmount,\n expectation: \"sufficient\",\n });\n }\n\n const depositTxid = await this.sendEthContractTransaction(\n walletAdapter,\n walletAddress,\n createDepositErc20Transaction({\n depositContractAddress: evmSupplyContext.depositContractAddress,\n tokenAddress: evmSupplyContext.tokenAddress,\n amount: supplyAmount,\n poolId: request.poolId,\n profileId: request.profileId,\n destinationAccount: target.address,\n action: request.action,\n }),\n `supply-${request.action}-deposit-erc20`\n );\n\n try {\n await this.submitInflowWithRetry(depositTxid, defaultSubmitInflowRequest);\n } catch {\n // The deposit transaction is already broadcast and cannot be rolled back.\n // Return the txid so callers can track it even if the indexing hint fails.\n }\n\n return depositTxid;\n }\n\n private async sendChainAddressSupplyTransaction(\n params: SendChainAddressSupplyTransactionParams\n ): Promise<string> {\n switch (params.chain) {\n case Chain.BTC: {\n if (!params.walletAdapter.sendBtcTransaction) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n \"BTC wallet adapter does not support transaction sending\"\n );\n }\n\n return await params.walletAdapter.sendBtcTransaction({\n chain: Chain.BTC,\n toAddress: params.toAddress,\n amountSats: params.amount,\n account: params.senderAccount,\n actionType: `supply-${params.action}`,\n });\n }\n case Chain.ETH: {\n if (!params.walletAdapter.sendEthTransaction) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n \"ETH wallet adapter does not support transaction sending\"\n );\n }\n\n if (isEthStablecoin(params.asset, params.chain)) {\n return await params.walletAdapter.sendEthTransaction({\n chain: Chain.ETH,\n account: params.senderAccount,\n actionType: `supply-${params.action}`,\n transaction: createTransferErc20Transaction({\n tokenAddress: getEthStablecoinContractAddress(params.asset),\n recipientAddress: params.toAddress,\n amount: params.amount,\n }),\n });\n }\n\n return await params.walletAdapter.sendEthTransaction({\n chain: Chain.ETH,\n account: params.senderAccount,\n actionType: `supply-${params.action}`,\n transaction: {\n to: params.toAddress,\n value: params.amount.toString(),\n },\n });\n }\n default:\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n `Chain-address wallet execution is not supported for ${params.chain}`\n );\n }\n }\n\n private async sendIcrcSupplyTransaction(\n params: SendIcrcSupplyTransactionParams\n ): Promise<string> {\n if (!params.walletAdapter.sendIcrcTransfer) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n \"ICRC wallet adapter does not support ledger transfers\"\n );\n }\n\n const route = getPoolLedgerAssetRoute({\n asset: params.asset,\n chain: params.chain,\n });\n\n return await params.walletAdapter.sendIcrcTransfer({\n chain: Chain.ICP,\n asset: route.asset,\n transfer: {\n ...params.transfer,\n ledgerCanisterId: route.ledgerCanisterId,\n },\n account: params.senderAccount,\n actionType: `supply-${params.action}`,\n });\n }\n\n private async submitInflowWithRetry(\n txid: string,\n extraRequest: SubmitInflowDefaults | null\n ): Promise<void> {\n if (!extraRequest) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n \"Inflow submission requires an operation\"\n );\n }\n\n await retryWithBackoff({\n execute: async () => {\n await this.params.submitInflow({ txid, ...extraRequest });\n },\n maxAttempts: SUBMIT_INFLOW_MAX_ATTEMPTS,\n initialRetryDelayMs: SUBMIT_INFLOW_INITIAL_RETRY_DELAY_MS,\n backoffMultiplier: SUBMIT_INFLOW_RETRY_BACKOFF_MULTIPLIER,\n shouldRetryError: isRetriableInflowSubmitError,\n });\n }\n\n private async sendEthContractTransaction(\n walletAdapter: Pick<WalletAdapter, \"sendEthTransaction\">,\n walletAddress: string,\n request: EthTransactionRequest,\n actionType: string\n ): Promise<string> {\n if (!walletAdapter.sendEthTransaction) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n \"ETH wallet adapter does not support transaction sending\"\n );\n }\n\n return await walletAdapter.sendEthTransaction({\n chain: Chain.ETH,\n account: walletAddress,\n actionType,\n transaction: request,\n });\n }\n\n private async waitForExpectedAllowance(\n params: WaitForExpectedAllowanceParams\n ): Promise<void> {\n const evmReadClient = this.requireEvmReadClient(\n \"Contract-interaction supply requires an EVM RPC URL or public client\"\n );\n let lastPollingError: unknown;\n\n for (\n let pollIndex = 0;\n pollIndex < ETH_APPROVAL_MAX_POLLS;\n pollIndex += 1\n ) {\n try {\n const allowance = await readErc20Allowance({\n evmReadClient,\n tokenAddress: params.tokenAddress,\n ownerAddress: params.walletAddress,\n spenderAddress: params.spenderAddress,\n });\n const matchesExpectation =\n params.expectation === \"zero\"\n ? allowance === 0n\n : allowance >= params.amount;\n\n if (matchesExpectation) {\n return;\n }\n } catch (error) {\n lastPollingError = error;\n }\n\n await delay(ETH_APPROVAL_POLL_INTERVAL_MS);\n }\n\n const lastPollingErrorMessage = getUnknownErrorMessage(lastPollingError);\n throw new LiquidiumError(\n LiquidiumErrorCode.SERVICE_UNAVAILABLE,\n lastPollingErrorMessage\n ? `Timed out waiting for ${params.expectation} ETH allowance update. Last polling error: ${lastPollingErrorMessage}`\n : `Timed out waiting for ${params.expectation} ETH allowance update`\n );\n }\n\n private requireEvmReadClient(message: string): EvmReadClient {\n if (!this.params.evmReadClient) {\n throw new LiquidiumError(LiquidiumErrorCode.VALIDATION_ERROR, message);\n }\n\n return this.params.evmReadClient;\n }\n}\n\nasync function readErc20Allowance(\n params: ReadErc20AllowanceParams\n): Promise<bigint> {\n const allowance = await params.evmReadClient.readContract({\n address: params.tokenAddress as EvmAddress,\n abi: ERC20_ABI,\n functionName: \"allowance\",\n args: [\n params.ownerAddress as EvmAddress,\n params.spenderAddress as EvmAddress,\n ],\n });\n\n return BigInt(allowance);\n}\n\nasync function readErc20Balance(\n params: ReadErc20BalanceParams\n): Promise<bigint> {\n const balance = await params.evmReadClient.readContract({\n address: params.tokenAddress as EvmAddress,\n abi: ERC20_ABI,\n functionName: \"balanceOf\",\n args: [params.ownerAddress as EvmAddress],\n });\n\n return BigInt(balance);\n}\n\nfunction getApprovalStrategy(\n params: ApprovalStrategyParams\n): EvmSupplyApprovalStrategy {\n if (params.allowance >= params.amount) {\n return ApprovalStrategy.none;\n }\n\n if (params.allowance === 0n) {\n return ApprovalStrategy.approveMax;\n }\n\n return ApprovalStrategy.resetThenApproveMax;\n}\n\nasync function delay(timeoutMs: number): Promise<void> {\n await new Promise<void>((resolve) => setTimeout(resolve, timeoutMs));\n}\n\nfunction isRetriableInflowSubmitError(error: unknown): boolean {\n if (!(error instanceof LiquidiumError)) {\n return false;\n }\n\n return error.code === LiquidiumErrorCode.SERVICE_UNAVAILABLE;\n}\n\nfunction getUnknownErrorMessage(error: unknown): string | null {\n if (error instanceof Error) {\n return error.message;\n }\n\n if (typeof error === \"string\") {\n return error;\n }\n\n return null;\n}\n\nfunction getDefaultSubmitInflowRequest(\n params: DefaultSubmitInflowRequestParams\n): SubmitInflowDefaults | null {\n if (params.chain !== Chain.BTC && params.chain !== Chain.ETH) {\n return null;\n }\n\n return {\n chain: params.chain,\n operation: mapSupplyActionToStatusOperation(params.action),\n };\n}\n\nfunction isWalletTransferSupplyRequest(\n request: SupplyFlowRequest\n): request is WalletTransferSupplyFlowRequest {\n return (\n request.mechanism !== PlanType.contractInteraction &&\n request.walletAdapter !== undefined\n );\n}\n\nfunction isContractInteractionSupplyRequest(\n request: SupplyFlowRequest\n): request is ContractInteractionSupplyFlowRequest {\n return request.mechanism === PlanType.contractInteraction;\n}\n\nfunction mapSupplyActionToStatusOperation(\n action: SupplyAction\n): InflowOperation {\n return action === SupplyAction.repayment ? \"repayment\" : \"deposit\";\n}\n\nfunction shouldSubmitInflow(params: ShouldSubmitInflowParams): boolean {\n if (params.mechanism !== PlanType.transfer) {\n return true;\n }\n\n if (params.target.chain === Chain.ICP) {\n return false;\n }\n\n return !isEthStablecoin(params.target.asset, params.target.chain);\n}\n","import { Principal } from \"@icp-sdk/core/principal\";\nimport {\n type CanisterLiquidiumAccount,\n decodeIcrcAccountAddress,\n type LiquidiumAccountInput,\n type LiquidiumAccountType,\n mapCanisterAccountToLiquidiumAccount,\n normalizeIcpAccountIdentifier,\n} from \"../../core/accounts\";\nimport { normalizeExternalAddress } from \"../../core/address-validation\";\nimport { LiquidiumError, LiquidiumErrorCode } from \"../../core/errors\";\nimport { Chain, OutflowType, type SigningChain } from \"../../core/types\";\nimport { getVariantKey } from \"../../core/utils/variant\";\nimport type { OutflowDetails } from \"./types\";\n\ntype MessageAccountType = \"AccountIdentifier\" | \"External\" | \"Icrc\" | \"Native\";\n\nexport interface LendingBtcChainVariant {\n BTC: null;\n}\n\nexport interface LendingEthChainVariant {\n ETH: null;\n}\n\nexport type LendingChainVariant =\n | LendingBtcChainVariant\n | LendingEthChainVariant;\n\nexport interface ParsedOutflowDestination {\n address: string;\n accountType: LiquidiumAccountType;\n canisterAccount: CanisterLiquidiumAccount;\n messageAccount: {\n type: MessageAccountType;\n data: string;\n };\n}\n\nexport interface ParseOutflowDestinationParams {\n destination: LiquidiumAccountInput;\n asset: string;\n poolChain: string;\n destinationChain: string;\n}\n\ninterface NormalizedOutflowDestinationInput {\n address: string;\n type: LiquidiumAccountType | null;\n}\n\nexport interface CanisterOutflowRecord {\n id: string;\n txid: [] | [string];\n outflow_type: Record<string, null>;\n outflow_ref: [] | [string];\n amount: bigint;\n receiver: CanisterLiquidiumAccount;\n}\n\nexport function mapCanisterOutflowDetails(\n outflow: CanisterOutflowRecord\n): OutflowDetails {\n const rawOutflowType = getVariantKey(outflow.outflow_type);\n\n return {\n id: outflow.id,\n outflowType: normalizeOutflowType(rawOutflowType),\n outflowRef: outflow.outflow_ref[0],\n txid: outflow.txid[0],\n amount: outflow.amount,\n receiver: mapCanisterAccountType(outflow.receiver),\n };\n}\n\nexport function mapCanisterAccountType(\n receiver: CanisterLiquidiumAccount\n): OutflowDetails[\"receiver\"] {\n return mapCanisterAccountToLiquidiumAccount(receiver);\n}\n\nexport function parseOutflowDestination(\n params: ParseOutflowDestinationParams\n): ParsedOutflowDestination {\n const destination = normalizeOutflowDestinationInput(params.destination);\n const parsedAccount = destination.type\n ? parseOutflowDestinationWithHint(destination)\n : parseOutflowDestinationAutomatically(destination.address);\n\n assertDestinationTypeSupportedByChain({\n accountType: parsedAccount.accountType,\n poolChain: params.poolChain,\n destinationChain: params.destinationChain,\n });\n\n if (parsedAccount.accountType !== \"ChainAddress\") {\n return parsedAccount;\n }\n\n const externalAddress = normalizeExternalAddress({\n address: parsedAccount.address,\n asset: params.asset,\n chain: params.destinationChain,\n });\n\n return {\n address: externalAddress,\n accountType: \"ChainAddress\",\n canisterAccount: { External: externalAddress },\n messageAccount: { type: \"External\", data: externalAddress },\n };\n}\n\nexport function normalizeOutflowType(\n rawOutflowType: string\n): OutflowDetails[\"outflowType\"] {\n switch (rawOutflowType) {\n case \"Withdraw\":\n return OutflowType.withdrawal;\n case \"Borrow\":\n return OutflowType.borrow;\n case \"FeeClaim\":\n return OutflowType.feeClaim;\n default:\n throw new LiquidiumError(\n LiquidiumErrorCode.INTERNAL,\n `Unsupported outflow type: ${rawOutflowType}`\n );\n }\n}\n\nexport function mapWalletChainToLendingChain(\n chain: SigningChain\n): LendingChainVariant {\n switch (chain) {\n case Chain.BTC:\n return { BTC: null };\n case Chain.ETH:\n return { ETH: null };\n }\n\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n `Message signing is not supported for ${String(chain)}`\n );\n}\n\nfunction normalizeOutflowDestinationInput(\n destination: LiquidiumAccountInput\n): NormalizedOutflowDestinationInput {\n if (typeof destination === \"string\") {\n return { address: destination, type: null };\n }\n\n return destination;\n}\n\nfunction parseOutflowDestinationWithHint(\n destination: NormalizedOutflowDestinationInput\n): ParsedOutflowDestination {\n try {\n switch (destination.type) {\n case \"ChainAddress\":\n return parseExternalDestination(destination.address);\n case \"IcPrincipal\":\n return parseIcPrincipalDestination(destination.address);\n case \"IcrcAccount\":\n return parseIcrcDestination(destination.address);\n case \"IcpAccountIdentifier\":\n return parseAccountIdentifierDestination(destination.address);\n default:\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n `Unsupported outflow account type: ${String(destination.type)}`\n );\n }\n } catch (error) {\n if (error instanceof LiquidiumError) {\n throw error;\n }\n\n throw new LiquidiumError(\n LiquidiumErrorCode.INVALID_ADDRESS,\n `Invalid ${destination.type} outflow destination`\n );\n }\n}\n\nfunction parseOutflowDestinationAutomatically(\n address: string\n): ParsedOutflowDestination {\n const parsers = [\n parseAccountIdentifierDestination,\n parseIcPrincipalDestination,\n parseIcrcDestination,\n ];\n\n for (const parser of parsers) {\n try {\n return parser(address);\n } catch {}\n }\n\n return parseExternalDestination(address);\n}\n\nfunction parseExternalDestination(address: string): ParsedOutflowDestination {\n return {\n address,\n accountType: \"ChainAddress\",\n canisterAccount: { External: address },\n messageAccount: { type: \"External\", data: address },\n };\n}\n\nfunction parseIcPrincipalDestination(\n address: string\n): ParsedOutflowDestination {\n const principal = Principal.fromText(address);\n const principalText = principal.toText();\n\n return {\n address: principalText,\n accountType: \"IcPrincipal\",\n canisterAccount: { Native: principal },\n messageAccount: { type: \"Native\", data: principalText },\n };\n}\n\nfunction parseIcrcDestination(address: string): ParsedOutflowDestination {\n const decoded = decodeIcrcAccountAddress(address);\n\n return {\n address: decoded.account.address,\n accountType: \"IcrcAccount\",\n canisterAccount: {\n Icrc: {\n owner: decoded.owner,\n subaccount: decoded.subaccount ? [decoded.subaccount] : [],\n },\n },\n messageAccount: { type: \"Icrc\", data: decoded.account.address },\n };\n}\n\nfunction parseAccountIdentifierDestination(\n address: string\n): ParsedOutflowDestination {\n const accountIdentifier = normalizeIcpAccountIdentifier(address);\n\n return {\n address: accountIdentifier,\n accountType: \"IcpAccountIdentifier\",\n canisterAccount: { AccountIdentifier: accountIdentifier },\n messageAccount: { type: \"AccountIdentifier\", data: accountIdentifier },\n };\n}\n\nfunction assertDestinationTypeSupportedByChain(params: {\n accountType: LiquidiumAccountType;\n poolChain: string;\n destinationChain: string;\n}): void {\n if (params.poolChain === Chain.BTC || params.poolChain === Chain.ETH) {\n if (\n params.destinationChain === params.poolChain &&\n params.accountType === \"ChainAddress\"\n ) {\n return;\n }\n\n if (\n params.destinationChain === Chain.ICP &&\n params.accountType === \"IcPrincipal\"\n ) {\n return;\n }\n }\n\n if (params.poolChain === Chain.ICP && params.destinationChain === Chain.ICP) {\n if (\n params.accountType === \"IcpAccountIdentifier\" ||\n params.accountType === \"IcrcAccount\" ||\n params.accountType === \"IcPrincipal\"\n ) {\n return;\n }\n }\n\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n \"Target pool does not support this address type\"\n );\n}\n","import { Principal } from \"@icp-sdk/core/principal\";\nimport type {\n CanisterLiquidiumAccount,\n LiquidiumAccountInput,\n} from \"../../core/accounts\";\nimport { getBorrowAmountMinimumValidationError } from \"../../core/borrow-minimums\";\nimport { createCkBtcLedgerActor } from \"../../core/canisters/ckbtc/ledger\";\nimport { createCkBtcMinterActor } from \"../../core/canisters/ckbtc/minter\";\nimport { createDepositAccountsActor } from \"../../core/canisters/deposit-accounts/actor\";\nimport { createIcrcLedgerActor } from \"../../core/canisters/icrc/ledger\";\nimport { createLendingActor } from \"../../core/canisters/lending/actor\";\nimport {\n mapCanisterCallErrorToLiquidiumError,\n mapLendingProtocolErrorToLiquidiumError,\n} from \"../../core/canisters/lending/error-mappers\";\nimport {\n createFlexibleLendingActor,\n type DecodedPool,\n decodeFlexiblePositionView,\n} from \"../../core/canisters/lending/flexible-actor\";\nimport {\n createBorrowAssetMessage,\n createWithdrawAssetMessage,\n} from \"../../core/canisters/lending/messages\";\nimport { LiquidiumError, LiquidiumErrorCode } from \"../../core/errors\";\nimport { normalizeEvmAddress } from \"../../core/evm\";\nimport {\n getPoolLedgerAssetRoute,\n type PoolLedgerAssetRoute,\n} from \"../../core/pool-ledger-assets\";\nimport { guardSameAssetBorrowing } from \"../../core/same-asset-borrowing\";\nimport { SdkApiPath } from \"../../core/sdk-api-paths\";\nimport {\n createLiquidiumStatus,\n type LiquidiumOperation,\n} from \"../../core/status\";\nimport type { ApiClient } from \"../../core/transports/api-client\";\nimport type { CanisterContext } from \"../../core/transports/canister-context\";\nimport {\n Asset,\n Chain,\n type EvmReadClient,\n OutflowType,\n} from \"../../core/types\";\nimport { encodeInflowSubaccount } from \"../../core/utils/inflow-subaccount\";\nimport { normalizeWalletSignature } from \"../../core/utils/signature\";\nimport { computeExpiryTimestampFromNow } from \"../../core/utils/time\";\nimport {\n type SignatureInfo,\n WalletActionKind,\n WalletExecutionKind,\n} from \"../../core/wallet-actions\";\nimport { getWithdrawAmountMinimumValidationError } from \"../../core/withdraw-minimums\";\nimport { executeWith } from \"../../execute\";\nimport { roundInflowFeeEstimate } from \"./_internal/inflow-fee-rounding\";\nimport { SupplyFlowExecutor } from \"./_internal/supply-flow\";\nimport {\n getEthStablecoinContractAddress,\n getPoolById,\n isEthStablecoin,\n mapDepositAccountErrorToLiquidiumError,\n} from \"./_internal/supply-targets\";\nimport {\n mapCanisterOutflowDetails,\n mapWalletChainToLendingChain,\n parseOutflowDestination,\n} from \"./mappers\";\nimport type {\n BorrowAction,\n BorrowOutflowDetails,\n CreateBorrowRequest,\n CreateWithdrawRequest,\n EstimateInflowFeeRequest,\n EvmSupplyContext,\n GetDepositAddressRequest,\n GetEvmSupplyContextRequest,\n InflowFeeEstimate,\n OutflowDetails,\n SubmitInflowRequest,\n SubmitInflowResponse,\n SupplyFlow,\n SupplyFlowRequest,\n WalletExecutionParams,\n WithdrawAction,\n WithdrawOutflowDetails,\n} from \"./types\";\n\ninterface OutflowActionData {\n profileId: string;\n poolId: string;\n amount: bigint;\n chain: Chain;\n receiver: LiquidiumAccountInput;\n signerWalletAddress: string;\n expiryTimestamp: bigint;\n}\n\ninterface OutflowSubmissionData extends OutflowActionData {\n receiverAccount: CanisterLiquidiumAccount;\n}\n\ninterface ResolveOutflowDestinationInputParams {\n receiver: LiquidiumAccountInput;\n errorMessage: string;\n}\n\ninterface GuardBorrowSameAssetPolicyParams {\n profileId: string;\n pool: DecodedPool;\n}\n\n/** Borrow, withdraw, supply, inflow reporting, and fee-estimation helpers. */\nexport class LendingModule {\n constructor(\n private readonly canisterContext: CanisterContext,\n private readonly apiClient: ApiClient | undefined,\n private readonly evmReadClient: EvmReadClient | undefined\n ) {}\n\n /**\n * Prepares a withdraw action that can be signed and submitted later.\n *\n * Use this when you need explicit control over signing and submission.\n * @param request - Profile, pool, amount (pool asset base units), outflow address, and signer wallet.\n * @returns A signable {@link WithdrawAction} with `submit` wired to the canister.\n */\n async prepareWithdraw(\n request: CreateWithdrawRequest\n ): Promise<WithdrawAction> {\n const destination = resolveOutflowDestinationInput({\n receiver: request.receiver,\n errorMessage: \"Withdraw requires a custom outflow account\",\n });\n const signerAccount = normalizeEvmAddress(\n request.signerWalletAddress.trim()\n );\n if (!signerAccount) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n \"Withdraw requires a signer account\"\n );\n }\n if (request.amount <= 0n) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n \"Withdraw amount must be greater than 0\"\n );\n }\n const selectedPool = await getPoolById(\n this.canisterContext,\n request.poolId\n );\n const selectedAsset = selectedPool.asset;\n const minimumWithdrawAmountError = getWithdrawAmountMinimumValidationError({\n amount: request.amount,\n asset: selectedAsset,\n });\n if (minimumWithdrawAmountError) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n minimumWithdrawAmountError.message\n );\n }\n const receiver = parseOutflowDestination({\n destination,\n asset: selectedAsset,\n poolChain: selectedPool.chain,\n destinationChain: request.chain,\n });\n\n const lendingActor = createLendingActor(this.canisterContext);\n\n try {\n const expiryTimestamp = computeExpiryTimestampFromNow();\n const nonce = await lendingActor.get_nonce(signerAccount);\n const withdrawActionData: OutflowActionData = {\n profileId: request.profileId,\n poolId: request.poolId,\n amount: request.amount,\n chain: request.chain,\n receiver: {\n address: receiver.address,\n type: receiver.accountType,\n },\n signerWalletAddress: signerAccount,\n expiryTimestamp,\n };\n const withdrawSubmissionData: OutflowSubmissionData = {\n ...withdrawActionData,\n receiverAccount: receiver.canisterAccount,\n };\n\n return {\n kind: WalletActionKind.createWithdraw,\n executionKind: WalletExecutionKind.signMessage,\n actionType: WalletActionKind.createWithdraw,\n account: signerAccount,\n message: createWithdrawAssetMessage(\n {\n pool_id: request.poolId,\n amount: request.amount.toString(),\n account: receiver.messageAccount,\n expiry_timestamp: expiryTimestamp,\n },\n nonce\n ),\n data: withdrawActionData,\n submit: async (signatureInfo: SignatureInfo) => {\n return await this.submitWithdraw(\n withdrawSubmissionData,\n signatureInfo\n );\n },\n };\n } catch (error) {\n if (error instanceof LiquidiumError) {\n throw error;\n }\n\n throw mapCanisterCallErrorToLiquidiumError(\"get_nonce\", error);\n }\n }\n\n private async submitWithdraw(\n request: OutflowSubmissionData,\n signatureInfo: SignatureInfo\n ): Promise<WithdrawOutflowDetails> {\n try {\n const result = await createLendingActor(this.canisterContext).withdraw(\n Principal.fromText(request.profileId),\n {\n data: {\n expiry_timestamp: request.expiryTimestamp,\n account: request.receiverAccount,\n pool_id: Principal.fromText(request.poolId),\n amount: request.amount,\n },\n signature_info: {\n Wallet: {\n signature: normalizeWalletSignature(\n signatureInfo.signature,\n signatureInfo.chain\n ),\n chain: mapWalletChainToLendingChain(signatureInfo.chain),\n account: request.signerWalletAddress,\n },\n },\n }\n );\n\n if (\"Err\" in result) {\n throw mapLendingProtocolErrorToLiquidiumError(result.Err);\n }\n\n return mapExpectedOutflowDetails(\n mapCanisterOutflowDetails(result.Ok),\n OutflowType.withdrawal,\n \"withdraw\"\n );\n } catch (error) {\n if (error instanceof LiquidiumError) {\n throw error;\n }\n\n throw mapCanisterCallErrorToLiquidiumError(\"withdraw\", error);\n }\n }\n\n /**\n * Creates a withdraw outflow using the provided wallet adapter.\n *\n * This is the convenience form of `prepareWithdraw(...)` plus execution.\n *\n * @param params - Withdraw request fields plus `signerChain` and `signerWalletAdapter`.\n * @returns The canister {@link OutflowDetails} for the completed withdraw.\n */\n async withdraw(\n params: CreateWithdrawRequest & WalletExecutionParams\n ): Promise<WithdrawOutflowDetails> {\n const action = await this.prepareWithdraw(params);\n\n return await executeWith({\n walletAdapter: params.signerWalletAdapter,\n chain: params.signerChain,\n account: action.account,\n })(action);\n }\n\n /**\n * Prepares a borrow action that can be signed and submitted later.\n *\n * Use this when you need explicit control over signing and submission.\n * When the selected pool disables same-asset borrowing, preparation rejects\n * profiles whose supplied balance in that pool is at or above its dust threshold.\n *\n * @param request - Profile, pool, amount (borrow asset base units), outflow address, and signer wallet.\n * @returns A signable {@link BorrowAction} with `submit` wired to the canister.\n */\n async prepareBorrow(request: CreateBorrowRequest): Promise<BorrowAction> {\n const destination = resolveOutflowDestinationInput({\n receiver: request.receiver,\n errorMessage: \"Borrow requires a custom outflow account\",\n });\n const signerAccount = normalizeEvmAddress(\n request.signerWalletAddress.trim()\n );\n if (!signerAccount) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n \"Borrow requires a signer account\"\n );\n }\n if (request.amount <= 0n) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n \"Borrow amount must be greater than 0\"\n );\n }\n const selectedPool = await getPoolById(\n this.canisterContext,\n request.poolId\n );\n const selectedAsset = selectedPool.asset;\n const minimumBorrowAmountError = getBorrowAmountMinimumValidationError({\n amount: request.amount,\n asset: selectedAsset,\n });\n if (minimumBorrowAmountError) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n minimumBorrowAmountError.message\n );\n }\n const receiver = parseOutflowDestination({\n destination,\n asset: selectedAsset,\n poolChain: selectedPool.chain,\n destinationChain: request.chain,\n });\n await this.guardBorrowSameAssetPolicy({\n profileId: request.profileId,\n pool: selectedPool,\n });\n\n const lendingActor = createLendingActor(this.canisterContext);\n\n try {\n const expiryTimestamp = computeExpiryTimestampFromNow();\n const nonce = await lendingActor.get_nonce(signerAccount);\n const borrowActionData: OutflowActionData = {\n profileId: request.profileId,\n poolId: request.poolId,\n amount: request.amount,\n chain: request.chain,\n receiver: {\n address: receiver.address,\n type: receiver.accountType,\n },\n signerWalletAddress: signerAccount,\n expiryTimestamp,\n };\n const borrowSubmissionData: OutflowSubmissionData = {\n ...borrowActionData,\n receiverAccount: receiver.canisterAccount,\n };\n\n return {\n kind: WalletActionKind.createBorrow,\n executionKind: WalletExecutionKind.signMessage,\n actionType: WalletActionKind.createBorrow,\n account: signerAccount,\n message: createBorrowAssetMessage(\n {\n pool_id: request.poolId,\n amount: request.amount.toString(),\n account: receiver.messageAccount,\n expiry_timestamp: expiryTimestamp,\n },\n nonce\n ),\n data: borrowActionData,\n submit: async (signatureInfo: SignatureInfo) => {\n return await this.submitBorrow(borrowSubmissionData, signatureInfo);\n },\n };\n } catch (error) {\n if (error instanceof LiquidiumError) {\n throw error;\n }\n\n throw mapCanisterCallErrorToLiquidiumError(\"get_nonce\", error);\n }\n }\n\n private async submitBorrow(\n request: OutflowSubmissionData,\n signatureInfo: SignatureInfo\n ): Promise<BorrowOutflowDetails> {\n try {\n const result = await createLendingActor(\n this.canisterContext\n ).borrow_assets(Principal.fromText(request.profileId), {\n data: {\n expiry_timestamp: request.expiryTimestamp,\n account: request.receiverAccount,\n pool_id: Principal.fromText(request.poolId),\n amount: request.amount,\n },\n signature_info: {\n Wallet: {\n signature: normalizeWalletSignature(\n signatureInfo.signature,\n signatureInfo.chain\n ),\n chain: mapWalletChainToLendingChain(signatureInfo.chain),\n account: request.signerWalletAddress,\n },\n },\n });\n\n if (\"Err\" in result) {\n throw mapLendingProtocolErrorToLiquidiumError(result.Err);\n }\n\n return mapExpectedOutflowDetails(\n mapCanisterOutflowDetails(result.Ok),\n OutflowType.borrow,\n \"borrow_assets\"\n );\n } catch (error) {\n if (error instanceof LiquidiumError) {\n throw error;\n }\n\n throw mapCanisterCallErrorToLiquidiumError(\"borrow_assets\", error);\n }\n }\n\n /**\n * Creates a borrow outflow using the provided wallet adapter.\n *\n * This is the convenience form of `prepareBorrow(...)` plus execution.\n * Same-asset policy validation runs before the wallet is asked to sign.\n *\n * @param params - Borrow request fields plus `signerChain` and `signerWalletAdapter`.\n * @returns The lending canister receipt as {@link OutflowDetails}.\n *\n * @remarks\n * `id` is always present. `txid` may be missing on the first response; the SDK does not\n * poll for it. Use history or app-level polling if you need the chain transaction id.\n */\n async borrow(\n params: CreateBorrowRequest & WalletExecutionParams\n ): Promise<BorrowOutflowDetails> {\n const action = await this.prepareBorrow(params);\n\n return await executeWith({\n walletAdapter: params.signerWalletAdapter,\n chain: params.signerChain,\n account: action.account,\n })(action);\n }\n\n /**\n * Resolves a supply target for a deposit or repayment and optionally broadcasts it.\n *\n * Transfer mode can return manual broadcast instructions when wallet fields are\n * omitted. Contract-interaction mode always requires `walletAdapter`, `account`,\n * and `amount` because it must prepare and submit approval/deposit calls.\n *\n * The SDK does not poll for inflow status. When a `txid` is returned, it is the\n * caller's responsibility to track confirmation state using their own polling.\n *\n * @returns A {@link SupplyFlow} receipt with `type`, `target`, `submit`, and\n * an optional `txid` present when the SDK broadcast for you.\n */\n async supply(request: SupplyFlowRequest): Promise<SupplyFlow> {\n return await this.createSupplyFlowExecutor().create(request);\n }\n\n /**\n * Fetches ERC-20 supply planning data with the configured EVM read client.\n *\n * Requires `evmRpcUrl` or `evmPublicClient` on the client. Used internally by\n * contract-interaction `supply`.\n *\n * @param request - Profile, pool, wallet, amount (token base units), and action.\n * @returns Locally computed {@link EvmSupplyContext} for approvals and deposit.\n */\n async getEvmSupplyContext(\n request: GetEvmSupplyContextRequest\n ): Promise<EvmSupplyContext> {\n return await this.createSupplyFlowExecutor().getEvmSupplyContext(request);\n }\n\n /**\n * Returns the read-only deposit address for an ETH stablecoin inflow target.\n *\n * This is a query call that does not create or mutate state. Use it when you\n * need the deposit address without hitting the authorization-gated update path.\n *\n * @param request - Profile, pool, asset, and supply action.\n * @returns The EVM deposit address for the derived account.\n */\n async getDepositAddress(request: GetDepositAddressRequest): Promise<string> {\n if (!isEthStablecoin(request.asset, Chain.ETH)) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n \"getDepositAddress is only supported for ETH stablecoins\"\n );\n }\n\n const tokenAddress = getEthStablecoinContractAddress(request.asset);\n const subaccount = encodeInflowSubaccount({\n action: request.action,\n principal: Principal.fromText(request.profileId),\n });\n\n const result = await createDepositAccountsActor(\n this.canisterContext\n ).get_deposit_address(\n {\n owner: Principal.fromText(request.poolId),\n subaccount: [subaccount],\n },\n [tokenAddress]\n );\n\n if (\"Err\" in result) {\n throw mapDepositAccountErrorToLiquidiumError(result.Err);\n }\n\n return result.Ok;\n }\n\n /**\n * Estimates the network/deposit fee for an inflow target.\n *\n * ETH stablecoin deposit-address estimates are served by the deposit-address\n * canister. BTC estimates include the ckBTC minter deposit fee and ledger fee.\n * ICP-chain estimates return the corresponding ICRC ledger fee.\n *\n * @param request - Asset and chain pair to estimate for.\n * @returns Total fee estimate rounded up in the asset's base units.\n */\n async estimateInflowFee(\n request: EstimateInflowFeeRequest\n ): Promise<InflowFeeEstimate> {\n if (request.chain === Chain.ICP) {\n const ledgerFee = await this.estimateIcrcLedgerFee(request);\n return {\n totalFee: roundInflowFeeEstimate(request, ledgerFee),\n };\n }\n\n if (isEthStablecoin(request.asset, request.chain)) {\n const result = await createDepositAccountsActor(\n this.canisterContext\n ).estimate_deposit_fee([getEthStablecoinContractAddress(request.asset)]);\n\n if (\"Err\" in result) {\n throw mapDepositAccountErrorToLiquidiumError(result.Err);\n }\n\n return {\n totalFee: roundInflowFeeEstimate(request, result.Ok),\n };\n }\n\n if (request.asset === Asset.BTC && request.chain === Chain.BTC) {\n const estimate = await this.estimateBtcInflowFee();\n return {\n totalFee: roundInflowFeeEstimate(request, estimate.totalFee),\n };\n }\n\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n `Inflow fee estimates are not supported for ${request.asset} on ${request.chain}`\n );\n }\n\n private async estimateBtcInflowFee(): Promise<InflowFeeEstimate> {\n const [minterFee, ledgerFee] = await Promise.all([\n createCkBtcMinterActor(this.canisterContext).get_deposit_fee(),\n createCkBtcLedgerActor(this.canisterContext).icrc1_fee(),\n ]);\n\n return { totalFee: minterFee + ledgerFee };\n }\n\n private async estimateIcrcLedgerFee(\n request: EstimateInflowFeeRequest\n ): Promise<bigint> {\n const route = getInflowFeeLedgerAssetRoute(request);\n\n return await createIcrcLedgerActor({\n canisterContext: this.canisterContext,\n canisterId: route.ledgerCanisterId,\n ledgerName: `${request.asset} ${request.chain}`,\n }).icrc1_fee();\n }\n\n /**\n * Submits an inflow transaction id for faster indexing.\n *\n * Uses the Liquidium SDK API.\n *\n * @param request - Broadcast `txid` plus inflow `operation` and optional `chain`.\n * @returns Acknowledgement including the submitted `txid`.\n */\n async submitInflow(\n request: SubmitInflowRequest\n ): Promise<SubmitInflowResponse> {\n if (\n request.chain !== undefined &&\n request.chain !== Chain.BTC &&\n request.chain !== Chain.ETH\n ) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n `Inflow submission is not supported for ${String(request.chain)}`\n );\n }\n\n const apiClient = this.requireApi();\n\n const response = await apiClient.post<\n SubmitInflowResponse,\n SubmitInflowRequest\n >(SdkApiPath.inflow, request);\n\n return {\n txid: response.txid,\n };\n }\n\n /**\n * Returns whether borrowing is currently disabled by the protocol.\n *\n * @returns `true` when the lending canister reports borrowing disabled.\n */\n async isBorrowingDisabled(): Promise<boolean> {\n try {\n return await createLendingActor(\n this.canisterContext\n ).get_borrowing_disabled();\n } catch (error) {\n if (error instanceof LiquidiumError) {\n throw error;\n }\n\n throw mapCanisterCallErrorToLiquidiumError(\n \"get_borrowing_disabled\",\n error\n );\n }\n }\n\n private requireApi(): ApiClient {\n if (!this.apiClient) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n \"Lending API actions require an API client\"\n );\n }\n\n return this.apiClient;\n }\n\n private createSupplyFlowExecutor(): SupplyFlowExecutor {\n return new SupplyFlowExecutor({\n canisterContext: this.canisterContext,\n evmReadClient: this.evmReadClient,\n requireApi: () => {\n this.requireApi();\n },\n submitInflow: async (request) => await this.submitInflow(request),\n });\n }\n\n private async guardBorrowSameAssetPolicy(\n params: GuardBorrowSameAssetPolicyParams\n ): Promise<void> {\n const sameAssetBorrowing = params.pool.same_asset_borrowing[0] ?? false;\n if (sameAssetBorrowing) {\n return;\n }\n\n const lendingActor = createFlexibleLendingActor(this.canisterContext);\n let positionResult: Awaited<ReturnType<typeof lendingActor.get_position>>;\n try {\n positionResult = await lendingActor.get_position(\n Principal.fromText(params.profileId),\n params.pool.principal\n );\n } catch (error) {\n throw mapCanisterCallErrorToLiquidiumError(\"get_position\", error);\n }\n const position = positionResult[0]\n ? decodeFlexiblePositionView(positionResult[0])\n : null;\n\n guardSameAssetBorrowing({\n borrowAsset: params.pool.asset,\n collateralAsset: params.pool.asset,\n collateralAmount: position?.deposited_native_now ?? 0n,\n poolId: params.pool.principal.toText(),\n policy: {\n sameAssetBorrowing,\n sameAssetBorrowingDustThreshold:\n params.pool.same_asset_borrowing_dust_threshold,\n },\n });\n }\n}\n\nfunction getInflowFeeLedgerAssetRoute(\n request: EstimateInflowFeeRequest\n): PoolLedgerAssetRoute {\n if (request.chain !== Chain.ICP) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n `IC ledger inflow fees are not supported for ${request.asset} on ${request.chain}`\n );\n }\n\n return getPoolLedgerAssetRoute(request);\n}\n\nfunction resolveOutflowDestinationInput(\n params: ResolveOutflowDestinationInputParams\n): LiquidiumAccountInput {\n const receiver = params.receiver;\n const address =\n typeof receiver === \"string\" ? receiver.trim() : receiver.address.trim();\n\n if (!address) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n params.errorMessage\n );\n }\n\n if (typeof receiver === \"string\") {\n return address;\n }\n\n return {\n address,\n type: receiver.type,\n };\n}\n\nfunction mapExpectedOutflowDetails(\n details: OutflowDetails,\n expectedOutflowType: typeof OutflowType.borrow,\n operation: string\n): BorrowOutflowDetails;\nfunction mapExpectedOutflowDetails(\n details: OutflowDetails,\n expectedOutflowType: typeof OutflowType.withdrawal,\n operation: string\n): WithdrawOutflowDetails;\nfunction mapExpectedOutflowDetails(\n details: OutflowDetails,\n expectedOutflowType:\n | typeof OutflowType.borrow\n | typeof OutflowType.withdrawal,\n operation: string\n): BorrowOutflowDetails | WithdrawOutflowDetails {\n if (details.outflowType !== expectedOutflowType) {\n throw new LiquidiumError(\n LiquidiumErrorCode.INTERNAL,\n `${operation} returned unexpected outflow type ${details.outflowType}`\n );\n }\n\n return {\n ...details,\n status: createLiquidiumStatus({\n operation: mapOutflowTypeToStatusOperation(expectedOutflowType),\n state: details.txid ? \"confirming\" : \"processing\",\n }),\n } as BorrowOutflowDetails | WithdrawOutflowDetails;\n}\n\nfunction mapOutflowTypeToStatusOperation(\n outflowType: typeof OutflowType.borrow | typeof OutflowType.withdrawal\n): LiquidiumOperation {\n return outflowType;\n}\n","/** Fixed-point scale used by protocol rate values. */\nexport const RATE_SCALE = 1_000_000_000_000_000_000_000_000_000n;\n/** Number of decimal places represented by {@link RATE_SCALE}. */\nexport const RATE_DECIMALS = BigInt(RATE_SCALE.toString().length - 1);\n","import { LiquidiumError, LiquidiumErrorCode } from \"../errors\";\n\nconst ASSET_NATIVE_DECIMALS: Record<string, bigint> = {\n BTC: 8n,\n ICP: 8n,\n USDC: 6n,\n USDT: 6n,\n SOL: 9n,\n};\n\nexport function getAssetNativeDecimals(asset: string): bigint {\n const decimals = ASSET_NATIVE_DECIMALS[asset];\n\n if (decimals === undefined) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n `Native decimals are not configured for asset: ${asset}`\n );\n }\n\n return decimals;\n}\n","import type {\n PoolRateTuple,\n PriceRecord,\n} from \"../../core/canisters/lending/actor\";\nimport type { DecodedPool } from \"../../core/canisters/lending/flexible-actor\";\nimport { RATE_DECIMALS, RATE_SCALE } from \"../../core/rates\";\nimport { getAssetNativeDecimals } from \"../../core/utils/asset-decimals\";\nimport type { AssetPrices, Pool, PoolRate } from \"./types\";\n\nconst DECIMAL_BASE = 10;\nconst PAIR_SEPARATOR = \"_\";\nconst USDT_SYMBOL = \"USDT\";\n\nexport function mapDecodedPoolToPool(\n pool: DecodedPool,\n rate: PoolRateTuple\n): Pool {\n const totalSupply =\n (pool.total_supply_at_last_sync * pool.lending_index) / RATE_SCALE;\n const totalDebt =\n (pool.total_debt_at_last_sync * pool.borrow_index) / RATE_SCALE;\n const availableLiquidity =\n totalSupply > totalDebt ? totalSupply - totalDebt : 0n;\n\n return {\n id: pool.principal.toString(),\n asset: pool.asset,\n chain: pool.chain,\n decimals: getAssetNativeDecimals(pool.asset),\n frozen: pool.frozen,\n totalSupply,\n totalDebt,\n availableLiquidity,\n supplyCap: pool.supply_cap[0],\n borrowCap: pool.borrow_cap[0],\n maxLtv: pool.max_ltv,\n liquidationThreshold: pool.liquidation_threshold,\n liquidationBonus: pool.liquidation_bonus,\n protocolLiquidationFee: pool.protocol_liquidation_fee,\n reserveFactor: pool.reserve_factor,\n rateDecimals: RATE_DECIMALS,\n lendingRate: rate[1],\n borrowingRate: rate[0],\n utilizationRate: rate[2],\n baseRate: pool.base_rate,\n optimalUtilizationRate: pool.optimal_utilization_rate,\n rateSlopeBefore: pool.rate_slope_before,\n rateSlopeAfter: pool.rate_slope_after,\n lendingIndex: pool.lending_index,\n borrowIndex: pool.borrow_index,\n sameAssetBorrowing: pool.same_asset_borrowing[0] ?? false,\n sameAssetBorrowingDustThreshold: pool.same_asset_borrowing_dust_threshold,\n lastUpdated: pool.last_updated[0],\n };\n}\n\nexport function mapGetPricesResponseToAssetPrices(\n prices: PriceRecord[]\n): AssetPrices {\n const pairPricesByName = new Map(\n prices.map(([pair, price, decimals]) => [\n pair,\n formatPrice(price, decimals),\n ])\n );\n const assetPrices: AssetPrices = {};\n\n for (const [pairName, pairPrice] of pairPricesByName) {\n const [baseAsset, quoteAsset] = pairName.split(PAIR_SEPARATOR);\n\n if (!baseAsset || !quoteAsset || quoteAsset !== USDT_SYMBOL) {\n continue;\n }\n\n assetPrices[baseAsset] = pairPrice;\n }\n\n return assetPrices;\n}\n\nexport function mapGetPoolRateResponseToPoolRate(\n rate: PoolRateTuple\n): PoolRate {\n return {\n rateDecimals: RATE_DECIMALS,\n borrowRate: rate[0],\n lendRate: rate[1],\n utilizationRate: rate[2],\n };\n}\n\nfunction formatPrice(price: bigint, decimals: number): number {\n const decimalScale = DECIMAL_BASE ** decimals;\n\n return Number(price) / decimalScale;\n}\n","import { Principal } from \"@icp-sdk/core/principal\";\nimport {\n createLendingActor,\n type PoolRateTuple,\n} from \"../../core/canisters/lending/actor\";\nimport {\n createFlexibleLendingActor,\n type DecodedPool,\n decodeFlexiblePool,\n type FlexiblePool,\n} from \"../../core/canisters/lending/flexible-actor\";\nimport { LiquidiumError, LiquidiumErrorCode } from \"../../core/errors\";\nimport type { CanisterContext } from \"../../core/transports/canister-context\";\nimport { Asset, Chain, isAssetIdentifier } from \"../../core/types\";\nimport {\n mapDecodedPoolToPool,\n mapGetPoolRateResponseToPoolRate,\n mapGetPricesResponseToAssetPrices,\n} from \"./mappers\";\nimport type { AssetPrices, FindPoolQuery, Pool, PoolRate } from \"./types\";\n\nconst ZERO_POOL_RATE: PoolRateTuple = [0n, 0n, 0n];\nconst BACKING_POOL_CHAIN_BY_ASSET = {\n [Asset.BTC]: Chain.BTC,\n [Asset.ICP]: Chain.ICP,\n [Asset.USDC]: Chain.ETH,\n [Asset.USDT]: Chain.ETH,\n} satisfies Record<Asset, Chain>;\n\n/** Pool metadata, prices, and current rate helpers. */\nexport class MarketModule {\n constructor(private readonly canisterContext: CanisterContext) {}\n\n /**\n * Lists SDK-supported pools with their current rates.\n *\n * Unsupported asset or chain variants returned by the canister are omitted.\n *\n * @returns Supported lending pools enriched with their current rate data.\n */\n async listPools(): Promise<Pool[]> {\n try {\n const flexibleActor = createFlexibleLendingActor(this.canisterContext);\n const rawPools = await flexibleActor.list_pools();\n\n const decodedPools = decodeSupportedFlexiblePools(rawPools);\n\n return await Promise.all(\n decodedPools.map(async (pool) => {\n const poolRate = await flexibleActor.get_pool_rate(pool.principal);\n const resolvedPoolRate = poolRate[0] ?? ZERO_POOL_RATE;\n\n return mapDecodedPoolToPool(pool, resolvedPoolRate);\n })\n );\n } catch (error) {\n if (error instanceof LiquidiumError) {\n throw error;\n }\n\n throw new LiquidiumError(\n LiquidiumErrorCode.CANISTER_REJECTED,\n \"Canister call failed: list_pools\",\n error\n );\n }\n }\n\n /**\n * Returns the latest asset prices reported by the protocol.\n *\n * @returns The latest protocol price map keyed by market asset symbol.\n */\n async getAssetPrices(): Promise<AssetPrices> {\n try {\n return mapGetPricesResponseToAssetPrices(\n await createLendingActor(this.canisterContext).get_prices()\n );\n } catch (error) {\n if (error instanceof LiquidiumError) {\n throw error;\n }\n\n throw new LiquidiumError(\n LiquidiumErrorCode.CANISTER_REJECTED,\n \"Canister call failed: get_prices\",\n error\n );\n }\n }\n\n /**\n * Resolves a single backing pool for the given Chain + Asset identifier.\n *\n * Native and chain-key identifiers share a pool. For example, both\n * `ETH/USDT` and `ICP/USDT` resolve to the USDT lending pool.\n *\n * @param query - The market asset and chain pair to match.\n * @returns The single pool that matches the requested asset and chain.\n */\n async findPool(query: FindPoolQuery): Promise<Pool> {\n const identifier = { chain: query.chain, asset: query.asset };\n\n if (!isAssetIdentifier(identifier)) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n `Unsupported asset identifier: ${identifier.chain}/${identifier.asset}`\n );\n }\n\n const pools = await this.listPools();\n const backingPoolChain = BACKING_POOL_CHAIN_BY_ASSET[identifier.asset];\n const matchedPools = pools.filter(\n (pool) =>\n pool.asset === identifier.asset && pool.chain === backingPoolChain\n );\n\n if (matchedPools.length === 0) {\n throw new LiquidiumError(\n LiquidiumErrorCode.POOL_NOT_FOUND,\n `Pool not found for asset ${query.asset} on chain ${query.chain}`\n );\n }\n\n if (matchedPools.length > 1) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n `Multiple pools found for asset ${query.asset} on chain ${query.chain}. Select a specific pool id.`\n );\n }\n\n return matchedPools[0];\n }\n\n /**\n * Returns the full pool record for the given asset and chain pair.\n *\n * Convenience wrapper over {@link MarketModule.findPool}. `listPools()` already\n * enriches each pool with its current rate data, so no extra canister call is made.\n *\n * @param query - The market asset and chain pair to match.\n * @returns The matching pool enriched with current rate data.\n */\n async getReserveData(query: FindPoolQuery): Promise<Pool> {\n return await this.findPool(query);\n }\n\n /**\n * Returns the current borrow, lend, and utilization rates for a pool.\n *\n * @param poolId - The pool principal text.\n * @returns The borrow, lend, and utilization rates for the requested pool.\n */\n async getPoolRate(poolId: string): Promise<PoolRate> {\n try {\n const rate = await createLendingActor(this.canisterContext).get_pool_rate(\n Principal.fromText(poolId)\n );\n\n if (!rate[0]) {\n throw new LiquidiumError(\n LiquidiumErrorCode.POOL_NOT_FOUND,\n `Pool not found: ${poolId}`\n );\n }\n\n return mapGetPoolRateResponseToPoolRate(rate[0]);\n } catch (error) {\n if (error instanceof LiquidiumError) {\n throw error;\n }\n\n throw new LiquidiumError(\n LiquidiumErrorCode.CANISTER_REJECTED,\n \"Canister call failed: get_pool_rate\",\n error\n );\n }\n }\n}\n\nfunction decodeSupportedFlexiblePools(rawPools: FlexiblePool[]): DecodedPool[] {\n const decodedPools: DecodedPool[] = [];\n\n for (const rawPool of rawPools) {\n const decodedPool = decodeFlexiblePool(rawPool);\n\n // The canister may expose assets/chains before the SDK supports their flows.\n // Keep market.listPools() scoped to pools this SDK can safely map and use.\n if (!decodedPool) {\n continue;\n }\n\n decodedPools.push(decodedPool);\n }\n\n return decodedPools;\n}\n","import type { BorrowingPowerRecord } from \"../../core/canisters/lending/actor\";\nimport type {\n DecodedPositionView,\n DecodedUserStats,\n} from \"../../core/canisters/lending/flexible-actor\";\nimport { getAssetNativeDecimals } from \"../../core/utils/asset-decimals\";\nimport type { BorrowingPower, Position, UserStats } from \"./types\";\n\nexport const USD_VALUE_SCALE_DECIMALS = 27n;\n\ninterface UserStatsLike {\n debt: bigint;\n collateral: bigint;\n weighted_liquidation_threshold: bigint;\n borrowing_power: BorrowingPowerRecord;\n}\n\nexport function mapDecodedPositionViewToPosition(\n view: DecodedPositionView\n): Position {\n const nativeDecimals = getAssetNativeDecimals(view.asset);\n\n return {\n poolId: view.pool_id.toText(),\n asset: view.asset,\n deposited: view.deposited_native_now,\n depositedDecimals: nativeDecimals,\n borrowed: view.debt_native_now,\n borrowedDecimals: nativeDecimals,\n earnedInterest: view.total_earned_interest + view.earned_since_snapshot,\n debtInterest: view.total_debt_interest + view.interest_since_snapshot,\n lastUpdate: view.last_update,\n };\n}\n\nexport function mapBorrowingPowerRecordToBorrowingPower(\n record: BorrowingPowerRecord\n): BorrowingPower {\n return {\n weightedMaxLtv: record.weighted_max_ltv,\n maxBorrowableUsd: record.max_borrowable_usd,\n maxBorrowableUsdDecimals: USD_VALUE_SCALE_DECIMALS,\n };\n}\n\nexport function mapDecodedUserStatsToUserStats(\n stats: DecodedUserStats\n): UserStats {\n return mapUserStatsLikeToUserStats(stats);\n}\n\nfunction mapUserStatsLikeToUserStats(stats: UserStatsLike): UserStats {\n return {\n debt: stats.debt,\n debtDecimals: USD_VALUE_SCALE_DECIMALS,\n collateral: stats.collateral,\n collateralDecimals: USD_VALUE_SCALE_DECIMALS,\n weightedLiquidationThreshold: stats.weighted_liquidation_threshold,\n borrowingPower: mapBorrowingPowerRecordToBorrowingPower(\n stats.borrowing_power\n ),\n };\n}\n","import { Principal } from \"@icp-sdk/core/principal\";\nimport { mapCanisterCallErrorToLiquidiumError } from \"../../core/canisters/lending/error-mappers\";\nimport {\n createFlexibleLendingActor,\n decodeFlexiblePositionView,\n decodeFlexibleUserStats,\n} from \"../../core/canisters/lending/flexible-actor\";\nimport { LiquidiumError } from \"../../core/errors\";\nimport type { CanisterContext } from \"../../core/transports/canister-context\";\nimport type { MarketModule } from \"../market/market\";\nimport type { Pool } from \"../market/types\";\nimport {\n mapDecodedPositionViewToPosition,\n mapDecodedUserStatsToUserStats,\n USD_VALUE_SCALE_DECIMALS,\n} from \"./mappers\";\nimport type {\n FullWithdrawAmount,\n HealthFactor,\n MaxRepayAmount,\n Position,\n UserPositionSummary,\n UserReserve,\n UserStats,\n} from \"./types\";\n\nconst BPS_SCALE = 10000n;\nconst DEFAULT_REPAY_BUFFER_BPS = 10n;\n\n/** Profile position, health factor, and reserve valuation helpers. */\nexport class PositionsModule {\n constructor(\n private readonly canisterContext: CanisterContext,\n readonly market: MarketModule\n ) {}\n\n /**\n * Returns a single position for a profile and pool.\n *\n * @param profileId - The Liquidium profile principal text.\n * @param poolId - The pool principal text.\n * @returns The position for the requested profile and pool, or `null` when no position exists.\n */\n async getPosition(\n profileId: string,\n poolId: string\n ): Promise<Position | null> {\n try {\n const result = await createFlexibleLendingActor(\n this.canisterContext\n ).get_position(Principal.fromText(profileId), Principal.fromText(poolId));\n\n const view = result[0];\n if (!view) {\n return null;\n }\n\n const decodedView = decodeFlexiblePositionView(view);\n if (!decodedView) {\n return null;\n }\n\n return mapDecodedPositionViewToPosition(decodedView);\n } catch (error) {\n if (error instanceof LiquidiumError) {\n throw error;\n }\n\n throw mapCanisterCallErrorToLiquidiumError(\"get_position\", error);\n }\n }\n\n /**\n * Lists all positions for a profile.\n *\n * @param profileId - The Liquidium profile principal text.\n * @returns All positions currently associated with the requested profile.\n */\n async listPositions(profileId: string): Promise<Position[]> {\n try {\n const actor = createFlexibleLendingActor(this.canisterContext);\n const profilePrincipal = Principal.fromText(profileId);\n const stats = await actor.get_profile_stats(profilePrincipal);\n const decodedStats = decodeFlexibleUserStats(stats);\n\n const positionViews = await Promise.all(\n decodedStats.positions.map((position) =>\n actor.get_position(profilePrincipal, position.pool_id)\n )\n );\n\n return positionViews\n .map((result) => result[0])\n .filter((view): view is NonNullable<typeof view> => view !== undefined)\n .map(decodeFlexiblePositionView)\n .filter((view): view is NonNullable<typeof view> => view !== null)\n .map(mapDecodedPositionViewToPosition);\n } catch (error) {\n if (error instanceof LiquidiumError) {\n throw error;\n }\n\n throw mapCanisterCallErrorToLiquidiumError(\"list_positions\", error);\n }\n }\n\n /**\n * Returns the current health factor for a profile.\n *\n * @param profileId - The Liquidium profile principal text.\n * @returns The current health factor for the requested profile.\n */\n async getHealthFactor(profileId: string): Promise<HealthFactor> {\n try {\n const [healthFactor, userStatsRecord] = await createFlexibleLendingActor(\n this.canisterContext\n ).get_health_factor(Principal.fromText(profileId));\n\n return {\n healthFactor,\n userStats: mapDecodedUserStatsToUserStats(\n decodeFlexibleUserStats(userStatsRecord)\n ),\n };\n } catch (error) {\n if (error instanceof LiquidiumError) {\n throw error;\n }\n\n throw mapCanisterCallErrorToLiquidiumError(\"get_health_factor\", error);\n }\n }\n\n /**\n * Returns aggregate borrowing and collateral stats for a profile.\n *\n * @param profileId - The Liquidium profile principal text.\n * @returns Aggregate debt, collateral, and borrowing power metrics for the requested profile.\n */\n async getUserStats(profileId: string): Promise<UserStats> {\n try {\n const result = await createFlexibleLendingActor(\n this.canisterContext\n ).get_profile_stats(Principal.fromText(profileId));\n\n return mapDecodedUserStatsToUserStats(decodeFlexibleUserStats(result));\n } catch (error) {\n if (error instanceof LiquidiumError) {\n throw error;\n }\n\n throw mapCanisterCallErrorToLiquidiumError(\"get_profile_stats\", error);\n }\n }\n\n /**\n * Returns an aggregate summary of a profile's position.\n *\n * Single canister round-trip (`get_health_factor`). Derived fields:\n * `availableBorrowsUsd = max(0, maxBorrowableUsd - debt)`,\n * `netWorthUsd = collateral - debt` (may be negative if underwater),\n * `currentLtvBps = debt * 10_000 / collateral` (0 when collateral is 0).\n *\n * @param profileId - The Liquidium profile principal text.\n * @returns Derived position summary for the requested profile.\n */\n async getUserPositionSummary(\n profileId: string\n ): Promise<UserPositionSummary> {\n const { healthFactor, userStats } = await this.getHealthFactor(profileId);\n\n const collateral = userStats.collateral;\n const debt = userStats.debt;\n const maxBorrowableUsd = userStats.borrowingPower.maxBorrowableUsd;\n const availableBorrowsUsd =\n maxBorrowableUsd > debt ? maxBorrowableUsd - debt : 0n;\n const netWorthUsd = collateral - debt;\n const currentLtvBps =\n collateral > 0n ? (debt * BPS_SCALE) / collateral : 0n;\n\n return {\n totalCollateralUsd: collateral,\n totalDebtUsd: debt,\n availableBorrowsUsd,\n netWorthUsd,\n usdDecimals: USD_VALUE_SCALE_DECIMALS,\n currentLtvBps,\n weightedMaxLtvBps: userStats.borrowingPower.weightedMaxLtv,\n weightedLiquidationThresholdBps: userStats.weightedLiquidationThreshold,\n healthFactor,\n };\n }\n\n /**\n * Returns the per-reserve breakdown of a profile's supplies and borrows,\n * joined with pool metadata, rates, and current USD prices.\n *\n * USD values are scaled to 27 decimals.\n *\n * @param profileId - The Liquidium profile principal text.\n * @returns Per-reserve position rows joined with pool metadata and USD values.\n */\n async getUserReserves(profileId: string): Promise<UserReserve[]> {\n const [positions, pools, prices] = await Promise.all([\n this.listPositions(profileId),\n this.market.listPools(),\n this.market.getAssetPrices(),\n ]);\n\n const poolsById = new Map<string, Pool>(\n pools.map((pool) => [pool.id, pool])\n );\n\n return positions.flatMap((position) => {\n const pool = poolsById.get(position.poolId);\n if (!pool) {\n return [];\n }\n\n const priceUsd = prices[position.asset] ?? 0;\n\n return [\n {\n position,\n pool,\n priceUsd,\n suppliedUsd: nativeAmountToUsdScaled(\n position.deposited,\n position.depositedDecimals,\n priceUsd\n ),\n borrowedUsd: nativeAmountToUsdScaled(\n position.borrowed + position.debtInterest,\n position.borrowedDecimals,\n priceUsd\n ),\n usdDecimals: USD_VALUE_SCALE_DECIMALS,\n },\n ];\n });\n }\n\n /**\n * Returns the full repayment amount for a position, with a small buffer to\n * account for interest that accrues between quote and submit.\n *\n * @param profileId - The Liquidium profile principal text.\n * @param poolId - The pool principal text.\n * @param bufferBps - Optional buffer in basis points (default 10 = 0.1%).\n * @returns Buffered repayment amount in the borrowed asset's base units.\n */\n async getMaxRepayAmount(\n profileId: string,\n poolId: string,\n bufferBps: bigint = DEFAULT_REPAY_BUFFER_BPS\n ): Promise<MaxRepayAmount> {\n const position = await this.getPosition(profileId, poolId);\n if (!position) {\n return { amount: 0n, decimals: 0n };\n }\n\n const rawDebt = position.borrowed + position.debtInterest;\n if (rawDebt <= 0n) {\n return { amount: 0n, decimals: position.borrowedDecimals };\n }\n\n const buffered = (rawDebt * (BPS_SCALE + bufferBps)) / BPS_SCALE;\n\n return { amount: buffered, decimals: position.borrowedDecimals };\n }\n\n /**\n * Returns the current full withdraw amount for a position.\n *\n * `Position.deposited` already reflects the current supplied balance at the\n * latest lending index; do not add `earnedInterest` to this amount.\n * Pass `amount` to withdraw calls and use `decimals` for display formatting.\n *\n * @param profileId - The Liquidium profile principal text.\n * @param poolId - The pool principal text.\n * @returns Full withdraw amount in the supplied asset's base units.\n */\n async getFullWithdrawAmount(\n profileId: string,\n poolId: string\n ): Promise<FullWithdrawAmount> {\n const position = await this.getPosition(profileId, poolId);\n if (!position) {\n return { amount: 0n, decimals: 0n };\n }\n\n return { amount: position.deposited, decimals: position.depositedDecimals };\n }\n}\n\nfunction nativeAmountToUsdScaled(\n amount: bigint,\n nativeDecimals: bigint,\n priceUsd: number\n): bigint {\n if (amount <= 0n || priceUsd <= 0) {\n return 0n;\n }\n\n const priceScaleDecimals = 12n;\n const priceScale = 10n ** priceScaleDecimals;\n const priceScaled = BigInt(Math.round(priceUsd * Number(priceScale)));\n const nativeToUsdScale = USD_VALUE_SCALE_DECIMALS - nativeDecimals;\n\n return (amount * priceScaled * 10n ** nativeToUsdScale) / priceScale;\n}\n","/** Input for calculating required collateral from a target LTV. */\nexport interface QuoteRequest {\n /** Requested borrow amount in borrow asset base units. */\n borrowAmount: bigint;\n /** Pool principal text for the borrow side. */\n borrowPoolId: string;\n /** Pool principal text for the collateral side. */\n collateralPoolId: string;\n /** Target loan-to-value ratio in basis points. */\n targetLtvBps: bigint;\n}\n\n/** Input for calculating LTV from explicit borrow and collateral amounts. */\nexport interface CalculateLtvRequest {\n /** Requested borrow amount in borrow asset base units. */\n borrowAmount: bigint;\n /** Pool principal text for the borrow side. */\n borrowPoolId: string;\n /** Collateral amount in collateral asset base units. */\n collateralAmount: bigint;\n /** Pool principal text for the collateral side. */\n collateralPoolId: string;\n}\n\n/** Validation error produced by quote helpers. */\nexport interface QuoteValidationError {\n /** Stable machine-readable validation code. */\n code: QuoteValidationErrorCode;\n /** Human-readable validation message. */\n message: string;\n}\n\n/** Stable validation codes produced by quote helpers. */\nexport enum QuoteValidationErrorCode {\n INVALID_LTV = \"INVALID_LTV\",\n LTV_EXCEEDS_MAX = \"LTV_EXCEEDS_MAX\",\n SAME_ASSET_NOT_ALLOWED = \"SAME_ASSET_NOT_ALLOWED\",\n BORROW_AMOUNT_TOO_LOW = \"BORROW_AMOUNT_TOO_LOW\",\n PRICE_NOT_AVAILABLE = \"PRICE_NOT_AVAILABLE\",\n POOL_NOT_FOUND = \"POOL_NOT_FOUND\",\n UNKNOWN = \"UNKNOWN\",\n}\n\n/** Non-blocking warning produced by quote helpers. */\nexport interface QuoteWarning {\n /** Stable machine-readable warning code. */\n code: QuoteWarningCode;\n /** Human-readable warning message. */\n message: string;\n}\n\n/** Stable warning codes produced by quote helpers. */\nexport enum QuoteWarningCode {\n HIGH_LTV = \"HIGH_LTV\",\n SAME_ASSET_BORROWING = \"SAME_ASSET_BORROWING\",\n}\n\n/** Quote result for a requested borrow amount and target LTV. */\nexport interface QuoteResult {\n /** Requested borrow amount in borrow asset base units. */\n borrowAmount: bigint;\n /** Borrow value in internal USD units. */\n borrowUsd: bigint;\n /** Required collateral amount in collateral asset base units. */\n requiredCollateralAmount: bigint;\n /** Required collateral value in internal USD units. */\n requiredCollateralUsd: bigint;\n /** Maximum allowed LTV in basis points for the collateral pool. */\n maxAllowedLtvBps: bigint;\n /** Requested target LTV in basis points. */\n targetLtvBps: bigint;\n /** Pool principal text for the borrow side. */\n borrowPoolId: string;\n /** Pool principal text for the collateral side. */\n collateralPoolId: string;\n /** Borrow asset symbol. */\n borrowAsset: string;\n /** Collateral asset symbol. */\n collateralAsset: string;\n /** Blocking validation errors. Empty when the quote is usable. */\n validationErrors: QuoteValidationError[];\n /** Non-blocking quote warnings. */\n warnings: QuoteWarning[];\n}\n\n/** LTV calculation result for explicit borrow and collateral amounts. */\nexport interface LtvCalculation {\n /** Requested borrow amount in borrow asset base units. */\n borrowAmount: bigint;\n /** Collateral amount in collateral asset base units. */\n collateralAmount: bigint;\n /** Borrow value in internal USD units. */\n borrowUsd: bigint;\n /** Collateral value in internal USD units. */\n collateralUsd: bigint;\n /** Computed LTV in basis points. */\n ltvBps: bigint;\n /** Maximum allowed LTV in basis points for the collateral pool. */\n maxAllowedLtvBps: bigint;\n /** Pool principal text for the borrow side. */\n borrowPoolId: string;\n /** Pool principal text for the collateral side. */\n collateralPoolId: string;\n /** Borrow asset symbol. */\n borrowAsset: string;\n /** Collateral asset symbol. */\n collateralAsset: string;\n /** Blocking validation errors. Empty when the calculation is usable. */\n validationErrors: QuoteValidationError[];\n}\n","import { getBorrowAmountMinimumValidationError } from \"../../core/borrow-minimums\";\nimport { getSameAssetBorrowingValidationError } from \"../../core/same-asset-borrowing\";\nimport { ceilDivBigint } from \"../../core/utils/bigint\";\nimport type { AssetPrices, Pool } from \"../market/types\";\nimport type {\n CalculateLtvRequest,\n LtvCalculation,\n QuoteRequest,\n QuoteResult,\n QuoteValidationError,\n QuoteWarning,\n} from \"./types\";\nimport { QuoteValidationErrorCode, QuoteWarningCode } from \"./types\";\n\nconst BASIS_POINTS_DENOMINATOR = 10_000n;\nconst BPS_PER_PERCENT = 100n;\nconst MIN_LTV_BPS = 0n;\nconst HIGH_LTV_WARNING_THRESHOLD_BPS = 8_000n;\nconst INTERNAL_USD_DECIMAL_PLACES = 8;\nconst PRICE_SCALE_DECIMAL_PLACES = 8;\n\ninterface CreateQuoteResultParams {\n borrowAmount: bigint;\n borrowPoolId: string;\n collateralPoolId: string;\n borrowUsd: bigint;\n requiredCollateralAmount: bigint;\n requiredCollateralUsd: bigint;\n maxAllowedLtvBps: bigint;\n targetLtvBps: bigint;\n borrowAsset: string;\n collateralAsset: string;\n validationErrors: QuoteValidationError[];\n warnings: QuoteWarning[];\n}\n\ninterface CreateLtvCalculationParams {\n request: CalculateLtvRequest;\n borrowUsd: bigint;\n collateralUsd: bigint;\n ltvBps: bigint;\n maxAllowedLtvBps: bigint;\n borrowAsset: string;\n collateralAsset: string;\n validationErrors: QuoteValidationError[];\n}\n\ninterface ComputeUsdInternalFromBaseUnitsParams {\n amountBaseUnits: bigint;\n priceScaled: bigint;\n assetDecimalPlaces: number;\n}\n\ninterface ComputeBaseUnitsFromUsdInternalCeilParams {\n usdInternal: bigint;\n priceScaled: bigint;\n assetDecimalPlaces: number;\n}\n\n/** Pure quote helpers for LTV and required-collateral calculations. */\nexport class QuoteModule {\n /**\n * Calculates current LTV from caller-supplied borrow and collateral amounts.\n *\n * Amount fields are base units. USD fields are scaled to 8 decimal places.\n *\n * @param request - Borrow and collateral pool ids plus base-unit amounts.\n * @param pools - Available pools, usually from `client.market.listPools()`.\n * @param prices - USD price map, usually from `client.market.getAssetPrices()`.\n * @returns LTV calculation plus validation errors when inputs are unusable.\n */\n calculateLtv(\n request: CalculateLtvRequest,\n pools: Pool[],\n prices: AssetPrices\n ): LtvCalculation {\n const validationErrors: QuoteValidationError[] = [];\n const borrowPool = pools.find((pool) => pool.id === request.borrowPoolId);\n const collateralPool = pools.find(\n (pool) => pool.id === request.collateralPoolId\n );\n\n if (!borrowPool) {\n validationErrors.push({\n code: QuoteValidationErrorCode.POOL_NOT_FOUND,\n message: `Borrow pool not found: ${request.borrowPoolId}`,\n });\n }\n\n if (!collateralPool) {\n validationErrors.push({\n code: QuoteValidationErrorCode.POOL_NOT_FOUND,\n message: `Collateral pool not found: ${request.collateralPoolId}`,\n });\n }\n\n if (!borrowPool || !collateralPool) {\n return createLtvCalculation({\n request,\n borrowUsd: 0n,\n collateralUsd: 0n,\n ltvBps: 0n,\n maxAllowedLtvBps: 0n,\n borrowAsset: \"\",\n collateralAsset: \"\",\n validationErrors,\n });\n }\n\n const borrowPrice = prices[borrowPool.asset];\n const collateralPrice = prices[collateralPool.asset];\n\n if (!isValidPrice(borrowPrice)) {\n validationErrors.push({\n code: QuoteValidationErrorCode.PRICE_NOT_AVAILABLE,\n message: `Price not available for borrow asset: ${borrowPool.asset}`,\n });\n }\n\n if (!isValidPrice(collateralPrice)) {\n validationErrors.push({\n code: QuoteValidationErrorCode.PRICE_NOT_AVAILABLE,\n message: `Price not available for collateral asset: ${collateralPool.asset}`,\n });\n }\n\n const borrowAmountError = createBorrowAmountValidationError({\n amount: request.borrowAmount,\n asset: borrowPool.asset,\n });\n if (borrowAmountError) {\n validationErrors.push(borrowAmountError);\n }\n\n if (request.collateralAmount <= 0n) {\n validationErrors.push({\n code: QuoteValidationErrorCode.INVALID_LTV,\n message: \"Collateral amount must be greater than 0\",\n });\n }\n\n const sameAssetBorrowingError = getSameAssetBorrowingValidationError({\n borrowAsset: borrowPool.asset,\n collateralAsset: collateralPool.asset,\n collateralAmount: request.collateralAmount,\n poolId: request.borrowPoolId,\n policy: borrowPool,\n });\n if (sameAssetBorrowingError) {\n validationErrors.push({\n code: QuoteValidationErrorCode.SAME_ASSET_NOT_ALLOWED,\n message: sameAssetBorrowingError.message,\n });\n }\n\n if (validationErrors.length > 0) {\n return createLtvCalculation({\n request,\n borrowUsd: 0n,\n collateralUsd: 0n,\n ltvBps: 0n,\n maxAllowedLtvBps: collateralPool.maxLtv,\n borrowAsset: borrowPool.asset,\n collateralAsset: collateralPool.asset,\n validationErrors,\n });\n }\n\n const borrowUsd = computeUsdInternalFromBaseUnits({\n amountBaseUnits: request.borrowAmount,\n priceScaled: scalePriceUsdToBigint(borrowPrice as number),\n assetDecimalPlaces: getPoolDecimalPlaces(borrowPool),\n });\n const collateralUsd = computeUsdInternalFromBaseUnits({\n amountBaseUnits: request.collateralAmount,\n priceScaled: scalePriceUsdToBigint(collateralPrice as number),\n assetDecimalPlaces: getPoolDecimalPlaces(collateralPool),\n });\n\n if (collateralUsd <= 0n) {\n validationErrors.push({\n code: QuoteValidationErrorCode.INVALID_LTV,\n message: \"Collateral value must be greater than 0\",\n });\n\n return createLtvCalculation({\n request,\n borrowUsd,\n collateralUsd,\n ltvBps: 0n,\n maxAllowedLtvBps: collateralPool.maxLtv,\n borrowAsset: borrowPool.asset,\n collateralAsset: collateralPool.asset,\n validationErrors,\n });\n }\n\n return createLtvCalculation({\n request,\n borrowUsd,\n collateralUsd,\n ltvBps: roundDivBigint(\n borrowUsd * BASIS_POINTS_DENOMINATOR,\n collateralUsd\n ),\n maxAllowedLtvBps: collateralPool.maxLtv,\n borrowAsset: borrowPool.asset,\n collateralAsset: collateralPool.asset,\n validationErrors,\n });\n }\n\n /**\n * Calculates a loan quote based on borrow amount, LTV, and pool selections.\n *\n * All arithmetic is performed in bigint. `requiredCollateralAmount` and\n * `requiredCollateralUsd` are rounded UP so the caller never under-collateralizes\n * due to integer truncation. `borrowUsd` is floored for display.\n *\n * @param request - Quote request parameters.\n * @param pools - All available pools (use MarketModule.listPools() to fetch).\n * @param prices - Asset prices in USD (use MarketModule.getAssetPrices() to fetch).\n * @returns Quote result with required collateral and validation state.\n */\n getQuote(\n request: QuoteRequest,\n pools: Pool[],\n prices: AssetPrices\n ): QuoteResult {\n const { borrowAmount, borrowPoolId, collateralPoolId, targetLtvBps } =\n request;\n\n const validationErrors: QuoteValidationError[] = [];\n const warnings: QuoteWarning[] = [];\n\n const borrowPool = pools.find((p) => p.id === borrowPoolId);\n const collateralPool = pools.find((p) => p.id === collateralPoolId);\n\n if (!borrowPool) {\n validationErrors.push({\n code: QuoteValidationErrorCode.POOL_NOT_FOUND,\n message: `Borrow pool not found: ${borrowPoolId}`,\n });\n }\n\n if (!collateralPool) {\n validationErrors.push({\n code: QuoteValidationErrorCode.POOL_NOT_FOUND,\n message: `Collateral pool not found: ${collateralPoolId}`,\n });\n }\n\n if (!borrowPool || !collateralPool) {\n return createQuoteResult({\n borrowAmount,\n borrowPoolId,\n collateralPoolId,\n borrowUsd: 0n,\n requiredCollateralAmount: 0n,\n requiredCollateralUsd: 0n,\n maxAllowedLtvBps: 0n,\n targetLtvBps,\n borrowAsset: \"\",\n collateralAsset: \"\",\n validationErrors,\n warnings,\n });\n }\n\n const borrowAsset = borrowPool.asset;\n const collateralAsset = collateralPool.asset;\n const borrowPrice = prices[borrowAsset];\n const collateralPrice = prices[collateralAsset];\n\n if (\n borrowPrice === undefined ||\n !Number.isFinite(borrowPrice) ||\n borrowPrice <= 0\n ) {\n validationErrors.push({\n code: QuoteValidationErrorCode.PRICE_NOT_AVAILABLE,\n message: `Price not available for borrow asset: ${borrowAsset}`,\n });\n }\n\n if (\n collateralPrice === undefined ||\n !Number.isFinite(collateralPrice) ||\n collateralPrice <= 0\n ) {\n validationErrors.push({\n code: QuoteValidationErrorCode.PRICE_NOT_AVAILABLE,\n message: `Price not available for collateral asset: ${collateralAsset}`,\n });\n }\n\n const borrowAmountError = createBorrowAmountValidationError({\n amount: borrowAmount,\n asset: borrowAsset,\n });\n if (borrowAmountError) {\n validationErrors.push(borrowAmountError);\n }\n\n if (targetLtvBps <= MIN_LTV_BPS) {\n validationErrors.push({\n code: QuoteValidationErrorCode.INVALID_LTV,\n message: `LTV must be greater than 0`,\n });\n }\n\n if (targetLtvBps > BASIS_POINTS_DENOMINATOR) {\n validationErrors.push({\n code: QuoteValidationErrorCode.INVALID_LTV,\n message: `LTV must not exceed ${formatBpsAsPercent(BASIS_POINTS_DENOMINATOR)}%`,\n });\n }\n\n const maxAllowedLtvBps = collateralPool.maxLtv;\n if (targetLtvBps > maxAllowedLtvBps) {\n validationErrors.push({\n code: QuoteValidationErrorCode.LTV_EXCEEDS_MAX,\n message: `Target LTV ${formatBpsAsPercent(targetLtvBps)}% exceeds max allowed ${formatBpsAsPercent(maxAllowedLtvBps)}%`,\n });\n }\n\n const isSameAssetBorrowingRequest = borrowAsset === collateralAsset;\n if (targetLtvBps >= HIGH_LTV_WARNING_THRESHOLD_BPS) {\n warnings.push({\n code: QuoteWarningCode.HIGH_LTV,\n message: `LTV above ${formatBpsAsPercent(HIGH_LTV_WARNING_THRESHOLD_BPS)}% may put your position at higher risk of liquidation`,\n });\n }\n\n if (validationErrors.length > 0) {\n return createQuoteResult({\n borrowAmount,\n borrowPoolId,\n collateralPoolId,\n borrowUsd: 0n,\n requiredCollateralAmount: 0n,\n requiredCollateralUsd: 0n,\n maxAllowedLtvBps,\n targetLtvBps,\n borrowAsset,\n collateralAsset,\n validationErrors,\n warnings,\n });\n }\n\n const borrowAssetDecimals = getPoolDecimalPlaces(borrowPool);\n const collateralAssetDecimals = getPoolDecimalPlaces(collateralPool);\n const borrowPriceScaled = scalePriceUsdToBigint(borrowPrice as number);\n const collateralPriceScaled = scalePriceUsdToBigint(\n collateralPrice as number\n );\n\n const borrowUsdInternal = computeUsdInternalFromBaseUnits({\n amountBaseUnits: borrowAmount,\n priceScaled: borrowPriceScaled,\n assetDecimalPlaces: borrowAssetDecimals,\n });\n\n const requiredCollateralUsdInternal = ceilDivBigint(\n borrowUsdInternal * BASIS_POINTS_DENOMINATOR,\n targetLtvBps\n );\n\n const requiredCollateralAmount = computeBaseUnitsFromUsdInternalCeil({\n usdInternal: requiredCollateralUsdInternal,\n priceScaled: collateralPriceScaled,\n assetDecimalPlaces: collateralAssetDecimals,\n });\n\n const sameAssetBorrowingError = getSameAssetBorrowingValidationError({\n borrowAsset,\n collateralAsset,\n collateralAmount: requiredCollateralAmount,\n poolId: borrowPoolId,\n policy: borrowPool,\n });\n if (sameAssetBorrowingError) {\n validationErrors.push({\n code: QuoteValidationErrorCode.SAME_ASSET_NOT_ALLOWED,\n message: sameAssetBorrowingError.message,\n });\n }\n\n if (isSameAssetBorrowingRequest && !sameAssetBorrowingError) {\n warnings.push({\n code: QuoteWarningCode.SAME_ASSET_BORROWING,\n message: `Using same asset for borrow and collateral`,\n });\n }\n\n return createQuoteResult({\n borrowAmount,\n borrowPoolId,\n collateralPoolId,\n borrowUsd: borrowUsdInternal,\n requiredCollateralAmount,\n requiredCollateralUsd: requiredCollateralUsdInternal,\n maxAllowedLtvBps,\n targetLtvBps,\n borrowAsset,\n collateralAsset,\n validationErrors,\n warnings,\n });\n }\n}\n\nfunction createLtvCalculation(\n params: CreateLtvCalculationParams\n): LtvCalculation {\n return {\n borrowAmount: params.request.borrowAmount,\n collateralAmount: params.request.collateralAmount,\n borrowUsd: params.borrowUsd,\n collateralUsd: params.collateralUsd,\n ltvBps: params.ltvBps,\n maxAllowedLtvBps: params.maxAllowedLtvBps,\n borrowPoolId: params.request.borrowPoolId,\n collateralPoolId: params.request.collateralPoolId,\n borrowAsset: params.borrowAsset,\n collateralAsset: params.collateralAsset,\n validationErrors: params.validationErrors,\n };\n}\n\nfunction createQuoteResult(params: CreateQuoteResultParams): QuoteResult {\n return {\n borrowAmount: params.borrowAmount,\n borrowUsd: params.borrowUsd,\n requiredCollateralAmount: params.requiredCollateralAmount,\n requiredCollateralUsd: params.requiredCollateralUsd,\n maxAllowedLtvBps: params.maxAllowedLtvBps,\n targetLtvBps: params.targetLtvBps,\n borrowPoolId: params.borrowPoolId,\n collateralPoolId: params.collateralPoolId,\n borrowAsset: params.borrowAsset,\n collateralAsset: params.collateralAsset,\n validationErrors: params.validationErrors,\n warnings: params.warnings,\n };\n}\n\nfunction createBorrowAmountValidationError(params: {\n amount: bigint;\n asset: string;\n}): QuoteValidationError | null {\n if (params.amount <= 0n) {\n return {\n code: QuoteValidationErrorCode.BORROW_AMOUNT_TOO_LOW,\n message: \"Borrow amount must be greater than 0\",\n };\n }\n\n const minimumBorrowAmountError =\n getBorrowAmountMinimumValidationError(params);\n if (!minimumBorrowAmountError) {\n return null;\n }\n\n return {\n code: QuoteValidationErrorCode.BORROW_AMOUNT_TOO_LOW,\n message: minimumBorrowAmountError.message,\n };\n}\n\nfunction computeUsdInternalFromBaseUnits(\n params: ComputeUsdInternalFromBaseUnitsParams\n): bigint {\n const { amountBaseUnits, priceScaled, assetDecimalPlaces } = params;\n const scaleDiff = INTERNAL_USD_DECIMAL_PLACES - PRICE_SCALE_DECIMAL_PLACES;\n const numerator = amountBaseUnits * priceScaled;\n const assetDecimalFactor = 10n ** BigInt(assetDecimalPlaces);\n\n if (scaleDiff >= 0) {\n return (numerator * 10n ** BigInt(scaleDiff)) / assetDecimalFactor;\n }\n\n return numerator / (assetDecimalFactor * 10n ** BigInt(-scaleDiff));\n}\n\nfunction computeBaseUnitsFromUsdInternalCeil(\n params: ComputeBaseUnitsFromUsdInternalCeilParams\n): bigint {\n const { usdInternal, priceScaled, assetDecimalPlaces } = params;\n const scaleDiff = INTERNAL_USD_DECIMAL_PLACES - PRICE_SCALE_DECIMAL_PLACES;\n const assetDecimalFactor = 10n ** BigInt(assetDecimalPlaces);\n\n if (scaleDiff >= 0) {\n return ceilDivBigint(\n usdInternal * assetDecimalFactor,\n priceScaled * 10n ** BigInt(scaleDiff)\n );\n }\n\n return ceilDivBigint(\n usdInternal * assetDecimalFactor * 10n ** BigInt(-scaleDiff),\n priceScaled\n );\n}\n\nfunction roundDivBigint(numerator: bigint, denominator: bigint): bigint {\n return (numerator + denominator / 2n) / denominator;\n}\n\nfunction scalePriceUsdToBigint(priceUsd: number): bigint {\n const scaled = Math.round(priceUsd * 10 ** PRICE_SCALE_DECIMAL_PLACES);\n return BigInt(scaled);\n}\n\nfunction isValidPrice(price: number | undefined): price is number {\n return typeof price === \"number\" && Number.isFinite(price) && price > 0;\n}\n\nfunction getPoolDecimalPlaces(pool: Pool): number {\n return Number(pool.decimals);\n}\n\nfunction formatBpsAsPercent(bps: bigint): string {\n const whole = bps / BPS_PER_PERCENT;\n const fractional = bps % BPS_PER_PERCENT;\n if (fractional === 0n) {\n return whole.toString();\n }\n\n const padded = fractional.toString().padStart(2, \"0\").replace(/0+$/, \"\");\n return `${whole}.${padded}`;\n}\n","import { LiquidiumError, LiquidiumErrorCode } from \"../errors\";\n\nconst MILLISECONDS_PER_SECOND = 1_000;\n\nexport interface ApiResponseFieldContext {\n context: string;\n label: string;\n}\n\nexport function parseNonEmptyApiString(\n value: string | undefined,\n field: ApiResponseFieldContext\n): string {\n if (!value) {\n throwInvalidApiResponseField(field);\n }\n\n return value;\n}\n\nexport function parseUnsignedApiBigint(\n value: string | undefined,\n field: ApiResponseFieldContext\n): bigint {\n if (!value || !/^\\d+$/.test(value)) {\n throwInvalidApiResponseField(field);\n }\n\n return BigInt(value);\n}\n\nexport function parseIsoApiTimestampToUnixSeconds(\n value: string | undefined,\n field: ApiResponseFieldContext\n): bigint {\n const timestamp = parseNonEmptyApiString(value, field);\n const timestampMilliseconds = Date.parse(timestamp);\n\n if (!Number.isFinite(timestampMilliseconds)) {\n throwInvalidApiResponseField(field);\n }\n\n return BigInt(Math.floor(timestampMilliseconds / MILLISECONDS_PER_SECOND));\n}\n\nexport function parseApiStringUnion<const TValue extends string>(\n value: string | undefined,\n allowedValues: readonly TValue[],\n field: ApiResponseFieldContext\n): TValue {\n if (value !== undefined && allowedValues.includes(value as TValue)) {\n return value as TValue;\n }\n\n throwInvalidApiResponseField(field);\n}\n\nfunction throwInvalidApiResponseField(field: ApiResponseFieldContext): never {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n `Invalid ${field.context} ${field.label}`\n );\n}\n","import { normalizeExternalAddress } from \"../../../core/address-validation\";\nimport type { Chain } from \"../../../core/types\";\nimport type { SimpleLoanAsset } from \"../types\";\n\nexport function validateSimpleLoanBorrowDestination(\n address: string,\n asset: SimpleLoanAsset,\n chain: Chain\n): string {\n return normalizeExternalAddress({\n address,\n asset,\n chain,\n });\n}\n\nexport function validateSimpleLoanRefundDestination(\n address: string,\n asset: SimpleLoanAsset,\n chain: Chain\n): string {\n return normalizeExternalAddress({\n address,\n asset,\n chain,\n });\n}\n","import { Principal } from \"@icp-sdk/core/principal\";\nimport {\n decodeIcrcAccountAddress,\n mapCanisterAccountToLiquidiumAccount,\n normalizeIcpAccountIdentifier,\n} from \"../../core/accounts\";\nimport { mapCanisterCallErrorToLiquidiumError } from \"../../core/canisters/lending/error-mappers\";\nimport type {\n SimpleLoanAuthorisation,\n SimpleLoanLeg as SimpleLoanCanisterLeg,\n SimpleLoansCanisterError,\n WarmedProfile,\n} from \"../../core/canisters/simple-loans/actor\";\nimport {\n createFlexibleSimpleLoansActor,\n type DecodedHeadlessLoanEvent,\n type DecodedHeadlessLoanEventType,\n type DecodedSimpleLoanCanisterRecord,\n decodeFlexibleHeadlessLoanEvent,\n decodeFlexibleSimpleLoanRecord,\n} from \"../../core/canisters/simple-loans/flexible-actor\";\nimport { LiquidiumError, LiquidiumErrorCode } from \"../../core/errors\";\nimport {\n buildSimpleLoanCollateralHintPath,\n buildSimpleLoanFindPath,\n SdkApiPath,\n} from \"../../core/sdk-api-paths\";\nimport { createLiquidiumStatus, type LiquidiumStatus } from \"../../core/status\";\nimport type { ApiClient } from \"../../core/transports/api-client\";\nimport type { CanisterContext } from \"../../core/transports/canister-context\";\nimport {\n type AssetIdentifier,\n type Chain,\n Asset as CoreAsset,\n Chain as CoreChain,\n isAssetIdentifier,\n SupplyAction,\n} from \"../../core/types\";\nimport {\n parseApiStringUnion,\n parseIsoApiTimestampToUnixSeconds,\n parseNonEmptyApiString,\n parseUnsignedApiBigint,\n} from \"../../core/utils/api-response-parsers\";\nimport { getAssetNativeDecimals } from \"../../core/utils/asset-decimals\";\nimport { getVariantKey } from \"../../core/utils/variant\";\nimport type { ActivitiesModule, Activity } from \"../activities\";\nimport { ActivityFilter } from \"../activities\";\nimport {\n getPoolById,\n resolveSupplyTargetForPool,\n} from \"../lending/_internal/supply-targets\";\nimport type { LendingModule } from \"../lending/lending\";\nimport { SupplyPlanType, type SupplyTarget } from \"../lending/types\";\nimport type { PositionsModule } from \"../positions\";\nimport type { Position } from \"../positions/types\";\nimport { QuoteModule } from \"../quote\";\nimport { QuoteValidationErrorCode } from \"../quote/types\";\nimport {\n validateSimpleLoanBorrowDestination,\n validateSimpleLoanRefundDestination,\n} from \"./_internal/address-validation\";\nimport { intFromPublicId, publicIdFromInt } from \"./ref-code\";\nimport type {\n CreateSimpleLoanRequest,\n SimpleLoan,\n SimpleLoanAccount,\n SimpleLoanAsset,\n SimpleLoanAuthorization,\n SimpleLoanConfig,\n SimpleLoanDestination,\n SimpleLoanEvent,\n SimpleLoanEventType,\n SimpleLoanFindBorrow,\n SimpleLoanFindCollateral,\n SimpleLoanFindResult,\n SimpleLoanGetRequest,\n SimpleLoanInitialDeposit,\n SimpleLoanInitialDepositTargetQuote,\n SimpleLoanLeg,\n SimpleLoanListEventsRequest,\n SimpleLoanRepaymentTargetQuote,\n SimpleLoanWarmedProfile,\n} from \"./types\";\n\nconst REPAYMENT_BUFFER_SECONDS = 86_400n;\nconst RATE_SCALE = 10n ** 27n;\nconst SECONDS_PER_YEAR = 31_536_000n;\nconst MILLISECONDS_PER_SECOND = 1_000;\nconst ETH_STABLECOIN_INFLOW_FEE_FALLBACK = 1_500_000n;\nconst SIMPLE_LOAN_MIN_SLIPPAGE_BUFFER_BPS = 200n;\nconst SIMPLE_LOAN_FIND_QUERY_MAX_LENGTH = 256;\nconst SIMPLE_LOAN_WIRE_CONTEXT = \"simple loan\";\nconst SIMPLE_LOAN_ASSETS = [\n CoreAsset.BTC,\n CoreAsset.ICP,\n CoreAsset.USDC,\n CoreAsset.USDT,\n] as const satisfies readonly SimpleLoanAsset[];\nconst SIMPLE_LOAN_CHAINS = [\n CoreChain.BTC,\n CoreChain.ETH,\n CoreChain.ICP,\n] as const;\n\nconst ICP_ACCOUNT_IDENTIFIER_HEX_LENGTH = 64;\n\ninterface SimpleLoanLtvPolicy {\n ltvBps: bigint;\n minLtvMaxBps: bigint;\n maxLtvMaxBps: bigint;\n}\n\ninterface SimpleLoanFindCandidateWire {\n loan_id: string;\n short_ref: string;\n created_at: string;\n lend_asset: string;\n borrow_asset: string;\n collateral_amount: string;\n lend_pool_ic_id: string;\n borrow_pool_ic_id: string;\n profile: string;\n}\n\ninterface SimpleLoanFindCandidate {\n loanId: bigint;\n ref: string;\n createdAt: bigint;\n collateral: SimpleLoanFindCollateral;\n borrow: SimpleLoanFindBorrow;\n profileId: string;\n}\n\ninterface SimpleLoanCreateRequestWire {\n collateralPoolId: string;\n borrowPoolId: string;\n collateralAsset: SimpleLoanAsset;\n borrowAsset: SimpleLoanAsset;\n collateralAmount: string;\n borrowAmount: string;\n ltvMaxBps: string;\n depositWindowSeconds: string;\n borrowDestination: SimpleLoanApiAccountType;\n refundDestination: SimpleLoanApiAccountType;\n}\n\ninterface SimpleLoanApiExternalAccountType {\n External: string;\n}\n\ninterface SimpleLoanApiNativeAccountType {\n Native: string;\n}\n\ninterface SimpleLoanApiAccountIdentifierAccountType {\n AccountIdentifier: string;\n}\n\ninterface SimpleLoanApiIcrcAccountType {\n Icrc: string;\n}\n\ntype SimpleLoanApiAccountType =\n | SimpleLoanApiExternalAccountType\n | SimpleLoanApiNativeAccountType\n | SimpleLoanApiAccountIdentifierAccountType\n | SimpleLoanApiIcrcAccountType;\n\ninterface SimpleLoanCollateralHintWire {\n collateralAmountHint: string;\n}\n\ninterface V1SimpleLoanFindResponseWire {\n success: true;\n candidates: SimpleLoanFindCandidateWire[];\n}\n\ninterface LegacySimpleLoanFindResponseWire {\n success: true;\n loans: SimpleLoanFindCandidateWire[];\n}\n\ntype SimpleLoanFindResponseWire =\n | V1SimpleLoanFindResponseWire\n | LegacySimpleLoanFindResponseWire;\n\ninterface V1SimpleLoanCollateralHintResponseWire\n extends SimpleLoanCollateralHintWire {\n success: true;\n}\n\ninterface V1SimpleLoanCreateResponseWire {\n success: true;\n loan: SimpleLoanWire;\n}\n\ninterface SimpleLoanWireCollateral {\n amountHint: string;\n}\n\ninterface SimpleLoanWire {\n loanId: string;\n collateral: SimpleLoanWireCollateral;\n}\n\ninterface SimpleLoanHydrationInput {\n loanId: bigint;\n profileId: string;\n ltvMaxBps: bigint;\n depositWindowSeconds: bigint;\n collateralPoolId: string;\n collateralAmount: bigint;\n borrowPoolId: string;\n collateralAsset: SimpleLoanAsset;\n borrowAsset: SimpleLoanAsset;\n borrowAmount: bigint;\n borrowDestination: SimpleLoanAccount;\n refundDestination: SimpleLoanAccount;\n started: boolean;\n depositDetectedTimestamp: bigint | null;\n expiryTimestamp: bigint | null;\n borrowChain: Chain;\n}\n\ninterface SimpleLoanHydrationChainOptions {\n borrowChain?: Chain;\n}\n\ninterface SimpleLoanInitialDepositQuoteInput {\n collateralAmount: bigint;\n decimals: bigint;\n asset: SimpleLoanAsset;\n targets: Partial<Record<Chain, SupplyTarget>>;\n detectedTimestamp: bigint | null;\n expiryTimestamp: bigint | null;\n}\n\ninterface ResolveSimpleLoanInflowTargetsRequest {\n profileId: string;\n poolId: string;\n action: SupplyAction;\n}\n\ninterface ResolvedSimpleLoanInflowTargets {\n targets: Partial<Record<Chain, SupplyTarget>>;\n}\n\ninterface RepaymentInflowFeeEstimate {\n totalFee: bigint;\n estimateAvailable: boolean;\n}\n\ninterface DeriveSimpleLoanStatusInput {\n started: boolean;\n depositDetectedTimestamp: bigint | null;\n expiryTimestamp: bigint | null;\n collateralAmount: bigint;\n totalDebtAmount: bigint;\n activeActivities: Activity[];\n}\n\ninterface DeriveDepositExpiryTimestampInput {\n depositDetectedTimestamp: bigint | null;\n depositWindowSeconds: bigint;\n}\n\ninterface LtvCalculationErrorDetails {\n code: QuoteValidationErrorCode;\n message: string;\n}\n\ntype ExternalDestinationNormalizer = (\n address: string,\n asset: SimpleLoanAsset,\n chain: Chain\n) => string;\n\ntype SimpleLoanOutflowRole = \"borrow\" | \"refund\";\n\ninterface ResolveSimpleLoanDestinationParams {\n destination: SimpleLoanDestination;\n asset: SimpleLoanAsset;\n role: SimpleLoanOutflowRole;\n chain: Chain;\n normalizeExternalDestination: ExternalDestinationNormalizer;\n}\n\n/**\n * A loan was created remotely, but the SDK could not load its enriched state.\n * Retry with `simpleLoans.get({ loanId })`; do not create the loan again.\n */\nexport class SimpleLoanCreatedError extends Error {\n readonly code = \"SIMPLE_LOAN_HYDRATION_FAILED\" as const;\n readonly loanId: bigint;\n readonly ref: string;\n override readonly cause: unknown;\n\n constructor(loanId: bigint, cause: unknown) {\n const ref = publicIdFromInt(loanId);\n super(\n `Simple loan ${ref} was created, but its enriched state could not be loaded`\n );\n this.name = \"SimpleLoanCreatedError\";\n this.loanId = loanId;\n this.ref = ref;\n this.cause = cause;\n }\n}\n\n/** Accountless Simple Loans creation, lookup, recovery, and canister query helpers. */\nexport class SimpleLoansModule {\n constructor(\n private readonly canisterContext: CanisterContext,\n private readonly apiClient: ApiClient | undefined,\n private readonly activities: ActivitiesModule,\n private readonly lending: LendingModule,\n private readonly positions: PositionsModule\n ) {}\n\n /**\n * Creates a profileless simple loan and returns canonical canister state plus\n * generated initial-deposit and repayment quote targets.\n *\n * Choose `collateralPoolId` and `borrowPoolId` from\n * `client.market.listPools()`, convert UI amounts to base units with the\n * selected pool decimals, and call `client.quote.calculateLtv(...)` before\n * creation to block invalid LTV input.\n *\n * `borrow.destination` receives the borrowed asset after the loan starts.\n * `refund.destination` receives collateral refunds or withdrawals. Use\n * `depositWindowSeconds` for the user-facing collateral deposit timeout; the\n * SDK maps it to the canister's internal `ltv_timer_s` field.\n * Pool assets and same-asset borrowing policy are validated before creation.\n *\n * @param request - Collateral, borrow, refund, LTV limit, timeout, and inflow options.\n * @returns Hydrated loan state plus generated initial-deposit and repayment quote targets.\n */\n async create(request: CreateSimpleLoanRequest): Promise<SimpleLoan> {\n validateCreateRequest(request);\n const borrowDestination = resolveSimpleLoanDestination({\n destination: request.borrow.destination,\n asset: request.borrow.asset,\n role: \"borrow\",\n chain: request.borrow.chain,\n normalizeExternalDestination: validateSimpleLoanBorrowDestination,\n });\n const refundDestination = resolveSimpleLoanDestination({\n destination: request.refund.destination,\n asset: request.collateral.asset,\n role: \"refund\",\n chain: request.refund.chain,\n normalizeExternalDestination: validateSimpleLoanRefundDestination,\n });\n const apiClient = this.requireApi(\"Simple loan creation\");\n\n await this.validateSimpleLoanLtvPolicy(request);\n\n const response = await apiClient.post<\n V1SimpleLoanCreateResponseWire,\n SimpleLoanCreateRequestWire\n >(SdkApiPath.simpleLoans, {\n collateralPoolId: request.collateral.poolId,\n borrowPoolId: request.borrow.poolId,\n collateralAsset: request.collateral.asset,\n borrowAsset: request.borrow.asset,\n collateralAmount: request.collateral.amount.toString(),\n borrowAmount: request.borrow.amount.toString(),\n ltvMaxBps: request.ltvMaxBps.toString(),\n depositWindowSeconds: request.depositWindowSeconds.toString(),\n borrowDestination,\n refundDestination,\n });\n\n const loanId = parseUnsignedApiBigint(response.loan.loanId, {\n context: SIMPLE_LOAN_WIRE_CONTEXT,\n label: \"loan ID\",\n });\n\n try {\n const collateralAmount = parseUnsignedApiBigint(\n response.loan.collateral.amountHint,\n {\n context: SIMPLE_LOAN_WIRE_CONTEXT,\n label: \"collateral amount\",\n }\n );\n const record = await this.getLoanRecord(loanId);\n\n return await this.mapLoanRecord(record, collateralAmount, {\n borrowChain: request.borrow.chain,\n });\n } catch (cause) {\n throw new SimpleLoanCreatedError(loanId, cause);\n }\n }\n\n /**\n * Resolves canonical canister state by loan id or short reference.\n *\n * References are decoded locally, then the corresponding loan id is loaded\n * from the Simple Loans canister.\n *\n * @param request - Canister loan id or short public reference.\n * @returns Hydrated loan state plus generated initial-deposit and repayment quote targets.\n */\n async get(request: SimpleLoanGetRequest): Promise<SimpleLoan> {\n const loanId =\n \"loanId\" in request ? request.loanId : decodeRef(request.ref);\n\n const record = await this.getLoanRecord(loanId);\n const collateralAmount = await this.getCollateralAmountHint(loanId);\n\n return await this.mapLoanRecord(record, collateralAmount);\n }\n\n /**\n * Finds simple loans by short reference, numeric loan id string, address, or transaction id.\n *\n * Search returns lightweight matches. Call `get({ loanId })` or `get({ ref })`\n * when the user selects a match and you need hydrated loan state.\n *\n * @param query - Short reference, address, transaction id/hash, or numeric loan id string.\n * @returns Matching loan ids and references from the search index.\n */\n async find(query: string): Promise<SimpleLoanFindResult[]> {\n const validatedQuery = validateSimpleLoanFindQuery(query);\n const candidates = await this.findCandidateLoansByQuery(validatedQuery);\n\n return uniqueSimpleLoanFindCandidates(candidates).map((candidate) => ({\n loanId: candidate.loanId,\n ref: candidate.ref,\n createdAt: candidate.createdAt,\n collateral: candidate.collateral,\n borrow: candidate.borrow,\n profileId: candidate.profileId,\n }));\n }\n\n /**\n * Returns the active Simple Loans canister config via direct query.\n *\n * @returns Active canister configuration.\n */\n async getConfig(): Promise<SimpleLoanConfig> {\n try {\n const config = await createFlexibleSimpleLoansActor(\n this.canisterContext\n ).get_config();\n\n return {\n lendingCanisterId: config.lending_canister.toText(),\n };\n } catch (error) {\n throw mapCanisterCallErrorToLiquidiumError(\"get_config\", error);\n }\n }\n\n /**\n * Returns a single canister event by id via direct query.\n *\n * @param eventId - Event id to load.\n * @returns The event when found, otherwise `null`.\n */\n async getEvent(eventId: bigint): Promise<SimpleLoanEvent | null> {\n try {\n const event = await createFlexibleSimpleLoansActor(\n this.canisterContext\n ).get_event(eventId);\n\n const decoded = event[0]\n ? decodeFlexibleHeadlessLoanEvent(event[0])\n : null;\n\n return decoded ? mapSimpleLoanEvent(decoded) : null;\n } catch (error) {\n throw mapCanisterCallErrorToLiquidiumError(\"get_event\", error);\n }\n }\n\n /**\n * Returns a page of canister events via direct query.\n *\n * @param request - Start event id and maximum number of events to return.\n * @returns Canister events in ascending id order.\n */\n async listEvents(\n request: SimpleLoanListEventsRequest\n ): Promise<SimpleLoanEvent[]> {\n try {\n const events = await createFlexibleSimpleLoansActor(\n this.canisterContext\n ).list_events(request.start, request.limit);\n\n return events\n .map(([, event]) => decodeFlexibleHeadlessLoanEvent(event))\n .filter((event): event is DecodedHeadlessLoanEvent => event !== null)\n .map((event) => mapSimpleLoanEvent(event));\n } catch (error) {\n throw mapCanisterCallErrorToLiquidiumError(\"list_events\", error);\n }\n }\n\n /**\n * Returns principals authorized for protected update callbacks.\n *\n * @returns Principal text values on the canister access list.\n */\n async listAccessList(): Promise<string[]> {\n try {\n const principals = await createFlexibleSimpleLoansActor(\n this.canisterContext\n ).list_access_list();\n\n return principals.map((principal) => principal.toText());\n } catch (error) {\n throw mapCanisterCallErrorToLiquidiumError(\"list_access_list\", error);\n }\n }\n\n /**\n * Returns the current size of the warmed-profile pool via direct query.\n *\n * @returns Number of warmed profiles available on the canister.\n */\n async countWarmedProfiles(): Promise<bigint> {\n try {\n return await createFlexibleSimpleLoansActor(\n this.canisterContext\n ).count_warmed_profiles();\n } catch (error) {\n throw mapCanisterCallErrorToLiquidiumError(\n \"count_warmed_profiles\",\n error\n );\n }\n }\n\n /**\n * Returns warmed profiles currently available for future simple loans.\n *\n * @returns Warmed profile records available for assignment.\n */\n async listWarmedProfiles(): Promise<SimpleLoanWarmedProfile[]> {\n try {\n const profiles = await createFlexibleSimpleLoansActor(\n this.canisterContext\n ).list_warmed_profiles();\n\n return profiles.map(mapWarmedProfile);\n } catch (error) {\n throw mapCanisterCallErrorToLiquidiumError(\"list_warmed_profiles\", error);\n }\n }\n\n private async findCandidateLoansByQuery(\n query: string\n ): Promise<SimpleLoanFindCandidate[]> {\n const apiClient = this.requireApi(\"Simple loan find\");\n const response = await apiClient.get<SimpleLoanFindResponseWire>(\n buildSimpleLoanFindPath({ query })\n );\n\n const candidates =\n \"candidates\" in response ? response.candidates : response.loans;\n\n return candidates.map(mapCandidateWire);\n }\n\n private async getLoanRecord(\n loanId: bigint\n ): Promise<DecodedSimpleLoanCanisterRecord> {\n try {\n const result = await createFlexibleSimpleLoansActor(\n this.canisterContext\n ).get_loan(loanId);\n\n if (\"Err\" in result) {\n throw mapSimpleLoansErrorToLiquidiumError(result.Err);\n }\n\n const decoded = decodeFlexibleSimpleLoanRecord(result.Ok);\n if (!decoded) {\n throw new LiquidiumError(\n LiquidiumErrorCode.POOL_NOT_FOUND,\n `Simple loan ${loanId.toString()} uses an unsupported asset`\n );\n }\n\n return decoded;\n } catch (error) {\n if (error instanceof LiquidiumError) {\n throw error;\n }\n\n throw mapCanisterCallErrorToLiquidiumError(\"get_loan\", error);\n }\n }\n\n private async mapLoanRecord(\n record: DecodedSimpleLoanCanisterRecord,\n collateralAmount: bigint,\n chainOptions: SimpleLoanHydrationChainOptions = {}\n ): Promise<SimpleLoan> {\n const borrowDestination = accountFromCanister(record.borrow_destination);\n const collateralAsset = parseSimpleLoanAsset(\n record.lend_asset,\n \"collateral asset\"\n );\n const borrowAsset = parseSimpleLoanAsset(\n record.borrow_asset,\n \"borrow asset\"\n );\n\n return await this.hydrateLoan({\n loanId: record.id,\n profileId: record.lending_profile.toText(),\n ltvMaxBps: record.ltv_max_bps,\n depositWindowSeconds: record.ltv_timer_s,\n collateralPoolId: record.lend_pool_id.toText(),\n collateralAmount,\n borrowPoolId: record.borrow_pool_id.toText(),\n collateralAsset,\n borrowAsset,\n borrowAmount: record.borrow_amount,\n borrowDestination,\n refundDestination: accountFromCanister(record.refund_destination),\n started: record.started,\n depositDetectedTimestamp: record.deposit_detected_ts[0] ?? null,\n expiryTimestamp:\n record.expires_at[0] ??\n deriveDepositExpiryTimestamp({\n depositDetectedTimestamp: record.deposit_detected_ts[0] ?? null,\n depositWindowSeconds: record.ltv_timer_s,\n }),\n borrowChain:\n chainOptions.borrowChain ??\n inferSimpleLoanDeliveryChain(borrowDestination, borrowAsset),\n });\n }\n\n private async getCollateralAmountHint(loanId: bigint): Promise<bigint> {\n const apiClient = this.requireApi(\"Simple loan collateral hint\");\n const response =\n await apiClient.get<V1SimpleLoanCollateralHintResponseWire>(\n buildSimpleLoanCollateralHintPath({ loanId })\n );\n\n return parseUnsignedApiBigint(response.collateralAmountHint, {\n context: SIMPLE_LOAN_WIRE_CONTEXT,\n label: \"collateral amount\",\n });\n }\n\n private async hydrateLoan(\n input: SimpleLoanHydrationInput\n ): Promise<SimpleLoan> {\n const profileId = input.profileId;\n const collateralPoolId = input.collateralPoolId;\n const borrowPoolId = input.borrowPoolId;\n const collateralAsset = input.collateralAsset;\n const borrowAsset = input.borrowAsset;\n\n const [\n depositTargetSet,\n repaymentTargetSet,\n collateralPosition,\n borrowPosition,\n borrowPoolRate,\n activeActivities,\n ] = await Promise.all([\n this.resolveSimpleLoanInflowTargets({\n profileId,\n poolId: collateralPoolId,\n action: SupplyAction.deposit,\n }),\n this.resolveSimpleLoanInflowTargets({\n profileId,\n poolId: borrowPoolId,\n action: SupplyAction.repayment,\n }),\n this.positions.getPosition(profileId, collateralPoolId),\n this.positions.getPosition(profileId, borrowPoolId),\n this.positions.market.getPoolRate(borrowPoolId),\n this.activities.list({ profileId, filter: ActivityFilter.active }),\n ]);\n\n const totalDebtAmount = calculateTotalDebtAmount(borrowPosition);\n const interestBufferAmount = calculateInterestBufferAmount(\n borrowPosition,\n borrowPoolRate.borrowRate\n );\n\n const currentCollateralAmount = collateralPosition?.deposited ?? 0n;\n\n const collateralAmount = input.collateralAmount;\n const collateralDecimals =\n collateralPosition?.depositedDecimals ??\n getAssetNativeDecimals(collateralAsset);\n const collateralInterestAmount = collateralPosition?.earnedInterest ?? 0n;\n\n const borrowedAmount = borrowPosition?.borrowed ?? 0n;\n const borrowedDecimals =\n borrowPosition?.borrowedDecimals ?? getAssetNativeDecimals(borrowAsset);\n\n const debtInterestAmount = borrowPosition?.debtInterest ?? 0n;\n\n const status = deriveSimpleLoanStatus({\n started: input.started,\n depositDetectedTimestamp: input.depositDetectedTimestamp,\n expiryTimestamp: input.expiryTimestamp,\n collateralAmount: currentCollateralAmount,\n totalDebtAmount,\n activeActivities,\n });\n\n const initialDeposit = await this.createInitialDepositQuote({\n collateralAmount,\n decimals: collateralDecimals,\n asset: collateralAsset,\n targets: depositTargetSet.targets,\n detectedTimestamp: input.depositDetectedTimestamp,\n expiryTimestamp: input.expiryTimestamp,\n });\n\n const repaymentTargets = await this.createRepaymentTargetQuotes({\n baseRepaymentAmount: totalDebtAmount + interestBufferAmount,\n asset: borrowAsset,\n targets: repaymentTargetSet.targets,\n });\n\n const repayment = {\n decimals: borrowedDecimals,\n debtAmount: totalDebtAmount,\n interestBufferAmount,\n interestBufferSeconds: REPAYMENT_BUFFER_SECONDS,\n asset: borrowAsset,\n targets: repaymentTargets,\n };\n const borrowIdentifier = getSimpleLoanAssetIdentifier(\n borrowAsset,\n input.borrowChain,\n \"borrow\"\n );\n\n return {\n loanId: input.loanId,\n ref: publicIdFromInt(input.loanId),\n status,\n profileId,\n terms: {\n ltvMaxBps: input.ltvMaxBps,\n depositWindowSeconds: input.depositWindowSeconds,\n },\n collateral: {\n asset: collateralAsset,\n poolId: collateralPoolId,\n decimals: collateralDecimals,\n amount: collateralAmount,\n },\n borrow: {\n ...borrowIdentifier,\n poolId: borrowPoolId,\n decimals: borrowedDecimals,\n amount: input.borrowAmount,\n destination: input.borrowDestination,\n },\n refundDestination: input.refundDestination,\n initialDeposit,\n repayment,\n position: {\n collateralAmount: currentCollateralAmount,\n collateralDecimals,\n collateralInterestAmount,\n borrowedAmount,\n borrowedDecimals,\n debtInterestAmount,\n totalDebtAmount,\n },\n };\n }\n\n private async createInitialDepositQuote(\n input: SimpleLoanInitialDepositQuoteInput\n ): Promise<SimpleLoanInitialDeposit> {\n const targets: Partial<Record<Chain, SimpleLoanInitialDepositTargetQuote>> =\n {};\n\n for (const chain of SIMPLE_LOAN_CHAINS) {\n const target = input.targets[chain];\n if (!target) continue;\n assertTargetAsset(target, input.asset);\n\n const inflowFee = await this.lending.estimateInflowFee(target);\n targets[chain] = {\n amount: input.collateralAmount + inflowFee.totalFee,\n inflowFeeAmount: inflowFee.totalFee,\n target,\n };\n }\n\n return {\n decimals: input.decimals,\n collateralAmount: input.collateralAmount,\n asset: input.asset,\n targets,\n detectedTimestamp: input.detectedTimestamp,\n expiryTimestamp: input.expiryTimestamp,\n };\n }\n\n private async resolveSimpleLoanInflowTargets(\n request: ResolveSimpleLoanInflowTargetsRequest\n ): Promise<ResolvedSimpleLoanInflowTargets> {\n const selectedPool = await getPoolById(\n this.canisterContext,\n request.poolId\n );\n const baseRequest = {\n profileId: request.profileId,\n poolId: request.poolId,\n action: request.action,\n mechanism: SupplyPlanType.transfer,\n };\n const poolChainTarget = await resolveSupplyTargetForPool(\n this.canisterContext,\n baseRequest,\n selectedPool\n );\n const poolChain = poolChainTarget.chain;\n const targets: Partial<Record<Chain, SupplyTarget>> = {\n [poolChain]: poolChainTarget,\n };\n\n if (poolChain === CoreChain.ICP) {\n return { targets };\n }\n\n const icpTarget = await resolveSupplyTargetForPool(\n this.canisterContext,\n { ...baseRequest, chain: CoreChain.ICP },\n selectedPool\n );\n\n targets[CoreChain.ICP] = icpTarget;\n return { targets };\n }\n\n private async createRepaymentTargetQuotes(input: {\n baseRepaymentAmount: bigint;\n asset: SimpleLoanAsset;\n targets: Partial<Record<Chain, SupplyTarget>>;\n }): Promise<Partial<Record<Chain, SimpleLoanRepaymentTargetQuote>>> {\n const quotes: Partial<Record<Chain, SimpleLoanRepaymentTargetQuote>> = {};\n\n for (const chain of SIMPLE_LOAN_CHAINS) {\n const target = input.targets[chain];\n if (!target) continue;\n assertTargetAsset(target, input.asset);\n\n const repaymentInflowFee =\n input.baseRepaymentAmount > 0n\n ? await this.estimateRepaymentInflowFee(target)\n : { totalFee: 0n, estimateAvailable: false };\n\n quotes[chain] = {\n amount: input.baseRepaymentAmount + repaymentInflowFee.totalFee,\n inflowFeeAmount: repaymentInflowFee.totalFee,\n inflowFeeEstimateAvailable: repaymentInflowFee.estimateAvailable,\n target,\n };\n }\n\n return quotes;\n }\n\n private async estimateRepaymentInflowFee(\n target: SupplyTarget\n ): Promise<RepaymentInflowFeeEstimate> {\n try {\n const fee = await this.lending.estimateInflowFee(target);\n return { totalFee: fee.totalFee, estimateAvailable: true };\n } catch {\n return {\n totalFee: getRepaymentInflowFeeFallback(target.asset, target.chain),\n estimateAvailable: false,\n };\n }\n }\n\n private requireApi(action: string): ApiClient {\n if (!this.apiClient) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n `${action} requires an API client`\n );\n }\n\n return this.apiClient;\n }\n\n private async validateSimpleLoanLtvPolicy(\n request: CreateSimpleLoanRequest\n ): Promise<void> {\n const ltvCalculation = await this.calculateSimpleLoanLtv(request);\n\n if (request.ltvMaxBps < ltvCalculation.minLtvMaxBps) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n `Simple loan max LTV ${formatBpsAsPercent(request.ltvMaxBps)} is below minimum allowed ${formatBpsAsPercent(ltvCalculation.minLtvMaxBps)} (current implied LTV ${formatBpsAsPercent(ltvCalculation.ltvBps)} + ${formatBpsAsPercent(SIMPLE_LOAN_MIN_SLIPPAGE_BUFFER_BPS)} buffer)`\n );\n }\n\n if (request.ltvMaxBps > ltvCalculation.maxLtvMaxBps) {\n throw new LiquidiumError(\n LiquidiumErrorCode.MAX_LTV_EXCEEDED,\n `Simple loan max LTV ${formatBpsAsPercent(request.ltvMaxBps)} exceeds collateral pool max ${formatBpsAsPercent(ltvCalculation.maxLtvMaxBps)}`\n );\n }\n }\n\n private async calculateSimpleLoanLtv(\n request: CreateSimpleLoanRequest\n ): Promise<SimpleLoanLtvPolicy> {\n const [pools, assetPrices] = await Promise.all([\n this.positions.market.listPools(),\n this.positions.market.getAssetPrices(),\n ]);\n const collateralPool = pools.find(\n (pool) => pool.id === request.collateral.poolId\n );\n const borrowPool = pools.find((pool) => pool.id === request.borrow.poolId);\n\n if (collateralPool && collateralPool.asset !== request.collateral.asset) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n \"Simple loan collateral asset does not match its pool\"\n );\n }\n\n if (borrowPool && borrowPool.asset !== request.borrow.asset) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n \"Simple loan borrow asset does not match its pool\"\n );\n }\n\n const ltvCalculation = new QuoteModule().calculateLtv(\n {\n borrowAmount: request.borrow.amount,\n borrowPoolId: request.borrow.poolId,\n collateralAmount: request.collateral.amount,\n collateralPoolId: request.collateral.poolId,\n },\n pools,\n assetPrices\n );\n\n if (ltvCalculation.validationErrors.length > 0) {\n throwLtvCalculationError(ltvCalculation.validationErrors[0]);\n }\n\n const minLtvMaxBps =\n ltvCalculation.ltvBps + SIMPLE_LOAN_MIN_SLIPPAGE_BUFFER_BPS;\n\n return {\n ltvBps: ltvCalculation.ltvBps,\n minLtvMaxBps,\n maxLtvMaxBps: ltvCalculation.maxAllowedLtvBps,\n };\n }\n}\n\nfunction getRepaymentInflowFeeFallback(\n asset: SimpleLoanAsset,\n chain: Chain\n): bigint {\n if (chain === \"ETH\" && (asset === \"USDT\" || asset === \"USDC\")) {\n return ETH_STABLECOIN_INFLOW_FEE_FALLBACK;\n }\n\n return 0n;\n}\n\nfunction assertTargetAsset(\n target: SupplyTarget,\n expectedAsset: SimpleLoanAsset\n): void {\n if (target.asset === expectedAsset) {\n return;\n }\n\n throw new LiquidiumError(\n LiquidiumErrorCode.INTERNAL,\n `Simple loan pool target asset ${target.asset} does not match ${expectedAsset}`\n );\n}\n\nfunction calculateInterestBufferAmount(\n borrowPosition: Position | null,\n annualBorrowRate: bigint\n): bigint {\n const totalDebtAmount = calculateTotalDebtAmount(borrowPosition);\n if (totalDebtAmount <= 0n || annualBorrowRate <= 0n) {\n return 0n;\n }\n\n const interestBuffer =\n (totalDebtAmount * annualBorrowRate * REPAYMENT_BUFFER_SECONDS) /\n RATE_SCALE /\n SECONDS_PER_YEAR;\n\n return interestBuffer > 1n ? interestBuffer : 1n;\n}\n\nfunction calculateTotalDebtAmount(borrowPosition: Position | null): bigint {\n if (!borrowPosition) {\n return 0n;\n }\n\n return borrowPosition.borrowed + borrowPosition.debtInterest;\n}\n\nfunction deriveSimpleLoanStatus(\n input: DeriveSimpleLoanStatusInput\n): LiquidiumStatus {\n const activeActivityStatus = deriveActiveSimpleLoanActivityStatus(input);\n if (activeActivityStatus) {\n return activeActivityStatus;\n }\n\n if (input.totalDebtAmount > 0n) {\n return createLiquidiumStatus({\n operation: \"repayment\",\n state: \"active\",\n });\n }\n\n if (input.started) {\n return createLiquidiumStatus({\n operation: \"repayment\",\n state: \"completed\",\n });\n }\n\n if (isSimpleLoanDepositExpired(input)) {\n return createLiquidiumStatus({\n operation: \"deposit\",\n state: \"expired\",\n });\n }\n\n if (input.collateralAmount > 0n) {\n return createLiquidiumStatus({\n operation: \"deposit\",\n state: \"processing\",\n });\n }\n\n if (input.depositDetectedTimestamp !== null) {\n return createLiquidiumStatus({\n operation: \"deposit\",\n state: \"confirming\",\n });\n }\n\n return createLiquidiumStatus({\n operation: \"deposit\",\n state: \"action_required\",\n });\n}\n\nfunction deriveActiveSimpleLoanActivityStatus(\n input: DeriveSimpleLoanStatusInput\n): LiquidiumStatus | null {\n if (!input.started) {\n return findActiveActivityStatus(input.activeActivities, \"deposit\");\n }\n\n const borrowStatus = findActiveActivityStatus(\n input.activeActivities,\n \"borrow\"\n );\n if (borrowStatus) {\n return borrowStatus;\n }\n\n return findActiveActivityStatus(input.activeActivities, \"repayment\");\n}\n\nfunction findActiveActivityStatus(\n activities: Activity[],\n operation: LiquidiumStatus[\"operation\"]\n): LiquidiumStatus | null {\n const activity = activities.find(\n (candidate) => candidate.status.operation === operation\n );\n\n return activity?.status ?? null;\n}\n\nfunction isSimpleLoanDepositExpired(\n input: DeriveSimpleLoanStatusInput\n): boolean {\n if (input.started || input.depositDetectedTimestamp === null) {\n return false;\n }\n\n if (input.expiryTimestamp === null) {\n return false;\n }\n\n return input.expiryTimestamp <= getCurrentUnixTimestampSeconds();\n}\n\nfunction getCurrentUnixTimestampSeconds(): bigint {\n return BigInt(Math.floor(Date.now() / MILLISECONDS_PER_SECOND));\n}\n\nfunction deriveDepositExpiryTimestamp(\n input: DeriveDepositExpiryTimestampInput\n): bigint | null {\n if (input.depositDetectedTimestamp === null) {\n return null;\n }\n\n return input.depositDetectedTimestamp + input.depositWindowSeconds;\n}\n\nfunction validateCreateRequest(request: CreateSimpleLoanRequest): void {\n getSimpleLoanAssetIdentifier(\n request.borrow.asset,\n request.borrow.chain,\n \"borrow\"\n );\n getSimpleLoanAssetIdentifier(\n request.collateral.asset,\n request.refund.chain,\n \"refund\"\n );\n\n if (request.collateral.amount <= 0n) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n \"Simple loan collateral amount must be greater than zero\"\n );\n }\n if (request.borrow.amount <= 0n) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n \"Simple loan borrow amount must be greater than zero\"\n );\n }\n if (request.ltvMaxBps <= 0n) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n \"Simple loan max LTV must be greater than zero\"\n );\n }\n if (request.depositWindowSeconds <= 0n) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n \"Simple loan deposit window must be greater than zero seconds\"\n );\n }\n}\n\nfunction throwLtvCalculationError(\n error: LtvCalculationErrorDetails | undefined\n): never {\n throw new LiquidiumError(\n error?.code === QuoteValidationErrorCode.POOL_NOT_FOUND\n ? LiquidiumErrorCode.POOL_NOT_FOUND\n : LiquidiumErrorCode.VALIDATION_ERROR,\n error?.message ?? \"Unable to calculate simple loan LTV\"\n );\n}\n\nfunction inferSimpleLoanDeliveryChain(\n destination: SimpleLoanAccount,\n asset: SimpleLoanAsset\n): Chain {\n if (destination.type !== \"ChainAddress\") {\n return CoreChain.ICP;\n }\n\n if (asset === CoreAsset.BTC) {\n return CoreChain.BTC;\n }\n\n if (asset === CoreAsset.USDC || asset === CoreAsset.USDT) {\n return CoreChain.ETH;\n }\n\n return CoreChain.ICP;\n}\n\nfunction resolveSimpleLoanDestination(\n params: ResolveSimpleLoanDestinationParams\n): SimpleLoanApiAccountType {\n getSimpleLoanAssetIdentifier(params.asset, params.chain, params.role);\n\n if (typeof params.destination === \"string\") {\n return resolveSimpleLoanStringDestination({\n destination: params.destination,\n asset: params.asset,\n role: params.role,\n chain: params.chain,\n normalizeExternalDestination: params.normalizeExternalDestination,\n });\n }\n\n assertSimpleLoanDestinationTypeMatchesChain({\n destinationType: params.destination.type,\n asset: params.asset,\n role: params.role,\n chain: params.chain,\n });\n\n switch (params.destination.type) {\n case \"ChainAddress\":\n assertExternalSimpleLoanDestinationSupported(params.asset);\n\n return {\n External: params.normalizeExternalDestination(\n normalizeSimpleLoanDestinationAddress(params.destination.address),\n params.asset,\n params.chain\n ),\n };\n case \"IcPrincipal\":\n return {\n Native: normalizeSimpleLoanPrincipal(\n normalizeSimpleLoanDestinationAddress(params.destination.address)\n ),\n };\n case \"IcpAccountIdentifier\":\n return parseAccountIdentifierSimpleLoanDestination(\n normalizeSimpleLoanDestinationAddress(params.destination.address)\n );\n case \"IcrcAccount\":\n return parseIcrcSimpleLoanDestination(\n normalizeSimpleLoanDestinationAddress(params.destination.address)\n );\n }\n}\n\nfunction resolveSimpleLoanStringDestination(params: {\n destination: string;\n asset: SimpleLoanAsset;\n role: SimpleLoanOutflowRole;\n chain: Chain;\n normalizeExternalDestination: ExternalDestinationNormalizer;\n}): SimpleLoanApiAccountType {\n const address = normalizeSimpleLoanDestinationAddress(params.destination);\n\n if (params.chain === CoreChain.ICP && params.asset !== CoreAsset.ICP) {\n try {\n return parsePrincipalSimpleLoanDestination(address);\n } catch {\n throwInvalidCkSimpleLoanDestination(params.role);\n }\n }\n\n if (params.chain !== CoreChain.ICP) {\n assertExternalSimpleLoanDestinationSupported(params.asset);\n\n return {\n External: params.normalizeExternalDestination(\n address,\n params.asset,\n params.chain\n ),\n };\n }\n\n for (const parser of [\n parseAccountIdentifierSimpleLoanDestination,\n parsePrincipalSimpleLoanDestination,\n parseIcrcSimpleLoanDestination,\n ]) {\n try {\n return parser(address);\n } catch {}\n }\n\n throwInvalidIcpSimpleLoanDestination();\n}\n\nfunction getSimpleLoanAssetIdentifier(\n asset: SimpleLoanAsset,\n chain: Chain,\n role: SimpleLoanOutflowRole\n): AssetIdentifier {\n const identifier = { asset, chain };\n if (isAssetIdentifier(identifier)) {\n return identifier;\n }\n\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n `${chain} simple loan ${role} delivery is not supported for ${asset}`\n );\n}\n\nfunction assertSimpleLoanDestinationTypeMatchesChain(params: {\n destinationType: Exclude<SimpleLoanDestination, string>[\"type\"];\n asset: SimpleLoanAsset;\n role: SimpleLoanOutflowRole;\n chain: Chain;\n}): void {\n if (params.chain === CoreChain.ICP && params.asset !== CoreAsset.ICP) {\n if (params.destinationType === \"IcPrincipal\") {\n return;\n }\n\n throwInvalidCkSimpleLoanDestination(params.role);\n }\n\n if (params.chain === CoreChain.ICP && params.asset === CoreAsset.ICP) {\n if (params.destinationType !== \"ChainAddress\") {\n return;\n }\n\n throwInvalidIcpSimpleLoanDestination();\n }\n\n if (params.destinationType === \"ChainAddress\") {\n return;\n }\n\n if (params.destinationType === \"IcPrincipal\") {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n `${params.chain} simple loan ${params.role} destination must be an external chain address for ${params.asset}`\n );\n }\n\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n `${params.asset} simple loan ${params.role} destination only supports ChainAddress or IcPrincipal destinations`\n );\n}\n\nfunction throwInvalidCkSimpleLoanDestination(\n role: SimpleLoanOutflowRole\n): never {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n `ICP simple loan ${role} destination must be an IC principal`\n );\n}\n\nfunction assertExternalSimpleLoanDestinationSupported(\n asset: SimpleLoanAsset\n): void {\n if (asset !== CoreAsset.ICP) {\n return;\n }\n\n throwInvalidIcpSimpleLoanDestination();\n}\n\nfunction throwInvalidIcpSimpleLoanDestination(): never {\n throw new LiquidiumError(\n LiquidiumErrorCode.INVALID_ADDRESS,\n \"ICP simple loan destination must be an IC principal, ICP account identifier, or ICRC account\"\n );\n}\n\nfunction parsePrincipalSimpleLoanDestination(\n address: string\n): SimpleLoanApiAccountType {\n return { Native: normalizeSimpleLoanPrincipal(address) };\n}\n\nfunction parseAccountIdentifierSimpleLoanDestination(\n address: string\n): SimpleLoanApiAccountType {\n if (address.length !== ICP_ACCOUNT_IDENTIFIER_HEX_LENGTH) {\n throw new LiquidiumError(\n LiquidiumErrorCode.INVALID_ADDRESS,\n \"Invalid ICP account identifier\"\n );\n }\n\n try {\n return { AccountIdentifier: normalizeIcpAccountIdentifier(address) };\n } catch {\n throw new LiquidiumError(\n LiquidiumErrorCode.INVALID_ADDRESS,\n \"Invalid ICP account identifier\"\n );\n }\n}\n\nfunction parseIcrcSimpleLoanDestination(\n address: string\n): SimpleLoanApiAccountType {\n let decoded: ReturnType<typeof decodeIcrcAccountAddress>;\n\n try {\n decoded = decodeIcrcAccountAddress(address);\n } catch {\n throw new LiquidiumError(\n LiquidiumErrorCode.INVALID_ADDRESS,\n \"Invalid simple loan ICRC destination\"\n );\n }\n\n return { Icrc: decoded.account.address };\n}\n\nfunction normalizeSimpleLoanPrincipal(address: string): string {\n try {\n return Principal.fromText(address).toText();\n } catch {\n throw new LiquidiumError(\n LiquidiumErrorCode.INVALID_ADDRESS,\n \"Invalid simple loan IC principal destination\"\n );\n }\n}\n\nfunction normalizeSimpleLoanDestinationAddress(address: string): string {\n const trimmedAddress = address.trim();\n\n if (!trimmedAddress) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n \"Simple loan account address must be non-empty\"\n );\n }\n\n return trimmedAddress;\n}\n\nfunction accountFromCanister(\n account: DecodedSimpleLoanCanisterRecord[\"borrow_destination\"]\n): SimpleLoanAccount {\n return mapCanisterAccountToLiquidiumAccount(account);\n}\n\nfunction mapSimpleLoanEvent(event: DecodedHeadlessLoanEvent): SimpleLoanEvent {\n return {\n id: event.id,\n schemaVersion: event.schema_version,\n timestamp: event.timestamp,\n eventType: mapSimpleLoanEventType(event.event_type),\n };\n}\n\nfunction mapSimpleLoanEventType(\n eventType: DecodedHeadlessLoanEventType\n): SimpleLoanEventType {\n if (\"LoanCreated\" in eventType) {\n const event = eventType.LoanCreated;\n return {\n type: \"LoanCreated\",\n loanId: event.loan_id,\n borrowDestination: accountFromCanister(event.borrow_destination),\n collateralAsset: parseSimpleLoanAsset(\n event.lend_asset,\n \"event collateral asset\"\n ),\n borrowAmount: event.borrow_amount,\n collateralPoolId: event.lend_pool_id.toText(),\n refundDestination: accountFromCanister(event.refund_destination),\n ltvMaxBps: event.ltv_max_bps,\n depositWindowSeconds: event.ltv_timer_s,\n profileId: event.lending_profile.toText(),\n borrowPoolId: event.borrow_pool_id.toText(),\n borrowAsset: parseSimpleLoanAsset(\n event.borrow_asset,\n \"event borrow asset\"\n ),\n };\n }\n\n if (\"FullLendWithdrawalRequested\" in eventType) {\n const event = eventType.FullLendWithdrawalRequested;\n return {\n type: \"FullLendWithdrawalRequested\",\n loanId: event.loan_id,\n account: accountFromCanister(event.account),\n poolId: event.pool_id.toText(),\n };\n }\n\n if (\"BorrowRequested\" in eventType) {\n const event = eventType.BorrowRequested;\n return {\n type: \"BorrowRequested\",\n loanId: event.loan_id,\n account: accountFromCanister(event.account),\n poolId: event.pool_id.toText(),\n amount: event.amount,\n };\n }\n\n if (\"DepositTimerExceeded\" in eventType) {\n return {\n type: \"DepositTimerExceeded\",\n loanId: eventType.DepositTimerExceeded.loan_id,\n };\n }\n\n if (\"StuckFundsWithdrawalRequested\" in eventType) {\n const event = eventType.StuckFundsWithdrawalRequested;\n return {\n type: \"StuckFundsWithdrawalRequested\",\n leg: legFromCanister(event.leg),\n loanId: event.loan_id,\n account: accountFromCanister(event.account),\n poolId: event.pool_id.toText(),\n amount: event.amount,\n };\n }\n\n if (\"ProfileWarmed\" in eventType) {\n const event = eventType.ProfileWarmed;\n return {\n type: \"ProfileWarmed\",\n derivationIndex: event.derivation_index,\n warmedProfileId: event.warmed_profile_id,\n ethAddress: event.eth_address,\n profileId: event.lending_profile.toText(),\n };\n }\n\n if (\"RepayComplete\" in eventType) {\n return {\n type: \"RepayComplete\",\n loanId: eventType.RepayComplete.loan_id,\n profileId: eventType.RepayComplete.lending_profile.toText(),\n };\n }\n\n return {\n type: \"DepositTimerStarted\",\n loanId: eventType.DepositTimerStarted.loan_id,\n timestamp: eventType.DepositTimerStarted.timestamp,\n };\n}\n\nfunction mapWarmedProfile(profile: WarmedProfile): SimpleLoanWarmedProfile {\n return {\n id: profile.id,\n authorization: authorizationFromCanister(profile.authorisation),\n createdAt: profile.created_at,\n profileId: profile.lending_profile.toText(),\n };\n}\n\nfunction authorizationFromCanister(\n authorization: SimpleLoanAuthorisation\n): SimpleLoanAuthorization {\n return {\n type: \"EthSignature\",\n derivationIndex: authorization.EthSignature.derivation_index,\n publicKey: authorization.EthSignature.pubkey,\n address: authorization.EthSignature.address,\n };\n}\n\nfunction legFromCanister(leg: SimpleLoanCanisterLeg): SimpleLoanLeg {\n return getVariantKey(leg) as SimpleLoanLeg;\n}\n\nfunction decodeRef(ref: string): bigint {\n try {\n return intFromPublicId(ref.trim());\n } catch (error) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n \"Invalid simple loan reference\",\n error\n );\n }\n}\n\nfunction validateSimpleLoanFindQuery(query: unknown): string {\n if (typeof query !== \"string\") {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n \"Simple loan find query must be a string\"\n );\n }\n\n const trimmedQuery = query.trim();\n if (!trimmedQuery) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n \"Simple loan find query must be non-empty\"\n );\n }\n if (trimmedQuery.length > SIMPLE_LOAN_FIND_QUERY_MAX_LENGTH) {\n throw new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n `Simple loan find query must be at most ${SIMPLE_LOAN_FIND_QUERY_MAX_LENGTH.toString()} characters`\n );\n }\n\n return trimmedQuery;\n}\n\nfunction uniqueSimpleLoanFindCandidates(\n candidates: SimpleLoanFindCandidate[]\n): SimpleLoanFindCandidate[] {\n const candidatesByLoanId = new Map<bigint, SimpleLoanFindCandidate>();\n\n for (const candidate of candidates) {\n if (!candidatesByLoanId.has(candidate.loanId)) {\n candidatesByLoanId.set(candidate.loanId, candidate);\n }\n }\n\n return [...candidatesByLoanId.values()];\n}\n\nfunction mapCandidateWire(\n wire: SimpleLoanFindCandidateWire\n): SimpleLoanFindCandidate {\n return {\n loanId: parseUnsignedApiBigint(wire.loan_id, {\n context: SIMPLE_LOAN_WIRE_CONTEXT,\n label: \"loan ID\",\n }),\n ref: parseNonEmptyApiString(wire.short_ref, {\n context: SIMPLE_LOAN_WIRE_CONTEXT,\n label: \"short reference\",\n }),\n createdAt: parseIsoApiTimestampToUnixSeconds(wire.created_at, {\n context: SIMPLE_LOAN_WIRE_CONTEXT,\n label: \"creation timestamp\",\n }),\n collateral: {\n poolId: parseNonEmptyApiString(wire.lend_pool_ic_id, {\n context: SIMPLE_LOAN_WIRE_CONTEXT,\n label: \"lend pool ID\",\n }),\n asset: parseApiStringUnion(wire.lend_asset, SIMPLE_LOAN_ASSETS, {\n context: SIMPLE_LOAN_WIRE_CONTEXT,\n label: \"lend asset\",\n }),\n amount: parseUnsignedApiBigint(wire.collateral_amount, {\n context: SIMPLE_LOAN_WIRE_CONTEXT,\n label: \"collateral amount\",\n }),\n },\n borrow: {\n poolId: parseNonEmptyApiString(wire.borrow_pool_ic_id, {\n context: SIMPLE_LOAN_WIRE_CONTEXT,\n label: \"borrow pool ID\",\n }),\n asset: parseApiStringUnion(wire.borrow_asset, SIMPLE_LOAN_ASSETS, {\n context: SIMPLE_LOAN_WIRE_CONTEXT,\n label: \"borrow asset\",\n }),\n },\n profileId: parseNonEmptyApiString(wire.profile, {\n context: SIMPLE_LOAN_WIRE_CONTEXT,\n label: \"profile ID\",\n }),\n };\n}\n\nfunction parseSimpleLoanAsset(value: string, label: string): SimpleLoanAsset {\n return parseApiStringUnion(value, SIMPLE_LOAN_ASSETS, {\n context: SIMPLE_LOAN_WIRE_CONTEXT,\n label,\n });\n}\n\nfunction mapSimpleLoansErrorToLiquidiumError(\n error: SimpleLoansCanisterError\n): LiquidiumError {\n const [key, payload] = Object.entries(error)[0] as [string, unknown];\n\n switch (key) {\n case \"LoanNotFound\":\n case \"NoCollateralPosition\":\n return new LiquidiumError(\n LiquidiumErrorCode.POSITION_NOT_FOUND,\n stringifyErrorPayload(payload)\n );\n case \"LtvMaxExceeded\":\n case \"LtvMaxOutOfRange\":\n return new LiquidiumError(\n LiquidiumErrorCode.MAX_LTV_EXCEEDED,\n stringifyErrorPayload(payload)\n );\n case \"LtvTimerOutOfRange\":\n case \"InvalidLtvTimerS\":\n return new LiquidiumError(\n LiquidiumErrorCode.VALIDATION_ERROR,\n stringifyErrorPayload(payload) ?? key\n );\n case \"AccountRequired\":\n return new LiquidiumError(\n LiquidiumErrorCode.INVALID_ADDRESS,\n stringifyErrorPayload(payload)\n );\n case \"BorrowAmountRequired\":\n return new LiquidiumError(\n LiquidiumErrorCode.BORROW_CAP_EXCEEDED,\n stringifyErrorPayload(payload)\n );\n case \"AuthorizationFailed\":\n case \"UnauthorizedAccessListCaller\":\n return new LiquidiumError(\n LiquidiumErrorCode.NOT_ALLOWED,\n stringifyErrorPayload(payload)\n );\n default:\n return new LiquidiumError(\n LiquidiumErrorCode.INTERNAL,\n stringifyErrorPayload(payload) ?? key\n );\n }\n}\n\nfunction stringifyErrorPayload(payload: unknown): string | undefined {\n if (payload === null || payload === undefined) return undefined;\n if (typeof payload === \"string\") return payload;\n\n return JSON.stringify(payload, (_key, value) => {\n if (typeof value === \"bigint\") return value.toString();\n if (value && typeof value === \"object\" && \"toText\" in value) {\n return (value as { toText: () => string }).toText();\n }\n\n return value;\n });\n}\n\nfunction formatBpsAsPercent(value: bigint): string {\n const sign = value < 0n ? \"-\" : \"\";\n const absoluteValue = value < 0n ? -value : value;\n const wholePart = absoluteValue / 100n;\n const fractionalPart = (absoluteValue % 100n).toString().padStart(2, \"0\");\n\n return `${sign}${wholePart.toString()}.${fractionalPart}%`;\n}\n","import { createPublicClient, http } from \"viem\";\nimport { mainnet } from \"viem/chains\";\nimport {\n DEFAULT_API_BASE_URL,\n DEFAULT_ENVIRONMENT,\n DEFAULT_TIMEOUT_MS,\n resolveCanisterIds,\n} from \"./core/config\";\nimport type { ApiClient } from \"./core/transports/api-client\";\nimport { createApiClient } from \"./core/transports/api-client\";\nimport type { CanisterContext } from \"./core/transports/canister-context\";\nimport { createCanisterContext } from \"./core/transports/canister-context\";\nimport type { EvmReadClient, LiquidiumClientConfig } from \"./core/types\";\nimport { AccountsModule } from \"./modules/accounts\";\nimport { ActivitiesModule } from \"./modules/activities\";\nimport { HistoryModule } from \"./modules/history\";\nimport { LendingModule } from \"./modules/lending\";\nimport { MarketModule } from \"./modules/market\";\nimport { PositionsModule } from \"./modules/positions\";\nimport { QuoteModule } from \"./modules/quote\";\nimport { SimpleLoansModule } from \"./modules/simple-loans\";\n\n/**\n * Root client for Liquidium protocol integration (canister + optional HTTP API).\n *\n * Construct with `new LiquidiumClient(config)`.\n */\nexport class LiquidiumClient {\n /** Profile lifecycle: create, resolve, linked wallets. */\n readonly accounts: AccountsModule;\n /** Borrow, withdraw, supply, inflow reporting and tracking. */\n readonly lending: LendingModule;\n /** Per-pool positions, health, aggregate stats. */\n readonly positions: PositionsModule;\n /** Pool list, prices, pool rate lookups. */\n readonly market: MarketModule;\n /** Receipt-oriented activity status and activity lists. */\n readonly activities: ActivitiesModule;\n /** Pool and user history through the Liquidium SDK API. */\n readonly history: HistoryModule;\n /** Accountless Simple Loans backed by generated deposit/repay targets. */\n readonly simpleLoans: SimpleLoansModule;\n /** Pure quote helpers from market inputs. */\n readonly quote: QuoteModule;\n\n private readonly canisterContext: CanisterContext;\n private readonly apiClient: ApiClient | undefined;\n private readonly evmReadClient: EvmReadClient | undefined;\n\n /**\n * Creates a Liquidium SDK client.\n *\n * @param config - Runtime transport, canister, API, identity, and EVM read options.\n */\n constructor(config: LiquidiumClientConfig = {}) {\n const environment = config.environment ?? DEFAULT_ENVIRONMENT;\n const canisterIds = resolveCanisterIds(environment, config.canisterIds);\n const timeoutMs = config.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n this.canisterContext = createCanisterContext({\n icHost: config.icHost,\n identity: config.identity,\n canisterIds,\n });\n\n this.apiClient = createApiClient({\n baseUrl: config.apiBaseUrl ?? DEFAULT_API_BASE_URL,\n headers: config.headers,\n fetchFn: config.fetch,\n timeoutMs,\n });\n\n this.evmReadClient = resolveEvmReadClient(config);\n\n this.accounts = new AccountsModule(this.canisterContext);\n this.lending = new LendingModule(\n this.canisterContext,\n this.apiClient,\n this.evmReadClient\n );\n this.market = new MarketModule(this.canisterContext);\n this.positions = new PositionsModule(this.canisterContext, this.market);\n this.activities = new ActivitiesModule(\n this.apiClient,\n this.canisterContext\n );\n this.history = new HistoryModule(this.apiClient);\n this.simpleLoans = new SimpleLoansModule(\n this.canisterContext,\n this.apiClient,\n this.activities,\n this.lending,\n this.positions\n );\n this.quote = new QuoteModule();\n }\n}\n\nfunction resolveEvmReadClient(\n config: LiquidiumClientConfig\n): EvmReadClient | undefined {\n if (config.evmPublicClient) {\n return config.evmPublicClient;\n }\n\n if (!config.evmRpcUrl) {\n return undefined;\n }\n\n return createPublicClient({\n chain: mainnet,\n transport: http(config.evmRpcUrl, {\n fetchOptions: config.evmRpcHeaders\n ? { headers: config.evmRpcHeaders }\n : undefined,\n }),\n });\n}\n"]}
|