Hexis admin guide

This is the operator manual for wallet login and on-chain payments. Members never see a card checkout, an in-app credit balance, or a cashout form. They pay with the same Privy wallet they used to sign in, on Elysium. The live asset is set in Admin → Settlement (HYPE by default; USDC when you switch it on).

Member-facing screens are explained in the docs. This page is for people who run the site.

Who this is for

You are a root or admin wallet listed in ROOT_WALLET_ADDRESSES. You log in like everyone else, then open the admin panel and sign a second time. Use this guide when you need to explain payments, check a transaction, or set the treasury.

How people sign in

There is no email/password login. On the public site they tap Log in, connect a wallet in Privy, and sign. That wallet address is the account. The same address is what they pay with later.

  • New wallets pick a username, then land on Home.
  • Returning wallets skip onboarding.
  • We cannot reset a lost wallet. Tell members that up front.

How you open Admin

  1. Sign in with a root/admin wallet (same Privy screen as members).
  2. Open the admin prefix in the URL (the value of ADMIN_PREFIX).
  3. The confirm page asks for another wallet signature. That step-up lasts 20 minutes, then they sign again.

Password admin login is disabled. If a leftover login form still exists, it sends people back to wallet login.

Settlement

Platform fees (ad budgets, optional listing fees) go to the treasury wallet as HYPE on Elysium (chain ID 99901). Marketplace purchases go to the seller’s wallet, not the treasury.

  • Token — currently HYPE. ETH is native. USDC uses the contract saved on Settlement.
  • Treasury — TREASURY_WALLET_ADDRESS. This is the “Send to” address members see when they fund an ad.
  • Confirm — after they sign in Privy, the site reads the transaction on the Elysium RPC and records it. Duplicate hashes are rejected.

Open Settlement in the admin sidebar to pick ETH or USDC, set treasury, and set listing fees. Members see those fees on the create screens. Do not put secrets in this guide.

What members see

Spell this out when someone asks “where do I pay?” There is no card checkout, no “add funds” form, and no internal wallet number. The wallet they logged in with is the wallet they pay with.

  1. Home → Wallet — their connected address, ETH and HYPE on Elysium, Receive (copy address) and Send (Privy transaction). This is not an in-app credit balance.
  2. Business → Wallet — the same on-chain balances, plus Open Wallet back to the main Wallet page. No cashout button.
  3. Business → Campaigns → create an ad — they fill the creative and a budget in HYPE. The submit button is Save and pay with wallet. If the budget is above 0, the next screen is Pay with wallet.
  4. Pay with wallet — shows the amount, who they are paying from, the destination address, three numbered steps, then Send with connected wallet. After they confirm in Privy, the page says Confirming on Elysium… until it redirects.
  5. Marketplace product — Pay with wallet next to Ask seller. A modal shows the amount and the seller’s address, then the same Privy button. Ask seller still opens chat if they want to talk first.

If an ad, job, or listing card says Awaiting wallet payment, they have not finished the Privy send yet. Opening that item (or tapping Finish paying) sends them back to the pay screen.

Screen-by-screen UI

Use this when walking a member through the product. Button labels below are exactly what they see.

Log in

Public site → Log in or Sign up (same Privy screen). They connect a Elysium wallet and sign. New wallets then pick a username. That address is later the “Paying from” line on every pay screen. A different wallet will be rejected.

Home → Wallet

  • Left menu (or More on a phone) → Wallet.
  • Large number = on-chain HYPE (and native ETH under it).
  • Receive copies the address so they can fund it from an exchange or another wallet that supports Elysium.
  • Send opens a Privy prompt. Helper text: they confirm in the same wallet they used to sign in.
  • Footer line: balances are on Elysium, not an in-app ledger. There is no deposit, transfer-by-wallet-number, or cashout row.

Business dashboard

  • Open Business from the app (same account, no second login).
  • The welcome card explains ads, listings, and jobs. Learn more jumps to the member docs section on paying.
  • Need help? opens the same docs. Left sidebar: Overview, Campaigns, Marketplace, Jobs, Wallet, Account settings, Help.

Business → Wallet

  • Same address and HYPE / ETH as Home → Wallet.
  • Buttons: Open Wallet (main Wallet page) and View on explorer.
  • Copy icon next to the address. No “request withdrawal.”

Create an ad

  1. Business → Campaigns → create.
  2. Upload a creative, headline, body, CTA, target URL.
  3. Budget is the HYPE they will send from Privy. Helper under the field says that. 0 publishes without a payment.
  4. Submit is Save and pay with wallet (create) or Save Ad (edit). Budget cannot be raised later by editing.
  5. If budget > 0 they land on Pay with wallet. If they leave that page, the campaign card shows Awaiting wallet payment until they finish.

Pay with wallet (ads and listing fees)

Full page, not a modal. Top to bottom:

  1. Purpose line (for example the ad name / listing fee label).
  2. Large amount + HYPE.
  3. Send to — treasury for ads and listing fees.
  4. Paying from — their login wallet. They must use this one.
  5. Three steps: check amount and destination → tap Send with connected wallet and confirm in Privy → stay on the page until the chain confirms.
  6. While waiting: Confirming on Elysium… then a redirect to the ad/job/product overview.
  7. Cancel goes back to the list. The draft stays unpaid.

If treasury is missing, they see a red line: payments are not configured. Set treasury on Admin → Settlement. If you switched to USDC, also set the USDC contract.

Buy on Marketplace

  1. Open a product in the member app (not Business). Price shows in the listing currency; pay still sends HYPE.
  2. Pay with wallet appears next to Ask seller when the seller has a connected wallet and the viewer is not the owner.
  3. The modal title is Pay with wallet. It shows a short how-to, the amount, a Seller address, then Send with connected wallet.
  4. Success toasts: payment sent, or still confirming. Failure: the transfer could not be verified yet.
  5. Ask seller is chat. Paying does not replace it.

Jobs and marketplace listings (seller side)

  • Create job / Create product. Currency helper tells them HYPE is how buyers actually pay.
  • If you set a listing fee above 0, submit becomes Save and pay with wallet and they get the same pay page (treasury) before the listing goes live.
  • Unpaid drafts show Awaiting wallet payment and Finish paying.

Ads

  1. Member creates the campaign and enters a budget.
  2. They sign a HYPE transfer from their login wallet to the treasury for that amount.
  3. The site waits for the receipt, stores the tx hash, and publishes (or leaves the ad pending your approval).
  4. Impression accounting still tracks spent vs total on the ad. That is bookkeeping of an already-paid budget, not a second charge.

In Admin → Ads you can see the payer wallet and the payment tx (explorer link). Approve or reject as before. Deleting an ad does not automatically refund on-chain — refunds are a treasury send you do yourself if you choose to.

Jobs and listings

Posting a job or a marketplace listing is free unless you set a fee in Admin → Settlement:

  • Job listing fee — if above 0, creating a job goes to Pay with wallet before the listing goes live. The amount is shown on the create form.
  • Marketplace listing fee — same for new products.

Prices and salaries on the forms default to HYPE so the catalog matches how people actually pay.

Marketplace purchases

A buyer on a product page taps Pay with wallet. Privy sends HYPE to the seller’s connected address. The site verifies the transfer and stores it under On-chain payments with purpose market_purchase. There is no escrow contract yet — this is a direct peer transfer the seller can see on the explorer.

Buyers can still Ask seller in chat. Paying does not replace conversation.

Admin screens

Sidebar Documentation opens this page. Member Help in the footer opens the public docs.

  • On-chain payments — table of every confirmed Privy payment: user, amount, purpose (ad, job_listing, market_listing, market_purchase), truncated tx, status, date. Open a row for from/to wallets and the full explorer link.
  • Settlement — ETH / USDC toggle (ETH default), treasury address, USDC contract (when USDC is on), job listing fee, marketplace listing fee. Members see non-zero fees before they pay. A link on that page returns here.
  • Users → wallet — that member’s on-chain address and balances. You cannot type a new ledger balance. There is no internal credit to edit.
  • Ads manager — campaign plus approval. Match an unpaid draft to On-chain payments by wallet and amount if they say they already sent.

Acquiring (Stripe / RoboKassa) and cashouts are retired from the sidebar. Old routes may still exist; do not point members at them.

Server settings

On the VPS .env (never commit this file):

  • PRIVY_APP_ID / PRIVY_APP_SECRET
  • ROOT_WALLET_ADDRESSES — comma-separated admin wallets
  • TREASURY_WALLET_ADDRESS (seeded into Settlement; you can also edit treasury in Admin → Settlement)
  • USDC_CONTRACT (only needed if you switch Settlement to USDC)
  • ELYSIUM_CHAIN_ID=99801 and ELYSIUM_RPC_URL
  • Listing fees: Admin → Settlement (not .env)
  • ADMIN_STEP_UP_TTL

After changing these: php artisan config:clear (service name colibriplus). Vue or CSS changes also need a Vite rebuild.

What is retired

  • Email/password login and admin password login
  • In-app ledger deposits (RoboKassa, Stripe, PayPal, and similar)
  • Transfers by internal wallet number
  • Cashout requests
  • Editing a user’s “wallet balance” as a number in admin

If a member still has a $0 internal ledger row in the database, ignore it. The Wallet UI shows chain balances only.

If something fails

  • Pay screen says treasury is not configured — set treasury in Admin → Settlement. If the asset is USDC, also set the USDC contract.
  • Transaction sent but the ad stays “awaiting payment” — wait for the receipt, or open the pay page again. The confirm step polls the chain. Check On-chain payments for the hash.
  • “That transaction does not match” — wrong token, wrong recipient, or they sent from a different address than the one they logged in with. They must pay from the login wallet.
  • Jobs/create errors — currency list now always includes HYPE. If it still fails, check storage/logs/laravel.log.
  • Admin 403 after login — wallet is not in ROOT_WALLET_ADDRESSES, or step-up expired. Sign again on /confirm.

Member help: docs. Product paper: whitepaper.