metered-protocol 1.0.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/LICENSE +21 -0
- package/README.md +103 -0
- package/contracts/metered.ag +135 -0
- package/contracts/metered_ag.tests.json +1226 -0
- package/contracts/metered_session.sil +237 -0
- package/contracts/metered_session.tests.json +1113 -0
- package/dist/contracts/metered.ag +135 -0
- package/dist/contracts/metered_ag.tests.json +1226 -0
- package/dist/contracts/metered_session.sil +237 -0
- package/dist/contracts/metered_session.tests.json +1113 -0
- package/dist/src/bias.d.ts +48 -0
- package/dist/src/bias.d.ts.map +1 -0
- package/dist/src/bias.js +43 -0
- package/dist/src/bias.js.map +1 -0
- package/dist/src/checkpoint.d.ts +57 -0
- package/dist/src/checkpoint.d.ts.map +1 -0
- package/dist/src/checkpoint.js +84 -0
- package/dist/src/checkpoint.js.map +1 -0
- package/dist/src/deadline.d.ts +71 -0
- package/dist/src/deadline.d.ts.map +1 -0
- package/dist/src/deadline.js +77 -0
- package/dist/src/deadline.js.map +1 -0
- package/dist/src/encoding.d.ts +72 -0
- package/dist/src/encoding.d.ts.map +1 -0
- package/dist/src/encoding.js +187 -0
- package/dist/src/encoding.js.map +1 -0
- package/dist/src/history.d.ts +33 -0
- package/dist/src/history.d.ts.map +1 -0
- package/dist/src/history.js +38 -0
- package/dist/src/history.js.map +1 -0
- package/dist/src/http/buyer.d.ts +57 -0
- package/dist/src/http/buyer.d.ts.map +1 -0
- package/dist/src/http/buyer.js +151 -0
- package/dist/src/http/buyer.js.map +1 -0
- package/dist/src/http/client.d.ts +55 -0
- package/dist/src/http/client.d.ts.map +1 -0
- package/dist/src/http/client.js +83 -0
- package/dist/src/http/client.js.map +1 -0
- package/dist/src/http/harness.d.ts +18 -0
- package/dist/src/http/harness.d.ts.map +1 -0
- package/dist/src/http/harness.js +16 -0
- package/dist/src/http/harness.js.map +1 -0
- package/dist/src/http/protocol.d.ts +84 -0
- package/dist/src/http/protocol.d.ts.map +1 -0
- package/dist/src/http/protocol.js +22 -0
- package/dist/src/http/protocol.js.map +1 -0
- package/dist/src/http/provider.d.ts +123 -0
- package/dist/src/http/provider.d.ts.map +1 -0
- package/dist/src/http/provider.js +197 -0
- package/dist/src/http/provider.js.map +1 -0
- package/dist/src/http/serve.d.ts +34 -0
- package/dist/src/http/serve.d.ts.map +1 -0
- package/dist/src/http/serve.js +171 -0
- package/dist/src/http/serve.js.map +1 -0
- package/dist/src/http/service.d.ts +86 -0
- package/dist/src/http/service.d.ts.map +1 -0
- package/dist/src/http/service.js +161 -0
- package/dist/src/http/service.js.map +1 -0
- package/dist/src/index.d.ts +68 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +62 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/meter.d.ts +39 -0
- package/dist/src/meter.d.ts.map +1 -0
- package/dist/src/meter.js +100 -0
- package/dist/src/meter.js.map +1 -0
- package/dist/src/offer.d.ts +6 -0
- package/dist/src/offer.d.ts.map +1 -0
- package/dist/src/offer.js +92 -0
- package/dist/src/offer.js.map +1 -0
- package/dist/src/reconcile.d.ts +18 -0
- package/dist/src/reconcile.d.ts.map +1 -0
- package/dist/src/reconcile.js +101 -0
- package/dist/src/reconcile.js.map +1 -0
- package/dist/src/reservation.d.ts +51 -0
- package/dist/src/reservation.d.ts.map +1 -0
- package/dist/src/reservation.js +124 -0
- package/dist/src/reservation.js.map +1 -0
- package/dist/src/session.d.ts +40 -0
- package/dist/src/session.d.ts.map +1 -0
- package/dist/src/session.js +92 -0
- package/dist/src/session.js.map +1 -0
- package/dist/src/signer.d.ts +31 -0
- package/dist/src/signer.d.ts.map +1 -0
- package/dist/src/signer.js +57 -0
- package/dist/src/signer.js.map +1 -0
- package/dist/src/store.d.ts +30 -0
- package/dist/src/store.d.ts.map +1 -0
- package/dist/src/store.js +120 -0
- package/dist/src/store.js.map +1 -0
- package/dist/src/types.d.ts +80 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +9 -0
- package/dist/src/types.js.map +1 -0
- package/dist/tools/anchor-cli.d.ts +2 -0
- package/dist/tools/anchor-cli.d.ts.map +1 -0
- package/dist/tools/anchor-cli.js +101 -0
- package/dist/tools/anchor-cli.js.map +1 -0
- package/dist/tools/anchor.d.ts +68 -0
- package/dist/tools/anchor.d.ts.map +1 -0
- package/dist/tools/anchor.js +136 -0
- package/dist/tools/anchor.js.map +1 -0
- package/dist/tools/chain.d.ts +18 -0
- package/dist/tools/chain.d.ts.map +1 -0
- package/dist/tools/chain.js +18 -0
- package/dist/tools/chain.js.map +1 -0
- package/dist/tools/conformance.d.ts +2 -0
- package/dist/tools/conformance.d.ts.map +1 -0
- package/dist/tools/conformance.js +220 -0
- package/dist/tools/conformance.js.map +1 -0
- package/dist/tools/contracts.d.ts +2 -0
- package/dist/tools/contracts.d.ts.map +1 -0
- package/dist/tools/contracts.js +68 -0
- package/dist/tools/contracts.js.map +1 -0
- package/dist/tools/covenant-binding.d.ts +40 -0
- package/dist/tools/covenant-binding.d.ts.map +1 -0
- package/dist/tools/covenant-binding.js +60 -0
- package/dist/tools/covenant-binding.js.map +1 -0
- package/dist/tools/covenant-profile.d.ts +41 -0
- package/dist/tools/covenant-profile.d.ts.map +1 -0
- package/dist/tools/covenant-profile.js +74 -0
- package/dist/tools/covenant-profile.js.map +1 -0
- package/dist/tools/covenant.d.ts +30 -0
- package/dist/tools/covenant.d.ts.map +1 -0
- package/dist/tools/covenant.js +54 -0
- package/dist/tools/covenant.js.map +1 -0
- package/dist/tools/demo-report.d.ts +24 -0
- package/dist/tools/demo-report.d.ts.map +1 -0
- package/dist/tools/demo-report.js +40 -0
- package/dist/tools/demo-report.js.map +1 -0
- package/dist/tools/demo.d.ts +2 -0
- package/dist/tools/demo.d.ts.map +1 -0
- package/dist/tools/demo.js +204 -0
- package/dist/tools/demo.js.map +1 -0
- package/dist/tools/dust-map.d.ts +2 -0
- package/dist/tools/dust-map.d.ts.map +1 -0
- package/dist/tools/dust-map.js +63 -0
- package/dist/tools/dust-map.js.map +1 -0
- package/dist/tools/expire-cases.d.ts +4 -0
- package/dist/tools/expire-cases.d.ts.map +1 -0
- package/dist/tools/expire-cases.js +211 -0
- package/dist/tools/expire-cases.js.map +1 -0
- package/dist/tools/fee-check.d.ts +2 -0
- package/dist/tools/fee-check.d.ts.map +1 -0
- package/dist/tools/fee-check.js +127 -0
- package/dist/tools/fee-check.js.map +1 -0
- package/dist/tools/fixtures.d.ts +39 -0
- package/dist/tools/fixtures.d.ts.map +1 -0
- package/dist/tools/fixtures.js +31 -0
- package/dist/tools/fixtures.js.map +1 -0
- package/dist/tools/gen-contract-tests.d.ts +2 -0
- package/dist/tools/gen-contract-tests.d.ts.map +1 -0
- package/dist/tools/gen-contract-tests.js +170 -0
- package/dist/tools/gen-contract-tests.js.map +1 -0
- package/dist/tools/kaspa.d.ts +13 -0
- package/dist/tools/kaspa.d.ts.map +1 -0
- package/dist/tools/kaspa.js +76 -0
- package/dist/tools/kaspa.js.map +1 -0
- package/dist/tools/live-deadline.d.ts +2 -0
- package/dist/tools/live-deadline.d.ts.map +1 -0
- package/dist/tools/live-deadline.js +122 -0
- package/dist/tools/live-deadline.js.map +1 -0
- package/dist/tools/live-expire.d.ts +2 -0
- package/dist/tools/live-expire.d.ts.map +1 -0
- package/dist/tools/live-expire.js +127 -0
- package/dist/tools/live-expire.js.map +1 -0
- package/dist/tools/live-settle.d.ts +2 -0
- package/dist/tools/live-settle.d.ts.map +1 -0
- package/dist/tools/live-settle.js +226 -0
- package/dist/tools/live-settle.js.map +1 -0
- package/dist/tools/live-steps.d.ts +63 -0
- package/dist/tools/live-steps.d.ts.map +1 -0
- package/dist/tools/live-steps.js +155 -0
- package/dist/tools/live-steps.js.map +1 -0
- package/dist/tools/model.d.ts +32 -0
- package/dist/tools/model.d.ts.map +1 -0
- package/dist/tools/model.js +99 -0
- package/dist/tools/model.js.map +1 -0
- package/dist/tools/send.d.ts +2 -0
- package/dist/tools/send.d.ts.map +1 -0
- package/dist/tools/send.js +41 -0
- package/dist/tools/send.js.map +1 -0
- package/dist/tools/session-chain.d.ts +69 -0
- package/dist/tools/session-chain.d.ts.map +1 -0
- package/dist/tools/session-chain.js +113 -0
- package/dist/tools/session-chain.js.map +1 -0
- package/dist/tools/sighash.d.ts +9 -0
- package/dist/tools/sighash.d.ts.map +1 -0
- package/dist/tools/sighash.js +68 -0
- package/dist/tools/sighash.js.map +1 -0
- package/dist/tools/sigscript-check.d.ts +2 -0
- package/dist/tools/sigscript-check.d.ts.map +1 -0
- package/dist/tools/sigscript-check.js +113 -0
- package/dist/tools/sigscript-check.js.map +1 -0
- package/dist/tools/sigscript.d.ts +61 -0
- package/dist/tools/sigscript.d.ts.map +1 -0
- package/dist/tools/sigscript.js +70 -0
- package/dist/tools/sigscript.js.map +1 -0
- package/dist/tools/state-layout.d.ts +2 -0
- package/dist/tools/state-layout.d.ts.map +1 -0
- package/dist/tools/state-layout.js +57 -0
- package/dist/tools/state-layout.js.map +1 -0
- package/package.json +59 -0
- package/spec/CONFORMANCE.md +80 -0
- package/spec/SPEC.md +821 -0
- package/spec/conformance-vectors.json +677 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"live-settle.js","sourceRoot":"","sources":["../../tools/live-settle.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
export type Any = any;
|
|
2
|
+
export declare const x: (hex: string) => string;
|
|
3
|
+
export declare function withState(redeemHex: string, seq: number, sompi: number, spanEnd?: number): string;
|
|
4
|
+
/**
|
|
5
|
+
* Run one scenario through the simulator and return the signature script it built.
|
|
6
|
+
*
|
|
7
|
+
* The returned script is the ACTION half only -- arguments and dispatch tag, 242 bytes for
|
|
8
|
+
* `settle`. The 513-byte redeem script is appended separately by the caller, mirroring the
|
|
9
|
+
* debugger's own `combine_action_and_redeem`.
|
|
10
|
+
*
|
|
11
|
+
* That detail is not cosmetic and cost a live transaction to learn. `validateOutputState`
|
|
12
|
+
* reconstructs the continuation script out of the INPUT'S OWN signature script
|
|
13
|
+
* (`OpTxInputScriptSigSubstr`, offset by `this.bytecodeSize`), so the redeem bytes must
|
|
14
|
+
* physically be in there. Broadcasting the action alone gives it nothing to rebuild from, and the
|
|
15
|
+
* node reports only "false stack entry at end of script execution".
|
|
16
|
+
*/
|
|
17
|
+
export declare function preflightSigscript(testCase: unknown, dir: string, expectPass?: boolean, contract?: string): string;
|
|
18
|
+
/** Poll until a UTXO of exactly this value appears at an address, or give up. */
|
|
19
|
+
export declare function awaitUtxo(rpc: Any, address: string, amount: bigint): Promise<Any>;
|
|
20
|
+
/**
|
|
21
|
+
* Build an `expire` spend. This is the path where the money actually SPLITS -- the provider takes
|
|
22
|
+
* the pending claim and the buyer takes the remainder -- so it is the one branch where getting an
|
|
23
|
+
* output value wrong costs somebody real funds.
|
|
24
|
+
*
|
|
25
|
+
* The fee is the covenant's full allowance. `expire` evaluates checkSig(buyer) || checkSig(provider)
|
|
26
|
+
* -- two signature checks, so compute budget 21 -- and a two-output close carries a ~650-byte
|
|
27
|
+
* signature script on top of that. The contract requires
|
|
28
|
+
* `outputs[1].value + pendingSompi + 400000 >= total`, so paying exactly 400,000 satisfies it at
|
|
29
|
+
* equality and leaves the node the most fee this covenant can legally offer.
|
|
30
|
+
*/
|
|
31
|
+
export declare function buildExpire(sdk: Any, parts: {
|
|
32
|
+
buyerPk: string;
|
|
33
|
+
providerPk: string;
|
|
34
|
+
signerSk: string;
|
|
35
|
+
redeem: string;
|
|
36
|
+
tag: string;
|
|
37
|
+
}, utxo: Any, outputs: {
|
|
38
|
+
address: string;
|
|
39
|
+
amount: bigint;
|
|
40
|
+
}[], window: number): Any;
|
|
41
|
+
/** Wait for the DAG to advance past a relative window, so `this.ageDaa` can be satisfied. */
|
|
42
|
+
export declare function awaitWindow(rpc: Any, window: number): Promise<void>;
|
|
43
|
+
/**
|
|
44
|
+
* The KIP-9 dust floor, and the fee allowance that must be added to it when folding.
|
|
45
|
+
*
|
|
46
|
+
* An output below ~2,000,835 sompi cannot be created at all (SPEC.md 7.4a), so a close has three
|
|
47
|
+
* legal shapes rather than one, and picking the wrong one is refused by the covenant.
|
|
48
|
+
*/
|
|
49
|
+
export declare const DUST = 2000000n;
|
|
50
|
+
/**
|
|
51
|
+
* Choose the outputs a close must have. This is protocol knowledge, not a convenience: the
|
|
52
|
+
* covenant accepts exactly these shapes and nothing else, so a caller that guesses gets
|
|
53
|
+
* "script ran, but verification failed" and learns nothing about why.
|
|
54
|
+
*
|
|
55
|
+
* provider's share is dust -> one output, everything to the BUYER
|
|
56
|
+
* buyer's refund is dust -> one output, everything to the PROVIDER
|
|
57
|
+
* both are payable -> two outputs, the ordinary close
|
|
58
|
+
*/
|
|
59
|
+
export declare function closeOutputs(total: bigint, owed: bigint, fee: bigint, buyer: string, provider: string): {
|
|
60
|
+
address: string;
|
|
61
|
+
amount: bigint;
|
|
62
|
+
}[];
|
|
63
|
+
//# sourceMappingURL=live-steps.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"live-steps.d.ts","sourceRoot":"","sources":["../../tools/live-steps.ts"],"names":[],"mappings":"AAmBA,MAAM,MAAM,GAAG,GAAG,GAAG,CAAC;AAEtB,eAAO,MAAM,CAAC,GAAI,KAAK,MAAM,WAAe,CAAC;AAqB7C,wBAAgB,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,SAAK,GAAG,MAAM,CAS7F;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,UAAU,UAAO,EAAE,QAAQ,SAAwB,GAAG,MAAM,CAqB9H;AAED,iFAAiF;AACjF,wBAAsB,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAQvF;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,WAAW,CACzB,GAAG,EAAE,GAAG,EACR,KAAK,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,EAC7F,IAAI,EAAE,GAAG,EACT,OAAO,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,EAAE,EAC9C,MAAM,EAAE,MAAM,GACb,GAAG,CAqBL;AAED,6FAA6F;AAC7F,wBAAsB,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAKzE;AAED;;;;;GAKG;AACH,eAAO,MAAM,IAAI,WAAa,CAAC;AAE/B;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GACxE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,EAAE,CAKvC"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The pieces every live covenant run needs, in one place so the scripts cannot drift apart.
|
|
3
|
+
*
|
|
4
|
+
* THE SIMULATOR IS THE PRE-FLIGHT. A spend expected to succeed is run through cli-debugger against
|
|
5
|
+
* the exact constructor arguments, state and transaction shape it will use on chain, and is only
|
|
6
|
+
* broadcast if that passes. The debugger also emits the authoritative signature script, so nothing
|
|
7
|
+
* here reimplements SilverScript's argument encoding and then hopes it matches.
|
|
8
|
+
*
|
|
9
|
+
* A spend expected to FAIL is pre-flighted too, with expect: 'fail' -- so the simulator confirms
|
|
10
|
+
* the contract refuses it before consensus is asked to. If the two ever disagree, that is the
|
|
11
|
+
* finding, and it is worth the extra call to notice.
|
|
12
|
+
*/
|
|
13
|
+
import { spawnSync } from 'node:child_process';
|
|
14
|
+
import { writeFileSync } from 'node:fs';
|
|
15
|
+
import { join } from 'node:path';
|
|
16
|
+
import { DEBUGGER } from './sighash.js';
|
|
17
|
+
import { HAND_WRITTEN } from './covenant-profile.js';
|
|
18
|
+
export const x = (hex) => `0x${hex}`;
|
|
19
|
+
/**
|
|
20
|
+
* Splice new state into a compiled redeem script.
|
|
21
|
+
*
|
|
22
|
+
* MEASURED, NOT ASSUMED, and measured again for the Argent port. `tools/state-layout.ts` compiles
|
|
23
|
+
* each covenant twice with different state and diffs the bytes:
|
|
24
|
+
*
|
|
25
|
+
* hand-written span [1, 19) `08 <seq LE8> 08 <sompi LE8>`
|
|
26
|
+
* Argent span [1, 78) `20 <parties 32> 10 <session_id 16> 08 <window> 08 <seq> 08 <sompi>`
|
|
27
|
+
*
|
|
28
|
+
* The claim these share is not the offset -- it is that **the mutable pair sits at the END of the
|
|
29
|
+
* state span in both**, because both declare `pendingSeq`/`pendingSompi` last. So the splice is
|
|
30
|
+
* anchored to the span's end rather than its start, and one function serves both covenants
|
|
31
|
+
* instead of a second one drifting alongside it.
|
|
32
|
+
*
|
|
33
|
+
* `spanEnd` is `span.offset + span.len` from the artifact, which is a claim the compiler makes;
|
|
34
|
+
* `verifySplice` below checks it against a real compile rather than trusting it.
|
|
35
|
+
*/
|
|
36
|
+
const SEQ_AND_SOMPI = 18;
|
|
37
|
+
export function withState(redeemHex, seq, sompi, spanEnd = 19) {
|
|
38
|
+
const num = (v) => {
|
|
39
|
+
const b = Buffer.alloc(8);
|
|
40
|
+
b.writeBigInt64LE(BigInt(Math.abs(v)));
|
|
41
|
+
if (v < 0)
|
|
42
|
+
b[7] = b[7] | 0x80;
|
|
43
|
+
return b.toString('hex');
|
|
44
|
+
};
|
|
45
|
+
const cut = (spanEnd - SEQ_AND_SOMPI) * 2;
|
|
46
|
+
return `${redeemHex.slice(0, cut)}08${num(seq)}08${num(sompi)}${redeemHex.slice(spanEnd * 2)}`;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Run one scenario through the simulator and return the signature script it built.
|
|
50
|
+
*
|
|
51
|
+
* The returned script is the ACTION half only -- arguments and dispatch tag, 242 bytes for
|
|
52
|
+
* `settle`. The 513-byte redeem script is appended separately by the caller, mirroring the
|
|
53
|
+
* debugger's own `combine_action_and_redeem`.
|
|
54
|
+
*
|
|
55
|
+
* That detail is not cosmetic and cost a live transaction to learn. `validateOutputState`
|
|
56
|
+
* reconstructs the continuation script out of the INPUT'S OWN signature script
|
|
57
|
+
* (`OpTxInputScriptSigSubstr`, offset by `this.bytecodeSize`), so the redeem bytes must
|
|
58
|
+
* physically be in there. Broadcasting the action alone gives it nothing to rebuild from, and the
|
|
59
|
+
* node reports only "false stack entry at end of script execution".
|
|
60
|
+
*/
|
|
61
|
+
export function preflightSigscript(testCase, dir, expectPass = true, contract = HAND_WRITTEN.contract) {
|
|
62
|
+
const file = join(dir, 'preflight.tests.json');
|
|
63
|
+
writeFileSync(file, JSON.stringify({ tests: [testCase] }));
|
|
64
|
+
const name = testCase.name;
|
|
65
|
+
// spawnSync, not execFileSync: the dump goes to STDERR, and execFileSync returns only stdout.
|
|
66
|
+
const run = spawnSync(DEBUGGER, [contract, '--run', '--test-file', file, '--test-name', name], {
|
|
67
|
+
encoding: 'utf8',
|
|
68
|
+
env: { ...process.env, SILVERSCRIPT_PRINT_SIGSCRIPT: '1' },
|
|
69
|
+
});
|
|
70
|
+
const out = `${run.stdout ?? ''}${run.stderr ?? ''}`;
|
|
71
|
+
if (run.status !== 0) {
|
|
72
|
+
console.log(out.split('\n').slice(-20).join('\n'));
|
|
73
|
+
throw new Error(expectPass
|
|
74
|
+
? 'PRE-FLIGHT FAILED -- refusing to broadcast a spend the simulator rejects'
|
|
75
|
+
: 'PRE-FLIGHT of the negative case did not behave as expected');
|
|
76
|
+
}
|
|
77
|
+
const sigscript = out.match(/SIGSCRIPT ([0-9a-f]+)/);
|
|
78
|
+
if (!sigscript)
|
|
79
|
+
throw new Error('the debugger printed no signature script (is the local patch built?)');
|
|
80
|
+
return sigscript[1];
|
|
81
|
+
}
|
|
82
|
+
/** Poll until a UTXO of exactly this value appears at an address, or give up. */
|
|
83
|
+
export async function awaitUtxo(rpc, address, amount) {
|
|
84
|
+
for (let i = 0; i < 40; i += 1) {
|
|
85
|
+
await new Promise((r) => setTimeout(r, 1500));
|
|
86
|
+
const res = await rpc.getUtxosByAddresses([address]);
|
|
87
|
+
const hit = res.entries.find((e) => e.amount === amount);
|
|
88
|
+
if (hit)
|
|
89
|
+
return hit;
|
|
90
|
+
}
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Build an `expire` spend. This is the path where the money actually SPLITS -- the provider takes
|
|
95
|
+
* the pending claim and the buyer takes the remainder -- so it is the one branch where getting an
|
|
96
|
+
* output value wrong costs somebody real funds.
|
|
97
|
+
*
|
|
98
|
+
* The fee is the covenant's full allowance. `expire` evaluates checkSig(buyer) || checkSig(provider)
|
|
99
|
+
* -- two signature checks, so compute budget 21 -- and a two-output close carries a ~650-byte
|
|
100
|
+
* signature script on top of that. The contract requires
|
|
101
|
+
* `outputs[1].value + pendingSompi + 400000 >= total`, so paying exactly 400,000 satisfies it at
|
|
102
|
+
* equality and leaves the node the most fee this covenant can legally offer.
|
|
103
|
+
*/
|
|
104
|
+
export function buildExpire(sdk, parts, utxo, outputs, window) {
|
|
105
|
+
const tx = sdk.createTransaction([utxo], outputs, 0n, undefined, 0);
|
|
106
|
+
tx.version = 1;
|
|
107
|
+
tx.gas = 0n;
|
|
108
|
+
tx.inputs[0].sigOpCount = 0;
|
|
109
|
+
tx.inputs[0].computeBudget = 21;
|
|
110
|
+
tx.inputs[0].sequence = BigInt(window);
|
|
111
|
+
// createInputSignature returns a signature SCRIPT; strip the 0x41 push to get the bare 65 bytes.
|
|
112
|
+
const raw = sdk.createInputSignature(tx, 0, new sdk.PrivateKey(parts.signerSk));
|
|
113
|
+
const sig = raw.length === 132 && raw.startsWith('41') ? raw.slice(2) : raw;
|
|
114
|
+
const sb = new sdk.ScriptBuilder();
|
|
115
|
+
sb.addData(parts.buyerPk);
|
|
116
|
+
sb.addData(parts.providerPk);
|
|
117
|
+
sb.addData(sig);
|
|
118
|
+
sb.addData(parts.tag);
|
|
119
|
+
sb.addData(parts.redeem);
|
|
120
|
+
tx.inputs[0].signatureScript = sb.toString();
|
|
121
|
+
tx.finalize();
|
|
122
|
+
return tx;
|
|
123
|
+
}
|
|
124
|
+
/** Wait for the DAG to advance past a relative window, so `this.ageDaa` can be satisfied. */
|
|
125
|
+
export async function awaitWindow(rpc, window) {
|
|
126
|
+
const start = (await rpc.getBlockDagInfo()).virtualDaaScore;
|
|
127
|
+
while ((await rpc.getBlockDagInfo()).virtualDaaScore < start + BigInt(window) + 2n) {
|
|
128
|
+
await new Promise((r) => setTimeout(r, 1000));
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* The KIP-9 dust floor, and the fee allowance that must be added to it when folding.
|
|
133
|
+
*
|
|
134
|
+
* An output below ~2,000,835 sompi cannot be created at all (SPEC.md 7.4a), so a close has three
|
|
135
|
+
* legal shapes rather than one, and picking the wrong one is refused by the covenant.
|
|
136
|
+
*/
|
|
137
|
+
export const DUST = 2000000n;
|
|
138
|
+
/**
|
|
139
|
+
* Choose the outputs a close must have. This is protocol knowledge, not a convenience: the
|
|
140
|
+
* covenant accepts exactly these shapes and nothing else, so a caller that guesses gets
|
|
141
|
+
* "script ran, but verification failed" and learns nothing about why.
|
|
142
|
+
*
|
|
143
|
+
* provider's share is dust -> one output, everything to the BUYER
|
|
144
|
+
* buyer's refund is dust -> one output, everything to the PROVIDER
|
|
145
|
+
* both are payable -> two outputs, the ordinary close
|
|
146
|
+
*/
|
|
147
|
+
export function closeOutputs(total, owed, fee, buyer, provider) {
|
|
148
|
+
if (owed < DUST)
|
|
149
|
+
return [{ address: buyer, amount: total - fee }];
|
|
150
|
+
const refund = total - owed - fee;
|
|
151
|
+
if (refund < DUST)
|
|
152
|
+
return [{ address: provider, amount: owed }];
|
|
153
|
+
return [{ address: provider, amount: owed }, { address: buyer, amount: refund }];
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=live-steps.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"live-steps.js","sourceRoot":"","sources":["../../tools/live-steps.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export declare const DEFAULT_MODEL = "gpt-4o-mini";
|
|
2
|
+
/** The key, from outside the repository. Returns null rather than throwing, so callers can skip. */
|
|
3
|
+
export declare function loadProviderKey(): string | null;
|
|
4
|
+
export interface ModelReply {
|
|
5
|
+
content: string;
|
|
6
|
+
/** What the provider says it produced. Compared against the meters, never trusted instead. */
|
|
7
|
+
reportedTokens: number;
|
|
8
|
+
}
|
|
9
|
+
/** One completion, capped at `maxUnits` output tokens. */
|
|
10
|
+
export declare function complete(apiKey: string, prompt: string, maxUnits: number, model?: string): Promise<ModelReply>;
|
|
11
|
+
/**
|
|
12
|
+
* A synchronous `Deliver` over an asynchronous model.
|
|
13
|
+
*
|
|
14
|
+
* `Deliver` is synchronous because reconciliation is, so the model is called ahead of time and the
|
|
15
|
+
* replies are handed out in order. A real provider would make `Deliver` async; the demo keeps the
|
|
16
|
+
* protocol's own shape unchanged rather than reworking it to accommodate one adapter.
|
|
17
|
+
*/
|
|
18
|
+
export declare function prefetched(replies: ModelReply[]): (prompt: string, maxUnits: number) => Uint8Array;
|
|
19
|
+
export interface ModelSource {
|
|
20
|
+
deliver: (prompt: string, maxUnits: number) => Uint8Array;
|
|
21
|
+
reportedTokens: number[];
|
|
22
|
+
model: string;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Fetch the demo's completions up front, or return null when no model was asked for.
|
|
26
|
+
*
|
|
27
|
+
* Throws rather than falling back when `--model` was asked for and no key is present: silently
|
|
28
|
+
* metering generated text while the operator believes a model is behind it would make the one
|
|
29
|
+
* claim the demo exists to support into the one thing it faked.
|
|
30
|
+
*/
|
|
31
|
+
export declare function demoModel(wanted: boolean, maxUnits: number): Promise<ModelSource | null>;
|
|
32
|
+
//# sourceMappingURL=model.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../tools/model.ts"],"names":[],"mappings":"AAyBA,eAAO,MAAM,aAAa,gBAAgB,CAAC;AAE3C,oGAAoG;AACpG,wBAAgB,eAAe,IAAI,MAAM,GAAG,IAAI,CAI/C;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,8FAA8F;IAC9F,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,0DAA0D;AAC1D,wBAAsB,QAAQ,CAC5B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,KAAK,SAAgB,GACpB,OAAO,CAAC,UAAU,CAAC,CAqBrB;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,UAAU,CAUlG;AASD,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,UAAU,CAAC;IAC1D,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;;;GAMG;AACH,wBAAsB,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAY9F"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A `Deliver` backed by a real language model, so a session meters actual model output.
|
|
3
|
+
*
|
|
4
|
+
* WHY THIS LIVES IN tools/ AND NOT src/. The protocol does not know what it is metering. `Deliver`
|
|
5
|
+
* is a function the caller supplies, and keeping every network-touching adapter out of `src/`
|
|
6
|
+
* keeps the library honest about that: an implementer metering translations or transcription
|
|
7
|
+
* writes their own adapter and changes nothing else.
|
|
8
|
+
*
|
|
9
|
+
* WHY THE UNIT LINES UP EXACTLY. SPEC.md 6.1 counts the assistant content DELIVERED TO THE BUYER,
|
|
10
|
+
* tokenised with the tokeniser the Offer names -- here `o200k_base`, which is the tokeniser
|
|
11
|
+
* gpt-4o-mini's own `completion_tokens` is computed with. evidence/provider_study.py checked that
|
|
12
|
+
* correspondence on 12 live completions and found exact agreement every time, which is why this
|
|
13
|
+
* adapter can hand the raw text straight to both meters and expect them to agree.
|
|
14
|
+
*
|
|
15
|
+
* THE BABEL IS ENFORCED AT THE MODEL. `max_completion_tokens` is set to the reserved babel, so the
|
|
16
|
+
* model physically cannot deliver more than was authorised. That is the exposure bound arriving
|
|
17
|
+
* as an API parameter rather than as a hope.
|
|
18
|
+
*/
|
|
19
|
+
import { readFileSync, existsSync } from 'node:fs';
|
|
20
|
+
import { homedir } from 'node:os';
|
|
21
|
+
import { join } from 'node:path';
|
|
22
|
+
const KEY_FILE = join(homedir(), '.metered', 'providers.env');
|
|
23
|
+
const ENDPOINT = 'https://api.openai.com/v1/chat/completions';
|
|
24
|
+
export const DEFAULT_MODEL = 'gpt-4o-mini';
|
|
25
|
+
/** The key, from outside the repository. Returns null rather than throwing, so callers can skip. */
|
|
26
|
+
export function loadProviderKey() {
|
|
27
|
+
if (!existsSync(KEY_FILE))
|
|
28
|
+
return null;
|
|
29
|
+
const match = readFileSync(KEY_FILE, 'utf8').match(/^OPENAI_API_KEY=(\S+)\s*$/m);
|
|
30
|
+
return match?.[1] ?? null;
|
|
31
|
+
}
|
|
32
|
+
/** One completion, capped at `maxUnits` output tokens. */
|
|
33
|
+
export async function complete(apiKey, prompt, maxUnits, model = DEFAULT_MODEL) {
|
|
34
|
+
const res = await fetch(ENDPOINT, {
|
|
35
|
+
method: 'POST',
|
|
36
|
+
headers: { 'content-type': 'application/json', authorization: `Bearer ${apiKey}` },
|
|
37
|
+
body: JSON.stringify({
|
|
38
|
+
model,
|
|
39
|
+
messages: [{ role: 'user', content: prompt }],
|
|
40
|
+
max_completion_tokens: maxUnits,
|
|
41
|
+
temperature: 0,
|
|
42
|
+
}),
|
|
43
|
+
});
|
|
44
|
+
if (!res.ok)
|
|
45
|
+
throw new Error(`model call failed: ${res.status} ${await res.text()}`);
|
|
46
|
+
const body = (await res.json());
|
|
47
|
+
return {
|
|
48
|
+
content: body.choices[0]?.message.content ?? '',
|
|
49
|
+
reportedTokens: body.usage.completion_tokens,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* A synchronous `Deliver` over an asynchronous model.
|
|
54
|
+
*
|
|
55
|
+
* `Deliver` is synchronous because reconciliation is, so the model is called ahead of time and the
|
|
56
|
+
* replies are handed out in order. A real provider would make `Deliver` async; the demo keeps the
|
|
57
|
+
* protocol's own shape unchanged rather than reworking it to accommodate one adapter.
|
|
58
|
+
*/
|
|
59
|
+
export function prefetched(replies) {
|
|
60
|
+
let i = 0;
|
|
61
|
+
return (prompt, maxUnits) => {
|
|
62
|
+
void prompt;
|
|
63
|
+
void maxUnits;
|
|
64
|
+
const reply = replies[i];
|
|
65
|
+
i += 1;
|
|
66
|
+
if (!reply)
|
|
67
|
+
throw new Error('the demo asked for more babels than were prefetched');
|
|
68
|
+
return new TextEncoder().encode(reply.content);
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
/** The prompts the demo meters. Short, so a babel of a few dozen tokens is a whole answer. */
|
|
72
|
+
const DEMO_PROMPTS = [
|
|
73
|
+
'In two sentences, explain what a metered payment protocol is.',
|
|
74
|
+
'In two sentences, why is settlement cost the limit on micropayments?',
|
|
75
|
+
'In two sentences, what is a blockDAG?',
|
|
76
|
+
];
|
|
77
|
+
/**
|
|
78
|
+
* Fetch the demo's completions up front, or return null when no model was asked for.
|
|
79
|
+
*
|
|
80
|
+
* Throws rather than falling back when `--model` was asked for and no key is present: silently
|
|
81
|
+
* metering generated text while the operator believes a model is behind it would make the one
|
|
82
|
+
* claim the demo exists to support into the one thing it faked.
|
|
83
|
+
*/
|
|
84
|
+
export async function demoModel(wanted, maxUnits) {
|
|
85
|
+
if (!wanted)
|
|
86
|
+
return null;
|
|
87
|
+
const apiKey = loadProviderKey();
|
|
88
|
+
if (!apiKey)
|
|
89
|
+
throw new Error('--model needs OPENAI_API_KEY in ~/.metered/providers.env');
|
|
90
|
+
const replies = [];
|
|
91
|
+
for (const prompt of DEMO_PROMPTS)
|
|
92
|
+
replies.push(await complete(apiKey, prompt, maxUnits));
|
|
93
|
+
return {
|
|
94
|
+
deliver: prefetched(replies),
|
|
95
|
+
reportedTokens: replies.map((r) => r.reportedTokens),
|
|
96
|
+
model: DEFAULT_MODEL,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model.js","sourceRoot":"","sources":["../../tools/model.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"send.d.ts","sourceRoot":"","sources":["../../tools/send.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `npx tsx tools/send.ts <address> <sompi>` -- move testnet coins out of the anchor wallet.
|
|
3
|
+
*
|
|
4
|
+
* A plain transfer, kept here because funding anything else from this wallet by hand means
|
|
5
|
+
* rebuilding the same transaction each time and getting the fee wrong once.
|
|
6
|
+
*/
|
|
7
|
+
import { loadSdk, loadAnchorKey } from './chain.js';
|
|
8
|
+
const [, , to, amountArg] = process.argv;
|
|
9
|
+
if (!to || !amountArg)
|
|
10
|
+
throw new Error('usage: tsx tools/send.ts <address> <sompi>');
|
|
11
|
+
const amount = BigInt(amountArg);
|
|
12
|
+
const FEE = 250000n;
|
|
13
|
+
const key = loadAnchorKey();
|
|
14
|
+
if (!key)
|
|
15
|
+
throw new Error('no anchor key; run: npm run anchor -- address');
|
|
16
|
+
const sdk = await loadSdk();
|
|
17
|
+
const networkId = new sdk.NetworkId('testnet-10');
|
|
18
|
+
const priv = new sdk.PrivateKey(key);
|
|
19
|
+
const from = priv.toKeypair().toAddress(networkId).toString();
|
|
20
|
+
const rpc = new sdk.RpcClient({ resolver: new sdk.Resolver(), encoding: sdk.Encoding.Borsh, networkId });
|
|
21
|
+
await rpc.connect();
|
|
22
|
+
try {
|
|
23
|
+
const { entries } = await rpc.getUtxosByAddresses([from]);
|
|
24
|
+
const src = entries.reduce((a, b) => (b.amount > a.amount ? b : a));
|
|
25
|
+
if (src.amount < amount + FEE)
|
|
26
|
+
throw new Error(`largest UTXO is ${src.amount}, need ${amount + FEE}`);
|
|
27
|
+
const tx = sdk.createTransaction([src], [{ address: to, amount }, { address: from, amount: src.amount - amount - FEE }], 0n, undefined, 0);
|
|
28
|
+
tx.version = 1;
|
|
29
|
+
tx.gas = 0n;
|
|
30
|
+
for (const i of tx.inputs) {
|
|
31
|
+
i.sigOpCount = 0;
|
|
32
|
+
i.computeBudget = 10;
|
|
33
|
+
}
|
|
34
|
+
tx.finalize();
|
|
35
|
+
const id = await rpc.submitTransaction({ transaction: sdk.signTransaction(tx, [priv], true), allowOrphan: false });
|
|
36
|
+
console.log(` sent ${amount} sompi to ${to}\n ${id.transactionId}`);
|
|
37
|
+
}
|
|
38
|
+
finally {
|
|
39
|
+
await rpc.disconnect().catch(() => undefined);
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=send.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"send.js","sourceRoot":"","sources":["../../tools/send.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { x, type Any } from './live-steps.js';
|
|
2
|
+
import type { Network } from './kaspa.js';
|
|
3
|
+
import type { Offer, State } from '../src/types.js';
|
|
4
|
+
/** Fees are compiled into the covenant's allowance, so they are constants rather than estimates. */
|
|
5
|
+
export declare const SETTLE_FEE = 360000n;
|
|
6
|
+
export declare const CLOSE_FEE = 400000n;
|
|
7
|
+
export declare const FUND_FEE = 250000n;
|
|
8
|
+
export interface Opened {
|
|
9
|
+
hex: string;
|
|
10
|
+
entries: Record<string, {
|
|
11
|
+
dispatch_tag: string;
|
|
12
|
+
}>;
|
|
13
|
+
address: string;
|
|
14
|
+
window: number;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Compile this session's covenant and derive the address that holds its funds.
|
|
18
|
+
*
|
|
19
|
+
* The constructor constants come from the Offer the provider actually issued, so the address is
|
|
20
|
+
* derived from the agreement rather than the agreement being fitted to an address. A covenant
|
|
21
|
+
* compiled for a different session has a different address and cannot be spent by this one.
|
|
22
|
+
*/
|
|
23
|
+
export declare function openCovenant(dir: string, offer: Offer, window: number, network: Network): Promise<Opened>;
|
|
24
|
+
/** Pay into the covenant from an ordinary wallet, and wait for the UTXO to appear. */
|
|
25
|
+
export declare function fundCovenant(rpc: Any, sdk: Any, opened: Opened, funderSk: string, amount: bigint, network: Network): Promise<Any>;
|
|
26
|
+
export interface Claim {
|
|
27
|
+
txid: string;
|
|
28
|
+
/** The continuation UTXO the claim now sits in. `close` spends this, not the funding UTXO. */
|
|
29
|
+
posted: Any;
|
|
30
|
+
redeem: string;
|
|
31
|
+
address: string;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Post the doubly-signed final State to the covenant.
|
|
35
|
+
*
|
|
36
|
+
* `settle` PAYS NO ONE. The single output hands the balance straight back to the same covenant,
|
|
37
|
+
* now carrying `(seq, cumulativeSompi)` as its state, and the response window restarts. A later
|
|
38
|
+
* State with a strictly higher seq supersedes this one by the same route.
|
|
39
|
+
*/
|
|
40
|
+
export declare function settleClaim(rpc: Any, sdk: Any, opened: Opened, utxo: Any, state: State, parties: {
|
|
41
|
+
buyerPubkey: string;
|
|
42
|
+
providerPubkey: string;
|
|
43
|
+
buyerSig: string;
|
|
44
|
+
providerSig: string;
|
|
45
|
+
}, network: Network): Promise<Claim>;
|
|
46
|
+
export interface Closed {
|
|
47
|
+
txid: string;
|
|
48
|
+
outputs: {
|
|
49
|
+
address: string;
|
|
50
|
+
amount: bigint;
|
|
51
|
+
}[];
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Wait out the response window and pay everyone.
|
|
55
|
+
*
|
|
56
|
+
* The output SHAPE is computed rather than assumed. The covenant accepts exactly three and refuses
|
|
57
|
+
* everything else, and guessing gets "script ran, but verification failed" -- which says nothing
|
|
58
|
+
* about which rule was broken. Below the KIP-9 floor a payout cannot be its own output at all, so
|
|
59
|
+
* it folds into the other party's.
|
|
60
|
+
*/
|
|
61
|
+
export declare function closeCovenant(rpc: Any, sdk: Any, opened: Opened, claim: Claim, who: {
|
|
62
|
+
buyerPubkey: string;
|
|
63
|
+
providerPubkey: string;
|
|
64
|
+
signerSk: string;
|
|
65
|
+
buyerAddress: string;
|
|
66
|
+
providerAddress: string;
|
|
67
|
+
}, owedSompi: number): Promise<Closed>;
|
|
68
|
+
export { x };
|
|
69
|
+
//# sourceMappingURL=session-chain.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-chain.d.ts","sourceRoot":"","sources":["../../tools/session-chain.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAgE,CAAC,EAAE,KAAK,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAE5G,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAEpD,oGAAoG;AACpG,eAAO,MAAM,UAAU,UAAW,CAAC;AACnC,eAAO,MAAM,SAAS,UAAW,CAAC;AAClC,eAAO,MAAM,QAAQ,UAAW,CAAC;AAEjC,MAAM,WAAW,MAAM;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAClD,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;GAMG;AACH,wBAAsB,YAAY,CAChC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAC1D,OAAO,CAAC,MAAM,CAAC,CAMjB;AAED,sFAAsF;AACtF,wBAAsB,YAAY,CAChC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GACrF,OAAO,CAAC,GAAG,CAAC,CAsBd;AAED,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,8FAA8F;IAC9F,MAAM,EAAE,GAAG,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;GAMG;AACH,wBAAsB,WAAW,CAC/B,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAC3D,OAAO,EAAE;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,EAC/F,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,KAAK,CAAC,CA0BhB;AAED,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAChD;AAED;;;;;;;GAOG;AACH,wBAAsB,aAAa,CACjC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAChD,GAAG,EAAE;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAA;CAAE,EACrH,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,CAAC,CAejB;AAED,OAAO,EAAE,CAAC,EAAE,CAAC"}
|