Selinos
Contracts

Addresses

Every address Selinos uses on Elysium, what each one does, which single one you ever send money to, and how to check that the one you are looking at is the real one.

The chain

FieldValue
NetworkElysium
Chain id99901 decimal, 0x1863d hex
CurrencyHYPE, 18 decimals, native on the chain. Gas, node purchases, credits and withdrawals are all paid in it, with no wrapped token.
Settles toHyperEVM, chain id 999
RPChttps://rpc.elysium.kinetiq.xyz
Explorerhttps://elysium.kinetiq.xyz

Selinos is built for Elysium mainnet, chain id 99901. There is no Selinos deployment on any other network. Anything claiming to be Selinos elsewhere is not this project.

The contract

There is one. SelinosFactory records nodes and holds their balances. There is no treasury contract, no voucher contract and no proxy.

SelinosFactory
0xddfb36637C26D9585B019a7194fFC6BCe215D2D1
Records nodes, holds node balances, and pays them out when the node’s own owner calls withdraw. Verified on the explorer. Its interface is documented on Factory interface. Do not send HYPE here to buy a node.

Wallets and roles

Four wallets, kept deliberately separate so that each one can only cost what it is worth. The payments wallet is configuration. The other three are roles the contract itself enforces, so the addresses below are read from the contract, not from a config file.

Payments wallet
0xaf01f1cf35403bb69be495a163b9d553d5372b81
Safe to send to, and the only one. Send exactly 0.6 HYPE here to buy one node. A watcher sees the transfer and the relayer mints your node against that transaction’s hash. It is an ordinary wallet, not a contract: it runs no code and can never mint anything by itself. See Deploying a node.
Owner
Could not read the contract just now
Never send anything here. The cold key that deployed the contract. It can change roles, pause new mints, set maxPerWallet, and rescue contract funds that belong to no node. It cannot touch a node balance. Ownership moves only in two steps, transferOwnership then acceptOwnership. See Security model.
Relayer
Could not read the contract just now
Never send anything here. A server key whose only power is mintFor. It creates your node and pays the gas for it. It holds gas and nothing else, so if it leaked the cost would be unauthorised mints and gas, never anyone’s balance.
Distributor
Could not read the contract just now
Never send anything here. A server key whose only power is creditBatch, which is payable, so this is the wallet that actually sends the HYPE that lands on node balances. It carries the payout float and nothing more.
The role addresses could not be read from the chain while this page was generated, so they are shown as unavailable rather than filled in from configuration. Read them yourself with the cast calls below.

No role can move a node balance. withdraw and withdrawAll check the caller against the node’s own owner and against nothing else, which is why the list above has no entry that is able to pay you or to take from you.

Verifying an address

Do not trust a contract address from a message, a reply, or a search result, including this one if you can check it another way. Three checks, in increasing strength:

  1. Open it on the explorer. The source is verified, so you can read the exact code that is deployed.
  2. Ask the contract about itself. A copy with different roles or a different node count will answer differently.
  3. Compare against the repository. Build the contract and check that the deployed bytecode matches what you built.
cast
cast call $FACTORY "owner()(address)"        --rpc-url https://rpc.elysium.kinetiq.xyz
cast call $FACTORY "relayer()(address)"      --rpc-url https://rpc.elysium.kinetiq.xyz
cast call $FACTORY "distributor()(address)"  --rpc-url https://rpc.elysium.kinetiq.xyz
cast call $FACTORY "maxPerWallet()(uint256)" --rpc-url https://rpc.elysium.kinetiq.xyz
cast call $FACTORY "outstanding()(uint256)"  --rpc-url https://rpc.elysium.kinetiq.xyz
cast call $FACTORY "isSolvent()(bool)"       --rpc-url https://rpc.elysium.kinetiq.xyz

The strongest single check on the money is the last two together. outstanding is the sum of every node balance, and isSolvent() says whether the contract holds at least that much. A factory that cannot answer both is not this one. See Settlement.

There is nothing equivalent to check about the payments wallet, because it is a plain wallet with no code and no state. The check that matters there is the sale itself: your payment transaction hash appears as paymentRef in the NodeMinted log of the mint, and it can only ever appear once.

If an address changes

The contract is not upgradeable. There is no proxy and no admin key that can replace the implementation, so the factory at a given address is the code that was deployed there and stays that way. A new deployment would be a new address, announced as such, and the old one would keep working for the nodes it holds, including their withdrawals.

What can change without a redeployment are the things the owner controls: the relayer, the distributor, the per-wallet cap and the pause flag. Each emits an event when it changes, so the history is public and this page reads the current values rather than remembering the old ones. The payments wallet can also change, which is why you should take it from this page or from the deploy flow at the moment you pay rather than from a saved copy. See Events and Security model.