@sundaeswap/sprinkles 0.2.0 → 0.3.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.
@@ -5,9 +5,13 @@ var _index = require("../index.js");
5
5
  // Mock @inquirer/prompts
6
6
  const mockSelect = (0, _bunTest.mock)();
7
7
  const mockInput = (0, _bunTest.mock)();
8
+ const mockPassword = (0, _bunTest.mock)();
9
+ const mockConfirm = (0, _bunTest.mock)();
8
10
  _bunTest.mock.module("@inquirer/prompts", () => ({
9
11
  select: mockSelect,
10
- input: mockInput
12
+ input: mockInput,
13
+ password: mockPassword,
14
+ confirm: mockConfirm
11
15
  }));
12
16
  (0, _bunTest.describe)("FillInStruct", () => {
13
17
  let sprinkle;
@@ -127,5 +131,81 @@ _bunTest.mock.module("@inquirer/prompts", () => ({
127
131
  // Second call should have the first input as default
128
132
  (0, _bunTest.expect)(mockInput.mock.calls[1][0].default).toBe("first-input");
129
133
  });
134
+ (0, _bunTest.test)("fills a tuple with same-type elements", async () => {
135
+ const schema = _index.Type.Tuple([_index.Type.String(), _index.Type.String()]);
136
+ mockInput.mockResolvedValueOnce("policyId").mockResolvedValueOnce("assetName");
137
+ const result = await sprinkle.FillInStruct(schema);
138
+ (0, _bunTest.expect)(result).toEqual(["policyId", "assetName"]);
139
+ });
140
+ (0, _bunTest.test)("fills a tuple with mixed types", async () => {
141
+ const schema = _index.Type.Tuple([_index.Type.String(), _index.Type.BigInt()]);
142
+ mockInput.mockResolvedValueOnce("label").mockResolvedValueOnce("42");
143
+ const result = await sprinkle.FillInStruct(schema);
144
+ (0, _bunTest.expect)(result).toEqual(["label", 42n]);
145
+ });
146
+ (0, _bunTest.test)("fills a tuple with default values", async () => {
147
+ const schema = _index.Type.Tuple([_index.Type.String(), _index.Type.BigInt()]);
148
+ mockInput.mockResolvedValueOnce("new-label").mockResolvedValueOnce("99");
149
+ await sprinkle.FillInStruct(schema, ["default-label", 50n]);
150
+ (0, _bunTest.expect)(mockInput.mock.calls[0][0].default).toBe("default-label");
151
+ (0, _bunTest.expect)(mockInput.mock.calls[1][0].default).toBe("50");
152
+ });
153
+ (0, _bunTest.test)("fills a tuple nested in an object", async () => {
154
+ const schema = _index.Type.Object({
155
+ asset: _index.Type.Tuple([_index.Type.String(), _index.Type.String()])
156
+ });
157
+ mockInput.mockResolvedValueOnce("policy123").mockResolvedValueOnce("token456");
158
+ const result = await sprinkle.FillInStruct(schema);
159
+ (0, _bunTest.expect)(result).toEqual({
160
+ asset: ["policy123", "token456"]
161
+ });
162
+ });
163
+ (0, _bunTest.test)("hot wallet private key shows setup choice", async () => {
164
+ const schema = _index.Type.String({
165
+ title: "Hot Wallet Private Key"
166
+ });
167
+
168
+ // Select "existing" option
169
+ mockSelect.mockResolvedValueOnce("existing");
170
+ mockPassword.mockResolvedValueOnce("my-private-key");
171
+ const result = await sprinkle.FillInStruct(schema);
172
+
173
+ // Verify select was called with correct options
174
+ (0, _bunTest.expect)(mockSelect.mock.calls[0][0].message).toBe("Hot wallet setup:");
175
+ (0, _bunTest.expect)(mockSelect.mock.calls[0][0].choices).toEqual([{
176
+ name: "Enter existing private key",
177
+ value: "existing"
178
+ }, {
179
+ name: "Generate new wallet",
180
+ value: "generate"
181
+ }]);
182
+ (0, _bunTest.expect)(result).toBe("my-private-key");
183
+ });
184
+ (0, _bunTest.test)("hot wallet existing key prompts for password", async () => {
185
+ const schema = _index.Type.String({
186
+ title: "Hot Wallet Private Key"
187
+ });
188
+ mockSelect.mockResolvedValueOnce("existing");
189
+ mockPassword.mockResolvedValueOnce("deadbeef1234");
190
+ const result = await sprinkle.FillInStruct(schema);
191
+ (0, _bunTest.expect)(mockPassword).toHaveBeenCalledWith({
192
+ message: "Enter your private key:"
193
+ });
194
+ (0, _bunTest.expect)(result).toBe("deadbeef1234");
195
+ });
196
+ (0, _bunTest.test)("full wallet settings schema with existing key", async () => {
197
+ // Select "hot" variant
198
+ mockSelect.mockImplementationOnce(async opts => {
199
+ return opts.choices[0].value; // hot wallet object
200
+ });
201
+ // Select "existing" key option
202
+ mockSelect.mockResolvedValueOnce("existing");
203
+ mockPassword.mockResolvedValueOnce("abc123privatekey");
204
+ const result = await sprinkle.FillInStruct(_index.WalletSettingsSchema);
205
+ (0, _bunTest.expect)(result).toEqual({
206
+ type: "hot",
207
+ privateKey: "abc123privatekey"
208
+ });
209
+ });
130
210
  });
131
211
  //# sourceMappingURL=fill-in-struct.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"fill-in-struct.test.js","names":["_bunTest","require","_index","mockSelect","mock","mockInput","module","select","input","describe","sprinkle","beforeEach","schema","Type","Object","placeholder","String","Sprinkle","mockClear","test","mockResolvedValueOnce","result","FillInStruct","expect","toBe","title","calls","message","BigInt","Literal","not","toHaveBeenCalled","name","age","toEqual","Union","type","value","count","mockImplementationOnce","opts","choices","Array","default","Boolean","rejects","toThrow","outer","inner","defaults"],"sources":["../../../../src/Sprinkle/__tests__/fill-in-struct.test.ts"],"sourcesContent":["import { describe, expect, test, mock, beforeEach } from \"bun:test\";\nimport { Sprinkle, Type } from \"../index.js\";\n\n// Mock @inquirer/prompts\nconst mockSelect = mock();\nconst mockInput = mock();\n\nmock.module(\"@inquirer/prompts\", () => ({\n select: mockSelect,\n input: mockInput,\n}));\n\ndescribe(\"FillInStruct\", () => {\n let sprinkle: Sprinkle<any>;\n\n beforeEach(() => {\n const schema = Type.Object({ placeholder: Type.String() });\n sprinkle = new Sprinkle(schema, \"/tmp/test\");\n mockSelect.mockClear();\n mockInput.mockClear();\n });\n\n test(\"fills a simple string field\", async () => {\n mockInput.mockResolvedValueOnce(\"hello\");\n\n const result = await sprinkle.FillInStruct(Type.String());\n expect(result).toBe(\"hello\");\n });\n\n test(\"fills a string with title as prompt\", async () => {\n mockInput.mockResolvedValueOnce(\"world\");\n\n await sprinkle.FillInStruct(Type.String({ title: \"Enter name\" }));\n expect(mockInput.mock.calls[0][0].message).toBe(\"Enter name\");\n });\n\n test(\"fills a bigint field\", async () => {\n mockInput.mockResolvedValueOnce(\"42\");\n\n const result = await sprinkle.FillInStruct(Type.BigInt());\n expect(result).toBe(42n);\n });\n\n test(\"fills a literal field without prompting\", async () => {\n const result = await sprinkle.FillInStruct(Type.Literal(\"fixed\"));\n expect(result).toBe(\"fixed\");\n expect(mockInput).not.toHaveBeenCalled();\n expect(mockSelect).not.toHaveBeenCalled();\n });\n\n test(\"fills an object with multiple fields\", async () => {\n const schema = Type.Object({\n name: Type.String(),\n age: Type.BigInt(),\n });\n\n mockInput\n .mockResolvedValueOnce(\"Alice\")\n .mockResolvedValueOnce(\"30\");\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result).toEqual({ name: \"Alice\", age: 30n });\n });\n\n test(\"fills a union type by selecting variant then filling\", async () => {\n const schema = Type.Union([\n Type.Object({\n type: Type.Literal(\"a\"),\n value: Type.String(),\n }),\n Type.Object({\n type: Type.Literal(\"b\"),\n count: Type.BigInt(),\n }),\n ]);\n\n // Select first variant (the Object with type \"a\")\n mockSelect.mockImplementationOnce(async (opts: any) => {\n return opts.choices[0].value;\n });\n mockInput.mockResolvedValueOnce(\"test-value\");\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result).toEqual({ type: \"a\", value: \"test-value\" });\n });\n\n test(\"fills an array with items\", async () => {\n const schema = Type.Array(Type.String());\n\n mockInput.mockResolvedValueOnce(\"first\");\n mockSelect.mockResolvedValueOnce(true); // add another\n mockInput.mockResolvedValueOnce(\"second\");\n mockSelect.mockResolvedValueOnce(false); // stop\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result).toEqual([\"first\", \"second\"]);\n });\n\n test(\"fills an array with single item\", async () => {\n const schema = Type.Array(Type.String());\n\n mockInput.mockResolvedValueOnce(\"only\");\n mockSelect.mockResolvedValueOnce(false); // stop\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result).toEqual([\"only\"]);\n });\n\n test(\"uses default value for string\", async () => {\n mockInput.mockResolvedValueOnce(\"used-default\");\n\n await sprinkle.FillInStruct(\n Type.String(),\n \"my-default\" as any,\n );\n\n expect(mockInput.mock.calls[0][0].default).toBe(\"my-default\");\n });\n\n test(\"uses default value for bigint\", async () => {\n mockInput.mockResolvedValueOnce(\"99\");\n\n await sprinkle.FillInStruct(Type.BigInt(), 99n as any);\n\n expect(mockInput.mock.calls[0][0].default).toBe(\"99\");\n });\n\n test(\"throws for unsupported types\", async () => {\n expect(\n sprinkle.FillInStruct(Type.Boolean() as any),\n ).rejects.toThrow(\"Unable to fill in struct\");\n });\n\n test(\"fills nested objects\", async () => {\n const schema = Type.Object({\n outer: Type.Object({\n inner: Type.String(),\n }),\n });\n\n mockInput.mockResolvedValueOnce(\"deep-value\");\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result).toEqual({ outer: { inner: \"deep-value\" } });\n });\n\n test(\"remembers last string input as default\", async () => {\n mockInput\n .mockResolvedValueOnce(\"first-input\")\n .mockResolvedValueOnce(\"second-input\");\n\n await sprinkle.FillInStruct(Type.String());\n expect(sprinkle.defaults[\"string\"]).toBe(\"first-input\");\n\n await sprinkle.FillInStruct(Type.String());\n // Second call should have the first input as default\n expect(mockInput.mock.calls[1][0].default).toBe(\"first-input\");\n });\n});\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"fill-in-struct.test.js","names":["_bunTest","require","_index","mockSelect","mock","mockInput","mockPassword","mockConfirm","module","select","input","password","confirm","describe","sprinkle","beforeEach","schema","Type","Object","placeholder","String","Sprinkle","mockClear","test","mockResolvedValueOnce","result","FillInStruct","expect","toBe","title","calls","message","BigInt","Literal","not","toHaveBeenCalled","name","age","toEqual","Union","type","value","count","mockImplementationOnce","opts","choices","Array","default","Boolean","rejects","toThrow","outer","inner","defaults","Tuple","asset","toHaveBeenCalledWith","WalletSettingsSchema","privateKey"],"sources":["../../../../src/Sprinkle/__tests__/fill-in-struct.test.ts"],"sourcesContent":["import { describe, expect, test, mock, beforeEach, spyOn } from \"bun:test\";\nimport { Sprinkle, Type, WalletSettingsSchema } from \"../index.js\";\n\n// Mock @inquirer/prompts\nconst mockSelect = mock();\nconst mockInput = mock();\nconst mockPassword = mock();\nconst mockConfirm = mock();\n\nmock.module(\"@inquirer/prompts\", () => ({\n select: mockSelect,\n input: mockInput,\n password: mockPassword,\n confirm: mockConfirm,\n}));\n\ndescribe(\"FillInStruct\", () => {\n let sprinkle: Sprinkle<any>;\n\n beforeEach(() => {\n const schema = Type.Object({ placeholder: Type.String() });\n sprinkle = new Sprinkle(schema, \"/tmp/test\");\n mockSelect.mockClear();\n mockInput.mockClear();\n });\n\n test(\"fills a simple string field\", async () => {\n mockInput.mockResolvedValueOnce(\"hello\");\n\n const result = await sprinkle.FillInStruct(Type.String());\n expect(result).toBe(\"hello\");\n });\n\n test(\"fills a string with title as prompt\", async () => {\n mockInput.mockResolvedValueOnce(\"world\");\n\n await sprinkle.FillInStruct(Type.String({ title: \"Enter name\" }));\n expect(mockInput.mock.calls[0][0].message).toBe(\"Enter name\");\n });\n\n test(\"fills a bigint field\", async () => {\n mockInput.mockResolvedValueOnce(\"42\");\n\n const result = await sprinkle.FillInStruct(Type.BigInt());\n expect(result).toBe(42n);\n });\n\n test(\"fills a literal field without prompting\", async () => {\n const result = await sprinkle.FillInStruct(Type.Literal(\"fixed\"));\n expect(result).toBe(\"fixed\");\n expect(mockInput).not.toHaveBeenCalled();\n expect(mockSelect).not.toHaveBeenCalled();\n });\n\n test(\"fills an object with multiple fields\", async () => {\n const schema = Type.Object({\n name: Type.String(),\n age: Type.BigInt(),\n });\n\n mockInput\n .mockResolvedValueOnce(\"Alice\")\n .mockResolvedValueOnce(\"30\");\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result).toEqual({ name: \"Alice\", age: 30n });\n });\n\n test(\"fills a union type by selecting variant then filling\", async () => {\n const schema = Type.Union([\n Type.Object({\n type: Type.Literal(\"a\"),\n value: Type.String(),\n }),\n Type.Object({\n type: Type.Literal(\"b\"),\n count: Type.BigInt(),\n }),\n ]);\n\n // Select first variant (the Object with type \"a\")\n mockSelect.mockImplementationOnce(async (opts: any) => {\n return opts.choices[0].value;\n });\n mockInput.mockResolvedValueOnce(\"test-value\");\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result).toEqual({ type: \"a\", value: \"test-value\" });\n });\n\n test(\"fills an array with items\", async () => {\n const schema = Type.Array(Type.String());\n\n mockInput.mockResolvedValueOnce(\"first\");\n mockSelect.mockResolvedValueOnce(true); // add another\n mockInput.mockResolvedValueOnce(\"second\");\n mockSelect.mockResolvedValueOnce(false); // stop\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result).toEqual([\"first\", \"second\"]);\n });\n\n test(\"fills an array with single item\", async () => {\n const schema = Type.Array(Type.String());\n\n mockInput.mockResolvedValueOnce(\"only\");\n mockSelect.mockResolvedValueOnce(false); // stop\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result).toEqual([\"only\"]);\n });\n\n test(\"uses default value for string\", async () => {\n mockInput.mockResolvedValueOnce(\"used-default\");\n\n await sprinkle.FillInStruct(\n Type.String(),\n \"my-default\" as any,\n );\n\n expect(mockInput.mock.calls[0][0].default).toBe(\"my-default\");\n });\n\n test(\"uses default value for bigint\", async () => {\n mockInput.mockResolvedValueOnce(\"99\");\n\n await sprinkle.FillInStruct(Type.BigInt(), 99n as any);\n\n expect(mockInput.mock.calls[0][0].default).toBe(\"99\");\n });\n\n test(\"throws for unsupported types\", async () => {\n expect(\n sprinkle.FillInStruct(Type.Boolean() as any),\n ).rejects.toThrow(\"Unable to fill in struct\");\n });\n\n test(\"fills nested objects\", async () => {\n const schema = Type.Object({\n outer: Type.Object({\n inner: Type.String(),\n }),\n });\n\n mockInput.mockResolvedValueOnce(\"deep-value\");\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result).toEqual({ outer: { inner: \"deep-value\" } });\n });\n\n test(\"remembers last string input as default\", async () => {\n mockInput\n .mockResolvedValueOnce(\"first-input\")\n .mockResolvedValueOnce(\"second-input\");\n\n await sprinkle.FillInStruct(Type.String());\n expect(sprinkle.defaults[\"string\"]).toBe(\"first-input\");\n\n await sprinkle.FillInStruct(Type.String());\n // Second call should have the first input as default\n expect(mockInput.mock.calls[1][0].default).toBe(\"first-input\");\n });\n\n test(\"fills a tuple with same-type elements\", async () => {\n const schema = Type.Tuple([Type.String(), Type.String()]);\n\n mockInput\n .mockResolvedValueOnce(\"policyId\")\n .mockResolvedValueOnce(\"assetName\");\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result).toEqual([\"policyId\", \"assetName\"]);\n });\n\n test(\"fills a tuple with mixed types\", async () => {\n const schema = Type.Tuple([Type.String(), Type.BigInt()]);\n\n mockInput\n .mockResolvedValueOnce(\"label\")\n .mockResolvedValueOnce(\"42\");\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result).toEqual([\"label\", 42n]);\n });\n\n test(\"fills a tuple with default values\", async () => {\n const schema = Type.Tuple([Type.String(), Type.BigInt()]);\n\n mockInput\n .mockResolvedValueOnce(\"new-label\")\n .mockResolvedValueOnce(\"99\");\n\n await sprinkle.FillInStruct(schema, [\"default-label\", 50n] as any);\n\n expect(mockInput.mock.calls[0][0].default).toBe(\"default-label\");\n expect(mockInput.mock.calls[1][0].default).toBe(\"50\");\n });\n\n test(\"fills a tuple nested in an object\", async () => {\n const schema = Type.Object({\n asset: Type.Tuple([Type.String(), Type.String()]),\n });\n\n mockInput\n .mockResolvedValueOnce(\"policy123\")\n .mockResolvedValueOnce(\"token456\");\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result).toEqual({ asset: [\"policy123\", \"token456\"] });\n });\n\n test(\"hot wallet private key shows setup choice\", async () => {\n const schema = Type.String({ title: \"Hot Wallet Private Key\" });\n\n // Select \"existing\" option\n mockSelect.mockResolvedValueOnce(\"existing\");\n mockPassword.mockResolvedValueOnce(\"my-private-key\");\n\n const result = await sprinkle.FillInStruct(schema);\n\n // Verify select was called with correct options\n expect(mockSelect.mock.calls[0][0].message).toBe(\"Hot wallet setup:\");\n expect(mockSelect.mock.calls[0][0].choices).toEqual([\n { name: \"Enter existing private key\", value: \"existing\" },\n { name: \"Generate new wallet\", value: \"generate\" },\n ]);\n expect(result).toBe(\"my-private-key\");\n });\n\n test(\"hot wallet existing key prompts for password\", async () => {\n const schema = Type.String({ title: \"Hot Wallet Private Key\" });\n\n mockSelect.mockResolvedValueOnce(\"existing\");\n mockPassword.mockResolvedValueOnce(\"deadbeef1234\");\n\n const result = await sprinkle.FillInStruct(schema);\n\n expect(mockPassword).toHaveBeenCalledWith({\n message: \"Enter your private key:\",\n });\n expect(result).toBe(\"deadbeef1234\");\n });\n\n test(\"full wallet settings schema with existing key\", async () => {\n // Select \"hot\" variant\n mockSelect.mockImplementationOnce(async (opts: any) => {\n return opts.choices[0].value; // hot wallet object\n });\n // Select \"existing\" key option\n mockSelect.mockResolvedValueOnce(\"existing\");\n mockPassword.mockResolvedValueOnce(\"abc123privatekey\");\n\n const result = await sprinkle.FillInStruct(WalletSettingsSchema);\n\n expect(result).toEqual({\n type: \"hot\",\n privateKey: \"abc123privatekey\",\n });\n });\n});\n"],"mappings":"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","ignoreList":[]}
@@ -46,7 +46,7 @@ const isObject = t => t[_typebox.Kind] === "Object";
46
46
  const isRef = t => t[_typebox.Kind] === "Ref";
47
47
  const isString = t => t[_typebox.Kind] === "String";
48
48
  const isThis = t => t[_typebox.Kind] === "This";
49
- // const isTuple = (t: TSchema): t is TTuple => t[Kind] === "Tuple";
49
+ const isTuple = t => t[_typebox.Kind] === "Tuple";
50
50
  const isUnion = t => t[_typebox.Kind] === "Union";
51
51
  // const isAny = (t: TSchema): t is TAny => t[Kind] === "Any";
52
52
 
@@ -116,7 +116,8 @@ const WalletSettingsSchema = exports.WalletSettingsSchema = _typebox.Type.Union(
116
116
  type: _typebox.Type.Literal("hot"),
117
117
  privateKey: _typebox.Type.String({
118
118
  minLength: 1,
119
- title: "Hot Wallet Private Key"
119
+ title: "Hot Wallet Private Key",
120
+ sensitive: true
120
121
  })
121
122
  }), _typebox.Type.Object({
122
123
  type: _typebox.Type.Literal("cold"),
@@ -553,6 +554,35 @@ class Sprinkle {
553
554
  const wallet = await Sprinkle.GetWallet(walletSettings, provider);
554
555
  return _sdk.Blaze.from(provider, wallet);
555
556
  }
557
+
558
+ /**
559
+ * Generates a new wallet from a BIP39 mnemonic phrase.
560
+ * Displays the 24-word recovery phrase and requires user confirmation.
561
+ * @returns The Bip32PrivateKey hex string for storage
562
+ */
563
+ static async generateWalletFromMnemonic() {
564
+ const mnemonic = _sdk.Core.generateMnemonic(_core.wordlist, 256); // 24 words
565
+ const words = mnemonic.split(" ");
566
+ console.log("\n=== NEW WALLET GENERATED ===\n");
567
+ console.log("IMPORTANT: Save these 24 words in a secure location.");
568
+ console.log("This is the ONLY way to recover your wallet.\n");
569
+
570
+ // Display in 4 columns
571
+ for (let i = 0; i < 6; i++) {
572
+ console.log(`${(i + 1).toString().padStart(2)}. ${words[i].padEnd(12)} ` + `${(i + 7).toString().padStart(2)}. ${words[i + 6].padEnd(12)} ` + `${(i + 13).toString().padStart(2)}. ${words[i + 12].padEnd(12)} ` + `${(i + 19).toString().padStart(2)}. ${words[i + 18]}`);
573
+ }
574
+ console.log("");
575
+ const confirmed = await (0, _prompts.confirm)({
576
+ message: "Have you saved your recovery phrase?",
577
+ default: false
578
+ });
579
+ if (!confirmed) {
580
+ throw new Error("Wallet generation cancelled - recovery phrase not saved");
581
+ }
582
+ const entropy = _sdk.Core.mnemonicToEntropy(mnemonic, _core.wordlist);
583
+ const masterKey = _sdk.Core.Bip32PrivateKey.fromBip39Entropy(Buffer.from(entropy), "");
584
+ return masterKey.hex();
585
+ }
556
586
  static async SearchSelect(opts) {
557
587
  return (0, _prompts.search)(opts);
558
588
  }
@@ -1092,6 +1122,27 @@ class Sprinkle {
1092
1122
  return this._fillInStruct(selection, path, defs);
1093
1123
  }
1094
1124
  if (isString(type)) {
1125
+ // Special handling for hot wallet private key - offer generation option
1126
+ if (type.title === "Hot Wallet Private Key") {
1127
+ const choice = await (0, _prompts.select)({
1128
+ message: "Hot wallet setup:",
1129
+ choices: [{
1130
+ name: "Enter existing private key",
1131
+ value: "existing"
1132
+ }, {
1133
+ name: "Generate new wallet",
1134
+ value: "generate"
1135
+ }]
1136
+ });
1137
+ if (choice === "generate") {
1138
+ return Sprinkle.generateWalletFromMnemonic();
1139
+ }
1140
+ // Fall through to password prompt for "existing" choice
1141
+ const answer = await (0, _prompts.password)({
1142
+ message: "Enter your private key:"
1143
+ });
1144
+ return answer;
1145
+ }
1095
1146
  const defaultString = def ? def : this.defaults["string"];
1096
1147
  const message = Sprinkle.ExtractMessage(type, `Enter a string for ${path.join(".")}`);
1097
1148
  let answer;
@@ -1158,6 +1209,16 @@ class Sprinkle {
1158
1209
  }
1159
1210
  return arr;
1160
1211
  }
1212
+ if (isTuple(type)) {
1213
+ const items = type.items ?? [];
1214
+ const result = [];
1215
+ for (let i = 0; i < items.length; i++) {
1216
+ const itemType = items[i];
1217
+ const value = await this._fillInStruct(itemType, path.concat([`[${i}]`]), defs, def ? def[i] : undefined);
1218
+ result.push(value);
1219
+ }
1220
+ return result;
1221
+ }
1161
1222
  throw new Error(`Unable to fill in struct for type at path ${path.join(".")}`);
1162
1223
  }
1163
1224
  resolveType(type, path, defs) {