Super Token
API reference for Super Token contract interactions
Super Tokens are ERC-20 compatible tokens with additional streaming capabilities. This reference covers the essential functions for interacting with Super Tokens.
Contract Addresses
// Super Token addresses - replace with actual addresses for your network
const usdcx = "0x1234567890abcdef..." // USDCx address
const daix = "0xabcdef1234567890..." // DAIx address
const ethx = "0xfedcba0987654321..." // ETHx address
Read Functions
balanceOf
Get the Super Token balance of an account.
import { useReadSuperToken } from "@sfpro/sdk/hook"
const { data: balance } = useReadSuperToken({
address: "0x...", // Super Token address
functionName: "balanceOf",
args: ["0x..."] // Account address
})
import { superTokenAbi } from "@sfpro/sdk/abi"
import { createPublicClient, http } from "viem"
import { mainnet } from "viem/chains"
const client = createPublicClient({
chain: mainnet,
transport: http()
})
const balance = await client.readContract({
address: "0x...", // Super Token address
abi: superTokenAbi,
functionName: "balanceOf",
args: ["0x..."] // Account address
})
import { readSuperToken } 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 balance = await readSuperToken(config, {
chainId: mainnet.id,
address: "0x...", // Super Token address
functionName: "balanceOf",
args: ["0x..."] // Account address
})
realtimeBalanceOfNow
Get the real-time balance including accumulated streams.
import { useReadSuperToken } from "@sfpro/sdk/hook"
const { data } = useReadSuperToken({
address: "0x...",
functionName: "realtimeBalanceOfNow",
args: ["0x..."]
})
import { superTokenAbi } from "@sfpro/sdk/abi"
import { createPublicClient, http } from "viem"
import { mainnet } from "viem/chains"
const client = createPublicClient({
chain: mainnet,
transport: http()
})
const result = await client.readContract({
address: "0x...", // Super Token address
abi: superTokenAbi,
functionName: "realtimeBalanceOfNow",
args: ["0x..."] // Account address
})
// Returns: [availableBalance, deposit, owedDeposit, timestamp]
const [balance, deposit, owedDeposit, timestamp] = result
import { readSuperToken } 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 result = await readSuperToken(config, {
chainId: mainnet.id,
address: "0x...",
functionName: "realtimeBalanceOfNow",
args: ["0x..."]
})
getUnderlyingToken
Get the underlying ERC-20 token address (for wrapper Super Tokens).
import { useReadSuperToken } from "@sfpro/sdk/hook"
const { data: underlyingToken } = useReadSuperToken({
address: "0x...",
functionName: "getUnderlyingToken"
})
import { superTokenAbi } from "@sfpro/sdk/abi"
import { createPublicClient, http } from "viem"
import { mainnet } from "viem/chains"
const client = createPublicClient({
chain: mainnet,
transport: http()
})
const underlyingToken = await client.readContract({
address: "0x...", // Super Token address
abi: superTokenAbi,
functionName: "getUnderlyingToken"
})
import { readSuperToken } 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 underlyingToken = await readSuperToken(config, {
chainId: mainnet.id,
address: "0x...",
functionName: "getUnderlyingToken"
})
Write Functions
upgrade
Wrap underlying tokens to Super Tokens.
import { useWriteSuperToken } from "@sfpro/sdk/hook"
import { parseUnits } from "viem"
const { writeContract: upgrade } = useWriteSuperToken({
address: "0x...",
functionName: "upgrade",
args: [parseUnits("100", 6)]
})
import { superTokenAbi } from "@sfpro/sdk/abi"
import { createWalletClient, http, parseUnits } 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: "0x...", // Super Token address
abi: superTokenAbi,
functionName: "upgrade",
args: [parseUnits("100", 6)] // Amount (check underlying decimals)
})
import { writeSuperToken } from "@sfpro/sdk/action"
import { createConfig } from "@wagmi/core"
import { createWalletClient, http, parseUnits } 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 writeSuperToken(config, {
chainId: mainnet.id,
address: "0x...",
functionName: "upgrade",
args: [parseUnits("100", 6)]
})
downgrade
Unwrap Super Tokens back to underlying tokens.
import { useWriteSuperToken } from "@sfpro/sdk/hook"
import { parseEther } from "viem"
const { writeContract: downgrade } = useWriteSuperToken({
address: "0x...",
functionName: "downgrade",
args: [parseEther("100")]
})
import { superTokenAbi } from "@sfpro/sdk/abi"
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 hash = await walletClient.writeContract({
address: "0x...", // Super Token address
abi: superTokenAbi,
functionName: "downgrade",
args: [parseEther("100")] // Amount (always 18 decimals)
})
import { writeSuperToken } 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 hash = await writeSuperToken(config, {
chainId: mainnet.id,
address: "0x...",
functionName: "downgrade",
args: [parseEther("100")]
})
upgradeByETH
Wrap native assets (ETH, MATIC, etc.) to Super Tokens.
import { useWriteSuperToken } from "@sfpro/sdk/hook"
import { parseEther } from "viem"
const { writeContract: upgrade } = useWriteSuperToken({
address: "0x...", // ETHx address
functionName: "upgradeByETH",
value: parseEther("1")
})
import { superTokenAbi } from "@sfpro/sdk/abi"
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 hash = await walletClient.writeContract({
address: "0x...", // ETHx address
abi: superTokenAbi,
functionName: "upgradeByETH",
value: parseEther("1") // Amount of ETH to wrap
})
import { writeSuperToken } 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 hash = await writeSuperToken(config, {
chainId: mainnet.id,
address: "0x...", // ETHx address
functionName: "upgradeByETH",
value: parseEther("1")
})
transfer
Transfer Super Tokens (standard ERC-20 transfer).
import { useWriteSuperToken } from "@sfpro/sdk/hook"
import { parseEther } from "viem"
const { writeContract: transfer } = useWriteSuperToken({
address: "0x...",
functionName: "transfer",
args: ["0x...", parseEther("10")]
})
import { superTokenAbi } from "@sfpro/sdk/abi"
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 hash = await walletClient.writeContract({
address: "0x...", // Super Token address
abi: superTokenAbi,
functionName: "transfer",
args: ["0x...", parseEther("10")] // Recipient, amount
})
import { writeSuperToken } 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 hash = await writeSuperToken(config, {
chainId: mainnet.id,
address: "0x...",
functionName: "transfer",
args: ["0x...", parseEther("10")]
})
Key Notes
- Decimals: Super Tokens always use 18 decimals internally
- Approvals: Required before upgrading wrapper Super Tokens
- Native Assets: Use
upgradeByETH
/downgradeByETH
for ETH/MATIC - Real-time Balance: Use
realtimeBalanceOfNow
for stream-aware balance