@flayerlabs/gamemode-gate 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/LICENSE +9 -0
  2. package/README.md +79 -0
  3. package/dist/chain/discover.d.ts +158 -0
  4. package/dist/chain/discover.d.ts.map +1 -0
  5. package/dist/chain/discover.js +169 -0
  6. package/dist/chain/discover.js.map +1 -0
  7. package/dist/chain/signer.d.ts +46 -0
  8. package/dist/chain/signer.d.ts.map +1 -0
  9. package/dist/chain/signer.js +60 -0
  10. package/dist/chain/signer.js.map +1 -0
  11. package/dist/claims.d.ts +62 -0
  12. package/dist/claims.d.ts.map +1 -0
  13. package/dist/claims.js +128 -0
  14. package/dist/claims.js.map +1 -0
  15. package/dist/demo.d.ts +40 -0
  16. package/dist/demo.d.ts.map +1 -0
  17. package/dist/demo.js +90 -0
  18. package/dist/demo.js.map +1 -0
  19. package/dist/economy.d.ts +46 -0
  20. package/dist/economy.d.ts.map +1 -0
  21. package/dist/economy.js +100 -0
  22. package/dist/economy.js.map +1 -0
  23. package/dist/game-registry.d.ts +17 -0
  24. package/dist/game-registry.d.ts.map +1 -0
  25. package/dist/game-registry.js +90 -0
  26. package/dist/game-registry.js.map +1 -0
  27. package/dist/index.d.ts +23 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +14 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/ledger.d.ts +87 -0
  32. package/dist/ledger.d.ts.map +1 -0
  33. package/dist/ledger.js +222 -0
  34. package/dist/ledger.js.map +1 -0
  35. package/dist/registry.d.ts +55 -0
  36. package/dist/registry.d.ts.map +1 -0
  37. package/dist/registry.js +164 -0
  38. package/dist/registry.js.map +1 -0
  39. package/dist/room.d.ts +98 -0
  40. package/dist/room.d.ts.map +1 -0
  41. package/dist/room.js +215 -0
  42. package/dist/room.js.map +1 -0
  43. package/dist/server.d.ts +92 -0
  44. package/dist/server.d.ts.map +1 -0
  45. package/dist/server.js +695 -0
  46. package/dist/server.js.map +1 -0
  47. package/dist/sessions.d.ts +40 -0
  48. package/dist/sessions.d.ts.map +1 -0
  49. package/dist/sessions.js +144 -0
  50. package/dist/sessions.js.map +1 -0
  51. package/dist/settlement.d.ts +24 -0
  52. package/dist/settlement.d.ts.map +1 -0
  53. package/dist/settlement.js +69 -0
  54. package/dist/settlement.js.map +1 -0
  55. package/dist/store.d.ts +24 -0
  56. package/dist/store.d.ts.map +1 -0
  57. package/dist/store.js +125 -0
  58. package/dist/store.js.map +1 -0
  59. package/dist/turnstile.d.ts +19 -0
  60. package/dist/turnstile.d.ts.map +1 -0
  61. package/dist/turnstile.js +61 -0
  62. package/dist/turnstile.js.map +1 -0
  63. package/package.json +54 -0
  64. package/src/chain/discover.ts +243 -0
  65. package/src/chain/signer.ts +118 -0
  66. package/src/claims.ts +140 -0
  67. package/src/demo.ts +149 -0
  68. package/src/economy.ts +126 -0
  69. package/src/game-registry.ts +107 -0
  70. package/src/index.ts +45 -0
  71. package/src/ledger.ts +355 -0
  72. package/src/registry.ts +212 -0
  73. package/src/room.ts +297 -0
  74. package/src/server.ts +833 -0
  75. package/src/sessions.ts +155 -0
  76. package/src/settlement.ts +72 -0
  77. package/src/store.ts +127 -0
  78. package/src/turnstile.ts +74 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import type { PlayerId } from '@flayerlabs/gamemode-spec';
2
+ export declare class NotSignedIn extends Error {
3
+ constructor(message?: string);
4
+ }
5
+ export declare class Sessions {
6
+ private readonly secret;
7
+ /** The origin the player is actually looking at — the embedding page, not the game. */
8
+ private readonly domain;
9
+ /** Exact configured origin of this gate. Never derive this audience from a request header. */
10
+ private readonly gateOrigin;
11
+ private readonly now;
12
+ constructor(secret: string,
13
+ /** The origin the player is actually looking at — the embedding page, not the game. */
14
+ domain: string,
15
+ /** Exact configured origin of this gate. Never derive this audience from a request header. */
16
+ gateOrigin: string, now?: () => number);
17
+ private sign;
18
+ private seal;
19
+ /** Open an envelope, or null. Every field is checked; nothing is inferred from position. */
20
+ private open;
21
+ private matches;
22
+ /**
23
+ * A challenge to sign.
24
+ *
25
+ * Carries its own expiry and signature rather than being stored, so a restart mid-sign-in does
26
+ * not strand anyone. It is deliberately NOT single-use: doing that needs storage, and the only
27
+ * party who ever sees the signature is the player's own game, which already holds their session.
28
+ */
29
+ challenge(address: string): {
30
+ nonce: string;
31
+ message: string;
32
+ };
33
+ private messageFor;
34
+ /** Check a signed challenge and issue a session token, or explain why not. */
35
+ signIn(address: string, signature: `0x${string}`, nonce: string): Promise<string>;
36
+ private issue;
37
+ /** Who is this, or throw. The only way a request gets an identity. */
38
+ verify(token: string | undefined): PlayerId;
39
+ }
40
+ //# sourceMappingURL=sessions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessions.d.ts","sourceRoot":"","sources":["../src/sessions.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAyB1D,qBAAa,WAAY,SAAQ,KAAK;gBACxB,OAAO,SAAkB;CAItC;AAgBD,qBAAa,QAAQ;IAEjB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,uFAAuF;IACvF,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,8FAA8F;IAC9F,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,GAAG;gBALH,MAAM,EAAE,MAAM;IAC/B,uFAAuF;IACtE,MAAM,EAAE,MAAM;IAC/B,8FAA8F;IAC7E,UAAU,EAAE,MAAM,EAClB,GAAG,GAAE,MAAM,MAAiB;IAa/C,OAAO,CAAC,IAAI;IAIZ,OAAO,CAAC,IAAI;IAKZ,4FAA4F;IAC5F,OAAO,CAAC,IAAI;IAqBZ,OAAO,CAAC,OAAO;IAMf;;;;;;OAMG;IACH,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE;IAQ9D,OAAO,CAAC,UAAU;IAIlB,8EAA8E;IACxE,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAkBvF,OAAO,CAAC,KAAK;IAIb,sEAAsE;IACtE,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,QAAQ;CAM5C"}
@@ -0,0 +1,144 @@
1
+ import { createHmac, timingSafeEqual } from 'node:crypto';
2
+ import { isAddress, verifyMessage } from 'viem';
3
+ import { formatSessionChallenge } from '@flayerlabs/gamemode-spec/embed';
4
+ /**
5
+ * Proving who a player is, once, and carrying it afterwards.
6
+ *
7
+ * A player signs a message with the wallet they are going to buy with; from then on they hold a
8
+ * token. Two details are load-bearing and both were learned the hard way in the system this
9
+ * replaces:
10
+ *
11
+ * **The message names the page the player is looking at, not the game.** A game runs in an iframe
12
+ * on flaunch.gg, so a signing prompt naming the game's own origin is one wallets flag as deceptive
13
+ * — and rightly, because the player is looking at flaunch.gg. The message separately names this
14
+ * gate's configured origin, which lets the parent refuse a challenge replayed from another gate.
15
+ *
16
+ * **The session is a token, never a cookie.** A cross-origin iframe gets partitioned storage, so a
17
+ * cookie set by the gate is not reliably there on the next request.
18
+ */
19
+ /** Long enough to sign in without hurrying, short enough that a stale prompt stops working. */
20
+ const NONCE_TTL_MS = 2 * 60_000;
21
+ /** A round is minutes; a session outliving the day it was made has no purpose. */
22
+ const SESSION_TTL_MS = 12 * 60 * 60_000;
23
+ export class NotSignedIn extends Error {
24
+ constructor(message = 'not signed in') {
25
+ super(message);
26
+ this.name = 'NotSignedIn';
27
+ }
28
+ }
29
+ export class Sessions {
30
+ secret;
31
+ domain;
32
+ gateOrigin;
33
+ now;
34
+ constructor(secret,
35
+ /** The origin the player is actually looking at — the embedding page, not the game. */
36
+ domain,
37
+ /** Exact configured origin of this gate. Never derive this audience from a request header. */
38
+ gateOrigin, now = Date.now) {
39
+ this.secret = secret;
40
+ this.domain = domain;
41
+ this.gateOrigin = gateOrigin;
42
+ this.now = now;
43
+ if (!secret || secret.length < 32) {
44
+ throw new Error('session secret must be at least 32 characters');
45
+ }
46
+ try {
47
+ const gate = new URL(gateOrigin);
48
+ if ((gate.protocol !== 'https:' && gate.protocol !== 'http:') || gate.origin !== gateOrigin)
49
+ throw new Error();
50
+ }
51
+ catch {
52
+ throw new Error('gate origin must be an exact http(s) origin');
53
+ }
54
+ }
55
+ sign(value) {
56
+ return createHmac('sha256', this.secret).update(value).digest('base64url');
57
+ }
58
+ seal(envelope) {
59
+ const body = Buffer.from(JSON.stringify(envelope)).toString('base64url');
60
+ return `${body}.${this.sign(body)}`;
61
+ }
62
+ /** Open an envelope, or null. Every field is checked; nothing is inferred from position. */
63
+ open(value) {
64
+ if (!value)
65
+ return null;
66
+ const parts = value.split('.');
67
+ if (parts.length !== 2)
68
+ return null;
69
+ const [body, mac] = parts;
70
+ if (!this.matches(body, mac))
71
+ return null;
72
+ try {
73
+ const parsed = JSON.parse(Buffer.from(body, 'base64url').toString());
74
+ if (typeof parsed !== 'object' || parsed === null)
75
+ return null;
76
+ const { subject, expiresAt } = parsed;
77
+ if (typeof subject !== 'string' || !subject)
78
+ return null;
79
+ // Finite and whole: `Infinity` and `NaN` both slip past a naive `<` comparison.
80
+ if (typeof expiresAt !== 'number' || !Number.isSafeInteger(expiresAt))
81
+ return null;
82
+ return { subject, expiresAt };
83
+ }
84
+ catch {
85
+ return null;
86
+ }
87
+ }
88
+ matches(value, signature) {
89
+ const expected = Buffer.from(this.sign(value));
90
+ const given = Buffer.from(signature);
91
+ return expected.length === given.length && timingSafeEqual(expected, given);
92
+ }
93
+ /**
94
+ * A challenge to sign.
95
+ *
96
+ * Carries its own expiry and signature rather than being stored, so a restart mid-sign-in does
97
+ * not strand anyone. It is deliberately NOT single-use: doing that needs storage, and the only
98
+ * party who ever sees the signature is the player's own game, which already holds their session.
99
+ */
100
+ challenge(address) {
101
+ // Checked before anything is signed: an address is the one field a caller controls, and the
102
+ // envelope's meaning depends on it being what it claims to be.
103
+ if (!isAddress(address))
104
+ throw new NotSignedIn('that is not a wallet address');
105
+ const nonce = this.seal({ subject: address.toLowerCase(), expiresAt: this.now() + NONCE_TTL_MS });
106
+ return { nonce, message: this.messageFor(address, nonce) };
107
+ }
108
+ messageFor(address, nonce) {
109
+ return formatSessionChallenge(this.domain, address, this.gateOrigin, nonce);
110
+ }
111
+ /** Check a signed challenge and issue a session token, or explain why not. */
112
+ async signIn(address, signature, nonce) {
113
+ if (!isAddress(address))
114
+ throw new NotSignedIn('that is not a wallet address');
115
+ const opened = this.open(nonce);
116
+ if (!opened)
117
+ throw new NotSignedIn('that sign-in code is not valid');
118
+ if (opened.subject !== address.toLowerCase())
119
+ throw new NotSignedIn('that sign-in code is for another wallet');
120
+ if (opened.expiresAt < this.now())
121
+ throw new NotSignedIn('that sign-in code has expired, please try again');
122
+ const valid = await verifyMessage({
123
+ address: address,
124
+ message: this.messageFor(address, nonce),
125
+ signature,
126
+ }).catch(() => false);
127
+ if (!valid)
128
+ throw new NotSignedIn('that signature does not match the wallet');
129
+ return this.issue(address.toLowerCase());
130
+ }
131
+ issue(player) {
132
+ return this.seal({ subject: player, expiresAt: this.now() + SESSION_TTL_MS });
133
+ }
134
+ /** Who is this, or throw. The only way a request gets an identity. */
135
+ verify(token) {
136
+ const opened = this.open(token);
137
+ if (!opened)
138
+ throw new NotSignedIn();
139
+ if (opened.expiresAt < this.now())
140
+ throw new NotSignedIn('your session has expired');
141
+ return opened.subject;
142
+ }
143
+ }
144
+ //# sourceMappingURL=sessions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessions.js","sourceRoot":"","sources":["../src/sessions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { Pool } from 'pg';
2
+ import type { PlayerId } from '@flayerlabs/gamemode-spec';
3
+ import type { Ledger } from './ledger.js';
4
+ import type { ChainReader } from './chain/discover.js';
5
+ export declare class Settlement {
6
+ private readonly pool;
7
+ private readonly ledger;
8
+ private readonly client;
9
+ private readonly calculator;
10
+ constructor(pool: Pool, ledger: Ledger, client: ChainReader, calculator: `0x${string}`);
11
+ /**
12
+ * Bring one round's view of spending up to date with the chain.
13
+ *
14
+ * Returns which wallets changed as well as read/failure counts, so live updates can target only
15
+ * affected players. A read that fails is skipped rather than thrown: one unreachable RPC call
16
+ * must not stop a round, and the next pass will catch it.
17
+ */
18
+ reconcile(roundId: string): Promise<{
19
+ read: number;
20
+ failed: number;
21
+ changed: PlayerId[];
22
+ }>;
23
+ }
24
+ //# sourceMappingURL=settlement.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settlement.d.ts","sourceRoot":"","sources":["../src/settlement.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AAC/B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAmBvD,qBAAa,UAAU;IAEnB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,UAAU;gBAHV,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,WAAW,EACnB,UAAU,EAAE,KAAK,MAAM,EAAE;IAG5C;;;;;;OAMG;IACG,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,QAAQ,EAAE,CAAA;KAAE,CAAC;CAiCjG"}
@@ -0,0 +1,69 @@
1
+ import { parseAbi } from 'viem';
2
+ /**
3
+ * Keeping the ledger honest about what was actually spent.
4
+ *
5
+ * The obvious design is to watch for a swap and match it back to the authorisation that permitted
6
+ * it. That turns out to be both harder and less useful than it sounds: the event carries the buyer
7
+ * and the amount but not the nonce, and a wallet can submit through a relay, so correlating them is
8
+ * guesswork.
9
+ *
10
+ * The contract already keeps the number that matters. `walletSpentWei(poolId, wallet)` is what it
11
+ * enforces against, so reading it is reading the truth rather than inferring it. No matching, no
12
+ * event log to replay, and nothing to get subtly wrong.
13
+ */
14
+ const spendGatedAbi = parseAbi([
15
+ 'function walletSpentWei(bytes32 _poolId, address _wallet) view returns (uint256)',
16
+ ]);
17
+ export class Settlement {
18
+ pool;
19
+ ledger;
20
+ client;
21
+ calculator;
22
+ constructor(pool, ledger, client, calculator) {
23
+ this.pool = pool;
24
+ this.ledger = ledger;
25
+ this.client = client;
26
+ this.calculator = calculator;
27
+ }
28
+ /**
29
+ * Bring one round's view of spending up to date with the chain.
30
+ *
31
+ * Returns which wallets changed as well as read/failure counts, so live updates can target only
32
+ * affected players. A read that fails is skipped rather than thrown: one unreachable RPC call
33
+ * must not stop a round, and the next pass will catch it.
34
+ */
35
+ async reconcile(roundId) {
36
+ const round = await this.pool.query(`select pool_id from rounds where id = $1`, [
37
+ roundId,
38
+ ]);
39
+ const poolId = round.rows[0]?.pool_id;
40
+ if (!poolId)
41
+ return { read: 0, failed: 0, changed: [] };
42
+ const players = await this.ledger.playersIn(roundId);
43
+ let read = 0;
44
+ let failed = 0;
45
+ const changed = [];
46
+ for (const player of players) {
47
+ try {
48
+ const spent = (await this.client.readContract({
49
+ address: this.calculator,
50
+ abi: spendGatedAbi,
51
+ functionName: 'walletSpentWei',
52
+ args: [poolId, player],
53
+ }));
54
+ if (spent > 0n && await this.ledger.recordChainSpend(roundId, player, spent))
55
+ changed.push(player);
56
+ read += 1;
57
+ }
58
+ catch {
59
+ // One unreachable read is not a reason to stop the round, but it is counted. Swallowed
60
+ // entirely, a chain that has been unreachable all day looks exactly like one where nobody
61
+ // has spent anything — and the second is a fine reason to keep authorising, while the
62
+ // first is not.
63
+ failed += 1;
64
+ }
65
+ }
66
+ return { read, failed, changed };
67
+ }
68
+ }
69
+ //# sourceMappingURL=settlement.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settlement.js","sourceRoot":"","sources":["../src/settlement.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAMhC;;;;;;;;;;;GAWG;AAEH,MAAM,aAAa,GAAG,QAAQ,CAAC;IAC7B,kFAAkF;CACnF,CAAC,CAAC;AAEH,MAAM,OAAO,UAAU;IAEF;IACA;IACA;IACA;IAJnB,YACmB,IAAU,EACV,MAAc,EACd,MAAmB,EACnB,UAAyB;QAHzB,SAAI,GAAJ,IAAI,CAAM;QACV,WAAM,GAAN,MAAM,CAAQ;QACd,WAAM,GAAN,MAAM,CAAa;QACnB,eAAU,GAAV,UAAU,CAAe;IACzC,CAAC;IAEJ;;;;;;OAMG;IACH,KAAK,CAAC,SAAS,CAAC,OAAe;QAC7B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAsB,0CAA0C,EAAE;YACnG,OAAO;SACR,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC;QACtC,IAAI,CAAC,MAAM;YAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;QAExD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACrD,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,MAAM,OAAO,GAAe,EAAE,CAAC;QAE/B,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC;oBAC5C,OAAO,EAAE,IAAI,CAAC,UAAU;oBACxB,GAAG,EAAE,aAAa;oBAClB,YAAY,EAAE,gBAAgB;oBAC9B,IAAI,EAAE,CAAC,MAAuB,EAAE,MAAuB,CAAC;iBACzD,CAAC,CAAW,CAAC;gBAEd,IAAI,KAAK,GAAG,EAAE,IAAI,MAAM,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC;oBAAE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACnG,IAAI,IAAI,CAAC,CAAC;YACZ,CAAC;YAAC,MAAM,CAAC;gBACP,uFAAuF;gBACvF,0FAA0F;gBAC1F,sFAAsF;gBACtF,gBAAgB;gBAChB,MAAM,IAAI,CAAC,CAAC;YACd,CAAC;QACH,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IACnC,CAAC;CACF"}
@@ -0,0 +1,24 @@
1
+ import type { Pool, PoolClient } from 'pg';
2
+ /**
3
+ * The complete first-release database schema.
4
+ *
5
+ * Every table is here rather than beside the code that reads it. Two modules owning parts of one
6
+ * table is how a schema drifts: one adds a column, the other's migration never runs, and the
7
+ * failure appears somewhere neither of them looks.
8
+ */
9
+ export declare const SCHEMA = "\ncreate table if not exists rounds (\n id text primary key,\n wei_per_point numeric(78,0) not null check (wei_per_point > 0),\n wallet_cap_wei numeric(78,0) not null check (wallet_cap_wei > 0),\n pool_id text not null,\n opens_at bigint not null,\n closes_at bigint not null,\n books_close_at bigint not null,\n coin_address text,\n coin_name text not null,\n coin_symbol text not null,\n coin_image_url text,\n -- The game's own state, opaque to the platform. Written after every command, so a restart\n -- resumes from here rather than replaying history.\n state jsonb not null,\n -- Commands applied so far. Doubles as the cursor a reconnecting client resumes from.\n seq integer not null default 0 check (seq >= 0),\n constraint rounds_window check (opens_at < closes_at),\n constraint rounds_books_tail check (books_close_at >= closes_at)\n);\n\ncreate table if not exists balances (\n round_id text not null references rounds(id) on delete cascade,\n player text not null,\n points bigint not null default 0 check (points >= 0),\n -- What the chain says this wallet has already spent on this pool. The contract keeps this and\n -- enforces it whatever we believe, so it is the only figure that is actually true.\n chain_spent_wei numeric(78,0) not null default 0 check (chain_spent_wei >= 0),\n primary key (round_id, player)\n);\n\n-- One row per authorisation ever issued. Nothing is deleted: a signature that exists in the world\n-- cannot be un-issued, so the ledger records its fate instead of forgetting it.\ncreate table if not exists claims (\n nonce bigint generated always as identity primary key,\n round_id text not null references rounds(id) on delete cascade,\n player text not null,\n request_id varchar(128) not null check (request_id <> ''),\n requested_wei numeric(78,0) not null check (requested_wei > 0),\n wei numeric(78,0) not null check (wei > 0 and wei <= requested_wei),\n -- Held or released, and nothing else. Whether a swap LANDED is the chain's to say, not ours.\n status text not null check (status in ('held', 'released')),\n deadline bigint not null,\n -- Persisted before a payload leaves the gate. Until signing completes, both values are null.\n signature text,\n signer text,\n created_at timestamptz not null default now(),\n constraint claims_by_request unique (round_id, player, request_id),\n constraint claims_signature_pair check ((signature is null) = (signer is null))\n);\n\ncreate index if not exists claims_by_player on claims (round_id, player) where status = 'held';\n\n-- Which game a coin plays. Addresses are chain-local, so the pin is one row per (chain, coin).\ncreate table if not exists registrations (\n chain_id bigint not null check (chain_id > 0),\n coin text not null check (coin <> ''),\n game_id text not null check (game_id <> ''),\n gate_origin text not null check (gate_origin <> ''),\n deploy_id text not null check (deploy_id <> ''),\n disabled_at timestamptz,\n updated_at timestamptz not null default now(),\n primary key (chain_id, coin)\n);\n\n-- What actually happened, in order. Not used to rebuild state \u2014 the snapshot does that \u2014 but it is\n-- the record of why a state looks the way it does, which is what an incident needs.\ncreate table if not exists commands (\n round_id text not null references rounds(id) on delete cascade,\n seq integer not null check (seq > 0),\n command jsonb not null,\n primary key (round_id, seq)\n);\n";
10
+ /**
11
+ * Run `fn` inside a transaction, committing on success and rolling back on failure.
12
+ *
13
+ * The rollback is itself wrapped, because a connection that has already died throws again on
14
+ * `rollback` — and an unguarded rollback replaces the useful original error.
15
+ */
16
+ export declare function inTransaction<T>(pool: Pool, fn: (tx: PoolClient) => Promise<T>): Promise<T>;
17
+ /** Create the current schema once, serialising concurrent replica startup in this Postgres schema. */
18
+ export declare function migrate(pool: Pool): Promise<void>;
19
+ /**
20
+ * Postgres hands back `numeric` and `bigint` as strings, because they do not fit a JS number.
21
+ * Parsing them in one place stops a `Number()` creeping in and silently losing wei precision.
22
+ */
23
+ export declare const toBigInt: (value: string | number | null | undefined) => bigint;
24
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAE3C;;;;;;GAMG;AACH,eAAO,MAAM,MAAM,6iHA0ElB,CAAC;AAMF;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,UAAU,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAiBjG;AAED,sGAAsG;AACtG,wBAAsB,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAKvD;AAED;;;GAGG;AACH,eAAO,MAAM,QAAQ,GAAI,OAAO,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,KAAG,MAA4B,CAAC"}
package/dist/store.js ADDED
@@ -0,0 +1,125 @@
1
+ /**
2
+ * The complete first-release database schema.
3
+ *
4
+ * Every table is here rather than beside the code that reads it. Two modules owning parts of one
5
+ * table is how a schema drifts: one adds a column, the other's migration never runs, and the
6
+ * failure appears somewhere neither of them looks.
7
+ */
8
+ export const SCHEMA = `
9
+ create table if not exists rounds (
10
+ id text primary key,
11
+ wei_per_point numeric(78,0) not null check (wei_per_point > 0),
12
+ wallet_cap_wei numeric(78,0) not null check (wallet_cap_wei > 0),
13
+ pool_id text not null,
14
+ opens_at bigint not null,
15
+ closes_at bigint not null,
16
+ books_close_at bigint not null,
17
+ coin_address text,
18
+ coin_name text not null,
19
+ coin_symbol text not null,
20
+ coin_image_url text,
21
+ -- The game's own state, opaque to the platform. Written after every command, so a restart
22
+ -- resumes from here rather than replaying history.
23
+ state jsonb not null,
24
+ -- Commands applied so far. Doubles as the cursor a reconnecting client resumes from.
25
+ seq integer not null default 0 check (seq >= 0),
26
+ constraint rounds_window check (opens_at < closes_at),
27
+ constraint rounds_books_tail check (books_close_at >= closes_at)
28
+ );
29
+
30
+ create table if not exists balances (
31
+ round_id text not null references rounds(id) on delete cascade,
32
+ player text not null,
33
+ points bigint not null default 0 check (points >= 0),
34
+ -- What the chain says this wallet has already spent on this pool. The contract keeps this and
35
+ -- enforces it whatever we believe, so it is the only figure that is actually true.
36
+ chain_spent_wei numeric(78,0) not null default 0 check (chain_spent_wei >= 0),
37
+ primary key (round_id, player)
38
+ );
39
+
40
+ -- One row per authorisation ever issued. Nothing is deleted: a signature that exists in the world
41
+ -- cannot be un-issued, so the ledger records its fate instead of forgetting it.
42
+ create table if not exists claims (
43
+ nonce bigint generated always as identity primary key,
44
+ round_id text not null references rounds(id) on delete cascade,
45
+ player text not null,
46
+ request_id varchar(128) not null check (request_id <> ''),
47
+ requested_wei numeric(78,0) not null check (requested_wei > 0),
48
+ wei numeric(78,0) not null check (wei > 0 and wei <= requested_wei),
49
+ -- Held or released, and nothing else. Whether a swap LANDED is the chain's to say, not ours.
50
+ status text not null check (status in ('held', 'released')),
51
+ deadline bigint not null,
52
+ -- Persisted before a payload leaves the gate. Until signing completes, both values are null.
53
+ signature text,
54
+ signer text,
55
+ created_at timestamptz not null default now(),
56
+ constraint claims_by_request unique (round_id, player, request_id),
57
+ constraint claims_signature_pair check ((signature is null) = (signer is null))
58
+ );
59
+
60
+ create index if not exists claims_by_player on claims (round_id, player) where status = 'held';
61
+
62
+ -- Which game a coin plays. Addresses are chain-local, so the pin is one row per (chain, coin).
63
+ create table if not exists registrations (
64
+ chain_id bigint not null check (chain_id > 0),
65
+ coin text not null check (coin <> ''),
66
+ game_id text not null check (game_id <> ''),
67
+ gate_origin text not null check (gate_origin <> ''),
68
+ deploy_id text not null check (deploy_id <> ''),
69
+ disabled_at timestamptz,
70
+ updated_at timestamptz not null default now(),
71
+ primary key (chain_id, coin)
72
+ );
73
+
74
+ -- What actually happened, in order. Not used to rebuild state — the snapshot does that — but it is
75
+ -- the record of why a state looks the way it does, which is what an incident needs.
76
+ create table if not exists commands (
77
+ round_id text not null references rounds(id) on delete cascade,
78
+ seq integer not null check (seq > 0),
79
+ command jsonb not null,
80
+ primary key (round_id, seq)
81
+ );
82
+ `;
83
+ const MIGRATION_LOCK = `select pg_advisory_xact_lock(
84
+ hashtextextended(current_database() || ':' || current_schema() || ':gamemode_schema', 0)
85
+ )`;
86
+ /**
87
+ * Run `fn` inside a transaction, committing on success and rolling back on failure.
88
+ *
89
+ * The rollback is itself wrapped, because a connection that has already died throws again on
90
+ * `rollback` — and an unguarded rollback replaces the useful original error.
91
+ */
92
+ export async function inTransaction(pool, fn) {
93
+ const tx = await pool.connect();
94
+ try {
95
+ await tx.query('begin');
96
+ const result = await fn(tx);
97
+ await tx.query('commit');
98
+ return result;
99
+ }
100
+ catch (error) {
101
+ try {
102
+ await tx.query('rollback');
103
+ }
104
+ catch {
105
+ // Preserve the original error.
106
+ }
107
+ throw error;
108
+ }
109
+ finally {
110
+ tx.release();
111
+ }
112
+ }
113
+ /** Create the current schema once, serialising concurrent replica startup in this Postgres schema. */
114
+ export async function migrate(pool) {
115
+ await inTransaction(pool, async (tx) => {
116
+ await tx.query(MIGRATION_LOCK);
117
+ await tx.query(SCHEMA);
118
+ });
119
+ }
120
+ /**
121
+ * Postgres hands back `numeric` and `bigint` as strings, because they do not fit a JS number.
122
+ * Parsing them in one place stops a `Number()` creeping in and silently losing wei precision.
123
+ */
124
+ export const toBigInt = (value) => BigInt(value ?? 0);
125
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0ErB,CAAC;AAEF,MAAM,cAAc,GAAG;;EAErB,CAAC;AAEH;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAI,IAAU,EAAE,EAAkC;IACnF,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;IAChC,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACxB,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;QAC5B,MAAM,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACzB,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAC7B,CAAC;QAAC,MAAM,CAAC;YACP,+BAA+B;QACjC,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,OAAO,EAAE,CAAC;IACf,CAAC;AACH,CAAC;AAED,sGAAsG;AACtG,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAAU;IACtC,MAAM,aAAa,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE;QACrC,MAAM,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QAC/B,MAAM,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACzB,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,KAAyC,EAAU,EAAE,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC"}
@@ -0,0 +1,19 @@
1
+ import type { Admit } from './server.js';
2
+ export interface TurnstileAdmitOptions {
3
+ secret: string;
4
+ /** Exact hostnames on which the trusted parent may render the widget. */
5
+ hostnames: readonly string[];
6
+ /** The action configured on the widget. */
7
+ action: string;
8
+ timeoutMs?: number;
9
+ /** Test seam for the one external boundary. Production uses global fetch. */
10
+ fetch?: typeof globalThis.fetch;
11
+ }
12
+ /**
13
+ * Reference Cloudflare Turnstile policy for the gate's generic admission seam.
14
+ *
15
+ * It verifies only session creation. Gameplay and claim policy remain composable operator choices.
16
+ * Every non-explicit success fails closed, including network, HTTP and malformed-response failures.
17
+ */
18
+ export declare function createTurnstileAdmit(options: TurnstileAdmitOptions): Admit;
19
+ //# sourceMappingURL=turnstile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"turnstile.d.ts","sourceRoot":"","sources":["../src/turnstile.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAOzC,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,yEAAyE;IACzE,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7B,2CAA2C;IAC3C,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6EAA6E;IAC7E,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;CACjC;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,qBAAqB,GAAG,KAAK,CAiD1E"}
@@ -0,0 +1,61 @@
1
+ const SITEVERIFY = 'https://challenges.cloudflare.com/turnstile/v0/siteverify';
2
+ const MAX_TOKEN_LENGTH = 2_048;
3
+ const DEFAULT_TIMEOUT_MS = 8_000;
4
+ const FAILURE = { ok: false, reason: 'human verification failed, please try again' };
5
+ /**
6
+ * Reference Cloudflare Turnstile policy for the gate's generic admission seam.
7
+ *
8
+ * It verifies only session creation. Gameplay and claim policy remain composable operator choices.
9
+ * Every non-explicit success fails closed, including network, HTTP and malformed-response failures.
10
+ */
11
+ export function createTurnstileAdmit(options) {
12
+ if (!options.secret)
13
+ throw new RangeError('Turnstile secret is required');
14
+ if (!options.action)
15
+ throw new RangeError('Turnstile action is required');
16
+ if (options.hostnames.length === 0)
17
+ throw new RangeError('at least one Turnstile hostname is required');
18
+ const hostnames = new Set(options.hostnames.map((hostname) => hostname.toLowerCase()));
19
+ const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
20
+ if (!Number.isSafeInteger(timeoutMs) || timeoutMs <= 0) {
21
+ throw new RangeError('Turnstile timeoutMs must be a positive safe integer');
22
+ }
23
+ const verify = options.fetch ?? globalThis.fetch;
24
+ return async (request) => {
25
+ if (request.at !== 'session')
26
+ return { ok: true };
27
+ if (typeof request.evidence !== 'string' ||
28
+ request.evidence.length === 0 ||
29
+ request.evidence.length > MAX_TOKEN_LENGTH) {
30
+ return FAILURE;
31
+ }
32
+ const body = new URLSearchParams({
33
+ secret: options.secret,
34
+ response: request.evidence,
35
+ idempotency_key: globalThis.crypto.randomUUID(),
36
+ ...(request.ip ? { remoteip: request.ip } : {}),
37
+ });
38
+ try {
39
+ const response = await verify(SITEVERIFY, {
40
+ method: 'POST',
41
+ headers: { 'content-type': 'application/x-www-form-urlencoded' },
42
+ body,
43
+ signal: AbortSignal.timeout(timeoutMs),
44
+ });
45
+ if (!response.ok)
46
+ return FAILURE;
47
+ const result = (await response.json());
48
+ if (result.success !== true ||
49
+ typeof result.hostname !== 'string' ||
50
+ !hostnames.has(result.hostname.toLowerCase()) ||
51
+ result.action !== options.action) {
52
+ return FAILURE;
53
+ }
54
+ return { ok: true };
55
+ }
56
+ catch {
57
+ return FAILURE;
58
+ }
59
+ };
60
+ }
61
+ //# sourceMappingURL=turnstile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"turnstile.js","sourceRoot":"","sources":["../src/turnstile.ts"],"names":[],"mappings":"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"}