Project Introduction
Portside is a browser trading game set in a harbour. You trade five stocks people talk about today: Nvidia (chips), Apple (phones), Tesla (cars), Amazon (parcels) and Meta (headsets). Each one is a real DUCAT pool on Portaldot’s native DEX. Every five minutes a ship sails in with news about one of them, such as an earnings beat, a launch that sells out, a supply storm or a rival fleet. You have 45 seconds to buy or sell before it docks and moves the price. The best net worth at the end of the season takes the podium.
To play, open https://portside.nerom.site. You don’t need a sign-up, a wallet extension or any tokens. You get 1,000 DUCAT and a wallet in your browser, and the harbour pays your gas.
Problem Solved
Portaldot V3 has strong building blocks: native assets, a native DEX (pallet-asset-conversion) and an EVM (pallet-revive). What it doesn’t have yet is a game or consumer app that someone with no crypto background can enjoy in under a minute. New users bounce at the first wallet prompt or “where do I get POT?”.
Portside is a front door to the V3 runtime. A new player is trading on the native DEX within a minute, with no setup at all. Every click is a real testnet transaction: price moves come from real pool swaps, and the news is drawn by a contract nobody can game.
Link
Live Web: https://portside.nerom.site
Demo Video (1:57): https://youtu.be/KOuHRhumiUc
GitHub: https://github.com/neromtoobad/portside
Pitch Deck: Portside · Pitch deck (PDF)
Technical Highlights
1. Every share price is a live pool on Portaldot’s native DEX
DUCAT and the five stocks are pallet-assets assets, and each stock trades in a DUCAT pool on pallet-asset-conversion. When news docks, one public house swap moves that pool’s spot price by exactly the posted amount. Halfway through each round every market drifts a quarter of the way back to its base price, which keeps the economy bounded. Every player trade moves the real price too.
2. Commit-reveal news drawn on-chain by Harbour.sol (pallet-revive)
The keeper commits to a seed one round ahead. Harbour.reveal mixes that seed with the previous block hash: keccak256(seed, blockhash, season, round). Nobody, the keeper included, can pick or predict the next ship. The contract is only 1.7 KB, because storage costs 0.06 tPOT per byte. It has 6 Hardhat tests.
Contract: 0x04570accAB9f6fa3637aE0bBbEDfB9D46440D297 (Portaldot V3 testnet)
3. Zero-friction onboarding with sponsored fees
Each player gets an sr25519 burner wallet in the browser, a 1,000 DUCAT starter purse and a small tPOT fee tank that the keeper refills. Captains sign their own swaps in the browser, so nobody goes looking for gas.
4. Rumour tickets: paid information, not a different outcome
A 25 DUCAT rumour ticket, paid on-chain to the harbourmaster with two allowed a day, lets a captain hear the next ship a minute before the board posts it. The draw still comes from the contract, so a ticket buys time, not a better result.
5. Daily standings anchored on-chain
At the end of each day the standings are hashed into a Merkle root and anchored with Harbour.anchorDay, so any podium or payout can be checked later. The site also has a full game layer:
- Home, Guide, Season and Portfolio pages
- three daily missions and 12 badges
- a net-worth chart for each player
- dock drama: a countdown, a splash and a “You called it!” pop with your gain
6. What we found on V3 (written up in the README for other builders)
- Paying fees in a pool asset through
ChargeAssetTxPaymentpanics the V3 runtime during transaction validation (wasm unreachable). Portside runs with native fees plus a sponsored tank for each player. Switching to DUCAT fees is a single env var once the runtime is fixed. - The public
wss://endpoint drops large frames such as metadata, so the keeper relays RPC over HTTPS. - Some blocks contain extrinsics with an asset-fee
assetIdthat polkadot.js can’t decode, so the keeper’s indexer reads raw blocks.
Sample transactions:
| Step | Hash |
|---|---|
Harbour.reveal: a round’s news drawn on-chain |
0xb9b0a241874a5373d8fd8a09397dbf2c03b3eed72b5a68ab0d84091f1f40b1ff |
| House swap when that ship docked | 0x57779da87fee8f91719bc97f2adfd049c11d58d248a29e3b2246b1bf0d40df8a |
| Captain registered: starter purse + fee tank | 0xb37eb52c330c60a29318a9865f9e836257ac06d50ce285d6edbd99f3a6e747ac |
| A captain’s swap signed in the browser | 0x4fe4cd7e4643380a4eeb95eef2dfa7428f008addf3742d1e9906c7981af3ca99 |
Team
nerom: solo build
- GitHub: @neromtoobad
- Roles: design, contract, keeper, web
- Project nature: a single-person build. It’s a consumer game that onboards non-crypto players onto Portaldot’s native assets, native DEX and EVM.
Judges & Voting Fit
For Judges: Portside is live on the Portaldot V3 testnet and uses V3’s native features rather than a generic EVM clone:
pallet-assetsfor DUCAT and the stockspallet-asset-conversionpools for every price- a
pallet-revivecontract for a provably fair commit-reveal draw and on-chain daily anchors - sponsored native fees
The repo is public. It has the contract, its tests, the keeper, the web app and a Chopsticks fork for local development, plus a write-up of the V3 issues we hit.
For Community Voters: Open https://portside.nerom.site and you’re trading in 30 seconds. You don’t need a wallet, tokens or any setup. Read the board, guess where the ship is headed, buy before it docks, and climb the season podium.
Game prices are DUCAT pools on the Portaldot testnet, not market data. Portside isn’t affiliated with Nvidia, Apple, Tesla, Amazon or Meta. No real money is involved.