CFA Forwarder
API reference for Constant Flow Agreement Forwarder
The CFA Forwarder provides a simplified interface for managing token streams (flows). It handles the complexity of interacting with the CFA agreement directly.
Contract Addresses
import { cfaForwarderAddress } from "@sfpro/sdk/abi"
import { mainnet } from "viem/chains"
// Get CFA Forwarder address for a specific chain
const forwarderAddress = cfaForwarderAddress[mainnet.id]
Read Functions
getFlowrate
Get the current flowrate between a sender and receiver.
import { useReadCfaForwarder } from "@sfpro/sdk/hook"
const { data: flowrate } = useReadCfaForwarder({
functionName: "getFlowrate",
args: ["0x...", "0x...", "0x..."] // Token, sender, receiver
})
import { cfaForwarderAbi, cfaForwarderAddress } from "@sfpro/sdk/abi"
import { createPublicClient, http } from "viem"
import { mainnet } from "viem/chains"
const client = createPublicClient({
chain: mainnet,
transport: http()
})
const flowrate = await client.readContract({
address: cfaForwarderAddress[mainnet.id],
abi: cfaForwarderAbi,
functionName: "getFlowrate",
args: [
"0x...", // Super Token address
"0x...", // Sender address
"0x..." // Receiver address
]
})
import { readCfaForwarder } from "@sfpro/sdk/action"
import { createConfig } from "@wagmi/core"
import { http } from "viem"
import { mainnet } from "viem/chains"
const config = createConfig({
chains: [mainnet],
transports: { [mainnet.id]: http() }
})
const flowrate = await readCfaForwarder(config, {
chainId: mainnet.id,
functionName: "getFlowrate",
args: ["0x...", "0x...", "0x..."] // Token, sender, receiver
})
getAccountFlowrate
Get the net flowrate for an account (total inflow - total outflow).
import { useReadCfaForwarder } from "@sfpro/sdk/hook"
const { data: netFlowrate } = useReadCfaForwarder({
functionName: "getAccountFlowrate",
args: ["0x...", "0x..."] // Token, account
})
import { cfaForwarderAbi, cfaForwarderAddress } from "@sfpro/sdk/abi"
import { createPublicClient, http } from "viem"
import { mainnet } from "viem/chains"
const client = createPublicClient({
chain: mainnet,
transport: http()
})
const netFlowrate = await client.readContract({
address: cfaForwarderAddress[mainnet.id],
abi: cfaForwarderAbi,
functionName: "getAccountFlowrate",
args: [
"0x...", // Super Token address
"0x..." // Account address
]
})
import { readCfaForwarder } from "@sfpro/sdk/action"
import { createConfig } from "@wagmi/core"
import { http } from "viem"
import { mainnet } from "viem/chains"
const config = createConfig({
chains: [mainnet],
transports: { [mainnet.id]: http() }
})
const netFlowrate = await readCfaForwarder(config, {
chainId: mainnet.id,
functionName: "getAccountFlowrate",
args: ["0x...", "0x..."] // Token, account
})
getBufferAmountByFlowrate
Calculate the required buffer (deposit) for a given flowrate.
import { useReadCfaForwarder } from "@sfpro/sdk/hook"
const { data: bufferAmount } = useReadCfaForwarder({
functionName: "getBufferAmountByFlowrate",
args: ["0x...", 1000n] // Token, flowrate
})
import { cfaForwarderAbi, cfaForwarderAddress } from "@sfpro/sdk/abi"
import { createPublicClient, http } from "viem"
import { mainnet } from "viem/chains"
const client = createPublicClient({
chain: mainnet,
transport: http()
})
const bufferAmount = await client.readContract({
address: cfaForwarderAddress[mainnet.id],
abi: cfaForwarderAbi,
functionName: "getBufferAmountByFlowrate",
args: [
"0x...", // Super Token address
1000n // Flowrate (tokens per second)
]
})
import { readCfaForwarder } from "@sfpro/sdk/action"
import { createConfig } from "@wagmi/core"
import { http } from "viem"
import { mainnet } from "viem/chains"
const config = createConfig({
chains: [mainnet],
transports: { [mainnet.id]: http() }
})
const bufferAmount = await readCfaForwarder(config, {
chainId: mainnet.id,
functionName: "getBufferAmountByFlowrate",
args: ["0x...", 1000n] // Token, flowrate
})
Write Functions
setFlowrate
Create or update a flow. This is the recommended function for flow management.
import { useWriteCfaForwarder } from "@sfpro/sdk/hook"
import { calculateFlowrate } from "@sfpro/sdk/util"
import { parseEther } from "viem"
const flowrate = calculateFlowrate({
amountWei: parseEther("100"),
timeUnit: "month"
})
const { writeContract: setFlowrate } = useWriteCfaForwarder({
functionName: "setFlowrate",
args: ["0x...", "0x...", flowrate] // Token, receiver, flowrate
})
import { cfaForwarderAbi, cfaForwarderAddress } from "@sfpro/sdk/abi"
import { calculateFlowrate } from "@sfpro/sdk/util"
import { createWalletClient, http, parseEther } from "viem"
import { mainnet } from "viem/chains"
import { privateKeyToAccount } from "viem/accounts"
const account = privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`)
const walletClient = createWalletClient({
account,
chain: mainnet,
transport: http()
})
const flowrate = calculateFlowrate({
amountWei: parseEther("100"),
timeUnit: "month"
})
const hash = await walletClient.writeContract({
address: cfaForwarderAddress[mainnet.id],
abi: cfaForwarderAbi,
functionName: "setFlowrate",
args: [
"0x...", // Super Token address
"0x...", // Receiver address
flowrate // Flowrate in tokens/second
]
})
import { writeCfaForwarder, calculateFlowrate } from "@sfpro/sdk/action"
import { createConfig } from "@wagmi/core"
import { createWalletClient, http, parseEther } from "viem"
import { mainnet } from "viem/chains"
import { privateKeyToAccount } from "viem/accounts"
const account = privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`)
const config = createConfig({
chains: [mainnet],
client({ chain }) {
return createWalletClient({ account, chain, transport: http() })
},
})
const flowrate = calculateFlowrate({
amountWei: parseEther("100"),
timeUnit: "month"
})
const hash = await writeCfaForwarder(config, {
chainId: mainnet.id,
functionName: "setFlowrate",
args: ["0x...", "0x...", flowrate] // Token, receiver, flowrate
})
createFlow
Create a new flow (fails if flow already exists).
import { useWriteCfaForwarder } from "@sfpro/sdk/hook"
import { useAccount } from "wagmi"
const { address } = useAccount()
const { writeContract: createFlow } = useWriteCfaForwarder({
functionName: "createFlow",
args: ["0x...", address!, "0x...", 1000n, "0x"]
})
import { cfaForwarderAbi, cfaForwarderAddress } from "@sfpro/sdk/abi"
import { createWalletClient, http } from "viem"
import { mainnet } from "viem/chains"
import { privateKeyToAccount } from "viem/accounts"
const account = privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`)
const walletClient = createWalletClient({
account,
chain: mainnet,
transport: http()
})
const hash = await walletClient.writeContract({
address: cfaForwarderAddress[mainnet.id],
abi: cfaForwarderAbi,
functionName: "createFlow",
args: [
"0x...", // Super Token address
account.address, // Sender (must be msg.sender)
"0x...", // Receiver address
1000n, // Flowrate
"0x" // User data (optional)
]
})
import { writeCfaForwarder } from "@sfpro/sdk/action"
import { createConfig } from "@wagmi/core"
import { createWalletClient, http } from "viem"
import { mainnet } from "viem/chains"
import { privateKeyToAccount } from "viem/accounts"
const account = privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`)
const config = createConfig({
chains: [mainnet],
client({ chain }) {
return createWalletClient({ account, chain, transport: http() })
},
})
const hash = await writeCfaForwarder(config, {
chainId: mainnet.id,
functionName: "createFlow",
args: ["0x...", account.address, "0x...", 1000n, "0x"]
})
updateFlow
Update an existing flow's flowrate.
import { useWriteCfaForwarder } from "@sfpro/sdk/hook"
import { useAccount } from "wagmi"
const { address } = useAccount()
const { writeContract: updateFlow } = useWriteCfaForwarder({
functionName: "updateFlow",
args: ["0x...", address!, "0x...", 2000n, "0x"]
})
import { cfaForwarderAbi, cfaForwarderAddress } from "@sfpro/sdk/abi"
import { createWalletClient, http } from "viem"
import { mainnet } from "viem/chains"
import { privateKeyToAccount } from "viem/accounts"
const account = privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`)
const walletClient = createWalletClient({
account,
chain: mainnet,
transport: http()
})
const hash = await walletClient.writeContract({
address: cfaForwarderAddress[mainnet.id],
abi: cfaForwarderAbi,
functionName: "updateFlow",
args: [
"0x...", // Super Token address
account.address, // Sender
"0x...", // Receiver address
2000n, // New flowrate
"0x" // User data
]
})
import { writeCfaForwarder } from "@sfpro/sdk/action"
import { createConfig } from "@wagmi/core"
import { createWalletClient, http } from "viem"
import { mainnet } from "viem/chains"
import { privateKeyToAccount } from "viem/accounts"
const account = privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`)
const config = createConfig({
chains: [mainnet],
client({ chain }) {
return createWalletClient({ account, chain, transport: http() })
},
})
const hash = await writeCfaForwarder(config, {
chainId: mainnet.id,
functionName: "updateFlow",
args: ["0x...", account.address, "0x...", 2000n, "0x"]
})
deleteFlow
Stop a flow completely.
import { useWriteCfaForwarder } from "@sfpro/sdk/hook"
import { useAccount } from "wagmi"
const { address } = useAccount()
const { writeContract: deleteFlow } = useWriteCfaForwarder({
functionName: "deleteFlow",
args: ["0x...", address!, "0x...", "0x"]
})
import { cfaForwarderAbi, cfaForwarderAddress } from "@sfpro/sdk/abi"
import { createWalletClient, http } from "viem"
import { mainnet } from "viem/chains"
import { privateKeyToAccount } from "viem/accounts"
const account = privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`)
const walletClient = createWalletClient({
account,
chain: mainnet,
transport: http()
})
const hash = await walletClient.writeContract({
address: cfaForwarderAddress[mainnet.id],
abi: cfaForwarderAbi,
functionName: "deleteFlow",
args: [
"0x...", // Super Token address
account.address, // Sender
"0x...", // Receiver address
"0x" // User data
]
})
import { writeCfaForwarder } from "@sfpro/sdk/action"
import { createConfig } from "@wagmi/core"
import { createWalletClient, http } from "viem"
import { mainnet } from "viem/chains"
import { privateKeyToAccount } from "viem/accounts"
const account = privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`)
const config = createConfig({
chains: [mainnet],
client({ chain }) {
return createWalletClient({ account, chain, transport: http() })
},
})
const hash = await writeCfaForwarder(config, {
chainId: mainnet.id,
functionName: "deleteFlow",
args: ["0x...", account.address, "0x...", "0x"]
})
Flow Permissions
grantPermissions
Grant another account permission to manage your flows.
import { useWriteCfaForwarder } from "@sfpro/sdk/hook"
const { writeContract: grantPermissions } = useWriteCfaForwarder({
functionName: "grantPermissions",
args: ["0x...", "0x..."] // Token, operator
})
import { cfaForwarderAbi, cfaForwarderAddress } from "@sfpro/sdk/abi"
import { createWalletClient, http } from "viem"
import { mainnet } from "viem/chains"
import { privateKeyToAccount } from "viem/accounts"
const account = privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`)
const walletClient = createWalletClient({
account,
chain: mainnet,
transport: http()
})
const hash = await walletClient.writeContract({
address: cfaForwarderAddress[mainnet.id],
abi: cfaForwarderAbi,
functionName: "grantPermissions",
args: [
"0x...", // Super Token address
"0x..." // Flow operator address
]
})
import { writeCfaForwarder } from "@sfpro/sdk/action"
import { createConfig } from "@wagmi/core"
import { createWalletClient, http } from "viem"
import { mainnet } from "viem/chains"
import { privateKeyToAccount } from "viem/accounts"
const account = privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`)
const config = createConfig({
chains: [mainnet],
client({ chain }) {
return createWalletClient({ account, chain, transport: http() })
},
})
const hash = await writeCfaForwarder(config, {
chainId: mainnet.id,
functionName: "grantPermissions",
args: ["0x...", "0x..."] // Token, operator
})
Key Notes
- setFlowrate: Preferred method - creates or updates flows
- Buffer: Flows require a deposit based on flowrate
- Permissions: Enable third-party flow management
- User Data: Optional bytes parameter for custom data