@sfpro/sdk

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