@sfpro/sdk

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