@obbyx/obyte 0.0.0-stage → 0.1.1

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 (59) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +15 -2
  3. package/dist/channel/definition.d.ts +38 -0
  4. package/dist/channel/definition.d.ts.map +1 -0
  5. package/dist/channel/definition.js +86 -0
  6. package/dist/channel/definition.js.map +1 -0
  7. package/dist/config/index.d.ts +31 -0
  8. package/dist/config/index.d.ts.map +1 -0
  9. package/dist/config/index.js +33 -0
  10. package/dist/config/index.js.map +1 -0
  11. package/dist/core/amounts.d.ts +35 -0
  12. package/dist/core/amounts.d.ts.map +1 -0
  13. package/dist/core/amounts.js +94 -0
  14. package/dist/core/amounts.js.map +1 -0
  15. package/dist/core/errors.d.ts +16 -0
  16. package/dist/core/errors.d.ts.map +1 -0
  17. package/dist/core/errors.js +18 -0
  18. package/dist/core/errors.js.map +1 -0
  19. package/dist/core/networks.d.ts +34 -0
  20. package/dist/core/networks.d.ts.map +1 -0
  21. package/dist/core/networks.js +50 -0
  22. package/dist/core/networks.js.map +1 -0
  23. package/dist/core/result.d.ts +17 -0
  24. package/dist/core/result.d.ts.map +1 -0
  25. package/dist/core/result.js +13 -0
  26. package/dist/core/result.js.map +1 -0
  27. package/dist/index.d.ts +8 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +8 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/logger/index.d.ts +76 -0
  32. package/dist/logger/index.d.ts.map +1 -0
  33. package/dist/logger/index.js +161 -0
  34. package/dist/logger/index.js.map +1 -0
  35. package/dist/signing/signed-message.d.ts +47 -0
  36. package/dist/signing/signed-message.d.ts.map +1 -0
  37. package/dist/signing/signed-message.js +102 -0
  38. package/dist/signing/signed-message.js.map +1 -0
  39. package/dist/unit/exact-unit.d.ts +94 -0
  40. package/dist/unit/exact-unit.d.ts.map +1 -0
  41. package/dist/unit/exact-unit.js +387 -0
  42. package/dist/unit/exact-unit.js.map +1 -0
  43. package/dist/wallet/index.d.ts +29 -0
  44. package/dist/wallet/index.d.ts.map +1 -0
  45. package/dist/wallet/index.js +106 -0
  46. package/dist/wallet/index.js.map +1 -0
  47. package/package.json +64 -3
  48. package/src/channel/definition.ts +114 -0
  49. package/src/config/index.ts +40 -0
  50. package/src/core/amounts.ts +116 -0
  51. package/src/core/errors.ts +22 -0
  52. package/src/core/networks.ts +81 -0
  53. package/src/core/result.ts +23 -0
  54. package/src/index.ts +58 -0
  55. package/src/logger/index.ts +234 -0
  56. package/src/signing/signed-message.ts +147 -0
  57. package/src/types/obyte-internal.d.ts +19 -0
  58. package/src/unit/exact-unit.ts +447 -0
  59. package/src/wallet/index.ts +130 -0
@@ -0,0 +1,387 @@
1
+ // Ambient types for obyte.js internals; a reference (not tsconfig "include") so that
2
+ // workspace packages compiling these sources via the @obbyx/source condition see them.
3
+ // eslint-disable-next-line @typescript-eslint/triple-slash-reference
4
+ /// <reference path="../types/obyte-internal.d.ts" />
5
+ import obyte from 'obyte';
6
+ import { getBase64Hash, getHeadersSize, getTotalPayloadSize, getUnitHash, getUnitHashToSign, } from 'obyte/lib/internal.js';
7
+ import { isAddress, isAssetId } from '../channel/definition.js';
8
+ import { accept, hasOnlyKeys, isPlainObject, reject } from '../core/result.js';
9
+ import { isSigDefinition, verifySignature } from '../signing/signed-message.js';
10
+ /**
11
+ * Local (ledger-independent) validation of a client-signed unit for the x402
12
+ * `exact` scheme — the supported profile of ADR-0002.
13
+ *
14
+ * Checks done here need no hub: structure, network, unit hash, payload hashes,
15
+ * author definition and signature, commissions, message set, outputs and the
16
+ * signed binding. Ledger checks (inputs unspent, last ball recency, author
17
+ * definition when not embedded) are performed by the facilitator with a
18
+ * LedgerPort using {@link ExactUnitFacts}.
19
+ *
20
+ * Anything outside the profile is rejected; the profile is deliberately narrow.
21
+ */
22
+ export const EXACT_REASONS = {
23
+ unsupported: 'invalid_exact_obyte_unsupported_unit',
24
+ tooLarge: 'invalid_exact_obyte_unit_too_large',
25
+ network: 'invalid_exact_obyte_network',
26
+ unitHash: 'invalid_exact_obyte_unit_hash',
27
+ payloadHash: 'invalid_exact_obyte_payload_hash',
28
+ definition: 'invalid_exact_obyte_definition',
29
+ definitionRequired: 'invalid_exact_obyte_definition_required',
30
+ signature: 'invalid_exact_obyte_signature',
31
+ commissions: 'invalid_exact_obyte_commissions',
32
+ recipient: 'invalid_exact_obyte_recipient_mismatch',
33
+ amount: 'invalid_exact_obyte_amount_mismatch',
34
+ asset: 'invalid_exact_obyte_asset_mismatch',
35
+ binding: 'invalid_exact_obyte_binding_mismatch',
36
+ payer: 'invalid_exact_obyte_payer',
37
+ };
38
+ /** Only current unit versions are accepted. */
39
+ export const EXACT_UNIT_VERSIONS = { livenet: '4.0', testnet: '4.0t' };
40
+ const ALT = { livenet: '1', testnet: '2' };
41
+ export const DEFAULT_MAX_UNIT_BYTES = 16 * 1024;
42
+ const UNIT_KEYS = new Set([
43
+ 'version',
44
+ 'alt',
45
+ 'messages',
46
+ 'authors',
47
+ 'parent_units',
48
+ 'last_ball',
49
+ 'last_ball_unit',
50
+ 'timestamp',
51
+ 'headers_commission',
52
+ 'payload_commission',
53
+ 'tps_fee',
54
+ 'burn_fee',
55
+ 'max_aa_responses',
56
+ 'unit',
57
+ ]);
58
+ const AUTHOR_KEYS = new Set(['address', 'authentifiers', 'definition']);
59
+ const MESSAGE_KEYS = new Set(['app', 'payload_location', 'payload_hash', 'payload']);
60
+ const PAYMENT_KEYS = new Set(['asset', 'inputs', 'outputs']);
61
+ const INPUT_KEYS = new Set(['unit', 'message_index', 'output_index']);
62
+ const OUTPUT_KEYS = new Set(['address', 'amount']);
63
+ const HASH_RE = /^[A-Za-z0-9+/]{43}=$/;
64
+ const isHash = (v) => typeof v === 'string' && HASH_RE.test(v);
65
+ const isIndex = (v) => Number.isSafeInteger(v) && v >= 0;
66
+ const isPositiveAmount = (v) => Number.isSafeInteger(v) && v > 0;
67
+ export function validateExactUnit(unit, expect, options = {}) {
68
+ // The order of the checks is part of the contract: the first failing one
69
+ // decides the reason code.
70
+ const shaped = checkShape(unit, expect);
71
+ if (!shaped.ok)
72
+ return shaped;
73
+ const u = shaped.value;
74
+ const hashed = checkUnitHash(u);
75
+ if (!hashed.ok)
76
+ return hashed;
77
+ const { unitHash, messages, authors } = hashed.value;
78
+ const author = checkAuthor(u, authors, options.authorDefinition);
79
+ if (!author.ok)
80
+ return author;
81
+ const { payer, definitionFromLedger } = author.value;
82
+ const roles = checkPayer(payer, expect);
83
+ if (!roles.ok)
84
+ return roles;
85
+ const payments = checkMessages(messages, expect);
86
+ if (!payments.ok)
87
+ return payments;
88
+ const transfers = checkTransfers(payments.value, payer, expect);
89
+ if (!transfers.ok)
90
+ return transfers;
91
+ const commissions = expectedCommissions(u);
92
+ if (commissions.headers !== u['headers_commission'] ||
93
+ commissions.payload !== u['payload_commission']) {
94
+ return reject(EXACT_REASONS.commissions, 'Commissions do not match the unit size');
95
+ }
96
+ return accept({
97
+ unitHash,
98
+ payer,
99
+ inputs: transfers.value.inputs,
100
+ lastBallUnit: u['last_ball_unit'],
101
+ parentUnits: u['parent_units'],
102
+ timestamp: u['timestamp'],
103
+ outputTotals: transfers.value.outputTotals,
104
+ commissions,
105
+ definitionFromLedger,
106
+ });
107
+ }
108
+ const unsupported = (why) => reject(EXACT_REASONS.unsupported, why);
109
+ /** Structure, size, network and header fields. */
110
+ function checkShape(unit, expect) {
111
+ if (!isPlainObject(unit))
112
+ return unsupported('Unit must be an object');
113
+ let serialized;
114
+ try {
115
+ serialized = JSON.stringify(unit);
116
+ }
117
+ catch {
118
+ return unsupported('Unit is not serializable');
119
+ }
120
+ if (serialized.length > (expect.maxUnitBytes ?? DEFAULT_MAX_UNIT_BYTES)) {
121
+ return reject(EXACT_REASONS.tooLarge, 'Unit exceeds the size limit');
122
+ }
123
+ if (!hasOnlyKeys(unit, UNIT_KEYS))
124
+ return unsupported('Unit has fields outside the profile');
125
+ const net = expect.network.name;
126
+ if (unit['version'] !== EXACT_UNIT_VERSIONS[net] || unit['alt'] !== ALT[net]) {
127
+ return reject(EXACT_REASONS.network, `Unit version/alt do not match ${expect.network.caip2}`);
128
+ }
129
+ const parents = unit['parent_units'];
130
+ if (!Array.isArray(parents) || parents.length === 0 || !parents.every(isHash)) {
131
+ return unsupported('Invalid parent_units');
132
+ }
133
+ if (!isHash(unit['last_ball']) || !isHash(unit['last_ball_unit'])) {
134
+ return unsupported('Invalid last ball');
135
+ }
136
+ if (!Number.isSafeInteger(unit['timestamp']))
137
+ return unsupported('Invalid timestamp');
138
+ for (const fee of ['headers_commission', 'payload_commission']) {
139
+ if (!Number.isSafeInteger(unit[fee]) || unit[fee] <= 0) {
140
+ return unsupported(`Invalid ${fee}`);
141
+ }
142
+ }
143
+ for (const fee of ['tps_fee', 'burn_fee', 'max_aa_responses']) {
144
+ if (fee in unit && !isIndex(unit[fee]))
145
+ return unsupported(`Invalid ${fee}`);
146
+ }
147
+ return accept(unit);
148
+ }
149
+ /** The unit hash is present and matches the content. */
150
+ function checkUnitHash(unit) {
151
+ if (!isHash(unit['unit']))
152
+ return reject(EXACT_REASONS.unitHash, 'Missing unit hash');
153
+ const messages = unit['messages'];
154
+ const authors = unit['authors'];
155
+ if (!Array.isArray(messages) || !Array.isArray(authors))
156
+ return unsupported('Malformed unit');
157
+ let unitHash;
158
+ try {
159
+ unitHash = getUnitHash(unit);
160
+ }
161
+ catch {
162
+ return reject(EXACT_REASONS.unitHash, 'Unit cannot be hashed');
163
+ }
164
+ if (unitHash !== unit['unit']) {
165
+ return reject(EXACT_REASONS.unitHash, 'Unit hash does not match content');
166
+ }
167
+ return accept({ unitHash, messages, authors });
168
+ }
169
+ /** One author with a single-sig definition (embedded or from the ledger) and a valid signature. */
170
+ function checkAuthor(unit, authors, ledgerDefinition) {
171
+ const R = EXACT_REASONS;
172
+ if (authors.length !== 1)
173
+ return unsupported('Exactly one author is supported');
174
+ const author = authors[0];
175
+ if (!isPlainObject(author) || !hasOnlyKeys(author, AUTHOR_KEYS)) {
176
+ return unsupported('Malformed author');
177
+ }
178
+ const payer = author['address'];
179
+ if (!isAddress(payer))
180
+ return unsupported('Invalid author address');
181
+ const embedded = 'definition' in author;
182
+ const definition = embedded ? author['definition'] : ledgerDefinition;
183
+ if (definition === undefined) {
184
+ return reject(R.definitionRequired, 'Author definition is not embedded; fetch it from the ledger');
185
+ }
186
+ if (!isSigDefinition(definition)) {
187
+ return reject(R.definition, "Only ['sig', {pubkey}] author definitions are supported");
188
+ }
189
+ if (obyte.utils.getChash160([...definition]) !== payer) {
190
+ return reject(R.definition, 'Definition does not match the author address');
191
+ }
192
+ const authentifiers = author['authentifiers'];
193
+ if (!isPlainObject(authentifiers) || !hasOnlyKeys(authentifiers, new Set(['r']))) {
194
+ return reject(R.signature, 'Expected a single authentifier "r"');
195
+ }
196
+ if (!verifySignature(getUnitHashToSign(unit), authentifiers['r'], definition[1].pubkey)) {
197
+ return reject(R.signature, 'Signature is invalid');
198
+ }
199
+ return accept({ payer, definitionFromLedger: !embedded });
200
+ }
201
+ /** The payer is neither the recipient nor the facilitator. */
202
+ function checkPayer(payer, expect) {
203
+ if (payer === expect.payTo)
204
+ return reject(EXACT_REASONS.payer, 'Payer and payTo must differ');
205
+ if (expect.facilitatorAddresses?.includes(payer)) {
206
+ return reject(EXACT_REASONS.payer, 'A facilitator address must never be the payer');
207
+ }
208
+ return accept(null);
209
+ }
210
+ /**
211
+ * Inline messages with matching hashes: exactly one data message carrying the
212
+ * binding, one payment per asset, bytes always and only the expected asset besides.
213
+ */
214
+ function checkMessages(messages, expect) {
215
+ const R = EXACT_REASONS;
216
+ let dataCount = 0;
217
+ const payments = new Map();
218
+ for (const message of messages) {
219
+ if (!isPlainObject(message) || !hasOnlyKeys(message, MESSAGE_KEYS)) {
220
+ return unsupported('Malformed message');
221
+ }
222
+ if (message['payload_location'] !== 'inline' || !('payload' in message)) {
223
+ return unsupported('Only inline payloads are supported');
224
+ }
225
+ if (getBase64Hash(message['payload'], true) !== message['payload_hash']) {
226
+ return reject(R.payloadHash, 'payload_hash does not match payload');
227
+ }
228
+ const payload = message['payload'];
229
+ if (message['app'] === 'data') {
230
+ dataCount += 1;
231
+ const binding = checkBinding(payload, expect);
232
+ if (binding !== undefined)
233
+ return binding;
234
+ }
235
+ else if (message['app'] === 'payment') {
236
+ const asset = paymentAsset(payload);
237
+ if (!asset.ok)
238
+ return asset;
239
+ if (payments.has(asset.value))
240
+ return unsupported('One payment message per asset');
241
+ payments.set(asset.value, payload);
242
+ }
243
+ else {
244
+ return unsupported('Only payment and data messages are supported');
245
+ }
246
+ }
247
+ if (dataCount !== 1) {
248
+ return reject(R.binding, 'Exactly one data message with the binding is required');
249
+ }
250
+ if (!payments.has('base'))
251
+ return unsupported('A bytes payment message is required');
252
+ for (const asset of payments.keys()) {
253
+ if (asset !== 'base' && asset !== expect.asset) {
254
+ return reject(R.asset, 'Payment in an unexpected asset');
255
+ }
256
+ }
257
+ if (!payments.has(expect.asset))
258
+ return reject(R.asset, 'No payment in the required asset');
259
+ return accept(payments);
260
+ }
261
+ /** The asset of a payment message ('base' when omitted). */
262
+ function paymentAsset(payload) {
263
+ if (!isPlainObject(payload) || !hasOnlyKeys(payload, PAYMENT_KEYS)) {
264
+ return unsupported('Malformed payment');
265
+ }
266
+ const asset = 'asset' in payload ? payload['asset'] : 'base';
267
+ if (asset === 'base' && 'asset' in payload)
268
+ return unsupported('Bytes payment must omit asset');
269
+ if (!isAssetId(asset))
270
+ return unsupported('Invalid payment asset');
271
+ return accept(asset);
272
+ }
273
+ /**
274
+ * Transfer inputs only (no duplicates); sorted outputs that go to payTo
275
+ * (exactly once, the exact amount, the expected asset) or back to the payer.
276
+ */
277
+ function checkTransfers(payments, payer, expect) {
278
+ const R = EXACT_REASONS;
279
+ const inputs = [];
280
+ const seenInputs = new Set();
281
+ const outputTotals = {};
282
+ let paidToPayTo = 0n;
283
+ let outputsToPayTo = 0;
284
+ for (const [asset, payment] of payments) {
285
+ const ins = payment['inputs'];
286
+ const outs = payment['outputs'];
287
+ if (!Array.isArray(ins) || ins.length === 0 || !Array.isArray(outs) || outs.length === 0) {
288
+ return unsupported('Payment needs inputs and outputs');
289
+ }
290
+ for (const input of ins) {
291
+ const ref = transferInput(input, asset);
292
+ if (ref === undefined)
293
+ return unsupported('Only transfer inputs are supported');
294
+ const key = `${ref.unit}:${ref.messageIndex}:${ref.outputIndex}`;
295
+ if (seenInputs.has(key))
296
+ return unsupported('Duplicate input');
297
+ seenInputs.add(key);
298
+ inputs.push(ref);
299
+ }
300
+ let total = 0n;
301
+ let previous;
302
+ for (const output of outs) {
303
+ if (!isPlainObject(output) ||
304
+ !hasOnlyKeys(output, OUTPUT_KEYS) ||
305
+ !isAddress(output['address']) ||
306
+ !isPositiveAmount(output['amount'])) {
307
+ return unsupported('Malformed output');
308
+ }
309
+ // ocore requires outputs sorted by address, then amount; duplicates are
310
+ // outside our profile.
311
+ const current = { address: output['address'], amount: output['amount'] };
312
+ if (previous !== undefined && compareOutputs(previous, current) >= 0) {
313
+ return unsupported('Outputs must be sorted by address and amount without duplicates');
314
+ }
315
+ previous = current;
316
+ total += BigInt(current.amount);
317
+ if (current.address === expect.payTo) {
318
+ if (asset !== expect.asset)
319
+ return reject(R.recipient, 'payTo receives an unexpected asset');
320
+ outputsToPayTo += 1;
321
+ paidToPayTo += BigInt(current.amount);
322
+ }
323
+ else if (current.address !== payer) {
324
+ return reject(R.recipient, 'Outputs may only go to payTo or back to the payer');
325
+ }
326
+ }
327
+ outputTotals[asset] = total;
328
+ }
329
+ if (outputsToPayTo !== 1)
330
+ return reject(R.recipient, 'Exactly one output to payTo is required');
331
+ if (paidToPayTo !== expect.amount)
332
+ return reject(R.amount, 'Amount paid to payTo does not match');
333
+ return accept({ inputs, outputTotals });
334
+ }
335
+ /** A transfer input (unit, message_index, output_index), or undefined for anything else. */
336
+ function transferInput(input, asset) {
337
+ if (!isPlainObject(input) ||
338
+ !hasOnlyKeys(input, INPUT_KEYS) ||
339
+ !isHash(input['unit']) ||
340
+ !isIndex(input['message_index']) ||
341
+ !isIndex(input['output_index'])) {
342
+ return undefined;
343
+ }
344
+ return {
345
+ asset,
346
+ unit: input['unit'],
347
+ messageIndex: input['message_index'],
348
+ outputIndex: input['output_index'],
349
+ };
350
+ }
351
+ /** Length of one base64 secp256k1 signature, as counted by obyte.js. */
352
+ const SIGNATURE_SIZE = 88;
353
+ /**
354
+ * Commissions ocore expects for an already SIGNED single-author unit (v4,
355
+ * sizes counted with keys). obyte.js `getHeadersSize` is meant for the
356
+ * unsigned unit during compose (authentifiers hold a path placeholder) and
357
+ * adds SIGNATURE_SIZE itself; on a signed unit the real signature is already
358
+ * counted, so it is subtracted. Verified against testnet unit DxPSVW8p…
359
+ * (headers 452, payload 432).
360
+ */
361
+ export function expectedCommissions(unit) {
362
+ return {
363
+ headers: getHeadersSize(unit, true) - SIGNATURE_SIZE,
364
+ payload: getTotalPayloadSize(unit, true),
365
+ };
366
+ }
367
+ export function compareOutputs(a, b) {
368
+ if (a.address !== b.address)
369
+ return a.address < b.address ? -1 : 1;
370
+ return a.amount - b.amount;
371
+ }
372
+ /** The data message is exactly `{x402: {binding, quoteId}}` of this operation (undefined when it is). */
373
+ function checkBinding(payload, expect) {
374
+ const R = EXACT_REASONS;
375
+ if (!isPlainObject(payload) || !hasOnlyKeys(payload, new Set(['x402']))) {
376
+ return reject(R.binding, 'Data message must be exactly {x402: {binding, quoteId}}');
377
+ }
378
+ const x402 = payload['x402'];
379
+ if (!isPlainObject(x402) || !hasOnlyKeys(x402, new Set(['binding', 'quoteId']))) {
380
+ return reject(R.binding, 'Data message must be exactly {x402: {binding, quoteId}}');
381
+ }
382
+ if (x402['binding'] !== expect.binding || x402['quoteId'] !== expect.quoteId) {
383
+ return reject(R.binding, 'Signed binding does not match this operation');
384
+ }
385
+ return undefined;
386
+ }
387
+ //# sourceMappingURL=exact-unit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exact-unit.js","sourceRoot":"","sources":["../../src/unit/exact-unit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import { z } from 'zod';
2
+ import type { ObyteNetwork } from '../core/networks.js';
3
+ /**
4
+ * Local single-address wallet shared by the CLI, the seller watcher and the
5
+ * demo playground: one private key per network in
6
+ * `$OBBYX_HOME/wallet-<network>.json` (default ~/.obbyx), file mode 0600.
7
+ * Loading verifies the file (schema), its permissions, its network and that
8
+ * the key derives the stored address. The key never leaves this machine.
9
+ */
10
+ export declare const walletFileSchema: z.ZodObject<{
11
+ version: z.ZodLiteral<1>;
12
+ network: z.ZodString;
13
+ address: z.ZodString & z.ZodType<string, string, z.core.$ZodTypeInternals<string, string>>;
14
+ wif: z.ZodString;
15
+ createdAt: z.ZodString;
16
+ }, z.core.$strict>;
17
+ export type WalletFile = z.infer<typeof walletFileSchema>;
18
+ export declare function obbyxHome(env?: NodeJS.ProcessEnv): string;
19
+ export declare function walletPath(network: ObyteNetwork, env?: NodeJS.ProcessEnv): string;
20
+ export declare function createWallet(network: ObyteNetwork, opts?: {
21
+ force?: boolean;
22
+ env?: NodeJS.ProcessEnv;
23
+ }): WalletFile;
24
+ export declare function loadWallet(network: ObyteNetwork, env?: NodeJS.ProcessEnv): WalletFile & {
25
+ privateKey: Uint8Array;
26
+ };
27
+ /** Address of a single-sig key, via obyte.js public API (signMessage reports its author). */
28
+ export declare function addressOfKey(privateKey: Uint8Array, network: ObyteNetwork): string;
29
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/wallet/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB;;;;;;kBAQlB,CAAC;AAEZ,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE1D,wBAAgB,SAAS,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAEtE;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAE9F;AAED,wBAAgB,YAAY,CAC1B,OAAO,EAAE,YAAY,EACrB,IAAI,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;CAAO,GACtD,UAAU,CA8BZ;AAED,wBAAgB,UAAU,CACxB,OAAO,EAAE,YAAY,EACrB,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,UAAU,GAAG;IAAE,UAAU,EAAE,UAAU,CAAA;CAAE,CAyCzC;AAED,6FAA6F;AAC7F,wBAAgB,YAAY,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,GAAG,MAAM,CAUlF"}
@@ -0,0 +1,106 @@
1
+ import { randomBytes } from 'node:crypto';
2
+ import { chmodSync, existsSync, mkdirSync, readFileSync, statSync, writeFileSync } from 'node:fs';
3
+ import { homedir } from 'node:os';
4
+ import { join } from 'node:path';
5
+ import obyte from 'obyte';
6
+ import { z } from 'zod';
7
+ import { isAddress } from '../channel/definition.js';
8
+ import { ObbyxError } from '../core/errors.js';
9
+ /**
10
+ * Local single-address wallet shared by the CLI, the seller watcher and the
11
+ * demo playground: one private key per network in
12
+ * `$OBBYX_HOME/wallet-<network>.json` (default ~/.obbyx), file mode 0600.
13
+ * Loading verifies the file (schema), its permissions, its network and that
14
+ * the key derives the stored address. The key never leaves this machine.
15
+ */
16
+ export const walletFileSchema = z
17
+ .object({
18
+ version: z.literal(1),
19
+ network: z.string(),
20
+ address: z.string().refine(isAddress, 'invalid Obyte address'),
21
+ wif: z.string().min(1),
22
+ createdAt: z.string(),
23
+ })
24
+ .strict();
25
+ export function obbyxHome(env = process.env) {
26
+ return env['OBBYX_HOME'] ?? join(homedir(), '.obbyx');
27
+ }
28
+ export function walletPath(network, env = process.env) {
29
+ return join(obbyxHome(env), `wallet-${network.name}.json`);
30
+ }
31
+ export function createWallet(network, opts = {}) {
32
+ const path = walletPath(network, opts.env);
33
+ if (existsSync(path) && opts.force !== true) {
34
+ throw new ObbyxError('wallet_exists', `A wallet already exists at ${path} (use --force to replace it)`);
35
+ }
36
+ let privateKey;
37
+ let address;
38
+ for (;;) {
39
+ privateKey = randomBytes(32);
40
+ try {
41
+ address = addressOfKey(privateKey, network); // rejects the (astronomically unlikely) invalid scalar
42
+ break;
43
+ }
44
+ catch {
45
+ continue;
46
+ }
47
+ }
48
+ const wallet = {
49
+ version: 1,
50
+ network: network.caip2,
51
+ address,
52
+ wif: obyte.utils.toWif(privateKey, network.testnet),
53
+ createdAt: new Date().toISOString(),
54
+ };
55
+ mkdirSync(obbyxHome(opts.env), { recursive: true, mode: 0o700 });
56
+ writeFileSync(path, `${JSON.stringify(wallet, null, 2)}\n`, { mode: 0o600 });
57
+ chmodSync(path, 0o600);
58
+ return wallet;
59
+ }
60
+ export function loadWallet(network, env = process.env) {
61
+ const path = walletPath(network, env);
62
+ if (!existsSync(path)) {
63
+ throw new ObbyxError('no_wallet', `No wallet for ${network.caip2}. Run: obbyx init --network ${network.name}`);
64
+ }
65
+ if ((statSync(path).mode & 0o077) !== 0) {
66
+ throw new ObbyxError('wallet_permissions', `${path} is readable by others; run: chmod 600 ${path}`);
67
+ }
68
+ let raw;
69
+ try {
70
+ raw = JSON.parse(readFileSync(path, 'utf8'));
71
+ }
72
+ catch {
73
+ throw new ObbyxError('wallet_corrupt', `${path} is not valid JSON`);
74
+ }
75
+ const parsed = walletFileSchema.safeParse(raw);
76
+ if (!parsed.success) {
77
+ throw new ObbyxError('wallet_corrupt', `${path}: ${parsed.error.issues[0]?.message ?? 'invalid wallet file'}`);
78
+ }
79
+ const wallet = parsed.data;
80
+ if (wallet.network !== network.caip2) {
81
+ throw new ObbyxError('wallet_network', `${path} belongs to ${wallet.network}`);
82
+ }
83
+ let privateKey;
84
+ try {
85
+ privateKey = obyte.utils.fromWif(wallet.wif, network.testnet).privateKey;
86
+ }
87
+ catch {
88
+ throw new ObbyxError('wallet_corrupt', `${path}: invalid key for ${network.caip2}`);
89
+ }
90
+ const address = addressOfKey(privateKey, network);
91
+ if (address !== wallet.address)
92
+ throw new ObbyxError('wallet_corrupt', `${path}: key does not match address`);
93
+ return { ...wallet, privateKey };
94
+ }
95
+ /** Address of a single-sig key, via obyte.js public API (signMessage reports its author). */
96
+ export function addressOfKey(privateKey, network) {
97
+ const signed = obyte.utils.signMessage('obbyx', {
98
+ privateKey,
99
+ testnet: network.testnet,
100
+ });
101
+ const address = signed.authors[0]?.address;
102
+ if (address === undefined)
103
+ throw new ObbyxError('wallet_corrupt', 'Cannot derive address');
104
+ return address;
105
+ }
106
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/wallet/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,67 @@
1
1
  {
2
2
  "name": "@obbyx/obyte",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "version": "0.1.1",
4
+ "description": "Obyte primitives for x402: networks (CAIP-2), BigInt amounts, unit and signed-message validation, wallet, logging",
5
+ "keywords": [
6
+ "obyte",
7
+ "x402",
8
+ "payments",
9
+ "crypto",
10
+ "byteball"
11
+ ],
12
+ "license": "MIT",
13
+ "author": "Alexander Ponomarev",
14
+ "homepage": "https://github.com/Taump/obbyx/tree/master/packages/obyte#readme",
15
+ "repository": {
16
+ "type": "git",
17
+ "url": "git+https://github.com/Taump/obbyx.git",
18
+ "directory": "packages/obyte"
19
+ },
20
+ "bugs": {
21
+ "url": "https://github.com/Taump/obbyx/issues"
22
+ },
23
+ "type": "module",
24
+ "sideEffects": false,
25
+ "engines": {
26
+ "node": ">=24"
27
+ },
28
+ "exports": {
29
+ ".": {
30
+ "types": "./dist/index.d.ts",
31
+ "default": "./dist/index.js"
32
+ },
33
+ "./logger": {
34
+ "types": "./dist/logger/index.d.ts",
35
+ "default": "./dist/logger/index.js"
36
+ },
37
+ "./config": {
38
+ "types": "./dist/config/index.d.ts",
39
+ "default": "./dist/config/index.js"
40
+ },
41
+ "./wallet": {
42
+ "types": "./dist/wallet/index.d.ts",
43
+ "default": "./dist/wallet/index.js"
44
+ }
45
+ },
46
+ "files": [
47
+ "dist",
48
+ "src",
49
+ "README.md",
50
+ "LICENSE"
51
+ ],
52
+ "publishConfig": {
53
+ "access": "public"
54
+ },
55
+ "dependencies": {
56
+ "obyte": "0.2.1",
57
+ "pino": "^10.4.0",
58
+ "zod": "^4.6.7"
59
+ },
60
+ "devDependencies": {
61
+ "pino-pretty": "^13.2.0"
62
+ },
63
+ "scripts": {
64
+ "build": "tsc -p tsconfig.build.json",
65
+ "typecheck": "tsc -p tsconfig.json --noEmit"
66
+ }
6
67
  }