@ottochain/sdk 2.4.0 → 2.5.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/dist/cjs/apps/compute/index.js +33 -0
- package/dist/cjs/apps/compute/state-machines/compute-rule110.js +164 -0
- package/dist/cjs/apps/compute/state-machines/index.js +9 -0
- package/dist/cjs/apps/contracts/index.js +1 -1
- package/dist/cjs/apps/contracts/state-machines/contract-agreement.js +126 -148
- package/dist/cjs/apps/contracts/state-machines/contract-escrow.js +153 -174
- package/dist/cjs/apps/contracts/state-machines/contract-universal.js +46 -58
- package/dist/cjs/apps/corporate/state-machines/corp-board.js +415 -481
- package/dist/cjs/apps/corporate/state-machines/corp-entity.js +368 -440
- package/dist/cjs/apps/corporate/state-machines/corp-securities.js +532 -647
- package/dist/cjs/apps/corporate/state-machines/corp-shareholders.js +499 -603
- package/dist/cjs/apps/governance/index.js +7 -7
- package/dist/cjs/apps/governance/state-machines/dao-multisig.js +170 -209
- package/dist/cjs/apps/governance/state-machines/dao-reputation.js +161 -214
- package/dist/cjs/apps/governance/state-machines/dao-single.js +92 -92
- package/dist/cjs/apps/governance/state-machines/dao-token.js +169 -223
- package/dist/cjs/apps/governance/state-machines/governance-simple.js +185 -217
- package/dist/cjs/apps/governance/state-machines/governance-universal.js +64 -64
- package/dist/cjs/apps/identity/constants.js +16 -24
- package/dist/cjs/apps/identity/index.js +1 -1
- package/dist/cjs/apps/identity/state-machines/identity-agent.js +124 -158
- package/dist/cjs/apps/identity/state-machines/identity-oracle.js +151 -169
- package/dist/cjs/apps/identity/state-machines/identity-registry.js +89 -115
- package/dist/cjs/apps/identity/state-machines/identity-universal.js +51 -57
- package/dist/cjs/apps/index.js +4 -1
- package/dist/cjs/apps/lending/assets.js +41 -17
- package/dist/cjs/apps/lending/credit-scoring.js +4 -4
- package/dist/cjs/apps/lending/eligibility.js +9 -25
- package/dist/cjs/apps/lending/index.js +1 -1
- package/dist/cjs/apps/lending/state-machines/lending-zk-loan.js +177 -156
- package/dist/cjs/apps/markets/index.js +1 -1
- package/dist/cjs/apps/markets/state-machines/market-auction.js +115 -134
- package/dist/cjs/apps/markets/state-machines/market-crowdfund.js +122 -137
- package/dist/cjs/apps/markets/state-machines/market-group-buy.js +158 -177
- package/dist/cjs/apps/markets/state-machines/market-prediction.js +193 -227
- package/dist/cjs/apps/markets/state-machines/market-universal.js +65 -80
- package/dist/cjs/apps/oracles/index.js +1 -1
- package/dist/cjs/apps/privacy/index.js +67 -0
- package/dist/cjs/apps/privacy/state-machines/index.js +17 -0
- package/dist/cjs/apps/privacy/state-machines/mixer-ddhRing.js +286 -0
- package/dist/cjs/apps/privacy/state-machines/note-pool.js +476 -0
- package/dist/cjs/apps/staked-pool/assets.js +103 -0
- package/dist/cjs/apps/staked-pool/base.js +498 -0
- package/dist/cjs/apps/staked-pool/consumer.js +55 -0
- package/dist/cjs/apps/staked-pool/index.js +83 -0
- package/dist/cjs/apps/staked-pool/state-machines/index.js +12 -0
- package/dist/cjs/apps/staked-pool/state-machines/staked-pool-base.js +49 -0
- package/dist/cjs/apps/staked-pool/state-machines/staked-pool-oracle.js +131 -0
- package/dist/cjs/generated/google/protobuf/struct.js +1 -1
- package/dist/cjs/generated/google/protobuf/timestamp.js +1 -1
- package/dist/cjs/generated/ottochain/apps/contracts/v1/contract.js +1 -1
- package/dist/cjs/generated/ottochain/apps/corporate/v1/corporate.js +1 -1
- package/dist/cjs/generated/ottochain/apps/governance/v1/governance.js +1 -1
- package/dist/cjs/generated/ottochain/apps/identity/v1/attestation.js +1 -1
- package/dist/cjs/generated/ottochain/apps/identity/v1/identity.js +1 -1
- package/dist/cjs/generated/ottochain/apps/markets/v1/market.js +1 -1
- package/dist/cjs/generated/ottochain/v1/common.js +1 -1
- package/dist/cjs/generated/ottochain/v1/fiber.js +40 -2
- package/dist/cjs/generated/ottochain/v1/messages.js +1 -1
- package/dist/cjs/generated/ottochain/v1/records.js +1 -1
- package/dist/cjs/index.js +20 -3
- package/dist/cjs/ottochain/genesis-manifest.js +6 -0
- package/dist/cjs/ottochain/metagraph-client.js +16 -8
- package/dist/cjs/ottochain/snapshot.js +2 -4
- package/dist/cjs/ottochain/transaction.js +10 -0
- package/dist/cjs/privacy/sealed-bid.js +85 -82
- package/dist/cjs/privacy/shield-app.js +32 -32
- package/dist/cjs/schema/effects.js +117 -1
- package/dist/cjs/schema/fiber-app.js +132 -3
- package/dist/cjs/schema/guard-lint.js +3 -12
- package/dist/cjs/schema/guards.js +38 -38
- package/dist/cjs/templates/asset-policy.js +190 -0
- package/dist/cjs/templates/index.js +86 -0
- package/dist/cjs/templates/machine.js +130 -0
- package/dist/cjs/templates/migration.js +39 -0
- package/dist/cjs/templates/state-shape.js +38 -0
- package/dist/cjs/validation.js +1 -3
- package/dist/esm/apps/compute/index.js +29 -0
- package/dist/esm/apps/compute/state-machines/compute-rule110.js +161 -0
- package/dist/esm/apps/compute/state-machines/index.js +5 -0
- package/dist/esm/apps/contracts/index.js +4 -4
- package/dist/esm/apps/contracts/state-machines/contract-agreement.js +128 -150
- package/dist/esm/apps/contracts/state-machines/contract-escrow.js +155 -176
- package/dist/esm/apps/contracts/state-machines/contract-universal.js +47 -59
- package/dist/esm/apps/corporate/index.js +2 -2
- package/dist/esm/apps/corporate/state-machines/corp-board.js +418 -484
- package/dist/esm/apps/corporate/state-machines/corp-entity.js +371 -443
- package/dist/esm/apps/corporate/state-machines/corp-securities.js +535 -650
- package/dist/esm/apps/corporate/state-machines/corp-shareholders.js +502 -606
- package/dist/esm/apps/governance/index.js +10 -10
- package/dist/esm/apps/governance/state-machines/dao-multisig.js +172 -211
- package/dist/esm/apps/governance/state-machines/dao-reputation.js +163 -216
- package/dist/esm/apps/governance/state-machines/dao-single.js +94 -94
- package/dist/esm/apps/governance/state-machines/dao-token.js +171 -225
- package/dist/esm/apps/governance/state-machines/governance-simple.js +187 -219
- package/dist/esm/apps/governance/state-machines/governance-universal.js +65 -65
- package/dist/esm/apps/identity/constants.js +18 -26
- package/dist/esm/apps/identity/index.js +8 -8
- package/dist/esm/apps/identity/state-machines/identity-agent.js +125 -159
- package/dist/esm/apps/identity/state-machines/identity-oracle.js +153 -171
- package/dist/esm/apps/identity/state-machines/identity-registry.js +91 -117
- package/dist/esm/apps/identity/state-machines/identity-universal.js +52 -58
- package/dist/esm/apps/index.js +9 -6
- package/dist/esm/apps/lending/assets.js +41 -17
- package/dist/esm/apps/lending/credit-scoring.js +6 -6
- package/dist/esm/apps/lending/eligibility.js +10 -26
- package/dist/esm/apps/lending/index.js +5 -5
- package/dist/esm/apps/lending/state-machines/lending-zk-loan.js +178 -157
- package/dist/esm/apps/markets/index.js +5 -5
- package/dist/esm/apps/markets/state-machines/market-auction.js +117 -136
- package/dist/esm/apps/markets/state-machines/market-crowdfund.js +124 -139
- package/dist/esm/apps/markets/state-machines/market-group-buy.js +160 -179
- package/dist/esm/apps/markets/state-machines/market-prediction.js +195 -229
- package/dist/esm/apps/markets/state-machines/market-universal.js +66 -81
- package/dist/esm/apps/oracles/index.js +3 -3
- package/dist/esm/apps/privacy/index.js +56 -0
- package/dist/esm/apps/privacy/state-machines/index.js +6 -0
- package/dist/esm/apps/privacy/state-machines/mixer-ddhRing.js +282 -0
- package/dist/esm/apps/privacy/state-machines/note-pool.js +470 -0
- package/dist/esm/apps/staked-pool/assets.js +91 -0
- package/dist/esm/apps/staked-pool/base.js +493 -0
- package/dist/esm/apps/staked-pool/consumer.js +49 -0
- package/dist/esm/apps/staked-pool/index.js +60 -0
- package/dist/esm/apps/staked-pool/state-machines/index.js +6 -0
- package/dist/esm/apps/staked-pool/state-machines/staked-pool-base.js +46 -0
- package/dist/esm/apps/staked-pool/state-machines/staked-pool-oracle.js +127 -0
- package/dist/esm/generated/google/protobuf/struct.js +1 -1
- package/dist/esm/generated/google/protobuf/timestamp.js +1 -1
- package/dist/esm/generated/ottochain/apps/contracts/v1/contract.js +1 -1
- package/dist/esm/generated/ottochain/apps/corporate/v1/corporate.js +1 -1
- package/dist/esm/generated/ottochain/apps/governance/v1/governance.js +1 -1
- package/dist/esm/generated/ottochain/apps/identity/v1/attestation.js +1 -1
- package/dist/esm/generated/ottochain/apps/identity/v1/identity.js +1 -1
- package/dist/esm/generated/ottochain/apps/markets/v1/market.js +1 -1
- package/dist/esm/generated/ottochain/v1/common.js +1 -1
- package/dist/esm/generated/ottochain/v1/fiber.js +40 -2
- package/dist/esm/generated/ottochain/v1/messages.js +1 -1
- package/dist/esm/generated/ottochain/v1/records.js +1 -1
- package/dist/esm/index.js +10 -4
- package/dist/esm/ottochain/genesis-manifest.js +6 -0
- package/dist/esm/ottochain/metagraph-client.js +16 -8
- package/dist/esm/ottochain/snapshot.js +2 -4
- package/dist/esm/ottochain/transaction.js +8 -0
- package/dist/esm/privacy/index.js +2 -2
- package/dist/esm/privacy/sealed-bid.js +87 -84
- package/dist/esm/privacy/shield-app.js +33 -33
- package/dist/esm/schema/effects.js +110 -0
- package/dist/esm/schema/fiber-app.js +127 -3
- package/dist/esm/schema/guard-lint.js +3 -12
- package/dist/esm/schema/guards.js +36 -37
- package/dist/esm/templates/asset-policy.js +182 -0
- package/dist/esm/templates/index.js +41 -0
- package/dist/esm/templates/machine.js +125 -0
- package/dist/esm/templates/migration.js +34 -0
- package/dist/esm/templates/state-shape.js +34 -0
- package/dist/esm/validation.js +1 -3
- package/dist/esm/zk/index.js +4 -4
- package/dist/types/apps/compute/index.d.ts +176 -0
- package/dist/types/apps/compute/state-machines/compute-rule110.d.ts +157 -0
- package/dist/types/apps/compute/state-machines/index.d.ts +5 -0
- package/dist/types/apps/contracts/index.d.ts +14 -14
- package/dist/types/apps/contracts/state-machines/contract-agreement.d.ts +3 -3
- package/dist/types/apps/contracts/state-machines/contract-escrow.d.ts +3 -3
- package/dist/types/apps/contracts/state-machines/contract-universal.d.ts +4 -4
- package/dist/types/apps/corporate/index.d.ts +162 -162
- package/dist/types/apps/corporate/state-machines/corp-board.d.ts +88 -88
- package/dist/types/apps/corporate/state-machines/corp-entity.d.ts +14 -14
- package/dist/types/apps/corporate/state-machines/corp-securities.d.ts +18 -18
- package/dist/types/apps/corporate/state-machines/corp-shareholders.d.ts +43 -43
- package/dist/types/apps/governance/index.d.ts +81 -81
- package/dist/types/apps/governance/state-machines/dao-multisig.d.ts +16 -16
- package/dist/types/apps/governance/state-machines/dao-reputation.d.ts +22 -22
- package/dist/types/apps/governance/state-machines/dao-token.d.ts +21 -21
- package/dist/types/apps/governance/state-machines/governance-simple.d.ts +11 -11
- package/dist/types/apps/governance/state-machines/governance-universal.d.ts +4 -4
- package/dist/types/apps/identity/constants.d.ts +2 -2
- package/dist/types/apps/identity/index.d.ts +70 -70
- package/dist/types/apps/identity/state-machines/identity-agent.d.ts +23 -23
- package/dist/types/apps/identity/state-machines/identity-oracle.d.ts +11 -11
- package/dist/types/apps/identity/state-machines/identity-registry.d.ts +27 -27
- package/dist/types/apps/identity/state-machines/identity-universal.d.ts +4 -4
- package/dist/types/apps/index.d.ts +9 -6
- package/dist/types/apps/lending/assets.d.ts +2 -2
- package/dist/types/apps/lending/credit-scoring.d.ts +5 -5
- package/dist/types/apps/lending/eligibility.d.ts +2 -2
- package/dist/types/apps/lending/index.d.ts +20 -12
- package/dist/types/apps/lending/state-machines/lending-zk-loan.d.ts +15 -7
- package/dist/types/apps/markets/index.d.ts +76 -76
- package/dist/types/apps/markets/state-machines/market-auction.d.ts +12 -12
- package/dist/types/apps/markets/state-machines/market-crowdfund.d.ts +19 -19
- package/dist/types/apps/markets/state-machines/market-group-buy.d.ts +18 -18
- package/dist/types/apps/markets/state-machines/market-prediction.d.ts +15 -15
- package/dist/types/apps/markets/state-machines/market-universal.d.ts +7 -7
- package/dist/types/apps/oracles/index.d.ts +1 -1
- package/dist/types/apps/privacy/index.d.ts +328 -0
- package/dist/types/apps/privacy/state-machines/index.d.ts +6 -0
- package/dist/types/apps/privacy/state-machines/mixer-ddhRing.d.ts +337 -0
- package/dist/types/apps/privacy/state-machines/note-pool.d.ts +196 -0
- package/dist/types/apps/staked-pool/assets.d.ts +53 -0
- package/dist/types/apps/staked-pool/base.d.ts +80 -0
- package/dist/types/apps/staked-pool/consumer.d.ts +29 -0
- package/dist/types/apps/staked-pool/index.d.ts +51 -0
- package/dist/types/apps/staked-pool/state-machines/index.d.ts +6 -0
- package/dist/types/apps/staked-pool/state-machines/staked-pool-base.d.ts +8 -0
- package/dist/types/apps/staked-pool/state-machines/staked-pool-oracle.d.ts +34 -0
- package/dist/types/generated/openapi.d.ts +13 -0
- package/dist/types/generated/ottochain/v1/fiber.d.ts +7 -0
- package/dist/types/index.d.ts +3 -3
- package/dist/types/openapi.d.ts +4 -2
- package/dist/types/ottochain/genesis-manifest.d.ts +6 -0
- package/dist/types/ottochain/transaction.d.ts +9 -1
- package/dist/types/ottochain/types.d.ts +1 -1
- package/dist/types/privacy/index.d.ts +2 -2
- package/dist/types/privacy/sealed-bid.d.ts +9 -9
- package/dist/types/privacy/shield-app.d.ts +1 -1
- package/dist/types/schema/effects.d.ts +107 -0
- package/dist/types/schema/fiber-app.d.ts +281 -0
- package/dist/types/schema/guards.d.ts +12 -0
- package/dist/types/templates/asset-policy.d.ts +119 -0
- package/dist/types/templates/index.d.ts +26 -0
- package/dist/types/templates/machine.d.ts +139 -0
- package/dist/types/templates/migration.d.ts +34 -0
- package/dist/types/templates/state-shape.d.ts +30 -0
- package/dist/types/zk/index.d.ts +4 -4
- package/package.json +31 -13
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Versioned-machine skeleton + `transition()` / `effect()` composition (handoff §1.2).
|
|
4
|
+
*
|
|
5
|
+
* Two moves:
|
|
6
|
+
* 1. `transition()` / `effect()` build the wire `Transition` + its flat effect map from typed
|
|
7
|
+
* fragments instead of a hand-rolled JSON blob.
|
|
8
|
+
* 2. `machine()` is a versioned-package SKELETON that OWNS exactly ONE canonical wire definition
|
|
9
|
+
* (`toProtoDefinition(app)`, computed once) and hands the SAME object to BOTH `publishVersion()`
|
|
10
|
+
* and `create()`. That is the verified-binding invariant (F9): because publish and create cannot
|
|
11
|
+
* drift, the chain's `definition.computeDigest` equals the registered `logicHash` and the bind
|
|
12
|
+
* admits the fiber. The skeleton REUSES `toProtoDefinition` (the one canonicalization path) — it
|
|
13
|
+
* never re-derives the wire shape.
|
|
14
|
+
*
|
|
15
|
+
* Guardrail (CLAUDE.md #1): every builder here is a pure function emitting the exact wire shape the
|
|
16
|
+
* chain re-derives. Absent optionals (`metadata`/`participants`/`parentFiberId`/`migration`) are
|
|
17
|
+
* OMITTED, never `null`; required-no-default fields (`strict` on publish, `dependencies: []` per
|
|
18
|
+
* transition) are ALWAYS present.
|
|
19
|
+
*/
|
|
20
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
21
|
+
exports.transition = transition;
|
|
22
|
+
exports.effect = effect;
|
|
23
|
+
exports.machine = machine;
|
|
24
|
+
const fiber_app_js_1 = require("../schema/fiber-app.js");
|
|
25
|
+
/**
|
|
26
|
+
* Build a wire {@link Transition} from a typed spec.
|
|
27
|
+
*
|
|
28
|
+
* - `on` → `eventName` (the wire key);
|
|
29
|
+
* - `guard` defaults to `{ "==": [1, 1] }`;
|
|
30
|
+
* - `dependencies` defaults to `[]` and is ALWAYS present;
|
|
31
|
+
* - `effect` is passed through (build it with {@link effect}).
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
* ```ts
|
|
35
|
+
* transition({
|
|
36
|
+
* from: 'debt_current', to: 'debt_current', on: 'buy',
|
|
37
|
+
* effect: effect(
|
|
38
|
+
* { status: 'debt_current', purchaseCount: { '+': [{ var: 'state.purchaseCount' }, 1] } },
|
|
39
|
+
* triggers([...]), transferAsset([...]),
|
|
40
|
+
* ),
|
|
41
|
+
* });
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
44
|
+
function transition(t) {
|
|
45
|
+
return {
|
|
46
|
+
from: t.from,
|
|
47
|
+
to: t.to,
|
|
48
|
+
eventName: t.on,
|
|
49
|
+
guard: t.guard ?? { '==': [1, 1] },
|
|
50
|
+
effect: t.effect,
|
|
51
|
+
dependencies: t.dependencies ?? [],
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
// =============================================================================
|
|
55
|
+
// effect()
|
|
56
|
+
// =============================================================================
|
|
57
|
+
/**
|
|
58
|
+
* Compose an effect into ONE FLAT map: the state-update fields PLUS any `_`-directive fragments,
|
|
59
|
+
* all in a single object (`Object.assign({}, stateUpdate, ...directives)`).
|
|
60
|
+
*
|
|
61
|
+
* Riverdale effects are flat maps that mix `_`-reserved directives (`_triggers`, `_transferAsset`,
|
|
62
|
+
* `_spawn`, …) with plain state-update fields — they are NOT `merge`-wrapped. Each directive fragment
|
|
63
|
+
* is a `Record` (e.g. the output of `transferAsset(...)` / `triggers(...)`), spread in here. Later
|
|
64
|
+
* fragments override earlier keys (`Object.assign` semantics).
|
|
65
|
+
*
|
|
66
|
+
* @example
|
|
67
|
+
* ```ts
|
|
68
|
+
* effect(
|
|
69
|
+
* { status: 'debt_current', purchaseCount: { '+': [{ var: 'state.purchaseCount' }, 1] } },
|
|
70
|
+
* { _triggers: [...] },
|
|
71
|
+
* transferAsset([{ assetId: { var: 'event.payAssetId' }, recipient: toFiber({ var: 'event.retailerId' }) }]),
|
|
72
|
+
* );
|
|
73
|
+
* // => { status, purchaseCount, _triggers, _transferAsset }
|
|
74
|
+
* ```
|
|
75
|
+
*/
|
|
76
|
+
function effect(stateUpdate, ...directives) {
|
|
77
|
+
return Object.assign({}, stateUpdate, ...directives);
|
|
78
|
+
}
|
|
79
|
+
/** A pinned-Exact `SchemaRef` for `name@version`. Wire: `{ name, version: { Exact: { version } } }`. */
|
|
80
|
+
function exactRef(name, version) {
|
|
81
|
+
return { name, version: { Exact: { version } } };
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Build a versioned-machine skeleton that binds publish + create to ONE canonical definition.
|
|
85
|
+
*
|
|
86
|
+
* The definition is projected ONCE here (`toProtoDefinition(spec.app)`) and the SAME reference is handed
|
|
87
|
+
* to `wireDefinition()`, `publishVersion().definition`, `create().definition`, and
|
|
88
|
+
* `upgradeFrom().newDefinition` — so they cannot drift and the chain's verified binding admits the fiber
|
|
89
|
+
* (F9). REUSES `toProtoDefinition` (the single canonicalization path); never re-derives the wire shape.
|
|
90
|
+
*/
|
|
91
|
+
function machine(spec) {
|
|
92
|
+
// Project the canonical wire definition ONCE; every consumer reuses this exact reference.
|
|
93
|
+
const wireDef = (0, fiber_app_js_1.toProtoDefinition)(spec.app);
|
|
94
|
+
return {
|
|
95
|
+
wireDefinition() {
|
|
96
|
+
return wireDef;
|
|
97
|
+
},
|
|
98
|
+
publishVersion(o) {
|
|
99
|
+
return {
|
|
100
|
+
name: spec.name,
|
|
101
|
+
version: spec.version,
|
|
102
|
+
// REQUIRED-no-default on the wire; '' is valid empty base64 when no descriptor set is bound.
|
|
103
|
+
schemaB64: o?.schemaB64 ?? '',
|
|
104
|
+
machineShape: spec.schemaShape,
|
|
105
|
+
definition: wireDef, // SAME reference as wireDefinition()/create()
|
|
106
|
+
strict: o?.strict ?? false, // REQUIRED — never omitted
|
|
107
|
+
...(o?.metadata ? { metadata: o.metadata } : {}), // OMIT when absent
|
|
108
|
+
};
|
|
109
|
+
},
|
|
110
|
+
create(o) {
|
|
111
|
+
return {
|
|
112
|
+
fiberId: o.fiberId,
|
|
113
|
+
definition: wireDef, // SAME reference as wireDefinition()/publishVersion()
|
|
114
|
+
initialData: o.initialData,
|
|
115
|
+
schemaRef: exactRef(spec.name, spec.version), // verified binding: name@version
|
|
116
|
+
...(o.participants ? { participants: o.participants } : {}), // OMIT when absent
|
|
117
|
+
...(o.parentFiberId ? { parentFiberId: o.parentFiberId } : {}), // OMIT when absent
|
|
118
|
+
};
|
|
119
|
+
},
|
|
120
|
+
upgradeFrom(o) {
|
|
121
|
+
return {
|
|
122
|
+
fiberId: o.fiberId,
|
|
123
|
+
targetRef: exactRef(spec.name, spec.version),
|
|
124
|
+
newDefinition: wireDef, // SAME reference — re-pin hashes to the same logicHash
|
|
125
|
+
targetSequenceNumber: o.targetSequenceNumber,
|
|
126
|
+
...(o.migration !== undefined ? { migration: o.migration } : {}), // OMIT (Option) when absent
|
|
127
|
+
};
|
|
128
|
+
},
|
|
129
|
+
};
|
|
130
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Migration builders — the `UpgradeFiber.migration` JSON-Logic transform applied on a version upgrade.
|
|
4
|
+
*
|
|
5
|
+
* THE FOOT-GUN (F9): a migration's evaluation root is the BARE prior state, not `state.x`.
|
|
6
|
+
* The chain evaluates the migration expression against `sm.stateData` directly
|
|
7
|
+
* (`MeteredEvaluator.eval(expr, sm.stateData, Migration)`, FiberEngine.scala:300), so:
|
|
8
|
+
* - `{ var: '' }` => the WHOLE prior state object
|
|
9
|
+
* - `{ var: 'loyaltyPoints' }` => the top-level `loyaltyPoints` field
|
|
10
|
+
* This is UNLIKE an effect, where the root is the transition context and you read `{ var: 'state.x' }`.
|
|
11
|
+
* Writing `state.loyaltyPoints` in a migration silently reads `undefined`. These helpers hide that
|
|
12
|
+
* asymmetry by pinning the bare-state root for you.
|
|
13
|
+
*
|
|
14
|
+
* `migration` is `Option` on `UpgradeFiber` — when there is no transform, OMIT the key (never send `null`).
|
|
15
|
+
*/
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.migration = exports.seedFields = void 0;
|
|
18
|
+
/**
|
|
19
|
+
* Seed / overwrite top-level state fields on a version upgrade.
|
|
20
|
+
* Emits `{ merge: [{ var: '' }, fields] }` — merges `fields` onto the bare prior state, so existing
|
|
21
|
+
* fields are preserved and the named fields are added or overwritten.
|
|
22
|
+
*
|
|
23
|
+
* The `{ var: '' }` root is the BARE prior state (NOT `state.x` like an effect) — that asymmetry is
|
|
24
|
+
* exactly the F9 foot-gun this helper hides.
|
|
25
|
+
*
|
|
26
|
+
* @example seedFields({ loyaltyPoints: 0 }) // => { merge: [{ var: '' }, { loyaltyPoints: 0 }] }
|
|
27
|
+
*/
|
|
28
|
+
const seedFields = (fields) => ({
|
|
29
|
+
merge: [{ var: '' }, fields],
|
|
30
|
+
});
|
|
31
|
+
exports.seedFields = seedFields;
|
|
32
|
+
/**
|
|
33
|
+
* General migration transform with the bare-state root made explicit. `build` receives `{ var: '' }`
|
|
34
|
+
* (the whole prior state) and returns the migration JSON-Logic.
|
|
35
|
+
*
|
|
36
|
+
* @example migration((s) => ({ merge: [s, { x: 1 }] })) // => { merge: [{ var: '' }, { x: 1 }] }
|
|
37
|
+
*/
|
|
38
|
+
const migration = (build) => build({ var: '' });
|
|
39
|
+
exports.migration = migration;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* State-shape-with-defaults — the SDK half of Proposal 01's "declared state shape" (removes F5).
|
|
4
|
+
*
|
|
5
|
+
* A declared shape carries a `default` (and optional `type`) per field. It seeds `initialData` so every
|
|
6
|
+
* accumulator starts at a concrete value — a counter read via `{ '+': [{ var: 'state.x' }, ...] }` never
|
|
7
|
+
* resolves `null` because `x` was never written. It also yields the set of declared field names for
|
|
8
|
+
* Proposal 01's var-path checks.
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.seedState = seedState;
|
|
12
|
+
exports.declaredFields = declaredFields;
|
|
13
|
+
/**
|
|
14
|
+
* Build `initialData` by overlaying `overrides` onto each field's declared `default`.
|
|
15
|
+
* Every declared field gets a concrete value, so no field reads `null` at runtime. An override for a
|
|
16
|
+
* field replaces that field's default; overrides for undeclared fields are ignored (only declared fields
|
|
17
|
+
* are emitted). Determinism: pure function of its inputs, stable key order (declared order).
|
|
18
|
+
*
|
|
19
|
+
* @example seedState({ fields: { purchaseCount: { default: 0 }, status: { default: 'ACTIVE' } } })
|
|
20
|
+
* // => { purchaseCount: 0, status: 'ACTIVE' }
|
|
21
|
+
*/
|
|
22
|
+
function seedState(shape, overrides) {
|
|
23
|
+
const seeded = {};
|
|
24
|
+
for (const [name, field] of Object.entries(shape.fields)) {
|
|
25
|
+
seeded[name] =
|
|
26
|
+
overrides !== undefined && Object.prototype.hasOwnProperty.call(overrides, name)
|
|
27
|
+
? overrides[name]
|
|
28
|
+
: field.default;
|
|
29
|
+
}
|
|
30
|
+
return seeded;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* The set of declared state-field names — the fields the effects may read.
|
|
34
|
+
* Feeds Proposal 01's var-path checks (a `{ var: 'state.foo' }` whose `foo` is not declared is suspect).
|
|
35
|
+
*/
|
|
36
|
+
function declaredFields(shape) {
|
|
37
|
+
return new Set(Object.keys(shape.fields));
|
|
38
|
+
}
|
package/dist/cjs/validation.js
CHANGED
|
@@ -33,9 +33,7 @@ const hexString = (length) => {
|
|
|
33
33
|
/**
|
|
34
34
|
* Schema for a DAG address
|
|
35
35
|
*/
|
|
36
|
-
exports.DagAddressSchema = zod_1.z
|
|
37
|
-
.string()
|
|
38
|
-
.regex(/^DAG[0-9][a-zA-Z0-9]{36}$/, 'Must be a valid DAG address');
|
|
36
|
+
exports.DagAddressSchema = zod_1.z.string().regex(/^DAG[0-9][a-zA-Z0-9]{36}$/, 'Must be a valid DAG address');
|
|
39
37
|
// ============================================================================
|
|
40
38
|
// Core Type Schemas
|
|
41
39
|
// ============================================================================
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Compute Application — bare computation substrates.
|
|
3
|
+
*
|
|
4
|
+
* Turing-complete JLVM substrates with no parties, assets, or governance: pure
|
|
5
|
+
* in-place state evolution. The flagship is `rule110`, an in-place Rule-110
|
|
6
|
+
* cellular automaton that proves the account layer is Turing-complete.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```typescript
|
|
10
|
+
* import { getComputeDefinition, COMPUTE_DEFINITIONS } from '@ottochain/sdk/apps/compute';
|
|
11
|
+
*
|
|
12
|
+
* const rule110Def = getComputeDefinition('rule110');
|
|
13
|
+
* ```
|
|
14
|
+
*
|
|
15
|
+
* @packageDocumentation
|
|
16
|
+
*/
|
|
17
|
+
import { computeRule110Def } from './state-machines/index.js';
|
|
18
|
+
export { computeRule110Def };
|
|
19
|
+
/** All compute (bare-computation) state machine definitions. */
|
|
20
|
+
export const COMPUTE_DEFINITIONS = {
|
|
21
|
+
rule110: computeRule110Def,
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Get a compute state machine definition by type.
|
|
25
|
+
* @param type - 'rule110' (default).
|
|
26
|
+
*/
|
|
27
|
+
export function getComputeDefinition(type = 'rule110') {
|
|
28
|
+
return COMPUTE_DEFINITIONS[type];
|
|
29
|
+
}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import { defineFiberApp } from '../../../schema/fiber-app.js';
|
|
2
|
+
/**
|
|
3
|
+
* Rule-110 cellular automaton — an in-place, Turing-complete JLVM substrate.
|
|
4
|
+
*
|
|
5
|
+
* Each `step` event advances ONE CA generation in place:
|
|
6
|
+
* next[i] = R110(tape[i-1], tape[i], tape[i+1])
|
|
7
|
+
* with fixed-0 boundaries, computed as a JLVM `map` over a STORED index array
|
|
8
|
+
* (`idx`) — no bitwise ops, no spawn, no zip. The fiber loops RUNNING → RUNNING;
|
|
9
|
+
* the chain of transitions IS the Turing-machine tape-head.
|
|
10
|
+
*
|
|
11
|
+
* Rule 110: out = 1 iff p ∈ {1,2,3,5,6}, where p = 4·left + 2·center + right.
|
|
12
|
+
*
|
|
13
|
+
* THE INLINED-CELL CONSTRAINT (do not "simplify" with `let`)
|
|
14
|
+
* ---------------------------------------------------------
|
|
15
|
+
* Inside `map`, a primitive element is overlaid into the eval context, so
|
|
16
|
+
* `{var:""}` coerces to the element int ONLY in arithmetic position. Opening a
|
|
17
|
+
* `let` scope over the element makes `{var:""}` resolve to the whole context
|
|
18
|
+
* object (`{"tag":"map"}`) and any `cat` on it throws `JsonLogicRuntimeError`.
|
|
19
|
+
* Therefore the per-cell predicate P is fully INLINED at each of the five `==`
|
|
20
|
+
* comparison sites (P appears 5×; each neighbour read `nb` reads the tape once
|
|
21
|
+
* per occurrence). This is the only form that works inside `map`. It is built
|
|
22
|
+
* programmatically below to avoid hand-duplicating P, but it expands to the
|
|
23
|
+
* inlined AST — NOT a `let`-form.
|
|
24
|
+
*
|
|
25
|
+
* Neighbour access uses a computed `var` PATH with a null-default boundary:
|
|
26
|
+
* nb(off) = { var: [ { cat: ["state.tape.", off] }, 0 ] }
|
|
27
|
+
* An out-of-bounds index (-1 or N) resolves to the default `0` (fixed-0
|
|
28
|
+
* boundary), so `tape`/`idx` stay exactly length N forever.
|
|
29
|
+
*
|
|
30
|
+
* Verified end-to-end against `@constellation-network/metagraph-sdk-jlvm@1.8.0-rc.5`:
|
|
31
|
+
* the effect reproduces the canonical left-growing Rule-110 fractal exactly,
|
|
32
|
+
* `idx` is byte-identical across every generation, and the unbounded/bounded
|
|
33
|
+
* guard halts at `gen == maxGen`.
|
|
34
|
+
*/
|
|
35
|
+
// nb(off): read tape at element-relative offset, fixed-0 boundary via null-default.
|
|
36
|
+
const nb = (off) => ({
|
|
37
|
+
var: [{ cat: ['state.tape.', off] }, 0],
|
|
38
|
+
});
|
|
39
|
+
// P = 4·left + 2·center + right (element {var:""} is the cell index i).
|
|
40
|
+
const P = {
|
|
41
|
+
'+': [{ '*': [4, nb({ '-': [{ var: '' }, 1] })] }, { '*': [2, nb({ var: '' })] }, nb({ '+': [{ var: '' }, 1] })],
|
|
42
|
+
};
|
|
43
|
+
// CELL: 1 iff P ∈ {1,2,3,5,6}, else 0. P is INLINED at each `==` site (B1: never
|
|
44
|
+
// `let` over the map element). Built from the rule-110 truth set programmatically.
|
|
45
|
+
const CELL = {
|
|
46
|
+
if: [{ or: [1, 2, 3, 5, 6].map((k) => ({ '==': [P, k] })) }, 1, 0],
|
|
47
|
+
};
|
|
48
|
+
/**
|
|
49
|
+
* Rule-110 cellular-automaton fiber definition.
|
|
50
|
+
*
|
|
51
|
+
* Trust model: PUBLIC / PERMISSIONLESS / pure compute. No assets, no parties,
|
|
52
|
+
* no owner — anyone may submit `step`. The DoS surface is bounded by per-event
|
|
53
|
+
* gas/fee (~987 gas/cell) and the optional `maxGen` halt bound (absent ⇒
|
|
54
|
+
* unbounded; runs until fees stop).
|
|
55
|
+
*/
|
|
56
|
+
export const computeRule110Def = defineFiberApp({
|
|
57
|
+
metadata: {
|
|
58
|
+
name: 'ComputeRule110',
|
|
59
|
+
app: 'compute',
|
|
60
|
+
type: 'rule110',
|
|
61
|
+
version: '1.0.0',
|
|
62
|
+
description: 'In-place Rule-110 cellular automaton — a Turing-complete substrate. Each ' +
|
|
63
|
+
'`step` advances one generation: next[i]=R110(tape[i-1],tape[i],tape[i+1]) ' +
|
|
64
|
+
'with fixed-0 boundaries, as a JLVM map over a stored index array (no ' +
|
|
65
|
+
'bitwise, no spawn, no zip).',
|
|
66
|
+
},
|
|
67
|
+
createSchema: {
|
|
68
|
+
// maxGen is NOT required: absent ⇒ unbounded (the step guard uses `missing`).
|
|
69
|
+
required: ['tape', 'idx'],
|
|
70
|
+
properties: {
|
|
71
|
+
tape: {
|
|
72
|
+
type: 'array',
|
|
73
|
+
items: { type: 'integer' },
|
|
74
|
+
description: '0/1 CA row (length N).',
|
|
75
|
+
},
|
|
76
|
+
idx: {
|
|
77
|
+
type: 'array',
|
|
78
|
+
items: { type: 'integer' },
|
|
79
|
+
immutable: true,
|
|
80
|
+
description: 'Monotone index array [0..N-1]; REQUIRED (no range/iota opcode). ' +
|
|
81
|
+
'Never mutated — the effect preserves it across every generation.',
|
|
82
|
+
},
|
|
83
|
+
gen: {
|
|
84
|
+
type: 'integer',
|
|
85
|
+
default: 0,
|
|
86
|
+
description: 'Generation counter (TM step count).',
|
|
87
|
+
},
|
|
88
|
+
maxGen: {
|
|
89
|
+
type: 'integer',
|
|
90
|
+
description: 'Optional halt bound; absent ⇒ unbounded.',
|
|
91
|
+
},
|
|
92
|
+
},
|
|
93
|
+
},
|
|
94
|
+
stateSchema: {
|
|
95
|
+
properties: {
|
|
96
|
+
tape: { type: 'array', items: { type: 'integer' }, computed: true },
|
|
97
|
+
idx: { type: 'array', items: { type: 'integer' }, immutable: true },
|
|
98
|
+
gen: { type: 'integer', computed: true },
|
|
99
|
+
maxGen: { type: 'integer' },
|
|
100
|
+
status: { type: 'string', computed: true },
|
|
101
|
+
},
|
|
102
|
+
},
|
|
103
|
+
eventSchemas: {
|
|
104
|
+
step: { description: 'Advance one CA generation in place.' },
|
|
105
|
+
halt: { description: 'Terminate once maxGen is reached (gated by gen >= maxGen).' },
|
|
106
|
+
},
|
|
107
|
+
states: {
|
|
108
|
+
RUNNING: {
|
|
109
|
+
id: 'RUNNING',
|
|
110
|
+
isFinal: false,
|
|
111
|
+
metadata: {
|
|
112
|
+
label: 'Running',
|
|
113
|
+
description: 'CA evolving; each step = one generation.',
|
|
114
|
+
category: 'active',
|
|
115
|
+
},
|
|
116
|
+
},
|
|
117
|
+
HALTED: {
|
|
118
|
+
id: 'HALTED',
|
|
119
|
+
isFinal: true,
|
|
120
|
+
metadata: {
|
|
121
|
+
label: 'Halted',
|
|
122
|
+
description: 'maxGen reached; terminal.',
|
|
123
|
+
category: 'terminal',
|
|
124
|
+
},
|
|
125
|
+
},
|
|
126
|
+
},
|
|
127
|
+
initialState: 'RUNNING',
|
|
128
|
+
transitions: [
|
|
129
|
+
{
|
|
130
|
+
// One `step` = one generation. Loops in place (the TM tape-head).
|
|
131
|
+
from: 'RUNNING',
|
|
132
|
+
to: 'RUNNING',
|
|
133
|
+
eventName: 'step',
|
|
134
|
+
// Unbounded when maxGen is absent (`missing` → true); else gate on gen < maxGen.
|
|
135
|
+
guard: {
|
|
136
|
+
or: [{ missing: ['state.maxGen'] }, { '<': [{ var: 'state.gen' }, { var: 'state.maxGen' }] }],
|
|
137
|
+
},
|
|
138
|
+
// Effect result IS the new stateData: merge[state, overrides] preserves
|
|
139
|
+
// idx/maxGen and overwrites tape/gen.
|
|
140
|
+
effect: {
|
|
141
|
+
merge: [
|
|
142
|
+
{ var: 'state' },
|
|
143
|
+
{
|
|
144
|
+
tape: { map: [{ var: 'state.idx' }, CELL] },
|
|
145
|
+
gen: { '+': [{ var: 'state.gen' }, 1] },
|
|
146
|
+
},
|
|
147
|
+
],
|
|
148
|
+
},
|
|
149
|
+
dependencies: [],
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
// halt is rejected until exhaustion: gen >= maxGen.
|
|
153
|
+
from: 'RUNNING',
|
|
154
|
+
to: 'HALTED',
|
|
155
|
+
eventName: 'halt',
|
|
156
|
+
guard: { '>=': [{ var: 'state.gen' }, { var: 'state.maxGen' }] },
|
|
157
|
+
effect: { merge: [{ var: 'state' }, { status: 'halted' }] },
|
|
158
|
+
dependencies: [],
|
|
159
|
+
},
|
|
160
|
+
],
|
|
161
|
+
});
|
|
@@ -21,13 +21,13 @@
|
|
|
21
21
|
// Re-export generated protobuf types (source of truth).
|
|
22
22
|
// The nested lifecycle enum dropped its app prefix in the proto; under this
|
|
23
23
|
// app-scoped entrypoint it is unambiguously State.
|
|
24
|
-
export { State, Contract, ProposeContractRequest, AcceptContractRequest, CompleteContractRequest, RejectContractRequest, DisputeContractRequest, ContractDefinition, stateFromJSON, stateToJSON, } from
|
|
24
|
+
export { State, Contract, ProposeContractRequest, AcceptContractRequest, CompleteContractRequest, RejectContractRequest, DisputeContractRequest, ContractDefinition, stateFromJSON, stateToJSON, } from '../../generated/ottochain/apps/contracts/v1/contract.js';
|
|
25
25
|
// Deprecated app-prefixed alias (renamed to State); kept for compat.
|
|
26
|
-
export { State as ContractState, stateFromJSON as contractStateFromJSON, stateToJSON as contractStateToJSON, } from
|
|
26
|
+
export { State as ContractState, stateFromJSON as contractStateFromJSON, stateToJSON as contractStateToJSON, } from '../../generated/ottochain/apps/contracts/v1/contract.js';
|
|
27
27
|
// ---------------------------------------------------------------------------
|
|
28
28
|
// State Machine Definitions (generated from JSON at build time)
|
|
29
29
|
// ---------------------------------------------------------------------------
|
|
30
|
-
import { contractUniversalDef, contractAgreementDef, contractEscrowDef
|
|
30
|
+
import { contractUniversalDef, contractAgreementDef, contractEscrowDef } from './state-machines/index.js';
|
|
31
31
|
export { contractUniversalDef, contractAgreementDef, contractEscrowDef };
|
|
32
32
|
/** All contract state machine definitions */
|
|
33
33
|
export const CONTRACTS_DEFINITIONS = {
|
|
@@ -39,7 +39,7 @@ export const CONTRACTS_DEFINITIONS = {
|
|
|
39
39
|
* Get a contract state machine definition by type.
|
|
40
40
|
* @param type - 'universal' | 'agreement' | 'escrow' (default: 'agreement')
|
|
41
41
|
*/
|
|
42
|
-
export function getContractDefinition(type =
|
|
42
|
+
export function getContractDefinition(type = 'agreement') {
|
|
43
43
|
return CONTRACTS_DEFINITIONS[type];
|
|
44
44
|
}
|
|
45
45
|
/** @deprecated Use getContractDefinition('escrow') */
|