Project Name: Point Time Locked Contracts (PTLC)
Description: A PTLC locks funds to a point on an elliptic curve instead of a hash. Whoever proves the secret behind the point before expiry is paid; after expiry the creator reclaims. It is how NoM swaps with Bitcoin by scriptless scripts: on Bitcoin only an ordinary Schnorr signature ever appears, and the two legs cannot be linked.
This proposal takes George’s 2023 contract (PR #13) and 0x3639’s hardening of it to a reviewed, mergeable pull request against dev: go-zenon #138, 31 commits, +5,034 lines, every contributor’s commits preserved.
Why it matters for Zenon: Bitcoin interoperability with no bridge and no custodian, which the official Phase 1 scope lists under Accessibility. The spork id (e59f1e97…) already exists on mainnet, created and never activated, so activation is one ActivateSpork once operators upgrade.
URL:
- Pull request: https://github.com/zenon-network/go-zenon/pull/138
- Branch: https://github.com/sol-znn/go-zenon/tree/ptlc
- Live lab (devnet, 21 scenarios in the browser): https://ptlc.zenon.foo/scenarios/
- Console: https://github.com/sol-znn/ptlc-console
Team:
- sol: port to
dev, third point type, destination rules, review fixes, tests, lab - 0x3639: hardening branch (9 commits, 3,400 lines of tests), two review rounds on #138 (1, 2)
- edgepillar: ptlc-research (offline BTC⇄ZNN swap study, Taproot claim/refund, nonce journal, the KingGorrin key-share leak reproduced), review on #13, review on #138
- George: original design and contract. Already paid; nothing is requested for that work here.
What changed since George’s PR #13
| PR #13 (George, 2023) | PR #138 (now) | By | |
|---|---|---|---|
| Base | master, 2023 |
dev @ c64ed62, own ptlcSporkBit; same mainnet spork id |
sol |
| Unlock on a bad witness | one branch failed open | fails closed | 0x3639 |
| Unlock message | SHA3(id ‖ destination) |
SHA3-256("zenon-ptlc-unlock:v1" ‖ chainId ‖ contract ‖ pointType ‖ id ‖ destination): no replay across networks or contracts |
0x3639 |
| Stored entries, BIP-340 keys | not checked | checked on read, key validated at Create |
0x3639 |
| Point types | Ed25519, BIP-340 | + secp256k1 point (witness is the scalar t, Lightning’s shape) |
sol |
| Recipient | any, chosen at unlock | Create can fix a destination; required for scalar locks, where a revealed t could be front-run |
sol |
| Payable addresses | any | non-zero user-type only, checked at create, in storage, at send and at payout (32aa4e4, c239afa) |
sol, raised by 0x3639 and edgepillar |
| Witness size | unbounded at send: a 1 MB send block for flat plasma | 32 or 64 bytes, refused at send (b877caa) |
sol, raised by 0x3639 |
| Ed25519 small-order lock keys | accepted (anyone can unlock) | refused (6e33447) |
sol, raised by 0x3639 |
| Late contract receive | untested | pinned to the confirming momentum (45e1bbb) |
sol, raised by edgepillar |
| Tests | unit | + adversarial, fuzz, spork boundary, mock-chain swaps on key locks and point locks | 0x3639, sol |
Phases
Phase 1: Contract ready for merge (delivered)
PR #138 open against dev, trial merge clean
Every item from 0x3639’s and edgepillar’s reviews fixed; 0x3639’s re-review closes all six and verifies by execution
NoM⇄NoM and NoM⇄BTC (regtest) swaps run end to end, including refunds
Phase 2: Mainnet
- PR #138 merged and shipped in a release
- Dart SDK and CLI pull requests (branches exist, BIP-340 adaptor signatures tested against the official vectors)
ActivateSporkin the community spork window (opens ~2026-11-03), after operators upgrade- One NoM⇄BTC swap settled on both mainnets
Completion: the spork enforced on mainnet and the swap’s transactions linked here.
Funding
Total Requested Funding = 5,000 ZNN and 50,000 QSR
| Phase | Request | sol | 0x3639 | edgepillar |
|---|---|---|---|---|
| 1 (delivered) | 3,000 ZNN / 30,000 QSR | 1,800 / 18,000 | 600 / 6,000 | 600 / 6,000 |
| 2 | 2,000 ZNN / 20,000 QSR | 1,200 / 12,000 | 400 / 4,000 | 400 / 4,000 |
Project Duration: Phase 1, 2026-10-07 to 2026-10-11. Phase 2 follows the merge and the spork window.
Budget: a maximum-size project, the same as the SDK and CLI updates and the professional documentation. The contract is the smaller half of the work; the reviews, fixes and tests are what make it safe to activate.
Other Information
Risks and dependencies:
- Merge and release are the go-zenon maintainers’ call.
- Activation needs the community spork key inside its window (PR #101).
- Ed25519 signatures are checked with Go’s
ed25519.Verify(cofactorless, not ZIP-215). A counterparty should verify with the same rule (mrstockholmz). - No wallet support yet: swaps run from the CLI or the console.
Previous proposals:
- SYRIUS v0.0.6 Improvements
- P2P Swaps in Syrius
- Submitted 2026-09-25: Ferry, Syrius Extension Wallet, NoM Utilities, Pillar Ownership Transfer, Zenoglyphs VM