From fd687f264ccdefca8a703bf9c4b131904155ccb2 Mon Sep 17 00:00:00 2001 From: "k.c" Date: Sat, 27 Dec 2025 06:24:50 +1000 Subject: [PATCH 1/2] make collection tx in one transaction --- lib/moment/collectMoment.ts | 22 ++++++++--------- ...teSplitFunds.ts => distributeSplitCall.ts} | 24 +++++++------------ 2 files changed, 19 insertions(+), 27 deletions(-) rename lib/splits/{distributeSplitFunds.ts => distributeSplitCall.ts} (61%) diff --git a/lib/moment/collectMoment.ts b/lib/moment/collectMoment.ts index 733b5f8c8..fe2766a76 100644 --- a/lib/moment/collectMoment.ts +++ b/lib/moment/collectMoment.ts @@ -4,7 +4,7 @@ import { CHAIN_ID, IS_TESTNET, USDC_ADDRESS } from "@/lib/consts"; import { sendUserOperation } from "@/lib/coinbase/sendUserOperation"; import { getOrCreateSmartWallet } from "../coinbase/getOrCreateSmartWallet"; import { collectSchema } from "../schema/collectSchema"; -import { distributeSplitFunds } from "../splits/distributeSplitFunds"; +import { distributeSplitCall } from "../splits/distributeSplitCall"; import isSplitContract from "../splits/isSplitContract"; import { MomentType } from "@/types/moment"; import getCollectCall from "../viem/getCollectCall"; @@ -53,28 +53,28 @@ export async function collectMoment({ amount ); - const calls = [...approveCall, collectCall] as readonly OneOf< - Call - >[]; - // Send the transaction and wait for receipt using the helper - const transaction = await sendUserOperation({ - smartAccount, - network: IS_TESTNET ? "base-sepolia" : "base", - calls, - }); + const calls = [...approveCall, collectCall] as OneOf>[]; // Distribute funds from split contract if fundsRecipient is a split if (saleConfig.fundsRecipient) { const isSplit = await isSplitContract(saleConfig.fundsRecipient as Address, CHAIN_ID); if (isSplit) { - await distributeSplitFunds({ + const splitCall = await distributeSplitCall({ splitAddress: saleConfig.fundsRecipient, tokenAddress: saleConfig.type === MomentType.Erc20Mint ? USDC_ADDRESS : zeroAddress, // zeroAddress for native ETH smartAccount, }); + calls.push(splitCall); } } + // Send the transaction and wait for receipt using the helper + const transaction = await sendUserOperation({ + smartAccount, + network: IS_TESTNET ? "base-sepolia" : "base", + calls, + }); + return { hash: transaction.transactionHash as Hash, chainId: CHAIN_ID, diff --git a/lib/splits/distributeSplitFunds.ts b/lib/splits/distributeSplitCall.ts similarity index 61% rename from lib/splits/distributeSplitFunds.ts rename to lib/splits/distributeSplitCall.ts index b544423cd..9b0fe7602 100644 --- a/lib/splits/distributeSplitFunds.ts +++ b/lib/splits/distributeSplitCall.ts @@ -1,15 +1,15 @@ import { Address, Hash } from "viem"; -import { CHAIN_ID, IS_TESTNET, USDC_ADDRESS } from "@/lib/consts"; +import { CHAIN_ID, USDC_ADDRESS } from "@/lib/consts"; import { getSplitsClient } from "./getSplitsClient"; import { getPublicClient } from "@/lib/viem/publicClient"; -import { sendUserOperation } from "@/lib/coinbase/sendUserOperation"; import { EvmSmartAccount } from "@coinbase/cdp-sdk"; +import { Call } from "@coinbase/coinbase-sdk/dist/types/calls"; /** * Distributes funds from a split contract to its recipients. * Uses 0xSplits SDK to generate the distribution call data and executes it via smart wallet. */ -export async function distributeSplitFunds({ +export async function distributeSplitCall({ splitAddress, tokenAddress = USDC_ADDRESS, smartAccount, @@ -17,7 +17,7 @@ export async function distributeSplitFunds({ splitAddress: Address; tokenAddress?: Address; smartAccount: EvmSmartAccount; -}): Promise { +}): Promise> { const publicClient = getPublicClient(CHAIN_ID); const splitsClient = getSplitsClient({ chainId: CHAIN_ID, @@ -30,16 +30,8 @@ export async function distributeSplitFunds({ distributorAddress: smartAccount.address, }); - const distributeTransaction = await sendUserOperation({ - smartAccount, - network: IS_TESTNET ? "base-sepolia" : "base", - calls: [ - { - to: distributeCallData.address as Address, - data: distributeCallData.data, - }, - ], - }); - - return distributeTransaction.transactionHash as Hash; + return { + to: distributeCallData.address as Address, + data: distributeCallData.data, + }; } From d0d6148a782ed7cea4a750308263ea601d0edc4b Mon Sep 17 00:00:00 2001 From: "k.c" Date: Sat, 27 Dec 2025 06:26:48 +1000 Subject: [PATCH 2/2] fix comment --- lib/moment/collectMoment.ts | 5 ++--- lib/splits/{distributeSplitCall.ts => distributeCall.ts} | 7 ++++--- 2 files changed, 6 insertions(+), 6 deletions(-) rename lib/splits/{distributeSplitCall.ts => distributeCall.ts} (79%) diff --git a/lib/moment/collectMoment.ts b/lib/moment/collectMoment.ts index fe2766a76..668624ea7 100644 --- a/lib/moment/collectMoment.ts +++ b/lib/moment/collectMoment.ts @@ -4,7 +4,7 @@ import { CHAIN_ID, IS_TESTNET, USDC_ADDRESS } from "@/lib/consts"; import { sendUserOperation } from "@/lib/coinbase/sendUserOperation"; import { getOrCreateSmartWallet } from "../coinbase/getOrCreateSmartWallet"; import { collectSchema } from "../schema/collectSchema"; -import { distributeSplitCall } from "../splits/distributeSplitCall"; +import { distributeCall } from "../splits/distributeCall"; import isSplitContract from "../splits/isSplitContract"; import { MomentType } from "@/types/moment"; import getCollectCall from "../viem/getCollectCall"; @@ -55,11 +55,10 @@ export async function collectMoment({ const calls = [...approveCall, collectCall] as OneOf>[]; - // Distribute funds from split contract if fundsRecipient is a split if (saleConfig.fundsRecipient) { const isSplit = await isSplitContract(saleConfig.fundsRecipient as Address, CHAIN_ID); if (isSplit) { - const splitCall = await distributeSplitCall({ + const splitCall = await distributeCall({ splitAddress: saleConfig.fundsRecipient, tokenAddress: saleConfig.type === MomentType.Erc20Mint ? USDC_ADDRESS : zeroAddress, // zeroAddress for native ETH smartAccount, diff --git a/lib/splits/distributeSplitCall.ts b/lib/splits/distributeCall.ts similarity index 79% rename from lib/splits/distributeSplitCall.ts rename to lib/splits/distributeCall.ts index 9b0fe7602..dd7e727b3 100644 --- a/lib/splits/distributeSplitCall.ts +++ b/lib/splits/distributeCall.ts @@ -6,10 +6,11 @@ import { EvmSmartAccount } from "@coinbase/cdp-sdk"; import { Call } from "@coinbase/coinbase-sdk/dist/types/calls"; /** - * Distributes funds from a split contract to its recipients. - * Uses 0xSplits SDK to generate the distribution call data and executes it via smart wallet. + * Generates call data to distribute funds from a split contract to its recipients. + * Uses 0xSplits SDK to generate the distribution call data. + * Returns a Call object that can be executed via smart wallet. */ -export async function distributeSplitCall({ +export async function distributeCall({ splitAddress, tokenAddress = USDC_ADDRESS, smartAccount,