@5ive-tech/cli 1.0.4

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 (139) hide show
  1. package/README.md +226 -0
  2. package/dist/assets/vm/five_vm_wasm.d.ts +762 -0
  3. package/dist/assets/vm/five_vm_wasm.js +3754 -0
  4. package/dist/assets/vm/five_vm_wasm_bg.wasm +0 -0
  5. package/dist/assets/vm/five_vm_wasm_bg.wasm.d.ts +247 -0
  6. package/dist/assets/vm/package.json +11 -0
  7. package/dist/cli.d.ts +47 -0
  8. package/dist/cli.d.ts.map +1 -0
  9. package/dist/cli.js +343 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/commands/analyze.d.ts +3 -0
  12. package/dist/commands/analyze.d.ts.map +1 -0
  13. package/dist/commands/analyze.js +435 -0
  14. package/dist/commands/analyze.js.map +1 -0
  15. package/dist/commands/build.d.ts +3 -0
  16. package/dist/commands/build.d.ts.map +1 -0
  17. package/dist/commands/build.js +66 -0
  18. package/dist/commands/build.js.map +1 -0
  19. package/dist/commands/compile.d.ts +3 -0
  20. package/dist/commands/compile.d.ts.map +1 -0
  21. package/dist/commands/compile.js +872 -0
  22. package/dist/commands/compile.js.map +1 -0
  23. package/dist/commands/config.d.ts +3 -0
  24. package/dist/commands/config.d.ts.map +1 -0
  25. package/dist/commands/config.js +431 -0
  26. package/dist/commands/config.js.map +1 -0
  27. package/dist/commands/deploy-and-execute.d.ts +3 -0
  28. package/dist/commands/deploy-and-execute.d.ts.map +1 -0
  29. package/dist/commands/deploy-and-execute.js +317 -0
  30. package/dist/commands/deploy-and-execute.js.map +1 -0
  31. package/dist/commands/deploy.d.ts +21 -0
  32. package/dist/commands/deploy.d.ts.map +1 -0
  33. package/dist/commands/deploy.js +806 -0
  34. package/dist/commands/deploy.js.map +1 -0
  35. package/dist/commands/donate.d.ts +4 -0
  36. package/dist/commands/donate.d.ts.map +1 -0
  37. package/dist/commands/donate.js +104 -0
  38. package/dist/commands/donate.js.map +1 -0
  39. package/dist/commands/execute.d.ts +6 -0
  40. package/dist/commands/execute.d.ts.map +1 -0
  41. package/dist/commands/execute.js +749 -0
  42. package/dist/commands/execute.js.map +1 -0
  43. package/dist/commands/fmt.d.ts +3 -0
  44. package/dist/commands/fmt.d.ts.map +1 -0
  45. package/dist/commands/fmt.js +327 -0
  46. package/dist/commands/fmt.js.map +1 -0
  47. package/dist/commands/help.d.ts +6 -0
  48. package/dist/commands/help.d.ts.map +1 -0
  49. package/dist/commands/help.js +224 -0
  50. package/dist/commands/help.js.map +1 -0
  51. package/dist/commands/index.d.ts +45 -0
  52. package/dist/commands/index.d.ts.map +1 -0
  53. package/dist/commands/index.js +119 -0
  54. package/dist/commands/index.js.map +1 -0
  55. package/dist/commands/init.d.ts +3 -0
  56. package/dist/commands/init.d.ts.map +1 -0
  57. package/dist/commands/init.js +887 -0
  58. package/dist/commands/init.js.map +1 -0
  59. package/dist/commands/local.d.ts +3 -0
  60. package/dist/commands/local.d.ts.map +1 -0
  61. package/dist/commands/local.js +703 -0
  62. package/dist/commands/local.js.map +1 -0
  63. package/dist/commands/namespace.d.ts +3 -0
  64. package/dist/commands/namespace.d.ts.map +1 -0
  65. package/dist/commands/namespace.js +328 -0
  66. package/dist/commands/namespace.js.map +1 -0
  67. package/dist/commands/template.d.ts +4 -0
  68. package/dist/commands/template.d.ts.map +1 -0
  69. package/dist/commands/template.js +486 -0
  70. package/dist/commands/template.js.map +1 -0
  71. package/dist/commands/test.d.ts +6 -0
  72. package/dist/commands/test.d.ts.map +1 -0
  73. package/dist/commands/test.js +890 -0
  74. package/dist/commands/test.js.map +1 -0
  75. package/dist/commands/version.d.ts +6 -0
  76. package/dist/commands/version.d.ts.map +1 -0
  77. package/dist/commands/version.js +339 -0
  78. package/dist/commands/version.js.map +1 -0
  79. package/dist/config/ConfigManager.d.ts +69 -0
  80. package/dist/config/ConfigManager.d.ts.map +1 -0
  81. package/dist/config/ConfigManager.js +261 -0
  82. package/dist/config/ConfigManager.js.map +1 -0
  83. package/dist/config/index.d.ts +10 -0
  84. package/dist/config/index.d.ts.map +1 -0
  85. package/dist/config/index.js +21 -0
  86. package/dist/config/index.js.map +1 -0
  87. package/dist/config/types.d.ts +35 -0
  88. package/dist/config/types.d.ts.map +1 -0
  89. package/dist/config/types.js +105 -0
  90. package/dist/config/types.js.map +1 -0
  91. package/dist/index.d.ts +3 -0
  92. package/dist/index.d.ts.map +1 -0
  93. package/dist/index.js +29 -0
  94. package/dist/index.js.map +1 -0
  95. package/dist/project/ProjectLoader.d.ts +12 -0
  96. package/dist/project/ProjectLoader.d.ts.map +1 -0
  97. package/dist/project/ProjectLoader.js +115 -0
  98. package/dist/project/ProjectLoader.js.map +1 -0
  99. package/dist/types.d.ts +334 -0
  100. package/dist/types.d.ts.map +1 -0
  101. package/dist/types.js +2 -0
  102. package/dist/types.js.map +1 -0
  103. package/dist/utils/AccountFixtureGenerator.d.ts +48 -0
  104. package/dist/utils/AccountFixtureGenerator.d.ts.map +1 -0
  105. package/dist/utils/AccountFixtureGenerator.js +265 -0
  106. package/dist/utils/AccountFixtureGenerator.js.map +1 -0
  107. package/dist/utils/FiveFileManager.d.ts +96 -0
  108. package/dist/utils/FiveFileManager.d.ts.map +1 -0
  109. package/dist/utils/FiveFileManager.js +329 -0
  110. package/dist/utils/FiveFileManager.js.map +1 -0
  111. package/dist/utils/ascii-art.d.ts +72 -0
  112. package/dist/utils/ascii-art.d.ts.map +1 -0
  113. package/dist/utils/ascii-art.js +314 -0
  114. package/dist/utils/ascii-art.js.map +1 -0
  115. package/dist/utils/cli-ui.d.ts +39 -0
  116. package/dist/utils/cli-ui.d.ts.map +1 -0
  117. package/dist/utils/cli-ui.js +75 -0
  118. package/dist/utils/cli-ui.js.map +1 -0
  119. package/dist/utils/fileUtils.d.ts +25 -0
  120. package/dist/utils/fileUtils.d.ts.map +1 -0
  121. package/dist/utils/fileUtils.js +50 -0
  122. package/dist/utils/fileUtils.js.map +1 -0
  123. package/dist/utils/logger.d.ts +53 -0
  124. package/dist/utils/logger.d.ts.map +1 -0
  125. package/dist/utils/logger.js +287 -0
  126. package/dist/utils/logger.js.map +1 -0
  127. package/dist/wasm/compiler.d.ts +101 -0
  128. package/dist/wasm/compiler.d.ts.map +1 -0
  129. package/dist/wasm/compiler.js +906 -0
  130. package/dist/wasm/compiler.js.map +1 -0
  131. package/dist/wasm/loader.d.ts +2 -0
  132. package/dist/wasm/loader.d.ts.map +1 -0
  133. package/dist/wasm/loader.js +90 -0
  134. package/dist/wasm/loader.js.map +1 -0
  135. package/dist/wasm/vm.d.ts +32 -0
  136. package/dist/wasm/vm.d.ts.map +1 -0
  137. package/dist/wasm/vm.js +440 -0
  138. package/dist/wasm/vm.js.map +1 -0
  139. package/package.json +100 -0
@@ -0,0 +1,486 @@
1
+ // Generate starter Five DSL (.v) templates for common patterns.
2
+ import { mkdir, writeFile, access, readFile } from 'fs/promises';
3
+ import { join, resolve, dirname } from 'path';
4
+ import { fileURLToPath } from 'url';
5
+ import ora from 'ora';
6
+ import { success as uiSuccess, warning as uiWarning, uiColors } from '../utils/cli-ui.js';
7
+ export const templateCommand = {
8
+ name: 'template',
9
+ description: 'Generate Five DSL templates (vault, escrow, amm, token, nft, nft-globals). Note: nft-globals assumes metadata is set globally and only handles transfers.',
10
+ aliases: ['tmpl', 'scaffold'],
11
+ options: [
12
+ {
13
+ flags: '-t, --type <name>',
14
+ description: 'Template type',
15
+ choices: ['vault', 'escrow', 'amm', 'token', 'nft', 'nft-globals', 'multisig', 'vesting', 'auction-english', 'staking', 'airdrop-merkle', 'system-lamports', 'interface', 'spl-token'],
16
+ required: false,
17
+ },
18
+ {
19
+ flags: '--all',
20
+ description: 'Generate all templates',
21
+ defaultValue: false,
22
+ },
23
+ {
24
+ flags: '-o, --out-dir <dir>',
25
+ description: 'Output directory',
26
+ defaultValue: '.',
27
+ },
28
+ {
29
+ flags: '-f, --force',
30
+ description: 'Overwrite existing files',
31
+ defaultValue: false,
32
+ },
33
+ ],
34
+ arguments: [
35
+ {
36
+ name: 'name',
37
+ description: 'Optional base filename (without extension) when generating single template',
38
+ required: false,
39
+ },
40
+ ],
41
+ examples: [
42
+ {
43
+ command: 'five template --type vault',
44
+ description: 'Generate a vault.v template in current directory',
45
+ },
46
+ {
47
+ command: 'five template --type escrow -o examples',
48
+ description: 'Generate escrow.v under examples/',
49
+ },
50
+ {
51
+ command: 'five template --all -o templates',
52
+ description: 'Generate all templates into templates/',
53
+ },
54
+ {
55
+ command: 'five template --type token my_token',
56
+ description: 'Generate my_token.v for a single template',
57
+ },
58
+ {
59
+ command: 'five template --type nft-globals',
60
+ description: 'Generate nft-globals.v (transfer-only; metadata assumed pre-set)',
61
+ },
62
+ // Quickstart flows (Token)
63
+ {
64
+ command: '# Token: generate → compile → run locally',
65
+ description: '—',
66
+ },
67
+ {
68
+ command: 'five template --type token -o templates',
69
+ description: 'Create token.v in ./templates',
70
+ },
71
+ {
72
+ command: 'five compile templates/token.v -o build/token.bin',
73
+ description: 'Compile to bytecode (.bin)',
74
+ },
75
+ {
76
+ command: 'five execute build/token.bin --local',
77
+ description: 'Local WASM execution (use -f to pick a function index)',
78
+ },
79
+ // Quickstart flows (AMM)
80
+ {
81
+ command: '# AMM: generate → compile → run locally',
82
+ description: '—',
83
+ },
84
+ {
85
+ command: 'five template --type amm -o templates',
86
+ description: 'Create amm.v in ./templates',
87
+ },
88
+ {
89
+ command: 'five compile templates/amm.v -o build/amm.bin',
90
+ description: 'Compile AMM template',
91
+ },
92
+ {
93
+ command: 'five execute build/amm.bin --local',
94
+ description: 'Local WASM execution for AMM',
95
+ },
96
+ // Quickstart flows (NFT)
97
+ {
98
+ command: '# NFT: generate → compile → run locally',
99
+ description: '—',
100
+ },
101
+ {
102
+ command: 'five template --type nft -o templates',
103
+ description: 'Create nft.v in ./templates',
104
+ },
105
+ {
106
+ command: 'five compile templates/nft.v -o build/nft.bin',
107
+ description: 'Compile NFT template',
108
+ },
109
+ {
110
+ command: 'five execute build/nft.bin --local',
111
+ description: 'Local WASM execution for NFT',
112
+ },
113
+ // Deploy + on-chain execution (mainnet)
114
+ {
115
+ command: '# Deploy + execute on-chain (generic)',
116
+ description: '—',
117
+ },
118
+ {
119
+ command: 'five deploy build/token.bin --target mainnet',
120
+ description: 'Deploy compiled bytecode to mainnet',
121
+ },
122
+ {
123
+ command: 'five execute --script-account <ACCOUNT_ID> -f 0 --target mainnet',
124
+ description: 'Execute function 0 of deployed script (replace <ACCOUNT_ID>)',
125
+ },
126
+ ],
127
+ handler: async (args, options, context) => {
128
+ const { logger } = context;
129
+ const outDir = resolve(options.outDir || options['out-dir'] || '.');
130
+ const baseNameArg = args[0];
131
+ const force = !!options.force;
132
+ const all = !!options.all;
133
+ const type = options.type;
134
+ if (!all && !type) {
135
+ logger.error('Please specify --type <vault|escrow|amm|token|nft|nft-globals> or use --all');
136
+ throw new Error('Template type not specified');
137
+ }
138
+ // Determine which templates to generate
139
+ const templates = all
140
+ ? ['vault', 'escrow', 'amm', 'token', 'nft', 'nft-globals', 'multisig', 'vesting', 'auction-english', 'staking', 'airdrop-merkle', 'system-lamports', 'interface', 'spl-token']
141
+ : [type];
142
+ const spinner = ora(`Generating ${all ? 'all templates' : `${type} template`}...`).start();
143
+ try {
144
+ await mkdir(outDir, { recursive: true });
145
+ const results = [];
146
+ for (const t of templates) {
147
+ const filename = buildFilename(t, baseNameArg);
148
+ const filepath = join(outDir, filename);
149
+ const content = await getTemplateContent(t);
150
+ const created = await writeFileSafe(filepath, content, force);
151
+ results.push({ file: filepath, created });
152
+ }
153
+ spinner.succeed('Template generation complete');
154
+ for (const r of results) {
155
+ if (r.created) {
156
+ console.log(`${uiSuccess('Created')} ${uiColors.info(r.file)}`);
157
+ }
158
+ else {
159
+ console.log(uiWarning(`Skipped (exists): ${r.file}`));
160
+ }
161
+ }
162
+ console.log('\nNext steps:');
163
+ console.log(`- Edit generated .v files to fit your use case`);
164
+ console.log(`- Compile: ${uiColors.info('five compile <file>.v')}`);
165
+ console.log(`- Execute locally: ${uiColors.info('five execute <file>.five --local')}`);
166
+ }
167
+ catch (err) {
168
+ spinner.fail('Failed to generate templates');
169
+ logger.error(err.message);
170
+ throw err;
171
+ }
172
+ },
173
+ };
174
+ function buildFilename(type, base) {
175
+ if (base && base.trim().length > 0) {
176
+ return `${base.trim()}.v`;
177
+ }
178
+ return `${type}.v`;
179
+ }
180
+ async function writeFileSafe(path, content, force) {
181
+ try {
182
+ if (!force) {
183
+ await access(path);
184
+ // Exists and not forcing
185
+ return false;
186
+ }
187
+ }
188
+ catch {
189
+ // Does not exist, proceed
190
+ }
191
+ await writeFile(path, content);
192
+ return true;
193
+ }
194
+ async function getTemplateContent(name) {
195
+ // Prefer external template files for easier debugging and iteration
196
+ try {
197
+ const __filename = fileURLToPath(import.meta.url);
198
+ const __dirname = dirname(__filename); // .../dist/commands at runtime
199
+ const candidatePaths = [
200
+ // When running from dist
201
+ resolve(__dirname, '../templates', `${name}.v`),
202
+ // When running from src via ts-node or tests
203
+ resolve(__dirname, '../../src/templates', `${name}.v`),
204
+ // When executed from repository root
205
+ resolve(process.cwd(), 'templates', `${name}.v`),
206
+ ];
207
+ for (const p of candidatePaths) {
208
+ try {
209
+ const data = await readFile(p, 'utf8');
210
+ if (data && data.trim().length > 0)
211
+ return data;
212
+ }
213
+ catch {
214
+ // try next
215
+ }
216
+ }
217
+ }
218
+ catch {
219
+ // ignore and fall back to inline
220
+ }
221
+ // Fallback to inline templates if files not found
222
+ switch (name) {
223
+ case 'vault':
224
+ return TEMPLATE_VAULT;
225
+ case 'escrow':
226
+ return TEMPLATE_ESCROW;
227
+ case 'amm':
228
+ return TEMPLATE_AMM;
229
+ case 'token':
230
+ return TEMPLATE_TOKEN;
231
+ case 'nft':
232
+ return TEMPLATE_NFT;
233
+ case 'nft-globals':
234
+ // Minimal inline fallback; prefer file template
235
+ return `// NFT (globals) inline fallback\nmut collection_symbol: string;\nmut base_uri: string;\naccount NFT { token_id: pubkey; owner_key: pubkey; uri: string; }\nconfigure(symbol: string, base: string) { collection_symbol = symbol; base_uri = base; }\nmint_from_globals(state: NFT @mut, owner: pubkey) { state.token_id = owner; state.owner_key = owner; state.uri = base_uri; }\n`;
236
+ case 'multisig':
237
+ return `account MultisigState { threshold: u8; approvals: u64; last_proposal_id: u64; proposal_hash: u64; executed: bool; }\ninit_multisig(state: MultisigState @mut, t: u8) { state.threshold = t; state.approvals = 0; state.last_proposal_id = 0; state.proposal_hash = 0; state.executed = false; }\nopen_proposal(state: MultisigState @mut, h: u64) { state.last_proposal_id = state.last_proposal_id + 1; state.proposal_hash = h; state.approvals = 0; state.executed = false; }\napprove(state: MultisigState @mut) { state.approvals = state.approvals + 1; }\nexecute(state: MultisigState @mut) { require(!state.executed); require(state.approvals >= state.threshold); state.executed = true; }\n`;
238
+ case 'vesting':
239
+ return `account VestingState { beneficiary: pubkey; start_time: u64; cliff_seconds: u64; duration_seconds: u64; total_amount: u64; released_amount: u64; }\ninit_vesting(state: VestingState @mut, b: pubkey, s: u64, c: u64, d: u64, t: u64) { state.beneficiary = b; state.start_time = s; state.cliff_seconds = c; state.duration_seconds = d; state.total_amount = t; state.released_amount = 0; }\nrelease(state: VestingState @mut, amount: u64) -> u64 { require(amount > 0); state.released_amount = state.released_amount + amount; return amount; }\n`;
240
+ case 'auction-english':
241
+ return `account AuctionState { seller: pubkey; end_time: u64; min_increment: u64; highest_bid: u64; highest_bidder: pubkey; settled: bool; }\ninit_auction(state: AuctionState @mut, s: pubkey, e: u64, m: u64, r: u64) { state.seller = s; state.end_time = e; state.min_increment = m; state.highest_bid = r; state.highest_bidder = s; state.settled = false; }\nbid(state: AuctionState @mut, b: pubkey, a: u64) { let now = get_clock(); require(now < state.end_time); require(a >= state.highest_bid + state.min_increment); state.highest_bid = a; state.highest_bidder = b; }\nsettle(state: AuctionState @mut) { let now = get_clock(); require(now >= state.end_time); require(!state.settled); state.settled = true; }\n`;
242
+ case 'staking':
243
+ return `account Pool { reward_rate_per_slot: u64; last_update_slot: u64; acc_reward_per_share: u64; scale: u64; }\naccount StakeAccount { owner_key: pubkey; amount: u64; reward_debt: u64; }\ninit_pool(state: Pool @mut, r: u64, sc: u64) { state.reward_rate_per_slot = r; state.last_update_slot = get_clock(); state.acc_reward_per_share = 0; state.scale = sc; }\naccrue(state: Pool @mut, slots: u64) { state.acc_reward_per_share = state.acc_reward_per_share + (state.reward_rate_per_slot * slots); state.last_update_slot = state.last_update_slot + slots; }\ninit_staker(state: StakeAccount @mut, o: pubkey) { state.owner_key = o; state.amount = 0; state.reward_debt = 0; }\nstake(state: StakeAccount @mut, o: pubkey, a: u64, acc: u64) { require(state.owner_key == o); state.reward_debt = state.reward_debt + (a * acc); state.amount = state.amount + a; }\nunstake(state: StakeAccount @mut, o: pubkey, a: u64, acc: u64) { require(state.owner_key == o); require(state.amount >= a); state.amount = state.amount - a; state.reward_debt = state.reward_debt - (a * acc); }\nclaimable(state: StakeAccount, acc: u64) -> u64 { let accrued = state.amount * acc; if (accrued <= state.reward_debt) { return 0; } return accrued - state.reward_debt; }\nrecord_claim(state: StakeAccount @mut, c: u64) { state.reward_debt = state.reward_debt + c; }\n`;
244
+ case 'airdrop-merkle':
245
+ return `account AirdropConfig { merkle_root: u64; total_claimed: u64; }\naccount ClaimRecord { claimer: pubkey; amount: u64; claimed: bool; }\ninit_airdrop(state: AirdropConfig @mut, r: u64) { state.merkle_root = r; state.total_claimed = 0; }\nclaim(state: ClaimRecord @mut, c: pubkey, a: u64, expected: u64, cfg_root: u64) { require(expected == cfg_root); require(!state.claimed); state.claimer = c; state.amount = a; state.claimed = true; }\n`;
246
+ case 'system-lamports':
247
+ return `quote_transfer(from: account, to: account, amount: u64) -> (u64, u64) { require(amount > 0); require(from.lamports >= amount); let nf = from.lamports - amount; let nt = to.lamports + amount; return (nf, nt); }\ncheck_min_balance(acc: account, min: u64) -> bool { return acc.lamports >= min; }\ntopup_needed(acc: account, min: u64) -> u64 { if (acc.lamports >= min) { return 0; } return min - acc.lamports; }\n`;
248
+ case 'interface':
249
+ return `interface ExampleProgram @program("11111111111111111111111111111111") { do_thing @discriminator(1) (arg: u64); }\ncall_example(target: account @signer, value: u64) { ExampleProgram.do_thing(value); }\n`;
250
+ case 'spl-token':
251
+ return `interface SPLToken @program("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA") { initialize_mint @discriminator(0) (mint: pubkey, decimals: u8, authority: pubkey, freeze_authority: pubkey); mint_to @discriminator(7) (mint: pubkey, to: pubkey, authority: pubkey, amount: u64); }\ncreate_mint(payer: account @signer, mint: account @init, decimals: u8) -> pubkey { SPLToken.initialize_mint(mint, decimals, payer, payer); return mint; }\nmint_tokens(mint: account @mut, dest: account @mut, amount: u64) { SPLToken.mint_to(mint, dest, mint, amount); }\n`;
252
+ }
253
+ }
254
+ // --- Templates ---
255
+ const COMMON_HEADER = `// Generated by five template
256
+ // Starter template in Five DSL. Adjust constraints and accounts
257
+ // to match your application and follow state layout best practices.
258
+ `;
259
+ const TEMPLATE_VAULT = `${COMMON_HEADER}
260
+ // Vault template: lamport custody via System Program CPI
261
+
262
+ // System Program interface for lamports transfer
263
+ interface SystemProgram @program("11111111111111111111111111111112") {
264
+ create_account @discriminator(0) (from: pubkey, to: pubkey, lamports: u64, space: u64, owner: pubkey);
265
+ assign @discriminator(1) (account: pubkey, owner: pubkey);
266
+ transfer_lamports @discriminator(2) (from: pubkey, to: pubkey, lamports: u64);
267
+ }
268
+
269
+ account VaultState {
270
+ balance: u64;
271
+ authorized_user: pubkey;
272
+ }
273
+
274
+ // Initialize vault state (sets authority; vault_account provided during deposit/withdraw)
275
+ init_vault(state: VaultState @mut, authority: account @signer) {
276
+ state.balance = 0;
277
+ state.authorized_user = authority.key;
278
+ }
279
+
280
+ // Deposit lamports into the vault: transfer from payer to vault_account
281
+ // - payer: signer funding the deposit
282
+ // - vault_account: the on-chain account holding lamports for the vault
283
+ // Updates internal balance for accounting
284
+ deposit(state: VaultState @mut, payer: account @signer @mut, vault_account: account @mut, amount: u64) {
285
+ require(amount > 0);
286
+ SystemProgram.transfer_lamports(payer, vault_account, amount);
287
+ state.balance = state.balance + amount;
288
+ }
289
+
290
+ // Withdraw lamports from the vault to a recipient (requires authority)
291
+ // - authority: must match configured authorized_user
292
+ // - vault_account: source of lamports (vault's account)
293
+ // - recipient: destination account to receive lamports
294
+ withdraw(state: VaultState @mut, authority: account @signer, vault_account: account @mut, recipient: account @mut, amount: u64) {
295
+ require(state.authorized_user == authority.key);
296
+ require(state.balance >= amount);
297
+ SystemProgram.transfer_lamports(vault_account, recipient, amount);
298
+ state.balance = state.balance - amount;
299
+ }
300
+ `;
301
+ const TEMPLATE_ESCROW = `${COMMON_HEADER}
302
+ // Escrow template: maker locks funds for a designated taker
303
+
304
+ account EscrowState {
305
+ maker: pubkey;
306
+ taker: pubkey;
307
+ amount: u64;
308
+ is_funded: bool;
309
+ is_settled: bool;
310
+ }
311
+
312
+ init_escrow(state: EscrowState @mut, maker: account @signer, taker: pubkey, amount: u64) {
313
+ state.maker = maker.key;
314
+ state.taker = taker;
315
+ state.amount = amount;
316
+ state.is_funded = false;
317
+ state.is_settled = false;
318
+ }
319
+
320
+ fund_escrow(state: EscrowState @mut, maker: account @signer, amount: u64) {
321
+ require(state.maker == maker.key);
322
+ require(amount == state.amount);
323
+ state.is_funded = true;
324
+ }
325
+
326
+ claim_escrow(state: EscrowState @mut, taker: account @signer) {
327
+ require(state.is_funded);
328
+ require(!state.is_settled);
329
+ require(state.taker == taker.key);
330
+ state.is_settled = true;
331
+ }
332
+
333
+ cancel_escrow(state: EscrowState @mut, maker: account @signer) {
334
+ require(!state.is_settled);
335
+ require(state.maker == maker.key);
336
+ state.is_funded = false;
337
+ }
338
+ `;
339
+ const TEMPLATE_AMM = `${COMMON_HEADER}
340
+ // Constant-product AMM template (x*y=k) with simple fee
341
+
342
+ account Pool {
343
+ token_a: u64;
344
+ token_b: u64;
345
+ total_shares: u64;
346
+ fee_bps: u64;
347
+ }
348
+
349
+ init_pool(state: Pool @mut, fee_bps: u64) {
350
+ state.token_a = 0;
351
+ state.token_b = 0;
352
+ state.total_shares = 0;
353
+ state.fee_bps = fee_bps;
354
+ }
355
+
356
+ add_liquidity(state: Pool @mut, amount_a: u64, amount_b: u64) -> u64 {
357
+ // Share calc for template
358
+ let shares = amount_a;
359
+ state.token_a = state.token_a + amount_a;
360
+ state.token_b = state.token_b + amount_b;
361
+ state.total_shares = state.total_shares + shares;
362
+ return shares;
363
+ }
364
+
365
+ swap(state: Pool @mut, amount_in: u64, a_for_b: bool) -> u64 {
366
+ // Skeleton implementation for validator compatibility
367
+ let fee = (amount_in * state.fee_bps) / 10000;
368
+ let net_in = amount_in - fee;
369
+ // No state changes to avoid multi-account/multi-branch rules in validator
370
+ return net_in;
371
+ }
372
+
373
+ // Quote liquidity shares without mutating state
374
+ quote_add_liquidity(state: Pool, amount_a: u64, amount_b: u64) -> u64 {
375
+ if (amount_b < amount_a) {
376
+ return amount_b;
377
+ }
378
+ return amount_a;
379
+ }
380
+
381
+ // Remove liquidity (simplified)
382
+ remove_liquidity(state: Pool @mut, share: u64) -> u64 {
383
+ require(state.total_shares >= share);
384
+ state.total_shares = state.total_shares - share;
385
+ return share;
386
+ }
387
+ `;
388
+ const TEMPLATE_TOKEN = `${COMMON_HEADER}
389
+ // Fungible token template with simple mint and transfer
390
+
391
+ account Mint {
392
+ authority: pubkey;
393
+ supply: u64;
394
+ decimals: u8;
395
+ }
396
+
397
+ account TokenAccount {
398
+ owner_key: pubkey;
399
+ bal: u64;
400
+ }
401
+
402
+ // Initialize mint state
403
+ init_mint(state: Mint @mut, authority: pubkey, decimals: u8) {
404
+ state.authority = authority;
405
+ state.supply = 0;
406
+ state.decimals = decimals;
407
+ }
408
+
409
+ // Initialize a token account
410
+ init_account(state: TokenAccount @mut, owner: pubkey) {
411
+ state.owner_key = owner;
412
+ state.bal = 0;
413
+ }
414
+
415
+ // Split flows to satisfy current validator constraints
416
+ mint_increase_supply(state: Mint @mut, authority: pubkey, amount: u64) {
417
+ require(state.authority == authority);
418
+ state.supply = state.supply + amount;
419
+ }
420
+
421
+ credit_account(state: TokenAccount @mut, amount: u64) {
422
+ state.bal = state.bal + amount;
423
+ }
424
+
425
+ debit_account(state: TokenAccount @mut, signer: pubkey, amount: u64) {
426
+ require(state.owner_key == signer);
427
+ require(state.bal >= amount);
428
+ state.bal = state.bal - amount;
429
+ }
430
+
431
+ credit_after_debit(state: TokenAccount @mut, amount: u64) {
432
+ state.bal = state.bal + amount;
433
+ }
434
+
435
+ // Burn reduces supply
436
+ burn_supply(state: Mint @mut, authority: pubkey, amount: u64) {
437
+ require(state.authority == authority);
438
+ require(state.supply >= amount);
439
+ state.supply = state.supply - amount;
440
+ }
441
+
442
+ // Change mint authority
443
+ set_mint_authority(state: Mint @mut, current: pubkey, new_auth: pubkey) {
444
+ require(state.authority == current);
445
+ state.authority = new_auth;
446
+ }
447
+
448
+ // Read-only helpers
449
+ get_supply(state: Mint) -> u64 { return state.supply; }
450
+ get_balance(state: TokenAccount) -> u64 { return state.bal; }
451
+ `;
452
+ const TEMPLATE_NFT = `${COMMON_HEADER}
453
+ // NFT template with simple mint and transfer
454
+
455
+ account NFT {
456
+ token_id: pubkey;
457
+ owner_key: pubkey;
458
+ uri: string;
459
+ }
460
+
461
+ // Initialize NFT fields
462
+ mint_nft(state: NFT @mut, owner: pubkey, uri: string) {
463
+ // For template simplicity, assign token_id deterministically
464
+ state.token_id = owner;
465
+ state.owner_key = owner;
466
+ state.uri = uri;
467
+ }
468
+
469
+ // Transfer ownership
470
+ transfer_nft(state: NFT @mut, from: pubkey, to: pubkey) {
471
+ require(state.owner_key == from);
472
+ state.owner_key = to;
473
+ }
474
+
475
+ // Update token metadata URI
476
+ set_uri(state: NFT @mut, owner: pubkey, new_uri: string) {
477
+ require(state.owner_key == owner);
478
+ state.uri = new_uri;
479
+ }
480
+
481
+ // Read-only helpers
482
+ get_uri(state: NFT) -> string { return state.uri; }
483
+ get_owner(state: NFT) -> pubkey { return state.owner_key; }
484
+ `;
485
+ export default templateCommand;
486
+ //# sourceMappingURL=template.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template.js","sourceRoot":"","sources":["../../src/commands/template.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAEhE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,OAAO,IAAI,SAAS,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAS1F,MAAM,CAAC,MAAM,eAAe,GAAsB;IAChD,IAAI,EAAE,UAAU;IAChB,WAAW,EAAE,2JAA2J;IACxK,OAAO,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC;IAE7B,OAAO,EAAE;QACP;YACE,KAAK,EAAE,mBAAmB;YAC1B,WAAW,EAAE,eAAe;YAC5B,OAAO,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,iBAAiB,EAAE,SAAS,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,WAAW,EAAE,WAAW,CAAC;YACtL,QAAQ,EAAE,KAAK;SAChB;QACD;YACE,KAAK,EAAE,OAAO;YACd,WAAW,EAAE,wBAAwB;YACrC,YAAY,EAAE,KAAK;SACpB;QACD;YACE,KAAK,EAAE,qBAAqB;YAC5B,WAAW,EAAE,kBAAkB;YAC/B,YAAY,EAAE,GAAG;SAClB;QACD;YACE,KAAK,EAAE,aAAa;YACpB,WAAW,EAAE,0BAA0B;YACvC,YAAY,EAAE,KAAK;SACpB;KACF;IAED,SAAS,EAAE;QACT;YACE,IAAI,EAAE,MAAM;YACZ,WAAW,EAAE,4EAA4E;YACzF,QAAQ,EAAE,KAAK;SAChB;KACF;IAED,QAAQ,EAAE;QACR;YACE,OAAO,EAAE,4BAA4B;YACrC,WAAW,EAAE,kDAAkD;SAChE;QACD;YACE,OAAO,EAAE,yCAAyC;YAClD,WAAW,EAAE,mCAAmC;SACjD;QACD;YACE,OAAO,EAAE,kCAAkC;YAC3C,WAAW,EAAE,wCAAwC;SACtD;QACD;YACE,OAAO,EAAE,qCAAqC;YAC9C,WAAW,EAAE,2CAA2C;SACzD;QACD;YACE,OAAO,EAAE,kCAAkC;YAC3C,WAAW,EAAE,kEAAkE;SAChF;QACD,2BAA2B;QAC3B;YACE,OAAO,EAAE,2CAA2C;YACpD,WAAW,EAAE,GAAG;SACjB;QACD;YACE,OAAO,EAAE,yCAAyC;YAClD,WAAW,EAAE,+BAA+B;SAC7C;QACD;YACE,OAAO,EAAE,mDAAmD;YAC5D,WAAW,EAAE,4BAA4B;SAC1C;QACD;YACE,OAAO,EAAE,sCAAsC;YAC/C,WAAW,EAAE,wDAAwD;SACtE;QACD,yBAAyB;QACzB;YACE,OAAO,EAAE,yCAAyC;YAClD,WAAW,EAAE,GAAG;SACjB;QACD;YACE,OAAO,EAAE,uCAAuC;YAChD,WAAW,EAAE,6BAA6B;SAC3C;QACD;YACE,OAAO,EAAE,+CAA+C;YACxD,WAAW,EAAE,sBAAsB;SACpC;QACD;YACE,OAAO,EAAE,oCAAoC;YAC7C,WAAW,EAAE,8BAA8B;SAC5C;QACD,yBAAyB;QACzB;YACE,OAAO,EAAE,yCAAyC;YAClD,WAAW,EAAE,GAAG;SACjB;QACD;YACE,OAAO,EAAE,uCAAuC;YAChD,WAAW,EAAE,6BAA6B;SAC3C;QACD;YACE,OAAO,EAAE,+CAA+C;YACxD,WAAW,EAAE,sBAAsB;SACpC;QACD;YACE,OAAO,EAAE,oCAAoC;YAC7C,WAAW,EAAE,8BAA8B;SAC5C;QACD,wCAAwC;QACxC;YACE,OAAO,EAAE,uCAAuC;YAChD,WAAW,EAAE,GAAG;SACjB;QACD;YACE,OAAO,EAAE,8CAA8C;YACvD,WAAW,EAAE,qCAAqC;SACnD;QACD;YACE,OAAO,EAAE,kEAAkE;YAC3E,WAAW,EAAE,8DAA8D;SAC5E;KACF;IAED,OAAO,EAAE,KAAK,EAAE,IAAc,EAAE,OAAY,EAAE,OAAuB,EAAiB,EAAE;QACtF,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;QAE3B,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,CAAC;QACpE,MAAM,WAAW,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAC5B,MAAM,KAAK,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;QAC9B,MAAM,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC;QAC1B,MAAM,IAAI,GAAG,OAAO,CAAC,IAAgC,CAAC;QAEtD,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAClB,MAAM,CAAC,KAAK,CAAC,6EAA6E,CAAC,CAAC;YAC5F,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACjD,CAAC;QAED,wCAAwC;QACxC,MAAM,SAAS,GAAmB,GAAG;YACnC,CAAC,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,iBAAiB,EAAE,SAAS,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,WAAW,EAAE,WAAW,CAAC;YAC/K,CAAC,CAAC,CAAC,IAAoB,CAAC,CAAC;QAE3B,MAAM,OAAO,GAAG,GAAG,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,GAAG,IAAI,WAAW,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC;QAC3F,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAEzC,MAAM,OAAO,GAAyC,EAAE,CAAC;YACzD,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;gBAC1B,MAAM,QAAQ,GAAG,aAAa,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;gBAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;gBACxC,MAAM,OAAO,GAAG,MAAM,kBAAkB,CAAC,CAAC,CAAC,CAAC;gBAC5C,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;gBAC9D,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;YAC5C,CAAC;YAED,OAAO,CAAC,OAAO,CAAC,8BAA8B,CAAC,CAAC;YAChD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;gBACxB,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;oBACd,OAAO,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,SAAS,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAClE,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;gBACxD,CAAC;YACH,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;YAC7B,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC;YAC9D,OAAO,CAAC,GAAG,CAAC,cAAc,QAAQ,CAAC,IAAI,CAAC,uBAAuB,CAAC,EAAE,CAAC,CAAC;YACpE,OAAO,CAAC,GAAG,CAAC,sBAAsB,QAAQ,CAAC,IAAI,CAAC,kCAAkC,CAAC,EAAE,CAAC,CAAC;QAEzF,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;YAC7C,MAAM,CAAC,KAAK,CAAE,GAAa,CAAC,OAAO,CAAC,CAAC;YACrC,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;CACF,CAAC;AAEF,SAAS,aAAa,CAAC,IAAkB,EAAE,IAAa;IACtD,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnC,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC;IAC5B,CAAC;IACD,OAAO,GAAG,IAAI,IAAI,CAAC;AACrB,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,IAAY,EAAE,OAAe,EAAE,KAAc;IACxE,IAAI,CAAC;QACH,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;YACnB,yBAAyB;YACzB,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,0BAA0B;IAC5B,CAAC;IACD,MAAM,SAAS,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC/B,OAAO,IAAI,CAAC;AACd,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,IAAkB;IAClD,oEAAoE;IACpE,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,+BAA+B;QACtE,MAAM,cAAc,GAAG;YACrB,yBAAyB;YACzB,OAAO,CAAC,SAAS,EAAE,cAAc,EAAE,GAAG,IAAI,IAAI,CAAC;YAC/C,6CAA6C;YAC7C,OAAO,CAAC,SAAS,EAAE,qBAAqB,EAAE,GAAG,IAAI,IAAI,CAAC;YACtD,qCAAqC;YACrC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,GAAG,IAAI,IAAI,CAAC;SACjD,CAAC;QAEF,KAAK,MAAM,CAAC,IAAI,cAAc,EAAE,CAAC;YAC/B,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;gBACvC,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;oBAAE,OAAO,IAAI,CAAC;YAClD,CAAC;YAAC,MAAM,CAAC;gBACP,WAAW;YACb,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,iCAAiC;IACnC,CAAC;IAED,kDAAkD;IAClD,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,OAAO;YACV,OAAO,cAAc,CAAC;QACxB,KAAK,QAAQ;YACX,OAAO,eAAe,CAAC;QACzB,KAAK,KAAK;YACR,OAAO,YAAY,CAAC;QACtB,KAAK,OAAO;YACV,OAAO,cAAc,CAAC;QACxB,KAAK,KAAK;YACR,OAAO,YAAY,CAAC;QACtB,KAAK,aAAa;YAChB,gDAAgD;YAChD,OAAO,sXAAsX,CAAC;QAChY,KAAK,UAAU;YACb,OAAO,yqBAAyqB,CAAC;QACnrB,KAAK,SAAS;YACZ,OAAO,yhBAAyhB,CAAC;QACniB,KAAK,iBAAiB;YACpB,OAAO,8rBAA8rB,CAAC;QACxsB,KAAK,SAAS;YACZ,OAAO,4yCAA4yC,CAAC;QACtzC,KAAK,gBAAgB;YACnB,OAAO,sbAAsb,CAAC;QAChc,KAAK,iBAAiB;YACpB,OAAO,2ZAA2Z,CAAC;QACra,KAAK,WAAW;YACd,OAAO,2MAA2M,CAAC;QACrN,KAAK,WAAW;YACd,OAAO,kiBAAkiB,CAAC;IAE9iB,CAAC;AACH,CAAC;AAED,oBAAoB;AAEpB,MAAM,aAAa,GAAG;;;CAGrB,CAAC;AAEF,MAAM,cAAc,GAAG,GAAG,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyCtC,CAAC;AAEF,MAAM,eAAe,GAAG,GAAG,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqCvC,CAAC;AAEF,MAAM,YAAY,GAAG,GAAG,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgDpC,CAAC;AAEF,MAAM,cAAc,GAAG,GAAG,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+DtC,CAAC;AAEF,MAAM,YAAY,GAAG,GAAG,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgCpC,CAAC;AAEF,eAAe,eAAe,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { CommandDefinition } from '../types.js';
2
+ /**
3
+ * Five test command implementation
4
+ */
5
+ export declare const testCommand: CommandDefinition;
6
+ //# sourceMappingURL=test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../../src/commands/test.ts"],"names":[],"mappings":"AAMA,OAAO,EACL,iBAAiB,EAIlB,MAAM,aAAa,CAAC;AAqErB;;GAEG;AACH,eAAO,MAAM,WAAW,EAAE,iBA8NzB,CAAC"}