A harbour stock exchange on Portaldot. News arrives by ship, and every share price is a live pool on the chain’s native DEX.

Pools, slippage and fees, with nothing that tells a newcomer why a price should move or what to do about it.

Most keep made-up prices on a server. Nothing settles, so nothing teaches you how a real pool behaves.

If the operator knows the headline first, the game is rigged. Players have to be able to check who knew what, and when.
In 1600s Amsterdam, a ship coming in, or not, moved the share price of the company that sent it. Portside plays that same game with five stocks people talk about today, each with its own pier.
NVDA chips
AAPL phones
TSLA cars
AMZN parcels
META headsets

The Harbour contract picks a stock, a kind of news and a size: “Earnings beat · NVDA ▲ 12%”.

Buy before good news, sell before bad. Every trade is a real swap signed in the browser.

One public house swap moves that pool by exactly the posted amount. Right call, right money.

Prices drift a quarter of the way back. A minute before the next round, rumour holders hear the next ship.






The size of each move, 5% to 29%, is on the card. The skill is in timing and sizing, and in selling into the move before the tide pulls it back.
Daily missionsThree a day, the same for every captain, like “Sell before a fall”.
12 badgesFrom First trade to Admiral, plus streaks of right calls.
Rumours25 DUCAT paid on-chain to hear the next ship a minute early. Two a day.
Season podiumHighest net worth takes the Admiral’s flag; daily champions are anchored.
PortfolioHoldings, average cost, P&L and a net worth chart for every captain.
Share cardOne tap turns a win into an image for X, with the harbour behind it.8801000 and five share assets 8801001–5, renamed on-chain to NVDA…META.
The keeper commits to a secret seed a round ahead and must reveal that exact seed to the contract.

The contract mixes the seed with the previous block hash, so the keeper can’t choose or predict a headline.

When a ship lands, one house swap moves the pool by exactly the posted amount. Anyone can check its size.

A ticket only reveals the contract’s next draw a minute early. Standings are anchored daily as a Merkle root.
| Harbour contract (pallet-revive) | 0x04570accAB9f6fa3637aE0bBbEDfB9D46440D297 |
| Contract deploy, block 277,716 | 0xb755f84e9b4fda98b008aa5064b51e7d13649c31d5bc053458be56e6d06e1ad3 |
| Harbour.reveal: a round’s news drawn | 0xb9b0a241874a5373d8fd8a09397dbf2c03b3eed72b5a68ab0d84091f1f40b1ff |
| House swap when that ship docked | 0x57779da87fee8f91719bc97f2adfd049c11d58d248a29e3b2246b1bf0d40df8a |
| A captain’s swap signed in the browser | 0x4fe4cd7e4643380a4eeb95eef2dfa7428f008addf3742d1e9906c7981af3ca99 |