@totemsdk/core 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.
Files changed (175) hide show
  1. package/dist/Streamable.d.ts +268 -0
  2. package/dist/Streamable.js +416 -0
  3. package/dist/adapters/index.d.ts +190 -0
  4. package/dist/adapters/index.js +107 -0
  5. package/dist/adapters/types.d.ts +149 -0
  6. package/dist/adapters/types.js +67 -0
  7. package/dist/binio.d.ts +9 -0
  8. package/dist/binio.js +30 -0
  9. package/dist/bip39.d.ts +91 -0
  10. package/dist/bip39.js +417 -0
  11. package/dist/derive.d.ts +2 -0
  12. package/dist/derive.js +9 -0
  13. package/dist/index.d.ts +30 -0
  14. package/dist/index.js +53 -0
  15. package/dist/javaStreamables.d.ts +233 -0
  16. package/dist/javaStreamables.js +332 -0
  17. package/dist/lease/LeaseMonitor.d.ts +44 -0
  18. package/dist/lease/LeaseMonitor.js +107 -0
  19. package/dist/lease/LeaseStore.d.ts +57 -0
  20. package/dist/lease/LeaseStore.js +144 -0
  21. package/dist/lease/WatermarkStore.d.ts +61 -0
  22. package/dist/lease/WatermarkStore.js +202 -0
  23. package/dist/lease/index.d.ts +14 -0
  24. package/dist/lease/index.js +13 -0
  25. package/dist/lease-client.d.ts +31 -0
  26. package/dist/lease-client.js +39 -0
  27. package/dist/minima32.d.ts +18 -0
  28. package/dist/minima32.js +112 -0
  29. package/dist/minimaWireSerializer.d.ts +60 -0
  30. package/dist/minimaWireSerializer.js +71 -0
  31. package/dist/mmr.d.ts +156 -0
  32. package/dist/mmr.js +342 -0
  33. package/dist/mx.d.ts +1 -0
  34. package/dist/mx.js +1 -0
  35. package/dist/params.d.ts +29 -0
  36. package/dist/params.js +16 -0
  37. package/dist/script.d.ts +7 -0
  38. package/dist/script.js +22 -0
  39. package/dist/scripts/contract-helpers.d.ts +252 -0
  40. package/dist/scripts/contract-helpers.js +394 -0
  41. package/dist/scripts/dapp-types.d.ts +119 -0
  42. package/dist/scripts/dapp-types.js +72 -0
  43. package/dist/scripts/index.d.ts +4 -0
  44. package/dist/scripts/index.js +4 -0
  45. package/dist/scripts/types.d.ts +81 -0
  46. package/dist/scripts/types.js +145 -0
  47. package/dist/scripts/witness-serializer.d.ts +29 -0
  48. package/dist/scripts/witness-serializer.js +288 -0
  49. package/dist/transaction.d.ts +106 -0
  50. package/dist/transaction.js +284 -0
  51. package/dist/treekey.d.ts +383 -0
  52. package/dist/treekey.js +762 -0
  53. package/dist/tx/TransactionLifecycle.d.ts +55 -0
  54. package/dist/tx/TransactionLifecycle.js +189 -0
  55. package/dist/tx/TransactionReceiptStore.d.ts +36 -0
  56. package/dist/tx/TransactionReceiptStore.js +85 -0
  57. package/dist/tx/TransactionService.d.ts +50 -0
  58. package/dist/tx/TransactionService.js +178 -0
  59. package/dist/tx/index.d.ts +13 -0
  60. package/dist/tx/index.js +12 -0
  61. package/dist/tx/types.d.ts +114 -0
  62. package/dist/tx/types.js +5 -0
  63. package/dist/util.d.ts +1 -0
  64. package/dist/util.js +1 -0
  65. package/dist/utils.d.ts +8 -0
  66. package/dist/utils.js +35 -0
  67. package/dist/verify.d.ts +18 -0
  68. package/dist/verify.js +162 -0
  69. package/dist/version.d.ts +12 -0
  70. package/dist/version.js +12 -0
  71. package/dist/wots.d.ts +232 -0
  72. package/dist/wots.js +538 -0
  73. package/package.json +65 -0
  74. package/src/Streamable.d.ts +265 -0
  75. package/src/Streamable.js +431 -0
  76. package/src/Streamable.ts +567 -0
  77. package/src/__tests__/Streamable.parity.test.ts +422 -0
  78. package/src/__tests__/perAddressDerivation.parity.test.ts +152 -0
  79. package/src/__tests__/wots-parity.test.ts +289 -0
  80. package/src/adapters/index.d.ts +190 -0
  81. package/src/adapters/index.js +117 -0
  82. package/src/adapters/index.ts +301 -0
  83. package/src/adapters/types.ts +235 -0
  84. package/src/addr.oracle.test.ts +25 -0
  85. package/src/address.test.ts +55 -0
  86. package/src/binio.ts +21 -0
  87. package/src/bip39.d.ts +91 -0
  88. package/src/bip39.js +427 -0
  89. package/src/bip39.ts +432 -0
  90. package/src/derive.d.ts +2 -0
  91. package/src/derive.js +13 -0
  92. package/src/derive.ts +11 -0
  93. package/src/index.d.ts +26 -0
  94. package/src/index.js +128 -0
  95. package/src/index.test.ts +5 -0
  96. package/src/index.ts +206 -0
  97. package/src/javaStreamables.d.ts +233 -0
  98. package/src/javaStreamables.js +328 -0
  99. package/src/javaStreamables.ts +403 -0
  100. package/src/lease/LeaseMonitor.d.ts +44 -0
  101. package/src/lease/LeaseMonitor.js +111 -0
  102. package/src/lease/LeaseMonitor.ts +157 -0
  103. package/src/lease/LeaseStore.d.ts +57 -0
  104. package/src/lease/LeaseStore.js +148 -0
  105. package/src/lease/LeaseStore.ts +203 -0
  106. package/src/lease/WatermarkStore.d.ts +61 -0
  107. package/src/lease/WatermarkStore.js +206 -0
  108. package/src/lease/WatermarkStore.ts +270 -0
  109. package/src/lease/index.d.ts +14 -0
  110. package/src/lease/index.js +22 -0
  111. package/src/lease/index.ts +41 -0
  112. package/src/lease-client.d.ts +31 -0
  113. package/src/lease-client.js +44 -0
  114. package/src/lease-client.ts +69 -0
  115. package/src/minima32.d.ts +10 -0
  116. package/src/minima32.js +113 -0
  117. package/src/minima32.test.ts +11 -0
  118. package/src/minima32.ts +127 -0
  119. package/src/minimaWireSerializer.d.ts +189 -0
  120. package/src/minimaWireSerializer.js +311 -0
  121. package/src/minimaWireSerializer.test.ts +466 -0
  122. package/src/minimaWireSerializer.ts +117 -0
  123. package/src/mmr.d.ts +153 -0
  124. package/src/mmr.js +351 -0
  125. package/src/mmr.oracle.test.ts +28 -0
  126. package/src/mmr.ts +429 -0
  127. package/src/mx.test.ts +25 -0
  128. package/src/mx.ts +1 -0
  129. package/src/params.d.ts +29 -0
  130. package/src/params.d.ts.map +1 -0
  131. package/src/params.js +20 -0
  132. package/src/params.js.map +1 -0
  133. package/src/params.ts +44 -0
  134. package/src/script.d.ts +7 -0
  135. package/src/script.js +27 -0
  136. package/src/script.ts +24 -0
  137. package/src/scripts/contract-helpers.ts +609 -0
  138. package/src/scripts/dapp-types.ts +240 -0
  139. package/src/scripts/index.ts +22 -0
  140. package/src/scripts/types.ts +247 -0
  141. package/src/scripts/witness-serializer.ts +384 -0
  142. package/src/transaction.ts +430 -0
  143. package/src/treekey.d.ts +383 -0
  144. package/src/treekey.js +778 -0
  145. package/src/treekey.parity.test.ts +459 -0
  146. package/src/treekey.ts +979 -0
  147. package/src/tx/TransactionLifecycle.d.ts +55 -0
  148. package/src/tx/TransactionLifecycle.js +188 -0
  149. package/src/tx/TransactionLifecycle.ts +280 -0
  150. package/src/tx/TransactionReceiptStore.d.ts +36 -0
  151. package/src/tx/TransactionReceiptStore.js +89 -0
  152. package/src/tx/TransactionReceiptStore.ts +112 -0
  153. package/src/tx/TransactionService.d.ts +31 -0
  154. package/src/tx/TransactionService.js +140 -0
  155. package/src/tx/TransactionService.ts +250 -0
  156. package/src/tx/index.d.ts +13 -0
  157. package/src/tx/index.js +20 -0
  158. package/src/tx/index.ts +44 -0
  159. package/src/tx/types.d.ts +80 -0
  160. package/src/tx/types.js +6 -0
  161. package/src/tx/types.ts +127 -0
  162. package/src/util.d.ts +1 -0
  163. package/src/util.js +5 -0
  164. package/src/util.ts +1 -0
  165. package/src/utils.d.ts +8 -0
  166. package/src/utils.js +42 -0
  167. package/src/utils.ts +38 -0
  168. package/src/verify.ts +209 -0
  169. package/src/version.ts +13 -0
  170. package/src/wots.d.ts +224 -0
  171. package/src/wots.d.ts.map +1 -0
  172. package/src/wots.js +559 -0
  173. package/src/wots.js.map +1 -0
  174. package/src/wots.ts +636 -0
  175. package/test-vectors.json +45 -0
@@ -0,0 +1,190 @@
1
+ /**
2
+ * @module @totemsdk/core/adapters
3
+ * Platform-agnostic adapter interfaces for SDK portability
4
+ *
5
+ * These interfaces enable the SDK to work across multiple platforms:
6
+ * - Browser (Chrome Extensions, web apps)
7
+ * - Node.js (server-side, CLI tools)
8
+ * - React Native (mobile apps) - follow-up
9
+ *
10
+ * Each platform provides its own implementation of these adapters.
11
+ */
12
+ export interface StorageAdapter {
13
+ get<T>(key: string): Promise<T | null>;
14
+ set<T>(key: string, value: T): Promise<void>;
15
+ remove(key: string): Promise<boolean>;
16
+ clear(): Promise<void>;
17
+ keys(): Promise<string[]>;
18
+ has(key: string): Promise<boolean>;
19
+ }
20
+ export interface AuthTokenProvider {
21
+ getToken(): Promise<string | null>;
22
+ setToken(token: string): Promise<void>;
23
+ clearToken(): Promise<void>;
24
+ onTokenChange(callback: (token: string | null) => void): () => void;
25
+ isAuthenticated(): Promise<boolean>;
26
+ }
27
+ export type BinaryData = Uint8Array | ArrayBuffer;
28
+ export interface WebSocketFactoryOptions {
29
+ pingIntervalMs?: number;
30
+ pongTimeoutMs?: number;
31
+ maxPayloadBytes?: number;
32
+ }
33
+ export interface WebSocketOpenEvent {
34
+ type: 'open';
35
+ }
36
+ export interface WebSocketCloseEvent {
37
+ type: 'close';
38
+ code: number;
39
+ reason: string;
40
+ wasClean: boolean;
41
+ }
42
+ export interface WebSocketMessageEvent {
43
+ type: 'message';
44
+ data: string | BinaryData;
45
+ }
46
+ export interface WebSocketErrorEvent {
47
+ type: 'error';
48
+ message?: string;
49
+ error?: Error;
50
+ }
51
+ export type WebSocketEventMap = {
52
+ open: WebSocketOpenEvent;
53
+ close: WebSocketCloseEvent;
54
+ message: WebSocketMessageEvent;
55
+ error: WebSocketErrorEvent;
56
+ };
57
+ export interface WebSocketFactory {
58
+ create(url: string, protocols?: string[], options?: WebSocketFactoryOptions): WebSocketClient;
59
+ dispose(): void;
60
+ }
61
+ export interface WebSocketClient {
62
+ readonly readyState: number;
63
+ readonly url: string;
64
+ send(data: string | BinaryData): void;
65
+ close(code?: number, reason?: string): void;
66
+ terminate(): void;
67
+ addEventListener<K extends keyof WebSocketEventMap>(event: K, listener: (ev: WebSocketEventMap[K]) => void): void;
68
+ removeEventListener<K extends keyof WebSocketEventMap>(event: K, listener: (ev: WebSocketEventMap[K]) => void): void;
69
+ removeAllListeners(): void;
70
+ onopen: ((ev: WebSocketOpenEvent) => void) | null;
71
+ onclose: ((ev: WebSocketCloseEvent) => void) | null;
72
+ onmessage: ((ev: WebSocketMessageEvent) => void) | null;
73
+ onerror: ((ev: WebSocketErrorEvent) => void) | null;
74
+ }
75
+ export declare const WebSocketReadyState: {
76
+ readonly CONNECTING: 0;
77
+ readonly OPEN: 1;
78
+ readonly CLOSING: 2;
79
+ readonly CLOSED: 3;
80
+ };
81
+ export interface CancellationToken {
82
+ readonly cancelled: boolean;
83
+ onCancel(callback: () => void): () => void;
84
+ }
85
+ export interface CancellationTokenSource {
86
+ readonly token: CancellationToken;
87
+ cancel(): void;
88
+ }
89
+ export declare function createCancellationToken(): CancellationTokenSource;
90
+ export interface HttpClient {
91
+ get<T>(url: string, options?: HttpRequestOptions): Promise<HttpResponse<T>>;
92
+ post<T>(url: string, body?: unknown, options?: HttpRequestOptions): Promise<HttpResponse<T>>;
93
+ put<T>(url: string, body?: unknown, options?: HttpRequestOptions): Promise<HttpResponse<T>>;
94
+ delete<T>(url: string, options?: HttpRequestOptions): Promise<HttpResponse<T>>;
95
+ }
96
+ export interface HttpRequestOptions {
97
+ headers?: Record<string, string>;
98
+ timeout?: number;
99
+ cancellationToken?: CancellationToken;
100
+ }
101
+ export interface HttpResponse<T> {
102
+ ok: boolean;
103
+ status: number;
104
+ statusText: string;
105
+ headers: Record<string, string>;
106
+ data: T;
107
+ }
108
+ export interface ConfigProvider {
109
+ get<T>(key: string): T | undefined;
110
+ get<T>(key: string, defaultValue: T): T;
111
+ set<T>(key: string, value: T): void;
112
+ has(key: string): boolean;
113
+ getAll(): Record<string, unknown>;
114
+ readonly apiUrl: string;
115
+ readonly wsUrl: string;
116
+ readonly network: 'mainnet' | 'testnet' | 'devnet';
117
+ readonly apiKey?: string;
118
+ }
119
+ export interface LoggerAdapter {
120
+ debug(message: string, ...args: unknown[]): void;
121
+ info(message: string, ...args: unknown[]): void;
122
+ warn(message: string, ...args: unknown[]): void;
123
+ error(message: string, ...args: unknown[]): void;
124
+ }
125
+ export interface MetricsAdapter {
126
+ increment(name: string, value?: number, tags?: Record<string, string>): void;
127
+ gauge(name: string, value: number, tags?: Record<string, string>): void;
128
+ timing(name: string, durationMs: number, tags?: Record<string, string>): void;
129
+ histogram(name: string, value: number, tags?: Record<string, string>): void;
130
+ }
131
+ export interface TimerAdapter {
132
+ setTimeout(callback: () => void, ms: number): TimerHandle;
133
+ setInterval(callback: () => void, ms: number): TimerHandle;
134
+ clearTimeout(handle: TimerHandle): void;
135
+ clearInterval(handle: TimerHandle): void;
136
+ now(): number;
137
+ }
138
+ export type TimerHandle = ReturnType<typeof setTimeout>;
139
+ export interface CryptoAdapter {
140
+ randomBytes(length: number): Uint8Array;
141
+ sha256(data: Uint8Array): Uint8Array;
142
+ sha256Async(data: Uint8Array): Promise<Uint8Array>;
143
+ }
144
+ export interface AdapterRegistry {
145
+ storage: StorageAdapter;
146
+ auth: AuthTokenProvider;
147
+ websocket: WebSocketFactory;
148
+ http: HttpClient;
149
+ config: ConfigProvider;
150
+ logger: LoggerAdapter;
151
+ metrics?: MetricsAdapter;
152
+ timer: TimerAdapter;
153
+ crypto: CryptoAdapter;
154
+ }
155
+ export declare function createAdapterRegistry(adapters: Partial<AdapterRegistry>): AdapterRegistry;
156
+ export declare class NoopLogger implements LoggerAdapter {
157
+ debug(_message: string, ..._args: unknown[]): void;
158
+ info(_message: string, ..._args: unknown[]): void;
159
+ warn(_message: string, ..._args: unknown[]): void;
160
+ error(_message: string, ..._args: unknown[]): void;
161
+ }
162
+ export declare class ConsoleLogger implements LoggerAdapter {
163
+ private prefix;
164
+ constructor(prefix?: string);
165
+ debug(message: string, ...args: unknown[]): void;
166
+ info(message: string, ...args: unknown[]): void;
167
+ warn(message: string, ...args: unknown[]): void;
168
+ error(message: string, ...args: unknown[]): void;
169
+ }
170
+ export declare class NoopMetrics implements MetricsAdapter {
171
+ increment(_name: string, _value?: number, _tags?: Record<string, string>): void;
172
+ gauge(_name: string, _value: number, _tags?: Record<string, string>): void;
173
+ timing(_name: string, _durationMs: number, _tags?: Record<string, string>): void;
174
+ histogram(_name: string, _value: number, _tags?: Record<string, string>): void;
175
+ }
176
+ export declare class DefaultTimerAdapter implements TimerAdapter {
177
+ setTimeout(callback: () => void, ms: number): TimerHandle;
178
+ setInterval(callback: () => void, ms: number): TimerHandle;
179
+ clearTimeout(handle: TimerHandle): void;
180
+ clearInterval(handle: TimerHandle): void;
181
+ now(): number;
182
+ }
183
+ export interface LifecycleAdapter {
184
+ onSuspend(callback: () => void): () => void;
185
+ onResume?(callback: () => void): () => void;
186
+ }
187
+ export declare class NoopLifecycleAdapter implements LifecycleAdapter {
188
+ onSuspend(_callback: () => void): () => void;
189
+ onResume(_callback: () => void): () => void;
190
+ }
@@ -0,0 +1,107 @@
1
+ /**
2
+ * @module @totemsdk/core/adapters
3
+ * Platform-agnostic adapter interfaces for SDK portability
4
+ *
5
+ * These interfaces enable the SDK to work across multiple platforms:
6
+ * - Browser (Chrome Extensions, web apps)
7
+ * - Node.js (server-side, CLI tools)
8
+ * - React Native (mobile apps) - follow-up
9
+ *
10
+ * Each platform provides its own implementation of these adapters.
11
+ */
12
+ export const WebSocketReadyState = {
13
+ CONNECTING: 0,
14
+ OPEN: 1,
15
+ CLOSING: 2,
16
+ CLOSED: 3,
17
+ };
18
+ export function createCancellationToken() {
19
+ let cancelled = false;
20
+ const callbacks = new Set();
21
+ const token = {
22
+ get cancelled() { return cancelled; },
23
+ onCancel(callback) {
24
+ if (cancelled) {
25
+ callback();
26
+ return () => { };
27
+ }
28
+ callbacks.add(callback);
29
+ return () => callbacks.delete(callback);
30
+ }
31
+ };
32
+ return {
33
+ token,
34
+ cancel() {
35
+ if (!cancelled) {
36
+ cancelled = true;
37
+ callbacks.forEach(cb => cb());
38
+ callbacks.clear();
39
+ }
40
+ }
41
+ };
42
+ }
43
+ export function createAdapterRegistry(adapters) {
44
+ const required = [
45
+ 'storage', 'auth', 'websocket', 'http', 'config', 'logger', 'timer', 'crypto'
46
+ ];
47
+ for (const key of required) {
48
+ if (!adapters[key]) {
49
+ throw new Error(`Missing required adapter: ${key}`);
50
+ }
51
+ }
52
+ return adapters;
53
+ }
54
+ export class NoopLogger {
55
+ debug(_message, ..._args) { }
56
+ info(_message, ..._args) { }
57
+ warn(_message, ..._args) { }
58
+ error(_message, ..._args) { }
59
+ }
60
+ export class ConsoleLogger {
61
+ constructor(prefix = '[SDK]') {
62
+ this.prefix = prefix;
63
+ }
64
+ debug(message, ...args) {
65
+ console.debug(`${this.prefix} ${message}`, ...args);
66
+ }
67
+ info(message, ...args) {
68
+ console.info(`${this.prefix} ${message}`, ...args);
69
+ }
70
+ warn(message, ...args) {
71
+ console.warn(`${this.prefix} ${message}`, ...args);
72
+ }
73
+ error(message, ...args) {
74
+ console.error(`${this.prefix} ${message}`, ...args);
75
+ }
76
+ }
77
+ export class NoopMetrics {
78
+ increment(_name, _value, _tags) { }
79
+ gauge(_name, _value, _tags) { }
80
+ timing(_name, _durationMs, _tags) { }
81
+ histogram(_name, _value, _tags) { }
82
+ }
83
+ export class DefaultTimerAdapter {
84
+ setTimeout(callback, ms) {
85
+ return setTimeout(callback, ms);
86
+ }
87
+ setInterval(callback, ms) {
88
+ return setInterval(callback, ms);
89
+ }
90
+ clearTimeout(handle) {
91
+ clearTimeout(handle);
92
+ }
93
+ clearInterval(handle) {
94
+ clearInterval(handle);
95
+ }
96
+ now() {
97
+ return Date.now();
98
+ }
99
+ }
100
+ export class NoopLifecycleAdapter {
101
+ onSuspend(_callback) {
102
+ return () => { };
103
+ }
104
+ onResume(_callback) {
105
+ return () => { };
106
+ }
107
+ }
@@ -0,0 +1,149 @@
1
+ /**
2
+ * @module @totemsdk/core/adapters/types
3
+ * Shared type definitions for SDK modules
4
+ */
5
+ export interface WotsIndices {
6
+ addressIndex: number;
7
+ l1: number;
8
+ l2: number;
9
+ }
10
+ export type LeaseStatus = 'pending' | 'active' | 'expired' | 'finalized' | 'cancelled';
11
+ export interface StoredLease {
12
+ leaseId: string;
13
+ leaseToken: string;
14
+ indices: WotsIndices;
15
+ expiresAt: number;
16
+ status: LeaseStatus;
17
+ createdAt: number;
18
+ txId?: string;
19
+ leaseTTL: number;
20
+ }
21
+ export interface WatermarkState {
22
+ next_addressIndex: number;
23
+ next_l1: number;
24
+ next_l2: number;
25
+ usedIndices: Array<[number, number, number]>;
26
+ lastSyncTimestamp?: number;
27
+ serverWatermark?: WotsIndices;
28
+ }
29
+ export interface SyncResult {
30
+ updated: boolean;
31
+ drift: number;
32
+ hasConflict: boolean;
33
+ }
34
+ export interface LeaseExpiryEvent {
35
+ leaseId: string;
36
+ expiresAt: number;
37
+ remainingMs: number;
38
+ }
39
+ export type LeaseExpiryCallback = (event: LeaseExpiryEvent) => void;
40
+ export interface TransactionPrepareParams {
41
+ txId: string;
42
+ rootPublicKey: string;
43
+ to: string;
44
+ amount: string;
45
+ tokenId?: string;
46
+ burn?: string | null;
47
+ digestL2?: string | null;
48
+ digestL3?: string | null;
49
+ ttlMs?: number;
50
+ }
51
+ export interface PreparedTransaction {
52
+ leaseToken: string;
53
+ lease: WotsIndices;
54
+ txId: string;
55
+ digestTx?: string | null;
56
+ }
57
+ export interface SignedTransaction {
58
+ txId: string;
59
+ signedHex: string;
60
+ leaseToken: string;
61
+ }
62
+ export interface FinalizedTransaction {
63
+ txId: string;
64
+ status: 'success' | 'failed';
65
+ blockHeight?: number;
66
+ confirmations?: number;
67
+ error?: string;
68
+ }
69
+ export type TransactionStatus = 'preparing' | 'signing' | 'submitting' | 'pending' | 'confirmed' | 'failed';
70
+ export interface TransactionState {
71
+ txId: string;
72
+ status: TransactionStatus;
73
+ lease?: StoredLease;
74
+ signedHex?: string;
75
+ blockHeight?: number;
76
+ confirmations?: number;
77
+ error?: string;
78
+ createdAt: number;
79
+ updatedAt: number;
80
+ }
81
+ export interface BalanceSnapshot {
82
+ address: string;
83
+ confirmed: string;
84
+ unconfirmed: string;
85
+ total: string;
86
+ tokenId: string;
87
+ timestamp: number;
88
+ }
89
+ export interface BalanceUpdate {
90
+ type: 'snapshot' | 'delta';
91
+ address: string;
92
+ tokenId: string;
93
+ confirmed?: string;
94
+ unconfirmed?: string;
95
+ total?: string;
96
+ delta?: string;
97
+ timestamp: number;
98
+ }
99
+ export type ConnectionStatus = 'disconnected' | 'connecting' | 'connected' | 'reconnecting' | 'error';
100
+ export interface ConnectionState {
101
+ status: ConnectionStatus;
102
+ lastConnectedAt?: number;
103
+ lastDisconnectedAt?: number;
104
+ reconnectAttempts: number;
105
+ error?: string;
106
+ }
107
+ export interface QuotaInfo {
108
+ used: number;
109
+ limit: number;
110
+ remaining: number;
111
+ resetsAt: number;
112
+ windowMs: number;
113
+ }
114
+ export interface RpcError {
115
+ code: number;
116
+ message: string;
117
+ data?: unknown;
118
+ }
119
+ export declare class SdkError extends Error {
120
+ readonly code: string;
121
+ readonly cause?: Error | undefined;
122
+ constructor(message: string, code: string, cause?: Error | undefined);
123
+ }
124
+ export declare class StorageError extends SdkError {
125
+ constructor(message: string, cause?: Error);
126
+ }
127
+ export declare class NetworkError extends SdkError {
128
+ constructor(message: string, cause?: Error);
129
+ }
130
+ export declare class AuthenticationError extends SdkError {
131
+ constructor(message: string, cause?: Error);
132
+ }
133
+ export declare class LeaseError extends SdkError {
134
+ constructor(message: string, cause?: Error);
135
+ }
136
+ export declare class TransactionError extends SdkError {
137
+ constructor(message: string, cause?: Error);
138
+ }
139
+ export declare class QuotaExceededError extends SdkError {
140
+ readonly quotaInfo: QuotaInfo;
141
+ constructor(message: string, quotaInfo: QuotaInfo, cause?: Error);
142
+ }
143
+ export type EventUnsubscribe = () => void;
144
+ export interface EventEmitter<Events extends Record<string, unknown>> {
145
+ on<K extends keyof Events>(event: K, listener: (data: Events[K]) => void): EventUnsubscribe;
146
+ off<K extends keyof Events>(event: K, listener: (data: Events[K]) => void): void;
147
+ emit<K extends keyof Events>(event: K, data: Events[K]): void;
148
+ }
149
+ export declare function createEventEmitter<Events extends Record<string, unknown>>(): EventEmitter<Events>;
@@ -0,0 +1,67 @@
1
+ /**
2
+ * @module @totemsdk/core/adapters/types
3
+ * Shared type definitions for SDK modules
4
+ */
5
+ export class SdkError extends Error {
6
+ constructor(message, code, cause) {
7
+ super(message);
8
+ this.code = code;
9
+ this.cause = cause;
10
+ this.name = 'SdkError';
11
+ }
12
+ }
13
+ export class StorageError extends SdkError {
14
+ constructor(message, cause) {
15
+ super(message, 'STORAGE_ERROR', cause);
16
+ this.name = 'StorageError';
17
+ }
18
+ }
19
+ export class NetworkError extends SdkError {
20
+ constructor(message, cause) {
21
+ super(message, 'NETWORK_ERROR', cause);
22
+ this.name = 'NetworkError';
23
+ }
24
+ }
25
+ export class AuthenticationError extends SdkError {
26
+ constructor(message, cause) {
27
+ super(message, 'AUTH_ERROR', cause);
28
+ this.name = 'AuthenticationError';
29
+ }
30
+ }
31
+ export class LeaseError extends SdkError {
32
+ constructor(message, cause) {
33
+ super(message, 'LEASE_ERROR', cause);
34
+ this.name = 'LeaseError';
35
+ }
36
+ }
37
+ export class TransactionError extends SdkError {
38
+ constructor(message, cause) {
39
+ super(message, 'TRANSACTION_ERROR', cause);
40
+ this.name = 'TransactionError';
41
+ }
42
+ }
43
+ export class QuotaExceededError extends SdkError {
44
+ constructor(message, quotaInfo, cause) {
45
+ super(message, 'QUOTA_EXCEEDED', cause);
46
+ this.quotaInfo = quotaInfo;
47
+ this.name = 'QuotaExceededError';
48
+ }
49
+ }
50
+ export function createEventEmitter() {
51
+ const listeners = new Map();
52
+ return {
53
+ on(event, listener) {
54
+ if (!listeners.has(event)) {
55
+ listeners.set(event, new Set());
56
+ }
57
+ listeners.get(event).add(listener);
58
+ return () => listeners.get(event)?.delete(listener);
59
+ },
60
+ off(event, listener) {
61
+ listeners.get(event)?.delete(listener);
62
+ },
63
+ emit(event, data) {
64
+ listeners.get(event)?.forEach(listener => listener(data));
65
+ }
66
+ };
67
+ }
@@ -0,0 +1,9 @@
1
+ export declare class BinWriter {
2
+ #private;
3
+ get bytes(): Uint8Array;
4
+ writeU8(n: number): void;
5
+ writeU16(n: number): void;
6
+ writeU32(n: number): void;
7
+ writeU64(bi: bigint): void;
8
+ writeBytes(b: Uint8Array): void;
9
+ }
package/dist/binio.js ADDED
@@ -0,0 +1,30 @@
1
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
2
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
3
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
4
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
5
+ };
6
+ var _BinWriter_buf;
7
+ export class BinWriter {
8
+ constructor() {
9
+ _BinWriter_buf.set(this, []);
10
+ }
11
+ get bytes() { return new Uint8Array(__classPrivateFieldGet(this, _BinWriter_buf, "f")); }
12
+ writeU8(n) { __classPrivateFieldGet(this, _BinWriter_buf, "f").push(n & 0xff); }
13
+ writeU16(n) { __classPrivateFieldGet(this, _BinWriter_buf, "f").push((n >>> 8) & 0xff, n & 0xff); } // big-endian
14
+ writeU32(n) {
15
+ __classPrivateFieldGet(this, _BinWriter_buf, "f").push((n >>> 24) & 0xff, (n >>> 16) & 0xff, (n >>> 8) & 0xff, n & 0xff);
16
+ }
17
+ writeU64(bi) {
18
+ // big-endian 8 bytes
19
+ const out = new Uint8Array(8);
20
+ let x = bi;
21
+ for (let i = 7; i >= 0; i--) {
22
+ out[i] = Number(x & 0xffn);
23
+ x >>= 8n;
24
+ }
25
+ this.writeBytes(out);
26
+ }
27
+ writeBytes(b) { for (const x of b)
28
+ __classPrivateFieldGet(this, _BinWriter_buf, "f").push(x); }
29
+ }
30
+ _BinWriter_buf = new WeakMap();
@@ -0,0 +1,91 @@
1
+ /**
2
+ * Minima-Compatible BIP39 Seed Phrase Handling
3
+ *
4
+ * IMPORTANT: This is NOT standard BIP39!
5
+ * Minima uses the BIP39 English word list for human-friendly phrases,
6
+ * but does NOT use PBKDF2, passphrase salt, or checksum validation.
7
+ *
8
+ * Seed derivation is simply: SHA3-256(phrase_bytes)
9
+ *
10
+ * Matches BIP39.java behavior exactly:
11
+ * - cleanSeedPhrase(): Normalizes input with prefix matching
12
+ * - convertStringToSeed(): Hashes phrase bytes with SHA3-256
13
+ */
14
+ /**
15
+ * Official BIP39 English word list (2048 words)
16
+ * From https://github.com/bitcoin/bips/blob/master/bip-0039/english.txt
17
+ */
18
+ export declare const WORD_LIST: readonly string[];
19
+ /**
20
+ * Clean and normalize a seed phrase matching Minima's BIP39.cleanSeedPhrase() exactly
21
+ *
22
+ * From BIP39.java:
23
+ * - Split by whitespace
24
+ * - For each token: lowercase; length >= 3 required
25
+ * - If token length < 4: must match full word in wordlist
26
+ * - Else: accept FIRST word in wordlist that startsWith(token)
27
+ * - Join with single spaces, trim, then convert to UPPERCASE
28
+ *
29
+ * @param seedPhrase - Raw user input (may be abbreviated, mixed case)
30
+ * @returns Canonical uppercase phrase with full words from BIP39 list
31
+ * @throws Error if any word cannot be matched
32
+ */
33
+ export declare function cleanSeedPhrase(seedPhrase: string): string;
34
+ /**
35
+ * Validate that a phrase contains valid BIP39 words
36
+ * Does NOT check checksum (Minima doesn't use checksums)
37
+ *
38
+ * @param phrase - Space-separated words (any case)
39
+ * @returns true if all words are valid BIP39 words
40
+ */
41
+ export declare function validatePhrase(phrase: string): boolean;
42
+ /**
43
+ * Convert a seed phrase to a 32-byte seed matching Minima's BIP39.convertStringToSeed()
44
+ *
45
+ * IMPORTANT: This is NOT standard BIP39!
46
+ * Minima simply hashes the phrase bytes with SHA3-256.
47
+ * No PBKDF2, no passphrase salt, no "mnemonic" prefix.
48
+ *
49
+ * From BIP39.java convertStringToSeed():
50
+ * MiniString phrase = new MiniString(zPhrase);
51
+ * return new MiniData(Crypto.getInstance().hashData(phrase.getData()));
52
+ *
53
+ * @param phrase - Canonical phrase (should be cleaned first with cleanSeedPhrase)
54
+ * @returns 32-byte SHA3-256 seed
55
+ */
56
+ export declare function convertStringToSeed(phrase: string): Uint8Array;
57
+ /**
58
+ * Convert word array to seed matching Minima's BIP39.convertWordListToSeed()
59
+ *
60
+ * From BIP39.java:
61
+ * String allwords = convertWordListToString(zWords);
62
+ * MiniString ministr = new MiniString(allwords);
63
+ * MiniData hash = new MiniData(Crypto.getInstance().hashData(ministr.getData()));
64
+ *
65
+ * @param words - Array of BIP39 words
66
+ * @returns 32-byte SHA3-256 seed
67
+ */
68
+ export declare function convertWordListToSeed(words: string[]): Uint8Array;
69
+ /**
70
+ * Full pipeline: raw user input → 32-byte seed
71
+ *
72
+ * 1. cleanSeedPhrase() - normalize with prefix matching, output uppercase
73
+ * 2. convertStringToSeed() - SHA3-256 hash of phrase bytes
74
+ *
75
+ * @param rawPhrase - User's input (may be abbreviated, mixed case)
76
+ * @returns 32-byte seed for TreeKey
77
+ * @throws Error if phrase contains invalid words
78
+ */
79
+ export declare function phraseToSeed(rawPhrase: string): Uint8Array;
80
+ /**
81
+ * Generate a new random 24-word seed phrase
82
+ * Uses crypto.getRandomValues for secure randomness
83
+ *
84
+ * @returns Array of 24 random BIP39 words (lowercase)
85
+ */
86
+ export declare function generateWordList(): string[];
87
+ /**
88
+ * Generate a new random seed phrase as a string
89
+ * @returns 24-word phrase in UPPERCASE (canonical form)
90
+ */
91
+ export declare function generateSeedPhrase(): string;