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.