@cashie/core-lib 1.0.0

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.
Files changed (68) hide show
  1. package/README.md +9 -0
  2. package/dist/abi/abi.d.ts +2620 -0
  3. package/dist/abi/index.d.ts +1 -0
  4. package/dist/backend/auth/index.d.ts +4 -0
  5. package/dist/backend/auth/jwt.types.d.ts +3 -0
  6. package/dist/backend/auth/ocap/ocap-build.d.ts +35 -0
  7. package/dist/backend/auth/ocap/ocap-types.d.ts +87 -0
  8. package/dist/backend/auth/siwe.types.d.ts +18 -0
  9. package/dist/backend/blockchain/index.d.ts +1 -0
  10. package/dist/backend/blockchain/types.d.ts +11 -0
  11. package/dist/backend/contracts/badge.types.d.ts +25 -0
  12. package/dist/backend/contracts/balance.types.d.ts +32 -0
  13. package/dist/backend/contracts/event.types.d.ts +34 -0
  14. package/dist/backend/contracts/index.d.ts +4 -0
  15. package/dist/backend/contracts/receipt.types.d.ts +55 -0
  16. package/dist/backend/index.d.ts +4 -0
  17. package/dist/backend/tx-tracking/index.d.ts +1 -0
  18. package/dist/backend/tx-tracking/types.d.ts +41 -0
  19. package/dist/client/index.d.ts +2 -0
  20. package/dist/client/payment-client.d.ts +30 -0
  21. package/dist/client/schemas.d.ts +55 -0
  22. package/dist/client/types.d.ts +163 -0
  23. package/dist/data/cashieDataUrl.d.ts +79 -0
  24. package/dist/data/encoder.d.ts +130 -0
  25. package/dist/data/index.d.ts +3 -0
  26. package/dist/data/types.d.ts +116 -0
  27. package/dist/erc-7715/common.types.d.ts +37 -0
  28. package/dist/erc-7715/index.d.ts +4 -0
  29. package/dist/erc-7715/permission/index.d.ts +2 -0
  30. package/dist/erc-7715/permission/schemas.d.ts +172 -0
  31. package/dist/erc-7715/permission/types.d.ts +27 -0
  32. package/dist/erc-7715/request/index.d.ts +2 -0
  33. package/dist/erc-7715/request/schemas.d.ts +260 -0
  34. package/dist/erc-7715/request/types.d.ts +47 -0
  35. package/dist/erc-7715/rules/index.d.ts +2 -0
  36. package/dist/erc-7715/rules/schemas.d.ts +76 -0
  37. package/dist/erc-7715/rules/types.d.ts +26 -0
  38. package/dist/identity/cashieIdentitySoulTypedData.d.ts +65 -0
  39. package/dist/identity/encoder.d.ts +24 -0
  40. package/dist/identity/index.d.ts +5 -0
  41. package/dist/identity/issuer/error/index.d.ts +1 -0
  42. package/dist/identity/issuer/error/plaidIdvErrors.d.ts +24 -0
  43. package/dist/identity/issuer/identity-issuer.d.ts +30 -0
  44. package/dist/identity/issuer/index.d.ts +3 -0
  45. package/dist/identity/issuer/types.d.ts +35 -0
  46. package/dist/identity/soul/index.d.ts +1 -0
  47. package/dist/identity/soul/soulManager.d.ts +63 -0
  48. package/dist/identity/types.d.ts +196 -0
  49. package/dist/index.cjs +2 -0
  50. package/dist/index.cjs.map +7 -0
  51. package/dist/index.d.ts +10 -0
  52. package/dist/index.mjs +2 -0
  53. package/dist/index.mjs.map +7 -0
  54. package/dist/intent/encoder.d.ts +22 -0
  55. package/dist/intent/index.d.ts +2 -0
  56. package/dist/intent/types.d.ts +88 -0
  57. package/dist/router/index.d.ts +1 -0
  58. package/dist/router/types.d.ts +12 -0
  59. package/dist/shared/either.d.ts +68 -0
  60. package/dist/shared/errorCode.d.ts +115 -0
  61. package/dist/shared/index.d.ts +3 -0
  62. package/dist/shared/types/eip-7702.types.d.ts +21 -0
  63. package/dist/shared/types/index.d.ts +3 -0
  64. package/dist/shared/types/payment-protocol.types.d.ts +17 -0
  65. package/dist/shared/types/rpc.types.d.ts +14 -0
  66. package/dist/utils/index.d.ts +1 -0
  67. package/dist/utils/utils.d.ts +17 -0
  68. package/package.json +67 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/identity/types.ts", "../src/identity/encoder.ts", "../src/identity/cashieIdentitySoulTypedData.ts", "../src/identity/issuer/types.ts", "../src/utils/utils.ts", "../src/identity/issuer/identity-issuer.ts", "../src/identity/issuer/error/plaidIdvErrors.ts", "../src/identity/soul/soulManager.ts", "../src/data/types.ts", "../src/erc-7715/rules/schemas.ts", "../src/erc-7715/common.types.ts", "../src/data/encoder.ts", "../src/data/cashieDataUrl.ts", "../src/client/payment-client.ts", "../src/client/schemas.ts", "../src/erc-7715/request/schemas.ts", "../src/erc-7715/permission/schemas.ts", "../src/intent/types.ts", "../src/intent/encoder.ts", "../src/abi/abi.ts", "../src/backend/tx-tracking/types.ts", "../src/backend/auth/ocap/ocap-build.ts", "../src/backend/auth/siwe.types.ts", "../src/backend/auth/ocap/ocap-types.ts", "../src/shared/errorCode.ts", "../src/shared/either.ts", "../src/shared/types/rpc.types.ts", "../src/shared/types/payment-protocol.types.ts"],
4
+ "sourcesContent": ["import type { Address, Hex } from 'viem'\n\n/**\n * Mirrors the onchain `IdentityType` enum.\n */\nexport const IdentityType = {\n /**\n * Identity soul issued to an individual\n */\n Individual: 0,\n /**\n * Identity soul issued to a business\n */\n Business: 1,\n} as const\n\nexport type IdentityType = (typeof IdentityType)[keyof typeof IdentityType]\n\n/**\n * Mirrors `IERC5484.BurnAuth` onchain enum.\n */\nexport const BurnAuth = {\n /**\n * Only the issuer can burn the identity token\n */\n IssuerOnly: 0,\n /**\n * Only the owner can burn the identity token\n */\n OwnerOnly: 1,\n /**\n * Both the issuer and the owner can burn the identity token\n */\n Both: 2,\n /**\n * Neither the issuer nor the owner can burn the identity token\n */\n Neither: 3,\n} as const\n\nexport type BurnAuth = (typeof BurnAuth)[keyof typeof BurnAuth]\n\n/** Must match `CashieIdentitySoul.NAME` */\nexport const CASHIE_IDENTITY_SOUL_EIP712_NAME = 'CashieIdentitySoul' as const\n\n/** Must match `CashieIdentitySoul.DOMAIN_VERSION` */\nexport const CASHIE_IDENTITY_SOUL_EIP712_VERSION = '1' as const\n\n/**\n * Issuer / Identity Verification Prover primary type (`IDENTITY_MINT_PAYLOAD_TYPEHASH`).\n */\nexport const PRIMARY_TYPE_IDENTITY_MINT_PAYLOAD = 'IdentityMintPayload' as const\n\n/**\n * Recipient consent primary type (`IDENTITY_MINT_CONSENT_TYPEHASH`).\n */\nexport const PRIMARY_TYPE_IDENTITY_MINT_CONSENT = 'IdentityMintConsent' as const\n\n/**\n * Exact EIP-712 struct type string hashed into `IDENTITY_MINT_PAYLOAD_TYPEHASH`\n * (issuer proof; excludes `proof` and `signature`).\n */\nexport const IDENTITY_MINT_PAYLOAD_EIP712_TYPE_STRING =\n 'IdentityMintPayload(uint8 identityType,string domain,uint8 burnAuth,bytes identityCommitment,address to)' as const\n\n/**\n * Exact EIP-712 struct type string hashed into `IDENTITY_MINT_CONSENT_TYPEHASH`\n * (recipient consent; includes `proof`, excludes `signature`).\n */\nexport const IDENTITY_MINT_CONSENT_EIP712_TYPE_STRING =\n 'IdentityMintConsent(uint8 identityType,string domain,uint8 burnAuth,bytes identityCommitment,address to,bytes proof)' as const\n\n/**\n * EIP-712 type definitions for issuer / Identity Verification Prover proof signing.\n */\nexport const IDENTITY_MINT_PAYLOAD_EIP712_TYPES = {\n IdentityMintPayload: [\n { name: 'identityType', type: 'uint8' },\n { name: 'domain', type: 'string' },\n { name: 'burnAuth', type: 'uint8' },\n { name: 'identityCommitment', type: 'bytes' },\n { name: 'to', type: 'address' },\n ],\n} as const\n\n/**\n * EIP-712 type definitions for recipient mint consent (binds issuer `proof`).\n * Field names and order must match {@link IDENTITY_MINT_CONSENT_EIP712_TYPE_STRING}\n * and `IdentitySoulEncoderLib.hashIdentityMintConsent` in `packages/contracts`.\n */\nexport const IDENTITY_MINT_EIP712_TYPES = {\n IdentityMintConsent: [\n { name: 'identityType', type: 'uint8' },\n { name: 'domain', type: 'string' },\n { name: 'burnAuth', type: 'uint8' },\n { name: 'identityCommitment', type: 'bytes' },\n { name: 'to', type: 'address' },\n { name: 'proof', type: 'bytes' },\n ],\n} as const\n\n/**\n * The commitment is a hex string of the commitment bytes.\n * <provider>-<account>\n */\nexport type CashieIdentityCommitment = `0x${string}-${string}`\n\n/**\n * Payload fields the recipient signs as `IdentityMintConsent` (excludes `signature`).\n * Includes issuer `proof` so consent is bound to the verification proof.\n */\nexport type IdentityMintSignPayload = {\n /**\n * The on-chain identity type (`Individual` or `Business`).\n */\n identityType: IdentityType\n /**\n * Site hostname without scheme (e.g. `merchant.example.com`).\n * Empty for `Individual`; non-empty for `Business`.\n */\n domain: string\n /**\n * The burn authorization of the identity token(ie. who can burn the identity token)\n */\n burnAuth: BurnAuth\n /**\n * Hash over provider id and account, such as `<provider>-<account>`\n */\n identityCommitment: Hex\n /**\n * The address of the recipient of the identity mint\n */\n to: Address\n /**\n * Issuer EIP-1271 proof (ECDSA from an Identity Verification Prover).\n */\n proof: Hex\n}\n\n/**\n * Fields the Identity Verification Prover signs as `IdentityMintPayload` (excludes `proof` / `signature`).\n */\nexport type IdentityMintProofSignPayload = Omit<\n IdentityMintSignPayload,\n 'proof'\n>\n\n/**\n * The identity mint sign payload with recipient consent signature.\n */\nexport type IdentityMintSignPayloadWithSignature = IdentityMintSignPayload & {\n /**\n * Recipient EIP-1271 consent signature over `IdentityMintConsent` (includes `proof`).\n */\n signature: Hex\n}\n\n/**\n * EIP-712 domain for `CashieIdentitySoul` (`EIP712(NAME, DOMAIN_VERSION)`).\n */\nexport type CashieIdentitySoulEip712Domain = {\n name: typeof CASHIE_IDENTITY_SOUL_EIP712_NAME\n version: typeof CASHIE_IDENTITY_SOUL_EIP712_VERSION\n chainId: bigint\n verifyingContract: Address\n}\n\n/**\n * Typed-data parameters returned by `buildIdentityMintConsentTypedData`\n * for `walletClient.signTypedData` / `wallet_signTypedData_v4` (recipient consent).\n */\nexport type IdentityMintConsentTypedData = {\n domain: CashieIdentitySoulEip712Domain\n types: typeof IDENTITY_MINT_EIP712_TYPES\n primaryType: typeof PRIMARY_TYPE_IDENTITY_MINT_CONSENT\n message: IdentityMintSignPayload\n}\n\n/**\n * Typed-data parameters returned by `buildIdentityMintProofTypedData`\n * for Identity Verification Prover signing (`IdentityMintPayload`).\n */\nexport type IdentityMintProofTypedData = {\n domain: CashieIdentitySoulEip712Domain\n types: typeof IDENTITY_MINT_PAYLOAD_EIP712_TYPES\n primaryType: typeof PRIMARY_TYPE_IDENTITY_MINT_PAYLOAD\n message: IdentityMintProofSignPayload\n}\n\n/**\n * The identity soul discovery object.\n */\nexport type IdentitySoulDiscovery = {\n identitySoulContract: {\n address: Address\n badgeContracts: {\n paymentRecordBadgeContract: Address\n receiptBadgeContract: Address\n }\n }\n}\n", "import type { Address, Hex } from 'viem'\nimport { getAddress, hexToBigInt, keccak256, numberToHex } from 'viem'\n\nimport type { CashieIdentityCommitment } from './types.js'\n\n/** Lower 160 bits only; matches `address(uint160(tokenId))` in Solidity. */\nconst UINT160_MASK = (1n << 160n) - 1n\n\n/**\n * Same as `IdentityTokenIdLib.tokenIdFor` \u2014 `uint256(uint160(account))`.\n *\n * @param account Holder address (checksum-normalized)\n * @returns ERC-721 token id for `CashieIdentitySoul`\n */\nexport function identityTokenIdFor(account: Address): bigint {\n return hexToBigInt(getAddress(account))\n}\n\n/**\n * Same as `IdentityTokenIdLib.accountFor` \u2014 `address(uint160(tokenId))` (high bits ignored).\n *\n * @param tokenId On-chain token id (may include junk above bit 159)\n * @returns Address from the low 160 bits\n */\nexport function identityAccountFor(tokenId: bigint): Address {\n const low160 = tokenId & UINT160_MASK\n return getAddress(numberToHex(low160, { size: 20 }))\n}\n\n/**\n * Off-chain **`keccak256`** over the canonical commitment preimage string.\n * Kept here (vs `cashieIdentitySoulTypedData.ts`) so EIP-712 wiring stays focused on typed-data signing.\n *\n * @param providerId Provider id segment\n * @param account Account segment\n * @returns Digest (`Hex`) of ``keccak256(`0x${providerId}-${account}`)``\n */\nexport function buildIdentityCommitmentHash(\n providerId: string,\n account: string,\n): Hex {\n const commitment: CashieIdentityCommitment = `0x${providerId}-${account}`\n return keccak256(commitment)\n}\n", "import type { Address, Hex } from 'viem'\nimport { hashTypedData, hexToBigInt } from 'viem'\n\nimport {\n CASHIE_IDENTITY_SOUL_EIP712_NAME,\n CASHIE_IDENTITY_SOUL_EIP712_VERSION,\n IDENTITY_MINT_EIP712_TYPES,\n IDENTITY_MINT_PAYLOAD_EIP712_TYPES,\n PRIMARY_TYPE_IDENTITY_MINT_CONSENT,\n PRIMARY_TYPE_IDENTITY_MINT_PAYLOAD,\n type CashieIdentitySoulEip712Domain,\n type IdentityMintProofSignPayload,\n type IdentityMintProofTypedData,\n type IdentityMintSignPayload,\n type IdentityMintConsentTypedData,\n} from './types.js'\n\n/**\n * Args for recipient identity mint consent (`IdentityMintConsent`, includes issuer `proof`).\n */\nexport type IdentityMintConsentArgs = {\n /** Hex encoding of uint256 (e.g. `0x1`); same shape as payment intent / provider RPC `chainId`. */\n chainId: Hex\n verifyingContract: Address\n message: IdentityMintSignPayload\n}\n\n/**\n * Args for Identity Verification Prover signing (`IdentityMintPayload`, excludes `proof` / `signature`).\n */\nexport type IdentityMintProofArgs = {\n /** Hex encoding of uint256 (e.g. `0x1`); same shape as payment intent / provider RPC `chainId`. */\n chainId: Hex\n verifyingContract: Address\n message: IdentityMintProofSignPayload\n}\n\n/**\n * Builds the EIP-712 domain used by `CashieIdentitySoul`\n * (`EIP712(CashieIdentitySoul.NAME, CashieIdentitySoul.DOMAIN_VERSION)` in onchain `CashieIdentitySoul` contract).\n *\n * @param chainId Hex-encoded chain id (uint256)\n * @param verifyingContract The address of the verifying contract\n * @returns The EIP-712 domain\n */\nexport function buildCashieIdentitySoulDomain(\n chainId: Hex,\n verifyingContract: Address,\n): CashieIdentitySoulEip712Domain {\n const id = hexToBigInt(chainId)\n return {\n name: CASHIE_IDENTITY_SOUL_EIP712_NAME,\n version: CASHIE_IDENTITY_SOUL_EIP712_VERSION,\n chainId: id,\n verifyingContract,\n }\n}\n\n/**\n * Constructs typed-data for the recipient consent signer (`IdentityMintConsent`).\n * Pass the result to `walletClient.signTypedData` or any EIP-1193 `eth_signTypedData_v4` flow.\n *\n * The `message` must include issuer `proof` and must **not** include `signature`.\n *\n * @param args Consent typed-data args\n * @returns Recipient consent typed data\n */\nexport function buildIdentityMintConsentTypedData(\n args: IdentityMintConsentArgs,\n): IdentityMintConsentTypedData {\n const domain = buildCashieIdentitySoulDomain(\n args.chainId,\n args.verifyingContract,\n )\n return {\n domain,\n types: IDENTITY_MINT_EIP712_TYPES,\n primaryType: PRIMARY_TYPE_IDENTITY_MINT_CONSENT,\n message: args.message,\n }\n}\n\n/**\n * Constructs typed-data for the Identity Verification Prover (`IdentityMintPayload`).\n * Pass the result to `walletClient.signTypedData` or any EIP-1193 `eth_signTypedData_v4` flow.\n *\n * The `message` must **not** include `proof` or `signature`.\n *\n * @param args Prover typed-data args\n * @returns Prover proof typed data\n */\nexport function buildIdentityMintProofTypedData(\n args: IdentityMintProofArgs,\n): IdentityMintProofTypedData {\n const domain = buildCashieIdentitySoulDomain(\n args.chainId,\n args.verifyingContract,\n )\n return {\n domain,\n types: IDENTITY_MINT_PAYLOAD_EIP712_TYPES,\n primaryType: PRIMARY_TYPE_IDENTITY_MINT_PAYLOAD,\n message: args.message,\n }\n}\n\n/**\n * EIP-712 digest for recipient consent EIP-1271 verification\n * (`IdentitySoulEncoderLib.hashIdentityMintConsent`).\n *\n * @param args Consent typed-data args\n * @returns The EIP-712 digest\n */\nexport function hashIdentityMintConsentTypedData(\n args: IdentityMintConsentArgs,\n): Hex {\n const { domain, types, primaryType, message } =\n buildIdentityMintConsentTypedData(args)\n return hashTypedData({\n domain,\n types,\n primaryType,\n message,\n })\n}\n\n/**\n * EIP-712 digest for issuer / prover EIP-1271 verification\n * (`IdentitySoulEncoderLib.hashIdentityMintPayload`).\n *\n * @param args Prover typed-data args\n * @returns The EIP-712 digest\n */\nexport function hashIdentityMintProofTypedData(\n args: IdentityMintProofArgs,\n): Hex {\n const { domain, types, primaryType, message } =\n buildIdentityMintProofTypedData(args)\n return hashTypedData({\n domain,\n types,\n primaryType,\n message,\n })\n}\n", "import { Address } from 'viem'\nimport { IdentityMintSignPayload } from '../types.js'\n\n/**\n * Issued identity proof from an Identity Verification Prover flow.\n * Client supplies `to` and asks the recipient to sign `IdentityMintConsent` over these fields + `proof`.\n */\nexport type IssuedIdentityProofResponse = Omit<IdentityMintSignPayload, 'to'>\n\n/**\n * Supported identity issuer IDs for identity verification for Cashie Identity Soul.\n */\nexport enum IdentityIssuerId {\n PLAID = 'plaid-identity',\n BUSINESS = 'business-identity',\n}\n\nexport type PlaidIssueIdentityProofParams = {\n account: Address\n}\n\nexport type BusinessIssueIdentityProofParams = {\n account: Address\n /**\n * Site hostname without scheme (e.g. `merchant.example.com`).\n */\n domain: string\n}\n\nexport type IdentityProofParamsToType = {\n [IdentityIssuerId.PLAID]: PlaidIssueIdentityProofParams\n [IdentityIssuerId.BUSINESS]: BusinessIssueIdentityProofParams\n}\n\nexport type SupportedIssueIdentityProofParams = keyof IdentityProofParamsToType\n\nexport type IssueIdentityProofRequest = {\n [K in SupportedIssueIdentityProofParams]: {\n identityIssuerId: K\n params: IdentityProofParamsToType[K]\n }\n}[SupportedIssueIdentityProofParams]\n", "import { Hex } from 'viem'\n\n/**\n * Gets the web crypto instance.\n *\n * @returns The web crypto instance.\n */\nfunction getWebCrypto(): Crypto {\n const c = globalThis.crypto\n if (!c?.getRandomValues) {\n throw new Error(\n 'Web Crypto is not available (need Node.js 19+ or a modern browser).',\n )\n }\n return c\n}\n\n/**\n * Converts a Uint8Array to a hex string.\n *\n * @param bytes - The Uint8Array to convert.\n * @returns The hex string.\n */\nfunction uint8ArrayToHex(bytes: Uint8Array): string {\n return Array.from(bytes, (b) => b.toString(16).padStart(2, '0')).join('')\n}\n\n/**\n * Generates a random salt for the payment intent.\n *\n * @returns The random salt as a hex string.\n */\nexport function generateSalt(): Hex {\n const bytes = new Uint8Array(32)\n getWebCrypto().getRandomValues(bytes)\n return `0x${uint8ArrayToHex(bytes)}`\n}\n\n/**\n * Assert that the URL starts with https or http\n *\n * @param url - The URL to assert.\n * @throws an error if the URL is required\n * @throws an error if the URL does not start with https or http\n * @throws an error if the URL is not a valid URL\n * @returns the URL`\n */\nexport function assertUrl(url: string): string {\n if (!url) {\n throw new Error('URL is required')\n }\n if (!url.startsWith('https://') && !url.startsWith('http://')) {\n throw new Error('URL must start with https or http')\n }\n return url.trim()\n}\n", "import {\n IdentityIssuerId,\n IssueIdentityProofRequest,\n IssuedIdentityProofResponse,\n PlaidIssueIdentityProofParams,\n BusinessIssueIdentityProofParams,\n} from './types.js'\nimport { assertUrl } from '../../utils/utils.js'\n\ninterface IIdentityIssuer {\n issueIdentityProof(\n request: IssueIdentityProofRequest,\n ): Promise<IssuedIdentityProofResponse>\n\n isSupportedIdentityIssuerId(identityIssuerId: string): boolean\n}\n\nexport type IdentityIssuerArgs = {\n idvProverUrl: string\n}\n\nexport class IdentityIssuer implements IIdentityIssuer {\n #config: IdentityIssuerArgs\n constructor(config: IdentityIssuerArgs) {\n config.idvProverUrl = assertUrl(config.idvProverUrl)\n this.#config = config\n }\n\n private async postIdvProver<T>(\n path: string,\n body: Record<string, unknown>,\n ): Promise<T> {\n const url = this.#config.idvProverUrl\n const response = await fetch(`${url}/api/v1/idv/${path}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(body),\n })\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}))\n throw new Error(\n (errorData as { error?: string; error_message?: string }).error ||\n (errorData as { error_message?: string }).error_message ||\n `IDV request failed: ${response.statusText}`,\n )\n }\n\n return response.json() as Promise<T>\n }\n\n /**\n * POST /api/idv/generate-identity-proof \u2014 Issue identity proof for Cashie Identity Soul\n *\n * @param params - The parameters for generating the identity proof.\n * @returns Promise resolving to the issued identity proof.\n */\n private async generatePlaidIdentityProof(\n params: PlaidIssueIdentityProofParams,\n ): Promise<IssuedIdentityProofResponse> {\n const { account } = params\n return this.postIdvProver('generate-identity-proof', {\n account,\n identityIssuerId: IdentityIssuerId.PLAID,\n })\n }\n\n /**\n * POST /api/idv/generate-identity-proof \u2014 Issue identity proof for Cashie Identity Soul\n *\n * @param params - The parameters for generating the identity proof.\n * @returns Promise resolving to the issued identity proof.\n */\n private async generateBusinessIdentityProof(\n params: BusinessIssueIdentityProofParams,\n ): Promise<IssuedIdentityProofResponse> {\n const { account } = params\n return this.postIdvProver('generate-identity-proof', {\n account,\n identityIssuerId: IdentityIssuerId.BUSINESS,\n domain: params.domain,\n })\n }\n\n async issueIdentityProof(\n request: IssueIdentityProofRequest,\n ): Promise<IssuedIdentityProofResponse> {\n if (!this.isSupportedIdentityIssuerId(request.identityIssuerId)) {\n throw new Error(\n `Unsupported identity issuer ID: ${request.identityIssuerId}`,\n )\n }\n\n switch (request.identityIssuerId) {\n case IdentityIssuerId.PLAID:\n return this.generatePlaidIdentityProof(request.params)\n case IdentityIssuerId.BUSINESS:\n return this.generateBusinessIdentityProof(request.params)\n }\n }\n\n isSupportedIdentityIssuerId(identityIssuerId: string): boolean {\n return Object.values(IdentityIssuerId).includes(\n identityIssuerId as IdentityIssuerId,\n )\n }\n}\n", "/**\n * Stable error codes returned by Plaid Identity Verification handlers.\n */\nexport enum PlaidIdvErrorCode {\n IDV_SESSION_SUCCESS = 'IDV_SESSION_SUCCESS',\n IDV_SESSION_PENDING_REVIEW = 'IDV_SESSION_PENDING_REVIEW',\n INVALID_IDV_SESSION = 'INVALID_IDV_SESSION',\n IDV_MAX_FAILED_VERIFICATION_THRESHOLD_REACHED = 'IDV_MAX_FAILED_VERIFICATION_THRESHOLD_REACHED',\n}\n\n/**\n * Human-readable messages keyed by {@link PlaidIdvErrorCode}.\n */\nexport const PLAID_IDV_ERROR_MESSAGE: Record<PlaidIdvErrorCode, string> = {\n [PlaidIdvErrorCode.IDV_SESSION_SUCCESS]:\n 'IDV session has already been completed.',\n [PlaidIdvErrorCode.IDV_SESSION_PENDING_REVIEW]:\n 'IDV session is pending review. Please wait for review.',\n [PlaidIdvErrorCode.INVALID_IDV_SESSION]:\n 'idvSession is required and must be a string.',\n [PlaidIdvErrorCode.IDV_MAX_FAILED_VERIFICATION_THRESHOLD_REACHED]:\n 'Maximum failed verification threshold reached. Please contact support.',\n}\n\nexport type PlaidIdvErrorBody = {\n error_code: PlaidIdvErrorCode\n error_message: string\n}\n\n/**\n * Build the `{ error_code, error_message }` body for a Plaid IDV error.\n *\n * @param code - Stable error code\n * @returns JSON error body\n */\nexport const plaidIdvError = (code: PlaidIdvErrorCode): PlaidIdvErrorBody => ({\n error_code: code,\n error_message: PLAID_IDV_ERROR_MESSAGE[code],\n})\n", "import { type Address, fromHex, type Hex, toHex } from 'viem'\n\nimport { IdentityIssuer, IssueIdentityProofRequest } from '../issuer/index.js'\n\nimport {\n parseCashieIdentitySoulTokenMetadata,\n decodeCashieSvgDataUriToUtf8,\n parseCashieReceiptBadgeMetadataFromBadgeUri,\n parseCashiePaymentRecordBadgeMetadataFromBadgeUri,\n CashieIdentitySoulTokenMetadata,\n CashieReceiptBadgeMetadata,\n CashiePaymentRecordBadgeMetadata,\n} from '../../data/index.js'\nimport { IdentityMintConsentArgs } from '../../identity/cashieIdentitySoulTypedData.js'\nimport { identityTokenIdFor } from '../../identity/encoder.js'\nimport {\n createPaymentRpcClient,\n PaymentRpcClient,\n} from '../../client/payment-client.js'\n\ninterface ISoulManagerConstructorArgs {\n identityIssuer: IdentityIssuer\n cashieRpcUrl: string\n chainIdHex: Hex\n}\n\nexport interface ISoulManager {\n /**\n * Check if the soul token manager is initialized\n *\n * @returns True if the soul token manager is initialized, false otherwise\n */\n isInitialized(): boolean\n\n /**\n * Initialize the soul manager\n */\n init(): Promise<void>\n\n /**\n * Prepare identity mint consent: issuer proof plus typed-data args for the recipient to sign.\n *\n * @param request - The identity proof request\n * @returns Consent args (`message` for recipient signing + issuer `proof`)\n */\n prepareIdentityMintConsent(\n request: IssueIdentityProofRequest,\n ): Promise<IdentityMintConsentArgs>\n\n /**\n * Get the identity soul token metadata\n *\n * @param account - The account address\n * @returns The identity soul token metadata\n */\n getCashieIdentitySoulTokenMetadata(\n account: Address,\n ): Promise<CashieIdentitySoulTokenMetadata | undefined>\n\n /**\n * Get the receipt badge metadata\n *\n * @param badgeId - The badge id\n * @returns The receipt badge metadata\n */\n getCashieReceiptBadgeMetadata(\n badgeId: Hex,\n ): Promise<CashieReceiptBadgeMetadata | undefined>\n\n /**\n * Get the payment record badge metadata\n *\n * @param badgeId - The badge id\n * @returns The payment record badge metadata\n */\n getCashiePaymentRecordBadgeMetadata(\n badgeId: Hex,\n ): Promise<CashiePaymentRecordBadgeMetadata | undefined>\n}\n\n/**\n * Soul manager class is responsible for managing the (ERC-5484) identity soul tokens and (ERC-5114) receipt and payment record badges\n */\nexport class SoulManager implements ISoulManager {\n #identitySoulContract: Address | undefined\n #paymentRecordBadgeContract: Address | undefined\n #receiptBadgeContract: Address | undefined\n #receiptBadgeMetadataFormat: string | undefined\n #paymentRecordBadgeMetadataFormat: string | undefined\n #paymentRpcClient: PaymentRpcClient\n #chainHex: Hex\n\n #cashieReceiptBadgeMetadataCache: Map<Hex, CashieReceiptBadgeMetadata> =\n new Map()\n #cashiePaymentRecordBadgeMetadataCache: Map<\n Hex,\n CashiePaymentRecordBadgeMetadata\n > = new Map()\n\n #identityIssuer: IdentityIssuer\n\n constructor(args: ISoulManagerConstructorArgs) {\n const { identityIssuer, cashieRpcUrl, chainIdHex } = args\n this.#identityIssuer = identityIssuer\n this.#paymentRpcClient = createPaymentRpcClient({\n url: cashieRpcUrl,\n chainId: fromHex(chainIdHex, 'number'),\n })\n this.#chainHex = chainIdHex\n }\n\n #assertInitialized() {\n if (!this.isInitialized()) {\n throw new Error('Soul manager is not initialized')\n }\n }\n\n isInitialized(): boolean {\n return (\n this.#identitySoulContract !== undefined &&\n this.#paymentRecordBadgeContract !== undefined &&\n this.#receiptBadgeContract !== undefined\n )\n }\n\n async init() {\n const supportedSouls =\n await this.#paymentRpcClient.getIdentitySoulDiscovery([\n { chainHex: this.#chainHex },\n ])\n if (!supportedSouls) {\n throw new Error('Failed to get supported souls')\n }\n this.#identitySoulContract = supportedSouls.identitySoulContract.address\n this.#paymentRecordBadgeContract =\n supportedSouls.identitySoulContract.badgeContracts.paymentRecordBadgeContract\n this.#receiptBadgeContract =\n supportedSouls.identitySoulContract.badgeContracts.receiptBadgeContract\n\n // Get the metadata formats\n const [receiptBadgeMetadataFormat, paymentRecordBadgeMetadataFormat] =\n await Promise.all([\n this.#paymentRpcClient.getBadgeMetadataFormat([\n { chainHex: this.#chainHex },\n ]),\n this.#paymentRpcClient.getBadgeMetadataFormat([\n { chainHex: this.#chainHex },\n ]),\n ])\n\n if (!receiptBadgeMetadataFormat || !paymentRecordBadgeMetadataFormat) {\n throw new Error('Failed to get badge metadata formats')\n }\n this.#receiptBadgeMetadataFormat = receiptBadgeMetadataFormat\n this.#paymentRecordBadgeMetadataFormat = paymentRecordBadgeMetadataFormat\n }\n\n async prepareIdentityMintConsent(\n request: IssueIdentityProofRequest,\n ): Promise<IdentityMintConsentArgs> {\n this.#assertInitialized()\n\n if (!this.#identitySoulContract) {\n throw new Error('Identity soul contract is not initialized')\n }\n const { account } = request.params\n if (!account) {\n throw new Error('Account is missing from the request')\n }\n const issuedIdentityProofResponse =\n await this.#identityIssuer.issueIdentityProof(request)\n\n const { identityType, domain, burnAuth, identityCommitment, proof } =\n issuedIdentityProofResponse\n return {\n chainId: this.#chainHex,\n verifyingContract: this.#identitySoulContract,\n message: {\n to: account,\n identityType,\n domain,\n burnAuth,\n identityCommitment,\n proof,\n },\n }\n }\n\n async getCashieIdentitySoulTokenMetadata(\n account: Address,\n ): Promise<CashieIdentitySoulTokenMetadata | undefined> {\n this.#assertInitialized()\n if (!this.#identitySoulContract) {\n throw new Error('Identity soul contract is not initialized')\n }\n if (!account) {\n throw new Error('Account is not initialized')\n }\n const tokenId = identityTokenIdFor(account)\n const tokenIdHex = toHex(tokenId)\n const tokenURI = await this.#paymentRpcClient.getTokenURI([\n { chainHex: this.#chainHex, tokenId: tokenIdHex },\n ])\n\n if (!tokenURI) {\n return undefined\n }\n\n const data = parseCashieIdentitySoulTokenMetadata(tokenURI)\n const decodedImageSvg = decodeCashieSvgDataUriToUtf8(data.image)\n if (!decodedImageSvg) {\n throw new Error(\n 'Failed to decode image SVG for identity soul token metadata',\n )\n }\n data.image = decodedImageSvg\n return data\n }\n\n async getCashieReceiptBadgeMetadata(\n badgeId: Hex,\n ): Promise<CashieReceiptBadgeMetadata | undefined> {\n this.#assertInitialized()\n if (!this.#receiptBadgeContract) {\n throw new Error('Receipt badge contract is not initialized')\n }\n if (!this.#receiptBadgeMetadataFormat) {\n throw new Error('Receipt badge metadata format is not initialized')\n }\n\n const cachedMetadata = this.#cashieReceiptBadgeMetadataCache.get(badgeId)\n if (cachedMetadata) {\n return cachedMetadata\n }\n\n const badgeURI = await this.#paymentRpcClient.getBadgeUri([\n { chainHex: this.#chainHex, badgeId },\n ])\n\n if (!badgeURI) {\n return undefined\n }\n const data = parseCashieReceiptBadgeMetadataFromBadgeUri(\n badgeURI,\n this.#receiptBadgeMetadataFormat,\n )\n const decodedImageSvg = decodeCashieSvgDataUriToUtf8(data.image)\n if (!decodedImageSvg) {\n throw new Error('Failed to decode image SVG for receipt badge metadata')\n }\n data.image = decodedImageSvg\n this.#cashieReceiptBadgeMetadataCache.set(badgeId, data)\n return data\n }\n\n async getCashiePaymentRecordBadgeMetadata(\n badgeId: Hex,\n ): Promise<CashiePaymentRecordBadgeMetadata | undefined> {\n this.#assertInitialized()\n if (!this.#paymentRecordBadgeContract) {\n throw new Error('Payment record badge contract is not initialized')\n }\n if (!this.#paymentRecordBadgeMetadataFormat) {\n throw new Error('Payment record badge metadata format is not initialized')\n }\n const cachedMetadata =\n this.#cashiePaymentRecordBadgeMetadataCache.get(badgeId)\n if (cachedMetadata) {\n return cachedMetadata\n }\n\n const badgeURI = await this.#paymentRpcClient.getBadgeUri([\n { chainHex: this.#chainHex, badgeId },\n ])\n\n if (!badgeURI) {\n return undefined\n }\n const data = parseCashiePaymentRecordBadgeMetadataFromBadgeUri(\n badgeURI,\n this.#paymentRecordBadgeMetadataFormat,\n )\n const decodedImageSvg = decodeCashieSvgDataUriToUtf8(data.image)\n if (!decodedImageSvg) {\n throw new Error(\n 'Failed to decode image SVG for payment record badge metadata',\n )\n }\n data.image = decodedImageSvg\n this.#cashiePaymentRecordBadgeMetadataCache.set(badgeId, data)\n return data\n }\n}\n", "import { z } from 'zod'\n\nimport {\n burnAuthSchema,\n identityTypeSchema,\n} from '../erc-7715/rules/schemas.js'\nimport { BurnAuth, IdentityType } from '../identity/types.js'\n\n/** Matches `MetadataEncodingPrimitives.JSON_DATA_URI_BASE64_PREFIX`. */\nexport const CASHIE_JSON_DATA_URI_BASE64_PREFIX =\n 'data:application/json;base64,' as const\n\n/** Matches `MetadataEncodingPrimitives` SVG data URI prefix (`svgMarkupToImageDataUri`). */\nexport const CASHIE_SVG_DATA_URI_BASE64_PREFIX =\n 'data:image/svg+xml;base64,' as const\n\n/**\n * Matches `CashieReceiptBadge.metadataFormat()` (`_METADATA_FORMAT`).\n * ERC-5114 JSON does not embed this string; compare against the contract when resolving badges.\n */\nexport const CASHIE_RECEIPT_BADGE_METADATA_FORMAT =\n 'Cashie-ReceiptBadge-v1' as const\n\n/**\n * Matches `CashiePaymentRecordBadge.metadataFormat()` (`_METADATA_FORMAT`).\n * ERC-5114 JSON does not embed this string; compare against the contract when resolving badges.\n */\nexport const CASHIE_PAYMENT_RECORD_BADGE_METADATA_FORMAT =\n 'Cashie-PaymentRecordBadge-v1' as const\n\n/**\n * `identityType` strings emitted by `IdentitySoulMetadataEncoderLib` \u2014 parallel to {@link IdentityType} ordinals.\n */\nexport const cashieIdentitySoulIdentityTypeJsonSchema = z.enum([\n 'Individual',\n 'Business',\n])\n\n/** Map JSON `identityType` labels to {@link IdentityType} values used in EIP-712 / structs. */\nexport const JSON_IDENTITY_TYPE_LABEL_TO_IDENTITY_TYPE = {\n Individual: IdentityType.Individual,\n Business: IdentityType.Business,\n} as const satisfies Record<\n z.infer<typeof cashieIdentitySoulIdentityTypeJsonSchema>,\n IdentityType\n>\n\nconst decimalStringSchema = z.string().regex(/^\\d+$/, 'Expected decimal string')\n\n/** Non-empty `0x` hex (addresses, arbitrary commitment bytes on-chain). */\nexport const hex0xSchema = z\n .string()\n .regex(/^0x[0-9a-fA-F]+$/, 'Expected non-empty 0x-prefixed hex')\n\n/** `bytes32` serialized like Solidity `Strings.toHexString(..., 32)`. */\nexport const bytes32HexSchema = hex0xSchema.refine((s) => s.length === 66, {\n message: 'Expected 32-byte hex string (0x + 64 hex chars)',\n})\n\nexport const cashieReceiptBadgeSoulBoundToSchema = z\n .object({\n identityContract: hex0xSchema,\n tokenId: decimalStringSchema,\n })\n .strict()\n\n/** EIP-721 JSON from `ReceiptBadgeMetadataEncoderLib`. */\nexport const cashieReceiptBadgeMetadataSchema = z\n .object({\n name: z.string(),\n description: z.string(),\n image: z.string(),\n soulBoundTo: cashieReceiptBadgeSoulBoundToSchema,\n receiptType: z.enum(['OneTime', 'Recurring']),\n blockNumber: decimalStringSchema,\n recipient: hex0xSchema,\n chainId: decimalStringSchema,\n tokenAddress: hex0xSchema,\n allowance: decimalStringSchema,\n salt: bytes32HexSchema,\n })\n .strict()\n\nconst burnAuthJsonOrdinalSchema = decimalStringSchema\n .refine(\n (s) => {\n const n = Number(s)\n return (\n Number.isInteger(n) && n >= BurnAuth.IssuerOnly && n <= BurnAuth.Neither\n )\n },\n { message: 'burnAuth must be IERC5484 enum ordinal (0\u20133)' },\n )\n .transform((s) => Number(s) as BurnAuth)\n\n/** EIP-721 JSON from `PaymentRecordBadgeMetadataEncoderLib`. */\nexport const cashiePaymentRecordBadgeMetadataSchema = z\n .object({\n name: z.string(),\n description: z.string(),\n image: z.string(),\n soulBoundTo: cashieReceiptBadgeSoulBoundToSchema,\n blockNumber: decimalStringSchema,\n payer: hex0xSchema,\n chainId: decimalStringSchema,\n tokenAddress: hex0xSchema,\n allowance: decimalStringSchema,\n receiptBadgeId: decimalStringSchema,\n salt: bytes32HexSchema,\n })\n .strict()\n\n/**\n * EIP-721 JSON from `IdentitySoulMetadataEncoderLib` (on-chain wire format).\n * Use `.parse()` on decoded token URI JSON.\n */\nexport const cashieIdentitySoulTokenMetadataJsonSchema = z\n .object({\n name: z.string(),\n description: z.string(),\n image: z.string(),\n identityType: cashieIdentitySoulIdentityTypeJsonSchema.transform(\n (label) => JSON_IDENTITY_TYPE_LABEL_TO_IDENTITY_TYPE[label],\n ),\n domain: z.string(),\n burnAuth: burnAuthJsonOrdinalSchema,\n identityCommitment: hex0xSchema,\n })\n .strict()\n\n/**\n * Parsed identity soul metadata (`IdentityType` / `BurnAuth` ordinals).\n */\nexport const cashieIdentitySoulTokenMetadataSchema = z\n .object({\n name: z.string(),\n description: z.string(),\n image: z.string(),\n identityType: identityTypeSchema,\n domain: z.string(),\n burnAuth: burnAuthSchema,\n identityCommitment: hex0xSchema,\n })\n .strict()\n\nexport type CashieReceiptBadgeSoulBoundTo = z.infer<\n typeof cashieReceiptBadgeSoulBoundToSchema\n>\n\nexport type CashieReceiptBadgeMetadata = z.infer<\n typeof cashieReceiptBadgeMetadataSchema\n>\n\nexport type CashiePaymentRecordBadgeMetadata = z.infer<\n typeof cashiePaymentRecordBadgeMetadataSchema\n>\n\nexport type CashieIdentitySoulTokenMetadata = z.infer<\n typeof cashieIdentitySoulTokenMetadataSchema\n>\n\nexport type ParsedCashieMetadata =\n | { kind: 'identitySoul'; data: CashieIdentitySoulTokenMetadata }\n | {\n kind: 'receiptBadge'\n format: typeof CASHIE_RECEIPT_BADGE_METADATA_FORMAT\n data: CashieReceiptBadgeMetadata\n }\n | {\n kind: 'paymentRecordBadge'\n format: typeof CASHIE_PAYMENT_RECORD_BADGE_METADATA_FORMAT\n data: CashiePaymentRecordBadgeMetadata\n }\n", "import { z } from 'zod'\nimport { BurnAuth, IdentityType } from '../../identity/types.js'\nimport type { IdentityMintSignPayloadWithSignature } from '../../identity/types.js'\nimport {\n addressSchema,\n baseScopeSchema,\n hexSchema,\n parseWithSchema,\n} from '../common.types.js'\nimport type { ExpiryRule, IdentityMintRule, Rule } from './types.js'\n\nexport const identityTypeSchema = z.union([\n z.literal(IdentityType.Individual),\n z.literal(IdentityType.Business),\n])\n\nexport const burnAuthSchema = z.union([\n z.literal(BurnAuth.IssuerOnly),\n z.literal(BurnAuth.OwnerOnly),\n z.literal(BurnAuth.Both),\n z.literal(BurnAuth.Neither),\n])\n\nexport const identityMintSignPayloadWithSignatureSchema: z.ZodType<IdentityMintSignPayloadWithSignature> =\n z\n .object({\n identityType: identityTypeSchema,\n domain: z.string(),\n burnAuth: burnAuthSchema,\n identityCommitment: hexSchema,\n to: addressSchema,\n proof: hexSchema,\n signature: hexSchema,\n })\n .strict()\n\nexport const expiryRuleSchema = baseScopeSchema\n .omit({ type: true, data: true })\n .extend({\n type: z.literal('expiry'),\n data: z\n .object({\n timestamp: z.number().int(), // unix timestamp\n })\n .strict(),\n })\n .strict()\n\nexport const identityMintRuleSchema = baseScopeSchema\n .omit({ type: true, data: true })\n .extend({\n type: z.literal('identity-mint'),\n data: z\n .object({\n /**\n * The identity mint payload with signature of the payment.\n */\n identityMintPayload: identityMintSignPayloadWithSignatureSchema,\n })\n .strict(),\n })\n .strict()\n\nexport const ruleSchema = z.discriminatedUnion('type', [\n expiryRuleSchema,\n identityMintRuleSchema,\n])\n\nexport const ruleSchemas = {\n expiry: expiryRuleSchema,\n identityMint: identityMintRuleSchema,\n} satisfies {\n expiry: typeof expiryRuleSchema\n identityMint: typeof identityMintRuleSchema\n}\n\n/**\n * Parses an expiry rule.\n *\n * @param value - The value to validate.\n * @returns The parsed expiry rule.\n */\nexport function parseExpiryRule(value: unknown): ExpiryRule {\n return parseWithSchema('ExpiryRule', expiryRuleSchema, value)\n}\n\n/**\n * Parses an identity-mint rule.\n *\n * @param value - The value to validate.\n * @returns The parsed identity-mint rule.\n */\nexport function parseIdentityMintRule(value: unknown): IdentityMintRule {\n return parseWithSchema('IdentityMintRule', identityMintRuleSchema, value)\n}\n\n/**\n * Parses any supported ERC-7715 rule.\n *\n * @param value - The value to validate.\n * @returns The parsed rule.\n */\nexport function parseRule(value: unknown): Rule {\n return parseWithSchema('Rule', ruleSchema, value)\n}\n", "import { z } from 'zod'\nimport { isAddress, isHex, type Address, type Hex } from 'viem'\n\nexport const addressSchema = z.custom<Address>(\n (val) => typeof val === 'string' && isAddress(val),\n { message: 'Expected valid Ethereum address' },\n)\n\nexport const hexSchema = z.custom<Hex>(\n (val) => typeof val === 'string' && isHex(val),\n { message: 'Expected valid hex string' },\n)\n\nexport const baseScopeSchema = z\n .object({\n type: z.string(),\n isAdjustmentAllowed: z.boolean(),\n justification: z.string(),\n data: z.record(z.string(), z.unknown()),\n })\n .strict()\n\n/**\n * A custom error class for ERC-7715 validation errors.\n */\nexport class ERC7715ValidationError extends Error {\n readonly schemaName: string\n readonly zodError: z.ZodError\n\n constructor(schemaName: string, zodError: z.ZodError) {\n const details = zodError.issues\n .map((issue) => {\n const path = issue.path.length > 0 ? ` at ${issue.path.join('.')}` : ''\n return `${issue.message}${path}`\n })\n .join('; ')\n super(`Invalid ERC-7715 \"${schemaName}\": ${details}`)\n this.name = 'ERC7715ValidationError'\n this.schemaName = schemaName\n this.zodError = zodError\n }\n}\n\n/**\n * Parses a value with a given schema and throws an error if the value is invalid.\n *\n * @param schemaName - The name of the schema\n * @param schema - The schema to parse the value with\n * @param value - The value to parse\n * @returns The parsed value\n */\nexport function parseWithSchema<TSchema extends z.ZodType>(\n schemaName: string,\n schema: TSchema,\n value: unknown,\n): z.output<TSchema> {\n const parsed = schema.safeParse(value)\n if (!parsed.success) {\n throw new ERC7715ValidationError(schemaName, parsed.error)\n }\n return parsed.data\n}\n\n/**\n * A base scope type that all scopes must inherit from.\n */\nexport type BaseScopeSchema = z.infer<typeof baseScopeSchema>\n\n/**\n * Parses a base scope schema and throws an error if the value is invalid.\n *\n * @param scope - The scope to parse\n * @returns The parsed base scope schema\n */\nexport function parseBaseScopeSchema(scope: unknown): BaseScopeSchema {\n return parseWithSchema('BaseScopeSchema', baseScopeSchema, scope)\n}\n", "import type { Address, Hex } from 'viem'\nimport { encodeAbiParameters, getAddress, hexToBigInt, keccak256 } from 'viem'\nimport { identityTokenIdFor } from '../identity/encoder.js'\nimport type { PaymentIntent } from '../intent/types.js'\n\n/**\n * Mirrors on-chain `ReceiptType`\n */\nexport const ReceiptType = {\n OneTime: 0,\n Recurring: 1,\n} as const\n\nexport type ReceiptType = (typeof ReceiptType)[keyof typeof ReceiptType]\n\n/**\n * Fields ABI-encoded in the same order as `ReceiptBadgeEncoderLib.encodeMintPayload`\n * (`packages/contracts/src/identity/libraries/ReceiptBadgeEncoderLib.sol`).\n */\nexport type ReceiptBadgeMintPayload = {\n soulBoundTo: {\n identityContract: Address\n tokenId: bigint\n }\n receiptType: ReceiptType\n blockNumber: bigint\n recipient: Address\n chainId: bigint\n tokenAddress: Address\n allowance: bigint\n /** `bytes32` salt (`0x` + 64 hex chars). */\n salt: Hex\n}\n\nconst RECEIPT_BADGE_MINT_PAYLOAD_ABI_PARAMS = [\n { type: 'address', name: 'identityContract' },\n { type: 'uint256', name: 'tokenId' },\n { type: 'uint8', name: 'receiptType' },\n { type: 'uint256', name: 'blockNumber' },\n { type: 'address', name: 'recipient' },\n { type: 'uint256', name: 'chainId' },\n { type: 'address', name: 'tokenAddress' },\n { type: 'uint256', name: 'allowance' },\n { type: 'bytes32', name: 'salt' },\n] as const\n\n/**\n * Canonical `abi.encode` of `ReceiptBadgeMintPayload` (matches Solidity `ReceiptBadgeEncoderLib.encodeMintPayload`).\n *\n * @param payload Mint tuple fields in router/storage shape\n * @returns ABI-encoded bytes as hex\n */\nexport function encodeReceiptBadgeMintPayload(\n payload: ReceiptBadgeMintPayload,\n): Hex {\n return encodeAbiParameters(\n [...RECEIPT_BADGE_MINT_PAYLOAD_ABI_PARAMS],\n [\n payload.soulBoundTo.identityContract,\n payload.soulBoundTo.tokenId,\n payload.receiptType,\n payload.blockNumber,\n payload.recipient,\n payload.chainId,\n payload.tokenAddress,\n payload.allowance,\n payload.salt,\n ],\n )\n}\n\n/**\n * `keccak256(encodeReceiptBadgeMintPayload(payload))` \u2014 matches `ReceiptBadgeEncoderLib.getMintPayloadHash`.\n * On-chain `badgeId == uint256(bytes32 digest)`.\n *\n * @param payload Mint tuple fields in router/storage shape\n * @returns 32-byte digest (`0x\u2026`)\n */\nexport function getReceiptBadgeMintPayloadHash(\n payload: ReceiptBadgeMintPayload,\n): Hex {\n return keccak256(encodeReceiptBadgeMintPayload(payload))\n}\n\n/**\n * Deterministic ERC-5114 badge id: `uint256(getReceiptBadgeMintPayloadHash(payload))`.\n *\n * @param payload Mint tuple fields in router/storage shape\n * @returns Badge id as bigint\n */\nexport function receiptBadgeIdFromMintPayload(\n payload: ReceiptBadgeMintPayload,\n): bigint {\n return BigInt(getReceiptBadgeMintPayloadHash(payload))\n}\n\n/**\n * Maps a {@link PaymentIntent} to {@link ReceiptBadgeMintPayload} (matches `TokenDistributor._issueReceiptBadge`).\n *\n * @param identityContract `CashieIdentitySoul` address bound in `soulBoundTo`\n * @param paymentIntent Payment fields and mint salt\n * @param blockNumber Execution block (`block.number` at mint)\n * @param receiptType Receipt badge type from `ReceiptBadgeRouterMintPayload`\n * @returns Receipt badge mint tuple in router/storage shape\n */\nexport function receiptBadgeMintPayloadFromPaymentIntent(\n identityContract: Address,\n paymentIntent: PaymentIntent,\n blockNumber: bigint,\n receiptType: ReceiptType,\n): ReceiptBadgeMintPayload {\n return {\n soulBoundTo: {\n identityContract: getAddress(identityContract),\n tokenId: identityTokenIdFor(paymentIntent.payer),\n },\n receiptType,\n blockNumber,\n recipient: getAddress(paymentIntent.recipient),\n chainId: hexToBigInt(paymentIntent.chainId),\n tokenAddress: getAddress(paymentIntent.tokenAddress),\n allowance: hexToBigInt(paymentIntent.allowance),\n salt: paymentIntent.salt,\n }\n}\n\n/**\n * Deterministic receipt badge id for a payment intent (matches on-chain `CashieReceiptBadge.mint`).\n *\n * @param identityContract `CashieIdentitySoul` address\n * @param paymentIntent Payment fields and mint salt\n * @param blockNumber Execution block (`block.number` at mint)\n * @param receiptType Receipt badge type from `ReceiptBadgeRouterMintPayload`\n * @returns Deterministic receipt badge id\n */\nexport function receiptBadgeIdFromPaymentIntent(\n identityContract: Address,\n paymentIntent: PaymentIntent,\n blockNumber: bigint,\n receiptType: ReceiptType,\n): bigint {\n return receiptBadgeIdFromMintPayload(\n receiptBadgeMintPayloadFromPaymentIntent(\n identityContract,\n paymentIntent,\n blockNumber,\n receiptType,\n ),\n )\n}\n\n/**\n * Fields ABI-encoded in the same order as `PaymentRecordBadgeEncoderLib.encodeMintPayload`\n * (`packages/contracts/src/identity/libraries/PaymentRecordBadgeEncoderLib.sol`).\n */\nexport type PaymentRecordBadgeMintPayload = {\n soulBoundTo: {\n identityContract: Address\n tokenId: bigint\n }\n blockNumber: bigint\n payer: Address\n chainId: bigint\n tokenAddress: Address\n allowance: bigint\n receiptBadgeId: bigint\n /** `bytes32` salt (`0x` + 64 hex chars). */\n salt: Hex\n}\n\nconst PAYMENT_RECORD_BADGE_MINT_PAYLOAD_ABI_PARAMS = [\n { type: 'address', name: 'identityContract' },\n { type: 'uint256', name: 'tokenId' },\n { type: 'uint256', name: 'blockNumber' },\n { type: 'address', name: 'payer' },\n { type: 'uint256', name: 'chainId' },\n { type: 'address', name: 'tokenAddress' },\n { type: 'uint256', name: 'allowance' },\n { type: 'uint256', name: 'receiptBadgeId' },\n { type: 'bytes32', name: 'salt' },\n] as const\n\n/**\n * Canonical `abi.encode` of `PaymentRecordBadgeMintPayload` (matches Solidity `PaymentRecordBadgeEncoderLib.encodeMintPayload`).\n *\n * @param payload Mint tuple fields in router/storage shape\n * @returns ABI-encoded bytes as hex\n */\nexport function encodePaymentRecordBadgeMintPayload(\n payload: PaymentRecordBadgeMintPayload,\n): Hex {\n return encodeAbiParameters(\n [...PAYMENT_RECORD_BADGE_MINT_PAYLOAD_ABI_PARAMS],\n [\n payload.soulBoundTo.identityContract,\n payload.soulBoundTo.tokenId,\n payload.blockNumber,\n payload.payer,\n payload.chainId,\n payload.tokenAddress,\n payload.allowance,\n payload.receiptBadgeId,\n payload.salt,\n ],\n )\n}\n\n/**\n * `keccak256(encodePaymentRecordBadgeMintPayload(payload))` \u2014 matches `PaymentRecordBadgeEncoderLib.getMintPayloadHash`.\n * On-chain `badgeId == uint256(bytes32 digest)`.\n *\n * @param payload Mint tuple fields in router/storage shape\n * @returns 32-byte digest (`0x\u2026`)\n */\nexport function getPaymentRecordBadgeMintPayloadHash(\n payload: PaymentRecordBadgeMintPayload,\n): Hex {\n return keccak256(encodePaymentRecordBadgeMintPayload(payload))\n}\n\n/**\n * Deterministic ERC-5114 badge id: `uint256(getPaymentRecordBadgeMintPayloadHash(payload))`.\n *\n * @param payload Mint tuple fields in router/storage shape\n * @returns Badge id as bigint\n */\nexport function paymentRecordBadgeIdFromMintPayload(\n payload: PaymentRecordBadgeMintPayload,\n): bigint {\n return BigInt(getPaymentRecordBadgeMintPayloadHash(payload))\n}\n\n/**\n * Maps a {@link PaymentIntent} to {@link PaymentRecordBadgeMintPayload} (matches `TokenDistributor._issuePaymentRecordBadge`).\n *\n * @param identityContract `CashieIdentitySoul` address bound in `soulBoundTo`\n * @param paymentIntent Payment fields and mint salt\n * @param blockNumber Execution block (`block.number` at mint)\n * @param receiptBadgeId Linked receipt badge id from the same payment\n * @returns Payment record badge mint tuple in router/storage shape\n */\nexport function paymentRecordBadgeMintPayloadFromPaymentIntent(\n identityContract: Address,\n paymentIntent: PaymentIntent,\n blockNumber: bigint,\n receiptBadgeId: bigint,\n): PaymentRecordBadgeMintPayload {\n return {\n soulBoundTo: {\n identityContract: getAddress(identityContract),\n tokenId: identityTokenIdFor(paymentIntent.recipient),\n },\n blockNumber,\n payer: getAddress(paymentIntent.payer),\n chainId: hexToBigInt(paymentIntent.chainId),\n tokenAddress: getAddress(paymentIntent.tokenAddress),\n allowance: hexToBigInt(paymentIntent.allowance),\n receiptBadgeId,\n salt: paymentIntent.salt,\n }\n}\n\n/**\n * Deterministic payment record badge id for a payment intent (matches on-chain `CashiePaymentRecordBadge.mint`).\n *\n * @param identityContract `CashieIdentitySoul` address\n * @param paymentIntent Payment fields and mint salt\n * @param blockNumber Execution block (`block.number` at mint)\n * @param receiptType Receipt badge type from `ReceiptBadgeRouterMintPayload`\n * @returns Deterministic payment record badge id\n */\nexport function paymentRecordBadgeIdFromPaymentIntent(\n identityContract: Address,\n paymentIntent: PaymentIntent,\n blockNumber: bigint,\n receiptType: ReceiptType,\n): bigint {\n const receiptBadgeId = receiptBadgeIdFromPaymentIntent(\n identityContract,\n paymentIntent,\n blockNumber,\n receiptType,\n )\n return paymentRecordBadgeIdFromMintPayload(\n paymentRecordBadgeMintPayloadFromPaymentIntent(\n identityContract,\n paymentIntent,\n blockNumber,\n receiptBadgeId,\n ),\n )\n}\n", "/**\n * Decode `tokenURI` / `badgeUri` payloads produced by on-chain\n * `TokenMetadataEncoderLib` (`MetadataEncodingPrimitives.JSON_DATA_URI_BASE64_PREFIX`).\n *\n * Validation uses Zod schemas in `./types.js`. Parsed identity fields align with\n * **`IdentityType`** / **`BurnAuth`** from `identity/types.ts`.\n *\n * Pair **`parseCashieReceiptBadgeMetadataFromBadgeUri`** / **`parseCashiePaymentRecordBadgeMetadataFromBadgeUri`**\n * with **`IERC5114.metadataFormat()`** once the badge is minted on-chain.\n */\n\nimport {\n CASHIE_JSON_DATA_URI_BASE64_PREFIX,\n CASHIE_SVG_DATA_URI_BASE64_PREFIX,\n CASHIE_PAYMENT_RECORD_BADGE_METADATA_FORMAT,\n CASHIE_RECEIPT_BADGE_METADATA_FORMAT,\n cashieIdentitySoulTokenMetadataJsonSchema,\n cashiePaymentRecordBadgeMetadataSchema,\n cashieReceiptBadgeMetadataSchema,\n type CashieIdentitySoulTokenMetadata,\n type CashiePaymentRecordBadgeMetadata,\n type CashieReceiptBadgeMetadata,\n type ParsedCashieMetadata,\n} from './types.js'\n\n/**\n * Decodes the base64 payload to a UTF-8 string.\n *\n * @param b64Payload The base64 payload to decode\n * @returns The UTF-8 string\n */\nfunction decodeBase64ToUtf8(b64Payload: string): string {\n const trimmed = b64Payload.replace(/\\s+/g, '')\n try {\n const binary = atob(trimmed)\n const bytes = new Uint8Array(binary.length)\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i)\n }\n return new TextDecoder('utf8', { fatal: true }).decode(bytes)\n } catch {\n throw new Error(\n 'Failed to Base64-decode Cashie data URI payload (invalid encoding)',\n )\n }\n}\n\n/**\n * Strips {@link CASHIE_JSON_DATA_URI_BASE64_PREFIX} and returns the UTF-8 JSON string inside.\n *\n * @param dataUri The data URI to decode\n * @returns The UTF-8 JSON string\n */\nexport function decodeCashieJsonDataUriToUtf8(dataUri: string): string {\n if (!dataUri.startsWith(CASHIE_JSON_DATA_URI_BASE64_PREFIX)) {\n throw new Error(\n `Expected Cashie JSON data URI prefix \"${CASHIE_JSON_DATA_URI_BASE64_PREFIX}\"`,\n )\n }\n const b64 = dataUri.slice(CASHIE_JSON_DATA_URI_BASE64_PREFIX.length)\n return decodeBase64ToUtf8(b64)\n}\n\n/**\n * Strips {@link CASHIE_SVG_DATA_URI_BASE64_PREFIX} and returns the UTF-8 SVG markup inside.\n *\n * @param dataUri The SVG data URI to decode\n * @returns The UTF-8 SVG markup string\n */\nexport function decodeCashieSvgDataUriToUtf8(dataUri: string): string {\n if (!dataUri.startsWith(CASHIE_SVG_DATA_URI_BASE64_PREFIX)) {\n throw new Error(\n `Expected Cashie SVG data URI prefix \"${CASHIE_SVG_DATA_URI_BASE64_PREFIX}\"`,\n )\n }\n const b64 = dataUri.slice(CASHIE_SVG_DATA_URI_BASE64_PREFIX.length)\n return decodeBase64ToUtf8(b64)\n}\n\n/**\n * Decodes the URI and parses JSON (untyped).\n *\n * @param dataUri The data URI to parse\n * @returns The parsed JSON\n */\nexport function parseCashieJsonDataUriJson(dataUri: string): unknown {\n const text = decodeCashieJsonDataUriToUtf8(dataUri)\n return JSON.parse(text) as unknown\n}\n\n/**\n * Parses `CashieIdentitySoul.tokenURI` metadata (`IdentitySoulMetadataEncoderLib`).\n *\n * @param dataUri The data URI to parse\n * @returns The parsed identity soul metadata\n */\nexport function parseCashieIdentitySoulTokenMetadata(\n dataUri: string,\n): CashieIdentitySoulTokenMetadata {\n const json = parseCashieJsonDataUriJson(dataUri)\n return cashieIdentitySoulTokenMetadataJsonSchema.parse(json)\n}\n\n/**\n * Parses `CashieReceiptBadge.badgeUri` metadata (`ReceiptBadgeMetadataEncoderLib`).\n *\n * @param dataUri The data URI to parse\n * @returns The parsed receipt badge metadata\n */\nexport function parseCashieReceiptBadgeMetadata(\n dataUri: string,\n): CashieReceiptBadgeMetadata {\n const json = parseCashieJsonDataUriJson(dataUri)\n return cashieReceiptBadgeMetadataSchema.parse(json)\n}\n\n/**\n * Same as {@link parseCashieReceiptBadgeMetadata}, but enforces that\n * `IERC5114.metadataFormat()` matches {@link CASHIE_RECEIPT_BADGE_METADATA_FORMAT}.\n *\n * @param badgeUri The badge URI to parse\n * @param metadataFormatFromContract The metadata format from the contract\n * @returns The parsed receipt badge metadata\n */\nexport function parseCashieReceiptBadgeMetadataFromBadgeUri(\n badgeUri: string,\n metadataFormatFromContract: string,\n): CashieReceiptBadgeMetadata {\n if (metadataFormatFromContract !== CASHIE_RECEIPT_BADGE_METADATA_FORMAT) {\n throw new Error(\n `Expected ERC-5114 metadataFormat \"${CASHIE_RECEIPT_BADGE_METADATA_FORMAT}\", received \"${metadataFormatFromContract}\"`,\n )\n }\n return parseCashieReceiptBadgeMetadata(badgeUri)\n}\n\n/**\n * Parses `CashiePaymentRecordBadge.badgeUri` metadata (`PaymentRecordBadgeMetadataEncoderLib`).\n *\n * @param dataUri The data URI to parse\n * @returns The parsed payment record badge metadata\n */\nexport function parseCashiePaymentRecordBadgeMetadata(\n dataUri: string,\n): CashiePaymentRecordBadgeMetadata {\n const json = parseCashieJsonDataUriJson(dataUri)\n return cashiePaymentRecordBadgeMetadataSchema.parse(json)\n}\n\n/**\n * Same as {@link parseCashiePaymentRecordBadgeMetadata}, but enforces that\n * `IERC5114.metadataFormat()` matches {@link CASHIE_PAYMENT_RECORD_BADGE_METADATA_FORMAT}.\n *\n * @param badgeUri The badge URI to parse\n * @param metadataFormatFromContract The metadata format from the contract\n * @returns The parsed payment record badge metadata\n */\nexport function parseCashiePaymentRecordBadgeMetadataFromBadgeUri(\n badgeUri: string,\n metadataFormatFromContract: string,\n): CashiePaymentRecordBadgeMetadata {\n if (\n metadataFormatFromContract !== CASHIE_PAYMENT_RECORD_BADGE_METADATA_FORMAT\n ) {\n throw new Error(\n `Expected ERC-5114 metadataFormat \"${CASHIE_PAYMENT_RECORD_BADGE_METADATA_FORMAT}\", received \"${metadataFormatFromContract}\"`,\n )\n }\n return parseCashiePaymentRecordBadgeMetadata(badgeUri)\n}\n\n/**\n * Checks if the JSON object is a valid Cashie metadata object.\n *\n * @param json The JSON object to check\n * @returns True if the JSON object is a valid Cashie metadata object\n */\nfunction isCashieMetadataJsonObject(\n json: unknown,\n): json is Record<string, unknown> {\n return typeof json === 'object' && json !== null && !Array.isArray(json)\n}\n\n/**\n * Parses the JSON object into a ParsedCashieMetadata object.\n *\n * @param json The JSON object to parse\n * @returns The parsed Cashie metadata object\n */\nfunction parseCashieMetadataJson(\n json: Record<string, unknown>,\n): ParsedCashieMetadata {\n if ('identityType' in json) {\n return {\n kind: 'identitySoul',\n data: cashieIdentitySoulTokenMetadataJsonSchema.parse(json),\n }\n }\n if ('receiptType' in json) {\n return {\n kind: 'receiptBadge',\n format: CASHIE_RECEIPT_BADGE_METADATA_FORMAT,\n data: cashieReceiptBadgeMetadataSchema.parse(json),\n }\n }\n if ('receiptBadgeId' in json) {\n return {\n kind: 'paymentRecordBadge',\n format: CASHIE_PAYMENT_RECORD_BADGE_METADATA_FORMAT,\n data: cashiePaymentRecordBadgeMetadataSchema.parse(json),\n }\n }\n throw new Error(\n 'Unrecognized Cashie metadata JSON (expected identityType, receiptType, or receiptBadgeId)',\n )\n}\n\n/**\n * Dispatches on JSON shape: **`identityType`** \u21D2 identity soul; **`receiptType`** \u21D2 receipt badge;\n * **`receiptBadgeId`** (without **`receiptType`**) \u21D2 payment record badge.\n *\n * @param dataUri The data URI to parse\n * @returns The parsed metadata\n */\nexport function parseCashieMetadataDataUri(\n dataUri: string,\n): ParsedCashieMetadata {\n const json = parseCashieJsonDataUriJson(dataUri)\n if (!isCashieMetadataJsonObject(json)) {\n throw new Error(\n 'Unrecognized Cashie metadata JSON (expected identityType, receiptType, or receiptBadgeId)',\n )\n }\n return parseCashieMetadataJson(json)\n}\n", "import { createPublicClient, Hex, http, toHex } from 'viem'\nimport { sepolia, localhost, anvil, Chain } from 'viem/chains'\nimport { parsePaymentRpcReturn } from './schemas.js'\nimport {\n PaymentRpcMethodNames,\n PaymentRpcParams,\n PaymentRpcReturn,\n} from './types.js'\nimport { assertUrl } from '../utils/utils.js'\n\nexport type PaymentRpcClientArgs = {\n url: string\n chainId: number\n}\n\nexport interface PaymentRpcClient {\n getIdentitySoulDiscovery(\n params: PaymentRpcParams<'discovery_supportedSouls'>,\n ): Promise<PaymentRpcReturn<'discovery_supportedSouls'>>\n\n getProtocolFeeBps(\n params: PaymentRpcParams<'payment_getProtocolFeeBps'>,\n ): Promise<PaymentRpcReturn<'payment_getProtocolFeeBps'>>\n\n calculateRewardAmount(\n params: PaymentRpcParams<'payment_calculateRewardAmount'>,\n ): Promise<PaymentRpcReturn<'payment_calculateRewardAmount'>>\n\n sendIntent(\n params: PaymentRpcParams<'payment_sendIntent'>,\n ): Promise<PaymentRpcReturn<'payment_sendIntent'>>\n\n getIntentStatuses(\n params: PaymentRpcParams<'payment_getIntentStatuses'>,\n ): Promise<PaymentRpcReturn<'payment_getIntentStatuses'>>\n\n prepareRouterCallsFromAction(\n params: PaymentRpcParams<'payment_prepareRouterCallsFromAction'>,\n ): Promise<PaymentRpcReturn<'payment_prepareRouterCallsFromAction'>>\n\n getBurnAuth(\n params: PaymentRpcParams<'identity_getBurnAuth'>,\n ): Promise<PaymentRpcReturn<'identity_getBurnAuth'>>\n\n getTokenURI(\n params: PaymentRpcParams<'identity_getTokenURI'>,\n ): Promise<PaymentRpcReturn<'identity_getTokenURI'>>\n\n sendPrePaymentSetup(\n params: PaymentRpcParams<'payment_sendPrePaymentSetup'>,\n ): Promise<PaymentRpcReturn<'payment_sendPrePaymentSetup'>>\n\n getPrePaymentSetup(\n params: PaymentRpcParams<'payment_getPrePaymentSetup'>,\n ): Promise<PaymentRpcReturn<'payment_getPrePaymentSetup'>>\n\n getBadgeOwnerOf(\n params: PaymentRpcParams<'badge_getOwnerOf'>,\n ): Promise<PaymentRpcReturn<'badge_getOwnerOf'>>\n\n getBadgeUri(\n params: PaymentRpcParams<'badge_getBadgeUri'>,\n ): Promise<PaymentRpcReturn<'badge_getBadgeUri'>>\n\n getBadgeMetadataFormat(\n params: PaymentRpcParams<'badge_getMetadataFormat'>,\n ): Promise<PaymentRpcReturn<'badge_getMetadataFormat'>>\n\n getTotalBadgesOfIdentity(\n params: PaymentRpcParams<'badge_totalBadgesOfIdentity'>,\n ): Promise<PaymentRpcReturn<'badge_totalBadgesOfIdentity'>>\n\n getBadgeOfIdentityByIndex(\n params: PaymentRpcParams<'badge_badgeOfIdentityByIndex'>,\n ): Promise<PaymentRpcReturn<'badge_badgeOfIdentityByIndex'>>\n\n getBadgesOfIdentity(\n params: PaymentRpcParams<'badge_badgesOfIdentity'>,\n ): Promise<PaymentRpcReturn<'badge_badgesOfIdentity'>>\n}\n\n/**\n * Creates a new Payment RPC client.\n *\n * @param args - The arguments for the Payment RPC client\n * @returns The Payment RPC client\n */\nexport const createPaymentRpcClient = (\n args: PaymentRpcClientArgs,\n): PaymentRpcClient => {\n /**\n * Returns the supported chains.\n *\n * @returns The supported chains.\n */\n const getSupportedChains = (): Record<Hex, Chain> => {\n return {\n '0xaa36a7': sepolia,\n '0x539': localhost,\n '0x7a69': anvil,\n }\n }\n\n /**\n * Assert that the chain ID is supported\n *\n * @param chainIdToValidate - The chain ID to validate\n * @throws an error if the chain ID is not supported\n * @returns the chain\n */\n const assertChainId = (chainIdToValidate: number): Chain => {\n const chainIdHex = toHex(chainIdToValidate)\n const chain = getSupportedChains()[chainIdHex]\n if (!chain) {\n throw new Error(`Chain ${chainIdHex} is not supported`)\n }\n return chain\n }\n\n const { url, chainId } = args\n\n const paymentRpcClient = createPublicClient({\n chain: assertChainId(chainId),\n transport: http(assertUrl(url)),\n })\n\n const request = async <T extends PaymentRpcMethodNames>(\n method: T,\n params: PaymentRpcParams<T>,\n ): Promise<PaymentRpcReturn<T>> => {\n const result = await paymentRpcClient.request({\n method,\n params,\n } as Parameters<typeof paymentRpcClient.request>[0])\n return parsePaymentRpcReturn(method, result)\n }\n\n return {\n getIdentitySoulDiscovery: (params) =>\n request('discovery_supportedSouls', params),\n\n getProtocolFeeBps: (params) => request('payment_getProtocolFeeBps', params),\n\n calculateRewardAmount: (params) =>\n request('payment_calculateRewardAmount', params),\n\n sendIntent: (params) => request('payment_sendIntent', params),\n\n getIntentStatuses: (params) => request('payment_getIntentStatuses', params),\n\n prepareRouterCallsFromAction: (params) =>\n request('payment_prepareRouterCallsFromAction', params),\n\n getBurnAuth: (params) => request('identity_getBurnAuth', params),\n\n getTokenURI: (params) => request('identity_getTokenURI', params),\n\n sendPrePaymentSetup: (params) =>\n request('payment_sendPrePaymentSetup', params),\n\n getPrePaymentSetup: (params) =>\n request('payment_getPrePaymentSetup', params),\n\n getBadgeOwnerOf: (params) => request('badge_getOwnerOf', params),\n\n getBadgeUri: (params) => request('badge_getBadgeUri', params),\n\n getBadgeMetadataFormat: (params) =>\n request('badge_getMetadataFormat', params),\n\n getTotalBadgesOfIdentity: (params) =>\n request('badge_totalBadgesOfIdentity', params),\n\n getBadgeOfIdentityByIndex: (params) =>\n request('badge_badgeOfIdentityByIndex', params),\n\n getBadgesOfIdentity: (params) => request('badge_badgesOfIdentity', params),\n }\n}\n", "import { z } from 'zod'\nimport { isAddress, isHex, type Address, type Hex } from 'viem'\n\nimport { BurnAuth } from '../identity/types.js'\nimport { identityMintSignPayloadWithSignatureSchema } from '../erc-7715/rules/schemas.js'\nimport { initCodeDataSchema } from '../erc-7715/request/schemas.js'\nimport { CashieRouterActions, type PaymentIntent } from '../intent/types.js'\nimport type { PaymentIntentTrackingEntry } from '../backend/tx-tracking/types.js'\nimport type { PaymentRpcMethodNames, PaymentRpcReturn } from './types.js'\n\nconst addressSchema = z.custom<Address>(\n (val) => typeof val === 'string' && isAddress(val),\n { message: 'Expected valid Ethereum address' },\n)\n\nconst hexSchema = z.custom<Hex>(\n (val) => typeof val === 'string' && isHex(val),\n { message: 'Expected valid hex string' },\n)\n\nconst burnAuthSchema = z.custom<BurnAuth>(\n (val) =>\n typeof val === 'number' &&\n Number.isInteger(val) &&\n val >= BurnAuth.IssuerOnly &&\n val <= BurnAuth.Neither,\n { message: 'Expected BurnAuth enum value (0\u20133)' },\n)\n\nconst routerCallSchema = z.object({\n to: addressSchema,\n data: hexSchema,\n})\n\nconst badgeOwnerSchema = z.object({\n nftAddress: addressSchema,\n nftTokenId: hexSchema,\n})\n\nconst identitySoulDiscoverySchema = z.object({\n identitySoulContract: z.object({\n address: addressSchema,\n badgeContracts: z.object({\n paymentRecordBadgeContract: addressSchema,\n receiptBadgeContract: addressSchema,\n }),\n }),\n})\n\nconst prePaymentSetupSchema = z\n .object({\n signedIdentityMintPayload: identityMintSignPayloadWithSignatureSchema,\n initCodeData: initCodeDataSchema,\n })\n .strict()\n\nconst rewardItemSchema = z\n .object({\n recipient: addressSchema,\n rewardAmount: hexSchema,\n rewardTokenAddress: addressSchema,\n })\n .strict()\n\nconst rewardIntentDetailsSchema = z\n .object({\n rewardPayer: addressSchema,\n rewardItems: z.array(rewardItemSchema),\n rewardPermissionContext: hexSchema,\n rewardDelegationManager: addressSchema,\n })\n .strict()\n\nconst paymentIntentSchema: z.ZodType<PaymentIntent> = z\n .object({\n action: z.enum(CashieRouterActions),\n chainId: hexSchema,\n recipient: addressSchema,\n payer: addressSchema,\n identityMintPayloads: z.array(identityMintSignPayloadWithSignatureSchema),\n tokenAddress: addressSchema,\n allowance: hexSchema,\n rewardIntentDetails: rewardIntentDetailsSchema.optional(),\n permissionContext: hexSchema,\n delegationManager: addressSchema,\n dependencies: z.array(initCodeDataSchema),\n salt: hexSchema,\n })\n .strict()\n .transform((value) => value as PaymentIntent)\n\nconst paymentIntentTrackingEntrySchema: z.ZodType<PaymentIntentTrackingEntry> =\n z\n .object({\n paymentIntent: paymentIntentSchema,\n status: z.enum(['pending', 'confirmed', 'failed']),\n txHash: hexSchema.nullable().optional(),\n blockNumber: hexSchema.nullable().optional(),\n })\n .strict()\n .transform((value) => value as PaymentIntentTrackingEntry)\n\nexport const paymentRpcReturnSchemas = {\n discovery_supportedSouls: identitySoulDiscoverySchema,\n payment_getProtocolFeeBps: hexSchema,\n payment_calculateRewardAmount: hexSchema,\n payment_sendIntent: hexSchema,\n payment_getIntentStatuses: z.array(paymentIntentTrackingEntrySchema),\n payment_prepareRouterCallsFromAction: z.array(routerCallSchema),\n identity_getBurnAuth: burnAuthSchema,\n identity_getTokenURI: z.string().nullable(),\n payment_sendPrePaymentSetup: hexSchema,\n payment_getPrePaymentSetup: prePaymentSetupSchema.nullable(),\n badge_getOwnerOf: badgeOwnerSchema,\n badge_getBadgeUri: z.string().nullable(),\n badge_getMetadataFormat: z.string(),\n badge_totalBadgesOfIdentity: hexSchema,\n badge_badgeOfIdentityByIndex: hexSchema,\n badge_badgesOfIdentity: z.array(hexSchema),\n} satisfies {\n [K in PaymentRpcMethodNames]: z.ZodType<PaymentRpcReturn<K>>\n}\n\nexport class PaymentRpcResponseValidationError extends Error {\n readonly method: PaymentRpcMethodNames\n readonly zodError: z.ZodError\n\n constructor(method: PaymentRpcMethodNames, zodError: z.ZodError) {\n const details = zodError.issues\n .map((issue) => {\n const path = issue.path.length > 0 ? ` at ${issue.path.join('.')}` : ''\n return `${issue.message}${path}`\n })\n .join('; ')\n super(`Invalid RPC response for \"${method}\": ${details}`)\n this.name = 'PaymentRpcResponseValidationError'\n this.method = method\n this.zodError = zodError\n }\n}\n\n/**\n * Parses the result from the RPC call to the corresponding Zod schema.\n *\n * @param method - The method name\n * @param result - The result from the RPC call\n * @returns The parsed result according to the Zod schema\n */\nexport function parsePaymentRpcReturn<T extends PaymentRpcMethodNames>(\n method: T,\n result: unknown,\n): PaymentRpcReturn<T> {\n const parsed = paymentRpcReturnSchemas[method].safeParse(result)\n if (!parsed.success) {\n throw new PaymentRpcResponseValidationError(method, parsed.error)\n }\n return parsed.data as PaymentRpcReturn<T>\n}\n", "import { z } from 'zod'\nimport { addressSchema, hexSchema, parseWithSchema } from '../common.types.js'\nimport { permissionSchema } from '../permission/schemas.js'\nimport { ruleSchema } from '../rules/schemas.js'\nimport type {\n GetPermissionsInfoResultParams,\n GetSupportedExecutionPermissionsResult,\n InitCodeData,\n PermissionRequest,\n PermissionResponse,\n PermissionsRequest,\n PermissionsResponse,\n} from './types.js'\n\nexport const initCodeDataSchema = z\n .object({\n factory: addressSchema,\n factoryData: hexSchema,\n })\n .strict()\n\nexport const permissionRequestSchema = z\n .object({\n /**\n * The chain ID of the permission.\n * hex-encoding of uint256\n */\n chainId: hexSchema,\n\n /**\n * The address of the signer that granted the permission.\n */\n from: addressSchema.optional(),\n\n /**\n * The address of the account that will receive the permission.\n */\n to: addressSchema,\n\n /**\n * The permission to grant.\n */\n permission: permissionSchema,\n\n /**\n * The rules to apply to the permission.\n */\n rules: z.array(ruleSchema).optional(),\n })\n .strict()\n\nexport const permissionsRequestSchema = z.array(permissionRequestSchema)\n\nexport const permissionResponseSchema = permissionRequestSchema\n .extend({\n /**\n * The address of the signer that granted the permission.\n */\n from: addressSchema,\n\n /**\n * The context is a catch-all to identify a permission for revoking permissions or redeeming permissions,\n * and can contain non-identifying data as well. The context is required as defined in ERC-7710.\n */\n context: hexSchema,\n\n /**\n * The ERC4337 init code dependency data.\n * These account are required to be deployed before the permission can be used.\n */\n dependencies: z.array(initCodeDataSchema),\n\n /**\n * The ERC7710 delegation manager address.\n */\n delegationManager: addressSchema,\n })\n .strict()\n\nexport const permissionsResponseSchema = z.array(permissionResponseSchema)\n\nexport const getPermissionsInfoResultParamsSchema = z\n .object({\n chainIds: z.array(hexSchema),\n })\n .strict()\n\nexport const supportedExecutionPermissionInfoSchema = z\n .object({\n chainIds: z.array(hexSchema),\n ruleTypes: z.array(z.string()),\n })\n .strict()\n\nexport const getSupportedExecutionPermissionsResultSchema = z\n .object({\n 'erc20-token-payment': supportedExecutionPermissionInfoSchema,\n })\n .strict()\n\n/**\n * Parses init code dependency data.\n *\n * @param value - The value to validate.\n * @returns The parsed init code dependency data.\n */\nexport function parseInitCodeData(value: unknown): InitCodeData {\n return parseWithSchema('InitCodeData', initCodeDataSchema, value)\n}\n\n/**\n * Parses a permission request.\n *\n * @param value - The value to validate.\n * @returns The parsed permission request.\n */\nexport function parsePermissionRequest(value: unknown): PermissionRequest {\n return parseWithSchema('PermissionRequest', permissionRequestSchema, value)\n}\n\n/**\n * Parses a list of permission requests.\n *\n * @param value - The value to validate.\n * @returns The parsed permission request list.\n */\nexport function parsePermissionsRequest(value: unknown): PermissionsRequest {\n return parseWithSchema('PermissionsRequest', permissionsRequestSchema, value)\n}\n\n/**\n * Parses a permission response.\n *\n * @param value - The value to validate.\n * @returns The parsed permission response.\n */\nexport function parsePermissionResponse(value: unknown): PermissionResponse {\n return parseWithSchema('PermissionResponse', permissionResponseSchema, value)\n}\n\n/**\n * Parses a list of permission responses.\n *\n * @param value - The value to validate.\n * @returns The parsed permission response list.\n */\nexport function parsePermissionsResponse(value: unknown): PermissionsResponse {\n return parseWithSchema(\n 'PermissionsResponse',\n permissionsResponseSchema,\n value,\n )\n}\n\n/**\n * Parses get-permissions-info result params.\n *\n * @param value - The value to validate.\n * @returns The parsed get-permissions-info result params.\n */\nexport function parseGetPermissionsInfoResultParams(\n value: unknown,\n): GetPermissionsInfoResultParams {\n return parseWithSchema(\n 'GetPermissionsInfoResultParams',\n getPermissionsInfoResultParamsSchema,\n value,\n )\n}\n\n/**\n * Parses supported execution permission metadata.\n *\n * @param value - The value to validate.\n * @returns The parsed supported execution permissions result.\n */\nexport function parseGetSupportedExecutionPermissionsResult(\n value: unknown,\n): GetSupportedExecutionPermissionsResult {\n return parseWithSchema(\n 'GetSupportedExecutionPermissionsResult',\n getSupportedExecutionPermissionsResultSchema,\n value,\n )\n}\n", "import { z } from 'zod'\nimport type { RewardItem } from '../../intent/index.js'\nimport {\n addressSchema,\n baseScopeSchema,\n hexSchema,\n parseWithSchema,\n} from '../common.types.js'\nimport type {\n BillingPeriod,\n ERC20TokenPaymentPermission,\n PaymentDetailsType,\n PaymentDetailsTypeMapping,\n Permission,\n} from './types.js'\n\nexport const billingPeriodSchema = z.enum(['weekly', 'monthly', 'annually'])\n\nexport const paymentDetailsTypeSchema = z.enum(['single', 'recurring'])\n\nexport const rewardItemSchema: z.ZodType<RewardItem> = z\n .object({\n recipient: addressSchema,\n rewardAmount: hexSchema,\n rewardTokenAddress: addressSchema,\n })\n .strict()\n\nexport const basePaymentDetailsDataSchema = z\n .object({\n /**\n * The allowance of the payment.\n */\n allowance: hexSchema,\n\n /**\n * The ERC20 token address.\n */\n tokenAddress: addressSchema,\n\n /**\n * The reward items of the payment.\n */\n rewardItems: z.array(rewardItemSchema).optional(),\n })\n .strict()\n\nexport const singlePaymentDetailsSchema = basePaymentDetailsDataSchema\n .extend({\n type: z.literal(paymentDetailsTypeSchema.enum.single),\n })\n .strict()\n\nexport const recurringPaymentDetailsSchema = basePaymentDetailsDataSchema\n .extend({\n type: z.literal(paymentDetailsTypeSchema.enum.recurring),\n startDate: z.number().int().optional(),\n billingPeriod: billingPeriodSchema,\n })\n .strict()\n\nexport const paymentDetailsSchema = z.discriminatedUnion('type', [\n singlePaymentDetailsSchema,\n recurringPaymentDetailsSchema,\n])\n\nexport const erc20TokenPaymentPermissionSchema = baseScopeSchema\n .omit({ type: true, data: true })\n .extend({\n type: z.literal('erc20-token-payment'),\n data: z\n .object({\n /**\n * The address to receive payment.\n */\n recipient: addressSchema,\n /**\n * The details on payment type ('single' or 'recurring').\n */\n paymentDetails: paymentDetailsSchema,\n })\n .strict(),\n })\n .strict()\n\nexport const permissionSchema = z.discriminatedUnion('type', [\n erc20TokenPaymentPermissionSchema,\n])\n\nexport const permissionSchemas = {\n 'erc20-token-payment': erc20TokenPaymentPermissionSchema,\n} satisfies {\n 'erc20-token-payment': typeof erc20TokenPaymentPermissionSchema\n}\n\n/**\n * Parses a billing period.\n *\n * @param value - The value to parse.\n * @returns The parsed billing period.\n */\nexport function parseBillingPeriod(value: unknown): BillingPeriod {\n return parseWithSchema('BillingPeriod', billingPeriodSchema, value)\n}\n\n/**\n * Parses a payment details type.\n *\n * @param value - The value to parse.\n * @returns The parsed payment details type.\n */\nexport function parsePaymentDetailsType(value: unknown): PaymentDetailsType {\n return parseWithSchema('PaymentDetailsType', paymentDetailsTypeSchema, value)\n}\n\n/**\n * Parses a base payment details data.\n *\n * @param value - The value to parse.\n * @returns The parsed base payment details data.\n */\nexport function parseBasePaymentDetailsData(\n value: unknown,\n): z.infer<typeof basePaymentDetailsDataSchema> {\n return parseWithSchema(\n 'BasePaymentDetailsData',\n basePaymentDetailsDataSchema,\n value,\n )\n}\n\n/**\n * Parses a payment details.\n *\n * @param value - The value to parse.\n * @returns The parsed payment details.\n */\nexport function parsePaymentDetails<T extends PaymentDetailsType>(\n value: unknown,\n): PaymentDetailsTypeMapping[T] {\n return parseWithSchema(\n 'PaymentDetails',\n paymentDetailsSchema,\n value,\n ) as PaymentDetailsTypeMapping[T]\n}\n\n/**\n * Parses an ERC20 token payment permission.\n *\n * @param value - The value to parse.\n * @returns The parsed ERC20 token payment permission.\n */\nexport function parseERC20TokenPaymentPermission(\n value: unknown,\n): ERC20TokenPaymentPermission {\n return parseWithSchema(\n 'ERC20TokenPaymentPermission',\n erc20TokenPaymentPermissionSchema,\n value,\n ) as ERC20TokenPaymentPermission\n}\n\n/**\n * Parses a permission.\n *\n * @param value - The value to parse.\n * @returns The parsed permission.\n */\nexport function parsePermission(value: unknown): Permission {\n return parseWithSchema('Permission', permissionSchema, value)\n}\n", "import { Address, Hex } from 'viem'\nimport { IdentityMintSignPayloadWithSignature } from '../identity/types.js'\n\nexport enum CashieRouterActions {\n PAYMENT_C2B = 'payment-c2b',\n PAYMENT_B2B = 'payment-b2b',\n PAYMENT_B2C = 'payment-b2c',\n DEPOSIT = 'deposit',\n WITHDRAW = 'withdraw',\n}\n\nexport type RewardItem = {\n recipient: Address\n rewardAmount: Hex\n rewardTokenAddress: Address\n}\n\nexport type RewardIntentDetails = {\n /**\n * The address of the payer of the reward.\n */\n rewardPayer: Address\n\n /**\n * The reward items of the payment.\n */\n rewardItems: RewardItem[]\n\n /**\n * The ERC-7710 permission context used to redeem the reward.\n */\n rewardPermissionContext: Hex\n\n /**\n * The delegation manager address.\n */\n rewardDelegationManager: Address\n}\n\n/**\n * RPC payload for executing a payment intent\n */\nexport type PaymentIntent = {\n /**\n * The action of the payment intent.\n */\n action: CashieRouterActions\n\n /**\n * hex-encoding of uint256\n */\n chainId: Hex\n\n /**\n * The address to send payment to.\n */\n recipient: Address\n\n /**\n * The address of the payer of the payment.\n */\n payer: Address\n\n /**\n * The identity mint payload with signature of the payment.\n */\n identityMintPayloads: IdentityMintSignPayloadWithSignature[]\n\n /**\n * The ERC20 token address(stablecoin address).\n */\n tokenAddress: Address\n\n /**\n * The amount of the payment.\n */\n allowance: Hex\n\n /**\n * The reward intent details of the payment.\n */\n rewardIntentDetails?: RewardIntentDetails\n\n /**\n * The ERC-7710 permission context used to redeem the payment.\n */\n permissionContext: Hex\n\n /**\n * The delegation manager address.\n */\n delegationManager: Address\n\n /**\n * Optional but when present then fields for factory and factoryData are required as defined in ERC-4337.\n */\n dependencies: {\n factory: Address\n factoryData: Hex\n }[]\n\n /**\n * The salt of the payment intent.\n */\n salt: Hex\n}\n", "/**\n * Canonical intent encoding for stable `paymentIntentHash` (Redis, APIs, optional router event arg).\n * AA orchestration and full {@link PaymentIntent} payloads stay in the node/wallet layer.\n */\nimport { encodeAbiParameters, Hex, keccak256, zeroAddress } from 'viem'\nimport { PaymentIntent } from './types.js'\n\nconst OFF_CHAIN_PAYMENT_INTENT_ABI_PARAMS = [\n { name: 'action', type: 'string' },\n { name: 'chainId', type: 'uint256' },\n { name: 'recipient', type: 'address' },\n { name: 'payer', type: 'address' },\n {\n name: 'rewardIntentDetails',\n type: 'tuple',\n components: [\n { name: 'rewardPayer', type: 'address' },\n {\n name: 'rewardItems',\n type: 'tuple[]',\n components: [\n { name: 'recipient', type: 'address' },\n { name: 'rewardAmount', type: 'uint256' },\n { name: 'rewardTokenAddress', type: 'address' },\n ],\n },\n { name: 'rewardDelegationManager', type: 'address' },\n ],\n },\n {\n name: 'tokenAddress',\n type: 'address',\n },\n { name: 'allowance', type: 'uint256' },\n { name: 'delegationManager', type: 'address' },\n { name: 'salt', type: 'bytes32' },\n] as const\n\n/**\n * Encodes a payment intent for hashing.\n *\n * dependencies, and identityMintPayloads are not encoded in the payment intent.\n *\n * @param paymentIntent - The payment intent to encode\n * @returns The encoded payment intent as a hex string\n */\nexport function encodePaymentIntent(paymentIntent: PaymentIntent): Hex {\n const rewardIntentDetails = paymentIntent.rewardIntentDetails ?? {\n rewardPayer: zeroAddress,\n rewardItems: [],\n rewardDelegationManager: zeroAddress,\n }\n\n return encodeAbiParameters(OFF_CHAIN_PAYMENT_INTENT_ABI_PARAMS, [\n paymentIntent.action,\n BigInt(paymentIntent.chainId), // \"0x1\" -> 1n\n paymentIntent.recipient,\n paymentIntent.payer,\n {\n rewardPayer: rewardIntentDetails.rewardPayer,\n rewardItems: rewardIntentDetails.rewardItems.map((rewardItem) => ({\n recipient: rewardItem.recipient,\n rewardAmount: BigInt(rewardItem.rewardAmount),\n rewardTokenAddress: rewardItem.rewardTokenAddress,\n })),\n rewardDelegationManager: rewardIntentDetails.rewardDelegationManager,\n },\n paymentIntent.tokenAddress,\n BigInt(paymentIntent.allowance),\n paymentIntent.delegationManager,\n paymentIntent.salt,\n ])\n}\n\n/**\n * Returns keccak256(encodePaymentIntent(paymentIntent)).\n *\n * @param paymentIntent - The payment intent to hash\n * @returns The hash of the payment intent\n */\nexport function getPaymentIntentHash(paymentIntent: PaymentIntent) {\n return keccak256(encodePaymentIntent(paymentIntent))\n}\n", "// Auto generated: This file contains auto-generated ABI for the Cashie Protocol contracts and should not be edited manually.\n\n// Contract ABI for CashieRouterV1.sol\nexport const CASHIE_ROUTER_V1_CONTRACT_ABI = [\n {\n type: 'constructor',\n inputs: [\n {\n name: '_initialOwner',\n type: 'address',\n internalType: 'address',\n },\n {\n name: '_treasuryFeeAddress',\n type: 'address',\n internalType: 'address',\n },\n {\n name: '_supportedPaymentTokens',\n type: 'address[]',\n internalType: 'address[]',\n },\n {\n name: '_protocolFeeBps',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: '_paymentProcessorFeeBps',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: '_rewardBps',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: '_protocolRewardToken',\n type: 'address',\n internalType: 'contract IERC20Metadata',\n },\n {\n name: '_stakingManager',\n type: 'address',\n internalType: 'contract IStakingManager',\n },\n {\n name: '_identitySoul',\n type: 'address',\n internalType: 'contract ICashieIdentitySoul',\n },\n {\n name: '_receiptBadge',\n type: 'address',\n internalType: 'contract ICashieReceiptBadge',\n },\n {\n name: '_paymentRecordBadge',\n type: 'address',\n internalType: 'contract ICashiePaymentRecordBadge',\n },\n {\n name: '_identityVerificationProvers',\n type: 'address[]',\n internalType: 'address[]',\n },\n ],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'acceptOwnership',\n inputs: [],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'addIdentityVerificationProver',\n inputs: [\n {\n name: 'prover',\n type: 'address',\n internalType: 'address',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'adjustProtocolFeeBps',\n inputs: [\n {\n name: '_delta',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: '_increase',\n type: 'bool',\n internalType: 'bool',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'adjustRewardBps',\n inputs: [\n {\n name: '_delta',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: '_increase',\n type: 'bool',\n internalType: 'bool',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'calculateFee',\n inputs: [\n {\n name: '_amount',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: '_feeBps',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n outputs: [\n {\n name: '',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n stateMutability: 'pure',\n },\n {\n type: 'function',\n name: 'calculateReward',\n inputs: [\n {\n name: '_paymentTokenAmount',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: '_paymentTokenDecimals',\n type: 'uint8',\n internalType: 'uint8',\n },\n ],\n outputs: [\n {\n name: '',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'deposit',\n inputs: [\n {\n name: '_recipient',\n type: 'address',\n internalType: 'address',\n },\n {\n name: '_tokenAddress',\n type: 'address',\n internalType: 'address',\n },\n {\n name: '_allowance',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'identitySoul',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'address',\n internalType: 'contract ICashieIdentitySoul',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'identityTokenAddress',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'address',\n internalType: 'address',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'isIdentityVerificationProver',\n inputs: [\n {\n name: 'prover',\n type: 'address',\n internalType: 'address',\n },\n ],\n outputs: [\n {\n name: '',\n type: 'bool',\n internalType: 'bool',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'isSupportedToken',\n inputs: [\n {\n name: '_tokenAddress',\n type: 'address',\n internalType: 'address',\n },\n ],\n outputs: [\n {\n name: '',\n type: 'bool',\n internalType: 'bool',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'isValidSignature',\n inputs: [\n {\n name: 'hash',\n type: 'bytes32',\n internalType: 'bytes32',\n },\n {\n name: 'signature',\n type: 'bytes',\n internalType: 'bytes',\n },\n ],\n outputs: [\n {\n name: 'magicValue',\n type: 'bytes4',\n internalType: 'bytes4',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'issueIdentityToken',\n inputs: [\n {\n name: 'payload',\n type: 'tuple',\n internalType: 'struct IdentityMintPayload',\n components: [\n {\n name: 'identityType',\n type: 'uint8',\n internalType: 'enum IdentityType',\n },\n {\n name: 'domain',\n type: 'string',\n internalType: 'string',\n },\n {\n name: 'burnAuth',\n type: 'uint8',\n internalType: 'enum IERC5484.BurnAuth',\n },\n {\n name: 'identityCommitment',\n type: 'bytes',\n internalType: 'bytes',\n },\n {\n name: 'to',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'proof',\n type: 'bytes',\n internalType: 'bytes',\n },\n {\n name: 'signature',\n type: 'bytes',\n internalType: 'bytes',\n },\n ],\n },\n ],\n outputs: [\n {\n name: 'tokenId',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'owner',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'address',\n internalType: 'address',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'payB2B',\n inputs: [\n {\n name: '_recipient',\n type: 'address',\n internalType: 'address',\n },\n {\n name: '_tokenAddress',\n type: 'address',\n internalType: 'address',\n },\n {\n name: '_allowance',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: '_feeBeneficiaryAddress',\n type: 'address',\n internalType: 'address',\n },\n {\n name: '_receiptBadgeRouterMintPayload',\n type: 'tuple',\n internalType: 'struct ReceiptBadgeRouterMintPayload',\n components: [\n {\n name: 'salt',\n type: 'bytes32',\n internalType: 'bytes32',\n },\n {\n name: 'receiptType',\n type: 'uint8',\n internalType: 'enum ReceiptType',\n },\n ],\n },\n ],\n outputs: [\n {\n name: 'receiptBadgeId',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'paymentRecordBadgeId',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'payB2C',\n inputs: [\n {\n name: '_recipient',\n type: 'address',\n internalType: 'address',\n },\n {\n name: '_tokenAddress',\n type: 'address',\n internalType: 'address',\n },\n {\n name: '_allowance',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: '_feeBeneficiaryAddress',\n type: 'address',\n internalType: 'address',\n },\n {\n name: '_receiptBadgeRouterMintPayload',\n type: 'tuple',\n internalType: 'struct ReceiptBadgeRouterMintPayload',\n components: [\n {\n name: 'salt',\n type: 'bytes32',\n internalType: 'bytes32',\n },\n {\n name: 'receiptType',\n type: 'uint8',\n internalType: 'enum ReceiptType',\n },\n ],\n },\n ],\n outputs: [\n {\n name: 'receiptBadgeId',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'paymentRecordBadgeId',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'payC2B',\n inputs: [\n {\n name: '_recipient',\n type: 'address',\n internalType: 'address',\n },\n {\n name: '_tokenAddress',\n type: 'address',\n internalType: 'address',\n },\n {\n name: '_allowance',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: '_feeBeneficiaryAddress',\n type: 'address',\n internalType: 'address',\n },\n {\n name: '_receiptBadgeRouterMintPayload',\n type: 'tuple',\n internalType: 'struct ReceiptBadgeRouterMintPayload',\n components: [\n {\n name: 'salt',\n type: 'bytes32',\n internalType: 'bytes32',\n },\n {\n name: 'receiptType',\n type: 'uint8',\n internalType: 'enum ReceiptType',\n },\n ],\n },\n ],\n outputs: [\n {\n name: 'receiptBadgeId',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'paymentRecordBadgeId',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'paymentProcessorFeeBps',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'paymentRecordBadge',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'address',\n internalType: 'contract ICashiePaymentRecordBadge',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'pendingOwner',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'address',\n internalType: 'address',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'protocolFeeBps',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'receiptBadge',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'address',\n internalType: 'contract ICashieReceiptBadge',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'receiptBadgeAddress',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'address',\n internalType: 'address',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'registerToken',\n inputs: [\n {\n name: '_tokenAddress',\n type: 'address',\n internalType: 'address',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'removeIdentityVerificationProver',\n inputs: [\n {\n name: 'prover',\n type: 'address',\n internalType: 'address',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'renounceOwnership',\n inputs: [],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'reward',\n inputs: [\n {\n name: '_rewards',\n type: 'tuple[]',\n internalType: 'struct RewardItem[]',\n components: [\n {\n name: 'recipient',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'rewardAmount',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'rewardTokenAddress',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'rewardBps',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'rewardToken',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'address',\n internalType: 'contract IERC20Metadata',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'rewardTokenAddress',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'address',\n internalType: 'address',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'supportedPaymentTokens',\n inputs: [\n {\n name: '',\n type: 'address',\n internalType: 'address',\n },\n ],\n outputs: [\n {\n name: '',\n type: 'bool',\n internalType: 'bool',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'supportsInterface',\n inputs: [\n {\n name: 'interfaceId',\n type: 'bytes4',\n internalType: 'bytes4',\n },\n ],\n outputs: [\n {\n name: '',\n type: 'bool',\n internalType: 'bool',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'transferOwnership',\n inputs: [\n {\n name: 'newOwner',\n type: 'address',\n internalType: 'address',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'treasuryFeeAddress',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'address',\n internalType: 'address',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'withdraw',\n inputs: [\n {\n name: '_recipient',\n type: 'address',\n internalType: 'address',\n },\n {\n name: '_tokenAddress',\n type: 'address',\n internalType: 'address',\n },\n {\n name: '_allowance',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: '_feeBeneficiaryAddress',\n type: 'address',\n internalType: 'address',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'event',\n name: 'Deposited',\n inputs: [\n {\n name: 'sender',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n {\n name: 'recipient',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n {\n name: 'amount',\n type: 'uint256',\n indexed: false,\n internalType: 'uint256',\n },\n {\n name: 'tokenAddress',\n type: 'address',\n indexed: false,\n internalType: 'address',\n },\n ],\n anonymous: false,\n },\n {\n type: 'event',\n name: 'IdentityVerificationProverAdded',\n inputs: [\n {\n name: 'prover',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n ],\n anonymous: false,\n },\n {\n type: 'event',\n name: 'IdentityVerificationProverRemoved',\n inputs: [\n {\n name: 'prover',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n ],\n anonymous: false,\n },\n {\n type: 'event',\n name: 'IssueReward',\n inputs: [\n {\n name: 'recipient',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n {\n name: 'rewardAmount',\n type: 'uint256',\n indexed: false,\n internalType: 'uint256',\n },\n {\n name: 'rewardToken',\n type: 'address',\n indexed: false,\n internalType: 'address',\n },\n ],\n anonymous: false,\n },\n {\n type: 'event',\n name: 'OwnershipTransferStarted',\n inputs: [\n {\n name: 'previousOwner',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n {\n name: 'newOwner',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n ],\n anonymous: false,\n },\n {\n type: 'event',\n name: 'OwnershipTransferred',\n inputs: [\n {\n name: 'previousOwner',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n {\n name: 'newOwner',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n ],\n anonymous: false,\n },\n {\n type: 'event',\n name: 'Payment',\n inputs: [\n {\n name: 'payer',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n {\n name: 'receiver',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n {\n name: 'feeBeneficiaryAddress',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n {\n name: 'allowance',\n type: 'uint256',\n indexed: false,\n internalType: 'uint256',\n },\n {\n name: 'recipientAmount',\n type: 'uint256',\n indexed: false,\n internalType: 'uint256',\n },\n {\n name: 'protocolFee',\n type: 'uint256',\n indexed: false,\n internalType: 'uint256',\n },\n {\n name: 'protocolFeeBps',\n type: 'uint256',\n indexed: false,\n internalType: 'uint256',\n },\n {\n name: 'tokenAddress',\n type: 'address',\n indexed: false,\n internalType: 'address',\n },\n ],\n anonymous: false,\n },\n {\n type: 'event',\n name: 'ProtocolFeeBpsAdjusted',\n inputs: [\n {\n name: 'oldFeeBps',\n type: 'uint256',\n indexed: false,\n internalType: 'uint256',\n },\n {\n name: 'newFeeBps',\n type: 'uint256',\n indexed: false,\n internalType: 'uint256',\n },\n {\n name: 'increased',\n type: 'bool',\n indexed: false,\n internalType: 'bool',\n },\n ],\n anonymous: false,\n },\n {\n type: 'event',\n name: 'RewardBpsAdjusted',\n inputs: [\n {\n name: 'oldRewardBps',\n type: 'uint256',\n indexed: false,\n internalType: 'uint256',\n },\n {\n name: 'newRewardBps',\n type: 'uint256',\n indexed: false,\n internalType: 'uint256',\n },\n {\n name: 'increased',\n type: 'bool',\n indexed: false,\n internalType: 'bool',\n },\n ],\n anonymous: false,\n },\n {\n type: 'event',\n name: 'Withdrawn',\n inputs: [\n {\n name: 'account',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n {\n name: 'recipient',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n {\n name: 'amount',\n type: 'uint256',\n indexed: false,\n internalType: 'uint256',\n },\n {\n name: 'protocolFee',\n type: 'uint256',\n indexed: false,\n internalType: 'uint256',\n },\n {\n name: 'protocolFeeBps',\n type: 'uint256',\n indexed: false,\n internalType: 'uint256',\n },\n {\n name: 'tokenAddress',\n type: 'address',\n indexed: false,\n internalType: 'address',\n },\n ],\n anonymous: false,\n },\n {\n type: 'error',\n name: 'IdentityVerificationProverAlreadyRegistered',\n inputs: [\n {\n name: 'prover',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n {\n type: 'error',\n name: 'IdentityVerificationProverNotRegistered',\n inputs: [\n {\n name: 'prover',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n {\n type: 'error',\n name: 'InvalidIdentityVerificationProver',\n inputs: [],\n },\n {\n type: 'error',\n name: 'OwnableInvalidOwner',\n inputs: [\n {\n name: 'owner',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n {\n type: 'error',\n name: 'OwnableUnauthorizedAccount',\n inputs: [\n {\n name: 'account',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n {\n type: 'error',\n name: 'PaymentAmountCannotBeZero',\n inputs: [],\n },\n {\n type: 'error',\n name: 'ProcessorNotEligible',\n inputs: [],\n },\n {\n type: 'error',\n name: 'SafeERC20FailedOperation',\n inputs: [\n {\n name: 'token',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n {\n type: 'error',\n name: 'TokenAllowanceNotApprovedForDeposit',\n inputs: [],\n },\n {\n type: 'error',\n name: 'TokenAllowanceNotApprovedForPayment',\n inputs: [],\n },\n {\n type: 'error',\n name: 'TokenAllowanceNotApprovedForReward',\n inputs: [\n {\n name: 'token',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'spender',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'allowance',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n },\n {\n type: 'error',\n name: 'TokenAllowanceNotApprovedForWithdraw',\n inputs: [],\n },\n {\n type: 'error',\n name: 'TokenAlreadyRegistered',\n inputs: [],\n },\n {\n type: 'error',\n name: 'TokenNotSupported',\n inputs: [],\n },\n] as const\n\n// Contract ABI for CashieRouterGuard.sol\nexport const CASHIE_ROUTER_GUARD_CONTRACT_ABI = [\n {\n type: 'function',\n name: 'acceptOwnership',\n inputs: [],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'owner',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'address',\n internalType: 'address',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'pendingOwner',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'address',\n internalType: 'address',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'renounceOwnership',\n inputs: [],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'router',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'address',\n internalType: 'address',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'setRouter',\n inputs: [\n {\n name: '_newRouter',\n type: 'address',\n internalType: 'address',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'transferOwnership',\n inputs: [\n {\n name: 'newOwner',\n type: 'address',\n internalType: 'address',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'event',\n name: 'OwnershipTransferStarted',\n inputs: [\n {\n name: 'previousOwner',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n {\n name: 'newOwner',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n ],\n anonymous: false,\n },\n {\n type: 'event',\n name: 'OwnershipTransferred',\n inputs: [\n {\n name: 'previousOwner',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n {\n name: 'newOwner',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n ],\n anonymous: false,\n },\n {\n type: 'event',\n name: 'RouterSet',\n inputs: [\n {\n name: 'router',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n ],\n anonymous: false,\n },\n {\n type: 'error',\n name: 'OwnableInvalidOwner',\n inputs: [\n {\n name: 'owner',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n {\n type: 'error',\n name: 'OwnableUnauthorizedAccount',\n inputs: [\n {\n name: 'account',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n {\n type: 'error',\n name: 'RouterInvalidInterface',\n inputs: [\n {\n name: 'account',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n {\n type: 'error',\n name: 'RouterNotSet',\n inputs: [],\n },\n {\n type: 'error',\n name: 'RouterUnauthorizedAccount',\n inputs: [\n {\n name: 'account',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n] as const\n\n// Contract ABI for CashieIdentitySoul.sol\nexport const CASHIE_IDENTITY_SOUL_CONTRACT_ABI = [\n {\n type: 'constructor',\n inputs: [\n {\n name: '_name',\n type: 'string',\n internalType: 'string',\n },\n {\n name: '_symbol',\n type: 'string',\n internalType: 'string',\n },\n {\n name: '_owner',\n type: 'address',\n internalType: 'address',\n },\n ],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'DOMAIN_VERSION',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'string',\n internalType: 'string',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'NAME',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'string',\n internalType: 'string',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'acceptOwnership',\n inputs: [],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'approve',\n inputs: [\n {\n name: 'to',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'tokenId',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n outputs: [],\n stateMutability: 'pure',\n },\n {\n type: 'function',\n name: 'balanceOf',\n inputs: [\n {\n name: 'owner',\n type: 'address',\n internalType: 'address',\n },\n ],\n outputs: [\n {\n name: '',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'burnAuth',\n inputs: [\n {\n name: 'tokenId',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n outputs: [\n {\n name: '',\n type: 'uint8',\n internalType: 'enum IERC5484.BurnAuth',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'burnIdentity',\n inputs: [\n {\n name: 'tokenId',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'eip712Domain',\n inputs: [],\n outputs: [\n {\n name: 'fields',\n type: 'bytes1',\n internalType: 'bytes1',\n },\n {\n name: 'name',\n type: 'string',\n internalType: 'string',\n },\n {\n name: 'version',\n type: 'string',\n internalType: 'string',\n },\n {\n name: 'chainId',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'verifyingContract',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'salt',\n type: 'bytes32',\n internalType: 'bytes32',\n },\n {\n name: 'extensions',\n type: 'uint256[]',\n internalType: 'uint256[]',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'getApproved',\n inputs: [\n {\n name: 'tokenId',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n outputs: [\n {\n name: '',\n type: 'address',\n internalType: 'address',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'getDomainHash',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'bytes32',\n internalType: 'bytes32',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'isApprovedForAll',\n inputs: [\n {\n name: 'owner',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'operator',\n type: 'address',\n internalType: 'address',\n },\n ],\n outputs: [\n {\n name: '',\n type: 'bool',\n internalType: 'bool',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'mintIdentity',\n inputs: [\n {\n name: 'payload',\n type: 'tuple',\n internalType: 'struct IdentityMintPayload',\n components: [\n {\n name: 'identityType',\n type: 'uint8',\n internalType: 'enum IdentityType',\n },\n {\n name: 'domain',\n type: 'string',\n internalType: 'string',\n },\n {\n name: 'burnAuth',\n type: 'uint8',\n internalType: 'enum IERC5484.BurnAuth',\n },\n {\n name: 'identityCommitment',\n type: 'bytes',\n internalType: 'bytes',\n },\n {\n name: 'to',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'proof',\n type: 'bytes',\n internalType: 'bytes',\n },\n {\n name: 'signature',\n type: 'bytes',\n internalType: 'bytes',\n },\n ],\n },\n ],\n outputs: [\n {\n name: 'tokenId',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'name',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'string',\n internalType: 'string',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'owner',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'address',\n internalType: 'address',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'ownerOf',\n inputs: [\n {\n name: 'tokenId',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n outputs: [\n {\n name: '',\n type: 'address',\n internalType: 'address',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'pendingOwner',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'address',\n internalType: 'address',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'renounceOwnership',\n inputs: [],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'router',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'address',\n internalType: 'address',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'safeTransferFrom',\n inputs: [\n {\n name: 'from',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'to',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'tokenId',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'safeTransferFrom',\n inputs: [\n {\n name: 'from',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'to',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'tokenId',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: '_data',\n type: 'bytes',\n internalType: 'bytes',\n },\n ],\n outputs: [],\n stateMutability: 'pure',\n },\n {\n type: 'function',\n name: 'setApprovalForAll',\n inputs: [\n {\n name: 'operator',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'approved',\n type: 'bool',\n internalType: 'bool',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'setRouter',\n inputs: [\n {\n name: '_newRouter',\n type: 'address',\n internalType: 'address',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'supportsInterface',\n inputs: [\n {\n name: 'interfaceId',\n type: 'bytes4',\n internalType: 'bytes4',\n },\n ],\n outputs: [\n {\n name: '',\n type: 'bool',\n internalType: 'bool',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'symbol',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'string',\n internalType: 'string',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'tokenIdFor',\n inputs: [\n {\n name: 'account',\n type: 'address',\n internalType: 'address',\n },\n ],\n outputs: [\n {\n name: 'tokenId',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n stateMutability: 'pure',\n },\n {\n type: 'function',\n name: 'tokenURI',\n inputs: [\n {\n name: 'tokenId',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n outputs: [\n {\n name: '',\n type: 'string',\n internalType: 'string',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'transferFrom',\n inputs: [\n {\n name: 'from',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'to',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'tokenId',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n outputs: [],\n stateMutability: 'pure',\n },\n {\n type: 'function',\n name: 'transferOwnership',\n inputs: [\n {\n name: 'newOwner',\n type: 'address',\n internalType: 'address',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'event',\n name: 'Approval',\n inputs: [\n {\n name: 'owner',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n {\n name: 'approved',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n {\n name: 'tokenId',\n type: 'uint256',\n indexed: true,\n internalType: 'uint256',\n },\n ],\n anonymous: false,\n },\n {\n type: 'event',\n name: 'ApprovalForAll',\n inputs: [\n {\n name: 'owner',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n {\n name: 'operator',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n {\n name: 'approved',\n type: 'bool',\n indexed: false,\n internalType: 'bool',\n },\n ],\n anonymous: false,\n },\n {\n type: 'event',\n name: 'Burned',\n inputs: [\n {\n name: 'from',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n {\n name: 'tokenId',\n type: 'uint256',\n indexed: true,\n internalType: 'uint256',\n },\n {\n name: 'auth',\n type: 'uint8',\n indexed: false,\n internalType: 'enum IERC5484.BurnAuth',\n },\n ],\n anonymous: false,\n },\n {\n type: 'event',\n name: 'EIP712DomainChanged',\n inputs: [],\n anonymous: false,\n },\n {\n type: 'event',\n name: 'Issued',\n inputs: [\n {\n name: 'from',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n {\n name: 'to',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n {\n name: 'tokenId',\n type: 'uint256',\n indexed: true,\n internalType: 'uint256',\n },\n {\n name: 'burnAuth',\n type: 'uint8',\n indexed: false,\n internalType: 'enum IERC5484.BurnAuth',\n },\n ],\n anonymous: false,\n },\n {\n type: 'event',\n name: 'OwnershipTransferStarted',\n inputs: [\n {\n name: 'previousOwner',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n {\n name: 'newOwner',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n ],\n anonymous: false,\n },\n {\n type: 'event',\n name: 'OwnershipTransferred',\n inputs: [\n {\n name: 'previousOwner',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n {\n name: 'newOwner',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n ],\n anonymous: false,\n },\n {\n type: 'event',\n name: 'RouterSet',\n inputs: [\n {\n name: 'router',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n ],\n anonymous: false,\n },\n {\n type: 'event',\n name: 'SetDomain',\n inputs: [\n {\n name: 'domainHash',\n type: 'bytes32',\n indexed: true,\n internalType: 'bytes32',\n },\n {\n name: 'name',\n type: 'string',\n indexed: false,\n internalType: 'string',\n },\n {\n name: 'domainVersion',\n type: 'string',\n indexed: false,\n internalType: 'string',\n },\n {\n name: 'chainId',\n type: 'uint256',\n indexed: false,\n internalType: 'uint256',\n },\n {\n name: 'contractAddress',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n ],\n anonymous: false,\n },\n {\n type: 'event',\n name: 'Transfer',\n inputs: [\n {\n name: 'from',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n {\n name: 'to',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n {\n name: 'tokenId',\n type: 'uint256',\n indexed: true,\n internalType: 'uint256',\n },\n ],\n anonymous: false,\n },\n {\n type: 'error',\n name: 'BurnAuthNotSupported',\n inputs: [],\n },\n {\n type: 'error',\n name: 'ERC721IncorrectOwner',\n inputs: [\n {\n name: 'sender',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'tokenId',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'owner',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n {\n type: 'error',\n name: 'ERC721InsufficientApproval',\n inputs: [\n {\n name: 'operator',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'tokenId',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n },\n {\n type: 'error',\n name: 'ERC721InvalidApprover',\n inputs: [\n {\n name: 'approver',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n {\n type: 'error',\n name: 'ERC721InvalidOperator',\n inputs: [\n {\n name: 'operator',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n {\n type: 'error',\n name: 'ERC721InvalidOwner',\n inputs: [\n {\n name: 'owner',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n {\n type: 'error',\n name: 'ERC721InvalidReceiver',\n inputs: [\n {\n name: 'receiver',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n {\n type: 'error',\n name: 'ERC721InvalidSender',\n inputs: [\n {\n name: 'sender',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n {\n type: 'error',\n name: 'ERC721NonTransferable',\n inputs: [],\n },\n {\n type: 'error',\n name: 'ERC721NonexistentToken',\n inputs: [\n {\n name: 'tokenId',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n },\n {\n type: 'error',\n name: 'InvalidBurnAuth',\n inputs: [\n {\n name: 'tokenId',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n },\n {\n type: 'error',\n name: 'InvalidIdentityDomain',\n inputs: [],\n },\n {\n type: 'error',\n name: 'InvalidIdentityProof',\n inputs: [],\n },\n {\n type: 'error',\n name: 'InvalidIdentitySignature',\n inputs: [],\n },\n {\n type: 'error',\n name: 'InvalidShortString',\n inputs: [],\n },\n {\n type: 'error',\n name: 'OwnableInvalidOwner',\n inputs: [\n {\n name: 'owner',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n {\n type: 'error',\n name: 'OwnableUnauthorizedAccount',\n inputs: [\n {\n name: 'account',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n {\n type: 'error',\n name: 'RouterInvalidInterface',\n inputs: [\n {\n name: 'account',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n {\n type: 'error',\n name: 'RouterNotSet',\n inputs: [],\n },\n {\n type: 'error',\n name: 'RouterUnauthorizedAccount',\n inputs: [\n {\n name: 'account',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n {\n type: 'error',\n name: 'RouterUnauthorizedBurn',\n inputs: [\n {\n name: 'account',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n {\n type: 'error',\n name: 'StringTooLong',\n inputs: [\n {\n name: 'str',\n type: 'string',\n internalType: 'string',\n },\n ],\n },\n] as const\n\n// Contract ABI for CashieReceiptBadge.sol\nexport const CASHIE_RECEIPT_BADGE_CONTRACT_ABI = [\n {\n type: 'constructor',\n inputs: [\n {\n name: 'owner_',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'identityContract_',\n type: 'address',\n internalType: 'address',\n },\n ],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'acceptOwnership',\n inputs: [],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'badgeOfIdentityByIndex',\n inputs: [\n {\n name: 'identityTokenId',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'index',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n outputs: [\n {\n name: 'badgeId',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'badgeUri',\n inputs: [\n {\n name: 'badgeId',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n outputs: [\n {\n name: '',\n type: 'string',\n internalType: 'string',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'badgesOfIdentity',\n inputs: [\n {\n name: 'identityTokenId',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'offset',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'limit',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n outputs: [\n {\n name: 'badgeIds',\n type: 'uint256[]',\n internalType: 'uint256[]',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'collectionUri',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'string',\n internalType: 'string',\n },\n ],\n stateMutability: 'pure',\n },\n {\n type: 'function',\n name: 'identityContract',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'address',\n internalType: 'address',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'metadataFormat',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'string',\n internalType: 'string',\n },\n ],\n stateMutability: 'pure',\n },\n {\n type: 'function',\n name: 'mint',\n inputs: [\n {\n name: 'payload',\n type: 'tuple',\n internalType: 'struct ReceiptBadgeMintPayload',\n components: [\n {\n name: 'soulBoundTo',\n type: 'tuple',\n internalType: 'struct SoulBoundTo',\n components: [\n {\n name: 'identityContract',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'tokenId',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n },\n {\n name: 'receiptType',\n type: 'uint8',\n internalType: 'enum ReceiptType',\n },\n {\n name: 'blockNumber',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'recipient',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'chainId',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'tokenAddress',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'allowance',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'salt',\n type: 'bytes32',\n internalType: 'bytes32',\n },\n ],\n },\n ],\n outputs: [\n {\n name: 'badgeId',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'owner',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'address',\n internalType: 'address',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'ownerOf',\n inputs: [\n {\n name: 'badgeId',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n outputs: [\n {\n name: 'nftAddress',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'nftTokenId',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'pendingOwner',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'address',\n internalType: 'address',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'renounceOwnership',\n inputs: [],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'router',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'address',\n internalType: 'address',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'setRouter',\n inputs: [\n {\n name: '_newRouter',\n type: 'address',\n internalType: 'address',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'totalBadgesOfIdentity',\n inputs: [\n {\n name: 'identityTokenId',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n outputs: [\n {\n name: 'totalBadges',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'transferOwnership',\n inputs: [\n {\n name: 'newOwner',\n type: 'address',\n internalType: 'address',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'event',\n name: 'Mint',\n inputs: [\n {\n name: 'badgeId',\n type: 'uint256',\n indexed: true,\n internalType: 'uint256',\n },\n {\n name: 'nftAddress',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n {\n name: 'nftTokenId',\n type: 'uint256',\n indexed: true,\n internalType: 'uint256',\n },\n ],\n anonymous: false,\n },\n {\n type: 'event',\n name: 'OwnershipTransferStarted',\n inputs: [\n {\n name: 'previousOwner',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n {\n name: 'newOwner',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n ],\n anonymous: false,\n },\n {\n type: 'event',\n name: 'OwnershipTransferred',\n inputs: [\n {\n name: 'previousOwner',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n {\n name: 'newOwner',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n ],\n anonymous: false,\n },\n {\n type: 'event',\n name: 'RouterSet',\n inputs: [\n {\n name: 'router',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n ],\n anonymous: false,\n },\n {\n type: 'error',\n name: 'BadgeNotMinted',\n inputs: [\n {\n name: 'badgeId',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n },\n {\n type: 'error',\n name: 'BadgePageLimitExceeded',\n inputs: [\n {\n name: 'limit',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'maxLimit',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n },\n {\n type: 'error',\n name: 'IdentityContractMismatch',\n inputs: [\n {\n name: 'expected',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'actual',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n {\n type: 'error',\n name: 'InvalidIdentityContract',\n inputs: [],\n },\n {\n type: 'error',\n name: 'OwnableInvalidOwner',\n inputs: [\n {\n name: 'owner',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n {\n type: 'error',\n name: 'OwnableUnauthorizedAccount',\n inputs: [\n {\n name: 'account',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n {\n type: 'error',\n name: 'ReceiptBadgeMintPayloadAlreadyClaimed',\n inputs: [\n {\n name: 'hash',\n type: 'bytes32',\n internalType: 'bytes32',\n },\n ],\n },\n {\n type: 'error',\n name: 'RouterInvalidInterface',\n inputs: [\n {\n name: 'account',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n {\n type: 'error',\n name: 'RouterNotSet',\n inputs: [],\n },\n {\n type: 'error',\n name: 'RouterUnauthorizedAccount',\n inputs: [\n {\n name: 'account',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n {\n type: 'error',\n name: 'StringsInsufficientHexLength',\n inputs: [\n {\n name: 'value',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'length',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n },\n] as const\n\n// Contract ABI for CashiePaymentRecordBadge.sol\nexport const CASHIE_PAYMENT_RECORD_BADGE_CONTRACT_ABI = [\n {\n type: 'constructor',\n inputs: [\n {\n name: 'owner_',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'identityContract_',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'receiptBadgeContract_',\n type: 'address',\n internalType: 'address',\n },\n ],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'acceptOwnership',\n inputs: [],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'badgeOfIdentityByIndex',\n inputs: [\n {\n name: 'identityTokenId',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'index',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n outputs: [\n {\n name: 'badgeId',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'badgeUri',\n inputs: [\n {\n name: 'badgeId',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n outputs: [\n {\n name: '',\n type: 'string',\n internalType: 'string',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'badgesOfIdentity',\n inputs: [\n {\n name: 'identityTokenId',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'offset',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'limit',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n outputs: [\n {\n name: 'badgeIds',\n type: 'uint256[]',\n internalType: 'uint256[]',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'collectionUri',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'string',\n internalType: 'string',\n },\n ],\n stateMutability: 'pure',\n },\n {\n type: 'function',\n name: 'identityContract',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'address',\n internalType: 'address',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'metadataFormat',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'string',\n internalType: 'string',\n },\n ],\n stateMutability: 'pure',\n },\n {\n type: 'function',\n name: 'mint',\n inputs: [\n {\n name: 'payload',\n type: 'tuple',\n internalType: 'struct PaymentRecordBadgeMintPayload',\n components: [\n {\n name: 'soulBoundTo',\n type: 'tuple',\n internalType: 'struct SoulBoundTo',\n components: [\n {\n name: 'identityContract',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'tokenId',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n },\n {\n name: 'blockNumber',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'payer',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'chainId',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'tokenAddress',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'allowance',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'receiptBadgeId',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'salt',\n type: 'bytes32',\n internalType: 'bytes32',\n },\n ],\n },\n ],\n outputs: [\n {\n name: 'badgeId',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'owner',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'address',\n internalType: 'address',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'ownerOf',\n inputs: [\n {\n name: 'badgeId',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n outputs: [\n {\n name: 'nftAddress',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'nftTokenId',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'pendingOwner',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'address',\n internalType: 'address',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'receiptBadgeContract',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'address',\n internalType: 'address',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'renounceOwnership',\n inputs: [],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'router',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'address',\n internalType: 'address',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'setRouter',\n inputs: [\n {\n name: '_newRouter',\n type: 'address',\n internalType: 'address',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'totalBadgesOfIdentity',\n inputs: [\n {\n name: 'identityTokenId',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n outputs: [\n {\n name: 'totalBadges',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'transferOwnership',\n inputs: [\n {\n name: 'newOwner',\n type: 'address',\n internalType: 'address',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'event',\n name: 'Mint',\n inputs: [\n {\n name: 'badgeId',\n type: 'uint256',\n indexed: true,\n internalType: 'uint256',\n },\n {\n name: 'nftAddress',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n {\n name: 'nftTokenId',\n type: 'uint256',\n indexed: true,\n internalType: 'uint256',\n },\n ],\n anonymous: false,\n },\n {\n type: 'event',\n name: 'OwnershipTransferStarted',\n inputs: [\n {\n name: 'previousOwner',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n {\n name: 'newOwner',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n ],\n anonymous: false,\n },\n {\n type: 'event',\n name: 'OwnershipTransferred',\n inputs: [\n {\n name: 'previousOwner',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n {\n name: 'newOwner',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n ],\n anonymous: false,\n },\n {\n type: 'event',\n name: 'RouterSet',\n inputs: [\n {\n name: 'router',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n ],\n anonymous: false,\n },\n {\n type: 'error',\n name: 'BadgeNotMinted',\n inputs: [\n {\n name: 'badgeId',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n },\n {\n type: 'error',\n name: 'BadgePageLimitExceeded',\n inputs: [\n {\n name: 'limit',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'maxLimit',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n },\n {\n type: 'error',\n name: 'IdentityContractMismatch',\n inputs: [\n {\n name: 'expected',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'actual',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n {\n type: 'error',\n name: 'InvalidIdentityContract',\n inputs: [],\n },\n {\n type: 'error',\n name: 'OwnableInvalidOwner',\n inputs: [\n {\n name: 'owner',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n {\n type: 'error',\n name: 'OwnableUnauthorizedAccount',\n inputs: [\n {\n name: 'account',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n {\n type: 'error',\n name: 'PaymentRecordBadgeMintPayloadAlreadyClaimed',\n inputs: [\n {\n name: 'hash',\n type: 'bytes32',\n internalType: 'bytes32',\n },\n ],\n },\n {\n type: 'error',\n name: 'RouterInvalidInterface',\n inputs: [\n {\n name: 'account',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n {\n type: 'error',\n name: 'RouterNotSet',\n inputs: [],\n },\n {\n type: 'error',\n name: 'RouterUnauthorizedAccount',\n inputs: [\n {\n name: 'account',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n {\n type: 'error',\n name: 'StringsInsufficientHexLength',\n inputs: [\n {\n name: 'value',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'length',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n },\n] as const\n", "import { Hex, Hash, Address, toHex } from 'viem'\nimport {\n BadgeKind,\n PaymentIntent,\n paymentRecordBadgeIdFromPaymentIntent,\n receiptBadgeIdFromPaymentIntent,\n ReceiptType,\n} from '../../index.js'\n\nexport type SendPaymentIntentTaskEntry = {\n id: string\n data: {\n paymentIntent: PaymentIntent\n }\n}\n\n/**\n * A task transaction entry.\n */\nexport type TransactionEntry = {\n txHash: Hash\n chainId: Hex\n taskEntries: SendPaymentIntentTaskEntry[]\n}\n\n/**\n * A payment intent tracking entry.\n */\nexport type PaymentIntentTrackingEntry = {\n paymentIntent: PaymentIntent\n status: 'pending' | 'confirmed' | 'failed'\n txHash?: Hash | null\n blockNumber?: Hex | null\n}\n\n/**\n * Find the transaction hash for a badge id.\n *\n * @param props - The properties of the badge.\n * @param props.badgeId - The id of the badge.\n * @param props.badgeKind - The kind of the badge.\n * @param props.identityContract - The identity contract.\n * @param props.paymentIntentTrackingEntries - The payment intent tracking entries.\n * @returns The transaction hash for the badge id.\n */\nexport function findTransactionHashForBadgeId(props: {\n badgeId: Hex\n badgeKind: BadgeKind\n identityContract: Address\n paymentIntentTrackingEntries: PaymentIntentTrackingEntry[]\n}): Hex | null {\n const { badgeId, badgeKind, identityContract, paymentIntentTrackingEntries } =\n props\n if (paymentIntentTrackingEntries.length === 0) {\n return null\n }\n const confirmedPaymentIntentTrackingEntries =\n paymentIntentTrackingEntries.filter(\n (paymentIntentTrackingEntry) =>\n paymentIntentTrackingEntry.status === 'confirmed',\n )\n if (confirmedPaymentIntentTrackingEntries.length === 0) {\n return null\n }\n\n for (const paymentIntentTrackingEntry of confirmedPaymentIntentTrackingEntries) {\n if (!paymentIntentTrackingEntry.txHash) {\n continue\n }\n\n if (!paymentIntentTrackingEntry.blockNumber) {\n continue\n }\n\n switch (badgeKind) {\n case 'receipt': {\n const derivedBadgeId = toHex(\n receiptBadgeIdFromPaymentIntent(\n identityContract,\n paymentIntentTrackingEntry.paymentIntent,\n BigInt(paymentIntentTrackingEntry.blockNumber),\n ReceiptType.OneTime,\n ),\n )\n if (derivedBadgeId === badgeId) {\n return paymentIntentTrackingEntry.txHash\n }\n break\n }\n case 'paymentRecord': {\n const derivedBadgeId = toHex(\n paymentRecordBadgeIdFromPaymentIntent(\n identityContract,\n paymentIntentTrackingEntry.paymentIntent,\n BigInt(paymentIntentTrackingEntry.blockNumber),\n ReceiptType.OneTime,\n ),\n )\n if (derivedBadgeId === badgeId) {\n return paymentIntentTrackingEntry.txHash\n }\n break\n }\n }\n }\n\n return null\n}\n", "import { keccak256 } from 'viem'\nimport type { ApiResource, Capability } from './ocap-types.js'\n\nexport type BuildOcapParams = {\n resources: Capability['resources']\n allowedAudiences: string[]\n}\n\nexport type BuildOcapResult = {\n ocap: Capability\n ocapId: string\n}\n\n/**\n * Recursively sort object keys and array elements for deterministic JSON.\n * Arrays are sorted by their JSON string representation.\n *\n * @param value - The value to canonicalize\n * @returns The canonicalized value\n */\nfunction canonicalize(value: unknown): unknown {\n if (value === null || typeof value !== 'object') {\n return value\n }\n if (Array.isArray(value)) {\n const sorted = value.map(canonicalize).sort((a, b) => {\n const sa = JSON.stringify(a)\n const sb = JSON.stringify(b)\n return sa < sb ? -1 : sa > sb ? 1 : 0\n })\n return sorted\n }\n const obj = value as Record<string, unknown>\n const keys = Object.keys(obj).sort()\n const out: Record<string, unknown> = {}\n for (const k of keys) {\n out[k] = canonicalize(obj[k])\n }\n return out\n}\n\n/**\n * Produce a deterministic JSON string for a capability (sorted keys, sorted arrays).\n *\n * @param capability - The capability to canonicalize\n * @returns The canonicalized capability\n */\nexport function canonicalOcapPayload(capability: Capability): string {\n return JSON.stringify(canonicalize(capability))\n}\n\n/**\n * Compute ocapId as keccak256(canonical_ocap_payload) per spec.\n * OCAPs MUST be deterministic and hashable.\n *\n * @param capability - The capability to build the ocap id for\n * @returns The ocap id\n */\nexport function buildOcapId(capability: Capability): string {\n const canonical = canonicalOcapPayload(capability)\n const bytes = new TextEncoder().encode(canonical)\n return keccak256(bytes)\n}\n\nexport class OcapValidationError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'OcapValidationError'\n }\n}\n\n/**\n * Validate an api resource against allowed audiences.\n *\n * @param r - The api resource to validate\n * @param allowedAudiences - The allowed audiences\n * @throws OcapValidationError if the api resource is invalid\n */\nfunction validateApiResource(r: ApiResource, allowedAudiences: string[]): void {\n if (r.type !== 'api') {\n throw new OcapValidationError(\n `Unsupported resource type: ${(r as { type: string }).type}`,\n )\n }\n if (!allowedAudiences.includes(r.audience)) {\n throw new OcapValidationError(`Audience not allowed: ${r.audience}`)\n }\n if (!r.data?.endpoint || !Array.isArray(r.data.methods)) {\n throw new OcapValidationError(\n 'Invalid api resource: missing endpoint or methods',\n )\n }\n}\n\n/**\n * Validate requested resources against allowed audiences and build the granted OCAP in a canonical form (sorted keys, sorted arrays).\n * Rejects unsupported resource types or disallowed audiences.\n *\n * @param params - The parameters to validate and build the ocap\n * @returns The validated and built ocap\n */\nexport function validateAndBuildOcap(params: BuildOcapParams): BuildOcapResult {\n const { resources, allowedAudiences } = params\n const api = Array.isArray(resources.api) ? resources.api : []\n\n for (const r of api) {\n validateApiResource(r as ApiResource, allowedAudiences)\n }\n\n const ocap: Capability = {\n resources: { api },\n }\n const ocapId = buildOcapId(ocap)\n return { ocap, ocapId }\n}\n", "import { Address } from 'viem'\nimport { buildOcapId } from './ocap/ocap-build.js'\nimport { Capability } from './ocap/ocap-types.js'\n\n/**\n * The default maximum age of a SIWE message in milliseconds of 5 minutes.\n */\nexport const DEFAULT_MAX_AGE_MS = 5 * 60 * 1000\n\n/**\n * The prefix of the statement of the SIWE message.\n */\nexport const OCAP_STATEMENT_PREFIX = 'Request OCAP'\n\n/**\n * Prepare the statement of the SIWE message.\n *\n * @param smartAccountAddress The smart account address\n * @param resources The requested resources\n * @returns The prepared statement\n */\nexport function prepareStatement(\n smartAccountAddress: Address,\n resources: Capability['resources'],\n): string {\n const ocapId = buildOcapId({\n resources,\n })\n return `${OCAP_STATEMENT_PREFIX}:${smartAccountAddress}:${ocapId}`\n}\n", "/**\n * Types for Identity OCAP (Off-Chain Capabilities) per docs/user-identity-ocap.md\n */\n\nimport { SubJwtPayload } from '../jwt.types.js'\n\nexport type ApiMethods = 'POST' | 'GET' | 'PUT' | 'PATCH' | 'DELETE'\n\n/**\n * A resource that can be accessed via API\n */\nexport type ApiResource = {\n type: 'api'\n audience: string\n data: {\n endpoint: string\n methods: ApiMethods[]\n }\n}\n\nexport type SupportedResource = ApiResource\n\nexport type Capability = {\n /**\n * The requested off-chain capabilities resources\n */\n resources: {\n api: ApiResource[]\n }\n}\n\n/** JWT claims for OCAP identity tokens (RFC 7519 + custom ocap claim) */\nexport type OcapJwtPayload = {\n /**\n * The issuer of the JWT\n */\n iss: string\n\n /**\n * The subject of the JWT that is the user's public ethereum address\n */\n sub: SubJwtPayload\n\n /**\n * The audience of the JWT\n */\n aud: string[]\n\n /**\n * The expiration time of the JWT(unix timestamp)\n */\n exp: number\n\n /**\n * The not before time of the JWT\n */\n nbf: number\n\n /**\n * The issued at time of the JWT\n */\n iat: number\n\n /**\n * The JWT ID of the JWT\n */\n jti: string\n\n /**\n * The granted off-chain capabilities of the JWT\n */\n ocap: Capability\n}\n\n/** Request body for POST v1/ocaps/auth */\nexport type OcapAuthRequestBody = {\n /**\n * The SIWE message\n */\n message: string\n\n /**\n * The signature of the SIWE message\n */\n signature: string\n\n /**\n * The request off-chain capabilities resources\n */\n resources: Capability['resources']\n}\n\n/** Response from GET v1/ocaps/auth/discovery */\nexport type OcapDiscoveryResponse = {\n allowedResources: ApiResource[]\n}\n\n/**\n * Audiences for OCAP\n */\nexport enum OcapAudiences {\n ACCOUNT_SERVICE = 'account-service',\n PAYMENT_SERVICE = 'payment-service',\n IDV_SERVICE = 'idv-service',\n}\n", "export type ErrorDetails = {\n code: number\n message: string\n}\n\n/**\n * The EIP1193 error code enum\n */\nexport enum EIP1193_ERROR_CODES {\n /**\n * The user rejected the request.\n */\n USER_REJECTED_REQUEST = 4001,\n\n /**\n * The specified address is not connected or not in the wallet\n */\n UNAUTHORIZED_ACCESS_ACCOUNT = 4100,\n\n /**\n * The Provider does not support the requested method.\n */\n UNSUPPORTED_METHOD = 4200,\n\n /**\n * The Provider is disconnected from all chains.\n */\n DISCONNECTED = 4900,\n\n /**\n * The Provider is not connected to the requested chain.\n */\n CHAIN_DISCONNECTED = 4901,\n}\n\n/**\n * The EIP5792 error code enum\n */\nexport enum EIP5792_ERROR_CODES {\n /**\n * This wallet does not support a capability that was not marked as optional\n * Related RPCs: wallet_sendCalls\n */\n UNSUPPORTED_NON_OPTIONAL_CAPABILITY = 5700,\n\n /**\n * This wallet does not support the specified chain id\n * Related RPCs: wallet_sendCalls\n */\n UNSUPPORTED_CHAIN_ID = 5710,\n\n /**\n * There is already a bundle submitted with this id\n * Related RPCs: wallet_sendCalls\n */\n DUPLICATE_BUNDLE_ID = 5720,\n\n /**\n * This bundle id is unknown / has not been submitted\n * Related RPCs: wallet_getCallsStatus, wallet_showCallsStatus\n */\n UNKNOWN_BUNDLE_ID = 5730,\n\n /**\n * The call bundle is too large for the wallet to process\n * Related RPCs: wallet_sendCalls\n */\n BUNDLE_TOO_LARGE = 5740,\n\n /**\n * The wallet can support atomicity after an upgrade, but the user rejected the upgrade\n * Related RPCs: wallet_sendCalls\n */\n ATOMIC_READY_WALLET_REJECTED_UPGRADE = 5750,\n\n /**\n * The wallet does not support atomic execution but the request requires it\n * Related RPCs: wallet_sendCalls\n */\n ATOMICITY_NOT_SUPPORTED = 5760,\n}\n\n/**\n * The ERC-7715 error code enum\n */\nexport enum ERC7715_ERROR_CODES {\n /**\n * The specified method is not authorized for the given origin\n * Related RPCs:\n */\n UNAUTHORIZED_ACCESS_RESTRICTED_METHOD = 4101,\n}\n\n/**\n * The fatal error code enum\n */\nexport enum FATAL_ERROR_CODES {\n INTERNAL_ERROR = -32001,\n NO_SECURE_CONNECTION_ESTABLISHED = -32002,\n}\n\nexport enum COMMON_ERROR_CODES {\n INVALID_PARAMS = -32602,\n}\n\n/**\n * The error code map\n */\nconst ERROR_CODES_MAP: Record<\n | EIP1193_ERROR_CODES\n | EIP5792_ERROR_CODES\n | ERC7715_ERROR_CODES\n | FATAL_ERROR_CODES\n | COMMON_ERROR_CODES,\n ErrorDetails\n> = {\n // EIP1193 errors\n [EIP1193_ERROR_CODES.USER_REJECTED_REQUEST]: {\n code: 4001,\n message: 'User rejected the request.',\n },\n [EIP1193_ERROR_CODES.UNAUTHORIZED_ACCESS_ACCOUNT]: {\n code: 4100,\n message:\n 'The requested method and/or account has not been authorized by the user.',\n },\n [EIP1193_ERROR_CODES.UNSUPPORTED_METHOD]: {\n code: 4200,\n message: 'The Provider does not support the requested method.',\n },\n [EIP1193_ERROR_CODES.DISCONNECTED]: {\n code: 4900,\n message: 'The Provider is disconnected from all chains.',\n },\n [EIP1193_ERROR_CODES.CHAIN_DISCONNECTED]: {\n code: 4901,\n message: 'The Provider is not connected to the requested chain.',\n },\n\n //ERC-7715 errors\n [ERC7715_ERROR_CODES.UNAUTHORIZED_ACCESS_RESTRICTED_METHOD]: {\n code: 4101,\n message: 'The specified method is not authorized for the given origin.',\n },\n\n // EIP5792 errors\n [EIP5792_ERROR_CODES.UNSUPPORTED_NON_OPTIONAL_CAPABILITY]: {\n code: 5700,\n message:\n 'This wallet does not support a capability that was not marked as optional.',\n },\n [EIP5792_ERROR_CODES.UNSUPPORTED_CHAIN_ID]: {\n code: 5710,\n message: 'This wallet does not support the specified chain id.',\n },\n [EIP5792_ERROR_CODES.DUPLICATE_BUNDLE_ID]: {\n code: 5720,\n message: 'There is already a bundle submitted with this id.',\n },\n [EIP5792_ERROR_CODES.UNKNOWN_BUNDLE_ID]: {\n code: 5730,\n message: 'This bundle id is unknown / has not been submitted.',\n },\n [EIP5792_ERROR_CODES.BUNDLE_TOO_LARGE]: {\n code: 5740,\n message: 'The call bundle is too large for the wallet to process.',\n },\n [EIP5792_ERROR_CODES.ATOMIC_READY_WALLET_REJECTED_UPGRADE]: {\n code: 5750,\n message:\n 'The wallet can support atomicity after an upgrade, but the user rejected the upgrade.',\n },\n [EIP5792_ERROR_CODES.ATOMICITY_NOT_SUPPORTED]: {\n code: 5760,\n message:\n 'The wallet does not support atomic execution but the request requires it.',\n },\n\n // Fatal/Common errors\n [FATAL_ERROR_CODES.INTERNAL_ERROR]: {\n code: -32001,\n message: 'fatal: internal error',\n },\n [COMMON_ERROR_CODES.INVALID_PARAMS]: {\n code: 4002,\n message: 'Invalid parameters.',\n },\n [FATAL_ERROR_CODES.NO_SECURE_CONNECTION_ESTABLISHED]: {\n code: -32002,\n message: 'No secure connection established.',\n },\n}\n\n/**\n * Get the error message for a given error code\n *\n * @param code - The error code\n * @returns The error message\n * @throws An error if the error code is not found\n */\nexport const getErrorMessage = (\n code:\n | EIP1193_ERROR_CODES\n | EIP5792_ERROR_CODES\n | ERC7715_ERROR_CODES\n | FATAL_ERROR_CODES\n | COMMON_ERROR_CODES,\n): ErrorDetails => {\n const details = ERROR_CODES_MAP[code]\n if (!details) {\n return {\n code,\n message: `Unknown error code: ${code}`,\n }\n }\n return details\n}\n\nexport class RpcError extends Error {\n /**\n * MUST be an integer number\n * SHOULD adhere to the specifications in the Error Standards section below\n *\n * @see https://eips.ethereum.org/EIPS/eip-1193#error-standards\n */\n code: number\n\n /**\n * SHOULD contain any other useful information about the error\n */\n data?: unknown\n\n constructor({\n message,\n code,\n data,\n }: {\n message: string\n code: number\n data?: unknown\n }) {\n super(message)\n this.code = code\n this.data = data\n }\n}\n", "export abstract class Either<L, R> {\n constructor(protected value: L | R) {}\n\n /**\n * Transforms the value in a `Right`, does nothing for a `Left`.\n */\n abstract map<U>(f: (value: R) => U): Either<L, U>\n\n /**\n * Chains computations that return an `Either`.\n * Propagates `Left` if the current value is `Left`.\n */\n abstract flatMap<U>(f: (value: R) => Either<L, U>): Either<L, U>\n\n /**\n * Returns the value inside a `Right` or the provided default value if `Left`.\n */\n abstract getOrElse(defaultValue: R): R\n\n /**\n * Determines if the instance is `Left`.\n */\n abstract isLeft(): boolean\n\n /**\n * Determines if the instance is `Right`.\n */\n abstract isRight(): boolean\n\n /**\n * Returns a string representation of the instance.\n *\n * @returns A string representation of the instance.\n */\n toString(): string {\n const str = JSON.stringify(this.value)\n return `${this.isLeft() ? 'Left' : 'Right'}: (${str})`\n }\n\n /**\n * Handles both `Left` and `Right` cases with provided functions.\n *\n * @param onLeft - Function to handle `Left`.\n * @param onRight - Function to handle `Right`.\n * @returns The result of the function that matches the instance.\n */\n fold<U>(onLeft: (error: L) => U, onRight: (value: R) => U): U {\n return this.isLeft() ? onLeft(this.value as L) : onRight(this.value as R)\n }\n\n foldAsync<U>(\n onLeft: (error: L) => Promise<U>,\n onRight: (value: R) => Promise<U>,\n ): Promise<U> {\n return this.isLeft() ? onLeft(this.value as L) : onRight(this.value as R)\n }\n\n /**\n * Factory method for creating a `Right` instance.\n *\n * @param value - The value to wrap in a `Right`.\n * @returns A `Right` instance.\n */\n static of<R>(value: R): Either<never, R> {\n return new Right(value)\n }\n\n /**\n * Factory method for creating a `Left` instance.\n *\n * @param value - The value to wrap in a `Left`.\n * @returns A `Left` instance.\n */\n static Left<L, R>(value: L): Either<L, R> {\n return new Left(value)\n }\n\n /**\n * Factory method for creating a `Right` instance.\n *\n * @param value - The value to wrap in a `Right`.\n * @returns A `Right` instance.\n */\n static Right<L, R>(value: R): Either<L, R> {\n return new Right(value)\n }\n}\n\nclass Left<L, R> extends Either<L, R> {\n constructor(value: L) {\n super(value)\n }\n\n map<U>(_: (value: R) => U): Either<L, U> {\n return this as unknown as Either<L, U>\n }\n\n flatMap<U>(_: (value: R) => Either<L, U>): Either<L, U> {\n return this as unknown as Either<L, U>\n }\n\n getOrElse(defaultValue: R): R {\n return defaultValue\n }\n\n isLeft(): boolean {\n return true\n }\n\n isRight(): boolean {\n return false\n }\n}\n\nclass Right<L, R> extends Either<L, R> {\n constructor(value: R) {\n super(value)\n }\n\n map<U>(f: (value: R) => U): Either<L, U> {\n return Either.of(f(this.value as R))\n }\n\n flatMap<U>(f: (value: R) => Either<L, U>): Either<L, U> {\n return f(this.value as R)\n }\n\n getOrElse(_: R): R {\n return this.value as R\n }\n\n isLeft(): boolean {\n return false\n }\n\n isRight(): boolean {\n return true\n }\n}\n\n/**\n * Determines if the provided value is an instance of `Either`.\n *\n * @param value - The value to check.\n * @returns `true` if the value is an instance of `Either`, `false` otherwise.\n */\nexport const isEither = <L>(value: unknown): value is Either<L, unknown> => {\n return value instanceof Either\n}\n", "/**\n * The JSON-RPC request object.\n */\nexport type JsonRpcRequest = {\n jsonrpc: '2.0'\n method: string\n params: unknown[]\n id: number | string\n}\n\n/**\n * Same-origin proxy for protocol-chain JSON-RPC. The browser must use this path\n * instead of a public RPC URL so server RPC credentials stay off the client.\n */\nexport const PROTOCOL_RPC_PROXY_PATH = '/api/public/protocol-rpc'\n", "/**\n * The account type for a Cashie account\n */\nexport enum CashieAccountType {\n /**\n * (Default) The individual account type\n */\n INDIVIDUAL = 0,\n\n /**\n * The business account type\n */\n BUSINESS = 1,\n}\n\n/**\n * The labels for the Cashie account types\n */\nexport const CASHIE_ACCOUNT_TYPE_LABELS: Record<CashieAccountType, string> = {\n [CashieAccountType.BUSINESS]: 'Business',\n [CashieAccountType.INDIVIDUAL]: 'Individual',\n}\n"],
5
+ "mappings": "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hE,UAAWA,EAAW,UACtB,aAAc,OAAOA,EAAW,YAAY,EAC5C,mBAAoBA,EAAW,kBACjC,EAAE,EACF,wBAAyBD,EAAoB,uBAC/C,EACAD,EAAc,aACd,OAAOA,EAAc,SAAS,EAC9BA,EAAc,kBACdA,EAAc,IAChB,CAAC,CACH,CAQO,SAASG,GAAqBH,EAA8B,CACjE,OAAOJ,GAAUG,GAAoBC,CAAa,CAAC,CACrD,CC/EO,IAAMI,GAAgC,CAC3C,CACE,KAAM,cACN,OAAQ,CACN,CACE,KAAM,gBACN,KAAM,UACN,aAAc,SAChB,EACA,CACE,KAAM,sBACN,KAAM,UACN,aAAc,SAChB,EACA,CACE,KAAM,0BACN,KAAM,YACN,aAAc,WAChB,EACA,CACE,KAAM,kBACN,KAAM,UACN,aAAc,SAChB,EACA,CACE,KAAM,0BACN,KAAM,UACN,aAAc,SAChB,EACA,CACE,KAAM,aACN,KAAM,UACN,aAAc,SAChB,EACA,CACE,KAAM,uBACN,KAAM,UACN,aAAc,yBAChB,EACA,CACE,KAAM,kBACN,KAAM,UACN,aAAc,0BAChB,EACA,CACE,KAAM,gBACN,KAAM,UACN,aAAc,8BAChB,EACA,CACE,KAAM,gBACN,KAAM,UACN,aAAc,8BAChB,EACA,CACE,KAAM,sBACN,KAAM,UACN,aAAc,oCAChB,EACA,CACE,KAAM,+BACN,KAAM,YACN,aAAc,WAChB,CACF,EACA,gBAAiB,YACnB,EACA,CACE,KAAM,WACN,KAAM,kBACN,OAAQ,CAAC,EACT,QAAS,CAAC,EACV,gBAAiB,YACnB,EACA,CACE,KAAM,WACN,KAAM,gCACN,OAAQ,CACN,CACE,KAAM,SACN,KAAM,UACN,aAAc,SAChB,CACF,EACA,QAAS,CAAC,EACV,gBAAiB,YACnB,EACA,CACE,KAAM,WACN,KAAM,uBACN,OAAQ,CACN,CACE,KAAM,SACN,KAAM,UACN,aAAc,SAChB,EACA,CACE,KAAM,YACN,KAAM,OACN,aAAc,MAChB,CACF,EACA,QAAS,CAAC,EACV,gBAAiB,YACnB,EACA,CACE,KAAM,WACN,KAAM,kBACN,OAAQ,CACN,CACE,KAAM,SACN,KAAM,UACN,aAAc,SAChB,EACA,CACE,KAAM,YACN,KAAM,OACN,aAAc,MAChB,CACF,EACA,QAAS,CAAC,EACV,gBAAiB,YACnB,EACA,CACE,KAAM,WACN,KAAM,eACN,OAAQ,CACN,CACE,KAAM,UACN,KAAM,UACN,aAAc,SAChB,EACA,CACE,KAAM,UACN,KAAM,UACN,aAAc,SAChB,CACF,EACA,QAAS,CACP,CACE,KAAM,GACN,KAAM,UACN,aAAc,SAChB,CACF,EACA,gBAAiB,MACnB,EACA,CACE,KAAM,WACN,KAAM,kBACN,OAAQ,CACN,CACE,KAAM,sBACN,KAAM,UACN,aAAc,SAChB,EACA,CACE,KAAM,wBACN,KAAM,QACN,aAAc,OAChB,CACF,EACA,QAAS,CACP,CACE,KAAM,GACN,KAAM,UACN,aAAc,SAChB,CACF,EACA,gBAAiB,MACnB,EACA,CACE,KAAM,WACN,KAAM,UACN,OAAQ,CACN,CACE,KAAM,aACN,KAAM,UACN,aAAc,SAChB,EACA,CACE,KAAM,gBACN,KAAM,UACN,aAAc,SAChB,EACA,CACE,KAAM,aACN,KAAM,UACN,aAAc,SAChB,CACF,EACA,QAAS,CAAC,EACV,gBAAiB,YACnB,EACA,CACE,KAAM,WACN,KAAM,eACN,OAAQ,CAAC,EACT,QAAS,CACP,CACE,KAAM,GACN,KAAM,UACN,aAAc,8BAChB,CACF,EACA,gBAAiB,MACnB,EACA,CACE,KAAM,WACN,KAAM,uBACN,OAAQ,CAAC,EACT,QAAS,CACP,CACE,KAAM,GACN,KAAM,UACN,aAAc,SAChB,CACF,EACA,gBAAiB,MACnB,EACA,CACE,KAAM,WACN,KAAM,+BACN,OAAQ,CACN,CACE,KAAM,SACN,KAAM,UACN,aAAc,SAChB,CACF,EACA,QAAS,CACP,CACE,KAAM,GACN,KAAM,OACN,aAAc,MAChB,CACF,EACA,gBAAiB,MACnB,EACA,CACE,KAAM,WACN,KAAM,mBACN,OAAQ,CACN,CACE,KAAM,gBACN,KAAM,UACN,aAAc,SAChB,CACF,EACA,QAAS,CACP,CACE,KAAM,GACN,KAAM,OACN,aAAc,MAChB,CACF,EACA,gBAAiB,MACnB,EACA,CACE,KAAM,WACN,KAAM,mBACN,OAAQ,CACN,CACE,KAAM,OACN,KAAM,UACN,aAAc,SAChB,EACA,CACE,KAAM,YACN,KAAM,QACN,aAAc,OAChB,CACF,EACA,QAAS,CACP,CACE,KAAM,aACN,KAAM,SACN,aAAc,QAChB,CACF,EACA,gBAAiB,MACnB,EACA,CACE,KAAM,WACN,KAAM,qBACN,OAAQ,CACN,CACE,KAAM,UACN,KAAM,QACN,aAAc,6BACd,WAAY,CACV,CACE,KAAM,eACN,KAAM,QACN,aAAc,mBAChB,EACA,CACE,KAAM,SACN,KAAM,SACN,aAAc,QAChB,EACA,CACE,KAAM,WACN,KAAM,QACN,aAAc,wBAChB,EACA,CACE,KAAM,qBACN,KAAM,QACN,aAAc,OAChB,EACA,CACE,KAAM,KACN,KAAM,UACN,aAAc,SAChB,EACA,CACE,KAAM,QACN,KAAM,QACN,aAAc,OAChB,EACA,CACE,KAAM,YACN,KAAM,QACN,aAAc,OAChB,CACF,CACF,CACF,EACA,QAAS,CACP,CACE,KAAM,UACN,KAAM,UACN,aAAc,SAChB,CACF,EACA,gBAAiB,YACnB,EACA,CACE,KAAM,WACN,KAAM,QACN,OAAQ,CAAC,EACT,QAAS,CACP,CACE,KAAM,GACN,KAAM,UACN,aAAc,SAChB,CACF,EACA,gBAAiB,MACnB,EACA,CACE,KAAM,WACN,KAAM,SACN,OAAQ,CACN,CACE,KAAM,aACN,KAAM,UACN,aAAc,SAChB,EACA,CACE,KAAM,gBACN,KAAM,UACN,aAAc,SAChB,EACA,CACE,KAAM,aACN,KAAM,UACN,aAAc,SAChB,EACA,CACE,KAAM,yBACN,KAAM,UACN,aAAc,SAChB,EACA,CACE,KAAM,iCACN,KAAM,QACN,aAAc,uCACd,WAAY,CACV,CACE,KAAM,OACN,KAAM,UACN,aAAc,SAChB,EACA,CACE,KAAM,cACN,KAAM,QACN,aAAc,kBAChB,CACF,CACF,CACF,EACA,QAAS,CACP,CACE,KAAM,iBACN,KAAM,UACN,aAAc,SAChB,EACA,CACE,KAAM,uBACN,KAAM,UACN,aAAc,SAChB,CACF,EACA,gBAAiB,YACnB,EACA,CACE,KAAM,WACN,KAAM,SACN,OAAQ,CACN,CACE,KAAM,aACN,KAAM,UACN,aAAc,SAChB,EACA,CACE,KAAM,gBACN,KAAM,UACN,aAAc,SAChB,EACA,CACE,KAAM,aACN,KAAM,UACN,aAAc,SAChB,EACA,CACE,KAAM,yBACN,KAAM,UACN,aAAc,SAChB,EACA,CACE,KAAM,iCACN,KAAM,QACN,aAAc,uCACd,WAAY,CACV,CACE,KAAM,OACN,KAAM,UACN,aAAc,SAChB,EACA,CACE,KAAM,cACN,KAAM,QACN,aAAc,kBAChB,CACF,CACF,CACF,EACA,QAAS,CACP,CACE,KAAM,iBACN,KAAM,UACN,aAAc,SAChB,EACA,CACE,KAAM,uBACN,KAAM,UACN,aAAc,SAChB,CACF,EACA,gBAAiB,YACnB,EACA,CACE,KAAM,WACN,KAAM,SACN,OAAQ,CACN,CACE,KAAM,aACN,KAAM,UACN,aAAc,SAChB,EACA,CACE,KAAM,gBACN,KAAM,UACN,aAAc,SAChB,EACA,CACE,KAAM,aACN,KAAM,UACN,aAAc,SAChB,EACA,CACE,KAAM,yBACN,KAAM,UACN,aAAc,SAChB,EACA,CACE,KAAM,iCACN,KAAM,QACN,aAAc,uCACd,WAAY,CACV,CACE,KAAM,OACN,KAAM,UACN,aAAc,SAChB,EACA,CACE,KAAM,cACN,KAAM,QACN,aAAc,kBAChB,CACF,CACF,CACF,EACA,QAAS,CACP,CACE,KAAM,iBACN,KAAM,UACN,aAAc,SAChB,EACA,CACE,KAAM,uBACN,KAAM,UACN,aAAc,SAChB,CACF,EACA,gBAAiB,YACnB,EACA,CACE,KAAM,WACN,KAAM,yBACN,OAAQ,CAAC,EACT,QAAS,CACP,CACE,KAAM,GACN,KAAM,UACN,aAAc,SAChB,CACF,EACA,gBAAiB,MACnB,EACA,CACE,KAAM,WACN,KAAM,qBACN,OAAQ,CAAC,EACT,QAAS,CACP,CACE,KAAM,GACN,KAAM,UACN,aAAc,oCAChB,CACF,EACA,gBAAiB,MACnB,EACA,CACE,KAAM,WACN,KAAM,eACN,OAAQ,CAAC,EACT,QAAS,CACP,CACE,KAAM,GACN,KAAM,UACN,aAAc,SAChB,CACF,EACA,gBAAiB,MACnB,EACA,CACE,KAAM,WACN,KAAM,iBACN,OAAQ,CAAC,EACT,QAAS,CACP,CACE,KAAM,GACN,KAAM,UACN,aAAc,SAChB,CACF,EACA,gBAAiB,MACnB,EACA,CACE,KAAM,WACN,KAAM,eACN,OAAQ,CAAC,EACT,QAAS,CACP,CACE,KAAM,GACN,KAAM,UACN,aAAc,8BAChB,CACF,EACA,gBAAiB,MACnB,EACA,CACE,KAAM,WACN,KAAM,sBACN,OAAQ,CAAC,EACT,QAAS,CACP,CACE,KAAM,GACN,KAAM,UACN,aAAc,SAChB,CACF,EACA,gBAAiB,MACnB,EACA,CACE,KAAM,WACN,KAAM,gBACN,OAAQ,CACN,CACE,KAAM,gBACN,KAAM,UACN,aAAc,SAChB,CACF,EACA,QAAS,CAAC,EACV,gBAAiB,YACnB,EACA,CACE,KAAM,WACN,KAAM,mCACN,OAAQ,CACN,CACE,KAAM,SACN,KAAM,UACN,aAAc,SAChB,CACF,EACA,QAAS,CAAC,EACV,gBAAiB,YACnB,EACA,CACE,KAAM,WACN,KAAM,oBACN,OAAQ,CAAC,EACT,QAAS,CAAC,EACV,gBAAiB,YACnB,EACA,CACE,KAAM,WACN,KAAM,SACN,OAAQ,CACN,CACE,KAAM,WACN,KAAM,UACN,aAAc,sBACd,WAAY,CACV,CACE,KAAM,YACN,KAAM,UACN,aAAc,SAChB,EACA,CACE,KAAM,eACN,KAAM,UACN,aAAc,SAChB,EACA,CACE,KAAM,qBACN,KAAM,UACN,aAAc,SAChB,CACF,CACF,CACF,EACA,QAAS,CAAC,EACV,gBAAiB,YACnB,EACA,CACE,KAAM,WACN,KAAM,YACN,OAAQ,CAAC,EACT,QAAS,CACP,CACE,KAAM,GACN,KAAM,UACN,aAAc,SAChB,CACF,EACA,gBAAiB,MACnB,EACA,CACE,KAAM,WACN,KAAM,cACN,OAAQ,CAAC,EACT,QAAS,CACP,CACE,KAAM,GACN,KAAM,UACN,aAAc,yBAChB,CACF,EACA,gBAAiB,MACnB,EACA,CACE,KAAM,WACN,KAAM,qBACN,OAAQ,CAAC,EACT,QAAS,CACP,CACE,KAAM,GACN,KAAM,UACN,aAAc,SAChB,CACF,EACA,gBAAiB,MACnB,EACA,CACE,KAAM,WACN,KAAM,yBACN,OAAQ,CACN,CACE,KAAM,GACN,KAAM,UACN,aAAc,SAChB,CACF,EACA,QAAS,CACP,CACE,KAAM,GACN,KAAM,OACN,aAAc,MAChB,CACF,EACA,gBAAiB,MACnB,EACA,CACE,KAAM,WACN,KAAM,oBACN,OAAQ,CACN,CACE,KAAM,cACN,KAAM,SACN,aAAc,QAChB,CACF,EACA,QAAS,CACP,CACE,KAAM,GACN,KAAM,OACN,aAAc,MAChB,CACF,EACA,gBAAiB,MACnB,EACA,CACE,KAAM,WACN,KAAM,oBACN,OAAQ,CACN,CACE,KAAM,WACN,KAAM,UACN,aAAc,SAChB,CACF,EACA,QAAS,CAAC,EACV,gBAAiB,YACnB,EACA,CACE,KAAM,WACN,KAAM,qBACN,OAAQ,CAAC,EACT,QAAS,CACP,CACE,KAAM,GACN,KAAM,UACN,aAAc,SAChB,CACF,EACA,gBAAiB,MACnB,EACA,CACE,KAAM,WACN,KAAM,WACN,OAAQ,CACN,CACE,KAAM,aACN,KAAM,UACN,aAAc,SAChB,EACA,CACE,KAAM,gBACN,KAAM,UACN,aAAc,SAChB,EACA,CACE,KAAM,aACN,KAAM,UACN,aAAc,SAChB,EACA,CACE,KAAM,yBACN,KAAM,UACN,aAAc,SAChB,CACF,EACA,QAAS,CAAC,EACV,gBAAiB,YACnB,EACA,CACE,KAAM,QACN,KAAM,YACN,OAAQ,CACN,CACE,KAAM,SACN,KAAM,UACN,QAAS,GACT,aAAc,SAChB,EACA,CACE,KAAM,YACN,KAAM,UACN,QAAS,GACT,aAAc,SAChB,EACA,CACE,KAAM,SACN,KAAM,UACN,QAAS,GACT,aAAc,SAChB,EACA,CACE,KAAM,eACN,KAAM,UACN,QAAS,GACT,aAAc,SAChB,CACF,EACA,UAAW,EACb,EACA,CACE,KAAM,QACN,KAAM,kCACN,OAAQ,CACN,CACE,KAAM,SACN,KAAM,UACN,QAAS,GACT,aAAc,SAChB,CACF,EACA,UAAW,EACb,EACA,CACE,KAAM,QACN,KAAM,oCACN,OAAQ,CACN,CACE,KAAM,SACN,KAAM,UACN,QAAS,GACT,aAAc,SAChB,CACF,EACA,UAAW,EACb,EACA,CACE,KAAM,QACN,KAAM,cACN,OAAQ,CACN,CACE,KAAM,YACN,KAAM,UACN,QAAS,GACT,aAAc,SAChB,EACA,CACE,KAAM,eACN,KAAM,UACN,QAAS,GACT,aAAc,SAChB,EACA,CACE,KAAM,cACN,KAAM,UACN,QAAS,GACT,aAAc,SAChB,CACF,EACA,UAAW,EACb,EACA,CACE,KAAM,QACN,KAAM,2BACN,OAAQ,CACN,CACE,KAAM,gBACN,KAAM,UACN,QAAS,GACT,aAAc,SAChB,EACA,CACE,KAAM,WACN,KAAM,UACN,QAAS,GACT,aAAc,SAChB,CACF,EACA,UAAW,EACb,EACA,CACE,KAAM,QACN,KAAM,uBACN,OAAQ,CACN,CACE,KAAM,gBACN,KAAM,UACN,QAAS,GACT,aAAc,SAChB,EACA,CACE,KAAM,WACN,KAAM,UACN,QAAS,GACT,aAAc,SAChB,CACF,EACA,UAAW,EACb,EACA,CACE,KAAM,QACN,KAAM,UACN,OAAQ,CACN,CACE,KAAM,QACN,KAAM,UACN,QAAS,GACT,aAAc,SAChB,EACA,CACE,KAAM,WACN,KAAM,UACN,QAAS,GACT,aAAc,SAChB,EACA,CACE,KAAM,wBACN,KAAM,UACN,QAAS,GACT,aAAc,SAChB,EACA,CACE,KAAM,YACN,KAAM,UACN,QAAS,GACT,aAAc,SAChB,EACA,CACE,KAAM,kBACN,KAAM,UACN,QAAS,GACT,aAAc,SAChB,EACA,CACE,KAAM,cACN,KAAM,UACN,QAAS,GACT,aAAc,SAChB,EACA,CACE,KAAM,iBACN,KAAM,UACN,QAAS,GACT,aAAc,SAChB,EACA,CACE,KAAM,eACN,KAAM,UACN,QAAS,GACT,aAAc,SAChB,CACF,EACA,UAAW,EACb,EACA,CACE,KAAM,QACN,KAAM,yBACN,OAAQ,CACN,CACE,KAAM,YACN,KAAM,UACN,QAAS,GACT,aAAc,SAChB,EACA,CACE,KAAM,YACN,KAAM,UACN,QAAS,GACT,aAAc,SAChB,EACA,CACE,KAAM,YACN,KAAM,OACN,QAAS,GACT,aAAc,MAChB,CACF,EACA,UAAW,EACb,EACA,CACE,KAAM,QACN,KAAM,oBACN,OAAQ,CACN,CACE,KAAM,eACN,KAAM,UACN,QAAS,GACT,aAAc,SAChB,EACA,CACE,KAAM,eACN,KAAM,UACN,QAAS,GACT,aAAc,SAChB,EACA,CACE,KAAM,YACN,KAAM,OACN,QAAS,GACT,aAAc,MAChB,CACF,EACA,UAAW,EACb,EACA,CACE,KAAM,QACN,KAAM,YACN,OAAQ,CACN,CACE,KAAM,UACN,KAAM,UACN,QAAS,GACT,aAAc,SAChB,EACA,CACE,KAAM,YACN,KAAM,UACN,QAAS,GACT,aAAc,SAChB,EACA,CACE,KAAM,SACN,KAAM,UACN,QAAS,GACT,aAAc,SAChB,EACA,CACE,KAAM,cACN,KAAM,UACN,QAAS,GACT,aAAc,SAChB,EACA,CACE,KAAM,iBACN,KAAM,UACN,QAAS,GACT,aAAc,SAChB,EACA,CACE,KAAM,eACN,KAAM,UACN,QAAS,GACT,aAAc,SAChB,CACF,EACA,UAAW,EACb,EACA,CACE,KAAM,QACN,KAAM,8CACN,OAAQ,CACN,CACE,KAAM,SACN,KAAM,UACN,aAAc,SAChB,CACF,CACF,EACA,CACE,KAAM,QACN,KAAM,0CACN,OAAQ,CACN,CACE,KAAM,SACN,KAAM,UACN,aAAc,SAChB,CACF,CACF,EACA,CACE,KAAM,QACN,KAAM,oCACN,OAAQ,CAAC,CACX,EACA,CACE,KAAM,QACN,KAAM,sBACN,OAAQ,CACN,CACE,KAAM,QACN,KAAM,UACN,aAAc,SAChB,CACF,CACF,EACA,CACE,KAAM,QACN,KAAM,6BACN,OAAQ,CACN,CACE,KAAM,UACN,KAAM,UACN,aAAc,SAChB,CACF,CACF,EACA,CACE,KAAM,QACN,KAAM,4BACN,OAAQ,CAAC,CACX,EACA,CACE,KAAM,QACN,KAAM,uBACN,OAAQ,CAAC,CACX,EACA,CACE,KAAM,QACN,KAAM,2BACN,OAAQ,CACN,CACE,KAAM,QACN,KAAM,UACN,aAAc,SAChB,CACF,CACF,EACA,CACE,KAAM,QACN,KAAM,sCACN,OAAQ,CAAC,CACX,EACA,CACE,KAAM,QACN,KAAM,sCACN,OAAQ,CAAC,CACX,EACA,CACE,KAAM,QACN,KAAM,qCACN,OAAQ,CACN,CACE,KAAM,QACN,KAAM,UACN,aAAc,SAChB,EACA,CACE,KAAM,UACN,KAAM,UACN,aAAc,SAChB,EACA,CACE,KAAM,YACN,KAAM,UACN,aAAc,SAChB,CACF,CACF,EACA,CACE,KAAM,QACN,KAAM,uCACN,OAAQ,CAAC,CACX,EACA,CACE,KAAM,QACN,KAAM,yBACN,OAAQ,CAAC,CACX,EACA,CACE,KAAM,QACN,KAAM,oBACN,OAAQ,CAAC,CACX,CACF,EAGaC,GAAmC,CAC9C,CACE,KAAM,WACN,KAAM,kBACN,OAAQ,CAAC,EACT,QAAS,CAAC,EACV,gBAAiB,YACnB,EACA,CACE,KAAM,WACN,KAAM,QACN,OAAQ,CAAC,EACT,QAAS,CACP,CACE,KAAM,GACN,KAAM,UACN,aAAc,SAChB,CACF,EACA,gBAAiB,MACnB,EACA,CACE,KAAM,WACN,KAAM,eACN,OAAQ,CAAC,EACT,QAAS,CACP,CACE,KAAM,GACN,KAAM,UACN,aAAc,SAChB,CACF,EACA,gBAAiB,MACnB,EACA,CACE,KAAM,WACN,KAAM,oBACN,OAAQ,CAAC,EACT,QAAS,CAAC,EACV,gBAAiB,YACnB,EACA,CACE,KAAM,WACN,KAAM,SACN,OAAQ,CAAC,EACT,QAAS,CACP,CACE,KAAM,GACN,KAAM,UACN,aAAc,SAChB,CACF,EACA,gBAAiB,MACnB,EACA,CACE,KAAM,WACN,KAAM,YACN,OAAQ,CACN,CACE,KAAM,aACN,KAAM,UACN,aAAc,SAChB,CACF,EACA,QAAS,CAAC,EACV,gBAAiB,YACnB,EACA,CACE,KAAM,WACN,KAAM,oBACN,OAAQ,CACN,CACE,KAAM,WACN,KAAM,UACN,aAAc,SAChB,CACF,EACA,QAAS,CAAC,EACV,gBAAiB,YACnB,EACA,CACE,KAAM,QACN,KAAM,2BACN,OAAQ,CACN,CACE,KAAM,gBACN,KAAM,UACN,QAAS,GACT,aAAc,SAChB,EACA,CACE,KAAM,WACN,KAAM,UACN,QAAS,GACT,aAAc,SAChB,CACF,EACA,UAAW,EACb,EACA,CACE,KAAM,QACN,KAAM,uBACN,OAAQ,CACN,CACE,KAAM,gBACN,KAAM,UACN,QAAS,GACT,aAAc,SAChB,EACA,CACE,KAAM,WACN,KAAM,UACN,QAAS,GACT,aAAc,SAChB,CACF,EACA,UAAW,EACb,EACA,CACE,KAAM,QACN,KAAM,YACN,OAAQ,CACN,CACE,KAAM,SACN,KAAM,UACN,QAAS,GACT,aAAc,SAChB,CACF,EACA,UAAW,EACb,EACA,CACE,KAAM,QACN,KAAM,sBACN,OAAQ,CACN,CACE,KAAM,QACN,KAAM,UACN,aAAc,SAChB,CACF,CACF,EACA,CACE,KAAM,QACN,KAAM,6BACN,OAAQ,CACN,CACE,KAAM,UACN,KAAM,UACN,aAAc,SAChB,CACF,CACF,EACA,CACE,KAAM,QACN,KAAM,yBACN,OAAQ,CACN,CACE,KAAM,UACN,KAAM,UACN,aAAc,SAChB,CACF,CACF,EACA,CACE,KAAM,QACN,KAAM,eACN,OAAQ,CAAC,CACX,EACA,CACE,KAAM,QACN,KAAM,4BACN,OAAQ,CACN,CACE,KAAM,UACN,KAAM,UACN,aAAc,SAChB,CACF,CACF,CACF,EAGaC,GAAoC,CAC/C,CACE,KAAM,cACN,OAAQ,CACN,CACE,KAAM,QACN,KAAM,SACN,aAAc,QAChB,EACA,CACE,KAAM,UACN,KAAM,SACN,aAAc,QAChB,EACA,CACE,KAAM,SACN,KAAM,UACN,aAAc,SAChB,CACF,EACA,gBAAiB,YACnB,EACA,CACE,KAAM,WACN,KAAM,iBACN,OAAQ,CAAC,EACT,QAAS,CACP,CACE,KAAM,GACN,KAAM,SACN,aAAc,QAChB,CACF,EACA,gBAAiB,MACnB,EACA,CACE,KAAM,WACN,KAAM,OACN,OAAQ,CAAC,EACT,QAAS,CACP,CACE,KAAM,GACN,KAAM,SACN,aAAc,QAChB,CACF,EACA,gBAAiB,MACnB,EACA,CACE,KAAM,WACN,KAAM,kBACN,OAAQ,CAAC,EACT,QAAS,CAAC,EACV,gBAAiB,YACnB,EACA,CACE,KAAM,WACN,KAAM,UACN,OAAQ,CACN,CACE,KAAM,KACN,KAAM,UACN,aAAc,SAChB,EACA,CACE,KAAM,UACN,KAAM,UACN,aAAc,SAChB,CACF,EACA,QAAS,CAAC,EACV,gBAAiB,MACnB,EACA,CACE,KAAM,WACN,KAAM,YACN,OAAQ,CACN,CACE,KAAM,QACN,KAAM,UACN,aAAc,SAChB,CACF,EACA,QAAS,CACP,CACE,KAAM,GACN,KAAM,UACN,aAAc,SAChB,CACF,EACA,gBAAiB,MACnB,EACA,CACE,KAAM,WACN,KAAM,WACN,OAAQ,CACN,CACE,KAAM,UACN,KAAM,UACN,aAAc,SAChB,CACF,EACA,QAAS,CACP,CACE,KAAM,GACN,KAAM,QACN,aAAc,wBAChB,CACF,EACA,gBAAiB,MACnB,EACA,CACE,KAAM,WACN,KAAM,eACN,OAAQ,CACN,CACE,KAAM,UACN,KAAM,UACN,aAAc,SAChB,CACF,EACA,QAAS,CAAC,EACV,gBAAiB,YACnB,EACA,CACE,KAAM,WACN,KAAM,eACN,OAAQ,CAAC,EACT,QAAS,CACP,CACE,KAAM,SACN,KAAM,SACN,aAAc,QAChB,EACA,CACE,KAAM,OACN,KAAM,SACN,aAAc,QAChB,EACA,CACE,KAAM,UACN,KAAM,SACN,aAAc,QAChB,EACA,CACE,KAAM,UACN,KAAM,UACN,aAAc,SAChB,EACA,CACE,KAAM,oBACN,KAAM,UACN,aAAc,SAChB,EACA,CACE,KAAM,OACN,KAAM,UACN,aAAc,SAChB,EACA,CACE,KAAM,aACN,KAAM,YACN,aAAc,WAChB,CACF,EACA,gBAAiB,MACnB,EACA,CACE,KAAM,WACN,KAAM,cACN,OAAQ,CACN,CACE,KAAM,UACN,KAAM,UACN,aAAc,SAChB,CACF,EACA,QAAS,CACP,CACE,KAAM,GACN,KAAM,UACN,aAAc,SAChB,CACF,EACA,gBAAiB,MACnB,EACA,CACE,KAAM,WACN,KAAM,gBACN,OAAQ,CAAC,EACT,QAAS,CACP,CACE,KAAM,GACN,KAAM,UACN,aAAc,SAChB,CACF,EACA,gBAAiB,MACnB,EACA,CACE,KAAM,WACN,KAAM,mBACN,OAAQ,CACN,CACE,KAAM,QACN,KAAM,UACN,aAAc,SAChB,EACA,CACE,KAAM,WACN,KAAM,UACN,aAAc,SAChB,CACF,EACA,QAAS,CACP,CACE,KAAM,GACN,KAAM,OACN,aAAc,MAChB,CACF,EACA,gBAAiB,MACnB,EACA,CACE,KAAM,WACN,KAAM,eACN,OAAQ,CACN,CACE,KAAM,UACN,KAAM,QACN,aAAc,6BACd,WAAY,CACV,CACE,KAAM,eACN,KAAM,QACN,aAAc,mBAChB,EACA,CACE,KAAM,SACN,KAAM,SACN,aAAc,QAChB,EACA,CACE,KAAM,WACN,KAAM,QACN,aAAc,wBAChB,EACA,CACE,KAAM,qBACN,KAAM,QACN,aAAc,OAChB,EACA,CACE,KAAM,KACN,KAAM,UACN,aAAc,SAChB,EACA,CACE,KAAM,QACN,KAAM,QACN,aAAc,OAChB,EACA,CACE,KAAM,YACN,KAAM,QACN,aAAc,OAChB,CACF,CACF,CACF,EACA,QAAS,CACP,CACE,KAAM,UACN,KAAM,UACN,aAAc,SAChB,CACF,EACA,gBAAiB,YACnB,EACA,CACE,KAAM,WACN,KAAM,OACN,OAAQ,CAAC,EACT,QAAS,CACP,CACE,KAAM,GACN,KAAM,SACN,aAAc,QAChB,CACF,EACA,gBAAiB,MACnB,EACA,CACE,KAAM,WACN,KAAM,QACN,OAAQ,CAAC,EACT,QAAS,CACP,CACE,KAAM,GACN,KAAM,UACN,aAAc,SAChB,CACF,EACA,gBAAiB,MACnB,EACA,CACE,KAAM,WACN,KAAM,UACN,OAAQ,CACN,CACE,KAAM,UACN,KAAM,UACN,aAAc,SAChB,CACF,EACA,QAAS,CACP,CACE,KAAM,GACN,KAAM,UACN,aAAc,SAChB,CACF,EACA,gBAAiB,MACnB,EACA,CACE,KAAM,WACN,KAAM,eACN,OAAQ,CAAC,EACT,QAAS,CACP,CACE,KAAM,GACN,KAAM,UACN,aAAc,SAChB,CACF,EACA,gBAAiB,MACnB,EACA,CACE,KAAM,WACN,KAAM,oBACN,OAAQ,CAAC,EACT,QAAS,CAAC,EACV,gBAAiB,YACnB,EACA,CACE,KAAM,WACN,KAAM,SACN,OAAQ,CAAC,EACT,QAAS,CACP,CACE,KAAM,GACN,KAAM,UACN,aAAc,SAChB,CACF,EACA,gBAAiB,MACnB,EACA,CACE,KAAM,WACN,KAAM,mBACN,OAAQ,CACN,CACE,KAAM,OACN,KAAM,UACN,aAAc,SAChB,EACA,CACE,KAAM,KACN,KAAM,UACN,aAAc,SAChB,EACA,CACE,KAAM,UACN,KAAM,UACN,aAAc,SAChB,CACF,EACA,QAAS,CAAC,EACV,gBAAiB,YACnB,EACA,CACE,KAAM,WACN,KAAM,mBACN,OAAQ,CACN,CACE,KAAM,OACN,KAAM,UACN,aAAc,SAChB,EACA,CACE,KAAM,KACN,KAAM,UACN,aAAc,SAChB,EACA,CACE,KAAM,UACN,KAAM,UACN,aAAc,SAChB,EACA,CACE,KAAM,QACN,KAAM,QACN,aAAc,OAChB,CACF,EACA,QAAS,CAAC,EACV,gBAAiB,MACnB,EACA,CACE,KAAM,WACN,KAAM,oBACN,OAAQ,CACN,CACE,KAAM,WACN,KAAM,UACN,aAAc,SAChB,EACA,CACE,KAAM,WACN,KAAM,OACN,aAAc,MAChB,CACF,EACA,QAAS,CAAC,EACV,gBAAiB,YACnB,EACA,CACE,KAAM,WACN,KAAM,YACN,OAAQ,CACN,CACE,KAAM,aACN,KAAM,UACN,aAAc,SAChB,CACF,EACA,QAAS,CAAC,EACV,gBAAiB,YACnB,EACA,CACE,KAAM,WACN,KAAM,oBACN,OAAQ,CACN,CACE,KAAM,cACN,KAAM,SACN,aAAc,QAChB,CACF,EACA,QAAS,CACP,CACE,KAAM,GACN,KAAM,OACN,aAAc,MAChB,CACF,EACA,gBAAiB,MACnB,EACA,CACE,KAAM,WACN,KAAM,SACN,OAAQ,CAAC,EACT,QAAS,CACP,CACE,KAAM,GACN,KAAM,SACN,aAAc,QAChB,CACF,EACA,gBAAiB,MACnB,EACA,CACE,KAAM,WACN,KAAM,aACN,OAAQ,CACN,CACE,KAAM,UACN,KAAM,UACN,aAAc,SAChB,CACF,EACA,QAAS,CACP,CACE,KAAM,UACN,KAAM,UACN,aAAc,SAChB,CACF,EACA,gBAAiB,MACnB,EACA,CACE,KAAM,WACN,KAAM,WACN,OAAQ,CACN,CACE,KAAM,UACN,KAAM,UACN,aAAc,SAChB,CACF,EACA,QAAS,CACP,CACE,KAAM,GACN,KAAM,SACN,aAAc,QAChB,CACF,EACA,gBAAiB,MACnB,EACA,CACE,KAAM,WACN,KAAM,eACN,OAAQ,CACN,CACE,KAAM,OACN,KAAM,UACN,aAAc,SAChB,EACA,CACE,KAAM,KACN,KAAM,UACN,aAAc,SAChB,EACA,CACE,KAAM,UACN,KAAM,UACN,aAAc,SAChB,CACF,EACA,QAAS,CAAC,EACV,gBAAiB,MACnB,EACA,CACE,KAAM,WACN,KAAM,oBACN,OAAQ,CACN,CACE,KAAM,WACN,KAAM,UACN,aAAc,SAChB,CACF,EACA,QAAS,CAAC,EACV,gBAAiB,YACnB,EACA,CACE,KAAM,QACN,KAAM,WACN,OAAQ,CACN,CACE,KAAM,QACN,KAAM,UACN,QAAS,GACT,aAAc,SAChB,EACA,CACE,KAAM,WACN,KAAM,UACN,QAAS,GACT,aAAc,SAChB,EACA,CACE,KAAM,UACN,KAAM,UACN,QAAS,GACT,aAAc,SAChB,CACF,EACA,UAAW,EACb,EACA,CACE,KAAM,QACN,KAAM,iBACN,OAAQ,CACN,CACE,KAAM,QACN,KAAM,UACN,QAAS,GACT,aAAc,SAChB,EACA,CACE,KAAM,WACN,KAAM,UACN,QAAS,GACT,aAAc,SAChB,EACA,CACE,KAAM,WACN,KAAM,OACN,QAAS,GACT,aAAc,MAChB,CACF,EACA,UAAW,EACb,EACA,CACE,KAAM,QACN,KAAM,SACN,OAAQ,CACN,CACE,KAAM,OACN,KAAM,UACN,QAAS,GACT,aAAc,SAChB,EACA,CACE,KAAM,UACN,KAAM,UACN,QAAS,GACT,aAAc,SAChB,EACA,CACE,KAAM,OACN,KAAM,QACN,QAAS,GACT,aAAc,wBAChB,CACF,EACA,UAAW,EACb,EACA,CACE,KAAM,QACN,KAAM,sBACN,OAAQ,CAAC,EACT,UAAW,EACb,EACA,CACE,KAAM,QACN,KAAM,SACN,OAAQ,CACN,CACE,KAAM,OACN,KAAM,UACN,QAAS,GACT,aAAc,SAChB,EACA,CACE,KAAM,KACN,KAAM,UACN,QAAS,GACT,aAAc,SAChB,EACA,CACE,KAAM,UACN,KAAM,UACN,QAAS,GACT,aAAc,SAChB,EACA,CACE,KAAM,WACN,KAAM,QACN,QAAS,GACT,aAAc,wBAChB,CACF,EACA,UAAW,EACb,EACA,CACE,KAAM,QACN,KAAM,2BACN,OAAQ,CACN,CACE,KAAM,gBACN,KAAM,UACN,QAAS,GACT,aAAc,SAChB,EACA,CACE,KAAM,WACN,KAAM,UACN,QAAS,GACT,aAAc,SAChB,CACF,EACA,UAAW,EACb,EACA,CACE,KAAM,QACN,KAAM,uBACN,OAAQ,CACN,CACE,KAAM,gBACN,KAAM,UACN,QAAS,GACT,aAAc,SAChB,EACA,CACE,KAAM,WACN,KAAM,UACN,QAAS,GACT,aAAc,SAChB,CACF,EACA,UAAW,EACb,EACA,CACE,KAAM,QACN,KAAM,YACN,OAAQ,CACN,CACE,KAAM,SACN,KAAM,UACN,QAAS,GACT,aAAc,SAChB,CACF,EACA,UAAW,EACb,EACA,CACE,KAAM,QACN,KAAM,YACN,OAAQ,CACN,CACE,KAAM,aACN,KAAM,UACN,QAAS,GACT,aAAc,SAChB,EACA,CACE,KAAM,OACN,KAAM,SACN,QAAS,GACT,aAAc,QAChB,EACA,CACE,KAAM,gBACN,KAAM,SACN,QAAS,GACT,aAAc,QAChB,EACA,CACE,KAAM,UACN,KAAM,UACN,QAAS,GACT,aAAc,SAChB,EACA,CACE,KAAM,kBACN,KAAM,UACN,QAAS,GACT,aAAc,SAChB,CACF,EACA,UAAW,EACb,EACA,CACE,KAAM,QACN,KAAM,WACN,OAAQ,CACN,CACE,KAAM,OACN,KAAM,UACN,QAAS,GACT,aAAc,SAChB,EACA,CACE,KAAM,KACN,KAAM,UACN,QAAS,GACT,aAAc,SAChB,EACA,CACE,KAAM,UACN,KAAM,UACN,QAAS,GACT,aAAc,SAChB,CACF,EACA,UAAW,EACb,EACA,CACE,KAAM,QACN,KAAM,uBACN,OAAQ,CAAC,CACX,EACA,CACE,KAAM,QACN,KAAM,uBACN,OAAQ,CACN,CACE,KAAM,SACN,KAAM,UACN,aAAc,SAChB,EACA,CACE,KAAM,UACN,KAAM,UACN,aAAc,SAChB,EACA,CACE,KAAM,QACN,KAAM,UACN,aAAc,SAChB,CACF,CACF,EACA,CACE,KAAM,QACN,KAAM,6BACN,OAAQ,CACN,CACE,KAAM,WACN,KAAM,UACN,aAAc,SAChB,EACA,CACE,KAAM,UACN,KAAM,UACN,aAAc,SAChB,CACF,CACF,EACA,CACE,KAAM,QACN,KAAM,wBACN,OAAQ,CACN,CACE,KAAM,WACN,KAAM,UACN,aAAc,SAChB,CACF,CACF,EACA,CACE,KAAM,QACN,KAAM,wBACN,OAAQ,CACN,CACE,KAAM,WACN,KAAM,UACN,aAAc,SAChB,CACF,CACF,EACA,CACE,KAAM,QACN,KAAM,qBACN,OAAQ,CACN,CACE,KAAM,QACN,KAAM,UACN,aAAc,SAChB,CACF,CACF,EACA,CACE,KAAM,QACN,KAAM,wBACN,OAAQ,CACN,CACE,KAAM,WACN,KAAM,UACN,aAAc,SAChB,CACF,CACF,EACA,CACE,KAAM,QACN,KAAM,sBACN,OAAQ,CACN,CACE,KAAM,SACN,KAAM,UACN,aAAc,SAChB,CACF,CACF,EACA,CACE,KAAM,QACN,KAAM,wBACN,OAAQ,CAAC,CACX,EACA,CACE,KAAM,QACN,KAAM,yBACN,OAAQ,CACN,CACE,KAAM,UACN,KAAM,UACN,aAAc,SAChB,CACF,CACF,EACA,CACE,KAAM,QACN,KAAM,kBACN,OAAQ,CACN,CACE,KAAM,UACN,KAAM,UACN,aAAc,SAChB,CACF,CACF,EACA,CACE,KAAM,QACN,KAAM,wBACN,OAAQ,CAAC,CACX,EACA,CACE,KAAM,QACN,KAAM,uBACN,OAAQ,CAAC,CACX,EACA,CACE,KAAM,QACN,KAAM,2BACN,OAAQ,CAAC,CACX,EACA,CACE,KAAM,QACN,KAAM,qBACN,OAAQ,CAAC,CACX,EACA,CACE,KAAM,QACN,KAAM,sBACN,OAAQ,CACN,CACE,KAAM,QACN,KAAM,UACN,aAAc,SAChB,CACF,CACF,EACA,CACE,KAAM,QACN,KAAM,6BACN,OAAQ,CACN,CACE,KAAM,UACN,KAAM,UACN,aAAc,SAChB,CACF,CACF,EACA,CACE,KAAM,QACN,KAAM,yBACN,OAAQ,CACN,CACE,KAAM,UACN,KAAM,UACN,aAAc,SAChB,CACF,CACF,EACA,CACE,KAAM,QACN,KAAM,eACN,OAAQ,CAAC,CACX,EACA,CACE,KAAM,QACN,KAAM,4BACN,OAAQ,CACN,CACE,KAAM,UACN,KAAM,UACN,aAAc,SAChB,CACF,CACF,EACA,CACE,KAAM,QACN,KAAM,yBACN,OAAQ,CACN,CACE,KAAM,UACN,KAAM,UACN,aAAc,SAChB,CACF,CACF,EACA,CACE,KAAM,QACN,KAAM,gBACN,OAAQ,CACN,CACE,KAAM,MACN,KAAM,SACN,aAAc,QAChB,CACF,CACF,CACF,EAGaC,GAAoC,CAC/C,CACE,KAAM,cACN,OAAQ,CACN,CACE,KAAM,SACN,KAAM,UACN,aAAc,SAChB,EACA,CACE,KAAM,oBACN,KAAM,UACN,aAAc,SAChB,CACF,EACA,gBAAiB,YACnB,EACA,CACE,KAAM,WACN,KAAM,kBACN,OAAQ,CAAC,EACT,QAAS,CAAC,EACV,gBAAiB,YACnB,EACA,CACE,KAAM,WACN,KAAM,yBACN,OAAQ,CACN,CACE,KAAM,kBACN,KAAM,UACN,aAAc,SAChB,EACA,CACE,KAAM,QACN,KAAM,UACN,aAAc,SAChB,CACF,EACA,QAAS,CACP,CACE,KAAM,UACN,KAAM,UACN,aAAc,SAChB,CACF,EACA,gBAAiB,MACnB,EACA,CACE,KAAM,WACN,KAAM,WACN,OAAQ,CACN,CACE,KAAM,UACN,KAAM,UACN,aAAc,SAChB,CACF,EACA,QAAS,CACP,CACE,KAAM,GACN,KAAM,SACN,aAAc,QAChB,CACF,EACA,gBAAiB,MACnB,EACA,CACE,KAAM,WACN,KAAM,mBACN,OAAQ,CACN,CACE,KAAM,kBACN,KAAM,UACN,aAAc,SAChB,EACA,CACE,KAAM,SACN,KAAM,UACN,aAAc,SAChB,EACA,CACE,KAAM,QACN,KAAM,UACN,aAAc,SAChB,CACF,EACA,QAAS,CACP,CACE,KAAM,WACN,KAAM,YACN,aAAc,WAChB,CACF,EACA,gBAAiB,MACnB,EACA,CACE,KAAM,WACN,KAAM,gBACN,OAAQ,CAAC,EACT,QAAS,CACP,CACE,KAAM,GACN,KAAM,SACN,aAAc,QAChB,CACF,EACA,gBAAiB,MACnB,EACA,CACE,KAAM,WACN,KAAM,mBACN,OAAQ,CAAC,EACT,QAAS,CACP,CACE,KAAM,GACN,KAAM,UACN,aAAc,SAChB,CACF,EACA,gBAAiB,MACnB,EACA,CACE,KAAM,WACN,KAAM,iBACN,OAAQ,CAAC,EACT,QAAS,CACP,CACE,KAAM,GACN,KAAM,SACN,aAAc,QAChB,CACF,EACA,gBAAiB,MACnB,EACA,CACE,KAAM,WACN,KAAM,OACN,OAAQ,CACN,CACE,KAAM,UACN,KAAM,QACN,aAAc,iCACd,WAAY,CACV,CACE,KAAM,cACN,KAAM,QACN,aAAc,qBACd,WAAY,CACV,CACE,KAAM,mBACN,KAAM,UACN,aAAc,SAChB,EACA,CACE,KAAM,UACN,KAAM,UACN,aAAc,SAChB,CACF,CACF,EACA,CACE,KAAM,cACN,KAAM,QACN,aAAc,kBAChB,EACA,CACE,KAAM,cACN,KAAM,UACN,aAAc,SAChB,EACA,CACE,KAAM,YACN,KAAM,UACN,aAAc,SAChB,EACA,CACE,KAAM,UACN,KAAM,UACN,aAAc,SAChB,EACA,CACE,KAAM,eACN,KAAM,UACN,aAAc,SAChB,EACA,CACE,KAAM,YACN,KAAM,UACN,aAAc,SAChB,EACA,CACE,KAAM,OACN,KAAM,UACN,aAAc,SAChB,CACF,CACF,CACF,EACA,QAAS,CACP,CACE,KAAM,UACN,KAAM,UACN,aAAc,SAChB,CACF,EACA,gBAAiB,YACnB,EACA,CACE,KAAM,WACN,KAAM,QACN,OAAQ,CAAC,EACT,QAAS,CACP,CACE,KAAM,GACN,KAAM,UACN,aAAc,SAChB,CACF,EACA,gBAAiB,MACnB,EACA,CACE,KAAM,WACN,KAAM,UACN,OAAQ,CACN,CACE,KAAM,UACN,KAAM,UACN,aAAc,SAChB,CACF,EACA,QAAS,CACP,CACE,KAAM,aACN,KAAM,UACN,aAAc,SAChB,EACA,CACE,KAAM,aACN,KAAM,UACN,aAAc,SAChB,CACF,EACA,gBAAiB,MACnB,EACA,CACE,KAAM,WACN,KAAM,eACN,OAAQ,CAAC,EACT,QAAS,CACP,CACE,KAAM,GACN,KAAM,UACN,aAAc,SAChB,CACF,EACA,gBAAiB,MACnB,EACA,CACE,KAAM,WACN,KAAM,oBACN,OAAQ,CAAC,EACT,QAAS,CAAC,EACV,gBAAiB,YACnB,EACA,CACE,KAAM,WACN,KAAM,SACN,OAAQ,CAAC,EACT,QAAS,CACP,CACE,KAAM,GACN,KAAM,UACN,aAAc,SAChB,CACF,EACA,gBAAiB,MACnB,EACA,CACE,KAAM,WACN,KAAM,YACN,OAAQ,CACN,CACE,KAAM,aACN,KAAM,UACN,aAAc,SAChB,CACF,EACA,QAAS,CAAC,EACV,gBAAiB,YACnB,EACA,CACE,KAAM,WACN,KAAM,wBACN,OAAQ,CACN,CACE,KAAM,kBACN,KAAM,UACN,aAAc,SAChB,CACF,EACA,QAAS,CACP,CACE,KAAM,cACN,KAAM,UACN,aAAc,SAChB,CACF,EACA,gBAAiB,MACnB,EACA,CACE,KAAM,WACN,KAAM,oBACN,OAAQ,CACN,CACE,KAAM,WACN,KAAM,UACN,aAAc,SAChB,CACF,EACA,QAAS,CAAC,EACV,gBAAiB,YACnB,EACA,CACE,KAAM,QACN,KAAM,OACN,OAAQ,CACN,CACE,KAAM,UACN,KAAM,UACN,QAAS,GACT,aAAc,SAChB,EACA,CACE,KAAM,aACN,KAAM,UACN,QAAS,GACT,aAAc,SAChB,EACA,CACE,KAAM,aACN,KAAM,UACN,QAAS,GACT,aAAc,SAChB,CACF,EACA,UAAW,EACb,EACA,CACE,KAAM,QACN,KAAM,2BACN,OAAQ,CACN,CACE,KAAM,gBACN,KAAM,UACN,QAAS,GACT,aAAc,SAChB,EACA,CACE,KAAM,WACN,KAAM,UACN,QAAS,GACT,aAAc,SAChB,CACF,EACA,UAAW,EACb,EACA,CACE,KAAM,QACN,KAAM,uBACN,OAAQ,CACN,CACE,KAAM,gBACN,KAAM,UACN,QAAS,GACT,aAAc,SAChB,EACA,CACE,KAAM,WACN,KAAM,UACN,QAAS,GACT,aAAc,SAChB,CACF,EACA,UAAW,EACb,EACA,CACE,KAAM,QACN,KAAM,YACN,OAAQ,CACN,CACE,KAAM,SACN,KAAM,UACN,QAAS,GACT,aAAc,SAChB,CACF,EACA,UAAW,EACb,EACA,CACE,KAAM,QACN,KAAM,iBACN,OAAQ,CACN,CACE,KAAM,UACN,KAAM,UACN,aAAc,SAChB,CACF,CACF,EACA,CACE,KAAM,QACN,KAAM,yBACN,OAAQ,CACN,CACE,KAAM,QACN,KAAM,UACN,aAAc,SAChB,EACA,CACE,KAAM,WACN,KAAM,UACN,aAAc,SAChB,CACF,CACF,EACA,CACE,KAAM,QACN,KAAM,2BACN,OAAQ,CACN,CACE,KAAM,WACN,KAAM,UACN,aAAc,SAChB,EACA,CACE,KAAM,SACN,KAAM,UACN,aAAc,SAChB,CACF,CACF,EACA,CACE,KAAM,QACN,KAAM,0BACN,OAAQ,CAAC,CACX,EACA,CACE,KAAM,QACN,KAAM,sBACN,OAAQ,CACN,CACE,KAAM,QACN,KAAM,UACN,aAAc,SAChB,CACF,CACF,EACA,CACE,KAAM,QACN,KAAM,6BACN,OAAQ,CACN,CACE,KAAM,UACN,KAAM,UACN,aAAc,SAChB,CACF,CACF,EACA,CACE,KAAM,QACN,KAAM,wCACN,OAAQ,CACN,CACE,KAAM,OACN,KAAM,UACN,aAAc,SAChB,CACF,CACF,EACA,CACE,KAAM,QACN,KAAM,yBACN,OAAQ,CACN,CACE,KAAM,UACN,KAAM,UACN,aAAc,SAChB,CACF,CACF,EACA,CACE,KAAM,QACN,KAAM,eACN,OAAQ,CAAC,CACX,EACA,CACE,KAAM,QACN,KAAM,4BACN,OAAQ,CACN,CACE,KAAM,UACN,KAAM,UACN,aAAc,SAChB,CACF,CACF,EACA,CACE,KAAM,QACN,KAAM,+BACN,OAAQ,CACN,CACE,KAAM,QACN,KAAM,UACN,aAAc,SAChB,EACA,CACE,KAAM,SACN,KAAM,UACN,aAAc,SAChB,CACF,CACF,CACF,EAGaC,GAA2C,CACtD,CACE,KAAM,cACN,OAAQ,CACN,CACE,KAAM,SACN,KAAM,UACN,aAAc,SAChB,EACA,CACE,KAAM,oBACN,KAAM,UACN,aAAc,SAChB,EACA,CACE,KAAM,wBACN,KAAM,UACN,aAAc,SAChB,CACF,EACA,gBAAiB,YACnB,EACA,CACE,KAAM,WACN,KAAM,kBACN,OAAQ,CAAC,EACT,QAAS,CAAC,EACV,gBAAiB,YACnB,EACA,CACE,KAAM,WACN,KAAM,yBACN,OAAQ,CACN,CACE,KAAM,kBACN,KAAM,UACN,aAAc,SAChB,EACA,CACE,KAAM,QACN,KAAM,UACN,aAAc,SAChB,CACF,EACA,QAAS,CACP,CACE,KAAM,UACN,KAAM,UACN,aAAc,SAChB,CACF,EACA,gBAAiB,MACnB,EACA,CACE,KAAM,WACN,KAAM,WACN,OAAQ,CACN,CACE,KAAM,UACN,KAAM,UACN,aAAc,SAChB,CACF,EACA,QAAS,CACP,CACE,KAAM,GACN,KAAM,SACN,aAAc,QAChB,CACF,EACA,gBAAiB,MACnB,EACA,CACE,KAAM,WACN,KAAM,mBACN,OAAQ,CACN,CACE,KAAM,kBACN,KAAM,UACN,aAAc,SAChB,EACA,CACE,KAAM,SACN,KAAM,UACN,aAAc,SAChB,EACA,CACE,KAAM,QACN,KAAM,UACN,aAAc,SAChB,CACF,EACA,QAAS,CACP,CACE,KAAM,WACN,KAAM,YACN,aAAc,WAChB,CACF,EACA,gBAAiB,MACnB,EACA,CACE,KAAM,WACN,KAAM,gBACN,OAAQ,CAAC,EACT,QAAS,CACP,CACE,KAAM,GACN,KAAM,SACN,aAAc,QAChB,CACF,EACA,gBAAiB,MACnB,EACA,CACE,KAAM,WACN,KAAM,mBACN,OAAQ,CAAC,EACT,QAAS,CACP,CACE,KAAM,GACN,KAAM,UACN,aAAc,SAChB,CACF,EACA,gBAAiB,MACnB,EACA,CACE,KAAM,WACN,KAAM,iBACN,OAAQ,CAAC,EACT,QAAS,CACP,CACE,KAAM,GACN,KAAM,SACN,aAAc,QAChB,CACF,EACA,gBAAiB,MACnB,EACA,CACE,KAAM,WACN,KAAM,OACN,OAAQ,CACN,CACE,KAAM,UACN,KAAM,QACN,aAAc,uCACd,WAAY,CACV,CACE,KAAM,cACN,KAAM,QACN,aAAc,qBACd,WAAY,CACV,CACE,KAAM,mBACN,KAAM,UACN,aAAc,SAChB,EACA,CACE,KAAM,UACN,KAAM,UACN,aAAc,SAChB,CACF,CACF,EACA,CACE,KAAM,cACN,KAAM,UACN,aAAc,SAChB,EACA,CACE,KAAM,QACN,KAAM,UACN,aAAc,SAChB,EACA,CACE,KAAM,UACN,KAAM,UACN,aAAc,SAChB,EACA,CACE,KAAM,eACN,KAAM,UACN,aAAc,SAChB,EACA,CACE,KAAM,YACN,KAAM,UACN,aAAc,SAChB,EACA,CACE,KAAM,iBACN,KAAM,UACN,aAAc,SAChB,EACA,CACE,KAAM,OACN,KAAM,UACN,aAAc,SAChB,CACF,CACF,CACF,EACA,QAAS,CACP,CACE,KAAM,UACN,KAAM,UACN,aAAc,SAChB,CACF,EACA,gBAAiB,YACnB,EACA,CACE,KAAM,WACN,KAAM,QACN,OAAQ,CAAC,EACT,QAAS,CACP,CACE,KAAM,GACN,KAAM,UACN,aAAc,SAChB,CACF,EACA,gBAAiB,MACnB,EACA,CACE,KAAM,WACN,KAAM,UACN,OAAQ,CACN,CACE,KAAM,UACN,KAAM,UACN,aAAc,SAChB,CACF,EACA,QAAS,CACP,CACE,KAAM,aACN,KAAM,UACN,aAAc,SAChB,EACA,CACE,KAAM,aACN,KAAM,UACN,aAAc,SAChB,CACF,EACA,gBAAiB,MACnB,EACA,CACE,KAAM,WACN,KAAM,eACN,OAAQ,CAAC,EACT,QAAS,CACP,CACE,KAAM,GACN,KAAM,UACN,aAAc,SAChB,CACF,EACA,gBAAiB,MACnB,EACA,CACE,KAAM,WACN,KAAM,uBACN,OAAQ,CAAC,EACT,QAAS,CACP,CACE,KAAM,GACN,KAAM,UACN,aAAc,SAChB,CACF,EACA,gBAAiB,MACnB,EACA,CACE,KAAM,WACN,KAAM,oBACN,OAAQ,CAAC,EACT,QAAS,CAAC,EACV,gBAAiB,YACnB,EACA,CACE,KAAM,WACN,KAAM,SACN,OAAQ,CAAC,EACT,QAAS,CACP,CACE,KAAM,GACN,KAAM,UACN,aAAc,SAChB,CACF,EACA,gBAAiB,MACnB,EACA,CACE,KAAM,WACN,KAAM,YACN,OAAQ,CACN,CACE,KAAM,aACN,KAAM,UACN,aAAc,SAChB,CACF,EACA,QAAS,CAAC,EACV,gBAAiB,YACnB,EACA,CACE,KAAM,WACN,KAAM,wBACN,OAAQ,CACN,CACE,KAAM,kBACN,KAAM,UACN,aAAc,SAChB,CACF,EACA,QAAS,CACP,CACE,KAAM,cACN,KAAM,UACN,aAAc,SAChB,CACF,EACA,gBAAiB,MACnB,EACA,CACE,KAAM,WACN,KAAM,oBACN,OAAQ,CACN,CACE,KAAM,WACN,KAAM,UACN,aAAc,SAChB,CACF,EACA,QAAS,CAAC,EACV,gBAAiB,YACnB,EACA,CACE,KAAM,QACN,KAAM,OACN,OAAQ,CACN,CACE,KAAM,UACN,KAAM,UACN,QAAS,GACT,aAAc,SAChB,EACA,CACE,KAAM,aACN,KAAM,UACN,QAAS,GACT,aAAc,SAChB,EACA,CACE,KAAM,aACN,KAAM,UACN,QAAS,GACT,aAAc,SAChB,CACF,EACA,UAAW,EACb,EACA,CACE,KAAM,QACN,KAAM,2BACN,OAAQ,CACN,CACE,KAAM,gBACN,KAAM,UACN,QAAS,GACT,aAAc,SAChB,EACA,CACE,KAAM,WACN,KAAM,UACN,QAAS,GACT,aAAc,SAChB,CACF,EACA,UAAW,EACb,EACA,CACE,KAAM,QACN,KAAM,uBACN,OAAQ,CACN,CACE,KAAM,gBACN,KAAM,UACN,QAAS,GACT,aAAc,SAChB,EACA,CACE,KAAM,WACN,KAAM,UACN,QAAS,GACT,aAAc,SAChB,CACF,EACA,UAAW,EACb,EACA,CACE,KAAM,QACN,KAAM,YACN,OAAQ,CACN,CACE,KAAM,SACN,KAAM,UACN,QAAS,GACT,aAAc,SAChB,CACF,EACA,UAAW,EACb,EACA,CACE,KAAM,QACN,KAAM,iBACN,OAAQ,CACN,CACE,KAAM,UACN,KAAM,UACN,aAAc,SAChB,CACF,CACF,EACA,CACE,KAAM,QACN,KAAM,yBACN,OAAQ,CACN,CACE,KAAM,QACN,KAAM,UACN,aAAc,SAChB,EACA,CACE,KAAM,WACN,KAAM,UACN,aAAc,SAChB,CACF,CACF,EACA,CACE,KAAM,QACN,KAAM,2BACN,OAAQ,CACN,CACE,KAAM,WACN,KAAM,UACN,aAAc,SAChB,EACA,CACE,KAAM,SACN,KAAM,UACN,aAAc,SAChB,CACF,CACF,EACA,CACE,KAAM,QACN,KAAM,0BACN,OAAQ,CAAC,CACX,EACA,CACE,KAAM,QACN,KAAM,sBACN,OAAQ,CACN,CACE,KAAM,QACN,KAAM,UACN,aAAc,SAChB,CACF,CACF,EACA,CACE,KAAM,QACN,KAAM,6BACN,OAAQ,CACN,CACE,KAAM,UACN,KAAM,UACN,aAAc,SAChB,CACF,CACF,EACA,CACE,KAAM,QACN,KAAM,8CACN,OAAQ,CACN,CACE,KAAM,OACN,KAAM,UACN,aAAc,SAChB,CACF,CACF,EACA,CACE,KAAM,QACN,KAAM,yBACN,OAAQ,CACN,CACE,KAAM,UACN,KAAM,UACN,aAAc,SAChB,CACF,CACF,EACA,CACE,KAAM,QACN,KAAM,eACN,OAAQ,CAAC,CACX,EACA,CACE,KAAM,QACN,KAAM,4BACN,OAAQ,CACN,CACE,KAAM,UACN,KAAM,UA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",
6
+ "names": ["IdentityType", "BurnAuth", "CASHIE_IDENTITY_SOUL_EIP712_NAME", "CASHIE_IDENTITY_SOUL_EIP712_VERSION", "PRIMARY_TYPE_IDENTITY_MINT_PAYLOAD", "PRIMARY_TYPE_IDENTITY_MINT_CONSENT", "IDENTITY_MINT_PAYLOAD_EIP712_TYPE_STRING", "IDENTITY_MINT_CONSENT_EIP712_TYPE_STRING", "IDENTITY_MINT_PAYLOAD_EIP712_TYPES", "IDENTITY_MINT_EIP712_TYPES", "getAddress", "hexToBigInt", "keccak256", "numberToHex", "UINT160_MASK", "identityTokenIdFor", "account", "identityAccountFor", "tokenId", "low160", "buildIdentityCommitmentHash", "providerId", "commitment", "hashTypedData", "hexToBigInt", "buildCashieIdentitySoulDomain", "chainId", "verifyingContract", "id", "hexToBigInt", "CASHIE_IDENTITY_SOUL_EIP712_NAME", "CASHIE_IDENTITY_SOUL_EIP712_VERSION", "buildIdentityMintConsentTypedData", "args", "IDENTITY_MINT_EIP712_TYPES", "PRIMARY_TYPE_IDENTITY_MINT_CONSENT", "buildIdentityMintProofTypedData", "IDENTITY_MINT_PAYLOAD_EIP712_TYPES", "PRIMARY_TYPE_IDENTITY_MINT_PAYLOAD", "hashIdentityMintConsentTypedData", "domain", "types", "primaryType", "message", "hashTypedData", "hashIdentityMintProofTypedData", "IdentityIssuerId", "getWebCrypto", "c", "uint8ArrayToHex", "bytes", "b", "generateSalt", "assertUrl", "url", "IdentityIssuer", "#config", "config", "assertUrl", "path", "body", "url", "response", "errorData", "params", "account", "request", "identityIssuerId", "IdentityIssuerId", "PlaidIdvErrorCode", "PLAID_IDV_ERROR_MESSAGE", "plaidIdvError", "code", "fromHex", "toHex", "z", "z", "z", "isAddress", "isHex", "addressSchema", "val", "hexSchema", "baseScopeSchema", "ERC7715ValidationError", "schemaName", "zodError", "details", "issue", "path", "parseWithSchema", "schema", "value", "parsed", "parseBaseScopeSchema", "scope", "identityTypeSchema", "z", "IdentityType", "burnAuthSchema", "BurnAuth", "identityMintSignPayloadWithSignatureSchema", "hexSchema", "addressSchema", "expiryRuleSchema", "baseScopeSchema", "identityMintRuleSchema", "ruleSchema", "ruleSchemas", "parseExpiryRule", "value", "parseWithSchema", "parseIdentityMintRule", "parseRule", "CASHIE_JSON_DATA_URI_BASE64_PREFIX", "CASHIE_SVG_DATA_URI_BASE64_PREFIX", "CASHIE_RECEIPT_BADGE_METADATA_FORMAT", "CASHIE_PAYMENT_RECORD_BADGE_METADATA_FORMAT", "cashieIdentitySoulIdentityTypeJsonSchema", "z", "JSON_IDENTITY_TYPE_LABEL_TO_IDENTITY_TYPE", "IdentityType", "decimalStringSchema", "hex0xSchema", "bytes32HexSchema", "s", "cashieReceiptBadgeSoulBoundToSchema", "cashieReceiptBadgeMetadataSchema", "burnAuthJsonOrdinalSchema", "n", "BurnAuth", "cashiePaymentRecordBadgeMetadataSchema", "cashieIdentitySoulTokenMetadataJsonSchema", "label", "cashieIdentitySoulTokenMetadataSchema", "identityTypeSchema", "burnAuthSchema", "encodeAbiParameters", "getAddress", "hexToBigInt", "keccak256", "ReceiptType", "RECEIPT_BADGE_MINT_PAYLOAD_ABI_PARAMS", "encodeReceiptBadgeMintPayload", "payload", "encodeAbiParameters", "getReceiptBadgeMintPayloadHash", "keccak256", "receiptBadgeIdFromMintPayload", "receiptBadgeMintPayloadFromPaymentIntent", "identityContract", "paymentIntent", "blockNumber", "receiptType", "getAddress", "identityTokenIdFor", "hexToBigInt", "receiptBadgeIdFromPaymentIntent", "PAYMENT_RECORD_BADGE_MINT_PAYLOAD_ABI_PARAMS", "encodePaymentRecordBadgeMintPayload", "getPaymentRecordBadgeMintPayloadHash", "paymentRecordBadgeIdFromMintPayload", "paymentRecordBadgeMintPayloadFromPaymentIntent", "receiptBadgeId", "paymentRecordBadgeIdFromPaymentIntent", "decodeBase64ToUtf8", "b64Payload", "trimmed", "binary", "bytes", "i", "decodeCashieJsonDataUriToUtf8", "dataUri", "CASHIE_JSON_DATA_URI_BASE64_PREFIX", "b64", "decodeCashieSvgDataUriToUtf8", "CASHIE_SVG_DATA_URI_BASE64_PREFIX", "parseCashieJsonDataUriJson", "text", "parseCashieIdentitySoulTokenMetadata", "json", "cashieIdentitySoulTokenMetadataJsonSchema", "parseCashieReceiptBadgeMetadata", "cashieReceiptBadgeMetadataSchema", "parseCashieReceiptBadgeMetadataFromBadgeUri", "badgeUri", "metadataFormatFromContract", "CASHIE_RECEIPT_BADGE_METADATA_FORMAT", "parseCashiePaymentRecordBadgeMetadata", "cashiePaymentRecordBadgeMetadataSchema", "parseCashiePaymentRecordBadgeMetadataFromBadgeUri", "CASHIE_PAYMENT_RECORD_BADGE_METADATA_FORMAT", "isCashieMetadataJsonObject", "parseCashieMetadataJson", "parseCashieMetadataDataUri", "createPublicClient", "http", "toHex", "sepolia", "localhost", "anvil", "z", "isAddress", "isHex", "z", "z", "billingPeriodSchema", "z", "paymentDetailsTypeSchema", "rewardItemSchema", "addressSchema", "hexSchema", "basePaymentDetailsDataSchema", "singlePaymentDetailsSchema", "recurringPaymentDetailsSchema", "paymentDetailsSchema", "erc20TokenPaymentPermissionSchema", "baseScopeSchema", "permissionSchema", "permissionSchemas", "parseBillingPeriod", "value", "parseWithSchema", "parsePaymentDetailsType", "parseBasePaymentDetailsData", "parsePaymentDetails", "parseERC20TokenPaymentPermission", "parsePermission", "initCodeDataSchema", "z", "addressSchema", "hexSchema", "permissionRequestSchema", "permissionSchema", "ruleSchema", "permissionsRequestSchema", "permissionResponseSchema", "permissionsResponseSchema", "getPermissionsInfoResultParamsSchema", "supportedExecutionPermissionInfoSchema", "getSupportedExecutionPermissionsResultSchema", "parseInitCodeData", "value", "parseWithSchema", "parsePermissionRequest", "parsePermissionsRequest", "parsePermissionResponse", "parsePermissionsResponse", "parseGetPermissionsInfoResultParams", "parseGetSupportedExecutionPermissionsResult", "CashieRouterActions", "addressSchema", "z", "val", "isAddress", "hexSchema", "isHex", "burnAuthSchema", "BurnAuth", "routerCallSchema", "badgeOwnerSchema", "identitySoulDiscoverySchema", "prePaymentSetupSchema", "identityMintSignPayloadWithSignatureSchema", "initCodeDataSchema", "rewardItemSchema", "rewardIntentDetailsSchema", "paymentIntentSchema", "CashieRouterActions", "value", "paymentIntentTrackingEntrySchema", "paymentRpcReturnSchemas", "PaymentRpcResponseValidationError", "method", "zodError", "details", "issue", "path", "parsePaymentRpcReturn", "result", "parsed", "createPaymentRpcClient", "args", "getSupportedChains", "sepolia", "localhost", "anvil", "assertChainId", "chainIdToValidate", "chainIdHex", "toHex", "chain", "url", "chainId", "paymentRpcClient", "createPublicClient", "http", "assertUrl", "request", "method", "params", "result", "parsePaymentRpcReturn", "SoulManager", "#identitySoulContract", "#paymentRecordBadgeContract", "#receiptBadgeContract", "#receiptBadgeMetadataFormat", "#paymentRecordBadgeMetadataFormat", "#paymentRpcClient", "#chainHex", "#cashieReceiptBadgeMetadataCache", "#cashiePaymentRecordBadgeMetadataCache", "#identityIssuer", "args", "identityIssuer", "cashieRpcUrl", "chainIdHex", "createPaymentRpcClient", "fromHex", "#assertInitialized", "supportedSouls", "receiptBadgeMetadataFormat", "paymentRecordBadgeMetadataFormat", "request", "account", "issuedIdentityProofResponse", "identityType", "domain", "burnAuth", "identityCommitment", "proof", "tokenId", "identityTokenIdFor", "tokenIdHex", "toHex", "tokenURI", "data", "parseCashieIdentitySoulTokenMetadata", "decodedImageSvg", "decodeCashieSvgDataUriToUtf8", "badgeId", "cachedMetadata", "badgeURI", "parseCashieReceiptBadgeMetadataFromBadgeUri", "parseCashiePaymentRecordBadgeMetadataFromBadgeUri", "encodeAbiParameters", "keccak256", "zeroAddress", "OFF_CHAIN_PAYMENT_INTENT_ABI_PARAMS", "encodePaymentIntent", "paymentIntent", "rewardIntentDetails", "rewardItem", "getPaymentIntentHash", "CASHIE_ROUTER_V1_CONTRACT_ABI", "CASHIE_ROUTER_GUARD_CONTRACT_ABI", "CASHIE_IDENTITY_SOUL_CONTRACT_ABI", "CASHIE_RECEIPT_BADGE_CONTRACT_ABI", "CASHIE_PAYMENT_RECORD_BADGE_CONTRACT_ABI", "toHex", "findTransactionHashForBadgeId", "props", "badgeId", "badgeKind", "identityContract", "paymentIntentTrackingEntries", "confirmedPaymentIntentTrackingEntries", "paymentIntentTrackingEntry", "toHex", "receiptBadgeIdFromPaymentIntent", "ReceiptType", "paymentRecordBadgeIdFromPaymentIntent", "keccak256", "canonicalize", "value", "a", "b", "sa", "sb", "obj", "keys", "out", "k", "canonicalOcapPayload", "capability", "buildOcapId", "canonical", "bytes", "OcapValidationError", "message", "validateApiResource", "r", "allowedAudiences", "validateAndBuildOcap", "params", "resources", "api", "ocap", "ocapId", "DEFAULT_MAX_AGE_MS", "OCAP_STATEMENT_PREFIX", "prepareStatement", "smartAccountAddress", "resources", "ocapId", "buildOcapId", "OcapAudiences", "EIP1193_ERROR_CODES", "EIP5792_ERROR_CODES", "ERC7715_ERROR_CODES", "FATAL_ERROR_CODES", "COMMON_ERROR_CODES", "ERROR_CODES_MAP", "getErrorMessage", "code", "details", "RpcError", "message", "data", "Either", "value", "str", "onLeft", "onRight", "Right", "Left", "_", "defaultValue", "f", "isEither", "PROTOCOL_RPC_PROXY_PATH", "CashieAccountType", "CASHIE_ACCOUNT_TYPE_LABELS"]
7
+ }