@devvmichael/create-stacks-app 0.2.3 → 0.2.41
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/commands/deploy.d.ts +1 -6
- package/dist/commands/deploy.d.ts.map +1 -1
- package/dist/commands/deploy.js +59 -53
- package/dist/commands/deploy.js.map +1 -1
- package/dist/utils/clarinet.d.ts +1 -1
- package/dist/utils/clarinet.d.ts.map +1 -1
- package/dist/utils/clarinet.js +34 -42
- package/dist/utils/clarinet.js.map +1 -1
- package/dist/utils/filesystem.js +1 -1
- package/dist/utils/filesystem.js.map +1 -1
- package/dist/utils/git.js +1 -1
- package/dist/utils/git.js.map +1 -1
- package/package.json +5 -2
- package/templates/frontends/react/template/src/App.tsx +38 -29
- package/templates/frontends/react/template/src/components/CounterInteraction.tsx +34 -32
- package/templates/frontends/vue/template/.env.example +1 -1
- package/templates/frontends/vue/template/src/App.vue +18 -20
- package/templates/frontends/vue/template/src/components/CounterInteraction.vue +15 -17
package/README.md
CHANGED
|
@@ -50,13 +50,13 @@ npx @devvmichael/create-stacks-app
|
|
|
50
50
|
npx @devvmichael/create-stacks-app my-dapp [options]
|
|
51
51
|
|
|
52
52
|
Options:
|
|
53
|
-
-t, --template <name> Frontend template: nextjs, react, vue
|
|
53
|
+
-t, --template <name> Frontend template: nextjs, react, vue
|
|
54
54
|
-c, --contracts <list> Contracts to include: counter,token,nft
|
|
55
55
|
--typescript Use TypeScript (default: true)
|
|
56
56
|
--no-typescript Use JavaScript
|
|
57
57
|
--tailwind Include Tailwind CSS (default: true)
|
|
58
58
|
--no-git Skip Git initialization
|
|
59
|
-
--package-manager <pm> Package manager: npm, pnpm, yarn
|
|
59
|
+
--package-manager <pm> Package manager: npm, pnpm, yarn
|
|
60
60
|
--skip-install Skip dependency installation
|
|
61
61
|
-y, --yes Skip prompts, use defaults
|
|
62
62
|
```
|
|
@@ -1,7 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
network?: string;
|
|
3
|
-
privateKey?: string;
|
|
4
|
-
}
|
|
5
|
-
export declare function deployCommand(network: string, options?: DeployOptions): Promise<void>;
|
|
6
|
-
export {};
|
|
1
|
+
export declare function deployCommand(network: string): Promise<void>;
|
|
7
2
|
//# sourceMappingURL=deploy.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../src/commands/deploy.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../src/commands/deploy.ts"],"names":[],"mappings":"AAeA,wBAAsB,aAAa,CACjC,OAAO,EAAE,MAAM,GAEd,OAAO,CAAC,IAAI,CAAC,CAkIf"}
|
package/dist/commands/deploy.js
CHANGED
|
@@ -1,30 +1,34 @@
|
|
|
1
|
-
import { exec } from
|
|
2
|
-
import { promisify } from
|
|
3
|
-
import fs from
|
|
4
|
-
import path from
|
|
5
|
-
import ora from
|
|
6
|
-
import chalk from
|
|
7
|
-
import inquirer from
|
|
1
|
+
import { exec } from "child_process";
|
|
2
|
+
import { promisify } from "util";
|
|
3
|
+
import fs from "fs-extra";
|
|
4
|
+
import path from "path";
|
|
5
|
+
import ora from "ora";
|
|
6
|
+
import chalk from "chalk";
|
|
7
|
+
import inquirer from "inquirer";
|
|
8
8
|
const execAsync = promisify(exec);
|
|
9
|
-
|
|
9
|
+
// interface DeployOptions {
|
|
10
|
+
// network?: string;
|
|
11
|
+
// privateKey?: string;
|
|
12
|
+
// }
|
|
13
|
+
export async function deployCommand(network) {
|
|
10
14
|
const projectPath = process.cwd();
|
|
11
15
|
// Verify we're in a stacks project
|
|
12
|
-
if (!(await fs.pathExists(path.join(projectPath,
|
|
13
|
-
console.error(chalk.red(
|
|
16
|
+
if (!(await fs.pathExists(path.join(projectPath, "Clarinet.toml")))) {
|
|
17
|
+
console.error(chalk.red("Error: Not in a create-stacks-app project directory."));
|
|
14
18
|
process.exit(1);
|
|
15
19
|
}
|
|
16
20
|
// Warn for mainnet deployments
|
|
17
|
-
if (network ===
|
|
21
|
+
if (network === "mainnet") {
|
|
18
22
|
const { confirm } = await inquirer.prompt([
|
|
19
23
|
{
|
|
20
|
-
type:
|
|
21
|
-
name:
|
|
22
|
-
message: chalk.yellow(
|
|
24
|
+
type: "confirm",
|
|
25
|
+
name: "confirm",
|
|
26
|
+
message: chalk.yellow("⚠️ You are about to deploy to MAINNET. This is irreversible. Continue?"),
|
|
23
27
|
default: false,
|
|
24
28
|
},
|
|
25
29
|
]);
|
|
26
30
|
if (!confirm) {
|
|
27
|
-
console.log(
|
|
31
|
+
console.log("Deployment cancelled.");
|
|
28
32
|
process.exit(0);
|
|
29
33
|
}
|
|
30
34
|
}
|
|
@@ -32,17 +36,17 @@ export async function deployCommand(network, options) {
|
|
|
32
36
|
try {
|
|
33
37
|
// Check if Clarinet is installed
|
|
34
38
|
try {
|
|
35
|
-
await execAsync(
|
|
39
|
+
await execAsync("clarinet --version");
|
|
36
40
|
}
|
|
37
41
|
catch {
|
|
38
|
-
spinner.fail(
|
|
39
|
-
console.error(
|
|
42
|
+
spinner.fail("Clarinet is not installed");
|
|
43
|
+
console.error("Please install Clarinet: https://github.com/hirosystems/clarinet");
|
|
40
44
|
process.exit(1);
|
|
41
45
|
}
|
|
42
46
|
// Get contracts from Clarinet.toml
|
|
43
47
|
const contracts = await getContractsFromConfig(projectPath);
|
|
44
48
|
if (contracts.length === 0) {
|
|
45
|
-
spinner.fail(
|
|
49
|
+
spinner.fail("No contracts found in Clarinet.toml");
|
|
46
50
|
process.exit(1);
|
|
47
51
|
}
|
|
48
52
|
spinner.text = `Found ${contracts.length} contract(s) to deploy`;
|
|
@@ -50,60 +54,60 @@ export async function deployCommand(network, options) {
|
|
|
50
54
|
const deploymentPlan = await createDeploymentPlan(projectPath, network, contracts);
|
|
51
55
|
spinner.succeed(`Deployment plan created`);
|
|
52
56
|
console.log();
|
|
53
|
-
console.log(chalk.bold(
|
|
57
|
+
console.log(chalk.bold("Contracts to deploy:"));
|
|
54
58
|
contracts.forEach((c, i) => console.log(` ${i + 1}. ${chalk.cyan(c)}`));
|
|
55
59
|
console.log();
|
|
56
60
|
// Confirm deployment
|
|
57
61
|
const { proceed } = await inquirer.prompt([
|
|
58
62
|
{
|
|
59
|
-
type:
|
|
60
|
-
name:
|
|
63
|
+
type: "confirm",
|
|
64
|
+
name: "proceed",
|
|
61
65
|
message: `Deploy ${contracts.length} contract(s) to ${network}?`,
|
|
62
66
|
default: true,
|
|
63
67
|
},
|
|
64
68
|
]);
|
|
65
69
|
if (!proceed) {
|
|
66
|
-
console.log(
|
|
70
|
+
console.log("Deployment cancelled.");
|
|
67
71
|
process.exit(0);
|
|
68
72
|
}
|
|
69
73
|
// Execute deployment
|
|
70
|
-
const deploySpinner = ora(
|
|
74
|
+
const deploySpinner = ora("Deploying contracts...").start();
|
|
71
75
|
try {
|
|
72
|
-
|
|
76
|
+
await execAsync(`clarinet deployments apply -p ${deploymentPlan}`, {
|
|
73
77
|
cwd: projectPath,
|
|
74
78
|
});
|
|
75
|
-
deploySpinner.succeed(
|
|
79
|
+
deploySpinner.succeed("Contracts deployed successfully!");
|
|
76
80
|
console.log();
|
|
77
|
-
console.log(chalk.green(
|
|
81
|
+
console.log(chalk.green("✓ Deployment complete"));
|
|
78
82
|
console.log();
|
|
79
|
-
console.log(chalk.bold(
|
|
80
|
-
console.log(` 1. Update ${chalk.cyan(
|
|
83
|
+
console.log(chalk.bold("Next steps:"));
|
|
84
|
+
console.log(` 1. Update ${chalk.cyan("NEXT_PUBLIC_CONTRACT_ADDRESS")} in your frontend .env`);
|
|
81
85
|
console.log(` 2. Verify contracts on explorer: ${getExplorerUrl(network)}`);
|
|
82
|
-
console.log(` 3. Test your dApp at ${chalk.cyan(
|
|
86
|
+
console.log(` 3. Test your dApp at ${chalk.cyan("http://localhost:3000")}`);
|
|
83
87
|
}
|
|
84
88
|
catch (error) {
|
|
85
|
-
deploySpinner.fail(
|
|
89
|
+
deploySpinner.fail("Deployment failed");
|
|
86
90
|
console.error(chalk.red(error.message));
|
|
87
91
|
// Provide helpful error messages
|
|
88
|
-
if (error.message.includes(
|
|
92
|
+
if (error.message.includes("insufficient funds")) {
|
|
89
93
|
console.log();
|
|
90
|
-
console.log(chalk.yellow(
|
|
91
|
-
if (network ===
|
|
92
|
-
console.log(`Get testnet STX from the faucet: ${chalk.cyan(
|
|
94
|
+
console.log(chalk.yellow("Tip: Make sure you have enough STX for deployment fees."));
|
|
95
|
+
if (network === "testnet") {
|
|
96
|
+
console.log(`Get testnet STX from the faucet: ${chalk.cyan("https://explorer.stacks.co/sandbox/faucet?chain=testnet")}`);
|
|
93
97
|
}
|
|
94
98
|
}
|
|
95
99
|
process.exit(1);
|
|
96
100
|
}
|
|
97
101
|
}
|
|
98
102
|
catch (error) {
|
|
99
|
-
spinner.fail(
|
|
103
|
+
spinner.fail("Deployment failed");
|
|
100
104
|
console.error(error.message);
|
|
101
105
|
process.exit(1);
|
|
102
106
|
}
|
|
103
107
|
}
|
|
104
108
|
async function getContractsFromConfig(projectPath) {
|
|
105
|
-
const tomlPath = path.join(projectPath,
|
|
106
|
-
const content = await fs.readFile(tomlPath,
|
|
109
|
+
const tomlPath = path.join(projectPath, "Clarinet.toml");
|
|
110
|
+
const content = await fs.readFile(tomlPath, "utf-8");
|
|
107
111
|
const contracts = [];
|
|
108
112
|
const regex = /\[contracts\.(\w+)\]/g;
|
|
109
113
|
let match;
|
|
@@ -113,13 +117,13 @@ async function getContractsFromConfig(projectPath) {
|
|
|
113
117
|
return contracts;
|
|
114
118
|
}
|
|
115
119
|
async function createDeploymentPlan(projectPath, network, contracts) {
|
|
116
|
-
const deploymentsPath = path.join(projectPath,
|
|
120
|
+
const deploymentsPath = path.join(projectPath, "deployments");
|
|
117
121
|
await fs.ensureDir(deploymentsPath);
|
|
118
122
|
const planPath = path.join(deploymentsPath, `${network}.yaml`);
|
|
119
123
|
// Read project name from Clarinet.toml
|
|
120
|
-
const tomlContent = await fs.readFile(path.join(projectPath,
|
|
124
|
+
const tomlContent = await fs.readFile(path.join(projectPath, "Clarinet.toml"), "utf-8");
|
|
121
125
|
const nameMatch = tomlContent.match(/name\s*=\s*"([^"]+)"/);
|
|
122
|
-
const projectName = nameMatch ? nameMatch[1] :
|
|
126
|
+
const projectName = nameMatch ? nameMatch[1] : "stacks-app";
|
|
123
127
|
const plan = `---
|
|
124
128
|
id: 0
|
|
125
129
|
name: ${projectName} Deployment
|
|
@@ -130,30 +134,32 @@ plan:
|
|
|
130
134
|
batches:
|
|
131
135
|
- id: 0
|
|
132
136
|
transactions:
|
|
133
|
-
${contracts
|
|
137
|
+
${contracts
|
|
138
|
+
.map((c) => ` - contract-publish:
|
|
134
139
|
contract-name: ${c}
|
|
135
|
-
expected-sender:
|
|
140
|
+
expected-sender: $DEPLOYER
|
|
136
141
|
cost: 10000
|
|
137
142
|
path: contracts/${c}.clar
|
|
138
143
|
anchor-block-only: true
|
|
139
|
-
clarity-version: 2`)
|
|
144
|
+
clarity-version: 2`)
|
|
145
|
+
.join("\n")}
|
|
140
146
|
`;
|
|
141
147
|
await fs.writeFile(planPath, plan);
|
|
142
148
|
return planPath;
|
|
143
149
|
}
|
|
144
150
|
function getStacksNode(network) {
|
|
145
|
-
return network ===
|
|
146
|
-
?
|
|
147
|
-
:
|
|
151
|
+
return network === "mainnet"
|
|
152
|
+
? "https://api.mainnet.hiro.so"
|
|
153
|
+
: "https://api.testnet.hiro.so";
|
|
148
154
|
}
|
|
149
155
|
function getBitcoinNode(network) {
|
|
150
|
-
return network ===
|
|
151
|
-
?
|
|
152
|
-
:
|
|
156
|
+
return network === "mainnet"
|
|
157
|
+
? "https://api.mainnet.hiro.so"
|
|
158
|
+
: "https://api.testnet.hiro.so";
|
|
153
159
|
}
|
|
154
160
|
function getExplorerUrl(network) {
|
|
155
|
-
return network ===
|
|
156
|
-
?
|
|
157
|
-
:
|
|
161
|
+
return network === "mainnet"
|
|
162
|
+
? "https://explorer.stacks.co"
|
|
163
|
+
: "https://explorer.stacks.co/?chain=testnet";
|
|
158
164
|
}
|
|
159
165
|
//# sourceMappingURL=deploy.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../src/commands/deploy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,QAAQ,MAAM,UAAU,CAAC;AAEhC,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../src/commands/deploy.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/clarinet.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ProjectConfig } from
|
|
1
|
+
import type { ProjectConfig } from "../types/index.js";
|
|
2
2
|
export declare function checkClarinetInstallation(): Promise<boolean>;
|
|
3
3
|
export declare function initializeClarinet(config: ProjectConfig): Promise<void>;
|
|
4
4
|
export declare function updateClarinetConfig(projectPath: string, contracts: string[]): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clarinet.d.ts","sourceRoot":"","sources":["../../src/utils/clarinet.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAIvD,wBAAsB,yBAAyB,IAAI,OAAO,CAAC,OAAO,CAAC,CAOlE;AAED,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"clarinet.d.ts","sourceRoot":"","sources":["../../src/utils/clarinet.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAIvD,wBAAsB,yBAAyB,IAAI,OAAO,CAAC,OAAO,CAAC,CAOlE;AAED,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAiD7E;AAED,wBAAsB,oBAAoB,CACxC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EAAE,GAClB,OAAO,CAAC,IAAI,CAAC,CAgBf"}
|
package/dist/utils/clarinet.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import { exec } from
|
|
2
|
-
import { promisify } from
|
|
3
|
-
import ora from
|
|
4
|
-
import path from
|
|
5
|
-
import fs from
|
|
1
|
+
import { exec } from "child_process";
|
|
2
|
+
import { promisify } from "util";
|
|
3
|
+
import ora from "ora";
|
|
4
|
+
import path from "path";
|
|
5
|
+
import fs from "fs-extra";
|
|
6
6
|
const execAsync = promisify(exec);
|
|
7
7
|
export async function checkClarinetInstallation() {
|
|
8
8
|
try {
|
|
9
|
-
await execAsync(
|
|
9
|
+
await execAsync("clarinet --version");
|
|
10
10
|
return true;
|
|
11
11
|
}
|
|
12
12
|
catch {
|
|
@@ -14,50 +14,42 @@ export async function checkClarinetInstallation() {
|
|
|
14
14
|
}
|
|
15
15
|
}
|
|
16
16
|
export async function initializeClarinet(config) {
|
|
17
|
-
const spinner = ora(
|
|
17
|
+
const spinner = ora("Initializing Clarinet...").start();
|
|
18
18
|
try {
|
|
19
19
|
const { projectPath, projectName } = config;
|
|
20
|
-
// Create
|
|
21
|
-
const
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
//
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
balance = 10_000_000_000_000_000
|
|
45
|
-
|
|
46
|
-
[accounts.wallet_2]
|
|
47
|
-
mnemonic = "hold excess usual excess ring elephant install account glad dry display sauce"
|
|
48
|
-
balance = 10_000_000_000_000_000
|
|
49
|
-
`;
|
|
50
|
-
await fs.writeFile(path.join(projectPath, 'settings', 'Devnet.toml'), devnetToml);
|
|
51
|
-
spinner.succeed('Clarinet initialized');
|
|
20
|
+
// Create a temporary directory for Clarinet initialization
|
|
21
|
+
const tempDir = path.join(projectPath, ".temp_clarinet");
|
|
22
|
+
await fs.ensureDir(tempDir);
|
|
23
|
+
// Run clarinet new in temp directory
|
|
24
|
+
try {
|
|
25
|
+
await execAsync(`cd "${tempDir}" && clarinet new "${projectName}" --disable-telemetry`);
|
|
26
|
+
}
|
|
27
|
+
catch (e) {
|
|
28
|
+
// If clarinet new fails, it might be because of directory structure
|
|
29
|
+
// specific error handling could be added here
|
|
30
|
+
throw new Error(`Clarinet initialization failed: ${e.message}`);
|
|
31
|
+
}
|
|
32
|
+
const sourceDir = path.join(tempDir, projectName);
|
|
33
|
+
// Copy generated Clarinet.toml
|
|
34
|
+
if (await fs.pathExists(path.join(sourceDir, "Clarinet.toml"))) {
|
|
35
|
+
await fs.copy(path.join(sourceDir, "Clarinet.toml"), path.join(projectPath, "Clarinet.toml"));
|
|
36
|
+
}
|
|
37
|
+
// Copy settings directory (Devnet.toml)
|
|
38
|
+
if (await fs.pathExists(path.join(sourceDir, "settings"))) {
|
|
39
|
+
await fs.copy(path.join(sourceDir, "settings"), path.join(projectPath, "settings"));
|
|
40
|
+
}
|
|
41
|
+
// Cleanup temp directory
|
|
42
|
+
await fs.remove(tempDir);
|
|
43
|
+
spinner.succeed("Clarinet initialized");
|
|
52
44
|
}
|
|
53
45
|
catch (error) {
|
|
54
|
-
spinner.fail(
|
|
46
|
+
spinner.fail("Failed to initialize Clarinet");
|
|
55
47
|
throw error;
|
|
56
48
|
}
|
|
57
49
|
}
|
|
58
50
|
export async function updateClarinetConfig(projectPath, contracts) {
|
|
59
|
-
const clarinetTomlPath = path.join(projectPath,
|
|
60
|
-
let tomlContent = await fs.readFile(clarinetTomlPath,
|
|
51
|
+
const clarinetTomlPath = path.join(projectPath, "Clarinet.toml");
|
|
52
|
+
let tomlContent = await fs.readFile(clarinetTomlPath, "utf-8");
|
|
61
53
|
// Add contracts based on selection
|
|
62
54
|
for (const contract of contracts) {
|
|
63
55
|
tomlContent += `
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clarinet.js","sourceRoot":"","sources":["../../src/utils/clarinet.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,UAAU,CAAC;AAG1B,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AAElC,MAAM,CAAC,KAAK,UAAU,yBAAyB;IAC7C,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,oBAAoB,CAAC,CAAC;QACtC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,MAAqB;IAC5D,MAAM,OAAO,GAAG,GAAG,CAAC,0BAA0B,CAAC,CAAC,KAAK,EAAE,CAAC;IAExD,IAAI,CAAC;QACH,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC;QAE5C,
|
|
1
|
+
{"version":3,"file":"clarinet.js","sourceRoot":"","sources":["../../src/utils/clarinet.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/filesystem.js
CHANGED
|
@@ -134,7 +134,7 @@ MIT
|
|
|
134
134
|
await fs.writeFile(path.join(projectPath, 'README.md'), readme);
|
|
135
135
|
}
|
|
136
136
|
async function createRootPackageJson(projectPath, config) {
|
|
137
|
-
const { projectName
|
|
137
|
+
const { projectName } = config;
|
|
138
138
|
const packageJson = {
|
|
139
139
|
name: projectName,
|
|
140
140
|
version: '0.1.0',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filesystem.js","sourceRoot":"","sources":["../../src/utils/filesystem.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"filesystem.js","sourceRoot":"","sources":["../../src/utils/filesystem.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/git.js
CHANGED
|
@@ -15,7 +15,7 @@ export async function initializeGit(projectPath) {
|
|
|
15
15
|
catch (error) {
|
|
16
16
|
spinner.fail('Failed to initialize Git repository');
|
|
17
17
|
// Non-fatal error, just warn
|
|
18
|
-
console.warn('Git initialization failed. You can initialize it manually.');
|
|
18
|
+
console.warn('Git initialization failed. You can initialize it manually.', error.message);
|
|
19
19
|
}
|
|
20
20
|
}
|
|
21
21
|
//# sourceMappingURL=git.js.map
|
package/dist/utils/git.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/utils/git.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAEjC,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AAElC,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,WAAmB;IACrD,MAAM,OAAO,GAAG,GAAG,CAAC,gCAAgC,CAAC,CAAC,KAAK,EAAE,CAAC;IAE9D,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,UAAU,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC,CAAC;QAClD,MAAM,SAAS,CAAC,YAAY,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC,CAAC;QACpD,MAAM,SAAS,CAAC,uDAAuD,EAAE;YACvE,GAAG,EAAE,WAAW;SACjB,CAAC,CAAC;QAEH,OAAO,CAAC,OAAO,CAAC,4BAA4B,CAAC,CAAC;IAChD,CAAC;IAAC,OAAO,
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/utils/git.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAEjC,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AAElC,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,WAAmB;IACrD,MAAM,OAAO,GAAG,GAAG,CAAC,gCAAgC,CAAC,CAAC,KAAK,EAAE,CAAC;IAE9D,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,UAAU,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC,CAAC;QAClD,MAAM,SAAS,CAAC,YAAY,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC,CAAC;QACpD,MAAM,SAAS,CAAC,uDAAuD,EAAE;YACvE,GAAG,EAAE,WAAW;SACjB,CAAC,CAAC;QAEH,OAAO,CAAC,OAAO,CAAC,4BAA4B,CAAC,CAAC;IAChD,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,OAAO,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;QACpD,6BAA6B;QAC7B,OAAO,CAAC,IAAI,CAAC,4DAA4D,EAAG,KAAe,CAAC,OAAO,CAAC,CAAC;IACvG,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@devvmichael/create-stacks-app",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.41",
|
|
4
4
|
"description": "Scaffold full-stack Stacks blockchain applications",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
"build": "tsc",
|
|
16
16
|
"dev": "tsc --watch",
|
|
17
17
|
"clean": "rm -rf dist",
|
|
18
|
-
"lint": "eslint src
|
|
18
|
+
"lint": "eslint src",
|
|
19
19
|
"test": "vitest run",
|
|
20
20
|
"prepublishOnly": "npm run build"
|
|
21
21
|
},
|
|
@@ -40,10 +40,13 @@
|
|
|
40
40
|
"zod": "^3.22.4"
|
|
41
41
|
},
|
|
42
42
|
"devDependencies": {
|
|
43
|
+
"@eslint/js": "^9.39.2",
|
|
43
44
|
"@types/fs-extra": "^11.0.4",
|
|
44
45
|
"@types/inquirer": "^9.0.7",
|
|
45
46
|
"@types/node": "^20.10.0",
|
|
47
|
+
"eslint": "^9.39.2",
|
|
46
48
|
"typescript": "^5.3.3",
|
|
49
|
+
"typescript-eslint": "^8.53.1",
|
|
47
50
|
"vitest": "^1.0.4"
|
|
48
51
|
},
|
|
49
52
|
"engines": {
|
|
@@ -1,14 +1,11 @@
|
|
|
1
|
-
import { useState, useEffect, useCallback } from
|
|
2
|
-
import {
|
|
3
|
-
import { StacksTestnet, StacksMainnet } from
|
|
4
|
-
import { Header } from
|
|
5
|
-
import { CounterInteraction } from
|
|
6
|
-
|
|
7
|
-
const appConfig = new AppConfig(['store_write', 'publish_data']);
|
|
8
|
-
const userSession = new UserSession({ appConfig });
|
|
1
|
+
import { useState, useEffect, useCallback } from "react";
|
|
2
|
+
import { connect, disconnect, getLocalStorage } from "@stacks/connect";
|
|
3
|
+
import { StacksTestnet, StacksMainnet } from "@stacks/network";
|
|
4
|
+
import { Header } from "./components/Header";
|
|
5
|
+
import { CounterInteraction } from "./components/CounterInteraction";
|
|
9
6
|
|
|
10
7
|
const network =
|
|
11
|
-
import.meta.env.VITE_NETWORK ===
|
|
8
|
+
import.meta.env.VITE_NETWORK === "mainnet"
|
|
12
9
|
? new StacksMainnet()
|
|
13
10
|
: new StacksTestnet();
|
|
14
11
|
|
|
@@ -16,29 +13,34 @@ function App() {
|
|
|
16
13
|
const [address, setAddress] = useState<string | null>(null);
|
|
17
14
|
|
|
18
15
|
useEffect(() => {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
16
|
+
// Check local storage for existing session
|
|
17
|
+
const storage = getLocalStorage();
|
|
18
|
+
const networkKey =
|
|
19
|
+
import.meta.env.VITE_NETWORK === "mainnet" ? "mainnet" : "testnet";
|
|
20
|
+
if (storage?.addresses?.[networkKey]) {
|
|
21
|
+
setAddress(storage.addresses[networkKey]);
|
|
23
22
|
}
|
|
24
23
|
}, []);
|
|
25
24
|
|
|
26
|
-
const handleConnect = useCallback(() => {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
25
|
+
const handleConnect = useCallback(async () => {
|
|
26
|
+
try {
|
|
27
|
+
const response = await connect();
|
|
28
|
+
// Access the first address from the response
|
|
29
|
+
const userAddress = response.addresses?.[0]?.address;
|
|
30
|
+
if (userAddress) {
|
|
31
|
+
setAddress(userAddress);
|
|
32
|
+
// Optional: reload if needed to reset state, or handle reactively
|
|
34
33
|
window.location.reload();
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
|
|
34
|
+
}
|
|
35
|
+
} catch (error) {
|
|
36
|
+
console.error("Failed to connect:", error);
|
|
37
|
+
}
|
|
38
38
|
}, []);
|
|
39
39
|
|
|
40
40
|
const handleDisconnect = useCallback(() => {
|
|
41
|
-
|
|
41
|
+
disconnect();
|
|
42
|
+
setAddress(null);
|
|
43
|
+
window.location.reload();
|
|
42
44
|
}, []);
|
|
43
45
|
|
|
44
46
|
return (
|
|
@@ -51,7 +53,9 @@ function App() {
|
|
|
51
53
|
|
|
52
54
|
<main className="flex-1 container mx-auto px-4 py-8">
|
|
53
55
|
<div className="mb-8 text-center">
|
|
54
|
-
<h1 className="mb-4 text-4xl font-bold">
|
|
56
|
+
<h1 className="mb-4 text-4xl font-bold">
|
|
57
|
+
Welcome to Your Stacks App
|
|
58
|
+
</h1>
|
|
55
59
|
<p className="text-lg text-gray-400">
|
|
56
60
|
A full-stack Stacks blockchain application
|
|
57
61
|
</p>
|
|
@@ -71,19 +75,24 @@ function App() {
|
|
|
71
75
|
<div className="card">
|
|
72
76
|
<h3 className="font-semibold mb-2">📝 Edit Contracts</h3>
|
|
73
77
|
<p className="text-sm text-gray-400">
|
|
74
|
-
Modify contracts in
|
|
78
|
+
Modify contracts in{" "}
|
|
79
|
+
<code className="bg-gray-800 px-1 rounded">contracts/</code>
|
|
75
80
|
</p>
|
|
76
81
|
</div>
|
|
77
82
|
<div className="card">
|
|
78
83
|
<h3 className="font-semibold mb-2">🧪 Run Tests</h3>
|
|
79
84
|
<p className="text-sm text-gray-400">
|
|
80
|
-
Run
|
|
85
|
+
Run{" "}
|
|
86
|
+
<code className="bg-gray-800 px-1 rounded">npm run test</code>
|
|
81
87
|
</p>
|
|
82
88
|
</div>
|
|
83
89
|
<div className="card">
|
|
84
90
|
<h3 className="font-semibold mb-2">🚀 Deploy</h3>
|
|
85
91
|
<p className="text-sm text-gray-400">
|
|
86
|
-
Run
|
|
92
|
+
Run{" "}
|
|
93
|
+
<code className="bg-gray-800 px-1 rounded">
|
|
94
|
+
npm run deploy:testnet
|
|
95
|
+
</code>
|
|
87
96
|
</p>
|
|
88
97
|
</div>
|
|
89
98
|
</div>
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { useState, useEffect, useCallback } from
|
|
2
|
-
import {
|
|
3
|
-
import { callReadOnlyFunction, cvToValue } from
|
|
4
|
-
import type { StacksNetwork } from
|
|
1
|
+
import { useState, useEffect, useCallback } from "react";
|
|
2
|
+
import { request } from "@stacks/connect";
|
|
3
|
+
import { callReadOnlyFunction, cvToValue } from "@stacks/transactions";
|
|
4
|
+
import type { StacksNetwork } from "@stacks/network";
|
|
5
5
|
|
|
6
6
|
interface CounterInteractionProps {
|
|
7
7
|
network: StacksNetwork;
|
|
@@ -9,10 +9,16 @@ interface CounterInteractionProps {
|
|
|
9
9
|
senderAddress: string | null;
|
|
10
10
|
}
|
|
11
11
|
|
|
12
|
-
const contractAddress =
|
|
13
|
-
|
|
12
|
+
const contractAddress =
|
|
13
|
+
import.meta.env.VITE_CONTRACT_ADDRESS ||
|
|
14
|
+
"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM";
|
|
15
|
+
const contractName = "counter";
|
|
14
16
|
|
|
15
|
-
export function CounterInteraction({
|
|
17
|
+
export function CounterInteraction({
|
|
18
|
+
network,
|
|
19
|
+
isConnected,
|
|
20
|
+
senderAddress,
|
|
21
|
+
}: CounterInteractionProps) {
|
|
16
22
|
const [counter, setCounter] = useState<number | null>(null);
|
|
17
23
|
const [isLoading, setIsLoading] = useState(true);
|
|
18
24
|
const [isIncrementing, setIsIncrementing] = useState(false);
|
|
@@ -23,15 +29,15 @@ export function CounterInteraction({ network, isConnected, senderAddress }: Coun
|
|
|
23
29
|
const result = await callReadOnlyFunction({
|
|
24
30
|
contractAddress,
|
|
25
31
|
contractName,
|
|
26
|
-
functionName:
|
|
32
|
+
functionName: "get-counter",
|
|
27
33
|
functionArgs: [],
|
|
28
34
|
network,
|
|
29
35
|
senderAddress: contractAddress,
|
|
30
36
|
});
|
|
31
37
|
const value = cvToValue(result);
|
|
32
|
-
setCounter(value?.value
|
|
38
|
+
setCounter(value?.value ? Number(value.value) : 0);
|
|
33
39
|
} catch (error) {
|
|
34
|
-
console.error(
|
|
40
|
+
console.error("Failed to fetch counter:", error);
|
|
35
41
|
} finally {
|
|
36
42
|
setIsLoading(false);
|
|
37
43
|
}
|
|
@@ -45,18 +51,16 @@ export function CounterInteraction({ network, isConnected, senderAddress }: Coun
|
|
|
45
51
|
if (!senderAddress) return;
|
|
46
52
|
setIsIncrementing(true);
|
|
47
53
|
try {
|
|
48
|
-
await
|
|
49
|
-
contractAddress
|
|
50
|
-
|
|
51
|
-
functionName: 'increment',
|
|
54
|
+
await request("stx_callContract", {
|
|
55
|
+
contract: `${contractAddress}.${contractName}`,
|
|
56
|
+
functionName: "increment",
|
|
52
57
|
functionArgs: [],
|
|
53
|
-
|
|
54
|
-
onFinish: () => {
|
|
55
|
-
setTimeout(fetchCounter, 2000);
|
|
56
|
-
},
|
|
58
|
+
postConditions: [],
|
|
57
59
|
});
|
|
60
|
+
|
|
61
|
+
setTimeout(fetchCounter, 2000);
|
|
58
62
|
} catch (error) {
|
|
59
|
-
console.error(
|
|
63
|
+
console.error("Increment failed:", error);
|
|
60
64
|
} finally {
|
|
61
65
|
setIsIncrementing(false);
|
|
62
66
|
}
|
|
@@ -66,18 +70,16 @@ export function CounterInteraction({ network, isConnected, senderAddress }: Coun
|
|
|
66
70
|
if (!senderAddress) return;
|
|
67
71
|
setIsDecrementing(true);
|
|
68
72
|
try {
|
|
69
|
-
await
|
|
70
|
-
contractAddress
|
|
71
|
-
|
|
72
|
-
functionName: 'decrement',
|
|
73
|
+
await request("stx_callContract", {
|
|
74
|
+
contract: `${contractAddress}.${contractName}`,
|
|
75
|
+
functionName: "decrement",
|
|
73
76
|
functionArgs: [],
|
|
74
|
-
|
|
75
|
-
onFinish: () => {
|
|
76
|
-
setTimeout(fetchCounter, 2000);
|
|
77
|
-
},
|
|
77
|
+
postConditions: [],
|
|
78
78
|
});
|
|
79
|
+
|
|
80
|
+
setTimeout(fetchCounter, 2000);
|
|
79
81
|
} catch (error) {
|
|
80
|
-
console.error(
|
|
82
|
+
console.error("Decrement failed:", error);
|
|
81
83
|
} finally {
|
|
82
84
|
setIsDecrementing(false);
|
|
83
85
|
}
|
|
@@ -88,8 +90,8 @@ export function CounterInteraction({ network, isConnected, senderAddress }: Coun
|
|
|
88
90
|
<h2 className="text-2xl font-bold mb-4">Counter Contract</h2>
|
|
89
91
|
|
|
90
92
|
<div className="mb-6 text-center">
|
|
91
|
-
<div className="text-6xl font-bold text-
|
|
92
|
-
{isLoading ?
|
|
93
|
+
<div className="text-6xl font-bold text-gray-100">
|
|
94
|
+
{isLoading ? "..." : counter}
|
|
93
95
|
</div>
|
|
94
96
|
<p className="text-sm text-gray-500 mt-2">Current count</p>
|
|
95
97
|
</div>
|
|
@@ -101,14 +103,14 @@ export function CounterInteraction({ network, isConnected, senderAddress }: Coun
|
|
|
101
103
|
disabled={isDecrementing || counter === 0}
|
|
102
104
|
className="btn-secondary flex-1 disabled:opacity-50"
|
|
103
105
|
>
|
|
104
|
-
{isDecrementing ?
|
|
106
|
+
{isDecrementing ? "Processing..." : "− Decrement"}
|
|
105
107
|
</button>
|
|
106
108
|
<button
|
|
107
109
|
onClick={handleIncrement}
|
|
108
110
|
disabled={isIncrementing}
|
|
109
111
|
className="btn-primary flex-1 disabled:opacity-50"
|
|
110
112
|
>
|
|
111
|
-
{isIncrementing ?
|
|
113
|
+
{isIncrementing ? "Processing..." : "+ Increment"}
|
|
112
114
|
</button>
|
|
113
115
|
</div>
|
|
114
116
|
) : (
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
VITE_NETWORK=testnet
|
|
2
|
-
VITE_CONTRACT_ADDRESS=ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM
|
|
2
|
+
VITE_CONTRACT_ADDRESS=ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM
|
|
@@ -1,13 +1,10 @@
|
|
|
1
1
|
<script setup lang="ts">
|
|
2
2
|
import { ref, onMounted } from 'vue';
|
|
3
|
-
import {
|
|
3
|
+
import { connect, disconnect, getLocalStorage } from '@stacks/connect';
|
|
4
4
|
import { StacksTestnet, StacksMainnet } from '@stacks/network';
|
|
5
5
|
import AppHeader from './components/AppHeader.vue';
|
|
6
6
|
import CounterInteraction from './components/CounterInteraction.vue';
|
|
7
7
|
|
|
8
|
-
const appConfig = new AppConfig(['store_write', 'publish_data']);
|
|
9
|
-
const userSession = new UserSession({ appConfig });
|
|
10
|
-
|
|
11
8
|
const network =
|
|
12
9
|
import.meta.env.VITE_NETWORK === 'mainnet'
|
|
13
10
|
? new StacksMainnet()
|
|
@@ -16,29 +13,30 @@ const network =
|
|
|
16
13
|
const address = ref<string | null>(null);
|
|
17
14
|
|
|
18
15
|
onMounted(() => {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
address.value =
|
|
16
|
+
const storage = getLocalStorage();
|
|
17
|
+
const networkKey = import.meta.env.VITE_NETWORK === 'mainnet' ? 'mainnet' : 'testnet';
|
|
18
|
+
if (storage?.addresses?.[networkKey]) {
|
|
19
|
+
address.value = storage.addresses[networkKey];
|
|
23
20
|
}
|
|
24
21
|
});
|
|
25
22
|
|
|
26
|
-
function handleConnect() {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
redirectTo: '/',
|
|
33
|
-
onFinish: () => {
|
|
23
|
+
async function handleConnect() {
|
|
24
|
+
try {
|
|
25
|
+
const response = await connect();
|
|
26
|
+
const userAddress = response.addresses?.[0]?.address;
|
|
27
|
+
if (userAddress) {
|
|
28
|
+
address.value = userAddress;
|
|
34
29
|
window.location.reload();
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
|
|
30
|
+
}
|
|
31
|
+
} catch (error) {
|
|
32
|
+
console.error('Failed to connect:', error);
|
|
33
|
+
}
|
|
38
34
|
}
|
|
39
35
|
|
|
40
36
|
function handleDisconnect() {
|
|
41
|
-
|
|
37
|
+
disconnect();
|
|
38
|
+
address.value = null;
|
|
39
|
+
window.location.reload();
|
|
42
40
|
}
|
|
43
41
|
</script>
|
|
44
42
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<script setup lang="ts">
|
|
2
2
|
import { ref, onMounted } from 'vue';
|
|
3
|
-
import {
|
|
3
|
+
import { request } from '@stacks/connect';
|
|
4
4
|
import { callReadOnlyFunction, cvToValue } from '@stacks/transactions';
|
|
5
5
|
import type { StacksNetwork } from '@stacks/network';
|
|
6
6
|
|
|
@@ -29,7 +29,8 @@ async function fetchCounter() {
|
|
|
29
29
|
senderAddress: contractAddress,
|
|
30
30
|
});
|
|
31
31
|
const value = cvToValue(result);
|
|
32
|
-
|
|
32
|
+
// Handle both bigint (Stacks returns bigint now often) and number types safely
|
|
33
|
+
counter.value = value?.value ? Number(value.value) : 0;
|
|
33
34
|
} catch (error) {
|
|
34
35
|
console.error('Failed to fetch counter:', error);
|
|
35
36
|
} finally {
|
|
@@ -45,16 +46,15 @@ async function handleIncrement() {
|
|
|
45
46
|
if (!props.senderAddress) return;
|
|
46
47
|
isIncrementing.value = true;
|
|
47
48
|
try {
|
|
48
|
-
await
|
|
49
|
-
contractAddress
|
|
50
|
-
contractName,
|
|
49
|
+
await request('stx_callContract', {
|
|
50
|
+
contract: `${contractAddress}.${contractName}`,
|
|
51
51
|
functionName: 'increment',
|
|
52
52
|
functionArgs: [],
|
|
53
|
-
|
|
54
|
-
onFinish: () => {
|
|
55
|
-
setTimeout(fetchCounter, 2000);
|
|
56
|
-
},
|
|
53
|
+
postConditions: [],
|
|
57
54
|
});
|
|
55
|
+
|
|
56
|
+
// Speculatively refetch
|
|
57
|
+
setTimeout(fetchCounter, 2000);
|
|
58
58
|
} catch (error) {
|
|
59
59
|
console.error('Increment failed:', error);
|
|
60
60
|
} finally {
|
|
@@ -66,16 +66,14 @@ async function handleDecrement() {
|
|
|
66
66
|
if (!props.senderAddress) return;
|
|
67
67
|
isDecrementing.value = true;
|
|
68
68
|
try {
|
|
69
|
-
await
|
|
70
|
-
contractAddress
|
|
71
|
-
contractName,
|
|
69
|
+
await request('stx_callContract', {
|
|
70
|
+
contract: `${contractAddress}.${contractName}`,
|
|
72
71
|
functionName: 'decrement',
|
|
73
72
|
functionArgs: [],
|
|
74
|
-
|
|
75
|
-
onFinish: () => {
|
|
76
|
-
setTimeout(fetchCounter, 2000);
|
|
77
|
-
},
|
|
73
|
+
postConditions: [],
|
|
78
74
|
});
|
|
75
|
+
|
|
76
|
+
setTimeout(fetchCounter, 2000);
|
|
79
77
|
} catch (error) {
|
|
80
78
|
console.error('Decrement failed:', error);
|
|
81
79
|
} finally {
|
|
@@ -89,7 +87,7 @@ async function handleDecrement() {
|
|
|
89
87
|
<h2 class="text-2xl font-bold mb-4">Counter Contract</h2>
|
|
90
88
|
|
|
91
89
|
<div class="mb-6 text-center">
|
|
92
|
-
<div class="text-6xl font-bold text-
|
|
90
|
+
<div class="text-6xl font-bold text-gray-100">
|
|
93
91
|
{{ isLoading ? '...' : counter }}
|
|
94
92
|
</div>
|
|
95
93
|
<p class="text-sm text-gray-500 mt-2">Current count</p>
|