Settings
Every ICO setting the backend actually reads, plus the three reference lists — blockchains, token types and launch plans — that decide what a creator can launch and what currency they sell in.
Admin → ICO → Settings (/admin/ico/settings) has six tabs. Three are
key/value settings; three are record lists with their own endpoints.
Opening the page needs access.ico.settings. Saving anything on it needs
edit.ico.settings.
Every key documented here is one the backend reads. Keys that only ever wrote a value nobody consulted have been removed from the page over time, and none are listed below.
Investment
The contribution limits, the platform fee, the soft cap and the vesting switch. All are read fresh on each purchase, so changes take effect immediately without a restart.
Contribution limits
The same three values apply to every offering, in whatever currency that offering sells in. A minimum of 10 is reasonable on a USDT sale and absurd on a BTC one.
If you intend to run sales in more than one currency, set these to the values that make sense for the currency you actually use, and be aware that a BTC-denominated launch plan will inherit them unchanged.
The per-user total counts a user's PENDING, VERIFICATION and RELEASED
contributions to that offering. Rejected and refunded ones drop out and free the
headroom again.
Fees
Charged on top of the contribution, not deducted from it: a 1,000 contribution at 2% debits the buyer 1,020 and the project still receives 1,000. It is routed to the Super Admin wallet as platform revenue.
A value of 0 is honoured as written. It is not treated as "unset" and does not
fall back to a previously configured percentage.
Funding
Read at settlement, so a change applies to offerings already running. Offerings
that finish below it are marked FAILED and every outstanding contribution is
refunded in the same pass.
Vesting
Turning vesting off blocks new launches from using it. Offerings that already vest are unaffected, and existing schedules keep running — those obligations exist and cancelling them would strand buyers.
icoDefaultVestingMonths is a form default only. The creator can change it, and
nothing enforces it.
Compliance
Verification requirements
This tab does not carry a KYC switch, and deliberately so. Token-sale KYC is one
decision, taken in the KYC level builder: enable Token Sale Participation
(purchase_ico) and Token Sale Creation (create_ico) on the levels that
should hold them.
Neither is enforced unless the platform KYC switch and per-feature enforcement are both on. The card on this tab links straight to the level builder.
There used to be one. It wrote a key the purchase route never read, while the offer page was already hiding itself from the same user through the shared feature gate — so the UI refused what the server allowed, and the switch enforced nothing. One dial, in one place, is the fix.
Availability
This is a real stop-the-world switch. While it is on, both the purchase route and the launch route refuse with a 503 and a maintenance message. Existing offerings, schedules and balances are untouched, and everything resumes when you turn it off.
Use it before an upgrade, or when you have discovered something wrong and need the money to stop moving while you work out what.
Announcement
The banner renders on every page under /ico. It is plain text shown to
everybody, signed in or not — do not put anything in it you would not put on a
public page.
Blockchains
The list of chains a creator may launch on. Each row is a display name, a stored
value, and a status flag. Only active rows appear in the launch form.
Wallet addresses and transaction hashes are checked against a fixed table of chain names, compared lowercase:
value |
Address format enforced | Hash format enforced |
|---|---|---|
ethereum, bsc, polygon |
0x + 40 hex |
0x + 64 hex |
bitcoin |
bc1… or legacy 1/3 |
64 hex |
solana |
32–44 base58 | 87–88 base58 |
| anything else | 20–128 chars, no whitespace | none — any string is accepted |
Name the row whatever you like, but set value to one of those five wherever it
applies. A chain valued eth or Ethereum Mainnet gets the fallback, and a
buyer can typo their receiving address into an unrecoverable transfer.
Unknown chain values are accepted on purpose — you cannot enumerate every chain a creator might use. That is a trade-off, not an omission, and it is why the five names matter.
Token types
Name, value and a description. Purely descriptive metadata — ERC-20, BEP-20,
SPL, and so on — shown on the offer page. Nothing is enforced against the value.
At least one active row must exist or no offering can be submitted.
Launch plans
The packages creators buy to list. This is the most consequential list on the page, because a plan sets the currency of every sale made with it.
| Field | Effect |
|---|---|
name, description |
Shown on the plan card |
price |
Charged from the creator's wallet at submission; 0 skips the charge |
currency |
The currency of every contribution to offerings on this plan |
walletType |
The wallet type those contributions come from — FIAT, SPOT or ECO |
features.maxTeamMembers |
Enforced at launch and when adding members later |
features.maxRoadmapItems |
Enforced at launch and when adding items later |
features.maxOfferingPhases |
Enforced at launch |
recommended |
Highlights the plan in the picker |
status |
false hides it from the picker without deleting it |
sortOrder |
Position in the picker |
The plan form also collects maxUpdatePosts, supportLevel,
marketingSupport, auditIncluded, customTokenomics, priorityListing and
kycRequired. They are shown on the plan card and read by nothing.
In particular, kycRequired gates nothing — KYC is decided by the level
builder, platform-wide. Do not sell a plan on the strength of it.
Both foreign keys cascade on delete. Removing a plan or a type deletes every offering using it, live ones included, along with their phases, token details and contributions.
Set status = false instead. It disappears from the picker and everything using
it keeps working.
Creators can upgrade to a different plan after launch, which raises their caps. It does not change the sale's currency and does not alter anything already sold.
A key the settings page does not show
There is a separate investment-limits API behind
/api/admin/ico/settings/limits. It reads and writes the same keys as the
Investment tab, plus one more:
The limits endpoint accepts it, stores it and reports it back. Nothing anywhere in the refund logic consults it. There is no grace period, no time window after which a refund is refused, and no automatic refund triggered by it.
If you set it expecting refunds to be time-limited, they will not be. Refund eligibility is decided entirely by the offering's status.
That endpoint also gates on the caller's role name — only Admin or
Super Admin — rather than on a permission key. An operator on a custom role
holding view.ico.settings is still refused there, even though the settings
page itself opens for them.