Operations.
What has to run for LUSG to stay live, how to run it, and what it costs. Every step is a script in the repository; keys stay in a gitignored .env.
What runs, and how often
| Job | Cadence | Command | If it stops |
|---|---|---|---|
| Minute step | Every minute | ./script/keeper.sh | The value holds still, then catches up on the next tick |
| Oracle rates and market check | Once a day, after Treasury posts | ./script/daily_check.sh | Prices go stale 4 days after their data date; the check shows stale |
| Bill list | Weekly, after auctions | python3 -I script/oracle_post.py | New bills can't be priced until listed |
| Settle matured bills | At each maturity | cast send $CLOCK "settleMatured()" | Matured lots still count at face; only the books are tidier |
Costs
| Item | Gas | Vibenet, 1 gwei | Base mainnet, 0.006 gwei |
|---|---|---|---|
One tick() | 63,434 | 0.000063 ETH | ~$0.00087 |
| A day of ticks (1,440) | 91.3M | ~0.09 ETH | ~$1.25 |
| A day's oracle post | ~70,000 | 0.00007 ETH | ~$0.001 |
Vibenet's gas price is about 170 times Base mainnet's, so a keeper wallet funded from the faucet (0.1 ETH) lasts about a day there.
From scratch
./script/01_policies.sh: KYC allowlist, sanctions blocklist, the combined holder policy, the treasury-only seize-exempt list../script/02_deploy.sh: BillOracle and LusgClock with Solar, then LUSG bycreateB20with every role, the cap and the policies. It simulates the call first.python3 -I script/oracle_post.py: Treasury's latest bill rates and every outstanding bill.python3 -I script/ladder_and_mint.py: buys a 4/13/26-week ladder at oracle prices after checking each price by hand, then mints at $1.00../script/03_desk.sh: LusgDesk, made the clock's manager, a minter and burner, and the allowlist's admin; the cap is raised../script/keeper.sh, then./script/compliance_tests.shand./script/daily_check.sh.
Tooling notes
- Solar. Foundry 1.9.0's
--use solarruns asolarexecutable from PATH. Install the v0.3.0 release binary from paradigmxyz/solar and check its checksum. - Precompiles and Foundry.
forge scriptcan't simulate B20 precompiles, so deploys usecast send, andcast call --fromsimulates first. - RPC limits. Vibenet's public RPC rate-limits per HTTP request. The app batches its reads (3 requests per refresh) and computes the per-second value locally.
- Faucet. One request per IP every 10 seconds, across ETH and USDV.
- Hosting. The app and these docs are static files served by Caddy on Railway, at base.lium.finance.