Requirements
- Target platform
- OpenClaw
- Install method
- Manual import
- Extraction
- Extract archive
- Prerequisites
- OpenClaw
- Primary doc
- SKILL.md
Launch tokens on Streme (streme.fun) - the streaming token platform on Base. Use when deploying SuperTokens with built-in staking rewards, Uniswap V3 liquidity, and optional vesting vaults. Triggers on "launch token on streme", "deploy streme token", "create supertoken", or any Streme token deployment task.
Launch tokens on Streme (streme.fun) - the streaming token platform on Base. Use when deploying SuperTokens with built-in staking rewards, Uniswap V3 liquidity, and optional vesting vaults. Triggers on "launch token on streme", "deploy streme token", "create supertoken", or any Streme token deployment task.
Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.
I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete.
I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run.
Deploy SuperTokens on Base via Streme's V2 contracts. Tokens include automatic Uniswap V3 liquidity, Superfluid streaming staking rewards, and optional vesting vaults.
import { createWalletClient, http, parseEther, encodeAbiParameters } from 'viem'; import { base } from 'viem/chains'; import { privateKeyToAccount } from 'viem/accounts'; // See references/contracts.md for full ABIs const DEPLOYER = '0x8712F62B3A2EeBA956508e17335368272f162748'; const tokenConfig = { _name: 'My Token', _symbol: 'MYTOKEN', _supply: parseEther('100000000000'), // 100B _fee: 10000, // 10% _salt: '0x0...', // from generateSalt() _deployer: walletAddress, _fid: 0n, // Farcaster FID or 0 _image: 'https://example.com/image.png', _castHash: 'deployment', _poolConfig: { tick: -230400, pairedToken: '0x4200000000000000000000000000000000000006', // WETH devBuyFee: 10000 } }; // Deploy with 10% staking (1 day lock, 365 day stream) const stakingAlloc = createStakingAllocation(10, 1, 365); await deployWithAllocations(tokenConfig, [stakingAlloc]);
ContractAddressSTREME_PUBLIC_DEPLOYER_V20x8712F62B3A2EeBA956508e17335368272f162748STREME_SUPER_TOKEN_FACTORY0xB973FDd29c99da91CAb7152EF2e82090507A1ce9STREME_ALLOCATION_HOOK0xC907788f3e71a6eC916ba76A9f1a7C7C19384c7BLP_FACTORY0xfF65a5f74798EebF87C8FdFc4e56a71B511aB5C8MAIN_STREME (for salt)0x5797a398fe34260f81be65908da364cc18fbc360WETH (Base)0x4200000000000000000000000000000000000006
Generate Salt - Call generateSalt() to get deterministic token address Upload Image - Host token image (see Image Hosting below) Build Config - Create tokenConfig and allocations Deploy - Call deployWithAllocations()
Token images must be publicly accessible URLs. Options:
// Using Pinata const pinata = new PinataSDK({ pinataJwt: PINATA_JWT }); const { IpfsHash } = await pinata.pinFileToIPFS(fileStream); const imageUrl = `https://gateway.pinata.cloud/ipfs/${IpfsHash}`;
import { v2 as cloudinary } from 'cloudinary'; const result = await cloudinary.uploader.upload(imagePath, { folder: 'tokens', transformation: [{ width: 400, height: 400, crop: 'fill' }] }); const imageUrl = result.secure_url;
Any publicly accessible image URL works: const imageUrl = 'https://example.com/my-token.png';
Format: PNG, JPG, GIF, WebP Size: < 5MB (< 1MB recommended) Dimensions: Square preferred (400x400 ideal)
# IPFS via Pinata PINATA_JWT=xxx npx ts-node scripts/upload-image.ts pinata ./token.png # Cloudinary CLOUDINARY_CLOUD_NAME=xxx CLOUDINARY_API_KEY=xxx CLOUDINARY_API_SECRET=xxx \ npx ts-node scripts/upload-image.ts cloudinary ./token.png # imgBB (free) npx ts-node scripts/upload-image.ts imgbb ./token.png
Streams tokens to stakers over time. function createStakingAllocation( percentage: number, // % of supply (e.g., 10) lockDays: number, // min stake duration flowDays: number, // reward stream duration delegate?: string // optional admin address ) { const lockSec = lockDays * 86400; const flowSec = flowDays * 86400; return { allocationType: 1, admin: delegate || '0x0000000000000000000000000000000000000000', percentage: BigInt(percentage), data: encodeAbiParameters( [{ type: 'uint256' }, { type: 'int96' }], [BigInt(lockSec), BigInt(flowSec)] ) }; }
Locked tokens with optional vesting. function createVaultAllocation( percentage: number, // % of supply beneficiary: string, // recipient address lockDays: number, // lockup (min 7 days) vestingDays: number // vesting after lock ) { const lockSec = Math.max(lockDays, 7) * 86400; const vestSec = vestingDays * 86400; return { allocationType: 0, admin: beneficiary, percentage: BigInt(percentage), data: encodeAbiParameters( [{ type: 'uint256' }, { type: 'uint256' }], [BigInt(lockSec), BigInt(vestSec)] ) }; }
Staking + Vault percentages must be โค100% Remaining % goes to Uniswap V3 LP Vault lock minimum: 7 days Standard config: 10% staking, 90% LP
ParameterValueSupply100,000,000,000 (100B)Creator Fee10000 (10%)Dev Buy Fee10000 (10%)Tick-230400Paired TokenWETH
# Get tokens by deployer GET https://api.streme.fun/api/tokens/deployer/{address} # Search all tokens GET https://api.streme.fun/api/tokens # Token details GET https://api.streme.fun/api/tokens/{address}
See scripts/deploy-token.ts for complete deployment script. See references/contracts.md for full ABIs and type definitions.
const allocations = [createStakingAllocation(10, 1, 365)];
const allocations = [ createStakingAllocation(10, 1, 365), createVaultAllocation(10, teamAddress, 30, 365) ];
const allocations = []; // 100% goes to Uniswap V3 LP
Code helpers, APIs, CLIs, browser automation, testing, and developer operations.
Largest current source with strong distribution and engagement signals.