pepay-streams-sdk 0.1.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 (62) hide show
  1. package/README.md +405 -0
  2. package/dist/api/index.d.mts +321 -0
  3. package/dist/api/index.d.ts +321 -0
  4. package/dist/api/index.js +312 -0
  5. package/dist/api/index.js.map +1 -0
  6. package/dist/api/index.mjs +306 -0
  7. package/dist/api/index.mjs.map +1 -0
  8. package/dist/automation/index.d.mts +140 -0
  9. package/dist/automation/index.d.ts +140 -0
  10. package/dist/automation/index.js +331 -0
  11. package/dist/automation/index.js.map +1 -0
  12. package/dist/automation/index.mjs +326 -0
  13. package/dist/automation/index.mjs.map +1 -0
  14. package/dist/campaigns/index.d.mts +286 -0
  15. package/dist/campaigns/index.d.ts +286 -0
  16. package/dist/campaigns/index.js +652 -0
  17. package/dist/campaigns/index.js.map +1 -0
  18. package/dist/campaigns/index.mjs +645 -0
  19. package/dist/campaigns/index.mjs.map +1 -0
  20. package/dist/claims/index.d.mts +190 -0
  21. package/dist/claims/index.d.ts +190 -0
  22. package/dist/claims/index.js +414 -0
  23. package/dist/claims/index.js.map +1 -0
  24. package/dist/claims/index.mjs +409 -0
  25. package/dist/claims/index.mjs.map +1 -0
  26. package/dist/index-BTG0TRJt.d.mts +555 -0
  27. package/dist/index-BTG0TRJt.d.ts +555 -0
  28. package/dist/index.d.mts +170 -0
  29. package/dist/index.d.ts +170 -0
  30. package/dist/index.js +2926 -0
  31. package/dist/index.js.map +1 -0
  32. package/dist/index.mjs +2888 -0
  33. package/dist/index.mjs.map +1 -0
  34. package/dist/marketplace/index.d.mts +225 -0
  35. package/dist/marketplace/index.d.ts +225 -0
  36. package/dist/marketplace/index.js +529 -0
  37. package/dist/marketplace/index.js.map +1 -0
  38. package/dist/marketplace/index.mjs +524 -0
  39. package/dist/marketplace/index.mjs.map +1 -0
  40. package/dist/react/index.d.mts +185 -0
  41. package/dist/react/index.d.ts +185 -0
  42. package/dist/react/index.js +340 -0
  43. package/dist/react/index.js.map +1 -0
  44. package/dist/react/index.mjs +333 -0
  45. package/dist/react/index.mjs.map +1 -0
  46. package/dist/staking/index.d.mts +158 -0
  47. package/dist/staking/index.d.ts +158 -0
  48. package/dist/staking/index.js +359 -0
  49. package/dist/staking/index.js.map +1 -0
  50. package/dist/staking/index.mjs +354 -0
  51. package/dist/staking/index.mjs.map +1 -0
  52. package/package.json +106 -0
  53. package/src/api/index.ts +577 -0
  54. package/src/automation/index.ts +436 -0
  55. package/src/campaigns/index.ts +835 -0
  56. package/src/claims/index.ts +530 -0
  57. package/src/client.ts +518 -0
  58. package/src/index.ts +101 -0
  59. package/src/marketplace/index.ts +730 -0
  60. package/src/react/index.ts +498 -0
  61. package/src/staking/index.ts +449 -0
  62. package/src/types/index.ts +631 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/campaigns/index.ts","../src/claims/index.ts","../src/staking/index.ts","../src/marketplace/index.ts","../src/automation/index.ts","../src/api/index.ts","../src/client.ts"],"names":["zeroAddress","DIAMOND_ABI","keccak256","encodePacked","createPublicClient","http","custom","createWalletClient","erc20Abi"],"mappings":"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","file":"index.js","sourcesContent":["/**\r\n * Campaign Creation Module\r\n *\r\n * Provides methods for creating all campaign types:\r\n * - Instant Airdrops (Kind.INSTANT = 0)\r\n * - Vested Airdrops (Kind.VESTED = 1)\r\n * - Token Locks (Kind.LOCK = 2)\r\n * - Vesting Streams (Kind.VESTING = 3)\r\n */\r\nimport {\r\n type PublicClient,\r\n type WalletClient,\r\n type Address,\r\n type Hash,\r\n type Hex,\r\n zeroAddress,\r\n} from 'viem';\r\nimport { DIAMOND_ABI } from '@pepay-streams/abi/diamond';\r\nimport type {\r\n InstantAirdropParams,\r\n VestedAirdropParams,\r\n LockParams,\r\n VestingParams,\r\n CampaignInfo,\r\n TransactionResult,\r\n} from '../types';\r\n\r\n/**\r\n * Campaign Kind enum matching the contract\r\n */\r\nexport enum CampaignKind {\r\n INSTANT = 0,\r\n VESTED = 1,\r\n LOCK = 2,\r\n VESTING = 3,\r\n}\r\n\r\n/**\r\n * Change policy enum matching the contract\r\n */\r\nexport enum ChangePolicy {\r\n ONLY_RECIPIENT = 0,\r\n ONLY_CREATOR = 1,\r\n BOTH = 2,\r\n NO_ONE = 3,\r\n}\r\n\r\n/**\r\n * CreateArgs struct matching the contract\r\n */\r\ninterface CreateArgs {\r\n kind: number;\r\n token: Address;\r\n start: bigint;\r\n end: bigint;\r\n step: bigint;\r\n cliffReleaseTime: bigint;\r\n cliffBps: number;\r\n autoClaimIncentiveBps: number;\r\n cancelable: boolean;\r\n claimOnce: boolean;\r\n changePolicy: number;\r\n claimGrace: bigint;\r\n recipients: Address[];\r\n amounts: bigint[];\r\n feeBuffer: bigint;\r\n attachDefaultRegistry: boolean;\r\n unwrapWETH: boolean;\r\n weth: Address;\r\n}\r\n\r\n/**\r\n * Campaigns module for creating and managing token distribution campaigns\r\n */\r\nexport class CampaignsModule {\r\n constructor(\r\n private readonly publicClient: PublicClient,\r\n private readonly walletClient: WalletClient | undefined,\r\n private readonly diamondAddress: Address\r\n ) {}\r\n\r\n // ============================================================================\r\n // Campaign Creation\r\n // ============================================================================\r\n\r\n /**\r\n * Create an Instant Airdrop campaign\r\n *\r\n * Tokens are immediately claimable by recipients after funding.\r\n *\r\n * @example\r\n * ```typescript\r\n * const result = await sdk.campaigns.createInstantAirdrop({\r\n * token: '0x...',\r\n * recipients: [\r\n * { address: '0x...', amount: parseEther('100') },\r\n * { address: '0x...', amount: parseEther('50') },\r\n * ],\r\n * });\r\n * console.log('Campaign created, tx:', result.hash);\r\n * ```\r\n */\r\n async createInstantAirdrop(\r\n params: InstantAirdropParams\r\n ): Promise<TransactionResult> {\r\n const wallet = this.requireWallet();\r\n\r\n const recipients = params.recipients.map((r) => r.address);\r\n const amounts = params.recipients.map((r) => r.amount);\r\n\r\n const now = BigInt(Math.floor(Date.now() / 1000));\r\n const args: CreateArgs = {\r\n kind: CampaignKind.INSTANT,\r\n token: params.token,\r\n start: now,\r\n end: now, // Instant airdrop - same start/end\r\n step: 0n,\r\n cliffReleaseTime: 0n,\r\n cliffBps: 0,\r\n autoClaimIncentiveBps: params.autoClaimIncentiveBps ?? 0,\r\n cancelable: params.cancelable ?? true,\r\n claimOnce: params.claimOnce ?? true,\r\n changePolicy: this.changePolicyToEnum(params.changePolicy),\r\n claimGrace: BigInt(params.claimGrace ?? 0),\r\n recipients,\r\n amounts,\r\n feeBuffer: params.feeBuffer ?? 0n,\r\n attachDefaultRegistry: params.attachDefaultRegistry ?? false,\r\n unwrapWETH: params.unwrapWETH ?? false,\r\n weth: params.weth ?? zeroAddress,\r\n };\r\n\r\n const hash = await wallet.writeContract({\r\n chain: wallet.chain,\r\n account: wallet.account!,\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'createCampaign',\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n args: [args] as any,\r\n });\r\n\r\n return this.createTransactionResult(hash);\r\n }\r\n\r\n /**\r\n * Create a Vested Airdrop campaign\r\n *\r\n * Tokens vest linearly over time with optional cliff period.\r\n *\r\n * @example\r\n * ```typescript\r\n * const result = await sdk.campaigns.createVestedAirdrop({\r\n * token: '0x...',\r\n * recipients: [\r\n * { address: '0x...', amount: parseEther('1000') },\r\n * ],\r\n * startTime: Math.floor(Date.now() / 1000), // Start now\r\n * duration: 365 * 24 * 60 * 60, // 1 year\r\n * cliffDuration: 90 * 24 * 60 * 60, // 3 month cliff\r\n * steps: 12, // Monthly releases\r\n * });\r\n * ```\r\n */\r\n async createVestedAirdrop(\r\n params: VestedAirdropParams\r\n ): Promise<TransactionResult> {\r\n const wallet = this.requireWallet();\r\n\r\n const recipients = params.recipients.map((r) => r.address);\r\n const amounts = params.recipients.map((r) => r.amount);\r\n\r\n const startTime = BigInt(params.startTime);\r\n const endTime = startTime + BigInt(params.duration);\r\n const steps = params.steps ?? 1;\r\n const step = steps > 1 ? BigInt(params.duration) / BigInt(steps) : 0n;\r\n const cliffReleaseTime = params.cliffDuration\r\n ? startTime + BigInt(params.cliffDuration)\r\n : 0n;\r\n\r\n const args: CreateArgs = {\r\n kind: CampaignKind.VESTED,\r\n token: params.token,\r\n start: startTime,\r\n end: endTime,\r\n step,\r\n cliffReleaseTime,\r\n cliffBps: params.cliffBps ?? 0,\r\n autoClaimIncentiveBps: params.autoClaimIncentiveBps ?? 0,\r\n cancelable: params.cancelable ?? true,\r\n claimOnce: false, // Vested can claim multiple times\r\n changePolicy: this.changePolicyToEnum(params.changePolicy),\r\n claimGrace: BigInt(params.claimGrace ?? 0),\r\n recipients,\r\n amounts,\r\n feeBuffer: params.feeBuffer ?? 0n,\r\n attachDefaultRegistry: params.attachDefaultRegistry ?? false,\r\n unwrapWETH: params.unwrapWETH ?? false,\r\n weth: params.weth ?? zeroAddress,\r\n };\r\n\r\n const hash = await wallet.writeContract({\r\n chain: wallet.chain,\r\n account: wallet.account!,\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'createCampaign',\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n args: [args] as any,\r\n });\r\n\r\n return this.createTransactionResult(hash);\r\n }\r\n\r\n /**\r\n * Create a Token Lock\r\n *\r\n * Tokens are locked until a specific unlock time, then fully releasable.\r\n *\r\n * @example\r\n * ```typescript\r\n * const result = await sdk.campaigns.createLock({\r\n * token: '0x...',\r\n * recipient: '0x...',\r\n * amount: parseEther('1000000'),\r\n * unlockTime: Math.floor(Date.now() / 1000) + 180 * 24 * 60 * 60, // 6 months\r\n * });\r\n * ```\r\n */\r\n async createLock(params: LockParams): Promise<TransactionResult> {\r\n const wallet = this.requireWallet();\r\n\r\n const now = BigInt(Math.floor(Date.now() / 1000));\r\n const unlockTime = BigInt(params.unlockTime);\r\n\r\n const args: CreateArgs = {\r\n kind: CampaignKind.LOCK,\r\n token: params.token,\r\n start: now,\r\n end: unlockTime,\r\n step: 0n,\r\n cliffReleaseTime: unlockTime, // Lock releases at this time\r\n cliffBps: 10000, // 100% released at cliff\r\n autoClaimIncentiveBps: 0,\r\n cancelable: params.cancelable ?? false,\r\n claimOnce: true,\r\n changePolicy: this.changePolicyToEnum(params.changePolicy),\r\n claimGrace: 0n,\r\n recipients: [params.recipient],\r\n amounts: [params.amount],\r\n feeBuffer: params.feeBuffer ?? 0n,\r\n attachDefaultRegistry: false,\r\n unwrapWETH: params.unwrapWETH ?? false,\r\n weth: params.weth ?? zeroAddress,\r\n };\r\n\r\n const hash = await wallet.writeContract({\r\n chain: wallet.chain,\r\n account: wallet.account!,\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'createCampaign',\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n args: [args] as any,\r\n });\r\n\r\n return this.createTransactionResult(hash);\r\n }\r\n\r\n /**\r\n * Create a Vesting Stream (Payment)\r\n *\r\n * Single-recipient vesting with optional automation.\r\n *\r\n * @example\r\n * ```typescript\r\n * const result = await sdk.campaigns.createVesting({\r\n * token: '0x...',\r\n * recipient: '0x...',\r\n * amount: parseEther('120000'), // 120k tokens\r\n * startTime: Math.floor(Date.now() / 1000),\r\n * duration: 365 * 24 * 60 * 60, // 1 year\r\n * cliffDuration: 0, // No cliff\r\n * steps: 12, // Monthly\r\n * });\r\n * ```\r\n */\r\n async createVesting(params: VestingParams): Promise<TransactionResult> {\r\n const wallet = this.requireWallet();\r\n\r\n const startTime = BigInt(params.startTime);\r\n const endTime = startTime + BigInt(params.duration);\r\n const steps = params.steps ?? 1;\r\n const step = steps > 1 ? BigInt(params.duration) / BigInt(steps) : 0n;\r\n const cliffReleaseTime = params.cliffDuration\r\n ? startTime + BigInt(params.cliffDuration)\r\n : 0n;\r\n\r\n const args: CreateArgs = {\r\n kind: CampaignKind.VESTING,\r\n token: params.token,\r\n start: startTime,\r\n end: endTime,\r\n step,\r\n cliffReleaseTime,\r\n cliffBps: params.cliffBps ?? 0,\r\n autoClaimIncentiveBps: params.autoClaimIncentiveBps ?? 0,\r\n cancelable: params.cancelable ?? true,\r\n claimOnce: false,\r\n changePolicy: this.changePolicyToEnum(params.changePolicy),\r\n claimGrace: BigInt(params.claimGrace ?? 0),\r\n recipients: [params.recipient],\r\n amounts: [params.amount],\r\n feeBuffer: params.feeBuffer ?? 0n,\r\n attachDefaultRegistry: false,\r\n unwrapWETH: params.unwrapWETH ?? false,\r\n weth: params.weth ?? zeroAddress,\r\n };\r\n\r\n const hash = await wallet.writeContract({\r\n chain: wallet.chain,\r\n account: wallet.account!,\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'createCampaign',\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n args: [args] as any,\r\n });\r\n\r\n return this.createTransactionResult(hash);\r\n }\r\n\r\n /**\r\n * Create a campaign with raw CreateArgs\r\n *\r\n * Low-level function for full control over campaign parameters.\r\n */\r\n async createCampaign(args: CreateArgs): Promise<TransactionResult> {\r\n const wallet = this.requireWallet();\r\n\r\n const hash = await wallet.writeContract({\r\n chain: wallet.chain,\r\n account: wallet.account!,\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'createCampaign',\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n args: [args] as any,\r\n });\r\n\r\n return this.createTransactionResult(hash);\r\n }\r\n\r\n // ============================================================================\r\n // Campaign Funding\r\n // ============================================================================\r\n\r\n /**\r\n * Fund a campaign using EIP-2612 Permit (gasless approval)\r\n *\r\n * @example\r\n * ```typescript\r\n * const result = await sdk.campaigns.fundWithPermit({\r\n * campaignId,\r\n * amount: parseEther('1000'),\r\n * deadline: Math.floor(Date.now() / 1000) + 3600,\r\n * v: 28,\r\n * r: '0x...',\r\n * s: '0x...',\r\n * });\r\n * ```\r\n */\r\n async fundWithPermit(params: {\r\n campaignId: bigint;\r\n amount: bigint;\r\n deadline: bigint;\r\n v: number;\r\n r: Hex;\r\n s: Hex;\r\n }): Promise<TransactionResult> {\r\n const wallet = this.requireWallet();\r\n\r\n const hash = await wallet.writeContract({\r\n chain: wallet.chain,\r\n account: wallet.account!,\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'fundWithPermit',\r\n args: [\r\n params.campaignId,\r\n params.amount,\r\n params.deadline,\r\n params.v,\r\n params.r,\r\n params.s,\r\n ],\r\n });\r\n\r\n return this.createTransactionResult(hash);\r\n }\r\n\r\n /**\r\n * Fund a campaign using Permit2 (gasless approval)\r\n *\r\n * @example\r\n * ```typescript\r\n * const result = await sdk.campaigns.fundWithPermit2({\r\n * campaignId,\r\n * from: userAddress,\r\n * amount: parseEther('1000'),\r\n * permit2Data: encodedPermit2Data,\r\n * });\r\n * ```\r\n */\r\n async fundWithPermit2(params: {\r\n campaignId: bigint;\r\n from: Address;\r\n amount: bigint;\r\n permit2Data: Hex;\r\n }): Promise<TransactionResult> {\r\n const wallet = this.requireWallet();\r\n\r\n const hash = await wallet.writeContract({\r\n chain: wallet.chain,\r\n account: wallet.account!,\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'fundWithPermit2',\r\n args: [\r\n params.campaignId,\r\n params.from,\r\n params.amount,\r\n params.permit2Data,\r\n ],\r\n });\r\n\r\n return this.createTransactionResult(hash);\r\n }\r\n\r\n /**\r\n * Return leftover tokens to creator\r\n *\r\n * @example\r\n * ```typescript\r\n * const result = await sdk.campaigns.returnLeftover(campaignId, parseEther('100'));\r\n * ```\r\n */\r\n async returnLeftover(\r\n campaignId: bigint,\r\n amountToReturn: bigint\r\n ): Promise<TransactionResult> {\r\n const wallet = this.requireWallet();\r\n\r\n const hash = await wallet.writeContract({\r\n chain: wallet.chain,\r\n account: wallet.account!,\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'returnLeftover',\r\n args: [campaignId, amountToReturn],\r\n });\r\n\r\n return this.createTransactionResult(hash);\r\n }\r\n\r\n /**\r\n * Add native tips to a campaign for automation\r\n */\r\n async addNativeTips(\r\n campaignId: bigint,\r\n tipAmount: bigint\r\n ): Promise<TransactionResult> {\r\n const wallet = this.requireWallet();\r\n\r\n const hash = await wallet.writeContract({\r\n chain: wallet.chain,\r\n account: wallet.account!,\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'addNativeTips',\r\n args: [campaignId, tipAmount],\r\n value: tipAmount,\r\n });\r\n\r\n return this.createTransactionResult(hash);\r\n }\r\n\r\n // ============================================================================\r\n // Campaign Queries\r\n // ============================================================================\r\n\r\n /**\r\n * Get campaign summary by ID\r\n *\r\n * Returns full campaign configuration and state.\r\n *\r\n * @example\r\n * ```typescript\r\n * const campaign = await sdk.campaigns.getCampaign(1n);\r\n * console.log('Campaign token:', campaign.token);\r\n * console.log('Total claimed:', campaign.totalClaimed);\r\n * ```\r\n */\r\n async getCampaign(campaignId: bigint): Promise<CampaignInfo> {\r\n const result = await this.publicClient.readContract({\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'campaignSummary',\r\n args: [campaignId],\r\n });\r\n\r\n return this.parseCampaignSummary(campaignId, result as Record<string, unknown>);\r\n }\r\n\r\n /**\r\n * Get campaign configuration only\r\n */\r\n async getCampaignConfig(campaignId: bigint): Promise<{\r\n kind: number;\r\n cancelable: boolean;\r\n claimOnce: boolean;\r\n canceled: boolean;\r\n changePolicy: number;\r\n token: Address;\r\n creator: Address;\r\n cliffBps: number;\r\n autoClaimIncentiveBps: number;\r\n start: number;\r\n end: number;\r\n step: number;\r\n canceledAt: number;\r\n cliffReleaseTime: number;\r\n claimGrace: number;\r\n unwrapWETH: boolean;\r\n weth: Address;\r\n }> {\r\n const result = await this.publicClient.readContract({\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'campaignConfig',\r\n args: [campaignId],\r\n }) as Record<string, unknown>;\r\n\r\n return {\r\n kind: Number(result.kind),\r\n cancelable: Boolean(result.cancelable),\r\n claimOnce: Boolean(result.claimOnce),\r\n canceled: Boolean(result.canceled),\r\n changePolicy: Number(result.changePolicy),\r\n token: result.token as Address,\r\n creator: result.creator as Address,\r\n cliffBps: Number(result.cliffBps),\r\n autoClaimIncentiveBps: Number(result.autoClaimIncentiveBps),\r\n start: Number(result.start),\r\n end: Number(result.end),\r\n step: Number(result.step),\r\n canceledAt: Number(result.canceledAt),\r\n cliffReleaseTime: Number(result.cliffReleaseTime),\r\n claimGrace: Number(result.claimGrace),\r\n unwrapWETH: Boolean(result.unwrapWETH),\r\n weth: result.weth as Address,\r\n };\r\n }\r\n\r\n /**\r\n * Get campaign state (totals and accounting)\r\n */\r\n async getCampaignState(campaignId: bigint): Promise<{\r\n totalAllocated: bigint;\r\n totalClaimed: bigint;\r\n nativeTips: bigint;\r\n returned: bigint;\r\n feeBuffer: bigint;\r\n feeLoss: bigint;\r\n totalFunded: bigint;\r\n statusBits: number;\r\n uniqueRecipients: bigint;\r\n }> {\r\n const result = await this.publicClient.readContract({\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'campaignState',\r\n args: [campaignId],\r\n }) as Record<string, unknown>;\r\n\r\n return {\r\n totalAllocated: result.totalAllocated as bigint,\r\n totalClaimed: result.totalClaimed as bigint,\r\n nativeTips: result.nativeTips as bigint,\r\n returned: result.returned as bigint,\r\n feeBuffer: result.feeBuffer as bigint,\r\n feeLoss: result.feeLoss as bigint,\r\n totalFunded: result.totalFunded as bigint,\r\n statusBits: Number(result.statusBits),\r\n uniqueRecipients: result.uniqueRecipients as bigint,\r\n };\r\n }\r\n\r\n /**\r\n * Get campaign status bits\r\n */\r\n async getCampaignStatus(campaignId: bigint): Promise<number> {\r\n const result = await this.publicClient.readContract({\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'campaignStatus',\r\n args: [campaignId],\r\n });\r\n\r\n return Number(result);\r\n }\r\n\r\n // ============================================================================\r\n // Campaign Administration\r\n // ============================================================================\r\n\r\n /**\r\n * Pause a campaign (creator or admin only)\r\n *\r\n * @param campaignId - Campaign ID\r\n * @param reason - Pause reason as status bits (e.g., 1 for creator pause)\r\n */\r\n async pause(campaignId: bigint, reason: number = 1): Promise<TransactionResult> {\r\n const wallet = this.requireWallet();\r\n\r\n const hash = await wallet.writeContract({\r\n chain: wallet.chain,\r\n account: wallet.account!,\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'pauseCampaign',\r\n args: [campaignId, reason],\r\n });\r\n\r\n return this.createTransactionResult(hash);\r\n }\r\n\r\n /**\r\n * Resume a paused campaign\r\n *\r\n * @param campaignId - Campaign ID\r\n * @param clearBits - Status bits to clear (e.g., 1 for creator pause)\r\n */\r\n async resume(campaignId: bigint, clearBits: number = 1): Promise<TransactionResult> {\r\n const wallet = this.requireWallet();\r\n\r\n const hash = await wallet.writeContract({\r\n chain: wallet.chain,\r\n account: wallet.account!,\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'resumeCampaign',\r\n args: [campaignId, clearBits],\r\n });\r\n\r\n return this.createTransactionResult(hash);\r\n }\r\n\r\n /**\r\n * Finalize a campaign (no more claims possible)\r\n */\r\n async finalize(campaignId: bigint): Promise<TransactionResult> {\r\n const wallet = this.requireWallet();\r\n\r\n const hash = await wallet.writeContract({\r\n chain: wallet.chain,\r\n account: wallet.account!,\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'finalizeCampaign',\r\n args: [campaignId],\r\n });\r\n\r\n return this.createTransactionResult(hash);\r\n }\r\n\r\n /**\r\n * Cancel a campaign and return funds to creator\r\n */\r\n async cancel(campaignId: bigint): Promise<TransactionResult> {\r\n const wallet = this.requireWallet();\r\n\r\n const hash = await wallet.writeContract({\r\n chain: wallet.chain,\r\n account: wallet.account!,\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'cancel',\r\n args: [campaignId],\r\n });\r\n\r\n return this.createTransactionResult(hash);\r\n }\r\n\r\n /**\r\n * Change a recipient address (for blocked recipients)\r\n */\r\n async changeRecipient(\r\n campaignId: bigint,\r\n fromAddress: Address,\r\n toAddress: Address\r\n ): Promise<TransactionResult> {\r\n const wallet = this.requireWallet();\r\n\r\n const hash = await wallet.writeContract({\r\n chain: wallet.chain,\r\n account: wallet.account!,\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'changeRecipient',\r\n args: [campaignId, fromAddress, toAddress],\r\n });\r\n\r\n return this.createTransactionResult(hash);\r\n }\r\n\r\n /**\r\n * Add recipients to an existing campaign\r\n */\r\n async addRecipients(\r\n campaignId: bigint,\r\n recipients: Address[],\r\n amounts: bigint[],\r\n additionalBuffer: bigint = 0n\r\n ): Promise<TransactionResult> {\r\n const wallet = this.requireWallet();\r\n\r\n const hash = await wallet.writeContract({\r\n chain: wallet.chain,\r\n account: wallet.account!,\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'addRecipients',\r\n args: [campaignId, recipients, amounts, additionalBuffer],\r\n });\r\n\r\n return this.createTransactionResult(hash);\r\n }\r\n\r\n // ============================================================================\r\n // Helpers\r\n // ============================================================================\r\n\r\n private requireWallet(): WalletClient {\r\n if (!this.walletClient) {\r\n throw new Error(\r\n 'Wallet client required for write operations. Initialize SDK with a signer.'\r\n );\r\n }\r\n return this.walletClient;\r\n }\r\n\r\n private changePolicyToEnum(\r\n policy?: 'only_recipient' | 'only_creator' | 'both' | 'no_one'\r\n ): number {\r\n switch (policy) {\r\n case 'only_recipient':\r\n return ChangePolicy.ONLY_RECIPIENT;\r\n case 'only_creator':\r\n return ChangePolicy.ONLY_CREATOR;\r\n case 'both':\r\n return ChangePolicy.BOTH;\r\n case 'no_one':\r\n return ChangePolicy.NO_ONE;\r\n default:\r\n return ChangePolicy.ONLY_RECIPIENT;\r\n }\r\n }\r\n\r\n private parseCampaignSummary(id: bigint, data: Record<string, unknown>): CampaignInfo {\r\n const cfg = data.cfg as Record<string, unknown>;\r\n const state = data.state as Record<string, unknown>;\r\n\r\n const kindMap: Record<number, CampaignInfo['kind']> = {\r\n 0: 'instant_airdrop',\r\n 1: 'vested_airdrop',\r\n 2: 'lock',\r\n 3: 'vesting',\r\n };\r\n\r\n const kind = Number(cfg.kind);\r\n\r\n const result: CampaignInfo = {\r\n id,\r\n kind: kindMap[kind] ?? 'instant_airdrop',\r\n token: cfg.token as Address,\r\n creator: cfg.creator as Address,\r\n name: '', // Not stored on-chain\r\n totalAllocated: state.totalAllocated as bigint,\r\n totalFunded: state.totalFunded as bigint,\r\n totalClaimed: state.totalClaimed as bigint,\r\n totalReturned: state.returned as bigint,\r\n feeLoss: state.feeLoss as bigint,\r\n feeBuffer: state.feeBuffer as bigint,\r\n startTime: Number(cfg.start),\r\n endTime: Number(cfg.end),\r\n cliffTime: Number(cfg.cliffReleaseTime),\r\n steps: Number(cfg.step) > 0 ? Math.ceil((Number(cfg.end) - Number(cfg.start)) / Number(cfg.step)) : 1,\r\n recipientCount: Number(state.uniqueRecipients),\r\n statusBits: Number(state.statusBits),\r\n changePolicy: Number(cfg.changePolicy),\r\n hasAutomation: (Number(state.statusBits) & (1 << 5)) !== 0,\r\n };\r\n\r\n // Add optional fields\r\n if (data.hasRegistry) {\r\n result.hasRegistry = true;\r\n }\r\n if (data.merkleRoot) {\r\n result.merkleRoot = data.merkleRoot as Hex;\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private createTransactionResult(hash: Hash): TransactionResult {\r\n return {\r\n hash,\r\n wait: async () => {\r\n const receipt = await this.publicClient.waitForTransactionReceipt({\r\n hash,\r\n });\r\n return {\r\n blockNumber: receipt.blockNumber,\r\n transactionHash: receipt.transactionHash,\r\n gasUsed: receipt.gasUsed,\r\n status: receipt.status,\r\n logs: receipt.logs,\r\n };\r\n },\r\n };\r\n }\r\n}\r\n\r\nexport default CampaignsModule;\r\n","/**\r\n * Claims Module\r\n *\r\n * Provides methods for claiming tokens from campaigns:\r\n * - Single claims (with merkle proof)\r\n * - Batch claims\r\n * - Meta-transaction (gasless) claims\r\n * - Lock releases\r\n */\r\nimport {\r\n type PublicClient,\r\n type WalletClient,\r\n type Address,\r\n type Hash,\r\n type Hex,\r\n keccak256,\r\n encodePacked,\r\n} from 'viem';\r\nimport { DIAMOND_ABI } from '@pepay-streams/abi/diamond';\r\nimport type {\r\n ClaimParams,\r\n BatchClaimParams,\r\n MetaClaimParams,\r\n RecipientStatus,\r\n TransactionResult,\r\n} from '../types';\r\n\r\n/**\r\n * EIP-712 domain for meta-transaction signatures\r\n */\r\ninterface EIP712Domain {\r\n name: string;\r\n version: string;\r\n chainId: number;\r\n verifyingContract: Address;\r\n}\r\n\r\n/**\r\n * Claims module for claiming tokens from distribution campaigns\r\n */\r\nexport class ClaimsModule {\r\n constructor(\r\n private readonly publicClient: PublicClient,\r\n private readonly walletClient: WalletClient | undefined,\r\n private readonly diamondAddress: Address,\r\n private readonly chainId: number\r\n ) {}\r\n\r\n // ============================================================================\r\n // Standard Claims\r\n // ============================================================================\r\n\r\n /**\r\n * Claim vested tokens from a campaign\r\n *\r\n * For merkle-tree campaigns, requires allocation and proof.\r\n * For direct campaigns, allocation should be 0 and proof empty.\r\n *\r\n * @example\r\n * ```typescript\r\n * // Direct campaign claim\r\n * const result = await sdk.claims.claim({\r\n * campaignId: 1n,\r\n * allocation: 0n,\r\n * proof: [],\r\n * });\r\n *\r\n * // Merkle campaign claim\r\n * const result = await sdk.claims.claim({\r\n * campaignId: 1n,\r\n * allocation: parseEther('100'),\r\n * proof: ['0x...', '0x...'],\r\n * });\r\n * ```\r\n */\r\n async claim(params: ClaimParams): Promise<TransactionResult> {\r\n const wallet = this.requireWallet();\r\n\r\n let hash: Hash;\r\n\r\n if (params.claimTo) {\r\n hash = await wallet.writeContract({\r\n chain: wallet.chain,\r\n account: wallet.account!,\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'claimTo',\r\n args: [\r\n params.campaignId,\r\n params.claimTo,\r\n params.allocation ?? 0n,\r\n params.proof ?? [],\r\n ],\r\n });\r\n } else {\r\n hash = await wallet.writeContract({\r\n chain: wallet.chain,\r\n account: wallet.account!,\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'claim',\r\n args: [\r\n params.campaignId,\r\n params.allocation ?? 0n,\r\n params.proof ?? [],\r\n ],\r\n });\r\n }\r\n\r\n return this.createTransactionResult(hash);\r\n }\r\n\r\n /**\r\n * Claim from a campaign for multiple recipients in a single transaction\r\n *\r\n * More gas efficient than multiple individual claims.\r\n * For direct allocation campaigns only.\r\n *\r\n * @example\r\n * ```typescript\r\n * const result = await sdk.claims.claimBatch({\r\n * campaignId: 1n,\r\n * recipients: ['0x...', '0x...', '0x...'],\r\n * });\r\n * ```\r\n */\r\n async claimBatch(params: BatchClaimParams): Promise<TransactionResult> {\r\n const wallet = this.requireWallet();\r\n\r\n const hash = await wallet.writeContract({\r\n chain: wallet.chain,\r\n account: wallet.account!,\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'claimMany',\r\n args: [params.campaignId, params.recipients],\r\n });\r\n\r\n return this.createTransactionResult(hash);\r\n }\r\n\r\n /**\r\n * Release locked tokens (for Lock campaigns)\r\n *\r\n * Can only be called after the unlock time has passed.\r\n *\r\n * @example\r\n * ```typescript\r\n * const result = await sdk.claims.releaseLock(campaignId, [recipient1, recipient2]);\r\n * ```\r\n */\r\n async releaseLock(\r\n campaignId: bigint,\r\n recipients: Address[]\r\n ): Promise<TransactionResult> {\r\n const wallet = this.requireWallet();\r\n\r\n const hash = await wallet.writeContract({\r\n chain: wallet.chain,\r\n account: wallet.account!,\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'releaseLock',\r\n args: [campaignId, recipients],\r\n });\r\n\r\n return this.createTransactionResult(hash);\r\n }\r\n\r\n // ============================================================================\r\n // Meta-Transaction Claims (Gasless)\r\n // ============================================================================\r\n\r\n /**\r\n * Claim via meta-transaction (gasless for recipient)\r\n *\r\n * A relayer submits the transaction on behalf of the recipient.\r\n * The recipient signs an EIP-712 message off-chain.\r\n *\r\n * @example\r\n * ```typescript\r\n * // Recipient signs off-chain\r\n * const signedAuth = await sdk.claims.signClaimMessage({\r\n * campaignId,\r\n * allocation: parseEther('100'),\r\n * proof: ['0x...'],\r\n * deadline: Math.floor(Date.now() / 1000) + 3600, // 1 hour\r\n * });\r\n *\r\n * // Relayer submits\r\n * const result = await sdk.claims.claimWithSig(signedAuth);\r\n * ```\r\n */\r\n async claimWithSig(params: MetaClaimParams): Promise<TransactionResult> {\r\n const wallet = this.requireWallet();\r\n\r\n const auth = {\r\n id: params.campaignId,\r\n claimant: params.claimant,\r\n payoutTo: params.payoutTo ?? params.claimant,\r\n allocation: params.allocation,\r\n proofHash: this.computeProofHash(params.proof),\r\n deadline: BigInt(params.deadline),\r\n nonce: params.nonce,\r\n };\r\n\r\n const hash = await wallet.writeContract({\r\n chain: wallet.chain,\r\n account: wallet.account!,\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'claimWithSig',\r\n args: [auth, params.proof, params.signature] as const,\r\n });\r\n\r\n return this.createTransactionResult(hash);\r\n }\r\n\r\n /**\r\n * Generate the EIP-712 typed data for a claim signature\r\n *\r\n * The recipient signs this message off-chain.\r\n */\r\n getClaimTypedData(\r\n campaignId: bigint,\r\n claimant: Address,\r\n payoutTo: Address,\r\n allocation: bigint,\r\n proofHash: Hex,\r\n nonce: bigint,\r\n deadline: number\r\n ): {\r\n domain: EIP712Domain;\r\n types: Record<string, { name: string; type: string }[]>;\r\n primaryType: string;\r\n message: Record<string, unknown>;\r\n } {\r\n return {\r\n domain: {\r\n name: 'PepayStreams',\r\n version: '1',\r\n chainId: this.chainId,\r\n verifyingContract: this.diamondAddress,\r\n },\r\n types: {\r\n ClaimAuth: [\r\n { name: 'id', type: 'uint256' },\r\n { name: 'claimant', type: 'address' },\r\n { name: 'payoutTo', type: 'address' },\r\n { name: 'allocation', type: 'uint128' },\r\n { name: 'proofHash', type: 'bytes32' },\r\n { name: 'deadline', type: 'uint64' },\r\n { name: 'nonce', type: 'uint256' },\r\n ],\r\n },\r\n primaryType: 'ClaimAuth',\r\n message: {\r\n id: campaignId,\r\n claimant,\r\n payoutTo,\r\n allocation,\r\n proofHash,\r\n deadline: BigInt(deadline),\r\n nonce,\r\n },\r\n };\r\n }\r\n\r\n /**\r\n * Sign a claim message for meta-transaction\r\n *\r\n * Returns the signature that can be submitted by a relayer.\r\n */\r\n async signClaimMessage(params: {\r\n campaignId: bigint;\r\n allocation: bigint;\r\n proof: Hex[];\r\n deadline: number;\r\n payoutTo?: Address;\r\n }): Promise<{\r\n signature: Hex;\r\n nonce: bigint;\r\n deadline: number;\r\n claimant: Address;\r\n payoutTo: Address;\r\n allocation: bigint;\r\n proof: Hex[];\r\n campaignId: bigint;\r\n }> {\r\n const wallet = this.requireWallet();\r\n const claimant = wallet.account!.address;\r\n const payoutTo = params.payoutTo ?? claimant;\r\n\r\n // Get current nonce\r\n const nonce = await this.getClaimNonce(params.campaignId, claimant);\r\n const proofHash = this.computeProofHash(params.proof);\r\n\r\n const typedData = this.getClaimTypedData(\r\n params.campaignId,\r\n claimant,\r\n payoutTo,\r\n params.allocation,\r\n proofHash,\r\n nonce,\r\n params.deadline\r\n );\r\n\r\n const signature = await wallet.signTypedData({\r\n account: wallet.account!,\r\n domain: typedData.domain,\r\n types: typedData.types,\r\n primaryType: typedData.primaryType as 'ClaimAuth',\r\n message: typedData.message,\r\n });\r\n\r\n return {\r\n signature,\r\n nonce,\r\n deadline: params.deadline,\r\n claimant,\r\n payoutTo,\r\n allocation: params.allocation,\r\n proof: params.proof,\r\n campaignId: params.campaignId,\r\n };\r\n }\r\n\r\n /**\r\n * Get the current nonce for claim meta-transactions\r\n */\r\n async getClaimNonce(campaignId: bigint, address: Address): Promise<bigint> {\r\n const result = await this.publicClient.readContract({\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'noncesClaim',\r\n args: [campaignId, address],\r\n });\r\n\r\n return result as bigint;\r\n }\r\n\r\n // ============================================================================\r\n // Claim Status Queries\r\n // ============================================================================\r\n\r\n /**\r\n * Get the amount currently claimable for a recipient\r\n *\r\n * @example\r\n * ```typescript\r\n * const claimable = await sdk.claims.getClaimable(campaignId, recipientAddress);\r\n * console.log('Claimable:', formatEther(claimable));\r\n * ```\r\n */\r\n async getClaimable(campaignId: bigint, recipient: Address): Promise<bigint> {\r\n const result = await this.publicClient.readContract({\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'claimableOf',\r\n args: [campaignId, recipient],\r\n });\r\n\r\n return result as bigint;\r\n }\r\n\r\n /**\r\n * Check if a recipient is blocked from claiming\r\n */\r\n async isBlocked(campaignId: bigint, recipient: Address): Promise<boolean> {\r\n const result = await this.publicClient.readContract({\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'isBlocked',\r\n args: [campaignId, recipient],\r\n });\r\n\r\n return result as boolean;\r\n }\r\n\r\n /**\r\n * Get vested amount for a recipient (how much has vested so far)\r\n */\r\n async getVestedAmount(\r\n campaignId: bigint,\r\n recipient: Address,\r\n allocation: bigint\r\n ): Promise<bigint> {\r\n const result = await this.publicClient.readContract({\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'vestedAmount',\r\n args: [campaignId, recipient, allocation],\r\n });\r\n\r\n return result as bigint;\r\n }\r\n\r\n /**\r\n * Get merkle claimed shares for a recipient\r\n */\r\n async getMerkleClaimedShares(\r\n campaignId: bigint,\r\n recipient: Address\r\n ): Promise<bigint> {\r\n const result = await this.publicClient.readContract({\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'merkleClaimedShares',\r\n args: [campaignId, recipient],\r\n });\r\n\r\n return result as bigint;\r\n }\r\n\r\n /**\r\n * Get detailed recipient status for a campaign\r\n */\r\n async getRecipientStatus(\r\n campaignId: bigint,\r\n recipient: Address,\r\n allocation: bigint\r\n ): Promise<RecipientStatus> {\r\n const [claimable, blocked, vested, claimed] = await Promise.all([\r\n this.getClaimable(campaignId, recipient),\r\n this.isBlocked(campaignId, recipient),\r\n this.getVestedAmount(campaignId, recipient, allocation),\r\n this.getMerkleClaimedShares(campaignId, recipient),\r\n ]);\r\n\r\n return {\r\n allocated: allocation,\r\n claimed,\r\n due: claimable,\r\n blocked,\r\n fullyVested: vested >= allocation,\r\n };\r\n }\r\n\r\n /**\r\n * Check if a recipient can claim from a campaign\r\n */\r\n async canClaim(campaignId: bigint, recipient: Address): Promise<boolean> {\r\n try {\r\n const [claimable, blocked] = await Promise.all([\r\n this.getClaimable(campaignId, recipient),\r\n this.isBlocked(campaignId, recipient),\r\n ]);\r\n return claimable > 0n && !blocked;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n // ============================================================================\r\n // Merkle Proof Helpers\r\n // ============================================================================\r\n\r\n /**\r\n * Verify a Merkle proof locally\r\n *\r\n * Useful for validating proofs before submitting transactions.\r\n */\r\n verifyMerkleProof(root: Hex, leaf: Hex, proof: Hex[]): boolean {\r\n let computedHash = leaf;\r\n\r\n for (const proofElement of proof) {\r\n if (computedHash < proofElement) {\r\n computedHash = keccak256(\r\n encodePacked(['bytes32', 'bytes32'], [computedHash, proofElement])\r\n );\r\n } else {\r\n computedHash = keccak256(\r\n encodePacked(['bytes32', 'bytes32'], [proofElement, computedHash])\r\n );\r\n }\r\n }\r\n\r\n return computedHash === root;\r\n }\r\n\r\n /**\r\n * Compute Merkle leaf for an allocation\r\n */\r\n computeMerkleLeaf(address: Address, amount: bigint): Hex {\r\n return keccak256(encodePacked(['address', 'uint256'], [address, amount]));\r\n }\r\n\r\n /**\r\n * Compute proof hash for meta-transaction\r\n */\r\n computeProofHash(proof: Hex[]): Hex {\r\n if (proof.length === 0) {\r\n return '0x0000000000000000000000000000000000000000000000000000000000000000';\r\n }\r\n return keccak256(encodePacked(['bytes32[]'], [proof]));\r\n }\r\n\r\n // ============================================================================\r\n // Helpers\r\n // ============================================================================\r\n\r\n private requireWallet(): WalletClient {\r\n if (!this.walletClient) {\r\n throw new Error(\r\n 'Wallet client required for write operations. Initialize SDK with a signer.'\r\n );\r\n }\r\n return this.walletClient;\r\n }\r\n\r\n private createTransactionResult(hash: Hash): TransactionResult {\r\n return {\r\n hash,\r\n wait: async () => {\r\n const receipt = await this.publicClient.waitForTransactionReceipt({\r\n hash,\r\n });\r\n return {\r\n blockNumber: receipt.blockNumber,\r\n transactionHash: receipt.transactionHash,\r\n gasUsed: receipt.gasUsed,\r\n status: receipt.status,\r\n logs: receipt.logs,\r\n };\r\n },\r\n };\r\n }\r\n}\r\n\r\nexport default ClaimsModule;\r\n","/**\r\n * Staking Module\r\n *\r\n * Provides methods for staking operations:\r\n * - Stake tokens\r\n * - Unstake tokens\r\n * - Claim rewards\r\n * - Pool queries\r\n */\r\nimport {\r\n type PublicClient,\r\n type WalletClient,\r\n type Address,\r\n type Hash,\r\n} from 'viem';\r\nimport { DIAMOND_ABI } from '@pepay-streams/abi/diamond';\r\nimport type {\r\n PoolInfo,\r\n UserStake,\r\n TransactionResult,\r\n} from '../types';\r\n\r\n/**\r\n * Staking module for fixed-duration staking pools\r\n */\r\nexport class StakingModule {\r\n constructor(\r\n private readonly publicClient: PublicClient,\r\n private readonly walletClient: WalletClient | undefined,\r\n private readonly diamondAddress: Address\r\n ) {}\r\n\r\n // ============================================================================\r\n // Staking Operations\r\n // ============================================================================\r\n\r\n /**\r\n * Stake tokens in a pool\r\n *\r\n * Must approve the Diamond contract first.\r\n *\r\n * @example\r\n * ```typescript\r\n * await sdk.approve(stakeToken, amount);\r\n * const result = await sdk.staking.stake(poolId, amount);\r\n * ```\r\n */\r\n async stake(poolId: bigint, amount: bigint): Promise<TransactionResult> {\r\n const wallet = this.requireWallet();\r\n\r\n const hash = await wallet.writeContract({\r\n chain: wallet.chain,\r\n account: wallet.account!,\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'stake',\r\n args: [poolId, amount],\r\n });\r\n\r\n return this.createTransactionResult(hash);\r\n }\r\n\r\n /**\r\n * Increase stake in an existing deposit\r\n */\r\n async increaseStake(\r\n poolId: bigint,\r\n amount: bigint\r\n ): Promise<TransactionResult> {\r\n const wallet = this.requireWallet();\r\n\r\n const hash = await wallet.writeContract({\r\n chain: wallet.chain,\r\n account: wallet.account!,\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'increaseStake',\r\n args: [poolId, amount],\r\n });\r\n\r\n return this.createTransactionResult(hash);\r\n }\r\n\r\n /**\r\n * Unstake all tokens from a pool\r\n *\r\n * Automatically claims pending rewards.\r\n *\r\n * @example\r\n * ```typescript\r\n * const result = await sdk.staking.unstake(poolId);\r\n * ```\r\n */\r\n async unstake(poolId: bigint): Promise<TransactionResult> {\r\n const wallet = this.requireWallet();\r\n\r\n const hash = await wallet.writeContract({\r\n chain: wallet.chain,\r\n account: wallet.account!,\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'unstake',\r\n args: [poolId],\r\n });\r\n\r\n return this.createTransactionResult(hash);\r\n }\r\n\r\n /**\r\n * Partial unstake - withdraw some tokens but keep position open\r\n */\r\n async partialUnstake(\r\n poolId: bigint,\r\n amount: bigint\r\n ): Promise<TransactionResult> {\r\n const wallet = this.requireWallet();\r\n\r\n const hash = await wallet.writeContract({\r\n chain: wallet.chain,\r\n account: wallet.account!,\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'partialUnstake',\r\n args: [poolId, amount],\r\n });\r\n\r\n return this.createTransactionResult(hash);\r\n }\r\n\r\n /**\r\n * Emergency unstake - forfeit rewards but get principal back\r\n *\r\n * Use when pool has issues or you need immediate exit.\r\n */\r\n async emergencyUnstake(poolId: bigint): Promise<TransactionResult> {\r\n const wallet = this.requireWallet();\r\n\r\n const hash = await wallet.writeContract({\r\n chain: wallet.chain,\r\n account: wallet.account!,\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'emergencyUnstake',\r\n args: [poolId],\r\n });\r\n\r\n return this.createTransactionResult(hash);\r\n }\r\n\r\n // ============================================================================\r\n // Pool Queries\r\n // ============================================================================\r\n\r\n /**\r\n * Get pool information\r\n *\r\n * @example\r\n * ```typescript\r\n * const pool = await sdk.staking.getPool(1n);\r\n * console.log('Total staked:', formatEther(pool.totalStaked));\r\n * ```\r\n */\r\n async getPool(poolId: bigint): Promise<PoolInfo> {\r\n const result = await this.publicClient.readContract({\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'pools',\r\n args: [poolId],\r\n });\r\n\r\n return this.parsePoolInfo(poolId, result as Record<string, unknown>);\r\n }\r\n\r\n /**\r\n * Get total number of staking pools\r\n */\r\n async getPoolCount(): Promise<bigint> {\r\n const result = await this.publicClient.readContract({\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'poolCount',\r\n args: [],\r\n });\r\n\r\n return result as bigint;\r\n }\r\n\r\n /**\r\n * Get pool stats (runtime state)\r\n */\r\n async getPoolStats(poolId: bigint): Promise<{\r\n statusBits: number;\r\n rewardRemaining: bigint;\r\n totalStaked: bigint;\r\n endAt: number;\r\n finalized: boolean;\r\n rewardRatePerSecond: bigint;\r\n }> {\r\n const result = await this.publicClient.readContract({\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'poolStats',\r\n args: [poolId],\r\n }) as [number, bigint, bigint, bigint, bigint, bigint, boolean, bigint, bigint, bigint];\r\n\r\n return {\r\n statusBits: result[0],\r\n rewardRemaining: result[1],\r\n totalStaked: result[2],\r\n endAt: Number(result[4]),\r\n finalized: result[6],\r\n rewardRatePerSecond: result[9],\r\n };\r\n }\r\n\r\n // ============================================================================\r\n // User Stake Queries\r\n // ============================================================================\r\n\r\n /**\r\n * Get user's deposit info for a pool\r\n *\r\n * @example\r\n * ```typescript\r\n * const stake = await sdk.staking.getUserDeposit(poolId, address);\r\n * console.log('Staked:', formatEther(stake.amount));\r\n * ```\r\n */\r\n async getUserDeposit(poolId: bigint, user: Address): Promise<{\r\n amount: bigint;\r\n startAt: number;\r\n rewardDebtRay: bigint;\r\n claimedReward: bigint;\r\n claimedAt: number;\r\n active: boolean;\r\n }> {\r\n const result = await this.publicClient.readContract({\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'deposits',\r\n args: [poolId, user],\r\n }) as { amount: bigint; startAt: bigint; rewardDebtRay: bigint; claimedReward: bigint; claimedAt: bigint; active: boolean };\r\n\r\n return {\r\n amount: result.amount,\r\n startAt: Number(result.startAt),\r\n rewardDebtRay: result.rewardDebtRay,\r\n claimedReward: result.claimedReward,\r\n claimedAt: Number(result.claimedAt),\r\n active: result.active,\r\n };\r\n }\r\n\r\n /**\r\n * Get comprehensive deposit status for a user\r\n */\r\n async getDepositStatus(poolId: bigint, user: Address): Promise<{\r\n active: boolean;\r\n stakedAmount: bigint;\r\n pendingRewards: bigint;\r\n canUnstakeNow: boolean;\r\n secondsUntilUnstake: number;\r\n totalClaimed: bigint;\r\n }> {\r\n const result = await this.publicClient.readContract({\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'depositStatus',\r\n args: [poolId, user],\r\n }) as [boolean, bigint, bigint, boolean, bigint, bigint];\r\n\r\n return {\r\n active: result[0],\r\n stakedAmount: result[1],\r\n pendingRewards: result[2],\r\n canUnstakeNow: result[3],\r\n secondsUntilUnstake: Number(result[4]),\r\n totalClaimed: result[5],\r\n };\r\n }\r\n\r\n /**\r\n * Get pending rewards for a user in a pool\r\n */\r\n async getPendingRewards(poolId: bigint, user: Address): Promise<bigint> {\r\n const result = await this.publicClient.readContract({\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'pendingReward',\r\n args: [poolId, user],\r\n });\r\n\r\n return result as bigint;\r\n }\r\n\r\n /**\r\n * Check if user can unstake from a pool\r\n */\r\n async canUnstake(poolId: bigint, user: Address): Promise<boolean> {\r\n const result = await this.publicClient.readContract({\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'canUnstake',\r\n args: [poolId, user],\r\n });\r\n\r\n return result as boolean;\r\n }\r\n\r\n /**\r\n * Get time until user can unstake\r\n */\r\n async secondsUntilUnstakeable(\r\n poolId: bigint,\r\n user: Address\r\n ): Promise<bigint> {\r\n const result = await this.publicClient.readContract({\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'secondsUntilUnstakeable',\r\n args: [poolId, user],\r\n });\r\n\r\n return result as bigint;\r\n }\r\n\r\n /**\r\n * Get user's stake info for a pool (convenience wrapper)\r\n *\r\n * @example\r\n * ```typescript\r\n * const stake = await sdk.staking.getUserStake(poolId, address);\r\n * console.log('Staked:', formatEther(stake.amount));\r\n * console.log('Pending rewards:', formatEther(stake.pendingRewards));\r\n * ```\r\n */\r\n async getUserStake(poolId: bigint, user: Address): Promise<UserStake> {\r\n const [deposit, pendingRewards] = await Promise.all([\r\n this.getUserDeposit(poolId, user),\r\n this.getPendingRewards(poolId, user),\r\n ]);\r\n\r\n return {\r\n amount: deposit.amount,\r\n pendingRewards,\r\n lastClaimTime: deposit.claimedAt,\r\n stakeTime: deposit.startAt,\r\n };\r\n }\r\n\r\n // ============================================================================\r\n // Utility Functions\r\n // ============================================================================\r\n\r\n /**\r\n * Get APY preview for a pool\r\n */\r\n async getApyPreview(poolId: bigint): Promise<{\r\n ratePerSecond: bigint;\r\n totalStaked: bigint;\r\n }> {\r\n const result = await this.publicClient.readContract({\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'apyPreview',\r\n args: [poolId],\r\n }) as [bigint, bigint];\r\n\r\n return {\r\n ratePerSecond: result[0],\r\n totalStaked: result[1],\r\n };\r\n }\r\n\r\n /**\r\n * Calculate APY for a pool\r\n *\r\n * @example\r\n * ```typescript\r\n * const pool = await sdk.staking.getPool(poolId);\r\n * const apy = sdk.staking.calculateApy(pool);\r\n * console.log('APY:', apy.toFixed(2), '%');\r\n * ```\r\n */\r\n calculateApy(pool: PoolInfo): number {\r\n if (pool.totalStaked === 0n) {\r\n return 0;\r\n }\r\n\r\n const durationInYears =\r\n (pool.endTime - pool.startTime) / (365 * 24 * 60 * 60);\r\n const rewardRate =\r\n Number(pool.rewardBudget) / Number(pool.totalStaked);\r\n\r\n return (rewardRate / durationInYears) * 100;\r\n }\r\n\r\n // ============================================================================\r\n // Helpers\r\n // ============================================================================\r\n\r\n private requireWallet(): WalletClient {\r\n if (!this.walletClient) {\r\n throw new Error(\r\n 'Wallet client required for write operations. Initialize SDK with a signer.'\r\n );\r\n }\r\n return this.walletClient;\r\n }\r\n\r\n private parsePoolInfo(id: bigint, data: Record<string, unknown>): PoolInfo {\r\n return {\r\n id,\r\n stakeToken: data.stake as Address,\r\n rewardToken: data.reward as Address,\r\n creator: data.creator as Address,\r\n totalStaked: data.totalStaked as bigint,\r\n rewardBudget: data.rewardRemaining as bigint, // Current remaining\r\n rewardsDistributed: 0n, // Not directly available\r\n startTime: 0, // Not in pool struct\r\n endTime: Number(data.endAt as bigint),\r\n minStake: 0n, // Not in pool struct\r\n maxStake: data.cap as bigint,\r\n stakerCount: 0, // Not in pool struct\r\n isActive: !((data.statusBits as number) > 0),\r\n isFinalized: data.finalized as boolean,\r\n };\r\n }\r\n\r\n private createTransactionResult(hash: Hash): TransactionResult {\r\n return {\r\n hash,\r\n wait: async () => {\r\n const receipt = await this.publicClient.waitForTransactionReceipt({\r\n hash,\r\n });\r\n return {\r\n blockNumber: receipt.blockNumber,\r\n transactionHash: receipt.transactionHash,\r\n gasUsed: receipt.gasUsed,\r\n status: receipt.status,\r\n logs: receipt.logs,\r\n };\r\n },\r\n };\r\n }\r\n}\r\n\r\nexport default StakingModule;\r\n","/**\r\n * Marketplace Module\r\n *\r\n * Provides methods for P2P vesting marketplace:\r\n * - Create orders (INSTANT, VESTED, TRADABLE)\r\n * - Fill orders\r\n * - Cancel orders\r\n * - Order queries\r\n */\r\nimport {\r\n type PublicClient,\r\n type WalletClient,\r\n type Address,\r\n type Hash,\r\n type Hex,\r\n zeroAddress,\r\n} from 'viem';\r\nimport { DIAMOND_ABI } from '@pepay-streams/abi/diamond';\r\nimport type {\r\n CreateInstantOrderParams,\r\n CreateVestedOrderParams,\r\n CreateTradableOrderParams,\r\n OrderInfo,\r\n OrderQuote,\r\n TransactionResult,\r\n OrderType,\r\n} from '../types';\r\n\r\n/**\r\n * Visibility enum matching contract\r\n */\r\nenum Visibility {\r\n PUBLIC = 0,\r\n PRIVATE = 1,\r\n}\r\n\r\n/**\r\n * StartMode enum matching contract\r\n */\r\nenum StartMode {\r\n UPON_FILL = 0,\r\n FIXED_TIMESTAMP = 1,\r\n}\r\n\r\n/**\r\n * Marketplace module for P2P trading of token positions\r\n */\r\nexport class MarketplaceModule {\r\n constructor(\r\n private readonly publicClient: PublicClient,\r\n private readonly walletClient: WalletClient | undefined,\r\n private readonly diamondAddress: Address\r\n ) {}\r\n\r\n // ============================================================================\r\n // Order Creation\r\n // ============================================================================\r\n\r\n /**\r\n * Create an INSTANT order\r\n *\r\n * Seller deposits tokens upfront, buyer pays and receives immediately.\r\n *\r\n * @example\r\n * ```typescript\r\n * // Approve first\r\n * await sdk.approve(sellToken, amount);\r\n *\r\n * const result = await sdk.marketplace.createInstantOrder({\r\n * sellToken: '0x...',\r\n * sellAmount: parseEther('1000'),\r\n * payToken: zeroAddress, // Native ETH\r\n * pricePerToken: parseEther('0.001'), // 0.001 ETH per token\r\n * expiryTTL: 7 * 24 * 60 * 60, // 7 days\r\n * });\r\n * ```\r\n */\r\n async createInstantOrder(\r\n params: CreateInstantOrderParams\r\n ): Promise<TransactionResult> {\r\n const wallet = this.requireWallet();\r\n\r\n const visibility =\r\n params.privateBuyers && params.privateBuyers.length > 0\r\n ? Visibility.PRIVATE\r\n : Visibility.PUBLIC;\r\n\r\n const expiry = BigInt(\r\n Math.floor(Date.now() / 1000) + (params.expiryTTL ?? 7 * 24 * 60 * 60)\r\n );\r\n\r\n const args = {\r\n payToken: params.payToken,\r\n price: params.pricePerToken,\r\n sellToken: params.sellToken,\r\n sellAmount: params.sellAmount,\r\n visibility,\r\n allowedBuyers: params.privateBuyers ?? [],\r\n expiry,\r\n };\r\n\r\n const hash = await wallet.writeContract({\r\n chain: wallet.chain,\r\n account: wallet.account!,\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'createOrderInstant',\r\n args: [args],\r\n });\r\n\r\n return this.createTransactionResult(hash);\r\n }\r\n\r\n /**\r\n * Create a VESTED order\r\n *\r\n * Seller deposits tokens that vest over time for the buyer.\r\n *\r\n * @example\r\n * ```typescript\r\n * const result = await sdk.marketplace.createVestedOrder({\r\n * sellToken: '0x...',\r\n * sellAmount: parseEther('10000'),\r\n * payToken: '0x...', // USDC\r\n * pricePerToken: 1000000n, // 1 USDC (6 decimals)\r\n * vestingDuration: 365 * 24 * 60 * 60, // 1 year\r\n * cliffDuration: 30 * 24 * 60 * 60, // 30 day cliff\r\n * startMode: 'upon_fill', // Vesting starts when order is filled\r\n * });\r\n * ```\r\n */\r\n async createVestedOrder(\r\n params: CreateVestedOrderParams\r\n ): Promise<TransactionResult> {\r\n const wallet = this.requireWallet();\r\n\r\n const visibility =\r\n params.privateBuyers && params.privateBuyers.length > 0\r\n ? Visibility.PRIVATE\r\n : Visibility.PUBLIC;\r\n\r\n const expiry = BigInt(\r\n Math.floor(Date.now() / 1000) + (params.expiryTTL ?? 7 * 24 * 60 * 60)\r\n );\r\n\r\n // Convert cliff duration to basis points (percentage of total duration)\r\n const cliffBps =\r\n params.cliffDuration && params.vestingDuration\r\n ? Math.floor((params.cliffDuration / params.vestingDuration) * 10000)\r\n : 0;\r\n\r\n const args = {\r\n payToken: params.payToken,\r\n price: params.pricePerToken,\r\n sellToken: params.sellToken,\r\n sellAmount: params.sellAmount,\r\n visibility,\r\n allowedBuyers: params.privateBuyers ?? [],\r\n expiry,\r\n vest: {\r\n startMode:\r\n params.startMode === 'fixed_timestamp'\r\n ? StartMode.FIXED_TIMESTAMP\r\n : StartMode.UPON_FILL,\r\n startAt: BigInt(params.fixedStartTime ?? 0),\r\n durationSec: params.vestingDuration,\r\n stepSec: 0, // Linear vesting\r\n cliffBps,\r\n },\r\n };\r\n\r\n const hash = await wallet.writeContract({\r\n chain: wallet.chain,\r\n account: wallet.account!,\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'createOrderVested',\r\n args: [args],\r\n });\r\n\r\n return this.createTransactionResult(hash);\r\n }\r\n\r\n /**\r\n * Create a TRADABLE order\r\n *\r\n * List an unvested campaign position for sale. No upfront deposit -\r\n * the position is transferred when the order is filled.\r\n *\r\n * @example\r\n * ```typescript\r\n * // Must have a position in a VestedAirdrop campaign with trading enabled\r\n * const result = await sdk.marketplace.createTradableOrder({\r\n * campaignId: 10n,\r\n * pricePerToken: parseEther('0.05'), // 0.05 ETH per token\r\n * payToken: zeroAddress, // Native ETH\r\n * expiryTTL: 30 * 24 * 60 * 60, // 30 days\r\n * });\r\n * console.log('Order created, tx:', result.hash);\r\n * ```\r\n */\r\n async createTradableOrder(\r\n params: CreateTradableOrderParams\r\n ): Promise<TransactionResult> {\r\n const wallet = this.requireWallet();\r\n\r\n const visibility =\r\n params.privateBuyers && params.privateBuyers.length > 0\r\n ? Visibility.PRIVATE\r\n : Visibility.PUBLIC;\r\n\r\n const expiry = BigInt(\r\n Math.floor(Date.now() / 1000) + (params.expiryTTL ?? 30 * 24 * 60 * 60)\r\n );\r\n\r\n const args = {\r\n payToken: params.payToken,\r\n price: params.pricePerToken,\r\n campaignId: params.campaignId,\r\n visibility,\r\n allowedBuyers: params.privateBuyers ?? [],\r\n expiry,\r\n escrowRouting: zeroAddress, // Default to no escrow routing\r\n };\r\n\r\n const hash = await wallet.writeContract({\r\n chain: wallet.chain,\r\n account: wallet.account!,\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'createOrderTradable',\r\n args: [args],\r\n });\r\n\r\n return this.createTransactionResult(hash);\r\n }\r\n\r\n // ============================================================================\r\n // Order Settlement\r\n // ============================================================================\r\n\r\n /**\r\n * Fill an order (buy)\r\n *\r\n * For native payment orders, send ETH as value.\r\n * For token payment orders, approve the Diamond first.\r\n *\r\n * @example\r\n * ```typescript\r\n * // Get quote first\r\n * const quote = await sdk.marketplace.getQuote(orderId);\r\n *\r\n * // Fill with native ETH\r\n * const result = await sdk.marketplace.fillOrder(orderId, {\r\n * value: quote.totalPrice,\r\n * });\r\n *\r\n * // Or fill with ERC20 (approve first)\r\n * await sdk.approve(payToken, quote.totalPrice);\r\n * await sdk.marketplace.fillOrder(orderId);\r\n * ```\r\n */\r\n async fillOrder(\r\n orderId: bigint,\r\n options?: { value?: bigint }\r\n ): Promise<TransactionResult> {\r\n const wallet = this.requireWallet();\r\n\r\n const hash = await wallet.writeContract({\r\n chain: wallet.chain,\r\n account: wallet.account!,\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'fillOrder',\r\n args: [orderId],\r\n value: options?.value,\r\n });\r\n\r\n return this.createTransactionResult(hash);\r\n }\r\n\r\n /**\r\n * Fill an order using Permit2 (gasless token approval)\r\n */\r\n async fillOrderWithPermit(params: {\r\n orderId: bigint;\r\n permit2Payload: Hex;\r\n }): Promise<TransactionResult> {\r\n const wallet = this.requireWallet();\r\n\r\n const hash = await wallet.writeContract({\r\n chain: wallet.chain,\r\n account: wallet.account!,\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'fillOrderWithPermit',\r\n args: [params.orderId, params.permit2Payload],\r\n });\r\n\r\n return this.createTransactionResult(hash);\r\n }\r\n\r\n /**\r\n * Cancel an order (seller only)\r\n *\r\n * Returns deposited tokens to seller.\r\n *\r\n * @example\r\n * ```typescript\r\n * const result = await sdk.marketplace.cancelOrder(orderId);\r\n * ```\r\n */\r\n async cancelOrder(orderId: bigint): Promise<TransactionResult> {\r\n const wallet = this.requireWallet();\r\n\r\n const hash = await wallet.writeContract({\r\n chain: wallet.chain,\r\n account: wallet.account!,\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'cancelOrder',\r\n args: [orderId],\r\n });\r\n\r\n return this.createTransactionResult(hash);\r\n }\r\n\r\n /**\r\n * Expire an order (anyone can call after expiry)\r\n *\r\n * Returns deposited tokens to seller.\r\n */\r\n async expireOrder(orderId: bigint): Promise<TransactionResult> {\r\n const wallet = this.requireWallet();\r\n\r\n const hash = await wallet.writeContract({\r\n chain: wallet.chain,\r\n account: wallet.account!,\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'expireOrder',\r\n args: [orderId],\r\n });\r\n\r\n return this.createTransactionResult(hash);\r\n }\r\n\r\n // ============================================================================\r\n // Order Queries\r\n // ============================================================================\r\n\r\n /**\r\n * Get order information by ID\r\n *\r\n * @example\r\n * ```typescript\r\n * const order = await sdk.marketplace.getOrder(1n);\r\n * console.log('Seller:', order.seller);\r\n * console.log('Price:', formatEther(order.totalPrice));\r\n * console.log('Status:', order.status);\r\n * ```\r\n */\r\n async getOrder(orderId: bigint): Promise<OrderInfo> {\r\n const result = await this.publicClient.readContract({\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'getOrder',\r\n args: [orderId],\r\n });\r\n\r\n return this.parseOrderInfo(result as unknown as OrderStruct);\r\n }\r\n\r\n /**\r\n * Get order quote (price breakdown)\r\n *\r\n * @example\r\n * ```typescript\r\n * const quote = await sdk.marketplace.getQuote(orderId);\r\n * console.log('Total price:', formatEther(quote.totalPrice));\r\n * console.log('Protocol fee:', formatEther(quote.protocolFee));\r\n * ```\r\n */\r\n async getQuote(orderId: bigint): Promise<OrderQuote> {\r\n const result = await this.publicClient.readContract({\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'quote',\r\n args: [orderId],\r\n }) as { payToken: Address; feeBps: number; price: bigint; feeAmount: bigint; proceeds: bigint };\r\n\r\n // Also get the order to know if it's still valid\r\n const order = await this.getOrder(orderId);\r\n\r\n return {\r\n orderId,\r\n totalPrice: result.price,\r\n protocolFee: result.feeAmount,\r\n buyerReceives: order.sellAmount,\r\n sellerReceives: result.proceeds,\r\n isValid: order.status === 'open' && order.expiresAt > Math.floor(Date.now() / 1000),\r\n expiresAt: order.expiresAt,\r\n };\r\n }\r\n\r\n /**\r\n * Get detailed quote for filling an order\r\n */\r\n async getQuoteFill(orderId: bigint): Promise<{\r\n payToken: Address;\r\n price: bigint;\r\n feeBps: number;\r\n feeAmount: bigint;\r\n feeReceiver: Address;\r\n proceeds: bigint;\r\n seller: Address;\r\n sellToken: Address;\r\n sellAmount: bigint;\r\n deliveryKind: number;\r\n escrowFlushedToRouting: boolean;\r\n }> {\r\n const result = await this.publicClient.readContract({\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'quoteFill',\r\n args: [orderId],\r\n }) as {\r\n payToken: Address;\r\n price: bigint;\r\n feeBps: number;\r\n feeAmount: bigint;\r\n feeReceiver: Address;\r\n proceeds: bigint;\r\n seller: Address;\r\n sellToken: Address;\r\n sellAmount: bigint;\r\n deliveryKind: number;\r\n escrowFlushedToRouting: boolean;\r\n };\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Get next order ID (also indicates total orders created)\r\n */\r\n async getNextOrderId(): Promise<bigint> {\r\n const result = await this.publicClient.readContract({\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'nextOrderId',\r\n args: [],\r\n });\r\n\r\n return result as bigint;\r\n }\r\n\r\n /**\r\n * Get orders by seller with pagination\r\n */\r\n async getOrdersBySeller(\r\n seller: Address,\r\n offset = 0,\r\n limit = 100\r\n ): Promise<OrderInfo[]> {\r\n const result = await this.publicClient.readContract({\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'ordersOf',\r\n args: [seller, BigInt(offset), BigInt(limit)],\r\n }) as unknown as OrderStruct[];\r\n\r\n return result.map((order) => this.parseOrderInfo(order));\r\n }\r\n\r\n /**\r\n * Get orders for a campaign\r\n */\r\n async getOrdersForCampaign(campaignId: bigint): Promise<{\r\n activeOrderId: bigint;\r\n historicalOrderIds: bigint[];\r\n }> {\r\n const result = await this.publicClient.readContract({\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'ordersByCampaign',\r\n args: [campaignId],\r\n }) as { activeOrderId: bigint; historicalOrderIds: bigint[] };\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Get active order for a campaign\r\n */\r\n async getActiveOrderForCampaign(campaignId: bigint): Promise<bigint> {\r\n const result = await this.publicClient.readContract({\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'getActiveOrderForCampaign',\r\n args: [campaignId],\r\n });\r\n\r\n return result as bigint;\r\n }\r\n\r\n /**\r\n * Preview available amount to sell for a campaign\r\n */\r\n async previewAvailableToSell(campaignId: bigint): Promise<{\r\n futureUnlockable: bigint;\r\n claimableNow: bigint;\r\n asOf: number;\r\n }> {\r\n const result = await this.publicClient.readContract({\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'previewAvailableToSell',\r\n args: [campaignId],\r\n }) as { futureUnlockable: bigint; claimableNow: bigint; asOf: bigint };\r\n\r\n return {\r\n futureUnlockable: result.futureUnlockable,\r\n claimableNow: result.claimableNow,\r\n asOf: Number(result.asOf),\r\n };\r\n }\r\n\r\n /**\r\n * Get all open orders\r\n */\r\n async getOpenOrders(limit = 100): Promise<OrderInfo[]> {\r\n const nextId = await this.getNextOrderId();\r\n const orders: OrderInfo[] = [];\r\n\r\n for (let i = 0n; i < nextId && orders.length < limit; i++) {\r\n try {\r\n const order = await this.getOrder(i);\r\n if (order.status === 'open') {\r\n orders.push(order);\r\n }\r\n } catch {\r\n // Order may not exist, skip\r\n }\r\n }\r\n\r\n return orders;\r\n }\r\n\r\n // ============================================================================\r\n // Validation\r\n // ============================================================================\r\n\r\n /**\r\n * Check if trading is allowed for a campaign\r\n */\r\n async isTradingEnabled(campaignId: bigint): Promise<boolean> {\r\n const result = await this.publicClient.readContract({\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'isTradeLocked',\r\n args: [campaignId],\r\n });\r\n return !(result as boolean);\r\n }\r\n\r\n // ============================================================================\r\n // Trade Policy (Creator Functions)\r\n // ============================================================================\r\n\r\n /**\r\n * Lock trading for a campaign (creator only)\r\n *\r\n * Prevents new orders from being created for this campaign.\r\n */\r\n async lockTrading(campaignId: bigint): Promise<TransactionResult> {\r\n const wallet = this.requireWallet();\r\n\r\n const hash = await wallet.writeContract({\r\n chain: wallet.chain,\r\n account: wallet.account!,\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'setTradeLocked',\r\n args: [campaignId, true],\r\n });\r\n\r\n return this.createTransactionResult(hash);\r\n }\r\n\r\n /**\r\n * Unlock trading for a campaign (creator only)\r\n */\r\n async unlockTrading(campaignId: bigint): Promise<TransactionResult> {\r\n const wallet = this.requireWallet();\r\n\r\n const hash = await wallet.writeContract({\r\n chain: wallet.chain,\r\n account: wallet.account!,\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'setTradeLocked',\r\n args: [campaignId, false],\r\n });\r\n\r\n return this.createTransactionResult(hash);\r\n }\r\n\r\n // ============================================================================\r\n // Utility Functions\r\n // ============================================================================\r\n\r\n /**\r\n * Calculate total price for a given amount at price per token\r\n */\r\n calculateTotalPrice(amount: bigint, pricePerToken: bigint): bigint {\r\n return (amount * pricePerToken) / BigInt(1e18);\r\n }\r\n\r\n /**\r\n * Check if payment is in native token (ETH/BNB/etc)\r\n */\r\n isNativePayment(payToken: Address): boolean {\r\n return payToken === zeroAddress;\r\n }\r\n\r\n // ============================================================================\r\n // Helpers\r\n // ============================================================================\r\n\r\n private requireWallet(): WalletClient {\r\n if (!this.walletClient) {\r\n throw new Error(\r\n 'Wallet client required for write operations. Initialize SDK with a signer.'\r\n );\r\n }\r\n return this.walletClient;\r\n }\r\n\r\n private parseOrderInfo(order: OrderStruct): OrderInfo {\r\n const orderTypeMap: Record<number, OrderType> = {\r\n 0: 'instant',\r\n 1: 'vested',\r\n 2: 'tradable',\r\n };\r\n\r\n const statusMap: Record<number, OrderInfo['status']> = {\r\n 0: 'open',\r\n 1: 'filled',\r\n 2: 'canceled',\r\n 3: 'expired',\r\n };\r\n\r\n const result: OrderInfo = {\r\n id: order.id,\r\n orderType: orderTypeMap[order.kind] ?? 'instant',\r\n seller: order.seller,\r\n sellToken: order.sellToken,\r\n sellAmount: order.sellAmount,\r\n payToken: order.payToken,\r\n totalPrice: order.price,\r\n pricePerToken: order.sellAmount > 0n\r\n ? (order.price * BigInt(1e18)) / order.sellAmount\r\n : 0n,\r\n status: statusMap[order.status] ?? 'open',\r\n createdAt: 0, // Not stored in Order struct\r\n expiresAt: Number(order.expiry),\r\n };\r\n\r\n // Add optional fields only if they have values\r\n if (order.campaignId > 0n) {\r\n result.campaignId = order.campaignId;\r\n }\r\n if (order.vest.durationSec > 0) {\r\n result.vestingDuration = order.vest.durationSec;\r\n }\r\n if (order.vest.cliffBps > 0) {\r\n result.cliffDuration = Math.floor((order.vest.durationSec * order.vest.cliffBps) / 10000);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private createTransactionResult(hash: Hash): TransactionResult {\r\n return {\r\n hash,\r\n wait: async () => {\r\n const receipt = await this.publicClient.waitForTransactionReceipt({\r\n hash,\r\n });\r\n return {\r\n blockNumber: receipt.blockNumber,\r\n transactionHash: receipt.transactionHash,\r\n gasUsed: receipt.gasUsed,\r\n status: receipt.status,\r\n logs: receipt.logs,\r\n };\r\n },\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Order struct matching contract\r\n */\r\ninterface OrderStruct {\r\n id: bigint;\r\n seller: Address;\r\n payToken: Address;\r\n price: bigint;\r\n kind: number;\r\n sellToken: Address;\r\n sellAmount: bigint;\r\n campaignId: bigint;\r\n visibility: number;\r\n allowedBuyers: readonly Address[];\r\n expiry: bigint;\r\n status: number;\r\n vest: {\r\n startMode: number;\r\n startAt: bigint;\r\n durationSec: number;\r\n stepSec: number;\r\n cliffBps: number;\r\n };\r\n listedBehaviour: number;\r\n escrowRouting: Address;\r\n}\r\n\r\nexport default MarketplaceModule;\r\n","/**\r\n * Automation Module\r\n *\r\n * Provides methods for keeper automation:\r\n * - Enable/disable auto-withdraw for vesting campaigns\r\n * - Enable/disable auto-release for locks\r\n * - Query automation status\r\n */\r\nimport {\r\n type PublicClient,\r\n type WalletClient,\r\n type Address,\r\n type Hash,\r\n} from 'viem';\r\nimport { DIAMOND_ABI } from '@pepay-streams/abi/diamond';\r\nimport type {\r\n EnableAutoWithdrawParams,\r\n EnableAutoReleaseParams,\r\n AutomationStatus,\r\n TransactionResult,\r\n} from '../types';\r\n\r\n/**\r\n * Automation module for keeper-powered operations\r\n */\r\nexport class AutomationModule {\r\n constructor(\r\n private readonly publicClient: PublicClient,\r\n private readonly walletClient: WalletClient | undefined,\r\n private readonly diamondAddress: Address\r\n ) {}\r\n\r\n // ============================================================================\r\n // Auto-Withdraw (for Vesting campaigns)\r\n // ============================================================================\r\n\r\n /**\r\n * Enable auto-withdraw for a vesting campaign\r\n *\r\n * Keepers will automatically claim vested tokens on behalf of recipients.\r\n *\r\n * @example\r\n * ```typescript\r\n * const result = await sdk.automation.enableAutoWithdraw({\r\n * campaignId: 1n,\r\n * frequency: 7 * 24 * 60 * 60, // Weekly\r\n * tipAmount: parseEther('0.1'), // 0.1 ETH for keeper\r\n * });\r\n * ```\r\n */\r\n async enableAutoWithdraw(\r\n params: EnableAutoWithdrawParams\r\n ): Promise<TransactionResult> {\r\n const wallet = this.requireWallet();\r\n\r\n const hash = await wallet.writeContract({\r\n chain: wallet.chain,\r\n account: wallet.account!,\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'enableAutoWithdraw',\r\n args: [params.campaignId, BigInt(params.frequency)],\r\n value: params.tipAmount ?? 0n,\r\n });\r\n\r\n return this.createTransactionResult(hash);\r\n }\r\n\r\n /**\r\n * Disable auto-withdraw for a campaign\r\n *\r\n * Returns remaining tip balance to caller.\r\n */\r\n async disableAutoWithdraw(campaignId: bigint): Promise<TransactionResult> {\r\n const wallet = this.requireWallet();\r\n\r\n const hash = await wallet.writeContract({\r\n chain: wallet.chain,\r\n account: wallet.account!,\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'disableAutoWithdraw',\r\n args: [campaignId],\r\n });\r\n\r\n return this.createTransactionResult(hash);\r\n }\r\n\r\n // ============================================================================\r\n // Auto-Release (for Lock campaigns)\r\n // ============================================================================\r\n\r\n /**\r\n * Enable auto-release for a lock campaign\r\n *\r\n * Keepers will automatically release tokens when unlock time passes.\r\n *\r\n * @example\r\n * ```typescript\r\n * const result = await sdk.automation.enableAutoRelease({\r\n * campaignId: 5n,\r\n * frequency: 3600, // Check every hour\r\n * tipAmount: parseEther('0.05'), // 0.05 ETH for keeper\r\n * });\r\n * ```\r\n */\r\n async enableAutoRelease(\r\n params: EnableAutoReleaseParams & { frequency?: number }\r\n ): Promise<TransactionResult> {\r\n const wallet = this.requireWallet();\r\n\r\n // Default frequency of 1 hour if not specified\r\n const frequency = params.frequency ?? 3600;\r\n\r\n const hash = await wallet.writeContract({\r\n chain: wallet.chain,\r\n account: wallet.account!,\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'enableAutoReleaseLock',\r\n args: [params.campaignId, BigInt(frequency)],\r\n value: params.tipAmount ?? 0n,\r\n });\r\n\r\n return this.createTransactionResult(hash);\r\n }\r\n\r\n /**\r\n * Disable auto-release for a lock campaign\r\n */\r\n async disableAutoRelease(campaignId: bigint): Promise<TransactionResult> {\r\n const wallet = this.requireWallet();\r\n\r\n const hash = await wallet.writeContract({\r\n chain: wallet.chain,\r\n account: wallet.account!,\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'disableAutoReleaseLock',\r\n args: [campaignId],\r\n });\r\n\r\n return this.createTransactionResult(hash);\r\n }\r\n\r\n // ============================================================================\r\n // Automation Status Queries\r\n // ============================================================================\r\n\r\n /**\r\n * Get auto-withdraw status for a campaign\r\n *\r\n * @example\r\n * ```typescript\r\n * const status = await sdk.automation.getAutoWithdrawStatus(campaignId);\r\n * console.log('Enabled:', status.enabled);\r\n * console.log('Next run:', new Date(status.nextRun * 1000));\r\n * console.log('Tip balance:', formatEther(status.tipBalance));\r\n * ```\r\n */\r\n async getAutoWithdrawStatus(campaignId: bigint): Promise<AutomationStatus> {\r\n const [config, pendingCount, cursor] = await Promise.all([\r\n this.publicClient.readContract({\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'automationConfig',\r\n args: [campaignId],\r\n }) as Promise<[boolean, bigint, bigint]>,\r\n this.publicClient.readContract({\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'recipientsPending',\r\n args: [campaignId],\r\n }) as Promise<bigint>,\r\n this.publicClient.readContract({\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'regCursor',\r\n args: [campaignId],\r\n }) as Promise<bigint>,\r\n ]);\r\n\r\n const [enabled, frequency, lastRun] = config;\r\n const nextRun = Number(lastRun) + Number(frequency);\r\n\r\n return {\r\n enabled,\r\n lastRun: Number(lastRun),\r\n nextRun,\r\n frequency: Number(frequency),\r\n tipBalance: 0n, // Tip balance is managed internally\r\n recipientsProcessed: Number(cursor),\r\n totalRecipients: Number(pendingCount) + Number(cursor),\r\n };\r\n }\r\n\r\n /**\r\n * Get auto-release status for a lock campaign\r\n */\r\n async getAutoReleaseStatus(campaignId: bigint): Promise<{\r\n enabled: boolean;\r\n frequency: number;\r\n lastRun: number;\r\n nextRun: number;\r\n }> {\r\n const config = await this.publicClient.readContract({\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'automationLockConfig',\r\n args: [campaignId],\r\n }) as [boolean, bigint, bigint];\r\n\r\n const [enabled, frequency, lastRun] = config;\r\n const nextRun = Number(lastRun) + Number(frequency);\r\n\r\n return {\r\n enabled,\r\n frequency: Number(frequency),\r\n lastRun: Number(lastRun),\r\n nextRun,\r\n };\r\n }\r\n\r\n /**\r\n * Preview automation for specific recipients\r\n */\r\n async previewAutomation(\r\n campaignId: bigint,\r\n recipients: Address[]\r\n ): Promise<{\r\n pendingCount: bigint;\r\n nextFeeWei: bigint;\r\n escrowWei: bigint;\r\n }> {\r\n const result = await this.publicClient.readContract({\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'automationPreviewFor',\r\n args: [campaignId, recipients],\r\n }) as [bigint, bigint, bigint];\r\n\r\n return {\r\n pendingCount: result[0],\r\n nextFeeWei: result[1],\r\n escrowWei: result[2],\r\n };\r\n }\r\n\r\n /**\r\n * Get automation run statistics\r\n */\r\n async getAutomationStats(\r\n campaignId: bigint,\r\n lockMode = false\r\n ): Promise<{\r\n runsObserved: number;\r\n avgRecipientsPerRun: number;\r\n lastRecipientsProcessed: number;\r\n maxRecipientsPerRun: number;\r\n }> {\r\n const result = await this.publicClient.readContract({\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'automationRunStats',\r\n args: [campaignId, lockMode],\r\n }) as {\r\n runsObserved: bigint;\r\n avgRecipientsPerRun: bigint;\r\n lastRecipientsProcessed: bigint;\r\n maxRecipientsPerRun: bigint;\r\n };\r\n\r\n return {\r\n runsObserved: Number(result.runsObserved),\r\n avgRecipientsPerRun: Number(result.avgRecipientsPerRun),\r\n lastRecipientsProcessed: Number(result.lastRecipientsProcessed),\r\n maxRecipientsPerRun: Number(result.maxRecipientsPerRun),\r\n };\r\n }\r\n\r\n /**\r\n * Check if auto-withdraw is currently runnable\r\n *\r\n * Returns true if cooldown has passed and there are pending recipients.\r\n */\r\n async isAutoWithdrawRunnable(campaignId: bigint): Promise<boolean> {\r\n const status = await this.getAutoWithdrawStatus(campaignId);\r\n const now = Math.floor(Date.now() / 1000);\r\n\r\n return (\r\n status.enabled &&\r\n now >= status.nextRun &&\r\n status.recipientsProcessed < status.totalRecipients\r\n );\r\n }\r\n\r\n /**\r\n * Check if auto-release is currently runnable\r\n */\r\n async isAutoReleaseRunnable(campaignId: bigint): Promise<boolean> {\r\n const status = await this.getAutoReleaseStatus(campaignId);\r\n const now = Math.floor(Date.now() / 1000);\r\n\r\n return status.enabled && now >= status.nextRun;\r\n }\r\n\r\n // ============================================================================\r\n // Keeper Functions (for automation operators)\r\n // ============================================================================\r\n\r\n /**\r\n * Execute auto-withdraw for specific recipients (keeper only)\r\n *\r\n * @example\r\n * ```typescript\r\n * // Get recipients from registry or external source\r\n * const recipients = ['0x...', '0x...', '0x...'];\r\n * await sdk.automation.executeAutoWithdraw(campaignId, recipients);\r\n * ```\r\n */\r\n async executeAutoWithdraw(\r\n campaignId: bigint,\r\n recipients: Address[]\r\n ): Promise<TransactionResult> {\r\n const wallet = this.requireWallet();\r\n\r\n const hash = await wallet.writeContract({\r\n chain: wallet.chain,\r\n account: wallet.account!,\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'autoWithdraw',\r\n args: [campaignId, recipients],\r\n });\r\n\r\n return this.createTransactionResult(hash);\r\n }\r\n\r\n /**\r\n * Execute auto-withdraw using registry cursor (keeper only)\r\n *\r\n * Processes up to batchSize recipients from the registry.\r\n */\r\n async executeAutoWithdrawNext(\r\n campaignId: bigint,\r\n batchSize = 50\r\n ): Promise<TransactionResult> {\r\n const wallet = this.requireWallet();\r\n\r\n const hash = await wallet.writeContract({\r\n chain: wallet.chain,\r\n account: wallet.account!,\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'autoWithdrawNext',\r\n args: [campaignId, BigInt(batchSize)],\r\n });\r\n\r\n return this.createTransactionResult(hash);\r\n }\r\n\r\n /**\r\n * Execute auto-release for specific recipients (keeper only)\r\n */\r\n async executeAutoRelease(\r\n campaignId: bigint,\r\n recipients: Address[]\r\n ): Promise<TransactionResult> {\r\n const wallet = this.requireWallet();\r\n\r\n const hash = await wallet.writeContract({\r\n chain: wallet.chain,\r\n account: wallet.account!,\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'autoReleaseLock',\r\n args: [campaignId, recipients],\r\n });\r\n\r\n return this.createTransactionResult(hash);\r\n }\r\n\r\n /**\r\n * Execute auto-release using registry cursor (keeper only)\r\n */\r\n async executeAutoReleaseNext(\r\n campaignId: bigint,\r\n batchSize = 50\r\n ): Promise<TransactionResult> {\r\n const wallet = this.requireWallet();\r\n\r\n const hash = await wallet.writeContract({\r\n chain: wallet.chain,\r\n account: wallet.account!,\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'autoReleaseLockNext',\r\n args: [campaignId, BigInt(batchSize)],\r\n });\r\n\r\n return this.createTransactionResult(hash);\r\n }\r\n\r\n // ============================================================================\r\n // Helpers\r\n // ============================================================================\r\n\r\n private requireWallet(): WalletClient {\r\n if (!this.walletClient) {\r\n throw new Error(\r\n 'Wallet client required for write operations. Initialize SDK with a signer.'\r\n );\r\n }\r\n return this.walletClient;\r\n }\r\n\r\n private createTransactionResult(hash: Hash): TransactionResult {\r\n return {\r\n hash,\r\n wait: async () => {\r\n const receipt = await this.publicClient.waitForTransactionReceipt({\r\n hash,\r\n });\r\n return {\r\n blockNumber: receipt.blockNumber,\r\n transactionHash: receipt.transactionHash,\r\n gasUsed: receipt.gasUsed,\r\n status: receipt.status,\r\n logs: receipt.logs,\r\n };\r\n },\r\n };\r\n }\r\n}\r\n\r\nexport default AutomationModule;\r\n","/**\r\n * API Client Module\r\n *\r\n * Provides methods for querying indexed blockchain data:\r\n * - Campaign queries\r\n * - Order queries\r\n * - Wallet activity\r\n * - Token information\r\n * - Staking pool queries\r\n */\r\nimport type { Address } from 'viem';\r\nimport type {\r\n ApiCampaign,\r\n ApiOrder,\r\n ApiStakingPool,\r\n PaginatedResponse,\r\n} from '../types';\r\n\r\n/**\r\n * Query parameters for campaigns\r\n */\r\nexport interface CampaignQueryParams {\r\n /** Filter by campaign kind */\r\n kind?: 'instant_airdrop' | 'vested_airdrop' | 'lock' | 'vesting';\r\n /** Filter by creator address */\r\n creator?: Address;\r\n /** Filter by token address */\r\n token?: Address;\r\n /** Filter by status */\r\n status?: 'active' | 'paused' | 'finalized';\r\n /** Page number (1-indexed) */\r\n page?: number;\r\n /** Items per page */\r\n pageSize?: number;\r\n /** Sort field */\r\n sortBy?: 'createdAt' | 'totalAllocated' | 'recipientCount';\r\n /** Sort direction */\r\n sortOrder?: 'asc' | 'desc';\r\n}\r\n\r\n/**\r\n * Query parameters for orders\r\n */\r\nexport interface OrderQueryParams {\r\n /** Filter by order type */\r\n orderType?: 'instant' | 'vested' | 'tradable';\r\n /** Filter by seller */\r\n seller?: Address;\r\n /** Filter by sell token */\r\n sellToken?: Address;\r\n /** Filter by pay token */\r\n payToken?: Address;\r\n /** Filter by status */\r\n status?: 'open' | 'filled' | 'canceled' | 'expired';\r\n /** Filter by campaign (for tradable) */\r\n campaignId?: string;\r\n /** Page number */\r\n page?: number;\r\n /** Items per page */\r\n pageSize?: number;\r\n /** Sort field */\r\n sortBy?: 'createdAt' | 'totalPrice' | 'expiresAt';\r\n /** Sort direction */\r\n sortOrder?: 'asc' | 'desc';\r\n}\r\n\r\n/**\r\n * Query parameters for staking pools\r\n */\r\nexport interface PoolQueryParams {\r\n /** Filter by stake token */\r\n stakeToken?: Address;\r\n /** Filter by reward token */\r\n rewardToken?: Address;\r\n /** Filter by creator */\r\n creator?: Address;\r\n /** Filter by active status */\r\n isActive?: boolean;\r\n /** Page number */\r\n page?: number;\r\n /** Items per page */\r\n pageSize?: number;\r\n}\r\n\r\n/**\r\n * Wallet activity summary\r\n */\r\nexport interface WalletActivity {\r\n address: Address;\r\n /** Campaigns where wallet is a recipient */\r\n campaigns: {\r\n id: string;\r\n kind: string;\r\n allocated: string;\r\n claimed: string;\r\n due: string;\r\n }[];\r\n /** Open orders created by wallet */\r\n openOrders: ApiOrder[];\r\n /** Staking positions */\r\n stakes: {\r\n poolId: string;\r\n amount: string;\r\n pendingRewards: string;\r\n }[];\r\n /** Total value across all positions (in USD if available) */\r\n totalValue?: string;\r\n}\r\n\r\n/**\r\n * Token information from enrichment\r\n */\r\nexport interface TokenInfo {\r\n address: Address;\r\n chainId: number;\r\n symbol: string;\r\n name: string;\r\n decimals: number;\r\n logoUrl?: string;\r\n priceUsd?: string;\r\n marketCap?: string;\r\n volume24h?: string;\r\n}\r\n\r\n/**\r\n * API client for indexed blockchain data\r\n */\r\nexport class ApiClient {\r\n private readonly baseUrl: string;\r\n private readonly chainId: number;\r\n\r\n constructor(baseUrl: string, chainId: number) {\r\n this.baseUrl = baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl;\r\n this.chainId = chainId;\r\n }\r\n\r\n // ============================================================================\r\n // Campaign Queries\r\n // ============================================================================\r\n\r\n /**\r\n * Get campaigns with optional filtering\r\n *\r\n * @example\r\n * ```typescript\r\n * const campaigns = await sdk.api.getCampaigns({\r\n * kind: 'vested_airdrop',\r\n * status: 'active',\r\n * page: 1,\r\n * pageSize: 20,\r\n * });\r\n * ```\r\n */\r\n async getCampaigns(\r\n params: CampaignQueryParams = {}\r\n ): Promise<PaginatedResponse<ApiCampaign>> {\r\n const searchParams = new URLSearchParams();\r\n\r\n if (params.kind) searchParams.set('kind', params.kind);\r\n if (params.creator) searchParams.set('creator', params.creator);\r\n if (params.token) searchParams.set('token', params.token);\r\n if (params.status) searchParams.set('status', params.status);\r\n if (params.page) searchParams.set('page', String(params.page));\r\n if (params.pageSize) searchParams.set('pageSize', String(params.pageSize));\r\n if (params.sortBy) searchParams.set('sortBy', params.sortBy);\r\n if (params.sortOrder) searchParams.set('sortOrder', params.sortOrder);\r\n\r\n searchParams.set('chainId', String(this.chainId));\r\n\r\n return this.fetch<PaginatedResponse<ApiCampaign>>(\r\n `/v1/campaigns?${searchParams.toString()}`\r\n );\r\n }\r\n\r\n /**\r\n * Get a single campaign by ID\r\n */\r\n async getCampaign(campaignId: string): Promise<ApiCampaign> {\r\n return this.fetch<ApiCampaign>(\r\n `/v1/campaigns/${campaignId}?chainId=${this.chainId}`\r\n );\r\n }\r\n\r\n /**\r\n * Get campaign recipients\r\n */\r\n async getCampaignRecipients(\r\n campaignId: string,\r\n params: { page?: number; pageSize?: number } = {}\r\n ): Promise<\r\n PaginatedResponse<{\r\n address: Address;\r\n allocated: string;\r\n claimed: string;\r\n blocked: boolean;\r\n }>\r\n > {\r\n const searchParams = new URLSearchParams();\r\n searchParams.set('chainId', String(this.chainId));\r\n if (params.page) searchParams.set('page', String(params.page));\r\n if (params.pageSize) searchParams.set('pageSize', String(params.pageSize));\r\n\r\n return this.fetch(\r\n `/v1/campaigns/${campaignId}/recipients?${searchParams.toString()}`\r\n );\r\n }\r\n\r\n /**\r\n * Get campaign activity/claims\r\n */\r\n async getCampaignActivity(\r\n campaignId: string,\r\n params: { page?: number; pageSize?: number } = {}\r\n ): Promise<\r\n PaginatedResponse<{\r\n recipient: Address;\r\n amount: string;\r\n timestamp: string;\r\n txHash: string;\r\n }>\r\n > {\r\n const searchParams = new URLSearchParams();\r\n searchParams.set('chainId', String(this.chainId));\r\n if (params.page) searchParams.set('page', String(params.page));\r\n if (params.pageSize) searchParams.set('pageSize', String(params.pageSize));\r\n\r\n return this.fetch(\r\n `/v1/campaigns/${campaignId}/activity?${searchParams.toString()}`\r\n );\r\n }\r\n\r\n // ============================================================================\r\n // Order Queries\r\n // ============================================================================\r\n\r\n /**\r\n * Get marketplace orders with optional filtering\r\n *\r\n * @example\r\n * ```typescript\r\n * const orders = await sdk.api.getOrders({\r\n * orderType: 'tradable',\r\n * status: 'open',\r\n * sortBy: 'totalPrice',\r\n * sortOrder: 'asc',\r\n * });\r\n * ```\r\n */\r\n async getOrders(\r\n params: OrderQueryParams = {}\r\n ): Promise<PaginatedResponse<ApiOrder>> {\r\n const searchParams = new URLSearchParams();\r\n\r\n if (params.orderType) searchParams.set('orderType', params.orderType);\r\n if (params.seller) searchParams.set('seller', params.seller);\r\n if (params.sellToken) searchParams.set('sellToken', params.sellToken);\r\n if (params.payToken) searchParams.set('payToken', params.payToken);\r\n if (params.status) searchParams.set('status', params.status);\r\n if (params.campaignId) searchParams.set('campaignId', params.campaignId);\r\n if (params.page) searchParams.set('page', String(params.page));\r\n if (params.pageSize) searchParams.set('pageSize', String(params.pageSize));\r\n if (params.sortBy) searchParams.set('sortBy', params.sortBy);\r\n if (params.sortOrder) searchParams.set('sortOrder', params.sortOrder);\r\n\r\n searchParams.set('chainId', String(this.chainId));\r\n\r\n return this.fetch<PaginatedResponse<ApiOrder>>(\r\n `/v1/marketplace/orders?${searchParams.toString()}`\r\n );\r\n }\r\n\r\n /**\r\n * Get a single order by ID\r\n */\r\n async getOrder(orderId: string): Promise<ApiOrder> {\r\n return this.fetch<ApiOrder>(\r\n `/v1/marketplace/orders/${orderId}?chainId=${this.chainId}`\r\n );\r\n }\r\n\r\n /**\r\n * Get order price quote\r\n */\r\n async getOrderQuote(orderId: string): Promise<{\r\n totalPrice: string;\r\n protocolFee: string;\r\n sellerReceives: string;\r\n isValid: boolean;\r\n }> {\r\n return this.fetch(\r\n `/v1/marketplace/orders/${orderId}/quote?chainId=${this.chainId}`\r\n );\r\n }\r\n\r\n // ============================================================================\r\n // Staking Queries\r\n // ============================================================================\r\n\r\n /**\r\n * Get staking pools with optional filtering\r\n */\r\n async getStakingPools(\r\n params: PoolQueryParams = {}\r\n ): Promise<PaginatedResponse<ApiStakingPool>> {\r\n const searchParams = new URLSearchParams();\r\n\r\n if (params.stakeToken) searchParams.set('stakeToken', params.stakeToken);\r\n if (params.rewardToken) searchParams.set('rewardToken', params.rewardToken);\r\n if (params.creator) searchParams.set('creator', params.creator);\r\n if (params.isActive !== undefined)\r\n searchParams.set('isActive', String(params.isActive));\r\n if (params.page) searchParams.set('page', String(params.page));\r\n if (params.pageSize) searchParams.set('pageSize', String(params.pageSize));\r\n\r\n searchParams.set('chainId', String(this.chainId));\r\n\r\n return this.fetch<PaginatedResponse<ApiStakingPool>>(\r\n `/v1/staking/pools?${searchParams.toString()}`\r\n );\r\n }\r\n\r\n /**\r\n * Get a single staking pool by ID\r\n */\r\n async getStakingPool(poolId: string): Promise<ApiStakingPool> {\r\n return this.fetch<ApiStakingPool>(\r\n `/v1/staking/pools/${poolId}?chainId=${this.chainId}`\r\n );\r\n }\r\n\r\n /**\r\n * Get stakers for a pool\r\n */\r\n async getPoolStakers(\r\n poolId: string,\r\n params: { page?: number; pageSize?: number } = {}\r\n ): Promise<\r\n PaginatedResponse<{\r\n address: Address;\r\n amount: string;\r\n pendingRewards: string;\r\n }>\r\n > {\r\n const searchParams = new URLSearchParams();\r\n searchParams.set('chainId', String(this.chainId));\r\n if (params.page) searchParams.set('page', String(params.page));\r\n if (params.pageSize) searchParams.set('pageSize', String(params.pageSize));\r\n\r\n return this.fetch(\r\n `/v1/staking/pools/${poolId}/stakers?${searchParams.toString()}`\r\n );\r\n }\r\n\r\n // ============================================================================\r\n // Wallet Queries\r\n // ============================================================================\r\n\r\n /**\r\n * Get wallet activity summary\r\n *\r\n * @example\r\n * ```typescript\r\n * const activity = await sdk.api.getWalletActivity(address);\r\n * console.log('Campaigns:', activity.campaigns.length);\r\n * console.log('Open orders:', activity.openOrders.length);\r\n * console.log('Stakes:', activity.stakes.length);\r\n * ```\r\n */\r\n async getWalletActivity(address: Address): Promise<WalletActivity> {\r\n return this.fetch<WalletActivity>(\r\n `/v1/wallets/${address}?chainId=${this.chainId}`\r\n );\r\n }\r\n\r\n /**\r\n * Get wallet claims history\r\n */\r\n async getWalletClaims(\r\n address: Address,\r\n params: { page?: number; pageSize?: number } = {}\r\n ): Promise<\r\n PaginatedResponse<{\r\n campaignId: string;\r\n amount: string;\r\n timestamp: string;\r\n txHash: string;\r\n }>\r\n > {\r\n const searchParams = new URLSearchParams();\r\n searchParams.set('chainId', String(this.chainId));\r\n if (params.page) searchParams.set('page', String(params.page));\r\n if (params.pageSize) searchParams.set('pageSize', String(params.pageSize));\r\n\r\n return this.fetch(\r\n `/v1/wallets/${address}/claims?${searchParams.toString()}`\r\n );\r\n }\r\n\r\n /**\r\n * Get wallet positions (campaigns where wallet has allocations)\r\n */\r\n async getWalletPositions(\r\n address: Address\r\n ): Promise<\r\n {\r\n campaignId: string;\r\n kind: string;\r\n token: Address;\r\n allocated: string;\r\n claimed: string;\r\n due: string;\r\n vestingProgress: number;\r\n }[]\r\n > {\r\n return this.fetch(\r\n `/v1/wallets/${address}/positions?chainId=${this.chainId}`\r\n );\r\n }\r\n\r\n // ============================================================================\r\n // Token Queries\r\n // ============================================================================\r\n\r\n /**\r\n * Search for tokens\r\n *\r\n * @example\r\n * ```typescript\r\n * const tokens = await sdk.api.searchTokens('USDC');\r\n * ```\r\n */\r\n async searchTokens(query: string): Promise<TokenInfo[]> {\r\n return this.fetch<TokenInfo[]>(\r\n `/v1/tokens?q=${encodeURIComponent(query)}&chainId=${this.chainId}`\r\n );\r\n }\r\n\r\n /**\r\n * Get token information by address\r\n */\r\n async getToken(address: Address): Promise<TokenInfo> {\r\n return this.fetch<TokenInfo>(\r\n `/v1/tokens/${address}?chainId=${this.chainId}`\r\n );\r\n }\r\n\r\n /**\r\n * Get token price\r\n */\r\n async getTokenPrice(address: Address): Promise<{\r\n priceUsd: string;\r\n priceChange24h: string;\r\n timestamp: string;\r\n }> {\r\n return this.fetch(\r\n `/v1/tokens/${address}/price?chainId=${this.chainId}`\r\n );\r\n }\r\n\r\n // ============================================================================\r\n // Health & Status\r\n // ============================================================================\r\n\r\n /**\r\n * Check API health\r\n */\r\n async health(): Promise<{\r\n status: 'ok' | 'degraded' | 'down';\r\n indexerBlockHeight: number;\r\n chainBlockHeight: number;\r\n lag: number;\r\n }> {\r\n return this.fetch('/health');\r\n }\r\n\r\n /**\r\n * Get supported chains\r\n */\r\n async getChains(): Promise<\r\n {\r\n chainId: number;\r\n name: string;\r\n rpcUrl: string;\r\n diamondAddress: Address;\r\n }[]\r\n > {\r\n return this.fetch('/v1/chains');\r\n }\r\n\r\n // ============================================================================\r\n // Actions (Transaction Preparation)\r\n // ============================================================================\r\n\r\n /**\r\n * Prepare a claim transaction\r\n *\r\n * Returns the calldata for a claim transaction.\r\n */\r\n async prepareClaimTx(params: {\r\n campaignId: string;\r\n recipient: Address;\r\n }): Promise<{\r\n to: Address;\r\n data: `0x${string}`;\r\n value: string;\r\n estimatedGas: string;\r\n }> {\r\n return this.fetch('/v1/actions/claim', {\r\n method: 'POST',\r\n body: JSON.stringify({\r\n ...params,\r\n chainId: this.chainId,\r\n }),\r\n });\r\n }\r\n\r\n /**\r\n * Prepare a fill order transaction\r\n */\r\n async prepareFillOrderTx(params: {\r\n orderId: string;\r\n }): Promise<{\r\n to: Address;\r\n data: `0x${string}`;\r\n value: string;\r\n estimatedGas: string;\r\n }> {\r\n return this.fetch('/v1/actions/fill-order', {\r\n method: 'POST',\r\n body: JSON.stringify({\r\n ...params,\r\n chainId: this.chainId,\r\n }),\r\n });\r\n }\r\n\r\n // ============================================================================\r\n // Helpers\r\n // ============================================================================\r\n\r\n private async fetch<T>(\r\n endpoint: string,\r\n options: RequestInit = {}\r\n ): Promise<T> {\r\n const url = `${this.baseUrl}${endpoint}`;\r\n\r\n const response = await fetch(url, {\r\n ...options,\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n ...options.headers,\r\n },\r\n });\r\n\r\n if (!response.ok) {\r\n const error = await response.text();\r\n throw new ApiError(response.status, error);\r\n }\r\n\r\n return response.json() as Promise<T>;\r\n }\r\n}\r\n\r\n/**\r\n * API error class\r\n */\r\nexport class ApiError extends Error {\r\n constructor(\r\n public readonly status: number,\r\n message: string\r\n ) {\r\n super(`API Error (${status}): ${message}`);\r\n this.name = 'ApiError';\r\n }\r\n}\r\n\r\nexport default ApiClient;\r\n","/**\r\n * Main Pepay Streams SDK Client\r\n *\r\n * Unified interface for all Pepay Streams operations:\r\n * - Campaign creation and management\r\n * - Token claiming\r\n * - Staking pools\r\n * - P2P marketplace\r\n * - Automation\r\n * - API queries\r\n */\r\nimport {\r\n createPublicClient,\r\n createWalletClient,\r\n http,\r\n custom,\r\n type PublicClient,\r\n type WalletClient,\r\n type Address,\r\n type Chain,\r\n erc20Abi,\r\n} from 'viem';\r\n\r\n// Browser wallet types\r\ndeclare global {\r\n // eslint-disable-next-line @typescript-eslint/consistent-type-definitions\r\n interface Window {\r\n ethereum?: {\r\n request: (args: { method: string }) => Promise<Address[]>;\r\n };\r\n }\r\n}\r\nimport { DIAMOND_ABI } from '@pepay-streams/abi/diamond';\r\nimport type { PepayStreamsConfig, TransactionResult } from './types';\r\nimport { CampaignsModule } from './campaigns';\r\nimport { ClaimsModule } from './claims';\r\nimport { StakingModule } from './staking';\r\nimport { MarketplaceModule } from './marketplace';\r\nimport { AutomationModule } from './automation';\r\nimport { ApiClient } from './api';\r\n\r\n// Chain configurations\r\nconst CHAINS: Record<number, Chain> = {\r\n 1: {\r\n id: 1,\r\n name: 'Ethereum',\r\n nativeCurrency: { name: 'Ether', symbol: 'ETH', decimals: 18 },\r\n rpcUrls: { default: { http: ['https://eth.llamarpc.com'] } },\r\n } as Chain,\r\n 56: {\r\n id: 56,\r\n name: 'BNB Smart Chain',\r\n nativeCurrency: { name: 'BNB', symbol: 'BNB', decimals: 18 },\r\n rpcUrls: { default: { http: ['https://bsc-dataseed.binance.org'] } },\r\n } as Chain,\r\n 31337: {\r\n id: 31337,\r\n name: 'Anvil Local',\r\n nativeCurrency: { name: 'Ether', symbol: 'ETH', decimals: 18 },\r\n rpcUrls: { default: { http: ['http://127.0.0.1:8545'] } },\r\n } as Chain,\r\n};\r\n\r\n// Canonical addresses\r\nconst PERMIT2_ADDRESS = '0x000000000022D473030F116dDEE9F6B43aC78BA3' as const;\r\nconst WETH_ADDRESSES: Record<number, Address> = {\r\n 1: '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2',\r\n 56: '0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c', // WBNB\r\n 31337: '0x2bdCC0de6bE1f7D2ee689a0342D76F52E8EFABa3', // Local WETH\r\n};\r\n\r\n/**\r\n * Pepay Streams SDK Client\r\n *\r\n * The main entry point for interacting with Pepay Streams protocol.\r\n *\r\n * @example\r\n * ```typescript\r\n * import { PepayStreamsClient } from '@pepay-streams/sdk';\r\n *\r\n * // Read-only client\r\n * const client = new PepayStreamsClient({\r\n * rpcUrl: 'https://eth.llamarpc.com',\r\n * diamondAddress: '0x...',\r\n * chainId: 1,\r\n * });\r\n *\r\n * // Client with signer (for transactions)\r\n * const clientWithSigner = new PepayStreamsClient({\r\n * rpcUrl: 'https://eth.llamarpc.com',\r\n * diamondAddress: '0x...',\r\n * chainId: 1,\r\n * }).withSigner(walletClient);\r\n *\r\n * // Or use browser wallet\r\n * const browserClient = PepayStreamsClient.fromBrowserWallet({\r\n * diamondAddress: '0x...',\r\n * chainId: 1,\r\n * });\r\n * ```\r\n */\r\nexport class PepayStreamsClient {\r\n readonly publicClient: PublicClient;\r\n readonly walletClient: WalletClient | undefined;\r\n readonly diamondAddress: Address;\r\n readonly chainId: number;\r\n readonly wethAddress: Address;\r\n readonly permit2Address: Address;\r\n\r\n // Modules\r\n readonly campaigns: CampaignsModule;\r\n readonly claims: ClaimsModule;\r\n readonly staking: StakingModule;\r\n readonly marketplace: MarketplaceModule;\r\n readonly automation: AutomationModule;\r\n readonly api: ApiClient | undefined;\r\n\r\n constructor(config: PepayStreamsConfig) {\r\n this.diamondAddress = config.diamondAddress;\r\n this.chainId = config.chainId;\r\n this.wethAddress = config.wethAddress ?? WETH_ADDRESSES[config.chainId] ?? '0x0000000000000000000000000000000000000000';\r\n this.permit2Address = config.permit2Address ?? PERMIT2_ADDRESS;\r\n\r\n // Create public client\r\n const chain = CHAINS[config.chainId];\r\n this.publicClient = createPublicClient({\r\n chain,\r\n transport: http(config.rpcUrl),\r\n });\r\n\r\n // Initialize modules\r\n this.campaigns = new CampaignsModule(\r\n this.publicClient,\r\n undefined,\r\n this.diamondAddress\r\n );\r\n this.claims = new ClaimsModule(\r\n this.publicClient,\r\n undefined,\r\n this.diamondAddress,\r\n this.chainId\r\n );\r\n this.staking = new StakingModule(\r\n this.publicClient,\r\n undefined,\r\n this.diamondAddress\r\n );\r\n this.marketplace = new MarketplaceModule(\r\n this.publicClient,\r\n undefined,\r\n this.diamondAddress\r\n );\r\n this.automation = new AutomationModule(\r\n this.publicClient,\r\n undefined,\r\n this.diamondAddress\r\n );\r\n\r\n // Initialize API client if URL provided\r\n if (config.apiBaseUrl) {\r\n this.api = new ApiClient(config.apiBaseUrl, config.chainId);\r\n }\r\n }\r\n\r\n /**\r\n * Create a client with a wallet for signing transactions\r\n */\r\n withSigner(walletClient: WalletClient): PepayStreamsClientWithSigner {\r\n return new PepayStreamsClientWithSigner(\r\n this.publicClient,\r\n walletClient,\r\n this.diamondAddress,\r\n this.chainId,\r\n this.wethAddress,\r\n this.permit2Address,\r\n this.api\r\n );\r\n }\r\n\r\n /**\r\n * Create a client from browser wallet (window.ethereum)\r\n */\r\n static async fromBrowserWallet(config: {\r\n diamondAddress: Address;\r\n chainId: number;\r\n apiBaseUrl?: string;\r\n }): Promise<PepayStreamsClientWithSigner> {\r\n if (typeof window === 'undefined' || !window.ethereum) {\r\n throw new Error('Browser wallet not available');\r\n }\r\n\r\n const ethereum = window.ethereum;\r\n\r\n // Request account access\r\n const accounts = await ethereum.request({\r\n method: 'eth_requestAccounts',\r\n });\r\n\r\n if (!accounts[0]) {\r\n throw new Error('No account available');\r\n }\r\n\r\n const chain = CHAINS[config.chainId];\r\n if (!chain) {\r\n throw new Error(`Chain ${config.chainId} not supported`);\r\n }\r\n\r\n const publicClient = createPublicClient({\r\n chain,\r\n transport: custom(ethereum),\r\n });\r\n\r\n const walletClient = createWalletClient({\r\n chain,\r\n transport: custom(ethereum),\r\n account: accounts[0],\r\n });\r\n\r\n return new PepayStreamsClientWithSigner(\r\n publicClient,\r\n walletClient,\r\n config.diamondAddress,\r\n config.chainId,\r\n WETH_ADDRESSES[config.chainId] ?? '0x0000000000000000000000000000000000000000',\r\n PERMIT2_ADDRESS,\r\n config.apiBaseUrl ? new ApiClient(config.apiBaseUrl, config.chainId) : undefined\r\n );\r\n }\r\n\r\n /**\r\n * Create a client with private key (for Node.js/scripts)\r\n */\r\n static fromPrivateKey(config: PepayStreamsConfig & { privateKey: `0x${string}` }): PepayStreamsClientWithSigner {\r\n const chain = CHAINS[config.chainId];\r\n if (!chain) {\r\n throw new Error(`Chain ${config.chainId} not supported`);\r\n }\r\n\r\n const publicClient = createPublicClient({\r\n chain,\r\n transport: http(config.rpcUrl),\r\n });\r\n\r\n // Import account from private key\r\n const { privateKeyToAccount } = require('viem/accounts');\r\n const account = privateKeyToAccount(config.privateKey);\r\n\r\n const walletClient = createWalletClient({\r\n chain,\r\n transport: http(config.rpcUrl),\r\n account,\r\n });\r\n\r\n return new PepayStreamsClientWithSigner(\r\n publicClient,\r\n walletClient,\r\n config.diamondAddress,\r\n config.chainId,\r\n config.wethAddress ?? WETH_ADDRESSES[config.chainId] ?? '0x0000000000000000000000000000000000000000',\r\n config.permit2Address ?? PERMIT2_ADDRESS,\r\n config.apiBaseUrl ? new ApiClient(config.apiBaseUrl, config.chainId) : undefined\r\n );\r\n }\r\n\r\n // ============================================================================\r\n // Read-only utilities\r\n // ============================================================================\r\n\r\n /**\r\n * Get token balance\r\n */\r\n async getTokenBalance(token: Address, account: Address): Promise<bigint> {\r\n return this.publicClient.readContract({\r\n address: token,\r\n abi: erc20Abi,\r\n functionName: 'balanceOf',\r\n args: [account],\r\n });\r\n }\r\n\r\n /**\r\n * Get token allowance for Diamond contract\r\n */\r\n async getTokenAllowance(token: Address, owner: Address): Promise<bigint> {\r\n return this.publicClient.readContract({\r\n address: token,\r\n abi: erc20Abi,\r\n functionName: 'allowance',\r\n args: [owner, this.diamondAddress],\r\n });\r\n }\r\n\r\n /**\r\n * Get token info (symbol, decimals, name)\r\n */\r\n async getTokenInfo(token: Address): Promise<{\r\n symbol: string;\r\n decimals: number;\r\n name: string;\r\n }> {\r\n const [symbol, decimals, name] = await Promise.all([\r\n this.publicClient.readContract({\r\n address: token,\r\n abi: erc20Abi,\r\n functionName: 'symbol',\r\n }) as Promise<string>,\r\n this.publicClient.readContract({\r\n address: token,\r\n abi: erc20Abi,\r\n functionName: 'decimals',\r\n }) as Promise<number>,\r\n this.publicClient.readContract({\r\n address: token,\r\n abi: erc20Abi,\r\n functionName: 'name',\r\n }) as Promise<string>,\r\n ]);\r\n\r\n return { symbol, decimals, name };\r\n }\r\n\r\n /**\r\n * Get version of a specific facet\r\n *\r\n * @param facetAddress - The address of the facet to query\r\n */\r\n async getFacetVersion(facetAddress: Address): Promise<string> {\r\n const result = await this.publicClient.readContract({\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'getVersion',\r\n args: [facetAddress],\r\n });\r\n return result as string;\r\n }\r\n\r\n /**\r\n * Get all facet versions\r\n */\r\n async getAllVersions(): Promise<{ facets: Address[]; versions: string[] }> {\r\n const result = await this.publicClient.readContract({\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'getAllVersions',\r\n });\r\n const [facets, versions] = result as [Address[], string[]];\r\n return { facets, versions };\r\n }\r\n\r\n /**\r\n * Check if Diamond contract is in emergency pause\r\n */\r\n async isEmergencyPaused(): Promise<boolean> {\r\n const result = await this.publicClient.readContract({\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'isEmergencyPaused',\r\n });\r\n return result as boolean;\r\n }\r\n}\r\n\r\n/**\r\n * Client with signer for write operations\r\n */\r\nexport class PepayStreamsClientWithSigner extends PepayStreamsClient {\r\n override readonly walletClient: WalletClient;\r\n override readonly campaigns: CampaignsModule;\r\n override readonly claims: ClaimsModule;\r\n override readonly staking: StakingModule;\r\n override readonly marketplace: MarketplaceModule;\r\n override readonly automation: AutomationModule;\r\n\r\n constructor(\r\n publicClient: PublicClient,\r\n walletClient: WalletClient,\r\n diamondAddress: Address,\r\n chainId: number,\r\n wethAddress: Address,\r\n permit2Address: Address,\r\n apiClient?: ApiClient\r\n ) {\r\n // Create base config\r\n const config: PepayStreamsConfig = {\r\n rpcUrl: '', // Not used, we pass clients directly\r\n diamondAddress,\r\n chainId,\r\n wethAddress,\r\n permit2Address,\r\n };\r\n\r\n // Call parent with minimal config\r\n super(config);\r\n\r\n // Override with provided clients\r\n (this as { publicClient: PublicClient }).publicClient = publicClient;\r\n this.walletClient = walletClient;\r\n if (apiClient) {\r\n (this as { api: ApiClient }).api = apiClient;\r\n }\r\n\r\n // Reinitialize modules with wallet client\r\n this.campaigns = new CampaignsModule(\r\n publicClient,\r\n walletClient,\r\n diamondAddress\r\n );\r\n this.claims = new ClaimsModule(\r\n publicClient,\r\n walletClient,\r\n diamondAddress,\r\n chainId\r\n );\r\n this.staking = new StakingModule(\r\n publicClient,\r\n walletClient,\r\n diamondAddress\r\n );\r\n this.marketplace = new MarketplaceModule(\r\n publicClient,\r\n walletClient,\r\n diamondAddress\r\n );\r\n this.automation = new AutomationModule(\r\n publicClient,\r\n walletClient,\r\n diamondAddress\r\n );\r\n }\r\n\r\n /**\r\n * Get the connected wallet address\r\n */\r\n get address(): Address {\r\n if (!this.walletClient.account) {\r\n throw new Error('No account connected');\r\n }\r\n return this.walletClient.account.address;\r\n }\r\n\r\n // ============================================================================\r\n // Token Operations\r\n // ============================================================================\r\n\r\n /**\r\n * Approve tokens for the Diamond contract\r\n *\r\n * @example\r\n * ```typescript\r\n * await client.approve(tokenAddress, parseEther('1000'));\r\n * ```\r\n */\r\n async approve(\r\n token: Address,\r\n amount: bigint\r\n ): Promise<TransactionResult> {\r\n const hash = await this.walletClient.writeContract({\r\n chain: this.walletClient.chain,\r\n account: this.walletClient.account!,\r\n address: token,\r\n abi: erc20Abi,\r\n functionName: 'approve',\r\n args: [this.diamondAddress, amount],\r\n });\r\n\r\n return {\r\n hash,\r\n wait: async () => {\r\n const receipt = await this.publicClient.waitForTransactionReceipt({\r\n hash,\r\n });\r\n return {\r\n blockNumber: receipt.blockNumber,\r\n transactionHash: receipt.transactionHash,\r\n gasUsed: receipt.gasUsed,\r\n status: receipt.status,\r\n logs: receipt.logs,\r\n };\r\n },\r\n };\r\n }\r\n\r\n /**\r\n * Approve max tokens (type(uint256).max)\r\n */\r\n async approveMax(token: Address): Promise<TransactionResult> {\r\n const MAX_UINT256 = 2n ** 256n - 1n;\r\n return this.approve(token, MAX_UINT256);\r\n }\r\n\r\n /**\r\n * Check and approve if needed\r\n */\r\n async ensureAllowance(\r\n token: Address,\r\n requiredAmount: bigint\r\n ): Promise<TransactionResult | null> {\r\n const currentAllowance = await this.getTokenAllowance(\r\n token,\r\n this.address\r\n );\r\n\r\n if (currentAllowance >= requiredAmount) {\r\n return null; // Already approved\r\n }\r\n\r\n return this.approve(token, requiredAmount);\r\n }\r\n\r\n /**\r\n * Get native balance (ETH/BNB)\r\n */\r\n async getNativeBalance(): Promise<bigint> {\r\n return this.publicClient.getBalance({ address: this.address });\r\n }\r\n}\r\n\r\nexport default PepayStreamsClient;\r\n"]}