@sundaeswap/sprinkles 0.3.0 → 0.5.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/dist/cjs/Sprinkle/__tests__/encryption.test.js +20 -8
- package/dist/cjs/Sprinkle/__tests__/encryption.test.js.map +1 -1
- package/dist/cjs/Sprinkle/__tests__/enhancements.test.js +41 -16
- package/dist/cjs/Sprinkle/__tests__/enhancements.test.js.map +1 -1
- package/dist/cjs/Sprinkle/__tests__/fill-in-struct.test.js +85 -38
- package/dist/cjs/Sprinkle/__tests__/fill-in-struct.test.js.map +1 -1
- package/dist/cjs/Sprinkle/__tests__/settings-persistence.test.js +120 -0
- package/dist/cjs/Sprinkle/__tests__/settings-persistence.test.js.map +1 -1
- package/dist/cjs/Sprinkle/__tests__/show-menu.test.js +93 -7
- package/dist/cjs/Sprinkle/__tests__/show-menu.test.js.map +1 -1
- package/dist/cjs/Sprinkle/__tests__/tx-dialog.test.js +21 -0
- package/dist/cjs/Sprinkle/__tests__/tx-dialog.test.js.map +1 -1
- package/dist/cjs/Sprinkle/encryption.js +131 -0
- package/dist/cjs/Sprinkle/encryption.js.map +1 -0
- package/dist/cjs/Sprinkle/index.js +318 -352
- package/dist/cjs/Sprinkle/index.js.map +1 -1
- package/dist/cjs/Sprinkle/prompts.js +393 -0
- package/dist/cjs/Sprinkle/prompts.js.map +1 -0
- package/dist/cjs/Sprinkle/schemas.js +97 -0
- package/dist/cjs/Sprinkle/schemas.js.map +1 -0
- package/dist/cjs/Sprinkle/tx-dialog.js +101 -0
- package/dist/cjs/Sprinkle/tx-dialog.js.map +1 -0
- package/dist/cjs/Sprinkle/type-guards.js +42 -0
- package/dist/cjs/Sprinkle/type-guards.js.map +1 -0
- package/dist/cjs/Sprinkle/types.js +49 -0
- package/dist/cjs/Sprinkle/types.js.map +1 -0
- package/dist/cjs/Sprinkle/wallet.js +98 -0
- package/dist/cjs/Sprinkle/wallet.js.map +1 -0
- package/dist/esm/Sprinkle/__tests__/encryption.test.js +20 -8
- package/dist/esm/Sprinkle/__tests__/encryption.test.js.map +1 -1
- package/dist/esm/Sprinkle/__tests__/enhancements.test.js +41 -16
- package/dist/esm/Sprinkle/__tests__/enhancements.test.js.map +1 -1
- package/dist/esm/Sprinkle/__tests__/fill-in-struct.test.js +85 -38
- package/dist/esm/Sprinkle/__tests__/fill-in-struct.test.js.map +1 -1
- package/dist/esm/Sprinkle/__tests__/settings-persistence.test.js +120 -0
- package/dist/esm/Sprinkle/__tests__/settings-persistence.test.js.map +1 -1
- package/dist/esm/Sprinkle/__tests__/show-menu.test.js +94 -8
- package/dist/esm/Sprinkle/__tests__/show-menu.test.js.map +1 -1
- package/dist/esm/Sprinkle/__tests__/tx-dialog.test.js +21 -0
- package/dist/esm/Sprinkle/__tests__/tx-dialog.test.js.map +1 -1
- package/dist/esm/Sprinkle/encryption.js +117 -0
- package/dist/esm/Sprinkle/encryption.js.map +1 -0
- package/dist/esm/Sprinkle/index.js +172 -337
- package/dist/esm/Sprinkle/index.js.map +1 -1
- package/dist/esm/Sprinkle/prompts.js +385 -0
- package/dist/esm/Sprinkle/prompts.js.map +1 -0
- package/dist/esm/Sprinkle/schemas.js +91 -0
- package/dist/esm/Sprinkle/schemas.js.map +1 -0
- package/dist/esm/Sprinkle/tx-dialog.js +90 -0
- package/dist/esm/Sprinkle/tx-dialog.js.map +1 -0
- package/dist/esm/Sprinkle/type-guards.js +24 -0
- package/dist/esm/Sprinkle/type-guards.js.map +1 -0
- package/dist/esm/Sprinkle/types.js +42 -0
- package/dist/esm/Sprinkle/types.js.map +1 -0
- package/dist/esm/Sprinkle/wallet.js +90 -0
- package/dist/esm/Sprinkle/wallet.js.map +1 -0
- package/dist/types/Sprinkle/encryption.d.ts +43 -0
- package/dist/types/Sprinkle/encryption.d.ts.map +1 -0
- package/dist/types/Sprinkle/index.d.ts +13 -174
- package/dist/types/Sprinkle/index.d.ts.map +1 -1
- package/dist/types/Sprinkle/prompts.d.ts +94 -0
- package/dist/types/Sprinkle/prompts.d.ts.map +1 -0
- package/dist/types/Sprinkle/schemas.d.ts +125 -0
- package/dist/types/Sprinkle/schemas.d.ts.map +1 -0
- package/dist/types/Sprinkle/tx-dialog.d.ts +37 -0
- package/dist/types/Sprinkle/tx-dialog.d.ts.map +1 -0
- package/dist/types/Sprinkle/type-guards.d.ts +22 -0
- package/dist/types/Sprinkle/type-guards.d.ts.map +1 -0
- package/dist/types/Sprinkle/types.d.ts +62 -0
- package/dist/types/Sprinkle/types.d.ts.map +1 -0
- package/dist/types/Sprinkle/wallet.d.ts +27 -0
- package/dist/types/Sprinkle/wallet.d.ts.map +1 -0
- package/dist/types/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/Sprinkle/__tests__/encryption.test.ts +21 -8
- package/src/Sprinkle/__tests__/enhancements.test.ts +41 -15
- package/src/Sprinkle/__tests__/fill-in-struct.test.ts +104 -38
- package/src/Sprinkle/__tests__/settings-persistence.test.ts +108 -0
- package/src/Sprinkle/__tests__/show-menu.test.ts +96 -8
- package/src/Sprinkle/__tests__/tx-dialog.test.ts +21 -0
- package/src/Sprinkle/encryption.ts +130 -0
- package/src/Sprinkle/index.ts +265 -478
- package/src/Sprinkle/prompts.ts +481 -0
- package/src/Sprinkle/schemas.ts +111 -0
- package/src/Sprinkle/tx-dialog.ts +100 -0
- package/src/Sprinkle/type-guards.ts +51 -0
- package/src/Sprinkle/types.ts +73 -0
- package/src/Sprinkle/wallet.ts +133 -0
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type guard utilities for TypeBox schema types.
|
|
3
|
+
* These are internal helpers used by FillInStruct, encryption, and other modules.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import {
|
|
7
|
+
Kind,
|
|
8
|
+
type TBigInt,
|
|
9
|
+
type TLiteral,
|
|
10
|
+
type TObject,
|
|
11
|
+
type TSchema,
|
|
12
|
+
type TString,
|
|
13
|
+
type TTuple,
|
|
14
|
+
type TUnion,
|
|
15
|
+
type TArray,
|
|
16
|
+
type TThis,
|
|
17
|
+
type TRef,
|
|
18
|
+
type TImport,
|
|
19
|
+
type TOptional,
|
|
20
|
+
OptionalKind,
|
|
21
|
+
} from "@sinclair/typebox";
|
|
22
|
+
|
|
23
|
+
export const isOptional = <T extends TSchema>(t: T): t is TOptional<T> =>
|
|
24
|
+
t[OptionalKind] === "Optional";
|
|
25
|
+
|
|
26
|
+
export const isImport = (t: TSchema): t is TImport => t[Kind] === "Import";
|
|
27
|
+
|
|
28
|
+
export const isArray = (t: TSchema): t is TArray => t[Kind] === "Array";
|
|
29
|
+
|
|
30
|
+
export const isBigInt = (t: TSchema): t is TBigInt => t[Kind] === "BigInt";
|
|
31
|
+
|
|
32
|
+
export const isLiteral = (t: TSchema): t is TLiteral => t[Kind] === "Literal";
|
|
33
|
+
|
|
34
|
+
export const isObject = (t: TSchema): t is TObject => t[Kind] === "Object";
|
|
35
|
+
|
|
36
|
+
export const isRef = (t: TSchema): t is TRef => t[Kind] === "Ref";
|
|
37
|
+
|
|
38
|
+
export const isString = (t: TSchema): t is TString => t[Kind] === "String";
|
|
39
|
+
|
|
40
|
+
export const isThis = (t: TSchema): t is TThis => t[Kind] === "This";
|
|
41
|
+
|
|
42
|
+
export const isTuple = (t: TSchema): t is TTuple => t[Kind] === "Tuple";
|
|
43
|
+
|
|
44
|
+
export const isUnion = (t: TSchema): t is TUnion => t[Kind] === "Union";
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Check if a schema field is marked as sensitive.
|
|
48
|
+
* Sensitive fields are encrypted when saved and masked when displayed.
|
|
49
|
+
*/
|
|
50
|
+
export const isSensitive = (t: TSchema): boolean =>
|
|
51
|
+
isString(t) && t.sensitive === true;
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { Core } from "@blaze-cardano/sdk";
|
|
2
|
+
import type { Static, TSchema } from "@sinclair/typebox";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Utility type to extract the static type from a TypeBox schema.
|
|
6
|
+
*/
|
|
7
|
+
export type TExact<T> = T extends TSchema ? Static<T> : T;
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Options for encrypting/decrypting sensitive fields in settings.
|
|
11
|
+
*/
|
|
12
|
+
export interface IEncryptionOptions {
|
|
13
|
+
encrypt: (plaintext: string) => string;
|
|
14
|
+
decrypt: (ciphertext: string) => Promise<string>;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Options for configuring a Sprinkle instance.
|
|
19
|
+
*/
|
|
20
|
+
export interface ISprinkleOptions {
|
|
21
|
+
encryption?: IEncryptionOptions;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Metadata for a profile.
|
|
26
|
+
*/
|
|
27
|
+
export interface IProfileMeta {
|
|
28
|
+
name: string;
|
|
29
|
+
description?: string;
|
|
30
|
+
createdAt: string;
|
|
31
|
+
updatedAt: string;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Current profile information including ID.
|
|
36
|
+
*/
|
|
37
|
+
export interface ICurrentProfile extends IProfileMeta {
|
|
38
|
+
id: string;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Profile entry as returned by scanProfiles().
|
|
43
|
+
*/
|
|
44
|
+
export interface IProfileEntry {
|
|
45
|
+
id: string;
|
|
46
|
+
meta: IProfileMeta;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Result of the TxDialog interaction.
|
|
51
|
+
*/
|
|
52
|
+
export interface TxDialogResult {
|
|
53
|
+
action: "submitted" | "signed" | "cancelled";
|
|
54
|
+
txId?: string; // present only if action === 'submitted'
|
|
55
|
+
tx: Core.Transaction; // the (potentially signed) transaction
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Options for TxDialog.
|
|
60
|
+
*/
|
|
61
|
+
export interface TxDialogOptions {
|
|
62
|
+
beforeSign?: () => Promise<void>;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Error thrown when user cancels a prompt via Escape key.
|
|
67
|
+
*/
|
|
68
|
+
export class UserCancelledError extends Error {
|
|
69
|
+
constructor(message: string = "User cancelled the operation") {
|
|
70
|
+
super(message);
|
|
71
|
+
this.name = "UserCancelledError";
|
|
72
|
+
}
|
|
73
|
+
}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wallet and provider setup utilities.
|
|
3
|
+
* Functions for creating providers, wallets, and Blaze instances.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { Blockfrost, type Provider } from "@blaze-cardano/query";
|
|
7
|
+
import {
|
|
8
|
+
Blaze,
|
|
9
|
+
ColdWallet,
|
|
10
|
+
Core,
|
|
11
|
+
HotWallet,
|
|
12
|
+
type Wallet,
|
|
13
|
+
} from "@blaze-cardano/sdk";
|
|
14
|
+
import { wordlist } from "@blaze-cardano/core";
|
|
15
|
+
import { confirmCancellable } from "./prompts.js";
|
|
16
|
+
import { UserCancelledError, type TExact } from "./types.js";
|
|
17
|
+
import {
|
|
18
|
+
NetworkSchema,
|
|
19
|
+
ProviderSettingsSchema,
|
|
20
|
+
WalletSettingsSchema,
|
|
21
|
+
} from "./schemas.js";
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Creates a blockchain data provider based on settings.
|
|
25
|
+
*/
|
|
26
|
+
export async function GetProvider(
|
|
27
|
+
network: TExact<typeof NetworkSchema>,
|
|
28
|
+
settings: TExact<typeof ProviderSettingsSchema>,
|
|
29
|
+
): Promise<Provider> {
|
|
30
|
+
switch (settings.type) {
|
|
31
|
+
case "blockfrost":
|
|
32
|
+
return new Blockfrost({
|
|
33
|
+
network: `cardano-${network}`,
|
|
34
|
+
projectId: settings.projectId,
|
|
35
|
+
});
|
|
36
|
+
case "maestro":
|
|
37
|
+
// Dynamic import - Maestro may or may not be exported depending on @blaze-cardano/query version
|
|
38
|
+
const queryModule = (await import("@blaze-cardano/query")) as any;
|
|
39
|
+
if (!queryModule.Maestro) {
|
|
40
|
+
throw new Error(
|
|
41
|
+
"Maestro is not available in the installed version of @blaze-cardano/query. Please install a version that includes Maestro support.",
|
|
42
|
+
);
|
|
43
|
+
}
|
|
44
|
+
return new queryModule.Maestro({
|
|
45
|
+
network: network as "mainnet" | "preview" | "preprod",
|
|
46
|
+
apiKey: settings.apiKey,
|
|
47
|
+
});
|
|
48
|
+
default:
|
|
49
|
+
throw new Error("Invalid provider type");
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Creates a wallet instance based on settings.
|
|
55
|
+
*/
|
|
56
|
+
export async function GetWallet(
|
|
57
|
+
settings: TExact<typeof WalletSettingsSchema>,
|
|
58
|
+
provider: Provider,
|
|
59
|
+
): Promise<Wallet> {
|
|
60
|
+
switch (settings.type) {
|
|
61
|
+
case "hot":
|
|
62
|
+
return HotWallet.fromMasterkey(
|
|
63
|
+
Core.Bip32PrivateKeyHex(settings.privateKey),
|
|
64
|
+
provider,
|
|
65
|
+
provider.network,
|
|
66
|
+
);
|
|
67
|
+
case "cold":
|
|
68
|
+
return new ColdWallet(
|
|
69
|
+
Core.Address.fromBech32(settings.address),
|
|
70
|
+
provider.network,
|
|
71
|
+
provider,
|
|
72
|
+
);
|
|
73
|
+
default:
|
|
74
|
+
throw new Error("Invalid wallet type");
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Creates a Blaze instance with provider and wallet.
|
|
80
|
+
*/
|
|
81
|
+
export async function GetBlaze(
|
|
82
|
+
network: TExact<typeof NetworkSchema>,
|
|
83
|
+
providerSettings: TExact<typeof ProviderSettingsSchema>,
|
|
84
|
+
walletSettings: TExact<typeof WalletSettingsSchema>,
|
|
85
|
+
): Promise<Blaze<Provider, Wallet>> {
|
|
86
|
+
const provider = await GetProvider(network, providerSettings);
|
|
87
|
+
const wallet = await GetWallet(walletSettings, provider);
|
|
88
|
+
return Blaze.from(provider, wallet);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Generates a new wallet from a BIP39 mnemonic phrase.
|
|
93
|
+
* Displays the 24-word recovery phrase and requires user confirmation.
|
|
94
|
+
* @returns The Bip32PrivateKey hex string for storage
|
|
95
|
+
*/
|
|
96
|
+
export async function generateWalletFromMnemonic(): Promise<string> {
|
|
97
|
+
const mnemonic = Core.generateMnemonic(wordlist, 256); // 24 words
|
|
98
|
+
const words = mnemonic.split(" ");
|
|
99
|
+
|
|
100
|
+
console.log("\n=== NEW WALLET GENERATED ===\n");
|
|
101
|
+
console.log("IMPORTANT: Save these 24 words in a secure location.");
|
|
102
|
+
console.log("This is the ONLY way to recover your wallet.\n");
|
|
103
|
+
|
|
104
|
+
// Display in 4 columns
|
|
105
|
+
for (let i = 0; i < 6; i++) {
|
|
106
|
+
console.log(
|
|
107
|
+
`${(i + 1).toString().padStart(2)}. ${words[i]!.padEnd(12)} ` +
|
|
108
|
+
`${(i + 7).toString().padStart(2)}. ${words[i + 6]!.padEnd(12)} ` +
|
|
109
|
+
`${(i + 13).toString().padStart(2)}. ${words[i + 12]!.padEnd(12)} ` +
|
|
110
|
+
`${(i + 19).toString().padStart(2)}. ${words[i + 18]}`,
|
|
111
|
+
);
|
|
112
|
+
}
|
|
113
|
+
console.log("");
|
|
114
|
+
|
|
115
|
+
const confirmed = await confirmCancellable({
|
|
116
|
+
message: "Have you saved your recovery phrase?",
|
|
117
|
+
default: false,
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
if (confirmed === null) {
|
|
121
|
+
throw new UserCancelledError("Wallet generation cancelled");
|
|
122
|
+
}
|
|
123
|
+
if (!confirmed) {
|
|
124
|
+
throw new Error("Wallet generation cancelled - recovery phrase not saved");
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
const entropy = Core.mnemonicToEntropy(mnemonic, wordlist);
|
|
128
|
+
const masterKey = Core.Bip32PrivateKey.fromBip39Entropy(
|
|
129
|
+
Buffer.from(entropy),
|
|
130
|
+
"",
|
|
131
|
+
);
|
|
132
|
+
return masterKey.hex();
|
|
133
|
+
}
|