stroid.fun

Construct Launch Transaction

Build, sign, and send launchStroidDotFun transactions directly.

This page is for builders who want to construct raw launch transactions themselves.

Network and target

  • Chain: Ethereum Mainnet (chainId = 1)
  • Launchpad: 0xDcd73E1d65772Bb5d0caCe9720799831271E3139
  • Function: launchStroidDotFun(string name,string symbol,string metadataURI,bytes32 salt)

ABI fragment

[
  {
    "name": "launchStroidDotFun",
    "type": "function",
    "stateMutability": "payable",
    "inputs": [
      { "name": "name", "type": "string" },
      { "name": "symbol", "type": "string" },
      { "name": "metadataURI", "type": "string" },
      { "name": "salt", "type": "bytes32" }
    ],
    "outputs": [
      { "name": "token", "type": "address" },
      { "name": "devBuyTokens", "type": "uint256" }
    ]
  }
]

Value math (important)

Transaction value must satisfy:

value >= CREATION_FEE() + devBuyEth

And:

devBuyEth >= 0.03 ETH

So practical minimum launch value is:

CREATION_FEE() + MIN_DEV_BUY()

Salt

You provide any bytes32 salt. On-chain, launchpad derives actual CREATE2 salt with sender:

keccak256(msg.sender, salt)

That means the same user salt from different senders produces different token addresses.

Ethers example

import { ethers } from 'ethers';

const rpc = 'https://eth.llamarpc.com';
const provider = new ethers.JsonRpcProvider(rpc);
const signer = new ethers.Wallet(process.env.PRIVATE_KEY!, provider);

const launchpad = '0xDcd73E1d65772Bb5d0caCe9720799831271E3139';
const abi = [
  'function launchStroidDotFun(string name,string symbol,string metadataURI,bytes32 salt) payable returns (address token,uint256 devBuyTokens)',
  'function CREATION_FEE() view returns (uint256)',
  'function MIN_DEV_BUY() view returns (uint256)'
];
const contract = new ethers.Contract(launchpad, abi, provider);

const iface = new ethers.Interface(abi);

const name = 'My Token';
const symbol = 'MYTK';
const metadataURI = 'https://metadata.stroid.fun/metadata/abc123.json';
const salt = ethers.hexlify(ethers.randomBytes(32)); // or your own bytes32

const minDevBuy = await contract.MIN_DEV_BUY();
const creationFee = await contract.CREATION_FEE();
const devBuy = minDevBuy; // or any amount >= minDevBuy
const value = creationFee + devBuy;

const data = iface.encodeFunctionData('launchStroidDotFun', [
  name,
  symbol,
  metadataURI,
  salt
]);

const fee = await provider.getFeeData();

const tx = await signer.sendTransaction({
  to: launchpad,
  data,
  value,
  chainId: 1,
  type: 2,
  maxPriorityFeePerGas: fee.maxPriorityFeePerGas ?? ethers.parseUnits('0.02', 'gwei'),
  maxFeePerGas: fee.maxFeePerGas ?? ethers.parseUnits('3', 'gwei')
});

await tx.wait();
console.log(tx.hash);

viem example

import { createPublicClient, createWalletClient, defineChain, http } from 'viem';
import { privateKeyToAccount } from 'viem/accounts';

const mainnet = defineChain({
  id: 1,
  name: 'Ethereum',
  nativeCurrency: { name: 'Ether', symbol: 'ETH', decimals: 18 },
  rpcUrls: {
    default: { http: ['https://eth.llamarpc.com'] }
  }
});

const publicClient = createPublicClient({
  chain: mainnet,
  transport: http()
});

const account = privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`);
const walletClient = createWalletClient({
  account,
  chain: mainnet,
  transport: http()
});

const launchpad = '0xDcd73E1d65772Bb5d0caCe9720799831271E3139';

const abi = [
  {
    name: 'CREATION_FEE',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ name: '', type: 'uint256' }]
  },
  {
    name: 'MIN_DEV_BUY',
    type: 'function',
    stateMutability: 'view',
    inputs: [],
    outputs: [{ name: '', type: 'uint256' }]
  },
  {
    name: 'launchStroidDotFun',
    type: 'function',
    stateMutability: 'payable',
    inputs: [
      { name: 'name', type: 'string' },
      { name: 'symbol', type: 'string' },
      { name: 'metadataURI', type: 'string' },
      { name: 'salt', type: 'bytes32' }
    ],
    outputs: [
      { name: 'token', type: 'address' },
      { name: 'devBuyTokens', type: 'uint256' }
    ]
  }
] as const;

const hash = await walletClient.writeContract({
  address: launchpad as `0x${string}`,
  abi,
  functionName: 'launchStroidDotFun',
  args: [
    'My Token',
    'MYTK',
    'https://metadata.stroid.fun/metadata/abc123.json',
    '0x0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef'
  ],
  value: (
    await publicClient.readContract({
      address: launchpad as `0x${string}`,
      abi,
      functionName: 'CREATION_FEE'
    })
  ) + (
    await publicClient.readContract({
      address: launchpad as `0x${string}`,
      abi,
      functionName: 'MIN_DEV_BUY'
    })
  )
});

await publicClient.waitForTransactionReceipt({ hash });
console.log(hash);

Common failure reasons

  • "Insufficient ETH (need protocol fee + minimum dev buy)"
    Value too low.
  • Reverted from bad fee settings / stuck mempool
    Increase max fee caps or resend with replacement tx.
  • Metadata URL invalid format for your frontend/indexer expectations
    Keep it a resolvable HTTPS/IPFS URI.

On this page