@hardkas/toolkit 0.11.1-alpha

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (113) hide show
  1. package/.turbo/turbo-build.log +4 -0
  2. package/LICENSE +21 -0
  3. package/dist/dag/consensus.d.ts +20 -0
  4. package/dist/dag/consensus.d.ts.map +1 -0
  5. package/dist/dag/consensus.js +131 -0
  6. package/dist/dag/consensus.js.map +1 -0
  7. package/dist/dag/index.d.ts +28 -0
  8. package/dist/dag/index.d.ts.map +1 -0
  9. package/dist/dag/index.js +57 -0
  10. package/dist/dag/index.js.map +1 -0
  11. package/dist/dag/store.d.ts +11 -0
  12. package/dist/dag/store.d.ts.map +1 -0
  13. package/dist/dag/store.js +32 -0
  14. package/dist/dag/store.js.map +1 -0
  15. package/dist/dag/topology.d.ts +14 -0
  16. package/dist/dag/topology.d.ts.map +1 -0
  17. package/dist/dag/topology.js +98 -0
  18. package/dist/dag/topology.js.map +1 -0
  19. package/dist/dag/types.d.ts +21 -0
  20. package/dist/dag/types.d.ts.map +1 -0
  21. package/dist/dag/types.js +2 -0
  22. package/dist/dag/types.js.map +1 -0
  23. package/dist/index.d.ts +10 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +10 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/indexer.d.ts +34 -0
  28. package/dist/indexer.d.ts.map +1 -0
  29. package/dist/indexer.js +111 -0
  30. package/dist/indexer.js.map +1 -0
  31. package/dist/jobs.d.ts +18 -0
  32. package/dist/jobs.d.ts.map +1 -0
  33. package/dist/jobs.js +33 -0
  34. package/dist/jobs.js.map +1 -0
  35. package/dist/payment.d.ts +25 -0
  36. package/dist/payment.d.ts.map +1 -0
  37. package/dist/payment.js +66 -0
  38. package/dist/payment.js.map +1 -0
  39. package/dist/silver/index.d.ts +20 -0
  40. package/dist/silver/index.d.ts.map +1 -0
  41. package/dist/silver/index.js +94 -0
  42. package/dist/silver/index.js.map +1 -0
  43. package/dist/silver/templates.d.ts +2 -0
  44. package/dist/silver/templates.d.ts.map +1 -0
  45. package/dist/silver/templates.js +28 -0
  46. package/dist/silver/templates.js.map +1 -0
  47. package/dist/silver/types.d.ts +34 -0
  48. package/dist/silver/types.d.ts.map +1 -0
  49. package/dist/silver/types.js +2 -0
  50. package/dist/silver/types.js.map +1 -0
  51. package/dist/snapshot/backends/FsSnapshotBackend.d.ts +14 -0
  52. package/dist/snapshot/backends/FsSnapshotBackend.d.ts.map +1 -0
  53. package/dist/snapshot/backends/FsSnapshotBackend.js +82 -0
  54. package/dist/snapshot/backends/FsSnapshotBackend.js.map +1 -0
  55. package/dist/snapshot/backends/MemorySnapshotBackend.d.ts +13 -0
  56. package/dist/snapshot/backends/MemorySnapshotBackend.d.ts.map +1 -0
  57. package/dist/snapshot/backends/MemorySnapshotBackend.js +55 -0
  58. package/dist/snapshot/backends/MemorySnapshotBackend.js.map +1 -0
  59. package/dist/snapshot/index.d.ts +19 -0
  60. package/dist/snapshot/index.d.ts.map +1 -0
  61. package/dist/snapshot/index.js +84 -0
  62. package/dist/snapshot/index.js.map +1 -0
  63. package/dist/snapshot/serialization.d.ts +18 -0
  64. package/dist/snapshot/serialization.d.ts.map +1 -0
  65. package/dist/snapshot/serialization.js +31 -0
  66. package/dist/snapshot/serialization.js.map +1 -0
  67. package/dist/snapshot/types.d.ts +44 -0
  68. package/dist/snapshot/types.d.ts.map +1 -0
  69. package/dist/snapshot/types.js +2 -0
  70. package/dist/snapshot/types.js.map +1 -0
  71. package/dist/stores/invoice-store.d.ts +26 -0
  72. package/dist/stores/invoice-store.d.ts.map +1 -0
  73. package/dist/stores/invoice-store.js +34 -0
  74. package/dist/stores/invoice-store.js.map +1 -0
  75. package/dist/stores/utxo-control-store.d.ts +23 -0
  76. package/dist/stores/utxo-control-store.d.ts.map +1 -0
  77. package/dist/stores/utxo-control-store.js +64 -0
  78. package/dist/stores/utxo-control-store.js.map +1 -0
  79. package/dist/utxos.d.ts +128 -0
  80. package/dist/utxos.d.ts.map +1 -0
  81. package/dist/utxos.js +331 -0
  82. package/dist/utxos.js.map +1 -0
  83. package/dist/wallet.d.ts +34 -0
  84. package/dist/wallet.d.ts.map +1 -0
  85. package/dist/wallet.js +72 -0
  86. package/dist/wallet.js.map +1 -0
  87. package/package.json +28 -0
  88. package/src/dag/consensus.ts +150 -0
  89. package/src/dag/index.ts +73 -0
  90. package/src/dag/store.ts +40 -0
  91. package/src/dag/topology.ts +108 -0
  92. package/src/dag/types.ts +20 -0
  93. package/src/index.ts +9 -0
  94. package/src/indexer.ts +128 -0
  95. package/src/jobs.ts +46 -0
  96. package/src/payment.ts +81 -0
  97. package/src/silver/index.ts +102 -0
  98. package/src/silver/templates.ts +27 -0
  99. package/src/silver/types.ts +37 -0
  100. package/src/snapshot/backends/FsSnapshotBackend.ts +100 -0
  101. package/src/snapshot/backends/MemorySnapshotBackend.ts +65 -0
  102. package/src/snapshot/index.ts +102 -0
  103. package/src/snapshot/serialization.ts +35 -0
  104. package/src/snapshot/types.ts +45 -0
  105. package/src/stores/invoice-store.ts +53 -0
  106. package/src/stores/utxo-control-store.ts +78 -0
  107. package/src/utxos.ts +451 -0
  108. package/src/wallet.ts +93 -0
  109. package/test/silver.test.ts +59 -0
  110. package/test/snapshot.test.ts +99 -0
  111. package/test/toolkit.test.ts +109 -0
  112. package/tsconfig.json +9 -0
  113. package/vitest.config.ts +8 -0
@@ -0,0 +1,111 @@
1
+ import { EventSubscriber } from '@hardkas/core';
2
+ import { ProjectionStoreJson } from '@hardkas/query-store';
3
+ import { ArtifactIndexStoreJson } from '@hardkas/artifacts';
4
+ import { DagApi } from './dag/index.js';
5
+ export class IndexerToolkit {
6
+ options;
7
+ subscriber;
8
+ projection;
9
+ artifactIndex;
10
+ dag;
11
+ backend;
12
+ constructor(options) {
13
+ this.options = options;
14
+ this.subscriber = new EventSubscriber();
15
+ this.backend = options.backend;
16
+ if (!this.backend || !this.backend.capabilities.externalState) {
17
+ this.projection = new ProjectionStoreJson({
18
+ dirPath: options.dataDir ? `${options.dataDir}/projections` : '.hardkas/indexer/projections',
19
+ namespace: 'indexer'
20
+ });
21
+ this.artifactIndex = new ArtifactIndexStoreJson({
22
+ filePath: options.dataDir ? `${options.dataDir}/artifacts.json` : '.hardkas/indexer/artifacts.json'
23
+ });
24
+ }
25
+ this.dag = new DagApi();
26
+ }
27
+ static open(options = {}) {
28
+ return new IndexerToolkit(options);
29
+ }
30
+ async connect() {
31
+ if (this.backend?.connect) {
32
+ await this.backend.connect();
33
+ }
34
+ }
35
+ async watch(address) {
36
+ // Polling wrapper as per V1 rules.
37
+ this.subscriber.subscribe({
38
+ source: {}, // mock source for facade
39
+ type: "payment",
40
+ intervalMs: 1000,
41
+ watchedAddresses: [address],
42
+ handler: async (evt) => {
43
+ // Internally updates projections if address is involved
44
+ }
45
+ });
46
+ }
47
+ async balance(address) {
48
+ if (this.backend?.balance) {
49
+ return this.backend.balance(address);
50
+ }
51
+ const balances = this.projection?.get('balances') || {};
52
+ return BigInt(balances[address] || 0);
53
+ }
54
+ async history(address) {
55
+ if (this.backend?.history) {
56
+ return this.backend.history(address);
57
+ }
58
+ const history = this.projection?.get('history') || {};
59
+ return history[address] || [];
60
+ }
61
+ async findReceipts(opts) {
62
+ if (!this.artifactIndex)
63
+ return [];
64
+ return this.artifactIndex.find(opts);
65
+ }
66
+ async ingestArtifact(artifact) {
67
+ if (!this.artifactIndex)
68
+ return;
69
+ this.artifactIndex.index({
70
+ hash: artifact.id || 'mock_hash',
71
+ schema: artifact.schema || 'unknown.v1',
72
+ timestamp: new Date().toISOString(),
73
+ filePath: `/mock/path/${artifact.id}.json`,
74
+ tags: artifact.tags || []
75
+ });
76
+ }
77
+ async snapshot() {
78
+ if (this.backend && !this.backend.capabilities.snapshots && this.backend.capabilities.externalState) {
79
+ return {
80
+ backend: this.backend.name,
81
+ externalState: true,
82
+ snapshots: false,
83
+ dag: await this.dag.snapshot()
84
+ };
85
+ }
86
+ return {
87
+ projection: this.projection?.getAll() || {},
88
+ artifactIndex: this.artifactIndex?.getAll() || [],
89
+ dag: await this.dag.snapshot()
90
+ };
91
+ }
92
+ async restore(state) {
93
+ if (state.externalState) {
94
+ // Cannot restore local state over an external backend. Just restore DAG.
95
+ if (state.dag)
96
+ await this.dag.restore(state.dag);
97
+ return;
98
+ }
99
+ if (state.projection && this.projection)
100
+ this.projection.setAll(state.projection);
101
+ if (state.artifactIndex && this.artifactIndex)
102
+ this.artifactIndex.setAll(state.artifactIndex);
103
+ if (state.dag)
104
+ await this.dag.restore(state.dag);
105
+ }
106
+ async reload() {
107
+ await this.dag.reload();
108
+ // Projection and artifactIndex read synchronously from memory in this version
109
+ }
110
+ }
111
+ //# sourceMappingURL=indexer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"indexer.js","sourceRoot":"","sources":["../src/indexer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAiB,MAAM,eAAe,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAcxC,MAAM,OAAO,cAAc;IAOc;IAN7B,UAAU,CAAkB;IAC5B,UAAU,CAAuB;IACjC,aAAa,CAA0B;IAC/B,GAAG,CAAS;IACZ,OAAO,CAAoC;IAE3D,YAAqC,OAA8B;QAA9B,YAAO,GAAP,OAAO,CAAuB;QAC/D,IAAI,CAAC,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACxC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAE/B,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,aAAa,EAAE,CAAC;YAC5D,IAAI,CAAC,UAAU,GAAG,IAAI,mBAAmB,CAAC;gBACtC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,OAAO,cAAc,CAAC,CAAC,CAAC,8BAA8B;gBAC5F,SAAS,EAAE,SAAS;aACvB,CAAC,CAAC;YACH,IAAI,CAAC,aAAa,GAAG,IAAI,sBAAsB,CAAC;gBAC5C,QAAQ,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,OAAO,iBAAiB,CAAC,CAAC,CAAC,iCAAiC;aACtG,CAAC,CAAC;QACP,CAAC;QAED,IAAI,CAAC,GAAG,GAAG,IAAI,MAAM,EAAE,CAAC;IAC5B,CAAC;IAEM,MAAM,CAAC,IAAI,CAAC,UAAiC,EAAE;QAClD,OAAO,IAAI,cAAc,CAAC,OAAO,CAAC,CAAC;IACvC,CAAC;IAEM,KAAK,CAAC,OAAO;QAChB,IAAI,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC;YACxB,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QACjC,CAAC;IACL,CAAC;IAEM,KAAK,CAAC,KAAK,CAAC,OAAe;QAC9B,mCAAmC;QACnC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;YACtB,MAAM,EAAE,EAAE,EAAE,yBAAyB;YACrC,IAAI,EAAE,SAAS;YACf,UAAU,EAAE,IAAI;YAChB,gBAAgB,EAAE,CAAC,OAAO,CAAC;YAC3B,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;gBACnB,wDAAwD;YAC5D,CAAC;SACJ,CAAC,CAAC;IACP,CAAC;IAEM,KAAK,CAAC,OAAO,CAAC,OAAe;QAChC,IAAI,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACzC,CAAC;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;QACxD,OAAO,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1C,CAAC;IAEM,KAAK,CAAC,OAAO,CAAC,OAAe;QAChC,IAAI,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACzC,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QACtD,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IAClC,CAAC;IAEM,KAAK,CAAC,YAAY,CAAC,IAAwB;QAC9C,IAAI,CAAC,IAAI,CAAC,aAAa;YAAE,OAAO,EAAE,CAAC;QACnC,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;IAEM,KAAK,CAAC,cAAc,CAAC,QAAa;QACrC,IAAI,CAAC,IAAI,CAAC,aAAa;YAAE,OAAO;QAChC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;YACrB,IAAI,EAAE,QAAQ,CAAC,EAAE,IAAI,WAAW;YAChC,MAAM,EAAE,QAAQ,CAAC,MAAM,IAAI,YAAY;YACvC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,QAAQ,EAAE,cAAc,QAAQ,CAAC,EAAE,OAAO;YAC1C,IAAI,EAAE,QAAQ,CAAC,IAAI,IAAI,EAAE;SAC5B,CAAC,CAAC;IACP,CAAC;IAEM,KAAK,CAAC,QAAQ;QACjB,IAAI,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,SAAS,IAAI,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,aAAa,EAAE,CAAC;YAClG,OAAO;gBACH,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI;gBAC1B,aAAa,EAAE,IAAI;gBACnB,SAAS,EAAE,KAAK;gBAChB,GAAG,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE;aACjC,CAAC;QACN,CAAC;QACD,OAAO;YACH,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE;YAC3C,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,MAAM,EAAE,IAAI,EAAE;YACjD,GAAG,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE;SACjC,CAAC;IACN,CAAC;IAEM,KAAK,CAAC,OAAO,CAAC,KAAU;QAC3B,IAAI,KAAK,CAAC,aAAa,EAAE,CAAC;YACtB,yEAAyE;YACzE,IAAI,KAAK,CAAC,GAAG;gBAAE,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACjD,OAAO;QACX,CAAC;QACD,IAAI,KAAK,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU;YAAE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAClF,IAAI,KAAK,CAAC,aAAa,IAAI,IAAI,CAAC,aAAa;YAAE,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAC9F,IAAI,KAAK,CAAC,GAAG;YAAE,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACrD,CAAC;IAEM,KAAK,CAAC,MAAM;QACf,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;QACxB,8EAA8E;IAClF,CAAC;CACJ"}
package/dist/jobs.d.ts ADDED
@@ -0,0 +1,18 @@
1
+ import { JobHandler, JobRecord } from '@hardkas/jobs';
2
+ import { SnapshotParticipant, SnapshotState } from './snapshot/types.js';
3
+ export interface JobsToolkitOptions {
4
+ storePath?: string;
5
+ }
6
+ export declare class JobsToolkit implements SnapshotParticipant {
7
+ private runner;
8
+ private store;
9
+ private constructor();
10
+ static open(options?: JobsToolkitOptions): JobsToolkit;
11
+ registerHandler(type: string, handler: JobHandler): void;
12
+ enqueue(type: string, args?: any): Promise<string>;
13
+ getJob(id: string): Promise<JobRecord | undefined>;
14
+ snapshot(): Promise<SnapshotState>;
15
+ restore(state: SnapshotState): Promise<void>;
16
+ reload(): Promise<void>;
17
+ }
18
+ //# sourceMappingURL=jobs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jobs.d.ts","sourceRoot":"","sources":["../src/jobs.ts"],"names":[],"mappings":"AAAA,OAAO,EAA2B,UAAU,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC/E,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzE,MAAM,WAAW,kBAAkB;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,WAAY,YAAW,mBAAmB;IACnD,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,KAAK,CAAe;IAE5B,OAAO;WAKO,IAAI,CAAC,OAAO,GAAE,kBAAuB,GAAG,WAAW;IAI1D,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,GAAG,IAAI;IAIlD,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC;IAIlD,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;IAIlD,QAAQ,IAAI,OAAO,CAAC,aAAa,CAAC;IAIlC,OAAO,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAI5C,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;CAKvC"}
package/dist/jobs.js ADDED
@@ -0,0 +1,33 @@
1
+ import { JobRunner, JobStoreJson } from '@hardkas/jobs';
2
+ export class JobsToolkit {
3
+ runner;
4
+ store;
5
+ constructor(options) {
6
+ this.store = new JobStoreJson({ filePath: options.storePath || '.hardkas-data/jobs.json' });
7
+ this.runner = new JobRunner({ store: this.store });
8
+ }
9
+ static open(options = {}) {
10
+ return new JobsToolkit(options);
11
+ }
12
+ registerHandler(type, handler) {
13
+ this.runner.registerHandler(type, handler);
14
+ }
15
+ async enqueue(type, args) {
16
+ return this.runner.enqueue(type, args);
17
+ }
18
+ async getJob(id) {
19
+ return this.runner.getJob(id);
20
+ }
21
+ async snapshot() {
22
+ return this.store.getAll();
23
+ }
24
+ async restore(state) {
25
+ this.store.setAll(state);
26
+ }
27
+ async reload() {
28
+ // Runner reads from store on each operation natively in current design,
29
+ // but if it had internal queues/caches, we'd clear them here.
30
+ // E.g., this.runner.clearCache();
31
+ }
32
+ }
33
+ //# sourceMappingURL=jobs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jobs.js","sourceRoot":"","sources":["../src/jobs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAyB,MAAM,eAAe,CAAC;AAO/E,MAAM,OAAO,WAAW;IACZ,MAAM,CAAY;IAClB,KAAK,CAAe;IAE5B,YAAoB,OAA2B;QAC3C,IAAI,CAAC,KAAK,GAAG,IAAI,YAAY,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,SAAS,IAAI,yBAAyB,EAAE,CAAC,CAAC;QAC5F,IAAI,CAAC,MAAM,GAAG,IAAI,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IACvD,CAAC;IAEM,MAAM,CAAC,IAAI,CAAC,UAA8B,EAAE;QAC/C,OAAO,IAAI,WAAW,CAAC,OAAO,CAAC,CAAC;IACpC,CAAC;IAEM,eAAe,CAAC,IAAY,EAAE,OAAmB;QACpD,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC/C,CAAC;IAEM,KAAK,CAAC,OAAO,CAAC,IAAY,EAAE,IAAU;QACzC,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC3C,CAAC;IAEM,KAAK,CAAC,MAAM,CAAC,EAAU;QAC1B,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAClC,CAAC;IAEM,KAAK,CAAC,QAAQ;QACjB,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;IAC/B,CAAC;IAEM,KAAK,CAAC,OAAO,CAAC,KAAoB;QACrC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAkC,CAAC,CAAC;IAC1D,CAAC;IAEM,KAAK,CAAC,MAAM;QACf,wEAAwE;QACxE,8DAA8D;QAC9D,kCAAkC;IACtC,CAAC;CACJ"}
@@ -0,0 +1,25 @@
1
+ import { InvoiceRecord } from './stores/invoice-store.js';
2
+ export interface PaymentToolkitOptions {
3
+ storePath?: string;
4
+ }
5
+ export declare class PaymentToolkit {
6
+ readonly merchantId: string;
7
+ private readonly options;
8
+ private store;
9
+ private constructor();
10
+ static openMerchant(merchantId: string, options?: PaymentToolkitOptions): PaymentToolkit;
11
+ createInvoice(opts: {
12
+ amount: bigint;
13
+ currency: string;
14
+ }): Promise<InvoiceRecord>;
15
+ getInvoice(id: string): Promise<InvoiceRecord | undefined>;
16
+ listInvoices(): Promise<InvoiceRecord[]>;
17
+ stats(): Promise<{
18
+ totalInvoices: number;
19
+ paidInvoices: number;
20
+ }>;
21
+ check(invoiceId: string): Promise<string>;
22
+ receipt(invoiceId: string): Promise<any>;
23
+ simulatePay(invoiceId: string): Promise<void>;
24
+ }
25
+ //# sourceMappingURL=payment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payment.d.ts","sourceRoot":"","sources":["../src/payment.ts"],"names":[],"mappings":"AAEA,OAAO,EAAoB,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE5E,MAAM,WAAW,qBAAqB;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,cAAc;aAIH,UAAU,EAAE,MAAM;IAClC,OAAO,CAAC,QAAQ,CAAC,OAAO;IAJ5B,OAAO,CAAC,KAAK,CAAmB;IAEhC,OAAO;WAOO,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,GAAE,qBAA0B,GAAG,cAAc;IAItF,aAAa,CAAC,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,aAAa,CAAC;IAuBjF,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC;IAI1D,YAAY,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IAIxC,KAAK,IAAI,OAAO,CAAC;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;IAIjE,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAKzC,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAWxC,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAO7D"}
@@ -0,0 +1,66 @@
1
+ import { buildKaspaUri } from '@hardkas/tx-builder';
2
+ import { InvoiceStoreJson } from './stores/invoice-store.js';
3
+ export class PaymentToolkit {
4
+ merchantId;
5
+ options;
6
+ store;
7
+ constructor(merchantId, options) {
8
+ this.merchantId = merchantId;
9
+ this.options = options;
10
+ this.store = new InvoiceStoreJson({ filePath: options.storePath || '.hardkas-data/invoices.json' });
11
+ }
12
+ static openMerchant(merchantId, options = {}) {
13
+ return new PaymentToolkit(merchantId, options);
14
+ }
15
+ async createInvoice(opts) {
16
+ const id = `inv_${Date.now()}`;
17
+ const result = buildKaspaUri({
18
+ address: `kaspa:${this.merchantId}`,
19
+ amountSompi: opts.amount * 100000000n, // convert to sompi
20
+ message: `Invoice ${id}`
21
+ });
22
+ const invoice = {
23
+ id,
24
+ merchantId: this.merchantId,
25
+ amount: opts.amount,
26
+ currency: opts.currency,
27
+ status: 'pending',
28
+ uri: result.uri,
29
+ createdAt: new Date().toISOString(),
30
+ updatedAt: new Date().toISOString()
31
+ };
32
+ this.store.save(invoice);
33
+ return invoice;
34
+ }
35
+ async getInvoice(id) {
36
+ return this.store.get(id);
37
+ }
38
+ async listInvoices() {
39
+ return this.store.listByMerchant(this.merchantId);
40
+ }
41
+ async stats() {
42
+ return this.store.stats(this.merchantId);
43
+ }
44
+ async check(invoiceId) {
45
+ const inv = this.store.get(invoiceId);
46
+ return inv ? inv.status : 'not_found';
47
+ }
48
+ async receipt(invoiceId) {
49
+ return {
50
+ schema: "paymentReceipt.v1",
51
+ invoiceId,
52
+ merchantId: this.merchantId,
53
+ status: "paid",
54
+ timestamp: new Date().toISOString()
55
+ };
56
+ }
57
+ // For lab testing/simulation manually paying an invoice
58
+ async simulatePay(invoiceId) {
59
+ const inv = this.store.get(invoiceId);
60
+ if (inv) {
61
+ inv.status = 'paid';
62
+ this.store.save(inv);
63
+ }
64
+ }
65
+ }
66
+ //# sourceMappingURL=payment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payment.js","sourceRoot":"","sources":["../src/payment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,EAAE,gBAAgB,EAAiB,MAAM,2BAA2B,CAAC;AAM5E,MAAM,OAAO,cAAc;IAIH;IACC;IAJb,KAAK,CAAmB;IAEhC,YACoB,UAAkB,EACjB,OAA8B;QAD/B,eAAU,GAAV,UAAU,CAAQ;QACjB,YAAO,GAAP,OAAO,CAAuB;QAE/C,IAAI,CAAC,KAAK,GAAG,IAAI,gBAAgB,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,SAAS,IAAI,6BAA6B,EAAE,CAAC,CAAC;IACxG,CAAC;IAEM,MAAM,CAAC,YAAY,CAAC,UAAkB,EAAE,UAAiC,EAAE;QAC9E,OAAO,IAAI,cAAc,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IACnD,CAAC;IAEM,KAAK,CAAC,aAAa,CAAC,IAA0C;QACjE,MAAM,EAAE,GAAG,OAAO,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,aAAa,CAAC;YACzB,OAAO,EAAE,SAAS,IAAI,CAAC,UAAU,EAAE;YACnC,WAAW,EAAE,IAAI,CAAC,MAAM,GAAG,UAAY,EAAE,mBAAmB;YAC5D,OAAO,EAAE,WAAW,EAAE,EAAE;SAC3B,CAAC,CAAC;QAEH,MAAM,OAAO,GAAkB;YAC3B,EAAE;YACF,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,MAAM,EAAE,SAAS;YACjB,GAAG,EAAE,MAAM,CAAC,GAAG;YACf,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACtC,CAAC;QAEF,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACzB,OAAO,OAAO,CAAC;IACnB,CAAC;IAEM,KAAK,CAAC,UAAU,CAAC,EAAU;QAC9B,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC9B,CAAC;IAEM,KAAK,CAAC,YAAY;QACrB,OAAO,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACtD,CAAC;IAEM,KAAK,CAAC,KAAK;QACd,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC7C,CAAC;IAEM,KAAK,CAAC,KAAK,CAAC,SAAiB;QAChC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACtC,OAAO,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC;IAC1C,CAAC;IAEM,KAAK,CAAC,OAAO,CAAC,SAAiB;QAClC,OAAO;YACH,MAAM,EAAE,mBAAmB;YAC3B,SAAS;YACT,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,MAAM,EAAE,MAAM;YACd,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACtC,CAAC;IACN,CAAC;IAED,wDAAwD;IACjD,KAAK,CAAC,WAAW,CAAC,SAAiB;QACtC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACtC,IAAI,GAAG,EAAE,CAAC;YACN,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC;YACpB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;IACL,CAAC;CACJ"}
@@ -0,0 +1,20 @@
1
+ import { SilverArtifact, SilverBuildResult, SilverEvidence, SilverSimulationResult } from './types.js';
2
+ export declare class SilverTemplate {
3
+ readonly name: string;
4
+ private readonly rawSource;
5
+ constructor(name: string, rawSource: string);
6
+ parameters(): string[];
7
+ fill(params: Record<string, string | number>): string;
8
+ }
9
+ export declare class SilverToolkit {
10
+ private constructor();
11
+ static open(): SilverToolkit;
12
+ private getClaims;
13
+ templates(): string[];
14
+ template(name: string): SilverTemplate;
15
+ build(source: string): Promise<SilverBuildResult>;
16
+ simulate(build: SilverBuildResult, args?: string[]): Promise<SilverSimulationResult>;
17
+ artifact(build: SilverBuildResult, name?: string): Promise<SilverArtifact>;
18
+ evidence(build: SilverBuildResult, simulation: SilverSimulationResult): Promise<SilverEvidence>;
19
+ }
20
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/silver/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAgB,cAAc,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAErH,qBAAa,cAAc;aACK,IAAI,EAAE,MAAM;IAAE,OAAO,CAAC,QAAQ,CAAC,SAAS;gBAAxC,IAAI,EAAE,MAAM,EAAmB,SAAS,EAAE,MAAM;IAErE,UAAU,IAAI,MAAM,EAAE;IAMtB,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,GAAG,MAAM;CAY/D;AAED,qBAAa,aAAa;IACtB,OAAO;WAEO,IAAI,IAAI,aAAa;IAInC,OAAO,CAAC,SAAS;IAUV,SAAS,IAAI,MAAM,EAAE;IAIrB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc;IAOhC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAUjD,QAAQ,CAAC,KAAK,EAAE,iBAAiB,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAUpF,QAAQ,CAAC,KAAK,EAAE,iBAAiB,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAc1E,QAAQ,CAAC,KAAK,EAAE,iBAAiB,EAAE,UAAU,EAAE,sBAAsB,GAAG,OAAO,CAAC,cAAc,CAAC;CAa/G"}
@@ -0,0 +1,94 @@
1
+ import { SILVER_TEMPLATES } from './templates.js';
2
+ export class SilverTemplate {
3
+ name;
4
+ rawSource;
5
+ constructor(name, rawSource) {
6
+ this.name = name;
7
+ this.rawSource = rawSource;
8
+ }
9
+ parameters() {
10
+ const regex = /<([^>]+)>/g;
11
+ const matches = [...this.rawSource.matchAll(regex)];
12
+ return Array.from(new Set(matches.map(m => m[1])));
13
+ }
14
+ fill(params) {
15
+ let filledSource = this.rawSource;
16
+ const requiredParams = this.parameters();
17
+ for (const req of requiredParams) {
18
+ if (!(req in params)) {
19
+ throw new Error(`Missing parameter for template '${this.name}': <${req}>`);
20
+ }
21
+ filledSource = filledSource.replace(new RegExp(`<${req}>`, 'g'), String(params[req]));
22
+ }
23
+ return filledSource;
24
+ }
25
+ }
26
+ export class SilverToolkit {
27
+ constructor() { }
28
+ static open() {
29
+ return new SilverToolkit();
30
+ }
31
+ getClaims() {
32
+ return {
33
+ realSilverCompiler: false,
34
+ vmConsensusEquivalence: false,
35
+ mainnetReady: false,
36
+ productionSafe: false,
37
+ simulatedOnly: true
38
+ };
39
+ }
40
+ templates() {
41
+ return Object.keys(SILVER_TEMPLATES);
42
+ }
43
+ template(name) {
44
+ if (!SILVER_TEMPLATES[name]) {
45
+ throw new Error(`Silver template not found: ${name}`);
46
+ }
47
+ return new SilverTemplate(name, SILVER_TEMPLATES[name]);
48
+ }
49
+ async build(source) {
50
+ // Mock bytecode compilation
51
+ const mockBytecode = Buffer.from(source).toString('hex');
52
+ return {
53
+ source,
54
+ bytecode: mockBytecode,
55
+ claims: this.getClaims()
56
+ };
57
+ }
58
+ async simulate(build, args) {
59
+ // Mock VM execution
60
+ return {
61
+ success: true,
62
+ executionTrace: ["OP_TRUE", "OP_CHECKSIG"],
63
+ gasConsumed: 1000,
64
+ claims: this.getClaims()
65
+ };
66
+ }
67
+ async artifact(build, name) {
68
+ const art = {
69
+ id: `silver-${Date.now()}`,
70
+ source: build.source,
71
+ bytecode: build.bytecode,
72
+ createdAt: new Date().toISOString(),
73
+ claims: this.getClaims()
74
+ };
75
+ if (name !== undefined) {
76
+ art.name = name;
77
+ }
78
+ return art;
79
+ }
80
+ async evidence(build, simulation) {
81
+ return {
82
+ schema: "hardkas.script-evidence.v1",
83
+ artifactId: `silver-${Date.now()}`,
84
+ simulationResult: {
85
+ success: simulation.success,
86
+ executionTrace: simulation.executionTrace,
87
+ gasConsumed: simulation.gasConsumed
88
+ },
89
+ timestamp: new Date().toISOString(),
90
+ claims: this.getClaims()
91
+ };
92
+ }
93
+ }
94
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/silver/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAGlD,MAAM,OAAO,cAAc;IACK;IAA+B;IAA3D,YAA4B,IAAY,EAAmB,SAAiB;QAAhD,SAAI,GAAJ,IAAI,CAAQ;QAAmB,cAAS,GAAT,SAAS,CAAQ;IAAG,CAAC;IAEzE,UAAU;QACb,MAAM,KAAK,GAAG,YAAY,CAAC;QAC3B,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;QACpD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAW,CAAC,CAAC,CAAC,CAAC;IACjE,CAAC;IAEM,IAAI,CAAC,MAAuC;QAC/C,IAAI,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC;QAClC,MAAM,cAAc,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAEzC,KAAK,MAAM,GAAG,IAAI,cAAc,EAAE,CAAC;YAC/B,IAAI,CAAC,CAAC,GAAG,IAAI,MAAM,CAAC,EAAE,CAAC;gBACnB,MAAM,IAAI,KAAK,CAAC,mCAAmC,IAAI,CAAC,IAAI,OAAO,GAAG,GAAG,CAAC,CAAC;YAC/E,CAAC;YACD,YAAY,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,IAAI,GAAG,GAAG,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC1F,CAAC;QACD,OAAO,YAAY,CAAC;IACxB,CAAC;CACJ;AAED,MAAM,OAAO,aAAa;IACtB,gBAAuB,CAAC;IAEjB,MAAM,CAAC,IAAI;QACd,OAAO,IAAI,aAAa,EAAE,CAAC;IAC/B,CAAC;IAEO,SAAS;QACb,OAAO;YACH,kBAAkB,EAAE,KAAK;YACzB,sBAAsB,EAAE,KAAK;YAC7B,YAAY,EAAE,KAAK;YACnB,cAAc,EAAE,KAAK;YACrB,aAAa,EAAE,IAAI;SACtB,CAAC;IACN,CAAC;IAEM,SAAS;QACZ,OAAO,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IACzC,CAAC;IAEM,QAAQ,CAAC,IAAY;QACxB,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,8BAA8B,IAAI,EAAE,CAAC,CAAC;QAC1D,CAAC;QACD,OAAO,IAAI,cAAc,CAAC,IAAI,EAAE,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5D,CAAC;IAEM,KAAK,CAAC,KAAK,CAAC,MAAc;QAC7B,4BAA4B;QAC5B,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACzD,OAAO;YACH,MAAM;YACN,QAAQ,EAAE,YAAY;YACtB,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE;SAC3B,CAAC;IACN,CAAC;IAEM,KAAK,CAAC,QAAQ,CAAC,KAAwB,EAAE,IAAe;QAC3D,oBAAoB;QACpB,OAAO;YACH,OAAO,EAAE,IAAI;YACb,cAAc,EAAE,CAAC,SAAS,EAAE,aAAa,CAAC;YAC1C,WAAW,EAAE,IAAI;YACjB,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE;SAC3B,CAAC;IACN,CAAC;IAEM,KAAK,CAAC,QAAQ,CAAC,KAAwB,EAAE,IAAa;QACzD,MAAM,GAAG,GAAQ;YACb,EAAE,EAAE,UAAU,IAAI,CAAC,GAAG,EAAE,EAAE;YAC1B,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE;SAC3B,CAAC;QACF,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACrB,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;QACpB,CAAC;QACD,OAAO,GAAqB,CAAC;IACjC,CAAC;IAEM,KAAK,CAAC,QAAQ,CAAC,KAAwB,EAAE,UAAkC;QAC9E,OAAO;YACH,MAAM,EAAE,4BAA4B;YACpC,UAAU,EAAE,UAAU,IAAI,CAAC,GAAG,EAAE,EAAE;YAClC,gBAAgB,EAAE;gBACd,OAAO,EAAE,UAAU,CAAC,OAAO;gBAC3B,cAAc,EAAE,UAAU,CAAC,cAAc;gBACzC,WAAW,EAAE,UAAU,CAAC,WAAW;aACtC;YACD,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE;SAC3B,CAAC;IACN,CAAC;CACJ"}
@@ -0,0 +1,2 @@
1
+ export declare const SILVER_TEMPLATES: Record<string, string>;
2
+ //# sourceMappingURL=templates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/silver/templates.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CA0BnD,CAAC"}
@@ -0,0 +1,28 @@
1
+ export const SILVER_TEMPLATES = {
2
+ "op-true": `OP_TRUE`,
3
+ "timelock": `<locktime> OP_CHECKLOCKTIMEVERIFY OP_DROP
4
+ <pubkey> OP_CHECKSIG`,
5
+ "escrow": `OP_IF
6
+ <buyer_pubkey> OP_CHECKSIGVERIFY
7
+ <arbiter_pubkey> OP_CHECKSIG
8
+ OP_ELSE
9
+ <seller_pubkey> OP_CHECKSIGVERIFY
10
+ <arbiter_pubkey> OP_CHECKSIG
11
+ OP_ENDIF`,
12
+ "htlc": `OP_IF
13
+ OP_SHA256 <secret_hash> OP_EQUALVERIFY
14
+ <receiver_pubkey> OP_CHECKSIG
15
+ OP_ELSE
16
+ <locktime> OP_CHECKLOCKTIMEVERIFY OP_DROP
17
+ <sender_pubkey> OP_CHECKSIG
18
+ OP_ENDIF`,
19
+ "atomic-swap": `OP_IF
20
+ OP_SHA256 <secret_hash> OP_EQUALVERIFY
21
+ <participant_b_pubkey> OP_CHECKSIG
22
+ OP_ELSE
23
+ <locktime> OP_CHECKLOCKTIMEVERIFY OP_DROP
24
+ <participant_a_pubkey> OP_CHECKSIG
25
+ OP_ENDIF`,
26
+ "multisig": `OP_2 <pubkey1> <pubkey2> <pubkey3> OP_3 OP_CHECKMULTISIG`
27
+ };
28
+ //# sourceMappingURL=templates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/silver/templates.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,gBAAgB,GAA2B;IACpD,SAAS,EAAE,SAAS;IACpB,UAAU,EAAE;qBACK;IACjB,QAAQ,EAAE;;;;;;SAML;IACL,MAAM,EAAE;;;;;;SAMH;IACL,aAAa,EAAE;;;;;;SAMV;IACL,UAAU,EAAE,0DAA0D;CACzE,CAAC"}
@@ -0,0 +1,34 @@
1
+ export interface SilverClaims {
2
+ realSilverCompiler: boolean;
3
+ vmConsensusEquivalence: boolean;
4
+ mainnetReady: boolean;
5
+ productionSafe: boolean;
6
+ simulatedOnly: boolean;
7
+ }
8
+ export interface SilverBuildResult {
9
+ source: string;
10
+ bytecode: string;
11
+ claims: SilverClaims;
12
+ }
13
+ export interface SilverSimulationResult {
14
+ success: boolean;
15
+ executionTrace: string[];
16
+ gasConsumed: number;
17
+ claims: SilverClaims;
18
+ }
19
+ export interface SilverArtifact {
20
+ id: string;
21
+ name?: string;
22
+ source: string;
23
+ bytecode: string;
24
+ createdAt: string;
25
+ claims: SilverClaims;
26
+ }
27
+ export interface SilverEvidence {
28
+ schema: string;
29
+ artifactId: string;
30
+ simulationResult: Omit<SilverSimulationResult, 'claims'>;
31
+ timestamp: string;
32
+ claims: SilverClaims;
33
+ }
34
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/silver/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IACzB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,sBAAsB,EAAE,OAAO,CAAC;IAChC,YAAY,EAAE,OAAO,CAAC;IACtB,cAAc,EAAE,OAAO,CAAC;IACxB,aAAa,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,iBAAiB;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,YAAY,CAAC;CACxB;AAED,MAAM,WAAW,sBAAsB;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,YAAY,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,YAAY,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,IAAI,CAAC,sBAAsB,EAAE,QAAQ,CAAC,CAAC;IACzD,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,YAAY,CAAC;CACxB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/silver/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,14 @@
1
+ import { SnapshotBackend, SnapshotManifest, SnapshotState } from "../types.js";
2
+ export declare class FsSnapshotBackend implements SnapshotBackend {
3
+ private baseDir;
4
+ constructor(baseDir?: string);
5
+ save(id: string, name: string, state: Record<string, SnapshotState>): Promise<SnapshotManifest>;
6
+ load(id: string): Promise<{
7
+ manifest: SnapshotManifest;
8
+ state: Record<string, SnapshotState>;
9
+ }>;
10
+ list(): Promise<SnapshotManifest[]>;
11
+ delete(id: string): Promise<void>;
12
+ branch(baseId: string, newId: string, newName: string): Promise<SnapshotManifest>;
13
+ }
14
+ //# sourceMappingURL=FsSnapshotBackend.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FsSnapshotBackend.d.ts","sourceRoot":"","sources":["../../../src/snapshot/backends/FsSnapshotBackend.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAM/E,qBAAa,iBAAkB,YAAW,eAAe;IACrD,OAAO,CAAC,OAAO,CAAS;gBAEZ,OAAO,GAAE,MAA6B;IAI5C,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAoC/F,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,gBAAgB,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAA;KAAE,CAAC;IAkB/F,IAAI,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAqBnC,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOjC,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;CAI1F"}
@@ -0,0 +1,82 @@
1
+ import fs from "fs-extra";
2
+ import path from "path";
3
+ import crypto from "crypto";
4
+ import { snapshotReplacer, snapshotReviver } from "../serialization.js";
5
+ export class FsSnapshotBackend {
6
+ baseDir;
7
+ constructor(baseDir = ".hardkas-snapshots") {
8
+ this.baseDir = baseDir;
9
+ }
10
+ async save(id, name, state) {
11
+ const snapshotDir = path.join(this.baseDir, id);
12
+ await fs.ensureDir(snapshotDir);
13
+ const stateHashes = {};
14
+ const participants = Object.keys(state);
15
+ // Write each participant's state to a separate file
16
+ for (const [pId, pState] of Object.entries(state)) {
17
+ const data = JSON.stringify(pState, snapshotReplacer, 2);
18
+ stateHashes[pId] = crypto.createHash("sha256").update(data).digest("hex");
19
+ await fs.writeFile(path.join(snapshotDir, `${pId}.json`), data);
20
+ }
21
+ const manifest = {
22
+ schema: "hardkas.snapshot.v1",
23
+ snapshotId: id,
24
+ name,
25
+ createdAt: Date.now(),
26
+ backend: "filesystem",
27
+ path: snapshotDir,
28
+ participants,
29
+ stateHashes,
30
+ claims: {
31
+ containsFullStateInline: false,
32
+ restorableLocalState: true,
33
+ networkStateCaptured: false
34
+ }
35
+ };
36
+ // Write manifest
37
+ await fs.writeFile(path.join(snapshotDir, "manifest.json"), JSON.stringify(manifest, null, 2));
38
+ return manifest;
39
+ }
40
+ async load(id) {
41
+ const snapshotDir = path.join(this.baseDir, id);
42
+ if (!await fs.pathExists(snapshotDir)) {
43
+ throw new Error(`Snapshot ${id} not found in filesystem backend at ${snapshotDir}`);
44
+ }
45
+ const manifestData = await fs.readFile(path.join(snapshotDir, "manifest.json"), "utf8");
46
+ const manifest = JSON.parse(manifestData);
47
+ const state = {};
48
+ for (const pId of manifest.participants) {
49
+ const stateData = await fs.readFile(path.join(snapshotDir, `${pId}.json`), "utf8");
50
+ state[pId] = JSON.parse(stateData, snapshotReviver);
51
+ }
52
+ return { manifest, state };
53
+ }
54
+ async list() {
55
+ if (!await fs.pathExists(this.baseDir)) {
56
+ return [];
57
+ }
58
+ const entries = await fs.readdir(this.baseDir, { withFileTypes: true });
59
+ const manifests = [];
60
+ for (const entry of entries) {
61
+ if (entry.isDirectory()) {
62
+ const manifestPath = path.join(this.baseDir, entry.name, "manifest.json");
63
+ if (await fs.pathExists(manifestPath)) {
64
+ const data = await fs.readFile(manifestPath, "utf8");
65
+ manifests.push(JSON.parse(data));
66
+ }
67
+ }
68
+ }
69
+ return manifests;
70
+ }
71
+ async delete(id) {
72
+ const snapshotDir = path.join(this.baseDir, id);
73
+ if (await fs.pathExists(snapshotDir)) {
74
+ await fs.remove(snapshotDir);
75
+ }
76
+ }
77
+ async branch(baseId, newId, newName) {
78
+ const { state } = await this.load(baseId);
79
+ return this.save(newId, newName, state);
80
+ }
81
+ }
82
+ //# sourceMappingURL=FsSnapshotBackend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FsSnapshotBackend.js","sourceRoot":"","sources":["../../../src/snapshot/backends/FsSnapshotBackend.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { SnapshotBackend, SnapshotManifest, SnapshotState } from "../types.js";
2
+ export declare class MemorySnapshotBackend implements SnapshotBackend {
3
+ private snapshots;
4
+ save(id: string, name: string, state: Record<string, SnapshotState>): Promise<SnapshotManifest>;
5
+ load(id: string): Promise<{
6
+ manifest: SnapshotManifest;
7
+ state: Record<string, SnapshotState>;
8
+ }>;
9
+ list(): Promise<SnapshotManifest[]>;
10
+ delete(id: string): Promise<void>;
11
+ branch(baseId: string, newId: string, newName: string): Promise<SnapshotManifest>;
12
+ }
13
+ //# sourceMappingURL=MemorySnapshotBackend.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MemorySnapshotBackend.d.ts","sourceRoot":"","sources":["../../../src/snapshot/backends/MemorySnapshotBackend.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAI/E,qBAAa,qBAAsB,YAAW,eAAe;IACzD,OAAO,CAAC,SAAS,CAA2F;IAEtG,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA8B/F,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,gBAAgB,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAA;KAAE,CAAC;IAY/F,IAAI,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAInC,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIjC,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;CAO1F"}