@provable-games/dm-engine 0.1.0 → 0.3.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.
- package/README.md +69 -0
- package/dist/constants/beast.d.ts +0 -2
- package/dist/constants/beast.d.ts.map +1 -1
- package/dist/constants/beast.js +0 -2
- package/dist/constants/beast.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/protocol.d.ts +23 -6
- package/dist/protocol.d.ts.map +1 -1
- package/dist/protocol.js +73 -47
- package/dist/protocol.js.map +1 -1
- package/dist/replay.d.ts +21 -3
- package/dist/replay.d.ts.map +1 -1
- package/dist/replay.js +229 -169
- package/dist/replay.js.map +1 -1
- package/dist/rules/gameSimulation.d.ts +1 -1
- package/dist/rules/gameSimulation.d.ts.map +1 -1
- package/dist/rules/gameSimulation.js +5 -5
- package/dist/rules/gameSimulation.js.map +1 -1
- package/dist/rules/processFutures.d.ts +7 -6
- package/dist/rules/processFutures.d.ts.map +1 -1
- package/dist/rules/processFutures.js +8 -7
- package/dist/rules/processFutures.js.map +1 -1
- package/dist/transcript.d.ts +10 -6
- package/dist/transcript.d.ts.map +1 -1
- package/dist/transcript.js +4 -9
- package/dist/transcript.js.map +1 -1
- package/dist/types.d.ts +12 -2
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
package/README.md
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# @provable-games/dm-engine
|
|
2
|
+
|
|
3
|
+
The Death Mountain game rules and commit-reveal protocol in TypeScript — a mirror of the Cairo
|
|
4
|
+
in `contracts/src`.
|
|
5
|
+
|
|
6
|
+
Consumed by three places that must agree exactly:
|
|
7
|
+
|
|
8
|
+
| | |
|
|
9
|
+
| --- | --- |
|
|
10
|
+
| `death-mountain-client` | the board the player acts on |
|
|
11
|
+
| `indexer` | off-chain replay of committed transcripts into the event tables |
|
|
12
|
+
| `api` | token-id decoding |
|
|
13
|
+
|
|
14
|
+
## Why it has to be shared
|
|
15
|
+
|
|
16
|
+
Under commit-reveal the chain executes nothing. The client's simulation is not a guess that
|
|
17
|
+
on-chain events correct a second later — it *is* the board, and nothing corrects it. If it
|
|
18
|
+
diverges from the Cairo replay by one point of health, the next committed action is
|
|
19
|
+
state-invalid, settlement rejects the transcript, and the run is permanently unplayable.
|
|
20
|
+
|
|
21
|
+
Two copies of the rules would drift. There is one.
|
|
22
|
+
|
|
23
|
+
## Keeping it honest
|
|
24
|
+
|
|
25
|
+
The rules are hand-maintained, so nothing in Cairo forces them to stay in step. Three things do:
|
|
26
|
+
|
|
27
|
+
- **`test/vectors.scheme.json`** — `root`, `fold`, `action_entropy` and every opcode encoding,
|
|
28
|
+
printed by the real Cairo. Regenerate with
|
|
29
|
+
`snforge test commit_reveal::test_vectors` in `contracts/`, then paste into the fixture.
|
|
30
|
+
- **`test/replay.entropy.test.ts`** — asserts each action is a pure function of
|
|
31
|
+
`(state, action, entropy)` and draws **zero** `Math.random()`. A missed roll is the bug class
|
|
32
|
+
that bricks runs.
|
|
33
|
+
- **`GameSettled` cross-check** — in production the indexer diffs its replayed adventurer against
|
|
34
|
+
the contract's packed result and writes a `replay_divergences` row on mismatch. That is the only
|
|
35
|
+
genuinely independent check, since the client and the indexer share this code.
|
|
36
|
+
|
|
37
|
+
## Publishing
|
|
38
|
+
|
|
39
|
+
`indexer`, `api` and the client all depend on the **published** package (`^0.1.0`), not a
|
|
40
|
+
workspace link. That is deliberate: both backends deploy via Dockerfiles that build from their own
|
|
41
|
+
subdirectory, where a `workspace:*` specifier cannot resolve.
|
|
42
|
+
|
|
43
|
+
The cost is that a rules change is not picked up by its consumers until it ships:
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
pnpm test && pnpm build # vectors must pass before anything goes out
|
|
47
|
+
npm version patch # or minor, if the API changed
|
|
48
|
+
npm publish # publishConfig already sets public access
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
then bump the range in `indexer`, `api` and the client.
|
|
52
|
+
|
|
53
|
+
To iterate locally without publishing, point a consumer at the checkout temporarily
|
|
54
|
+
(`pnpm add link:../packages/engine`) and put it back before committing.
|
|
55
|
+
|
|
56
|
+
## Layout
|
|
57
|
+
|
|
58
|
+
```
|
|
59
|
+
src/
|
|
60
|
+
protocol.ts domains, action codec, root / fold / actionEntropy
|
|
61
|
+
transcript.ts ActionCommitted decoding, re-folding, chain ordering
|
|
62
|
+
actions.ts GameAction <-> encoded felt
|
|
63
|
+
replay.ts applyAction(state, action, entropy)
|
|
64
|
+
packing.ts unpackAdventurer / unpackBag
|
|
65
|
+
rules/ combat, exploration, loot, market, beast, token ids
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
`applyAction` is the client's `useGameCore` body verbatim; only the wrapper differs. It never
|
|
69
|
+
themes a beast — the indexer stores raw ids and every reader restyles on read.
|
|
@@ -2,8 +2,6 @@ export declare const BEAST_SPECIAL_NAME_LEVEL_UNLOCK = 19;
|
|
|
2
2
|
export declare const MAX_SPECIAL2: bigint;
|
|
3
3
|
export declare const MAX_SPECIAL3: bigint;
|
|
4
4
|
export declare const MAX_BEAST_ID: bigint;
|
|
5
|
-
export declare const STARTER_BEAST_HEALTH: bigint;
|
|
6
|
-
export declare const STARTER_BEAST_ATTACK_DAMAGE = 10;
|
|
7
5
|
export declare const MAXIMUM_HEALTH: bigint;
|
|
8
6
|
export declare const BEAST_MIN_DAMAGE = 2;
|
|
9
7
|
export declare const GOLD_MULTIPLIER: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"beast.d.ts","sourceRoot":"","sources":["../../src/constants/beast.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,+BAA+B,KAAK,CAAC;AAClD,eAAO,MAAM,YAAY,QAAa,CAAC;AACvC,eAAO,MAAM,YAAY,QAAa,CAAC;AACvC,eAAO,MAAM,YAAY,QAAa,CAAC;AAGvC,eAAO,MAAM,
|
|
1
|
+
{"version":3,"file":"beast.d.ts","sourceRoot":"","sources":["../../src/constants/beast.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,+BAA+B,KAAK,CAAC;AAClD,eAAO,MAAM,YAAY,QAAa,CAAC;AACvC,eAAO,MAAM,YAAY,QAAa,CAAC;AACvC,eAAO,MAAM,YAAY,QAAa,CAAC;AAGvC,eAAO,MAAM,cAAc,QAAe,CAAC;AAC3C,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAGlC,eAAO,MAAM,eAAe;;;;;;CAMlB,CAAC;AACX,eAAO,MAAM,mBAAmB,IAAI,CAAC;AACrC,eAAO,MAAM,iBAAiB,IAAI,CAAC;AAEnC,eAAO,MAAM,cAAc,UAI1B,CAAC;AAGF,eAAO,MAAM,mBAAmB,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;CAsExD,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;CAmBxD,CAAC;AAGF,eAAO,MAAM,WAAW,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;CAmGhD,CAAC"}
|
package/dist/constants/beast.js
CHANGED
|
@@ -4,8 +4,6 @@ export const MAX_SPECIAL2 = BigInt(69); // Max prefix index
|
|
|
4
4
|
export const MAX_SPECIAL3 = BigInt(18); // Max suffix index
|
|
5
5
|
export const MAX_BEAST_ID = BigInt(75);
|
|
6
6
|
// Combat-related constants
|
|
7
|
-
export const STARTER_BEAST_HEALTH = BigInt(3);
|
|
8
|
-
export const STARTER_BEAST_ATTACK_DAMAGE = 10;
|
|
9
7
|
export const MAXIMUM_HEALTH = BigInt(1023); // 2^10 - 1
|
|
10
8
|
export const BEAST_MIN_DAMAGE = 2;
|
|
11
9
|
// Constants for reward calculations
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"beast.js","sourceRoot":"","sources":["../../src/constants/beast.ts"],"names":[],"mappings":"AAAA,4CAA4C;AAC5C,MAAM,CAAC,MAAM,+BAA+B,GAAG,EAAE,CAAC;AAClD,MAAM,CAAC,MAAM,YAAY,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,mBAAmB;AAC3D,MAAM,CAAC,MAAM,YAAY,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,mBAAmB;AAC3D,MAAM,CAAC,MAAM,YAAY,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC;AAEvC,2BAA2B;AAC3B,MAAM,CAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"beast.js","sourceRoot":"","sources":["../../src/constants/beast.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* (off-chain replay of committed transcripts). There is one implementation of the
|
|
7
7
|
* rules; if this and the contracts ever disagree, that is the bug.
|
|
8
8
|
*/
|
|
9
|
-
// Commit-reveal protocol:
|
|
9
|
+
// Commit-reveal protocol: action codec, root/fold, and the per-action seed mix.
|
|
10
10
|
export * from "./protocol.js";
|
|
11
11
|
export * from "./actions.js";
|
|
12
12
|
export * from "./packing.js";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,gFAAgF;AAChF,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAE1B,UAAU;AACV,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAE5B,8BAA8B;AAC9B,cAAc,YAAY,CAAC;AAC3B,OAAO,KAAK,aAAa,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,cAAc,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,aAAa,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,iBAAiB,MAAM,yBAAyB,CAAC;AAE7D,SAAS;AACT,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,oBAAoB,CAAC"}
|
package/dist/protocol.d.ts
CHANGED
|
@@ -1,8 +1,3 @@
|
|
|
1
|
-
export declare const PROTOCOL_VERSION = 1;
|
|
2
|
-
export declare const ACTION_ENCODING_VERSION = 1;
|
|
3
|
-
export declare const ROOT_DOMAIN_V1 = 121694572726488482774558358552433875120163030783537n;
|
|
4
|
-
export declare const ACTION_DOMAIN_V1 = 7975375518203149207113456586092306125417059215317358129n;
|
|
5
|
-
export declare const ENTROPY_DOMAIN_V1 = 2041696132660006197021044886039630387199149808693909870129n;
|
|
6
1
|
export declare const Opcode: {
|
|
7
2
|
readonly START: 1;
|
|
8
3
|
readonly EXPLORE: 2;
|
|
@@ -38,9 +33,31 @@ export interface DecodedAction {
|
|
|
38
33
|
purchases: ProtocolPurchase[];
|
|
39
34
|
items: number[];
|
|
40
35
|
}
|
|
36
|
+
/** `scheme::root` -- the seed a chain starts from. One absorbed element; see `fold`. */
|
|
41
37
|
export declare function root(gameId: bigint): bigint;
|
|
38
|
+
/**
|
|
39
|
+
* `scheme::fold` -- one link of the chain.
|
|
40
|
+
*
|
|
41
|
+
* Three absorbed elements against `root`'s one and `actionSeed`'s two. Poseidon pads by length,
|
|
42
|
+
* so three hashes of three different arities cannot collide and none of them carries a domain
|
|
43
|
+
* tag. Changing the arity of one means checking it against the other two.
|
|
44
|
+
*/
|
|
42
45
|
export declare function fold(previous: bigint, encodedAction: bigint, commitBlock: bigint): bigint;
|
|
43
|
-
|
|
46
|
+
/** `ImplAdventurer::get_simple_entropy` -- poseidon([xp, id]). */
|
|
47
|
+
export declare function simpleEntropy(xp: number, id: bigint): bigint;
|
|
48
|
+
/** `ImplAdventurer::get_battle_entropy` -- poseidon([xp, id, health]). */
|
|
49
|
+
export declare function battleEntropy(xp: number, id: bigint, health: number): bigint;
|
|
50
|
+
/**
|
|
51
|
+
* `randomness::get_random_seed`, unseeded branch -- the felt an action actually rolls with.
|
|
52
|
+
*
|
|
53
|
+
* `blockHash` arrives raw: no fold, no rolling commitment. What separates two actions that share
|
|
54
|
+
* a block -- everything in one `commit_action` bundle does -- is the adventurer state mixed in
|
|
55
|
+
* here, which is why this takes the state at the moment the action runs rather than after it.
|
|
56
|
+
*
|
|
57
|
+
* Stat boosts do not reach the preimage: `add_stat_boosts` touches `stats` and `luck` only, so
|
|
58
|
+
* boosted and unboosted adventurers hash identically and the caller need not care which it holds.
|
|
59
|
+
*/
|
|
60
|
+
export declare function actionSeed(blockHash: bigint, adventurerId: bigint, xp: number, health: number, inBattle: boolean): bigint;
|
|
44
61
|
export declare function encodeStart(weapon: number): bigint;
|
|
45
62
|
export declare function encodeExplore(tillDamage: number, tillGold: boolean): bigint;
|
|
46
63
|
export declare function encodeAttack(tillHealth: number, tillBeastHealth: number): bigint;
|
package/dist/protocol.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,
|
|
1
|
+
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,MAAM;;;;;;;;;;CAUT,CAAC;AAEX,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,MAAM,CAAC,CAAC,MAAM,OAAO,MAAM,CAAC,CAAC;AAE/D,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,WAAW,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,QAAQ,CAAC,aAAa,CAAC,CAAC;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,gBAAgB,EAAE,CAAC;IAC9B,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AA6DD,wFAAwF;AACxF,wBAAgB,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAE3C;AAED;;;;;;GAMG;AACH,wBAAgB,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAKzF;AAED,kEAAkE;AAClE,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED,0EAA0E;AAC1E,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAE5E;AAED;;;;;;;;;GASG;AACH,wBAAgB,UAAU,CACxB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,OAAO,GAChB,MAAM,CAKR;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAGlD;AAED,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,MAAM,CAG3E;AAED,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,MAAM,CAIhF;AAED,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAGrD;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,CAkB9D;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,gBAAgB,EAAE,GAAG,MAAM,CAYhF;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAUnD;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAUlD;AAED,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,CAmEvD;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,CAEzD"}
|
package/dist/protocol.js
CHANGED
|
@@ -1,9 +1,4 @@
|
|
|
1
1
|
import { hash } from "starknet";
|
|
2
|
-
export const PROTOCOL_VERSION = 1;
|
|
3
|
-
export const ACTION_ENCODING_VERSION = 1;
|
|
4
|
-
export const ROOT_DOMAIN_V1 = 121694572726488482774558358552433875120163030783537n;
|
|
5
|
-
export const ACTION_DOMAIN_V1 = 7975375518203149207113456586092306125417059215317358129n;
|
|
6
|
-
export const ENTROPY_DOMAIN_V1 = 2041696132660006197021044886039630387199149808693909870129n;
|
|
7
2
|
export const Opcode = {
|
|
8
3
|
START: 1,
|
|
9
4
|
EXPLORE: 2,
|
|
@@ -15,19 +10,24 @@ export const Opcode = {
|
|
|
15
10
|
DROP: 8,
|
|
16
11
|
SURRENDER: 9,
|
|
17
12
|
};
|
|
18
|
-
|
|
13
|
+
/** Payload bit positions. The opcode occupies bits 0-3; every payload starts at bit 4. */
|
|
14
|
+
const SHIFT_4 = 0x10n;
|
|
19
15
|
const SHIFT_8 = 0x100n;
|
|
16
|
+
const SHIFT_9 = 0x200n;
|
|
20
17
|
const SHIFT_12 = 0x1000n;
|
|
21
|
-
const
|
|
22
|
-
const
|
|
23
|
-
const SHIFT_21 = 0x200000n;
|
|
24
|
-
const SHIFT_24 = 0x1000000n;
|
|
18
|
+
const SHIFT_17 = 0x20000n;
|
|
19
|
+
const SHIFT_20 = 0x100000n;
|
|
25
20
|
const STARTING_WEAPONS = new Set([12, 16, 46, 76]);
|
|
26
21
|
function poseidon(values) {
|
|
27
22
|
return BigInt(hash.computePoseidonHashOnElements(values));
|
|
28
23
|
}
|
|
24
|
+
/**
|
|
25
|
+
* Bits 0-3. No version nibble sits above it: the opcode field has seven unused values, so an
|
|
26
|
+
* encoding that ADDS actions needs no bump, and one that changes what an existing opcode means
|
|
27
|
+
* breaks in-flight games on semantics whatever tag it carries.
|
|
28
|
+
*/
|
|
29
29
|
function header(opcode) {
|
|
30
|
-
return
|
|
30
|
+
return BigInt(opcode);
|
|
31
31
|
}
|
|
32
32
|
function assertUnsigned(value, bits, name) {
|
|
33
33
|
if (!Number.isInteger(value) || value < 0 || value >= 2 ** bits) {
|
|
@@ -62,35 +62,64 @@ function empty(opcode) {
|
|
|
62
62
|
items: [],
|
|
63
63
|
};
|
|
64
64
|
}
|
|
65
|
+
/** `scheme::root` -- the seed a chain starts from. One absorbed element; see `fold`. */
|
|
65
66
|
export function root(gameId) {
|
|
66
|
-
return poseidon([
|
|
67
|
+
return poseidon([gameId]);
|
|
67
68
|
}
|
|
69
|
+
/**
|
|
70
|
+
* `scheme::fold` -- one link of the chain.
|
|
71
|
+
*
|
|
72
|
+
* Three absorbed elements against `root`'s one and `actionSeed`'s two. Poseidon pads by length,
|
|
73
|
+
* so three hashes of three different arities cannot collide and none of them carries a domain
|
|
74
|
+
* tag. Changing the arity of one means checking it against the other two.
|
|
75
|
+
*/
|
|
68
76
|
export function fold(previous, encodedAction, commitBlock) {
|
|
69
77
|
if (commitBlock < 0n || commitBlock > 0xffffffffffffffffn) {
|
|
70
78
|
throw new Error("commit block must fit u64");
|
|
71
79
|
}
|
|
72
|
-
return poseidon([
|
|
80
|
+
return poseidon([previous, encodedAction, commitBlock]);
|
|
73
81
|
}
|
|
74
|
-
|
|
75
|
-
|
|
82
|
+
/** `ImplAdventurer::get_simple_entropy` -- poseidon([xp, id]). */
|
|
83
|
+
export function simpleEntropy(xp, id) {
|
|
84
|
+
return poseidon([BigInt(xp), id]);
|
|
85
|
+
}
|
|
86
|
+
/** `ImplAdventurer::get_battle_entropy` -- poseidon([xp, id, health]). */
|
|
87
|
+
export function battleEntropy(xp, id, health) {
|
|
88
|
+
return poseidon([BigInt(xp), id, BigInt(health)]);
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* `randomness::get_random_seed`, unseeded branch -- the felt an action actually rolls with.
|
|
92
|
+
*
|
|
93
|
+
* `blockHash` arrives raw: no fold, no rolling commitment. What separates two actions that share
|
|
94
|
+
* a block -- everything in one `commit_action` bundle does -- is the adventurer state mixed in
|
|
95
|
+
* here, which is why this takes the state at the moment the action runs rather than after it.
|
|
96
|
+
*
|
|
97
|
+
* Stat boosts do not reach the preimage: `add_stat_boosts` touches `stats` and `luck` only, so
|
|
98
|
+
* boosted and unboosted adventurers hash identically and the caller need not care which it holds.
|
|
99
|
+
*/
|
|
100
|
+
export function actionSeed(blockHash, adventurerId, xp, health, inBattle) {
|
|
101
|
+
const state = inBattle
|
|
102
|
+
? battleEntropy(xp, adventurerId, health)
|
|
103
|
+
: simpleEntropy(xp, adventurerId);
|
|
104
|
+
return poseidon([blockHash, state]);
|
|
76
105
|
}
|
|
77
106
|
export function encodeStart(weapon) {
|
|
78
107
|
if (!STARTING_WEAPONS.has(weapon))
|
|
79
108
|
throw new Error("invalid starting weapon");
|
|
80
|
-
return header(Opcode.START) +
|
|
109
|
+
return header(Opcode.START) + SHIFT_4 * BigInt(weapon);
|
|
81
110
|
}
|
|
82
111
|
export function encodeExplore(tillDamage, tillGold) {
|
|
83
112
|
assertUnsigned(tillDamage, 16, "tillDamage");
|
|
84
|
-
return header(Opcode.EXPLORE) +
|
|
113
|
+
return header(Opcode.EXPLORE) + SHIFT_4 * BigInt(tillDamage) + (tillGold ? SHIFT_20 : 0n);
|
|
85
114
|
}
|
|
86
115
|
export function encodeAttack(tillHealth, tillBeastHealth) {
|
|
87
116
|
assertUnsigned(tillHealth, 16, "tillHealth");
|
|
88
117
|
assertUnsigned(tillBeastHealth, 16, "tillBeastHealth");
|
|
89
|
-
return header(Opcode.ATTACK) +
|
|
118
|
+
return header(Opcode.ATTACK) + SHIFT_4 * BigInt(tillHealth) + SHIFT_20 * BigInt(tillBeastHealth);
|
|
90
119
|
}
|
|
91
120
|
export function encodeFlee(tillHealth) {
|
|
92
121
|
assertUnsigned(tillHealth, 16, "tillHealth");
|
|
93
|
-
return header(Opcode.FLEE) +
|
|
122
|
+
return header(Opcode.FLEE) + SHIFT_4 * BigInt(tillHealth);
|
|
94
123
|
}
|
|
95
124
|
export function encodeSelectStats(stats) {
|
|
96
125
|
const ordered = [
|
|
@@ -106,7 +135,7 @@ export function encodeSelectStats(stats) {
|
|
|
106
135
|
if ((stats.luck ?? 0) !== 0)
|
|
107
136
|
throw new Error("luck allocation is unsupported");
|
|
108
137
|
let encoded = header(Opcode.SELECT_STATS);
|
|
109
|
-
let cursor =
|
|
138
|
+
let cursor = SHIFT_4;
|
|
110
139
|
for (const value of ordered) {
|
|
111
140
|
encoded += cursor * BigInt(value);
|
|
112
141
|
cursor *= 0x20n;
|
|
@@ -117,8 +146,8 @@ export function encodeBuy(potions, purchases) {
|
|
|
117
146
|
assertUnsigned(potions, 8, "potions");
|
|
118
147
|
if (purchases.length > 23)
|
|
119
148
|
throw new Error("at most 23 purchases are supported");
|
|
120
|
-
let encoded = header(Opcode.BUY) +
|
|
121
|
-
let cursor =
|
|
149
|
+
let encoded = header(Opcode.BUY) + SHIFT_4 * BigInt(potions) + SHIFT_12 * BigInt(purchases.length);
|
|
150
|
+
let cursor = SHIFT_17;
|
|
122
151
|
for (const purchase of purchases) {
|
|
123
152
|
assertItem(purchase.itemId);
|
|
124
153
|
encoded += cursor * (BigInt(purchase.itemId) + (purchase.equip ? 0x100n : 0n));
|
|
@@ -129,8 +158,8 @@ export function encodeBuy(potions, purchases) {
|
|
|
129
158
|
export function encodeEquip(items) {
|
|
130
159
|
if (items.length < 1 || items.length > 8)
|
|
131
160
|
throw new Error("equip count must be in [1, 8]");
|
|
132
|
-
let encoded = header(Opcode.EQUIP) +
|
|
133
|
-
let cursor =
|
|
161
|
+
let encoded = header(Opcode.EQUIP) + SHIFT_4 * BigInt(items.length);
|
|
162
|
+
let cursor = SHIFT_8;
|
|
134
163
|
for (const item of items) {
|
|
135
164
|
assertItem(item);
|
|
136
165
|
encoded += cursor * BigInt(item);
|
|
@@ -141,8 +170,8 @@ export function encodeEquip(items) {
|
|
|
141
170
|
export function encodeDrop(items) {
|
|
142
171
|
if (items.length < 1 || items.length > 23)
|
|
143
172
|
throw new Error("drop count must be in [1, 23]");
|
|
144
|
-
let encoded = header(Opcode.DROP) +
|
|
145
|
-
let cursor =
|
|
173
|
+
let encoded = header(Opcode.DROP) + SHIFT_4 * BigInt(items.length);
|
|
174
|
+
let cursor = SHIFT_9;
|
|
146
175
|
for (const item of items) {
|
|
147
176
|
assertItem(item);
|
|
148
177
|
encoded += cursor * BigInt(item);
|
|
@@ -156,39 +185,36 @@ export function encodeSurrender() {
|
|
|
156
185
|
export function decodeAction(raw) {
|
|
157
186
|
if (raw < 0n)
|
|
158
187
|
throw new Error("encoded action cannot be negative");
|
|
159
|
-
if (Number(bits(raw, 0x10n, 0xfn)) !== ACTION_ENCODING_VERSION) {
|
|
160
|
-
throw new Error("bad action version");
|
|
161
|
-
}
|
|
162
188
|
const opcode = Number(raw & 0xfn);
|
|
163
189
|
const action = empty(opcode);
|
|
164
190
|
if (opcode === Opcode.START) {
|
|
165
|
-
if (raw >=
|
|
191
|
+
if (raw >= 0x1000n)
|
|
166
192
|
throw new Error("noncanonical START");
|
|
167
|
-
action.first = Number(bits(raw,
|
|
193
|
+
action.first = Number(bits(raw, SHIFT_4, 0xffn));
|
|
168
194
|
if (!STARTING_WEAPONS.has(action.first))
|
|
169
195
|
throw new Error("invalid starting weapon");
|
|
170
196
|
}
|
|
171
197
|
else if (opcode === Opcode.EXPLORE) {
|
|
172
|
-
if (raw >=
|
|
198
|
+
if (raw >= 0x200000n)
|
|
173
199
|
throw new Error("noncanonical EXPLORE");
|
|
174
|
-
action.first = Number(bits(raw,
|
|
175
|
-
action.flag = bits(raw,
|
|
200
|
+
action.first = Number(bits(raw, SHIFT_4, 0xffffn));
|
|
201
|
+
action.flag = bits(raw, SHIFT_20, 1n) === 1n;
|
|
176
202
|
}
|
|
177
203
|
else if (opcode === Opcode.ATTACK) {
|
|
178
|
-
if (raw >=
|
|
204
|
+
if (raw >= 0x1000000000n)
|
|
179
205
|
throw new Error("noncanonical ATTACK");
|
|
180
|
-
action.first = Number(bits(raw,
|
|
181
|
-
action.second = Number(bits(raw,
|
|
206
|
+
action.first = Number(bits(raw, SHIFT_4, 0xffffn));
|
|
207
|
+
action.second = Number(bits(raw, SHIFT_20, 0xffffn));
|
|
182
208
|
}
|
|
183
209
|
else if (opcode === Opcode.FLEE) {
|
|
184
|
-
if (raw >=
|
|
210
|
+
if (raw >= 0x100000n)
|
|
185
211
|
throw new Error("noncanonical FLEE");
|
|
186
|
-
action.first = Number(bits(raw,
|
|
212
|
+
action.first = Number(bits(raw, SHIFT_4, 0xffffn));
|
|
187
213
|
}
|
|
188
214
|
else if (opcode === Opcode.SELECT_STATS) {
|
|
189
|
-
if (raw >=
|
|
215
|
+
if (raw >= 0x400000000n)
|
|
190
216
|
throw new Error("noncanonical SELECT_STATS");
|
|
191
|
-
let cursor =
|
|
217
|
+
let cursor = SHIFT_4;
|
|
192
218
|
const values = [];
|
|
193
219
|
for (let index = 0; index < 6; index += 1) {
|
|
194
220
|
values.push(Number(bits(raw, cursor, 0x1fn)));
|
|
@@ -204,11 +230,11 @@ export function decodeAction(raw) {
|
|
|
204
230
|
] = values;
|
|
205
231
|
}
|
|
206
232
|
else if (opcode === Opcode.BUY) {
|
|
207
|
-
action.potions = Number(bits(raw,
|
|
208
|
-
const count = Number(bits(raw,
|
|
233
|
+
action.potions = Number(bits(raw, SHIFT_4, 0xffn));
|
|
234
|
+
const count = Number(bits(raw, SHIFT_12, 0x1fn));
|
|
209
235
|
if (count > 23)
|
|
210
236
|
throw new Error("invalid BUY count");
|
|
211
|
-
let cursor =
|
|
237
|
+
let cursor = SHIFT_17;
|
|
212
238
|
for (let index = 0; index < count; index += 1) {
|
|
213
239
|
const entry = bits(raw, cursor, 0x1ffn);
|
|
214
240
|
const itemId = Number(entry & 0xffn);
|
|
@@ -220,8 +246,8 @@ export function decodeAction(raw) {
|
|
|
220
246
|
throw new Error("noncanonical BUY");
|
|
221
247
|
}
|
|
222
248
|
else if (opcode === Opcode.EQUIP || opcode === Opcode.DROP) {
|
|
223
|
-
const shift = opcode === Opcode.EQUIP ?
|
|
224
|
-
const count = Number(bits(raw,
|
|
249
|
+
const shift = opcode === Opcode.EQUIP ? SHIFT_8 : SHIFT_9;
|
|
250
|
+
const count = Number(bits(raw, SHIFT_4, opcode === Opcode.EQUIP ? 0xfn : 0x1fn));
|
|
225
251
|
const max = opcode === Opcode.EQUIP ? 8 : 23;
|
|
226
252
|
if (count < 1 || count > max)
|
|
227
253
|
throw new Error("invalid item count");
|
|
@@ -236,7 +262,7 @@ export function decodeAction(raw) {
|
|
|
236
262
|
throw new Error("noncanonical item action");
|
|
237
263
|
}
|
|
238
264
|
else if (opcode === Opcode.SURRENDER) {
|
|
239
|
-
if (raw >=
|
|
265
|
+
if (raw >= 0x10n)
|
|
240
266
|
throw new Error("noncanonical SURRENDER");
|
|
241
267
|
}
|
|
242
268
|
else {
|
package/dist/protocol.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAEhC,MAAM,CAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"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"}
|
package/dist/replay.d.ts
CHANGED
|
@@ -1,6 +1,22 @@
|
|
|
1
1
|
import { Adventurer, GameAction, GameSettingsData, Item } from "./types.js";
|
|
2
2
|
import { Beast } from "./types.js";
|
|
3
3
|
import { GameEvent } from "./events.js";
|
|
4
|
+
/**
|
|
5
|
+
* The three randomness modes, mirroring `utils/randomness.cairo::RandomnessMode`.
|
|
6
|
+
*
|
|
7
|
+
* A mode chooses where the NON-combat stream comes from. Combat is never on this dial: `attack`,
|
|
8
|
+
* `flee` and `equip` always roll from the block hash, in every mode.
|
|
9
|
+
*/
|
|
10
|
+
export declare const RandomnessMode: {
|
|
11
|
+
/** Every action rolls from the hash of the block that resolves it. */
|
|
12
|
+
readonly FULL: 0;
|
|
13
|
+
/** Non-combat rolls expand `game_seed`; the encounter table is fixed before the run starts. */
|
|
14
|
+
readonly SEEDED: 1;
|
|
15
|
+
/** Non-combat rolls expand the current `level_salt`, itself re-rolled live on every level-up. */
|
|
16
|
+
readonly PER_LEVEL: 2;
|
|
17
|
+
};
|
|
18
|
+
/** `ImplAdventurer::nonzero_salt` -- mask, keeping zero (the never-rolled sentinel) out. */
|
|
19
|
+
export declare function nonzeroSalt(value: bigint, mask: bigint): number;
|
|
4
20
|
/** Everything the handlers read that used to live in the client's zustand store. */
|
|
5
21
|
export interface ReplayState {
|
|
6
22
|
adventurer: Adventurer | null;
|
|
@@ -24,12 +40,14 @@ export interface ReplayState {
|
|
|
24
40
|
* Apply one action to `state` and return the events it produced.
|
|
25
41
|
*
|
|
26
42
|
* This is `useGameCore`'s body verbatim, with the store reads replaced by `state` and the
|
|
27
|
-
*
|
|
43
|
+
* VRF reads replaced by `entropy`. It is pure: no store, no RPC, no `Date`, and
|
|
28
44
|
* -- when `entropy` is non-null -- no `Math.random()`. That last property is what lets the
|
|
29
45
|
* client and the off-chain replayer agree, and it is asserted by the entropy test suite.
|
|
30
46
|
*
|
|
31
|
-
* `entropy` is
|
|
32
|
-
* a legacy dungeon, where the handlers fall back to a settings `game_seed` or `Math.random()`.
|
|
47
|
+
* `entropy` is the RAW block hash that resolves this action for a commit-reveal game, or `null`
|
|
48
|
+
* for a legacy dungeon, where the handlers fall back to a settings `game_seed` or `Math.random()`.
|
|
49
|
+
* It is not the seed: `resolveActionRolls` mixes it with the adventurer's own state, which is what
|
|
50
|
+
* separates two actions that were committed in the same block and therefore share a hash.
|
|
33
51
|
*/
|
|
34
52
|
export declare function applyAction(state: ReplayState, action: GameAction, entropy: bigint | null): GameEvent[];
|
|
35
53
|
//# sourceMappingURL=replay.d.ts.map
|
package/dist/replay.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"replay.d.ts","sourceRoot":"","sources":["../src/replay.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"replay.d.ts","sourceRoot":"","sources":["../src/replay.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAC5E,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AA0DxC;;;;;GAKG;AACH,eAAO,MAAM,cAAc;IACzB,sEAAsE;;IAEtE,+FAA+F;;IAE/F,iGAAiG;;CAEzF,CAAC;AAEX,4FAA4F;AAC5F,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAG/D;AA+JD,oFAAoF;AACpF,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,UAAU,GAAG,IAAI,CAAC;IAC9B,GAAG,EAAE,IAAI,EAAE,CAAC;IACZ,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,YAAY,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACtC,sFAAsF;IACtF,eAAe,EAAE,UAAU,GAAG,IAAI,CAAC;IACnC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB;;;;;;;OAOG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE,MAAM,GAAG,IAAI,GACrB,SAAS,EAAE,CA+5Bb"}
|