forge-solana-sdk 2.0.3 → 2.1.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/cli.js +3 -2
- package/dist/cli.js.map +1 -1
- package/dist/commands/init.d.ts +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +42 -9
- package/dist/commands/init.js.map +1 -1
- package/dist/cpi.d.ts +23 -0
- package/dist/cpi.d.ts.map +1 -0
- package/dist/cpi.js +348 -0
- package/dist/cpi.js.map +1 -0
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -14,8 +14,9 @@ program
|
|
|
14
14
|
program
|
|
15
15
|
.command('init [projectName]')
|
|
16
16
|
.description('Initialize a new FORGE project')
|
|
17
|
-
.
|
|
18
|
-
|
|
17
|
+
.option('-i, --intent <intent>', 'Describe what the program should do (enables CPI generation)')
|
|
18
|
+
.action(async (projectName, options) => {
|
|
19
|
+
await (0, init_js_1.initCommand)(projectName, options.intent);
|
|
19
20
|
});
|
|
20
21
|
program
|
|
21
22
|
.command('deploy')
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;AAEA,yCAAoC;AACpC,yCAAkC;AAClC,gDAAiD;AACjD,oDAAqD;AACrD,oDAAqD;AAErD,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,OAAO,CAAC;KACb,WAAW,CAAC,8CAA8C,CAAC;KAC3D,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO;KACJ,OAAO,CAAC,oBAAoB,CAAC;KAC7B,WAAW,CAAC,gCAAgC,CAAC;KAC7C,MAAM,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;AAEA,yCAAoC;AACpC,yCAAkC;AAClC,gDAAiD;AACjD,oDAAqD;AACrD,oDAAqD;AAErD,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,OAAO,CAAC;KACb,WAAW,CAAC,8CAA8C,CAAC;KAC3D,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO;KACJ,OAAO,CAAC,oBAAoB,CAAC;KAC7B,WAAW,CAAC,gCAAgC,CAAC;KAC7C,MAAM,CAAC,uBAAuB,EAAE,8DAA8D,CAAC;KAC/F,MAAM,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE;IACrC,MAAM,IAAA,qBAAW,EAAC,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;AACjD,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,0BAA0B,CAAC;KACvC,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,IAAA,yBAAa,GAAE,CAAC;AACxB,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,oCAAoC,CAAC;KACjD,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,IAAA,yBAAa,GAAE,CAAC;AACxB,CAAC,CAAC,CAAC;AAEL,oBAAoB;AACpB,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;IACxB,OAAO,CAAC,GAAG,CAAC,eAAI,CAAC,CAAC;IAClB,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IACjC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IAChC,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;IAClC,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;AAC/C,CAAC,CAAC,CAAC;AAEH,kBAAkB;AAClB,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
package/dist/commands/init.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare function initCommand(projectName?: string): Promise<void>;
|
|
1
|
+
export declare function initCommand(projectName?: string, intent?: string): Promise<void>;
|
|
2
2
|
//# sourceMappingURL=init.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAMA,wBAAsB,WAAW,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA4ItF"}
|
package/dist/commands/init.js
CHANGED
|
@@ -5,10 +5,21 @@ const child_process_1 = require("child_process");
|
|
|
5
5
|
const fs_1 = require("fs");
|
|
6
6
|
const path_1 = require("path");
|
|
7
7
|
const ascii_js_1 = require("../ascii.js");
|
|
8
|
-
|
|
8
|
+
const cpi_js_1 = require("../cpi.js");
|
|
9
|
+
async function initCommand(projectName, intent) {
|
|
9
10
|
console.log(ascii_js_1.logo);
|
|
10
11
|
console.log('FORGE - Solana Development Platform\n');
|
|
11
12
|
const name = projectName || 'forge-project';
|
|
13
|
+
// Detect CPI patterns from intent
|
|
14
|
+
let cpiCode = null;
|
|
15
|
+
if (intent) {
|
|
16
|
+
console.log(`Analyzing intent: "${intent}"`);
|
|
17
|
+
const detections = (0, cpi_js_1.detectCPI)(intent);
|
|
18
|
+
if (detections.length > 0) {
|
|
19
|
+
console.log(`Detected CPI patterns: ${detections.map(d => d.type).join(', ')}`);
|
|
20
|
+
cpiCode = (0, cpi_js_1.generateCPICode)(detections);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
12
23
|
// Check if Anchor is installed
|
|
13
24
|
try {
|
|
14
25
|
(0, child_process_1.execSync)('anchor --version', { stdio: 'pipe' });
|
|
@@ -50,7 +61,16 @@ wallet = "~/.config/solana/id.json"
|
|
|
50
61
|
[scripts]
|
|
51
62
|
test = "yarn run ts-mocha -p ./tsconfig.json -t 1000000 tests/**/*.ts"
|
|
52
63
|
`;
|
|
53
|
-
// Create Cargo.toml
|
|
64
|
+
// Create Cargo.toml with latest Anchor ecosystem (0.31+)
|
|
65
|
+
let dependencies = `anchor-lang = "0.31.0"
|
|
66
|
+
anchor-spl = "0.31.0"`;
|
|
67
|
+
// Add CPI-specific dependencies
|
|
68
|
+
if (cpiCode) {
|
|
69
|
+
if (cpiCode.imports.some(imp => imp.includes('mpl_token_metadata'))) {
|
|
70
|
+
dependencies += `
|
|
71
|
+
mpl-token-metadata = { version = "5", features = ["no-entrypoint"] }`;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
54
74
|
const cargoToml = `[package]
|
|
55
75
|
name = "${name}"
|
|
56
76
|
version = "0.1.0"
|
|
@@ -65,14 +85,24 @@ no-entrypoint = []
|
|
|
65
85
|
no-idl = []
|
|
66
86
|
no-log-ix-name = []
|
|
67
87
|
cpi = ["no-entrypoint"]
|
|
88
|
+
idl-build = ["anchor-lang/idl-build", "anchor-spl/idl-build"]
|
|
68
89
|
default = []
|
|
69
90
|
|
|
70
91
|
[dependencies]
|
|
71
|
-
|
|
72
|
-
anchor-spl = "0.29.0"
|
|
92
|
+
${dependencies}
|
|
73
93
|
`;
|
|
74
|
-
//
|
|
75
|
-
|
|
94
|
+
// Generate imports and CPI code
|
|
95
|
+
let imports = `use anchor_lang::prelude::*;`;
|
|
96
|
+
let cpiImports = '';
|
|
97
|
+
let cpiCodeBlock = '';
|
|
98
|
+
let extraAccounts = '';
|
|
99
|
+
if (cpiCode) {
|
|
100
|
+
cpiImports = '\n' + cpiCode.imports.join('\n');
|
|
101
|
+
cpiCodeBlock = `\n\n ${cpiCode.code}`;
|
|
102
|
+
extraAccounts = '\n' + cpiCode.accounts.accounts.map(acc => ` ${acc},`).join('\n');
|
|
103
|
+
}
|
|
104
|
+
// Create lib.rs with CPI support
|
|
105
|
+
const libRs = `${imports}${cpiImports}
|
|
76
106
|
|
|
77
107
|
declare_id!("${programId}");
|
|
78
108
|
|
|
@@ -80,14 +110,17 @@ declare_id!("${programId}");
|
|
|
80
110
|
pub mod ${name.replace(/-/g, '_')} {
|
|
81
111
|
use super::*;
|
|
82
112
|
|
|
83
|
-
pub fn
|
|
84
|
-
msg!("
|
|
113
|
+
pub fn process_intent(ctx: Context<ProcessIntent>) -> Result<()> {
|
|
114
|
+
msg!("Processing intent...");${cpiCodeBlock}
|
|
115
|
+
|
|
116
|
+
msg!("Intent processed successfully!");
|
|
85
117
|
Ok(())
|
|
86
118
|
}
|
|
87
119
|
}
|
|
88
120
|
|
|
89
121
|
#[derive(Accounts)]
|
|
90
|
-
pub struct
|
|
122
|
+
pub struct ProcessIntent {${extraAccounts}
|
|
123
|
+
}
|
|
91
124
|
`;
|
|
92
125
|
// Write files
|
|
93
126
|
(0, fs_1.writeFileSync)((0, path_1.join)(projectPath, 'Anchor.toml'), anchorToml);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
package/dist/cpi.d.ts
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export interface CPIDetection {
|
|
2
|
+
type: 'system_transfer' | 'token_mint' | 'token_transfer' | 'token_burn' | 'create_ata' | 'create_metadata';
|
|
3
|
+
confidence: number;
|
|
4
|
+
params?: Record<string, any>;
|
|
5
|
+
}
|
|
6
|
+
export interface CPIAccounts {
|
|
7
|
+
accounts: string[];
|
|
8
|
+
constraints: string[];
|
|
9
|
+
}
|
|
10
|
+
export interface CPICode {
|
|
11
|
+
imports: string[];
|
|
12
|
+
code: string;
|
|
13
|
+
accounts: CPIAccounts;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Detect CPI patterns in intent strings
|
|
17
|
+
*/
|
|
18
|
+
export declare function detectCPI(intent: string): CPIDetection[];
|
|
19
|
+
/**
|
|
20
|
+
* Generate CPI code for detected patterns
|
|
21
|
+
*/
|
|
22
|
+
export declare function generateCPICode(detections: CPIDetection[]): CPICode;
|
|
23
|
+
//# sourceMappingURL=cpi.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cpi.d.ts","sourceRoot":"","sources":["../src/cpi.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,iBAAiB,GAAG,YAAY,GAAG,gBAAgB,GAAG,YAAY,GAAG,YAAY,GAAG,iBAAiB,CAAC;IAC5G,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,OAAO;IACtB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,WAAW,CAAC;CACvB;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,EAAE,CA8DxD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,YAAY,EAAE,GAAG,OAAO,CAwBnE"}
|
package/dist/cpi.js
ADDED
|
@@ -0,0 +1,348 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.detectCPI = detectCPI;
|
|
4
|
+
exports.generateCPICode = generateCPICode;
|
|
5
|
+
/**
|
|
6
|
+
* Detect CPI patterns in intent strings
|
|
7
|
+
*/
|
|
8
|
+
function detectCPI(intent) {
|
|
9
|
+
const detections = [];
|
|
10
|
+
const lowerIntent = intent.toLowerCase();
|
|
11
|
+
// System Program - SOL/lamports transfer
|
|
12
|
+
if (/\b(transfer|send)\b.*\b(sol|lamports)\b/.test(lowerIntent)) {
|
|
13
|
+
detections.push({
|
|
14
|
+
type: 'system_transfer',
|
|
15
|
+
confidence: 0.9,
|
|
16
|
+
params: { amount: extractAmount(lowerIntent) }
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
// SPL Token - Mint
|
|
20
|
+
if (/\b(mint|create)\b.*\b(token|tokens)\b/.test(lowerIntent)) {
|
|
21
|
+
detections.push({
|
|
22
|
+
type: 'token_mint',
|
|
23
|
+
confidence: 0.8,
|
|
24
|
+
params: { amount: extractAmount(lowerIntent) }
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
// SPL Token - Transfer
|
|
28
|
+
if (/\b(transfer|send)\b.*\b(token|tokens)\b/.test(lowerIntent)) {
|
|
29
|
+
detections.push({
|
|
30
|
+
type: 'token_transfer',
|
|
31
|
+
confidence: 0.8,
|
|
32
|
+
params: { amount: extractAmount(lowerIntent) }
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
// SPL Token - Burn
|
|
36
|
+
if (/\b(burn|destroy)\b.*\b(token|tokens)\b/.test(lowerIntent)) {
|
|
37
|
+
detections.push({
|
|
38
|
+
type: 'token_burn',
|
|
39
|
+
confidence: 0.7,
|
|
40
|
+
params: { amount: extractAmount(lowerIntent) }
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
// Associated Token Account - Create
|
|
44
|
+
if (/\b(create|make)\b.*\b(ata|associated.*token)\b/.test(lowerIntent)) {
|
|
45
|
+
detections.push({
|
|
46
|
+
type: 'create_ata',
|
|
47
|
+
confidence: 0.9
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
// Token Metadata - Create
|
|
51
|
+
if (/\b(metadata|nft|name|symbol|uri)\b/.test(lowerIntent) && /\b(create|set|attach)\b/.test(lowerIntent)) {
|
|
52
|
+
detections.push({
|
|
53
|
+
type: 'create_metadata',
|
|
54
|
+
confidence: 0.7,
|
|
55
|
+
params: {
|
|
56
|
+
name: extractMetadataField(lowerIntent, 'name'),
|
|
57
|
+
symbol: extractMetadataField(lowerIntent, 'symbol'),
|
|
58
|
+
uri: extractMetadataField(lowerIntent, 'uri')
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
return detections.sort((a, b) => b.confidence - a.confidence);
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Generate CPI code for detected patterns
|
|
66
|
+
*/
|
|
67
|
+
function generateCPICode(detections) {
|
|
68
|
+
const imports = new Set();
|
|
69
|
+
const codeBlocks = [];
|
|
70
|
+
const allAccounts = [];
|
|
71
|
+
const allConstraints = [];
|
|
72
|
+
for (const detection of detections) {
|
|
73
|
+
const cpiCode = generateSingleCPI(detection);
|
|
74
|
+
if (cpiCode) {
|
|
75
|
+
cpiCode.imports.forEach(imp => imports.add(imp));
|
|
76
|
+
codeBlocks.push(cpiCode.code);
|
|
77
|
+
allAccounts.push(...cpiCode.accounts.accounts);
|
|
78
|
+
allConstraints.push(...cpiCode.accounts.constraints);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return {
|
|
82
|
+
imports: Array.from(imports),
|
|
83
|
+
code: codeBlocks.join('\n\n '),
|
|
84
|
+
accounts: {
|
|
85
|
+
accounts: [...new Set(allAccounts)],
|
|
86
|
+
constraints: [...new Set(allConstraints)]
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Generate code for a single CPI
|
|
92
|
+
*/
|
|
93
|
+
function generateSingleCPI(detection) {
|
|
94
|
+
switch (detection.type) {
|
|
95
|
+
case 'system_transfer':
|
|
96
|
+
return generateSystemTransferCPI(detection.params);
|
|
97
|
+
case 'token_mint':
|
|
98
|
+
return generateTokenMintCPI(detection.params);
|
|
99
|
+
case 'token_transfer':
|
|
100
|
+
return generateTokenTransferCPI(detection.params);
|
|
101
|
+
case 'token_burn':
|
|
102
|
+
return generateTokenBurnCPI(detection.params);
|
|
103
|
+
case 'create_ata':
|
|
104
|
+
return generateCreateATACPI();
|
|
105
|
+
case 'create_metadata':
|
|
106
|
+
return generateCreateMetadataCPI(detection.params);
|
|
107
|
+
default:
|
|
108
|
+
return null;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Generate System Program transfer CPI
|
|
113
|
+
*/
|
|
114
|
+
function generateSystemTransferCPI(params) {
|
|
115
|
+
const amount = params?.amount || 'amount';
|
|
116
|
+
return {
|
|
117
|
+
imports: ['use anchor_lang::system_program;'],
|
|
118
|
+
code: `// CPI: Transfer SOL/lamports via System Program
|
|
119
|
+
system_program::transfer(
|
|
120
|
+
CpiContext::new(
|
|
121
|
+
ctx.accounts.system_program.to_account_info(),
|
|
122
|
+
system_program::Transfer {
|
|
123
|
+
from: ctx.accounts.from.to_account_info(),
|
|
124
|
+
to: ctx.accounts.to.to_account_info(),
|
|
125
|
+
},
|
|
126
|
+
),
|
|
127
|
+
${amount},
|
|
128
|
+
)?;`,
|
|
129
|
+
accounts: {
|
|
130
|
+
accounts: ['system_program: SystemProgram'],
|
|
131
|
+
constraints: []
|
|
132
|
+
}
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Generate SPL Token mint CPI (Token-2022 compatible, modern)
|
|
137
|
+
*/
|
|
138
|
+
function generateTokenMintCPI(params) {
|
|
139
|
+
const amount = params?.amount || 'amount';
|
|
140
|
+
return {
|
|
141
|
+
imports: [
|
|
142
|
+
'use anchor_spl::token_interface::{self, InterfaceAccount, Interface, Mint, TokenAccount, TokenInterface, MintTo};'
|
|
143
|
+
],
|
|
144
|
+
code: `// CPI: Mint with PDA signer
|
|
145
|
+
token_interface::mint_to(
|
|
146
|
+
CpiContext::new_with_signer(
|
|
147
|
+
ctx.accounts.token_program.to_account_info(),
|
|
148
|
+
MintTo {
|
|
149
|
+
mint: ctx.accounts.mint.to_account_info(),
|
|
150
|
+
to: ctx.accounts.to.to_account_info(),
|
|
151
|
+
authority: ctx.accounts.mint_authority.to_account_info(),
|
|
152
|
+
},
|
|
153
|
+
&[&[b"mint_auth", &[ctx.bumps.mint_authority]]],
|
|
154
|
+
),
|
|
155
|
+
${amount},
|
|
156
|
+
)?;`,
|
|
157
|
+
accounts: {
|
|
158
|
+
accounts: [
|
|
159
|
+
'#[account(mut)] pub mint: InterfaceAccount<Mint>',
|
|
160
|
+
'#[account(mut)] pub to: InterfaceAccount<TokenAccount>',
|
|
161
|
+
'pub mint_authority: Signer',
|
|
162
|
+
'pub token_program: Interface<TokenInterface>'
|
|
163
|
+
],
|
|
164
|
+
constraints: []
|
|
165
|
+
}
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Generate SPL Token transfer CPI (Token-2022 compatible, modern)
|
|
170
|
+
*/
|
|
171
|
+
function generateTokenTransferCPI(params) {
|
|
172
|
+
const amount = params?.amount || 'amount';
|
|
173
|
+
return {
|
|
174
|
+
imports: [
|
|
175
|
+
'use anchor_spl::token_interface::{self, InterfaceAccount, Interface, TokenAccount, Mint, TokenInterface, TransferChecked};'
|
|
176
|
+
],
|
|
177
|
+
code: `// CPI: Safe transfer with decimals check (works Token + Token-2022)
|
|
178
|
+
let decimals = ctx.accounts.mint.decimals;
|
|
179
|
+
token_interface::transfer_checked(
|
|
180
|
+
CpiContext::new(
|
|
181
|
+
ctx.accounts.token_program.to_account_info(),
|
|
182
|
+
TransferChecked {
|
|
183
|
+
from: ctx.accounts.from.to_account_info(),
|
|
184
|
+
mint: ctx.accounts.mint.to_account_info(),
|
|
185
|
+
to: ctx.accounts.to.to_account_info(),
|
|
186
|
+
authority: ctx.accounts.authority.to_account_info(),
|
|
187
|
+
},
|
|
188
|
+
),
|
|
189
|
+
${amount},
|
|
190
|
+
decimals,
|
|
191
|
+
)?;`,
|
|
192
|
+
accounts: {
|
|
193
|
+
accounts: [
|
|
194
|
+
'#[account(mut)] pub from: InterfaceAccount<TokenAccount>',
|
|
195
|
+
'#[account(mut)] pub to: InterfaceAccount<TokenAccount>',
|
|
196
|
+
'pub mint: InterfaceAccount<Mint>',
|
|
197
|
+
'pub authority: Signer',
|
|
198
|
+
'pub token_program: Interface<TokenInterface>'
|
|
199
|
+
],
|
|
200
|
+
constraints: []
|
|
201
|
+
}
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Generate SPL Token burn CPI
|
|
206
|
+
*/
|
|
207
|
+
function generateTokenBurnCPI(params) {
|
|
208
|
+
const amount = params?.amount || 'amount';
|
|
209
|
+
return {
|
|
210
|
+
imports: ['use anchor_spl::token::{self, Burn};'],
|
|
211
|
+
code: `// CPI: Burn tokens via SPL Token Program
|
|
212
|
+
token::burn(
|
|
213
|
+
CpiContext::new(
|
|
214
|
+
ctx.accounts.token_program.to_account_info(),
|
|
215
|
+
Burn {
|
|
216
|
+
mint: ctx.accounts.mint.to_account_info(),
|
|
217
|
+
from: ctx.accounts.token_account.to_account_info(),
|
|
218
|
+
authority: ctx.accounts.authority.to_account_info(),
|
|
219
|
+
},
|
|
220
|
+
),
|
|
221
|
+
${amount},
|
|
222
|
+
)?;`,
|
|
223
|
+
accounts: {
|
|
224
|
+
accounts: ['token_program: TokenProgram'],
|
|
225
|
+
constraints: []
|
|
226
|
+
}
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Generate Associated Token Account creation CPI
|
|
231
|
+
*/
|
|
232
|
+
function generateCreateATACPI() {
|
|
233
|
+
return {
|
|
234
|
+
imports: ['use anchor_spl::associated_token::{self, Create};'],
|
|
235
|
+
code: `// CPI: Create Associated Token Account
|
|
236
|
+
associated_token::create(
|
|
237
|
+
CpiContext::new(
|
|
238
|
+
ctx.accounts.associated_token_program.to_account_info(),
|
|
239
|
+
Create {
|
|
240
|
+
payer: ctx.accounts.payer.to_account_info(),
|
|
241
|
+
associated_token: ctx.accounts.ata.to_account_info(),
|
|
242
|
+
authority: ctx.accounts.authority.to_account_info(),
|
|
243
|
+
mint: ctx.accounts.mint.to_account_info(),
|
|
244
|
+
system_program: ctx.accounts.system_program.to_account_info(),
|
|
245
|
+
token_program: ctx.accounts.token_program.to_account_info(),
|
|
246
|
+
},
|
|
247
|
+
),
|
|
248
|
+
)?;`,
|
|
249
|
+
accounts: {
|
|
250
|
+
accounts: [
|
|
251
|
+
'associated_token_program: AssociatedTokenProgram',
|
|
252
|
+
'token_program: TokenProgram',
|
|
253
|
+
'system_program: SystemProgram'
|
|
254
|
+
],
|
|
255
|
+
constraints: [
|
|
256
|
+
'associated_token::mint = mint',
|
|
257
|
+
'associated_token::authority = authority'
|
|
258
|
+
]
|
|
259
|
+
}
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Generate Token Metadata creation CPI (modern DataV2 pattern)
|
|
264
|
+
*/
|
|
265
|
+
function generateCreateMetadataCPI(params) {
|
|
266
|
+
const name = params?.name ? `"${params.name}"` : '"Token Name"';
|
|
267
|
+
const symbol = params?.symbol ? `"${params.symbol}"` : '"TKN"';
|
|
268
|
+
const uri = params?.uri ? `"${params.uri}"` : '"https://example.com/metadata.json"';
|
|
269
|
+
return {
|
|
270
|
+
imports: [
|
|
271
|
+
'use mpl_token_metadata::instruction::create_metadata_accounts_v3;',
|
|
272
|
+
'use mpl_token_metadata::types::DataV2;'
|
|
273
|
+
],
|
|
274
|
+
code: `// CPI: Create Token Metadata
|
|
275
|
+
let data = DataV2 {
|
|
276
|
+
name: ${name}.to_string(),
|
|
277
|
+
symbol: ${symbol}.to_string(),
|
|
278
|
+
uri: ${uri}.to_string(),
|
|
279
|
+
seller_fee_basis_points: 500,
|
|
280
|
+
creators: None,
|
|
281
|
+
collection: None,
|
|
282
|
+
uses: None,
|
|
283
|
+
};
|
|
284
|
+
|
|
285
|
+
let ix = create_metadata_accounts_v3(
|
|
286
|
+
ctx.accounts.token_metadata_program.key(),
|
|
287
|
+
ctx.accounts.metadata.key(),
|
|
288
|
+
ctx.accounts.mint.key(),
|
|
289
|
+
ctx.accounts.mint_authority.key(),
|
|
290
|
+
ctx.accounts.payer.key(),
|
|
291
|
+
ctx.accounts.update_authority.key(),
|
|
292
|
+
data.name,
|
|
293
|
+
data.symbol,
|
|
294
|
+
data.uri,
|
|
295
|
+
data.creators,
|
|
296
|
+
data.seller_fee_basis_points,
|
|
297
|
+
true, // update_authority_is_signer
|
|
298
|
+
true, // is_mutable
|
|
299
|
+
data.collection,
|
|
300
|
+
data.uses,
|
|
301
|
+
None, // collection_details
|
|
302
|
+
);
|
|
303
|
+
|
|
304
|
+
anchor_lang::solana_program::program::invoke(
|
|
305
|
+
&ix,
|
|
306
|
+
&[
|
|
307
|
+
ctx.accounts.metadata.to_account_info(),
|
|
308
|
+
ctx.accounts.mint.to_account_info(),
|
|
309
|
+
ctx.accounts.mint_authority.to_account_info(),
|
|
310
|
+
ctx.accounts.payer.to_account_info(),
|
|
311
|
+
ctx.accounts.update_authority.to_account_info(),
|
|
312
|
+
ctx.accounts.token_metadata_program.to_account_info(),
|
|
313
|
+
ctx.accounts.system_program.to_account_info(),
|
|
314
|
+
ctx.accounts.rent.to_account_info(),
|
|
315
|
+
],
|
|
316
|
+
)?;`,
|
|
317
|
+
accounts: {
|
|
318
|
+
accounts: [
|
|
319
|
+
'metadata: AccountInfo',
|
|
320
|
+
'token_metadata_program: AccountInfo',
|
|
321
|
+
'system_program: SystemProgram',
|
|
322
|
+
'rent: SysvarRent'
|
|
323
|
+
],
|
|
324
|
+
constraints: []
|
|
325
|
+
}
|
|
326
|
+
};
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* Extract amount from intent string
|
|
330
|
+
*/
|
|
331
|
+
function extractAmount(intent) {
|
|
332
|
+
const amountMatch = intent.match(/(\d+)/);
|
|
333
|
+
return amountMatch ? amountMatch[1] : 'amount';
|
|
334
|
+
}
|
|
335
|
+
/**
|
|
336
|
+
* Extract metadata fields from intent string
|
|
337
|
+
*/
|
|
338
|
+
function extractMetadataField(intent, field) {
|
|
339
|
+
// Simple extraction - could be enhanced with better parsing
|
|
340
|
+
const patterns = {
|
|
341
|
+
name: /(?:name|title)[:\s]+["']([^"']+)["']/i,
|
|
342
|
+
symbol: /symbol[:\s]+["']([^"']+)["']/i,
|
|
343
|
+
uri: /uri[:\s]+["']([^"'\s]+)["']/i
|
|
344
|
+
};
|
|
345
|
+
const match = intent.match(patterns[field]);
|
|
346
|
+
return match ? match[1] : '';
|
|
347
|
+
}
|
|
348
|
+
//# sourceMappingURL=cpi.js.map
|
package/dist/cpi.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cpi.js","sourceRoot":"","sources":["../src/cpi.ts"],"names":[],"mappings":"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"}
|