Operator guide
The steps the operator follows each month, from the first fee claim to the hash on chain.
Before you begin
This page is for the operator. Holders can read it to see what happens each month and on rent day.
Two tools do the work. tools/close.mjs builds the Roll from a month file you write. The operator console sends the transactions. To open the console, run npm run serve from the project root and go to http://localhost:8811/operator.
Every action in the console is a transaction you sign in the owner's own wallet, 0x5b015d333EcB54aeA2e60Bd8AE8A96742Df14Ae3. The page never sees a private key. It is not published with the site: site/.vercelignore excludes site/operator/ from deploys.
The one-time launch is done. Both contracts were deployed through the console, and their addresses are in site/js/config.js and on Chain and addresses.
The monthly close
Eight steps, in this order:
- During the month, claim the creator fee.
- Before the 1st, swap the claimed ETH to USDG.
- Write the month file.
- Run the close and read the amount to settle.
- Settle the USDG in the console.
- Write the Roll.
- Deploy the site.
- Publish the Roll in the console.
Steps 4, 5 and 8 depend on each other. The close in step 4 snapshots the vault, the settlement in step 5 has to land on that snapshot, and the price committed in step 8 is read from the vault, so it has to come after the settlement. The site deploy in step 7 comes before step 8 so that the file is public at the URL you commit.
1. Claim the creator fee
During the month, claim the $RENT creator fee on Pons 2 into the owner wallet whenever it suits you, for example once a week. For each claim, note the date, the ETH amount and the transaction hash. If Pons shows fees per day, note those too; they fill the Roll's #days section and light the windows of the street drawing.
2. Swap the ETH to USDG
Before the 1st, swap all the claimed ETH to USDG on Robinhood Chain. Note the USDG received and the swap transaction hash.
3. Write the month file
Put the month's facts in a JSON file, for example month.json. Its shape is documented at the top of tools/close.mjs. The values below are an example.
{
"n": 1,
"period": "2026-10",
"label": "October 2026",
"published": "2026-11-01",
"days": { "2026-10-01": "0.061", "2026-10-02": "0.048" },
"claims": [
{ "date": "2026-10-07", "eth": "0.42", "tx": "0x..." },
{ "date": "2026-10-14", "eth": "0.37", "tx": "0x..." }
],
"conversion": { "usdg": "1288.51", "tx": "0x..." },
"note": "One or two sentences on anything unusual this month."
}
| Field | Meaning |
|---|---|
n | Roll number. The first Roll is 1. The tool checks that it follows the last Roll in site/data/rolls/index.json, and the console checks it against the registry's latest(). |
period | The month closed, as YYYY-MM. |
label | The name the site shows for the month. |
published | The publication date, as YYYY-MM-DD: the 1st of the next month. |
days | Optional. Map from date to the ETH fee accrued that day, as decimal strings. |
claims | List of { "date", "eth", "tx" }, one per claim from Pons. |
conversion | { "usdg", "tx" }: the USDG the swap delivered for all the claimed ETH, and the swap transaction. |
note | A line of context shown on the site. It is not part of the hashed file. |
Amounts are decimal strings. Two more fields arrive later: chain, which the tool writes in step 4, and settleTx, which you add in step 5.
4. Run the close
node tools/close.mjs month.json
The first run reads the vault's totalAssets() and totalSupply() from chain, saves them into month.json as "chain", and prints the exact USDG amount to settle and the price change it will cause. With the operator share at 0%, the amount equals the USDG the swap delivered.
Settle right away, before any new deposit or cash-out. A deposit or cash-out between the snapshot and the settlement changes the vRENT count, and the price on chain would then differ from the Roll's price_close. If the vault has no vRENT yet, the tool stops, because addCapital would revert.
5. Settle the USDG
In the console, under Settle rent, enter the amount the tool printed and confirm. The console checks that the owner wallet holds enough USDG, approves the exact amount if the current allowance is short, and then calls addCapital. It shows the price before and after.
Copy the transaction hash into month.json as "settleTx".
If the month earned no fees, there is nothing to settle: the console and addCapital both refuse a zero amount. Skip this step and leave settleTx out. The Roll still records the month.
6. Write the Roll
node tools/close.mjs month.json --write-index
The second run builds the Roll and checks every identity on Reading a Roll. If one fails, it stops and writes nothing. Otherwise it prints a summary with the file's SHA-256, writes site/data/rolls/NNN.csv (001.csv for Roll 1) and adds the Roll to site/data/rolls/index.json. Add --dry to print the summary without writing.
Once index.json lists a Roll, the site stops using the sample months and every Sample label disappears.
7. Deploy the site
cd site
vercel deploy --prod
The file is then public at https://rentday.xyz/data/rolls/NNN.csv. The host must serve it unchanged, with no line-ending conversion, or its hash will not match.
8. Publish the Roll
A published Roll can never be changed or deleted. Read every figure the console shows before you confirm.
In the console, under Publish a Roll, choose the file from site/data/rolls/ and confirm the URL. Before it sends anything, the console:
- refuses a sample Roll;
- checks that the Roll number is the registry's
latest()+ 1; - requires an https URL;
- hashes the file in the page;
- reads the price from the vault and compares it with the Roll's
price_closeto six decimals, and warns you if they differ; - shows the hash, the price and the URL for a final confirmation.
It then calls publish on the RollRegistry, reads the Roll back and confirms that the stored hash matches. The console does not download the URL, so finish by opening /roll#verify on the live site and checking that it reports a match.
Deposit controls
The console's Deposits section has three owner actions: Pause deposits, Unpause, and Set cap with a new cap in USDG. Pausing blocks new deposits and nothing else; holders can still cash out. The live cap is 100,000 USDG.
When $RENT launches
Put the token's contract address in ADDR.rentToken and its Pons page in LINKS.pons in site/js/config.js, then redeploy the site. Every Launch soon for the token then shows the address.
When something goes wrong
- A published Roll has an error. Publish the correction in the next Roll. The original stays on chain.
close.mjsrefuses. The Roll number does not follow the last one inindex.json,claimsorconversionis missing, an identity fails, or the vault has no vRENT yet.- The console refuses to publish. The connected wallet is not the registry owner, the file is a sample Roll, its number is not
latest()+ 1, or the URL is not https. Nothing was sent. - The console warns that the prices differ. Either the settlement has not landed yet, or a deposit or cash-out came between the snapshot and the settlement. Find the cause before you continue.