$B2S Token — TypeScript SDK & Smart Contract addresses for Base2Stacks DeFi on Stacks mainnet.
If you're building on Stacks and need to interact with $B2S DeFi contracts (token, staking, liquidity pool, governance, prediction markets, agent check-in), this SDK gives you:
- All mainnet contract addresses in one place — no more copy-pasting
- TypeScript-first — full type definitions included
- Tree-shakeable — ESM + CJS, import only what you need
- Helper functions — AMM swap math, APY calculator, address utils
- Client classes —
B2SClient,RewardsClient,OracleClient,AgentClient,QuestClient
npm install @wkalidev/b2s-contracts
# or
yarn add @wkalidev/b2s-contracts
# or
pnpm add @wkalidev/b2s-contractsDeployer: SP1V72500C63KN9E348QDK9X879MASSTN0J3KBQ5N
| Contract | Name | Description |
|---|---|---|
b2s-token-v4 |
$B2S Token | SIP-010 fungible token, 6 decimals |
b2s-staking-vault-v2 |
Staking Vault | 12.5–37.5% APY with lock multipliers |
b2s-staking-vault-v3 |
Staking Vault v3 | Latest staking vault |
b2s-liquidity-pool-v6 |
AMM Pool | Constant product AMM, 0.25% fee |
b2s-rewards-distributor |
Rewards | 5 B2S daily claim |
b2s-governance |
DAO | On-chain proposals & voting |
b2s-fee-router |
Fee Router | Bridge fee collection & distribution |
b2s-prediction-market |
Prediction | AMM-style prediction markets |
b2s-price-oracle |
Oracle | On-chain price feeds |
b2s-airdrop |
Airdrop | Token airdrop distribution |
stacks-quest-v2 |
Quest Game | Daily on-chain puzzle game |
stacks-quest-agent-v3 |
Agent | Daily check-in + action log |
toolkit-math |
Math | Safe Clarity arithmetic |
import { CONTRACTS, CONTRACT_NAMES, getContractId } from '@wkalidev/b2s-contracts/contracts'
console.log(CONTRACTS['b2s-token-v4'])
// → 'SP1V72500C63KN9E348QDK9X879MASSTN0J3KBQ5N.b2s-token-v4'
const stakingId = getContractId(CONTRACT_NAMES.STAKING_VAULT)
// → 'SP1V72500C63KN9E348QDK9X879MASSTN0J3KBQ5N.b2s-staking-vault-v2'import { B2SClient } from '@wkalidev/b2s-contracts'
const client = new B2SClient()
const { formatted } = await client.getBalance('SP1ABC...XYZ')
console.log(`Balance: ${formatted} B2S`)import { AgentClient } from '@wkalidev/b2s-contracts'
const agent = new AgentClient()
// Get user streak
const streak = await agent.getStreak('SP1ABC...XYZ')
console.log(`Streak: ${streak.currentStreak} days`)
console.log(`Best: ${streak.bestStreak} days`)
// Check if user checked in today
const checkedIn = await agent.hasCheckedInToday('SP1ABC...XYZ')
console.log(`Checked in today: ${checkedIn}`)
// Get check-in fee (in microSTX)
const fee = await agent.getCheckinFee()
console.log(`Fee: ${fee / 1_000_000} STX`)
// Global stats
const stats = await agent.getGlobalStats()
console.log(`Total check-ins: ${stats.totalCheckins}`)
console.log(`Total fees collected: ${stats.totalFees} microSTX`)import { QuestClient } from '@wkalidev/b2s-contracts'
const quest = new QuestClient()
// Get player stats
const stats = await quest.getPlayerStats('SP1ABC...XYZ')
console.log(`Games played: ${stats.totalPlayed}`)
console.log(`Games won: ${stats.totalWon}`)
console.log(`Current streak: ${stats.currentStreak}`)
// Check if player already played today
const played = await quest.hasPlayedToday('SP1ABC...XYZ')
console.log(`Played today: ${played}`)
// Get today's puzzle type
const puzzle = await quest.getTodayPuzzle()
console.log(`Today's puzzle: ${puzzle?.puzzleType}`)
// Global stats
const global = await quest.getGlobalStats()
console.log(`Total games: ${global.totalGames}`)import { calcSwapOutput, calcEffectiveApy, calcBridgeFee } from '@wkalidev/b2s-contracts/helpers'
const { amountOut, fee, priceImpact } = calcSwapOutput(
1_000_000n,
50_000_000n,
10_000_000n,
)
calcEffectiveApy(2100) // → 37.5%
calcEffectiveApy(0) // → 12.5%
const { totalFeeMicro, toTreasury, toStakers } = calcBridgeFee(1_000_000_000n)import { RewardsClient } from '@wkalidev/b2s-contracts'
const rewards = new RewardsClient()
const pending = await rewards.getPendingRewards('SP1ABC...XYZ')
console.log(`Pending: ${pending.formatted} B2S`)import { OracleClient } from '@wkalidev/b2s-contracts'
const oracle = new OracleClient()
const { price } = await oracle.getPrice('STX-USD')
console.log(`STX price: $${price}`)import {
toMicroUnits, fromMicroUnits, formatB2S,
blocksToDuration, isValidStacksAddress, truncateAddress,
} from '@wkalidev/b2s-contracts/helpers'
formatB2S(5_000_000n) // → '5.000000 B2S'
blocksToDuration(2100) // → '~14d 0h'
isValidStacksAddress('SP1ABC...') // → true
truncateAddress('SP1V725...BQ5N') // → 'SP1V72...Q5N'import type {
TokenBalance, StakePosition, PoolReserves, SwapQuote,
BridgeTransaction, Proposal, ClaimRecord, PriceFeed,
CheckinStreak, AgentGlobalStats, AgentAction,
QuestAttempt, PlayerStats, DailyPuzzle,
Result,
} from '@wkalidev/b2s-contracts/types'git clone https://github.com/wkalidev/b2s-token-contract.git
cd b2s-token-contract
npm install
npm run build
npm test- base2stacks-tracker.vercel.app — Full DeFi protocol
- stacks-quest-ten.vercel.app — Daily puzzle game
- stacks-quest-ten.vercel.app/agent — Non-custodial AI agent
- Fixed
repositoryfield in package.json to point to correct repo - Build cleanup and dependency consistency
- Added
AgentClient— streak, check-in, global stats - Added
QuestClient— player stats, puzzle, game stats - New types:
CheckinStreak,AgentGlobalStats,PlayerStats,DailyPuzzle
B2SClient,RewardsClient,OracleClient,FeeRouterClient- AMM math helpers, APY calculator, bridge fee calculator
PRs welcome! See CONTRIBUTING.md
MIT — © 2026 wkalidev
Built for #StacksBuilderRewards 2026