hodl-wallet 2.0.8 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/browser/index.d.ts +1 -0
- package/browser/index.js +1 -0
- package/browser/package.json +5 -0
- package/dist/app/account.d.ts +7 -0
- package/dist/app/account.js +248 -0
- package/dist/app/account.js.map +1 -0
- package/dist/app/format.d.ts +3 -0
- package/dist/app/format.js +27 -0
- package/dist/app/format.js.map +1 -0
- package/dist/app/index.d.ts +8 -0
- package/dist/app/index.js +7 -0
- package/dist/app/index.js.map +1 -0
- package/dist/app/menu.d.ts +12 -0
- package/dist/app/menu.js +78 -0
- package/dist/app/menu.js.map +1 -0
- package/dist/app/output.d.ts +15 -0
- package/dist/app/output.js +81 -0
- package/dist/app/output.js.map +1 -0
- package/dist/app/session.d.ts +105 -0
- package/dist/app/session.js +2 -0
- package/dist/app/session.js.map +1 -0
- package/dist/app/transfer.d.ts +3 -0
- package/dist/app/transfer.js +144 -0
- package/dist/app/transfer.js.map +1 -0
- package/dist/app/ui.d.ts +60 -0
- package/dist/app/ui.js +15 -0
- package/dist/app/ui.js.map +1 -0
- package/dist/browser-core.d.ts +15 -0
- package/dist/browser-core.js +11 -0
- package/dist/browser-core.js.map +1 -0
- package/dist/environment-node.d.ts +2 -0
- package/dist/environment-node.js +8 -0
- package/dist/environment-node.js.map +1 -0
- package/dist/environment.d.ts +2 -0
- package/dist/environment.js +8 -0
- package/dist/environment.js.map +1 -0
- package/dist/index.js +24 -1096
- package/dist/index.js.map +1 -1
- package/dist/network/lib/BaseNetwork.d.ts +3 -1
- package/dist/network/lib/BaseNetwork.js +8 -0
- package/dist/network/lib/BaseNetwork.js.map +1 -1
- package/dist/network/lib/BitcoinNetwork.d.ts +4 -1
- package/dist/network/lib/BitcoinNetwork.js +32 -22
- package/dist/network/lib/BitcoinNetwork.js.map +1 -1
- package/dist/network/lib/Web3Network.d.ts +3 -1
- package/dist/network/lib/Web3Network.js +34 -33
- package/dist/network/lib/Web3Network.js.map +1 -1
- package/dist/network/types.d.ts +5 -1
- package/dist/node-session.d.ts +51 -0
- package/dist/node-session.js +410 -0
- package/dist/node-session.js.map +1 -0
- package/dist/persist.d.ts +8 -1
- package/dist/persist.js +48 -42
- package/dist/persist.js.map +1 -1
- package/dist/sensitive-data.d.ts +2 -0
- package/dist/sensitive-data.js +21 -0
- package/dist/sensitive-data.js.map +1 -0
- package/dist/swap/config.d.ts +2 -2
- package/dist/swap/routes.d.ts +4 -4
- package/dist/swap/service.d.ts +3 -3
- package/dist/swap/service.js +14 -14
- package/dist/swap/service.js.map +1 -1
- package/dist/transfer-service.d.ts +3 -2
- package/dist/transfer-service.js +37 -12
- package/dist/transfer-service.js.map +1 -1
- package/dist/ui-inquirer.d.ts +30 -0
- package/dist/ui-inquirer.js +62 -0
- package/dist/ui-inquirer.js.map +1 -0
- package/dist/wallet-store.d.ts +11 -0
- package/dist/wallet-store.js +2 -0
- package/dist/wallet-store.js.map +1 -0
- package/package.json +13 -1
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import type { BaseNetworkContract, NetworkPlugin } from '../network/types.js';
|
|
2
|
+
import type { TransferResult } from '../transfer-service.js';
|
|
3
|
+
import type { Cell, Ui } from './ui.js';
|
|
4
|
+
export interface AccountDetails {
|
|
5
|
+
address: string;
|
|
6
|
+
privateKey: string;
|
|
7
|
+
mnemonic?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface Contact {
|
|
10
|
+
address: string;
|
|
11
|
+
name: string;
|
|
12
|
+
}
|
|
13
|
+
export interface SentTransfer {
|
|
14
|
+
timestamp: string | number | Date;
|
|
15
|
+
recipient: string;
|
|
16
|
+
contact?: string;
|
|
17
|
+
token: string;
|
|
18
|
+
amount: string | number;
|
|
19
|
+
balance?: string | number;
|
|
20
|
+
status?: string;
|
|
21
|
+
url: string;
|
|
22
|
+
}
|
|
23
|
+
export interface TransferDraft {
|
|
24
|
+
to: string;
|
|
25
|
+
asset: string;
|
|
26
|
+
/** A decimal amount, or `max`. */
|
|
27
|
+
amount: string;
|
|
28
|
+
}
|
|
29
|
+
export interface PendingTransfer {
|
|
30
|
+
requestId: string;
|
|
31
|
+
to: string;
|
|
32
|
+
asset: string;
|
|
33
|
+
amount: string;
|
|
34
|
+
status: string;
|
|
35
|
+
}
|
|
36
|
+
export interface TransferPort {
|
|
37
|
+
pending(): Promise<PendingTransfer[]>;
|
|
38
|
+
/** What `max` would send and the fee it would pay. Sends nothing. */
|
|
39
|
+
preview(draft: {
|
|
40
|
+
to: string;
|
|
41
|
+
asset: string;
|
|
42
|
+
}): Promise<{
|
|
43
|
+
amount: string;
|
|
44
|
+
fee: {
|
|
45
|
+
amount: string;
|
|
46
|
+
asset: string;
|
|
47
|
+
};
|
|
48
|
+
}>;
|
|
49
|
+
/**
|
|
50
|
+
* Optional. Prepares the transfer and returns what the user must see before it is signed.
|
|
51
|
+
* A resumed transfer is reviewed as saved. When present, `send` must send exactly what was reviewed.
|
|
52
|
+
*/
|
|
53
|
+
review?(draft: TransferDraft, resume?: string): Promise<Cell[][]>;
|
|
54
|
+
send(draft: TransferDraft, requestId: string): Promise<TransferResult>;
|
|
55
|
+
/** Stores whatever the host keeps about a sent transfer and describes it for display. */
|
|
56
|
+
record(result: TransferResult, draft: TransferDraft): Promise<SentTransfer>;
|
|
57
|
+
}
|
|
58
|
+
/** Optional address book. Absent hosts show no contact columns or prompts. */
|
|
59
|
+
export interface ContactsPort {
|
|
60
|
+
list(): Promise<Contact[]>;
|
|
61
|
+
get(address: string): Promise<string | undefined>;
|
|
62
|
+
set(address: string, name: string): Promise<void>;
|
|
63
|
+
delete(address: string): Promise<void>;
|
|
64
|
+
clear(): Promise<void>;
|
|
65
|
+
}
|
|
66
|
+
/** A menu entry only some hosts have, such as swaps or file import. */
|
|
67
|
+
export interface HostAction {
|
|
68
|
+
name: string;
|
|
69
|
+
/** Import actions return true when they replaced the account. */
|
|
70
|
+
run(ui: Ui): Promise<boolean | void>;
|
|
71
|
+
}
|
|
72
|
+
export interface SessionCapabilities {
|
|
73
|
+
/** Create a new account over the current one from Account Settings. Importing over it is always offered. */
|
|
74
|
+
replaceAccount: boolean;
|
|
75
|
+
/** Sent-transfer rows carry the balance after sending. */
|
|
76
|
+
balanceHistory: boolean;
|
|
77
|
+
/** The first-run account menu offers Switch Network. */
|
|
78
|
+
switchNetworkFirst: boolean;
|
|
79
|
+
}
|
|
80
|
+
export type NewAccount = 'existing-mnemonic' | 'random' | 12 | 24;
|
|
81
|
+
/** What the shared flows need from an unlocked wallet. Nothing here prompts. */
|
|
82
|
+
export interface WalletSession {
|
|
83
|
+
readonly capabilities: SessionCapabilities;
|
|
84
|
+
readonly plugin: NetworkPlugin;
|
|
85
|
+
/** The selected network. Flows use it only to validate input. Read it again after selectNetwork. */
|
|
86
|
+
readonly network: BaseNetworkContract;
|
|
87
|
+
readonly transfers: TransferPort;
|
|
88
|
+
readonly contacts?: ContactsPort;
|
|
89
|
+
start(): Promise<void>;
|
|
90
|
+
networks(): NetworkPlugin[];
|
|
91
|
+
selectNetwork(plugin: NetworkPlugin): Promise<void>;
|
|
92
|
+
hasAccount(): Promise<boolean>;
|
|
93
|
+
address(): Promise<string>;
|
|
94
|
+
hasMnemonic(): Promise<boolean>;
|
|
95
|
+
createAccount(kind: NewAccount): Promise<void>;
|
|
96
|
+
importMnemonic(mnemonic: string): Promise<void>;
|
|
97
|
+
importPrivateKey(privateKey: string): Promise<void>;
|
|
98
|
+
/** A detached copy. The caller clears it. */
|
|
99
|
+
accountDetails(): Promise<AccountDetails | null>;
|
|
100
|
+
tokenBalances(): Promise<Array<[string, string]>>;
|
|
101
|
+
sentTransfers(): Promise<SentTransfer[]>;
|
|
102
|
+
importActions(): HostAction[];
|
|
103
|
+
exportActions(): HostAction[];
|
|
104
|
+
menuActions(): HostAction[];
|
|
105
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../app/session.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { randomUUID } from '#environment';
|
|
2
|
+
import { AgentError } from '../agent-errors.js';
|
|
3
|
+
import { normalizeDecimal } from '../amounts.js';
|
|
4
|
+
import { saveContact } from './account.js';
|
|
5
|
+
import { errorMessage } from './format.js';
|
|
6
|
+
import { sentTransfersTable, showError, showTransactionError } from './output.js';
|
|
7
|
+
/** Shows the host's review of a transfer. False means the user must not be asked to send it. */
|
|
8
|
+
async function reviewed(ui, session, draft, resume) {
|
|
9
|
+
const review = session.transfers.review;
|
|
10
|
+
if (!review)
|
|
11
|
+
return true;
|
|
12
|
+
try {
|
|
13
|
+
const rows = await review.call(session.transfers, draft, resume);
|
|
14
|
+
ui.table({ head: [{ colSpan: 2, content: resume ? 'Saved transfer' : 'Review transfer' }], rows, tone: 'blue', wordWrap: true });
|
|
15
|
+
}
|
|
16
|
+
catch (error) {
|
|
17
|
+
showTransactionError(ui, error);
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
return resume ? ui.confirm({ message: 'Send the saved transaction?', default: false }) : true;
|
|
21
|
+
}
|
|
22
|
+
async function submitTransfer(ui, session, draft, requestId) {
|
|
23
|
+
const spinner = ui.spinner('Checking / sending transaction...');
|
|
24
|
+
let result;
|
|
25
|
+
try {
|
|
26
|
+
result = await session.transfers.send(draft, requestId);
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
spinner.fail('Could not complete the transfer request.');
|
|
30
|
+
showTransactionError(ui, error);
|
|
31
|
+
if (error instanceof AgentError && error.code === 'SWAP_IN_PROGRESS') {
|
|
32
|
+
ui.print(`Blocking swap: ${error.details?.requestId}`);
|
|
33
|
+
ui.print('Open Swap > Track Swaps to refresh its saved status, then retry the transfer once the swap has finished.');
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
if (error instanceof AgentError && error.details?.transactionHash) {
|
|
37
|
+
ui.print(`Saved transfer: ${error.details.requestId}`);
|
|
38
|
+
ui.print(session.plugin.explorer + error.details.transactionHash);
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
ui.print(`Request ID: ${requestId}`);
|
|
42
|
+
}
|
|
43
|
+
ui.print('Open Transfer Funds to check or resume any saved request before creating another payment.');
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
spinner.succeed(result.status === 'confirmed' ? 'Transaction confirmed!' : 'Transaction submitted; awaiting confirmation.');
|
|
47
|
+
try {
|
|
48
|
+
const sent = await session.transfers.record(result, draft);
|
|
49
|
+
ui.table(sentTransfersTable(session, [sent], { status: false, tone: 'green' }));
|
|
50
|
+
await saveContact(ui, session, draft.to);
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
showError(ui, 'Transfer recorded; could not update balance, history or contact.', errorMessage(error));
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
export async function transferFunds(ui, session) {
|
|
57
|
+
const pending = await session.transfers.pending();
|
|
58
|
+
if (pending.length) {
|
|
59
|
+
const requestId = await ui.select({
|
|
60
|
+
message: 'A previous transfer is still pending:',
|
|
61
|
+
choices: [
|
|
62
|
+
...pending.map(transfer => ({
|
|
63
|
+
name: `Check / resume ${transfer.amount} ${transfer.asset} to ${transfer.to} (${transfer.status})`,
|
|
64
|
+
value: transfer.requestId
|
|
65
|
+
})),
|
|
66
|
+
{ name: 'New transfer', value: 'new' },
|
|
67
|
+
{ name: 'Go back', value: 'back', back: true }
|
|
68
|
+
]
|
|
69
|
+
});
|
|
70
|
+
if (requestId === 'back')
|
|
71
|
+
return;
|
|
72
|
+
if (requestId !== 'new') {
|
|
73
|
+
const { to, asset, amount } = pending.find(item => item.requestId === requestId);
|
|
74
|
+
const draft = { to, asset, amount };
|
|
75
|
+
if (await reviewed(ui, session, draft, requestId))
|
|
76
|
+
await submitTransfer(ui, session, draft, requestId);
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
const contacts = await session.contacts?.list() ?? [];
|
|
81
|
+
const addressBook = [...contacts, { name: 'Go Back', address: '' }];
|
|
82
|
+
// Address book entries first, then whatever was typed
|
|
83
|
+
const recipient = await ui.autocomplete({
|
|
84
|
+
message: 'Recipient address:',
|
|
85
|
+
source: (input = '') => addressBook
|
|
86
|
+
.filter(entry => entry.name.toLowerCase().includes(input.toLowerCase()) || entry.address.toLowerCase().includes(input.toLowerCase()))
|
|
87
|
+
.map(entry => ({
|
|
88
|
+
name: entry.address ? `${entry.address} (${entry.name})` : entry.name,
|
|
89
|
+
value: entry.address
|
|
90
|
+
}))
|
|
91
|
+
.concat([{ name: input, value: input }])
|
|
92
|
+
});
|
|
93
|
+
if (!recipient)
|
|
94
|
+
return;
|
|
95
|
+
const plugin = session.plugin;
|
|
96
|
+
const assets = Object.keys(plugin.tokens);
|
|
97
|
+
assets.push(plugin.nativeToken);
|
|
98
|
+
let asset = plugin.nativeToken;
|
|
99
|
+
if (assets.length > 1) {
|
|
100
|
+
asset = await ui.select({ message: 'Token to transfer:', choices: assets.map(name => ({ name, value: name })) });
|
|
101
|
+
}
|
|
102
|
+
const amount = (await ui.input({
|
|
103
|
+
message: 'Amount to transfer (or max):',
|
|
104
|
+
validate: value => {
|
|
105
|
+
if (value.trim() === '' || value.trim().toLowerCase() === 'max')
|
|
106
|
+
return true;
|
|
107
|
+
try {
|
|
108
|
+
normalizeDecimal(value.trim());
|
|
109
|
+
return true;
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
return 'Please enter a valid decimal amount, max, or leave empty to cancel.';
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
})).trim();
|
|
116
|
+
if (amount === '')
|
|
117
|
+
return;
|
|
118
|
+
const maximum = amount.toLowerCase() === 'max';
|
|
119
|
+
let transferAmount = amount;
|
|
120
|
+
if (maximum) {
|
|
121
|
+
try {
|
|
122
|
+
const preview = await session.transfers.preview({ to: recipient, asset });
|
|
123
|
+
transferAmount = preview.amount;
|
|
124
|
+
ui.print(`Maximum: ${preview.amount} ${asset} | Estimated fee: ${preview.fee.amount} ${preview.fee.asset}`);
|
|
125
|
+
}
|
|
126
|
+
catch (error) {
|
|
127
|
+
showTransactionError(ui, error);
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
const draft = { to: recipient, asset, amount: maximum ? 'max' : transferAmount };
|
|
132
|
+
if (!await reviewed(ui, session, { ...draft, amount: transferAmount }))
|
|
133
|
+
return;
|
|
134
|
+
const confirmed = await ui.confirm({
|
|
135
|
+
message: maximum
|
|
136
|
+
? `Confirm transfer of maximum available ${asset} (estimated ${transferAmount})?`
|
|
137
|
+
: `Confirm transfer of ${transferAmount} ${asset}?`,
|
|
138
|
+
default: true
|
|
139
|
+
});
|
|
140
|
+
if (!confirmed)
|
|
141
|
+
return;
|
|
142
|
+
await submitTransfer(ui, session, draft, randomUUID());
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=transfer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transfer.js","sourceRoot":"","sources":["../../app/transfer.ts"],"names":[],"mappings":"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"}
|
package/dist/app/ui.d.ts
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
export type Tone = 'green' | 'blue' | 'yellow' | 'red';
|
|
2
|
+
export type Cell = string | {
|
|
3
|
+
colSpan: number;
|
|
4
|
+
content: string;
|
|
5
|
+
};
|
|
6
|
+
export interface TableSpec {
|
|
7
|
+
head: Cell[];
|
|
8
|
+
rows?: Cell[][];
|
|
9
|
+
tone: Tone;
|
|
10
|
+
wordWrap?: boolean;
|
|
11
|
+
colWidths?: number[];
|
|
12
|
+
/** Holds secrets: a host may show it once but must not keep it in history. */
|
|
13
|
+
secret?: boolean;
|
|
14
|
+
}
|
|
15
|
+
export interface Choice<T> {
|
|
16
|
+
name: string;
|
|
17
|
+
value: T;
|
|
18
|
+
/** Selected by Escape in hosts that have one. */
|
|
19
|
+
back?: boolean;
|
|
20
|
+
}
|
|
21
|
+
export interface Spinner {
|
|
22
|
+
succeed(text: string): void;
|
|
23
|
+
fail(text: string): void;
|
|
24
|
+
stop(): void;
|
|
25
|
+
}
|
|
26
|
+
export type Validation = true | string;
|
|
27
|
+
/** Everything the shared flows need from a terminal, real or emulated. */
|
|
28
|
+
export interface Ui {
|
|
29
|
+
banner(art: string): void;
|
|
30
|
+
print(text: string): void;
|
|
31
|
+
table(spec: TableSpec): void;
|
|
32
|
+
select<T>(question: {
|
|
33
|
+
message: string;
|
|
34
|
+
choices: Array<Choice<T>>;
|
|
35
|
+
default?: T;
|
|
36
|
+
}): Promise<T>;
|
|
37
|
+
input(question: {
|
|
38
|
+
message: string;
|
|
39
|
+
default?: string;
|
|
40
|
+
validate?: (input: string) => Validation;
|
|
41
|
+
}): Promise<string>;
|
|
42
|
+
password(question: {
|
|
43
|
+
message: string;
|
|
44
|
+
validate?: (input: string) => Validation;
|
|
45
|
+
}): Promise<string>;
|
|
46
|
+
confirm(question: {
|
|
47
|
+
message: string;
|
|
48
|
+
default: boolean;
|
|
49
|
+
}): Promise<boolean>;
|
|
50
|
+
autocomplete(question: {
|
|
51
|
+
message: string;
|
|
52
|
+
source: (input: string) => Array<Choice<string>>;
|
|
53
|
+
}): Promise<string>;
|
|
54
|
+
spinner(text: string): Spinner;
|
|
55
|
+
}
|
|
56
|
+
/** Thrown by a pending prompt when the user exits or the wallet locks. Named like inquirer's Ctrl+C error. */
|
|
57
|
+
export declare class PromptAborted extends Error {
|
|
58
|
+
constructor(message?: string);
|
|
59
|
+
}
|
|
60
|
+
export declare function isPromptAborted(error: unknown): boolean;
|
package/dist/app/ui.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/** Thrown by a pending prompt when the user exits or the wallet locks. Named like inquirer's Ctrl+C error. */
|
|
2
|
+
export class PromptAborted extends Error {
|
|
3
|
+
constructor(message = 'Prompt was canceled.') {
|
|
4
|
+
super(message);
|
|
5
|
+
this.name = 'ExitPromptError';
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
export function isPromptAborted(error) {
|
|
9
|
+
for (let current = error; current instanceof Error; current = current.cause) {
|
|
10
|
+
if (current.name === 'ExitPromptError')
|
|
11
|
+
return true;
|
|
12
|
+
}
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=ui.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui.js","sourceRoot":"","sources":["../../app/ui.ts"],"names":[],"mappings":"AAyCA,8GAA8G;AAC9G,MAAM,OAAO,aAAc,SAAQ,KAAK;IACpC,YAAY,OAAO,GAAG,sBAAsB;QACxC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAClC,CAAC;CACJ;AAED,MAAM,UAAU,eAAe,CAAC,KAAc;IAC1C,KAAK,IAAI,OAAO,GAAG,KAAK,EAAE,OAAO,YAAY,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;QAC1E,IAAI,OAAO,CAAC,IAAI,KAAK,iBAAiB;YAAE,OAAO,IAAI,CAAC;IACxD,CAAC;IACD,OAAO,KAAK,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export { formatUnits, normalizeDecimal, parseDecimalToUnits } from './amounts.js';
|
|
2
|
+
export { NetworkRegistry, ACTIVE_NETWORKS } from './network-registry.js';
|
|
3
|
+
export { default as Web3Network } from './network/lib/Web3Network.js';
|
|
4
|
+
export { default as BitcoinNetwork, signBitcoinTransaction } from './network/lib/BitcoinNetwork.js';
|
|
5
|
+
export { TransferService } from './transfer-service.js';
|
|
6
|
+
export { SwapService } from './swap/service.js';
|
|
7
|
+
export { swapConfig } from './swap/config.js';
|
|
8
|
+
export { clearSensitiveData } from './sensitive-data.js';
|
|
9
|
+
export * from './app/index.js';
|
|
10
|
+
export { AgentError } from './agent-errors.js';
|
|
11
|
+
export type { WalletStore } from './wallet-store.js';
|
|
12
|
+
export type { TransferResult } from './transfer-service.js';
|
|
13
|
+
export type { SwapServiceOptions } from './swap/service.js';
|
|
14
|
+
export type * from './network/types.js';
|
|
15
|
+
export type * from './swap/types.js';
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export { formatUnits, normalizeDecimal, parseDecimalToUnits } from './amounts.js';
|
|
2
|
+
export { NetworkRegistry, ACTIVE_NETWORKS } from './network-registry.js';
|
|
3
|
+
export { default as Web3Network } from './network/lib/Web3Network.js';
|
|
4
|
+
export { default as BitcoinNetwork, signBitcoinTransaction } from './network/lib/BitcoinNetwork.js';
|
|
5
|
+
export { TransferService } from './transfer-service.js';
|
|
6
|
+
export { SwapService } from './swap/service.js';
|
|
7
|
+
export { swapConfig } from './swap/config.js';
|
|
8
|
+
export { clearSensitiveData } from './sensitive-data.js';
|
|
9
|
+
export * from './app/index.js';
|
|
10
|
+
export { AgentError } from './agent-errors.js';
|
|
11
|
+
//# sourceMappingURL=browser-core.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-core.js","sourceRoot":"","sources":["../browser-core.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAClF,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACzE,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACpG,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,cAAc,gBAAgB,CAAC;AAC/B,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"environment-node.js","sourceRoot":"","sources":["../environment-node.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AAEjC,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,KAAa;IACtC,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,UAAU;IACtB,OAAO,MAAM,CAAC,UAAU,EAAE,CAAC;AAC/B,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export async function sha256(value) {
|
|
2
|
+
const digest = await globalThis.crypto.subtle.digest('SHA-256', new TextEncoder().encode(value));
|
|
3
|
+
return Array.from(new Uint8Array(digest), byte => byte.toString(16).padStart(2, '0')).join('');
|
|
4
|
+
}
|
|
5
|
+
export function randomUUID() {
|
|
6
|
+
return globalThis.crypto.randomUUID();
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=environment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"environment.js","sourceRoot":"","sources":["../environment.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,KAAa;IACtC,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACjG,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACnG,CAAC;AAED,MAAM,UAAU,UAAU;IACtB,OAAO,UAAU,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;AAC1C,CAAC"}
|