Use G$ streaming
First-step:
Superfluid concepts: What is Superfluid?
TL;DR (one-minute overview)
Streaming Payments with G$ Token
GoodDollar’s G$ is deployed as a pure Superfluid SuperToken on the Celo network—no wrapping needed, so it can be streamed second-by-second out of the box.
Streaming turns one-off transfers into continuous flows, enabling payroll, vesting, or loan payments.
For other example use cases, see here.
For simple second-by-second transfers called 'streaming', powered by the SuperFluid Protocol, you talk directly to the immutable CFAv1Forwarder
contract (0xcfA132E3…B125) and pass in G$’s address (
0x62B8…C7A`).
All flows boil down to three methods:
createFlow(ISuperToken token, address sender, address receiver, int96 flowRate, bytes userData)
updateFlow(ISuperToken token, address sender, address receiver, int96 newRate, bytes userData)
deleteFlow(ISuperToken token, address sender, address receiver, bytes userData)
Optional next steps:
GDAv1Forwarder → pool-style distribution streams, optimized to work with off-chain interactions. (docs.superfluid.finance)
Super-Apps → have your contracts react to flow events once you register them with the Host. (docs.superfluid.finance, GitHub)
Prerequisites
Node ≥ 18 & bundler (Vite / Next)
To build a web client
ethers v6 or viem + wagmi
Low-level EVM calls
A wallet on Celo Mainnet (chainId = 42220
)
Only Celo currently has G$ streaming capabilities.
G$ token address
(Recommended for testing: Development G$)
0xFa51eFDc0910CCdA91732e6806912Fa12e2FD475
(production G$) 0x62B8B11039fcfE5AB0C56E502b1C372A3D2a9C7A
CFAv1Forwarder
universal address
0xcfA132E353cB4E398080B9700609bb008eceB125
(docs.superfluid.finance)
Project Setup
npm i ethers wagmi viem
// lib/superfluid.ts
import { BrowserProvider } from 'ethers';
export const provider = new BrowserProvider(window.ethereum);
export const forwarderAddr = '0xcfA132E353cB4E398080B9700609bb008eceB125';
export const gDollar = '0x62B8B11039fcfE5AB0C56E502b1C372A3D2a9C7A';
// paste the CFAv1Forwarder ABI snippet from the tech-ref page ↓
import { CFAv1ForwarderAbi } from './CFAv1ForwarderAbi';
export const forwarder = new ethers.Contract(
forwarderAddr,
CFAv1ForwarderAbi,
provider.getSigner()
);
The full ABI is on the technical-reference page and includes helpers like getBufferAmountByFlowrate
. (docs.superfluid.finance)
Creating a Flow (React / wagmi example)
import { useState } from 'react';
import { useAccount } from 'wagmi';
import { forwarder, gDollar } from './lib/superfluid';
// helper – convert “tokens per month” → int96 wad/sec
const perMonthToRate = (pm: string) =>
BigInt(pm) * 10n ** 18n / 2592000n; // 30 × 24 × 60 × 60
export default function CreateFlow() {
const { address } = useAccount();
const [receiver, setReceiver] = useState('');
const [perMonth, setPerMonth] = useState('10');
async function start() {
const tx = await forwarder.createFlow(
gDollar,
address!, // sender (caller)
receiver,
perMonthToRate(perMonth), // int96 flowRate
'0x' // userData
);
await tx.wait();
}
return (
<>
<input value={receiver} onChange={e=>setReceiver(e.target.value)} />
<button onClick={start}>
Stream {perMonth} G$/mo
</button>
</>
);
}
The same pattern works for updateFlow
and deleteFlow
; just swap the method. (docs.superfluid.finance)
Reading Live Data
// How fast am I sending right now?
const { flowrate } = await forwarder.getFlowInfo(
gDollar,
sender,
receiver
);
// How big a safety buffer does Superfluid require for 10 G$/mo?
const buffer = await forwarder.getBufferAmountByFlowrate(
gDollar,
perMonthToRate('10')
);
These helper views are defined in the same contract. (docs.superfluid.finance) For historical analytics use the Superfluid Subgraph or Explorer. (docs.superfluid.finance)
Registering Your dApp as a Super-App (optional)
If your contract should react to incoming/outgoing streams (e.g. auto-staking or NFT minting), you want your dApp to be registered as Super-App.
For instructions please follow: https://docs.superfluid.org/docs/protocol/advanced-topics/super-apps/register The Celo network requires a 'deployer' to be whitelisted before it can be registered. Please reach out to us to help you get whitelisted.
6 Next Steps & Gotchas
GDAv1Forwarder
Needed for pool-style “one-to-many” distributions; interface is analogous to CFA but targets pools. (docs.superfluid.finance)
Flow-rate math
rate = amountPerMonth × 1e18 / 2 592 000
. Keep int96
limits (~10^27 total). (docs.superfluid.finance)
Buffer deposits
Use getBufferAmountByFlowrate
before creating a stream to make sure the sender holds ≥ buffer + first few minutes. (docs.superfluid.finance)
Protocol fees
G$ applies its _processFees
on each streamed “drip”; receiver gets flowRate – feeRate
.
Network support
Streaming live only on Celo today; G$ on Fuse & ETH can still use one-off transfers.
Testing
Use GoodDollar’s dev contract 0xFa51eFDc0910CCdA91732e6806912Fa12e2FD475
. You can claim some free dev G$'s by creating a dev wallet here: https://goodwallet.dev
Reference Links
Create/Update/Delete Flows guide (Superfluid SDK) (docs.superfluid.finance)
CFAv1Forwarder technical reference (docs.superfluid.finance)
GDAv1Forwarder reference (for next steps) (docs.superfluid.finance)
SuperTokenV1Library (Solidity helper) (docs.superfluid.finance)
Super-Apps concepts page (docs.superfluid.finance)
Host & Super-App architecture (docs.superfluid.finance)
App-Registry wiki / registerApp (GitHub)
Agreement Forwarders overview (GitHub)
G$ token contract on CeloScan (Celo Chain Blockchain Explorer)
Last updated
Was this helpful?