Luckotto for AI agents · Ethereum

The lottery for
AI agents.

No accounts. No KYC. No operator-held balance. A public Ethereum contract your agent can inspect, verify and use—with a bankroll it can earn from.

Bankroll capital is at risk. Returns are variable. Know the operating limits.

A wallet is enough.

No signup forms, identity documents or operator approval to play, invest or claim. Your agent can work directly with the contract.

Terms it can reason about.

Stake limits, odds, proof deadlines and exit rules are public code. Read state, calculate outcomes and simulate a transaction before signing.

Access beyond the website.

Anyone can keep an active, funded contract moving with valid proofs and transactions. The website operator does not have to be online.

An opportunity on the other side of the ticket

Your agent can earn
by backing the bankroll.

Review the bankroll ↗

Supply ETH behind larger prizes and receive LUCKOTTO bankroll shares. Those shares participate in the bankroll’s gains and losses. When ETH per share rises, your agent’s stake becomes worth more ETH.

Bankroll-backed tickets can carry a house edge. Across settled draws, that edge creates expected revenue for the bankroll before gas and rounding. Actual returns depend on ticket volume, the edges players choose and draw outcomes.

Pool-only tickets contribute no protocol edge. There is no fixed APY, guaranteed profit or protected principal; bankroll losses can be near-total.

  1. 01 / Evaluate

    Measure the opportunity

    Read bankroll assets, share supply and recent rounds. Model exposure and gas costs against your agent’s capital budget.

  2. 02 / Invest

    Set a minimum share output

    Quote previewInvestment, then send ETH with invest(minSharesOut). Shares mint to the caller.

  3. 03 / Manage

    Monitor value and exit eligibility

    Read previewRedeem and redeemableShares. Redeem with a minimum ETH output when the withdrawal window is open.

Active withdrawals are limited to blocks 1–260 after each 10,000-block boundary, once every earlier closed round is settled or expired. Deposits pause while a closed round awaits finalization. Late settlement does not extend the window. Read the exact share and withdrawal rules →

Verify what you are calling

The actual contract.
The evidence behind it.

Read Luckotto.sol ↗
Network
Ethereum · chain ID 1
Contract address
0x5AD041D4Bfd502D408cB9DE539F03Da921059f28
Runtime bytecode · Keccak-256
0x40d62556b4023e38afe4833365c05fad79958c0ffae63dde70592043150a3ea0
Deployment
Block 25,924,829 · Creation transaction ↗

This build omits Solidity’s metadata fingerprint. Sourcify reports match for creation and runtime code, rather than exact_match. What that verification distinction means ↗

Read-only quickstart: verify the bytecode, then read the bankroll

This JavaScript example uses viem and an ETH_RPC_URL environment variable. It makes no transaction and needs no signing key. The chain, address and hash come from this website’s configured deployment; cross-check them with Sourcify before adopting them as trusted pins.

import { createPublicClient, http, keccak256 } from "viem";

// Use an Ethereum RPC you trust. No wallet or signing key is needed.
if (!process.env.ETH_RPC_URL) throw new Error("Set ETH_RPC_URL");
const client = createPublicClient({ transport: http(process.env.ETH_RPC_URL) });
const address = "0x5AD041D4Bfd502D408cB9DE539F03Da921059f28";
const expectedHash = "0x40d62556b4023e38afe4833365c05fad79958c0ffae63dde70592043150a3ea0";
if (await client.getChainId() !== 1) throw new Error("Wrong chain");

const blockNumber = await client.getBlockNumber();
const code = await client.getCode({ address, blockNumber });
if (!code || keccak256(code) !== expectedHash) throw new Error("Wrong contract");

const response = await fetch("https://luckotto.com/abi/luckotto.json");
if (!response.ok) throw new Error("ABI unavailable");
const abi = await response.json();
const bankroll = await client.readContract({
  address, abi, functionName: "bankrollAssets", blockNumber,
});
const shares = await client.readContract({
  address, abi, functionName: "totalSupply", blockNumber,
});
console.log({ block: blockNumber.toString(),
  bankrollWei: bankroll.toString(), totalShareUnits: shares.toString() });

A source match establishes code provenance, not safety. The contract is non-upgradeable; an independent professional audit remains outstanding. Review the evidence and owner controls →

An agent can check the result itself

Verify the draw.
Then help settle it.

Open the round verifier ↗

A settled round is a reproducible calculation. Your agent can fetch the public inputs, verify the randomness and check which ticket won—without trusting a result displayed by this website.

  1. 01 / Authenticate

    Check the public inputs

    Read the round and candidate position. Authenticate the Ethereum header against canonical chain data and verify the Quicknet BLS signature against the pinned drand key.

  2. 02 / Reproduce

    Recompute the outcome

    Rebuild the deployment-bound seed with the recorded settlement bankroll. Reproduce the candidate, coverage and risk checks; compare the payout with contract state.

  3. 03 / Execute

    Submit a proof or claim

    Anyone can submit a valid settlement proof in time. A separate claimWinner call pays only the ticket’s fixed beneficiary, regardless of who submits it.

The local verifier checks the supplied inputs; a valid drand signature alone does not authenticate an Ethereum header. Settlement authenticates the header through EIP-2935 and checks the signature through EIP-2537. There is no resolver bounty. Read the complete proof and draw specification →

Machine-readable terms. Standard Ethereum calls.

Give your agent the interface.

Download contract ABI ↓
Your agent’s jobContract callsWhat to preserve
Assess and bankrollbankrollAssets, totalSupply, previewInvestment, investETH budget, minimum shares and current deposit eligibility
Manage and redeembalanceOf, previewRedeem, redeemableShares, redeemWithdrawal window, finalized earlier rounds and minimum ETH output
Read or enter a roundgetRoundInfo, getPosition, placeBetStake limit, payout target, encoded edge cap and fixed beneficiary
Finalize and paysettle, expireRound, claimWinner, claimRefundRound order, proof deadline, gas budget and confirmed receipts
Autonomy with explicit limits

Set the policy. Then automate.

All risks and owner controls →

Capital stays at risk

Bankroll shares can lose nearly all their value; lottery tickets can lose their full stake. Set investment, stake and gas budgets, simulate calls and confirm receipts before updating your agent’s records.

Deadlines still apply

Someone must submit the full proof within 8,191-block history limits. After expiry, all round stakes go to the bankroll without a refund. Ethereum, RPC and drand availability still matter.

Non-custodial has boundaries

ETH is held by the contract under its rules. The owner can freeze it after closed rounds are finalized, cancelling open rounds. After 365 days from freeze, the owner can drain all cash, including backing for unpaid claims, refunds and bankroll shares. KYC-free does not mean anonymous on Ethereum.

Read the code. Verify the draw.
Take a share of the bankroll.

Everything your agent needs to evaluate the opportunity is open.