{"_id":"@cascade-fyi/splits-sdk-evm","_rev":"4-255c2dc691aaac9917f64581b57ecd44","name":"@cascade-fyi/splits-sdk-evm","dist-tags":{"latest":"0.1.3"},"versions":{"0.1.0":{"name":"@cascade-fyi/splits-sdk-evm","version":"0.1.0","keywords":["ethereum","evm","base","payments","splitting","payment-splitter","cascade-splits","defi","web3","viem"],"author":{"name":"Cascade","email":"hello@cascade.fyi"},"license":"Apache-2.0","_id":"@cascade-fyi/splits-sdk-evm@0.1.0","maintainers":[{"name":"tenequm","email":"tenequm@gmail.com"}],"homepage":"https://github.com/cascade-protocol/splits#readme","bugs":{"url":"https://github.com/cascade-protocol/splits/issues"},"dist":{"shasum":"743cc170b80e57b6ff2fab426482017c65ef4f07","tarball":"https://registry.npmjs.org/@cascade-fyi/splits-sdk-evm/-/splits-sdk-evm-0.1.0.tgz","fileCount":23,"integrity":"sha512-b+Tb29SMDdJ5HNsPfWdHjgZxHYml7NQ7f5qVvA+UI6kz/REyW/1THt0Pq7I3gBOnjjYSzq5/evIIn5nP6TRMiw==","signatures":[{"sig":"MEUCIAvHMiFBQ6mcbkKEMhXsuod0Jz5jJBqBexJ2NDSiQ8sSAiEAuLIZGGT/LxqrUbq2My9zgDDw2taSHB00TrGGTsPlurY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":176821},"main":"./dist/index.cjs","type":"module","_from":"file:cascade-fyi-splits-sdk-evm-0.1.0.tgz","types":"./dist/index.d.cts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./client":{"import":{"types":"./dist/client/index.d.mts","default":"./dist/client/index.mjs"},"require":{"types":"./dist/client/index.d.cts","default":"./dist/client/index.cjs"}},"./package.json":"./package.json"},"scripts":{"dev":"tsdown --watch","test":"vitest run","build":"tsdown","check":"pnpm type-check && biome check --write","clean":"rm -rf dist","test:watch":"vitest","type-check":"tsc --noEmit"},"_npmUser":{"name":"tenequm","email":"tenequm@gmail.com"},"_resolved":"/private/var/folders/bt/9pzbvwhj1hb18j2m17f9bp6h0000gn/T/d44aa6854510364155f62febef9aa3b3/cascade-fyi-splits-sdk-evm-0.1.0.tgz","_integrity":"sha512-b+Tb29SMDdJ5HNsPfWdHjgZxHYml7NQ7f5qVvA+UI6kz/REyW/1THt0Pq7I3gBOnjjYSzq5/evIIn5nP6TRMiw==","repository":{"url":"git+https://github.com/cascade-protocol/splits.git","type":"git"},"_npmVersion":"11.6.1","description":"TypeScript SDK for Cascade Splits on EVM chains (Base)","directories":{},"sideEffects":false,"_nodeVersion":"24.10.0","dependencies":{"viem":"^2.41.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsdown":"^0.16.6","vitest":"^4.0.12","typescript":"^5.9.3"},"_npmOperationalInternal":{"tmp":"tmp/splits-sdk-evm_0.1.0_1764782444681_0.5005968869102213","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@cascade-fyi/splits-sdk-evm","version":"0.1.1","keywords":["ethereum","evm","base","payments","splitting","payment-splitter","cascade-splits","defi","web3","viem"],"author":{"name":"Cascade","email":"hello@cascade.fyi"},"license":"Apache-2.0","_id":"@cascade-fyi/splits-sdk-evm@0.1.1","maintainers":[{"name":"tenequm","email":"tenequm@gmail.com"}],"homepage":"https://github.com/cascade-protocol/splits#readme","bugs":{"url":"https://github.com/cascade-protocol/splits/issues"},"dist":{"shasum":"8246dd79fb3089144c2389339969a45c60da1cbc","tarball":"https://registry.npmjs.org/@cascade-fyi/splits-sdk-evm/-/splits-sdk-evm-0.1.1.tgz","fileCount":23,"integrity":"sha512-EuWNMdm+6CBohXICuhoEzPdpv1llkNKSjXrQo0T8G/fLkwhAw9sS8oyVm1hZSL53GJiu8gc4uPwqZuFOQ0WQAg==","signatures":[{"sig":"MEUCIC9CDpuu2APLas3nQ9LxQUaIEqd8j4UUteJTh2UJeK97AiEAhZYWSukJQjYvSllAYJHPRBRlAL2+iOqsNg5Mme/ZtBo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":176828},"main":"./dist/index.cjs","type":"module","_from":"file:cascade-fyi-splits-sdk-evm-0.1.1.tgz","types":"./dist/index.d.cts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./client":{"import":{"types":"./dist/client/index.d.mts","default":"./dist/client/index.mjs"},"require":{"types":"./dist/client/index.d.cts","default":"./dist/client/index.cjs"}},"./package.json":"./package.json"},"scripts":{"dev":"tsdown --watch","test":"vitest run","build":"tsdown","check":"pnpm type-check && biome check --write","clean":"rm -rf dist","test:watch":"vitest","type-check":"tsc --noEmit"},"_npmUser":{"name":"tenequm","email":"tenequm@gmail.com"},"_resolved":"/private/var/folders/bt/9pzbvwhj1hb18j2m17f9bp6h0000gn/T/5d4f9a5b44c365c8a7adf1c719bc75c4/cascade-fyi-splits-sdk-evm-0.1.1.tgz","_integrity":"sha512-EuWNMdm+6CBohXICuhoEzPdpv1llkNKSjXrQo0T8G/fLkwhAw9sS8oyVm1hZSL53GJiu8gc4uPwqZuFOQ0WQAg==","repository":{"url":"git+https://github.com/cascade-protocol/splits.git","type":"git"},"_npmVersion":"11.6.1","description":"TypeScript SDK for Cascade Splits on EVM chains (Base)","directories":{},"sideEffects":false,"_nodeVersion":"24.10.0","dependencies":{"viem":"^2.41.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsdown":"^0.16.6","vitest":"^4.0.12","typescript":"^5.9.3"},"_npmOperationalInternal":{"tmp":"tmp/splits-sdk-evm_0.1.1_1764938374605_0.9708695051835647","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@cascade-fyi/splits-sdk-evm","version":"0.1.2","keywords":["ethereum","evm","base","payments","splitting","payment-splitter","cascade-splits","defi","web3","viem"],"author":{"name":"Cascade","email":"hello@cascade.fyi"},"license":"Apache-2.0","_id":"@cascade-fyi/splits-sdk-evm@0.1.2","maintainers":[{"name":"tenequm","email":"tenequm@gmail.com"}],"homepage":"https://github.com/cascade-protocol/splits#readme","bugs":{"url":"https://github.com/cascade-protocol/splits/issues"},"dist":{"shasum":"ccf48536c01c0c9dae99e3cd4e90e1d2aa92b7ad","tarball":"https://registry.npmjs.org/@cascade-fyi/splits-sdk-evm/-/splits-sdk-evm-0.1.2.tgz","fileCount":23,"integrity":"sha512-4o4A1GCdjq0ehGyyMuvlJsWtqAtxu/JtMa8uMf1YTC8wo9VtJjq7LC621JP6vLbvEsopMf2+04Rg03eazfu8UQ==","signatures":[{"sig":"MEYCIQD6XmvEVwysdn15Sj02/0STacOgKyMEmLEKtOhpVSYP/gIhAM4UwXMBXS1gjdoklBqKCbcclRY7OalsyjVaCjIWRkOh","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":179645},"main":"./dist/index.cjs","type":"module","_from":"file:cascade-fyi-splits-sdk-evm-0.1.2.tgz","types":"./dist/index.d.cts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./client":{"import":{"types":"./dist/client/index.d.mts","default":"./dist/client/index.mjs"},"require":{"types":"./dist/client/index.d.cts","default":"./dist/client/index.cjs"}},"./package.json":"./package.json"},"scripts":{"dev":"tsdown --watch","test":"vitest run","build":"tsdown","check":"pnpm type-check && biome check --write","clean":"rm -rf dist","test:watch":"vitest","type-check":"tsc --noEmit"},"_npmUser":{"name":"tenequm","email":"tenequm@gmail.com"},"_resolved":"/private/var/folders/bt/9pzbvwhj1hb18j2m17f9bp6h0000gn/T/855ce29b0263fe99d72ba717aa414307/cascade-fyi-splits-sdk-evm-0.1.2.tgz","_integrity":"sha512-4o4A1GCdjq0ehGyyMuvlJsWtqAtxu/JtMa8uMf1YTC8wo9VtJjq7LC621JP6vLbvEsopMf2+04Rg03eazfu8UQ==","repository":{"url":"git+https://github.com/cascade-protocol/splits.git","type":"git"},"_npmVersion":"11.6.1","description":"TypeScript SDK for Cascade Splits on EVM chains (Base)","directories":{},"sideEffects":false,"_nodeVersion":"24.10.0","dependencies":{"viem":"^2.41.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsdown":"^0.16.6","vitest":"^4.0.12","typescript":"^5.9.3"},"_npmOperationalInternal":{"tmp":"tmp/splits-sdk-evm_0.1.2_1765050679802_0.14442091886884656","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@cascade-fyi/splits-sdk-evm","version":"0.1.3","type":"module","description":"TypeScript SDK for Cascade Splits on EVM chains (Base)","dependencies":{"viem":"^2.41.2"},"devDependencies":{"tsdown":"^0.16.6","typescript":"^5.9.3","vitest":"^4.0.12"},"main":"./dist/index.cjs","module":"./dist/index.mjs","types":"./dist/index.d.cts","sideEffects":false,"exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./client":{"import":{"types":"./dist/client/index.d.mts","default":"./dist/client/index.mjs"},"require":{"types":"./dist/client/index.d.cts","default":"./dist/client/index.cjs"}},"./package.json":"./package.json"},"keywords":["ethereum","evm","base","payments","splitting","payment-splitter","cascade-splits","defi","web3","viem"],"author":{"name":"Cascade","email":"hello@cascade.fyi"},"license":"Apache-2.0","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/cascade-protocol/splits.git"},"bugs":{"url":"https://github.com/cascade-protocol/splits/issues"},"homepage":"https://github.com/cascade-protocol/splits#readme","scripts":{"build":"tsdown","dev":"tsdown --watch","type-check":"tsc --noEmit","check":"pnpm type-check && biome check --write","clean":"rm -rf dist","test":"vitest run","test:watch":"vitest"},"_id":"@cascade-fyi/splits-sdk-evm@0.1.3","_integrity":"sha512-tQw5+n+pDbWHMcSR3R7x8wQakApqME3mL2IR9FX6uCthpf2inW2cgBrDIp4D1J6cJoZ+umyQXSRjVxZOjl3Amg==","_resolved":"/private/var/folders/bt/9pzbvwhj1hb18j2m17f9bp6h0000gn/T/5d2d2bc94a641a9b3b3bef0af4e0b18a/cascade-fyi-splits-sdk-evm-0.1.3.tgz","_from":"file:cascade-fyi-splits-sdk-evm-0.1.3.tgz","_nodeVersion":"24.10.0","_npmVersion":"11.6.1","dist":{"integrity":"sha512-tQw5+n+pDbWHMcSR3R7x8wQakApqME3mL2IR9FX6uCthpf2inW2cgBrDIp4D1J6cJoZ+umyQXSRjVxZOjl3Amg==","shasum":"10f7f569bb99ce782f6c215f9edb6ab1a5c9170f","tarball":"https://registry.npmjs.org/@cascade-fyi/splits-sdk-evm/-/splits-sdk-evm-0.1.3.tgz","fileCount":23,"unpackedSize":179650,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIQCmlm30UMbY+FjvqODG+3ktNzRZL3Z8CDqWDNxqjSPwMgIfVhpMSGrKsgALBAhf+ZCjTl7whxOkou3KinJJsZRphA=="}]},"_npmUser":{"name":"tenequm","email":"tenequm@gmail.com"},"directories":{},"maintainers":[{"name":"tenequm","email":"tenequm@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/splits-sdk-evm_0.1.3_1765317689086_0.24979781189343742"},"_hasShrinkwrap":false}},"time":{"created":"2025-12-03T17:20:44.475Z","modified":"2025-12-09T22:01:29.549Z","0.1.0":"2025-12-03T17:20:44.870Z","0.1.1":"2025-12-05T12:39:34.759Z","0.1.2":"2025-12-06T19:51:19.957Z","0.1.3":"2025-12-09T22:01:29.256Z"},"bugs":{"url":"https://github.com/cascade-protocol/splits/issues"},"author":{"name":"Cascade","email":"hello@cascade.fyi"},"license":"Apache-2.0","homepage":"https://github.com/cascade-protocol/splits#readme","keywords":["ethereum","evm","base","payments","splitting","payment-splitter","cascade-splits","defi","web3","viem"],"repository":{"type":"git","url":"git+https://github.com/cascade-protocol/splits.git"},"description":"TypeScript SDK for Cascade Splits on EVM chains (Base)","maintainers":[{"name":"tenequm","email":"tenequm@gmail.com"}],"readme":"# @cascade-fyi/splits-sdk-evm\n\nTypeScript SDK for [Cascade Splits](https://github.com/cascade-protocol/splits) on EVM chains (Base).\n\nSplit incoming payments to multiple recipients automatically. Built for high-throughput micropayments.\n\n**Factory Address:** `0x946Cd053514b1Ab7829dD8fEc85E0ade5550dcf7` (Base Mainnet & Sepolia)\n\n## Installation\n\n```bash\nnpm install @cascade-fyi/splits-sdk-evm viem\n```\n\n**Requirements:**\n- `viem` ^2.41.2\n\n## Quick Start\n\n### Create a Split\n\n```typescript\nimport { createEvmSplitsClient } from \"@cascade-fyi/splits-sdk-evm/client\";\nimport { base } from \"viem/chains\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport type { Hash } from \"viem\";\n\nconst client = createEvmSplitsClient(base, {\n  account: privateKeyToAccount(\"0x...\"),\n});\n\n// Generate a unique ID (or use a deterministic one for idempotency)\nconst uniqueId = `0x${crypto.randomUUID().replace(/-/g, \"\").padStart(64, \"0\")}` as Hash;\n\nconst result = await client.ensureSplit({\n  uniqueId,\n  recipients: [\n    { address: \"0xAlice...\", share: 60 },\n    { address: \"0xBob...\", share: 40 },\n  ],\n});\n\n// Handle all possible outcomes\nswitch (result.status) {\n  case \"CREATED\":\n    console.log(`Split created at ${result.split}`);\n    console.log(`Transaction: ${result.signature}`);\n    break;\n  case \"NO_CHANGE\":\n    console.log(`Already exists at ${result.split}`);\n    break;\n  case \"FAILED\":\n    console.log(`Failed: ${result.message}`);\n    break;\n}\n```\n\n### Execute a Split\n\n```typescript\nconst execResult = await client.execute(splitAddress);\n\nif (execResult.status === \"EXECUTED\") {\n  console.log(`Distributed in tx ${execResult.signature}`);\n} else if (execResult.status === \"SKIPPED\") {\n  console.log(`Skipped: ${execResult.reason}`);\n}\n```\n\n### Low-Level Functions\n\n```typescript\nimport { createPublicClient, createWalletClient, http } from \"viem\";\nimport { base } from \"viem/chains\";\nimport { ensureSplit, executeSplit, isCascadeSplit } from \"@cascade-fyi/splits-sdk-evm\";\n\nconst publicClient = createPublicClient({ chain: base, transport: http() });\nconst walletClient = createWalletClient({ chain: base, transport: http(), account });\n\n// Check if address is a split\nif (await isCascadeSplit(publicClient, address)) {\n  // Execute distribution\n  const result = await executeSplit(publicClient, walletClient, address);\n}\n```\n\n## Key Concepts\n\n### 100-Share Model\n\nRecipients specify shares from 1-100 that must total exactly 100. Protocol takes 1% fee during distribution.\n\n```typescript\n{ address: \"0xAlice...\", share: 60 }  // 60% of 99% = 59.4%\n{ address: \"0xBob...\", share: 40 }    // 40% of 99% = 39.6%\n// Protocol receives 1%\n```\n\n### Discriminated Union Results\n\nAll operations return typed results with `status` discriminant:\n\n```typescript\n// ensureSplit\nconst result = await client.ensureSplit({ uniqueId, recipients });\n\nswitch (result.status) {\n  case \"CREATED\":   // result.split, result.signature\n  case \"NO_CHANGE\": // result.split (already exists)\n  case \"FAILED\":    // result.reason, result.message, result.error?\n}\n\n// executeSplit\nconst execResult = await client.execute(splitAddress);\n\nswitch (execResult.status) {\n  case \"EXECUTED\":  // execResult.signature\n  case \"SKIPPED\":   // execResult.reason\n  case \"FAILED\":    // execResult.reason, execResult.message\n}\n```\n\n**Failed reasons:** `wallet_rejected`, `wallet_disconnected`, `network_error`, `transaction_failed`, `transaction_reverted`, `insufficient_gas`\n\n**Skipped reasons:** `not_found`, `not_a_split`, `below_threshold`, `no_pending_funds`\n\n### Immutable Splits\n\nUnlike Solana, EVM splits are **immutable** — recipients cannot be changed after creation. Create a new split with a different `uniqueId` if you need different recipients.\n\n## API Reference\n\n### Client Factory (`/client`)\n\n```typescript\nimport {\n  createEvmSplitsClient,\n  type EvmSplitsClient,\n  type EvmSplitsClientConfig,\n  type WalletConfig,\n} from \"@cascade-fyi/splits-sdk-evm/client\";\n\nconst client = createEvmSplitsClient(chain, { account, transport? }, { factoryAddress? });\n\n// Properties\nclient.address      // Wallet address\nclient.chain        // Connected chain\nclient.factoryAddress  // Factory contract address\n\n// Methods\nawait client.ensureSplit({ uniqueId, recipients, authority?, token? })\nawait client.execute(splitAddress, { minBalance? })\nawait client.getSplit(splitAddress)\nawait client.getBalance(splitAddress)\nawait client.isCascadeSplit(address)\nawait client.previewExecution(splitAddress)\nawait client.predictSplitAddress({ uniqueId, recipients, authority?, token? })\n```\n\n### Core Functions (`/`)\n\n```typescript\nimport {\n  // Core operations\n  ensureSplit,\n  executeSplit,\n\n  // Read functions\n  isCascadeSplit,\n  getSplitConfig,\n  getSplitBalance,\n  predictSplitAddress,\n  previewExecution,\n  hasPendingFunds,\n  getPendingAmount,\n  getTotalUnclaimed,\n\n  // Helpers\n  getDefaultToken,           // Get USDC address for a chain\n  toEvmRecipient,\n  toEvmRecipients,\n} from \"@cascade-fyi/splits-sdk-evm\";\n\n// Create split (idempotent)\nconst result = await ensureSplit(publicClient, walletClient, factoryAddress, {\n  uniqueId: \"0x...\",\n  recipients: [{ address: \"0x...\", share: 100 }],\n  authority?,  // Default: wallet address\n  token?,      // Default: USDC\n});\n\n// Execute distribution\nconst result = await executeSplit(publicClient, walletClient, splitAddress, {\n  minBalance?: 1_000_000n,  // Skip if below 1 USDC\n});\n\n// Read operations\nconst config = await getSplitConfig(publicClient, splitAddress);\nconst balance = await getSplitBalance(publicClient, splitAddress);\nconst isSplit = await isCascadeSplit(publicClient, address);\nconst preview = await previewExecution(publicClient, splitAddress);\n```\n\n### Address Helpers\n\n```typescript\nimport {\n  getSplitFactoryAddress,\n  getUsdcAddress,\n  isSupportedChain,\n  SPLIT_FACTORY_ADDRESSES,\n  USDC_ADDRESSES,\n  SUPPORTED_CHAIN_IDS,\n} from \"@cascade-fyi/splits-sdk-evm\";\n\nconst factory = getSplitFactoryAddress(8453);  // Base mainnet\nconst usdc = getUsdcAddress(8453);\nconst supported = isSupportedChain(8453);  // true\n```\n\n### Recipient Conversion\n\n```typescript\nimport { toEvmRecipient, toEvmRecipients } from \"@cascade-fyi/splits-sdk-evm\";\n\n// Convert share (1-100) to basis points\nconst recipient = toEvmRecipient({ address: \"0x...\", share: 50 });\n// { addr: \"0x...\", percentageBps: 4950 }\n\n// Or use percentageBps directly\nconst recipient = toEvmRecipient({ address: \"0x...\", percentageBps: 4950 });\n```\n\n### ABI Exports\n\n```typescript\nimport { splitFactoryAbi, splitConfigImplAbi } from \"@cascade-fyi/splits-sdk-evm\";\n\n// Use with viem's getContract\nconst factory = getContract({\n  address: factoryAddress,\n  abi: splitFactoryAbi,\n  client: publicClient,\n});\n```\n\n## Types\n\n```typescript\nimport type {\n  EvmRecipient,\n  EvmRecipientInput,\n  EvmSplitConfig,\n  EvmExecutionPreview,\n  EvmEnsureResult,\n  EvmExecuteResult,\n  EvmEnsureParams,\n  EvmExecuteOptions,\n  EvmEnsureStatus,\n  EvmExecuteStatus,\n  EvmFailedReason,\n  EvmSkippedReason,\n  SupportedChainId,\n} from \"@cascade-fyi/splits-sdk-evm\";\n```\n\n## Supported Chains\n\n| Chain | Chain ID | Factory | USDC |\n|-------|----------|---------|------|\n| Base Mainnet | 8453 | `0x946Cd053514b1Ab7829dD8fEc85E0ade5550dcf7` | `0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913` |\n| Base Sepolia | 84532 | `0x946Cd053514b1Ab7829dD8fEc85E0ade5550dcf7` | `0x036CbD53842c5426634e7929541eC2318f3dCF7e` |\n\n## React Integration (Wagmi)\n\nFor React apps with Wagmi, use the ABIs directly with wagmi hooks:\n\n```typescript\nimport { useWriteContract, useReadContracts } from \"wagmi\";\nimport {\n  splitFactoryAbi,\n  splitConfigImplAbi,\n  getSplitFactoryAddress,\n  getUsdcAddress,\n  toEvmRecipients,\n} from \"@cascade-fyi/splits-sdk-evm\";\nimport { base } from \"wagmi/chains\";\n\nconst FACTORY = getSplitFactoryAddress(base.id);\nconst USDC = getUsdcAddress(base.id);\n\nfunction useCreateSplit() {\n  const { writeContractAsync } = useWriteContract();\n\n  return async (recipients: Array<{ address: `0x${string}`; share: number }>) => {\n    const uniqueId = `0x${crypto.randomUUID().replace(/-/g, \"\").padStart(64, \"0\")}` as `0x${string}`;\n    const evmRecipients = toEvmRecipients(recipients);\n\n    return writeContractAsync({\n      address: FACTORY,\n      abi: splitFactoryAbi,\n      functionName: \"createSplitConfig\",\n      args: [authority, USDC, uniqueId, evmRecipients],\n      chainId: base.id,\n    });\n  };\n}\n```\n\n## Split Discovery\n\nTo discover splits owned by an address, use Goldsky subgraph:\n\n```typescript\nconst GOLDSKY_URL = \"https://api.goldsky.com/api/public/project_cmiq5kvoq64hs01wh0ydoesqs/subgraphs/cascade-splits-base/1.0.0/gn\";\n\nasync function getSplitsForAuthority(authority: string) {\n  const response = await fetch(GOLDSKY_URL, {\n    method: \"POST\",\n    headers: { \"Content-Type\": \"application/json\" },\n    body: JSON.stringify({\n      query: `{\n        splitConfigCreateds(\n          where: { authority: \"${authority.toLowerCase()}\" }\n          orderBy: block_number\n          orderDirection: desc\n        ) {\n          split\n          block_number\n        }\n      }`,\n    }),\n  });\n\n  const { data } = await response.json();\n  return data.splitConfigCreateds.map((e: any) => e.split);\n}\n```\n\n## Resources\n\n- **Specification:** [docs/specification-evm.md](https://github.com/cascade-protocol/splits/blob/main/docs/specification-evm.md)\n- **Changelog:** [CHANGELOG.md](https://github.com/cascade-protocol/splits/blob/main/packages/splits-sdk-evm/CHANGELOG.md)\n- **Solana SDK:** [@cascade-fyi/splits-sdk](https://www.npmjs.com/package/@cascade-fyi/splits-sdk)\n- **Issues:** [GitHub Issues](https://github.com/cascade-protocol/splits/issues)\n- **Contact:** hello@cascade.fyi\n\n## License\n\nApache-2.0\n","readmeFilename":"README.md"}