hybrid 0.1.1 → 0.1.2
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.d.ts +1 -0
- package/dist/cli.mjs +3 -575
- package/dist/cli.mjs.map +1 -1
- package/dist/components/DefaultButton.d.ts +10 -0
- package/dist/components/MintButton.d.ts +10 -0
- package/dist/components/index.d.ts +1 -0
- package/dist/hooks/index.d.ts +1 -0
- package/dist/hooks/internal/index.d.ts +1 -0
- package/dist/hooks/internal/useContext.d.ts +4 -0
- package/dist/hooks/useMinting.d.ts +8 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/providers/Web3Provider.d.ts +16 -0
- package/dist/providers/helpers.d.ts +7 -0
- package/dist/stats.html +6177 -0
- package/dist/style.css +2 -0
- package/dist/style.css.map +1 -0
- package/dist/types.d.ts +5 -0
- package/dist/utils/basisPoints.d.ts +3 -0
- package/dist/utils/conversion.d.ts +3 -0
- package/dist/utils/etherscan.d.ts +3 -0
- package/dist/utils/formatting.d.ts +7 -0
- package/dist/utils/index.d.ts +3 -0
- package/dist/wallets/ConnectButton.d.ts +2 -0
- package/package.json +104 -39
- package/README.md +0 -11
- package/dist/cli.js +0 -547
- package/dist/cli.js.map +0 -1
package/dist/cli.d.ts
CHANGED
package/dist/cli.mjs
CHANGED
|
@@ -1,577 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
var __defProps = Object.defineProperties;
|
|
4
|
-
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
5
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
-
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
7
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
-
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
9
|
-
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
10
|
-
var __spreadValues = (a, b) => {
|
|
11
|
-
for (var prop in b || (b = {}))
|
|
12
|
-
if (__hasOwnProp.call(b, prop))
|
|
13
|
-
__defNormalProp(a, prop, b[prop]);
|
|
14
|
-
if (__getOwnPropSymbols)
|
|
15
|
-
for (var prop of __getOwnPropSymbols(b)) {
|
|
16
|
-
if (__propIsEnum.call(b, prop))
|
|
17
|
-
__defNormalProp(a, prop, b[prop]);
|
|
18
|
-
}
|
|
19
|
-
return a;
|
|
20
|
-
};
|
|
21
|
-
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
22
|
-
var __esm = (fn, res) => function __init() {
|
|
23
|
-
return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
|
|
24
|
-
};
|
|
25
|
-
var __commonJS = (cb, mod) => function __require() {
|
|
26
|
-
return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
|
|
27
|
-
};
|
|
28
|
-
var __async = (__this, __arguments, generator) => {
|
|
29
|
-
return new Promise((resolve, reject) => {
|
|
30
|
-
var fulfilled = (value) => {
|
|
31
|
-
try {
|
|
32
|
-
step(generator.next(value));
|
|
33
|
-
} catch (e) {
|
|
34
|
-
reject(e);
|
|
35
|
-
}
|
|
36
|
-
};
|
|
37
|
-
var rejected = (value) => {
|
|
38
|
-
try {
|
|
39
|
-
step(generator.throw(value));
|
|
40
|
-
} catch (e) {
|
|
41
|
-
reject(e);
|
|
42
|
-
}
|
|
43
|
-
};
|
|
44
|
-
var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
|
|
45
|
-
step((generator = generator.apply(__this, __arguments)).next());
|
|
46
|
-
});
|
|
47
|
-
};
|
|
2
|
+
import { run } from '@hybrd/cli';
|
|
48
3
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
import fs from "fs";
|
|
52
|
-
import ora from "ora";
|
|
53
|
-
function writeFile(path3, data) {
|
|
54
|
-
return __async(this, null, function* () {
|
|
55
|
-
return fs.writeFileSync(path3, data);
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
function cmd(_0, _1) {
|
|
59
|
-
return __async(this, arguments, function* (cmd2, args, opts = {
|
|
60
|
-
encoding: "utf8"
|
|
61
|
-
}) {
|
|
62
|
-
return new Promise((resolve, reject) => {
|
|
63
|
-
const install = spawn(cmd2, args, opts);
|
|
64
|
-
install.stdout.on("data", (data) => {
|
|
65
|
-
var _a;
|
|
66
|
-
(_a = opts.stdout) == null ? void 0 : _a.call(opts, data.toString());
|
|
67
|
-
});
|
|
68
|
-
install.stderr.on("data", (data) => {
|
|
69
|
-
var _a;
|
|
70
|
-
(_a = opts.stderr) == null ? void 0 : _a.call(opts, data.toString());
|
|
71
|
-
});
|
|
72
|
-
install.on("error", (error) => {
|
|
73
|
-
reject(error);
|
|
74
|
-
});
|
|
75
|
-
install.on("close", (code) => {
|
|
76
|
-
resolve(code);
|
|
77
|
-
});
|
|
78
|
-
});
|
|
79
|
-
});
|
|
80
|
-
}
|
|
81
|
-
function spinner(label, fn) {
|
|
82
|
-
return __async(this, null, function* () {
|
|
83
|
-
let spinner2;
|
|
84
|
-
if (label)
|
|
85
|
-
spinner2 = ora(label).start();
|
|
86
|
-
return fn().then(() => {
|
|
87
|
-
spinner2 == null ? void 0 : spinner2.succeed(`${label} ... DONE`);
|
|
88
|
-
}).catch((err) => {
|
|
89
|
-
spinner2 == null ? void 0 : spinner2.fail(`${label}`);
|
|
90
|
-
console.error(err);
|
|
91
|
-
});
|
|
92
|
-
});
|
|
93
|
-
}
|
|
94
|
-
var init_helpers = __esm({
|
|
95
|
-
"src/lib/helpers.ts"() {
|
|
96
|
-
}
|
|
97
|
-
});
|
|
98
|
-
|
|
99
|
-
// src/lib/foundry.ts
|
|
100
|
-
function build() {
|
|
101
|
-
return __async(this, arguments, function* (opts = {}) {
|
|
102
|
-
return new Promise((resolve, reject) => __async(this, null, function* () {
|
|
103
|
-
return cmd("forge", ["build", "--force"], __spreadProps(__spreadValues({}, opts), {
|
|
104
|
-
// hijack the stderr and reject if anything comes thru
|
|
105
|
-
stderr: (msg) => reject(msg)
|
|
106
|
-
})).then(resolve);
|
|
107
|
-
}));
|
|
108
|
-
});
|
|
109
|
-
}
|
|
110
|
-
function forgeDeploy(name, rpc, key) {
|
|
111
|
-
return __async(this, null, function* () {
|
|
112
|
-
const output = [];
|
|
113
|
-
const error = [];
|
|
114
|
-
yield cmd("forge", ["create", name, `--rpc-url`, rpc, "--private-key", key], {
|
|
115
|
-
stdout: (msg) => output.push(msg),
|
|
116
|
-
stderr: (err) => error.push(err)
|
|
117
|
-
});
|
|
118
|
-
const address = output.join("").match(/Deployed to: (0x.{40})/);
|
|
119
|
-
const hash = output.join("").match(/Transaction hash: (0x.{64})/);
|
|
120
|
-
return {
|
|
121
|
-
address: address ? address[1] : null,
|
|
122
|
-
hash: hash ? hash[1] : null
|
|
123
|
-
};
|
|
124
|
-
});
|
|
125
|
-
}
|
|
126
|
-
function anvil(mnemonic, forkUrl) {
|
|
127
|
-
return __async(this, null, function* () {
|
|
128
|
-
return new Promise((resolve) => {
|
|
129
|
-
cmd(
|
|
130
|
-
"anvil",
|
|
131
|
-
["--mnemonic", mnemonic, "--fork-url", forkUrl, "--chain-id", "1337"],
|
|
132
|
-
{
|
|
133
|
-
stdout: (str) => {
|
|
134
|
-
const keys = str.match(/0x.{64}/g);
|
|
135
|
-
const listens = str.match(/Listening on (.*?)\n/);
|
|
136
|
-
if (listens) {
|
|
137
|
-
const [host, port] = listens[1].split(":");
|
|
138
|
-
resolve({
|
|
139
|
-
host,
|
|
140
|
-
port,
|
|
141
|
-
keys
|
|
142
|
-
});
|
|
143
|
-
}
|
|
144
|
-
},
|
|
145
|
-
stderr: (str) => process.stderr.write(str)
|
|
146
|
-
}
|
|
147
|
-
);
|
|
148
|
-
});
|
|
149
|
-
});
|
|
150
|
-
}
|
|
151
|
-
var init_foundry = __esm({
|
|
152
|
-
"src/lib/foundry.ts"() {
|
|
153
|
-
init_helpers();
|
|
154
|
-
}
|
|
155
|
-
});
|
|
156
|
-
|
|
157
|
-
// src/cmd/build.ts
|
|
158
|
-
function build2() {
|
|
159
|
-
return __async(this, null, function* () {
|
|
160
|
-
return spinner("Building contracts...", () => build());
|
|
161
|
-
});
|
|
162
|
-
}
|
|
163
|
-
var init_build = __esm({
|
|
164
|
-
"src/cmd/build.ts"() {
|
|
165
|
-
init_foundry();
|
|
166
|
-
init_helpers();
|
|
167
|
-
}
|
|
168
|
-
});
|
|
169
|
-
|
|
170
|
-
// src/cmd/test.ts
|
|
171
|
-
import { execSync } from "child_process";
|
|
172
|
-
function test() {
|
|
173
|
-
return __async(this, null, function* () {
|
|
174
|
-
return execSync("forge test", { stdio: "inherit" });
|
|
175
|
-
});
|
|
176
|
-
}
|
|
177
|
-
var init_test = __esm({
|
|
178
|
-
"src/cmd/test.ts"() {
|
|
179
|
-
}
|
|
180
|
-
});
|
|
181
|
-
|
|
182
|
-
// src/lib/builder.ts
|
|
183
|
-
import fs2 from "fs";
|
|
184
|
-
var writeConfig, listContracts;
|
|
185
|
-
var init_builder = __esm({
|
|
186
|
-
"src/lib/builder.ts"() {
|
|
187
|
-
writeConfig = () => __async(void 0, null, function* () {
|
|
188
|
-
const contracts = yield listContracts(process.cwd() + "/contracts");
|
|
189
|
-
const abis = contracts.reduce((acc, filename) => {
|
|
190
|
-
const name = filename.replace(".sol", "");
|
|
191
|
-
acc[name] = `require("./out/${name}.sol/${name}.json").abi as Abi`;
|
|
192
|
-
return acc;
|
|
193
|
-
}, {});
|
|
194
|
-
return fs2.writeFileSync(
|
|
195
|
-
process.cwd() + "/.hybrid/index.ts",
|
|
196
|
-
`
|
|
197
|
-
import { Abi } from "abitype";
|
|
198
|
-
|
|
199
|
-
export const ABI = {
|
|
200
|
-
${Object.keys(abis).map((name) => `${name}: ${abis[name]}`).join(",\n ")}
|
|
201
|
-
};
|
|
202
|
-
`
|
|
203
|
-
);
|
|
204
|
-
});
|
|
205
|
-
listContracts = (dir) => __async(void 0, null, function* () {
|
|
206
|
-
const files = yield fs2.readdirSync(dir);
|
|
207
|
-
return files.filter((f) => !f.match(/(t|test)\.sol$/));
|
|
208
|
-
});
|
|
209
|
-
}
|
|
210
|
-
});
|
|
211
|
-
|
|
212
|
-
// src/cmd/dev.ts
|
|
213
|
-
import bip39 from "bip39";
|
|
214
|
-
import chokidar from "chokidar";
|
|
215
|
-
import path from "path";
|
|
216
|
-
import boxen from "boxen";
|
|
217
|
-
import ora2 from "ora";
|
|
218
|
-
function dev() {
|
|
219
|
-
return __async(this, null, function* () {
|
|
220
|
-
const contractsDir = process.cwd() + "/contracts";
|
|
221
|
-
const forkUrl = "https://goerli.infura.io/v3/e6481145ca1442b7bf2a8444a8cd0fc8";
|
|
222
|
-
const mnemonic = bip39.generateMnemonic();
|
|
223
|
-
const [testnet] = yield Promise.all([
|
|
224
|
-
anvil(mnemonic, forkUrl)
|
|
225
|
-
// @todo - some sort of dev interface
|
|
226
|
-
]);
|
|
227
|
-
console.log();
|
|
228
|
-
console.log(
|
|
229
|
-
boxen(
|
|
230
|
-
`
|
|
231
|
-
Dev UI | http://127.0.0.1:8580
|
|
232
|
-
RPC Node | http://${testnet.host}:${testnet.port}
|
|
233
|
-
----------+----------------------
|
|
234
|
-
Docs | https://hybrid.dev
|
|
235
|
-
Watching | ${"./" + path.relative(process.cwd(), contractsDir)}
|
|
236
|
-
`.trim(),
|
|
237
|
-
{
|
|
238
|
-
title: "Hybrid Dev Server",
|
|
239
|
-
titleAlignment: "left",
|
|
240
|
-
borderColor: "greenBright",
|
|
241
|
-
padding: 1,
|
|
242
|
-
margin: 0.5,
|
|
243
|
-
borderStyle: "double"
|
|
244
|
-
}
|
|
245
|
-
)
|
|
246
|
-
);
|
|
247
|
-
console.log();
|
|
248
|
-
console.log("Keys:");
|
|
249
|
-
console.log(testnet.keys.join("\n"));
|
|
250
|
-
console.log();
|
|
251
|
-
chokidar.watch(contractsDir).on("all", (event, file) => {
|
|
252
|
-
switch (event) {
|
|
253
|
-
case "change":
|
|
254
|
-
if (!file.endsWith(".sol"))
|
|
255
|
-
return;
|
|
256
|
-
if (file.endsWith(".test.sol")) {
|
|
257
|
-
return;
|
|
258
|
-
} else {
|
|
259
|
-
const filename = path.basename(file);
|
|
260
|
-
const name = filename.replace(".sol", "");
|
|
261
|
-
let spinner2 = ora2("Deploying " + name).start();
|
|
262
|
-
forgeDeploy(name, "http://localhost:8545", testnet.keys[0]).then(
|
|
263
|
-
({ address }) => {
|
|
264
|
-
writeConfig();
|
|
265
|
-
spinner2.succeed(name + " deployed to " + address);
|
|
266
|
-
}
|
|
267
|
-
);
|
|
268
|
-
}
|
|
269
|
-
break;
|
|
270
|
-
default:
|
|
271
|
-
break;
|
|
272
|
-
}
|
|
273
|
-
});
|
|
274
|
-
});
|
|
275
|
-
}
|
|
276
|
-
var init_dev = __esm({
|
|
277
|
-
"src/cmd/dev.ts"() {
|
|
278
|
-
init_foundry();
|
|
279
|
-
init_builder();
|
|
280
|
-
}
|
|
281
|
-
});
|
|
282
|
-
|
|
283
|
-
// package.json
|
|
284
|
-
var require_package = __commonJS({
|
|
285
|
-
"package.json"(exports, module) {
|
|
286
|
-
module.exports = {
|
|
287
|
-
name: "hybrid",
|
|
288
|
-
version: "0.1.0",
|
|
289
|
-
description: "Solidity + TypeScript Framework for Web3 Development",
|
|
290
|
-
author: "Ian Hunter <ian@ianh.xyz>",
|
|
291
|
-
homepage: "https://github.com/ian/hybrid#readme",
|
|
292
|
-
license: "ISC",
|
|
293
|
-
main: "dist/cli.js",
|
|
294
|
-
module: "dist/cli.mjs",
|
|
295
|
-
bin: {
|
|
296
|
-
hy: "dist/cli.mjs",
|
|
297
|
-
hybrid: "dist/cli.mjs"
|
|
298
|
-
},
|
|
299
|
-
files: [
|
|
300
|
-
"dist"
|
|
301
|
-
],
|
|
302
|
-
repository: {
|
|
303
|
-
type: "git",
|
|
304
|
-
url: "git+https://github.com/ian/hybrid.git"
|
|
305
|
-
},
|
|
306
|
-
scripts: {
|
|
307
|
-
clean: "rm -rf dist",
|
|
308
|
-
build: "tsup",
|
|
309
|
-
dev: "nodemon",
|
|
310
|
-
test: "node ./__tests__/cli.test.js"
|
|
311
|
-
},
|
|
312
|
-
bugs: {
|
|
313
|
-
url: "https://github.com/ian/hybrid/issues"
|
|
314
|
-
},
|
|
315
|
-
dependencies: {
|
|
316
|
-
"@hybrd/contracts": "^0.1.0",
|
|
317
|
-
"@hybrd/react": "^0.1.0",
|
|
318
|
-
bip39: "^3.1.0",
|
|
319
|
-
boxen: "^7.0.2",
|
|
320
|
-
chalk: "4.1.2",
|
|
321
|
-
chokidar: "^3.5.3",
|
|
322
|
-
commander: "^10.0.0",
|
|
323
|
-
"ethereum-private-key-to-address": "^0.0.7",
|
|
324
|
-
ethers: "^6.1.0",
|
|
325
|
-
figlet: "^1.5.2",
|
|
326
|
-
inquirer: "^9.1.4",
|
|
327
|
-
ora: "5.4.0",
|
|
328
|
-
viem: "^0.1.10"
|
|
329
|
-
},
|
|
330
|
-
devDependencies: {
|
|
331
|
-
"@types/inquirer": "^9.0.3",
|
|
332
|
-
"@types/node": "^18.14.6",
|
|
333
|
-
nodemon: "^2.0.21",
|
|
334
|
-
tsup: "^6.6.3",
|
|
335
|
-
tsx: "^3.12.3",
|
|
336
|
-
typescript: "^4.9.5"
|
|
337
|
-
},
|
|
338
|
-
gitHead: "4dc22eb383621ec5bcdb4989d123489b726af4e7"
|
|
339
|
-
};
|
|
340
|
-
}
|
|
341
|
-
});
|
|
342
|
-
|
|
343
|
-
// src/cmd/init.ts
|
|
344
|
-
import chalk from "chalk";
|
|
345
|
-
import fs3 from "fs";
|
|
346
|
-
import path2 from "path";
|
|
347
|
-
import inquirer from "inquirer";
|
|
348
|
-
function init() {
|
|
349
|
-
return __async(this, null, function* () {
|
|
350
|
-
const mdVersion = require_package().version;
|
|
351
|
-
console.log(`
|
|
352
|
-
|
|
353
|
-
\u2588\u2588\u2584
|
|
354
|
-
\u2584\u2588\u2584 \u2580\u2588\u2588\u2584
|
|
355
|
-
\u2584\u2588\u2588 \u2580\u2588\u2588 \u2588\u2588 \u2580\u2580 \u2593\u2588 \u2593\u2588
|
|
356
|
-
\u2588\u2588 \u2584 \u2580\u2588\u2588 \u2588\u2588\u2584 \u2590\u2588\u2588\u2588\u2588\u2584\u2593\u2588\u2588\u2593 \u2593\u2588 \u2593\u2588\u2588\u2588\u2588\u2584 \u2593\u2588\u2588\u2588 \u2584\u2588\u2588\u2588\u2588\u2588\u2588 \u2593\u2588\u2588\u258C \u2584\u2593\u2588\u2588\u2588\u2584 \u2593\u2588\u2593\u2588\u2588\u2588\u2584
|
|
357
|
-
\u2593\u2588 \u2593\u2588\u2580 \u2588\u2588 \u2588\u2588 \u2590\u2588 \u2588\u258C \u2588\u2588 \u2588\u2588 \u2588\u2588 \u2588\u258C \u2593\u2588 \u2588\u2588 \u2588\u2588 \u2593\u2588 \u2590\u2588 \u2588\u2588 \u2588\u2588 \u2588\u2588
|
|
358
|
-
\u2588\u2588 \u2588\u2588 \u2590\u2588\u2580 \u2593\u2588 \u2590\u2588 \u2588\u258C \u2588\u2588 \u2588\u2588 \u2588\u2588 \u2588\u258C \u2593\u2588 \u2580\u2588\u2584 \u2584\u2588\u2588 \u2593\u2588 \u2590\u2588\u2584 \u2588\u2588 \u2588\u2588\u2584 \u2588\u2588
|
|
359
|
-
\u2590\u2588\u258C \u2590\u2588\u2588\u2584\u2584\u2593\u2588\u2580 \u2588\u2588 \u2580 \u2580\u2580 \u2580\u2580 \u2580\u2580 \u2580\u2580 \u2580 \u2580\u2580 \u2580\u2580\u2580\u2580\u2580\u2580 \u2580\u2580 \u2580\u2580\u2580\u2580 \u2588\u2588\u2580\u2580\u2580\u2580
|
|
360
|
-
\u2580\u2588\u2588\u2584 \u2584\u2588\u2580 \u2588\u2588
|
|
361
|
-
\u2580\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2580 The NFT Development Framework.
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
Installing Hybrid v${mdVersion} ...
|
|
365
|
-
`);
|
|
366
|
-
if (!fs3.existsSync("./package.json")) {
|
|
367
|
-
console.error(
|
|
368
|
-
chalk.red("Error: No package.json found. Are you in the right directory?")
|
|
369
|
-
);
|
|
370
|
-
process.exit();
|
|
371
|
-
}
|
|
372
|
-
const pkgManager = fs3.existsSync("./yarn.lock") ? "yarn" : fs3.existsSync("./pnpm-lock.yaml") ? "pnpm" : "npm";
|
|
373
|
-
const cwd = process.cwd();
|
|
374
|
-
const answers = yield inquirer.prompt([
|
|
375
|
-
{
|
|
376
|
-
name: "chain",
|
|
377
|
-
type: "list",
|
|
378
|
-
choices: [
|
|
379
|
-
"Ethereum",
|
|
380
|
-
"Polygon",
|
|
381
|
-
"Arbitrum",
|
|
382
|
-
"Binance Smart Chain",
|
|
383
|
-
"Base"
|
|
384
|
-
]
|
|
385
|
-
}
|
|
386
|
-
]);
|
|
387
|
-
yield spinner(
|
|
388
|
-
"Installing Hybrid dependencies",
|
|
389
|
-
() => __async(this, null, function* () {
|
|
390
|
-
return cmd(pkgManager, ["add", "hybrid", "hybrid/react"], {
|
|
391
|
-
cwd
|
|
392
|
-
});
|
|
393
|
-
})
|
|
394
|
-
);
|
|
395
|
-
yield spinner("Adding smart contracts", () => __async(this, null, function* () {
|
|
396
|
-
const solidityPragma = "pragma solidity ^0.8.13";
|
|
397
|
-
yield cmd("sh", ["-c", "curl -L https://foundry.paradigm.xyz | bash"], {
|
|
398
|
-
cwd
|
|
399
|
-
});
|
|
400
|
-
yield cmd("foundryup", [], {
|
|
401
|
-
cwd
|
|
402
|
-
});
|
|
403
|
-
yield writeFile(
|
|
404
|
-
[cwd, "foundry.toml"].join("/"),
|
|
405
|
-
`# See more config options https://github.com/foundry-rs/foundry/tree/master/config
|
|
406
|
-
|
|
407
|
-
[profile.default]
|
|
408
|
-
src = './contracts'
|
|
409
|
-
test = './contracts'
|
|
410
|
-
cache = true
|
|
411
|
-
cache_path = '.hybrid/cache'
|
|
412
|
-
out = '.hybrid/out'
|
|
413
|
-
libs = ["node_modules"]
|
|
414
|
-
gas_reports = ["*"]`
|
|
415
|
-
);
|
|
416
|
-
yield fs3.mkdirSync([cwd, "contracts"].join("/"), { recursive: true });
|
|
417
|
-
yield writeFile(
|
|
418
|
-
[cwd, "contracts/MyNFT.sol"].join("/"),
|
|
419
|
-
`// SPDX-License-Identifier: UNLICENSED
|
|
420
|
-
${solidityPragma};
|
|
421
|
-
|
|
422
|
-
import "erc721a/contracts/ERC721A.sol";
|
|
423
|
-
|
|
424
|
-
contract MyNFT is ERC721A {
|
|
425
|
-
constructor() ERC721A("My NFT", "NFT") {}
|
|
426
|
-
|
|
427
|
-
// We prefer tokenIds to start at 1
|
|
428
|
-
function _startTokenId() internal pure override returns (uint256) {
|
|
429
|
-
return 1;
|
|
430
|
-
}
|
|
431
|
-
|
|
432
|
-
function mint(uint256 quantity) external payable {
|
|
433
|
-
_mint(msg.sender, quantity);
|
|
434
|
-
}
|
|
435
|
-
|
|
436
|
-
/**
|
|
437
|
-
* @dev override both ERC721A and ERC2981
|
|
438
|
-
*/
|
|
439
|
-
function supportsInterface(
|
|
440
|
-
bytes4 interfaceId
|
|
441
|
-
) public view override(ERC721A) returns (bool) {
|
|
442
|
-
return ERC721A.supportsInterface(interfaceId);
|
|
443
|
-
}
|
|
444
|
-
}
|
|
445
|
-
`
|
|
446
|
-
);
|
|
447
|
-
yield writeFile(
|
|
448
|
-
[cwd, "contracts/MyNFT.test.sol"].join("/"),
|
|
449
|
-
`// SPDX-License-Identifier: UNLICENSED
|
|
450
|
-
${solidityPragma};
|
|
451
|
-
|
|
452
|
-
import "forge-std/console.sol";
|
|
453
|
-
import "forge-std/Test.sol";
|
|
454
|
-
|
|
455
|
-
import "./MyNFT.sol";
|
|
456
|
-
|
|
457
|
-
contract MyContractTest is Test {
|
|
458
|
-
MyNFT public mock;
|
|
459
|
-
|
|
460
|
-
function setUp() public {
|
|
461
|
-
mock = new MyNFT();
|
|
462
|
-
}
|
|
463
|
-
|
|
464
|
-
function testMint() public {
|
|
465
|
-
address minter = makeAddr("minter");
|
|
466
|
-
assertEq(mock.balanceOf(minter), 0);
|
|
467
|
-
vm.prank(minter);
|
|
468
|
-
mock.mint(1);
|
|
469
|
-
assertEq(mock.balanceOf(minter), 1);
|
|
470
|
-
}
|
|
471
|
-
}
|
|
472
|
-
`
|
|
473
|
-
);
|
|
474
|
-
}));
|
|
475
|
-
yield spinner(
|
|
476
|
-
"Adding hybrid.config.js",
|
|
477
|
-
() => __async(this, null, function* () {
|
|
478
|
-
return writeFile(
|
|
479
|
-
[cwd, "hybrid.config.js"].join("/"),
|
|
480
|
-
`
|
|
481
|
-
module.exports = {
|
|
482
|
-
token: "1234567890",
|
|
483
|
-
chain: "${answers.chain}",
|
|
484
|
-
}
|
|
485
|
-
`
|
|
486
|
-
);
|
|
487
|
-
})
|
|
488
|
-
);
|
|
489
|
-
console.log();
|
|
490
|
-
console.log(
|
|
491
|
-
chalk.green.bold("Success!"),
|
|
492
|
-
`Hybrid Installed`,
|
|
493
|
-
path2.relative(process.cwd(), cwd)
|
|
494
|
-
);
|
|
495
|
-
});
|
|
496
|
-
}
|
|
497
|
-
var init_init = __esm({
|
|
498
|
-
"src/cmd/init.ts"() {
|
|
499
|
-
init_helpers();
|
|
500
|
-
}
|
|
501
|
-
});
|
|
502
|
-
|
|
503
|
-
// src/cmd/deploy.ts
|
|
504
|
-
import inquirer2 from "inquirer";
|
|
505
|
-
function deploy(contract, target) {
|
|
506
|
-
return __async(this, null, function* () {
|
|
507
|
-
const { key } = yield inquirer2.prompt([
|
|
508
|
-
{
|
|
509
|
-
name: "key",
|
|
510
|
-
message: "Private Key",
|
|
511
|
-
type: "input"
|
|
512
|
-
}
|
|
513
|
-
]);
|
|
514
|
-
switch (target) {
|
|
515
|
-
case "local":
|
|
516
|
-
return forgeDeploy(contract, "http://localhost:8545", key);
|
|
517
|
-
default:
|
|
518
|
-
throw new Error("Unknown target" + target);
|
|
519
|
-
}
|
|
520
|
-
});
|
|
521
|
-
}
|
|
522
|
-
var init_deploy = __esm({
|
|
523
|
-
"src/cmd/deploy.ts"() {
|
|
524
|
-
init_foundry();
|
|
525
|
-
}
|
|
526
|
-
});
|
|
527
|
-
|
|
528
|
-
// src/cli.ts
|
|
529
|
-
import { Command } from "commander";
|
|
530
|
-
import boxen2 from "boxen";
|
|
531
|
-
var require_cli = __commonJS({
|
|
532
|
-
"src/cli.ts"(exports) {
|
|
533
|
-
init_build();
|
|
534
|
-
init_test();
|
|
535
|
-
init_dev();
|
|
536
|
-
init_init();
|
|
537
|
-
init_deploy();
|
|
538
|
-
if (process.argv[2] === "init") {
|
|
539
|
-
init();
|
|
540
|
-
} else {
|
|
541
|
-
const program = new Command();
|
|
542
|
-
program.name("mint").description("The Hybrid NFT Development Framework").version(require_package().version);
|
|
543
|
-
program.command("build").description("Builds smart contracts and generates TS types").action(() => {
|
|
544
|
-
build2();
|
|
545
|
-
});
|
|
546
|
-
program.command("test").description("Run smart contract tests").action(() => {
|
|
547
|
-
test();
|
|
548
|
-
});
|
|
549
|
-
program.command("dev").description("Starts hybrid in development mode").action(() => {
|
|
550
|
-
dev();
|
|
551
|
-
});
|
|
552
|
-
program.command("deploy").description("Deploy smart contracts").argument("<contract>", "Contract name").argument("<target>", "Deploy target [test|prod]").action((contract, target) => __async(exports, null, function* () {
|
|
553
|
-
yield deploy(contract, target).then(({ address, hash }) => {
|
|
554
|
-
console.log();
|
|
555
|
-
console.log(
|
|
556
|
-
boxen2(
|
|
557
|
-
`Address: ${address}
|
|
558
|
-
Tx Hash: ${hash}`,
|
|
559
|
-
{
|
|
560
|
-
title: `Contract ${contract} Deployed to ${target}`,
|
|
561
|
-
titleAlignment: "left",
|
|
562
|
-
borderColor: "yellowBright",
|
|
563
|
-
padding: 1,
|
|
564
|
-
margin: 0.5,
|
|
565
|
-
borderStyle: "double"
|
|
566
|
-
}
|
|
567
|
-
)
|
|
568
|
-
);
|
|
569
|
-
console.log();
|
|
570
|
-
});
|
|
571
|
-
}));
|
|
572
|
-
program.parse();
|
|
573
|
-
}
|
|
574
|
-
}
|
|
575
|
-
});
|
|
576
|
-
export default require_cli();
|
|
577
|
-
//# sourceMappingURL=cli.mjs.map
|
|
4
|
+
run();
|
|
5
|
+
//# sourceMappingURL=cli.mjs.map
|
package/dist/cli.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lib/helpers.ts","../src/lib/foundry.ts","../src/cmd/build.ts","../src/cmd/test.ts","../src/lib/builder.ts","../src/cmd/dev.ts","../package.json","../src/cmd/init.ts","../src/cmd/deploy.ts","../src/cli.ts"],"sourcesContent":["import { spawn } from \"child_process\"\nimport fs from \"fs\"\nimport ora, { Ora } from \"ora\"\n\nexport async function writeFile(path: string, data: string) {\n return fs.writeFileSync(path, data)\n}\n\nexport type SpawnOpts = {\n cwd?: string\n encoding?: string\n stdout?: (data: string) => void\n stderr?: (data: string) => void\n}\n\nexport async function cmd(\n cmd: string,\n args: string[],\n opts: SpawnOpts = {\n encoding: \"utf8\"\n }\n) {\n return new Promise((resolve, reject) => {\n const install = spawn(cmd, args, opts)\n\n install.stdout.on(\"data\", (data: any) => {\n opts.stdout?.(data.toString())\n })\n\n install.stderr.on(\"data\", (data: any) => {\n opts.stderr?.(data.toString())\n })\n\n install.on(\"error\", (error: Error) => {\n reject(error)\n })\n\n install.on(\"close\", (code: number) => {\n resolve(code)\n })\n })\n}\n\nexport async function spinner(label: string, fn: () => Promise<any>) {\n let spinner: Ora\n if (label) spinner = ora(label).start()\n return fn()\n .then(() => {\n spinner?.succeed(`${label} ... DONE`)\n })\n .catch((err) => {\n spinner?.fail(`${label}`)\n console.error(err)\n })\n}\n","import { SpawnOpts, cmd } from \"./helpers\"\n\nexport type BuildOpts = {\n // todo - add more options\n} & SpawnOpts\n\nexport async function build(opts: BuildOpts = {}) {\n return new Promise(async (resolve, reject) => {\n return cmd(\"forge\", [\"build\", \"--force\"], {\n ...opts,\n // hijack the stderr and reject if anything comes thru\n stderr: (msg) => reject(msg)\n }).then(resolve)\n })\n}\n\nexport async function forgeDeploy(name: string, rpc: string, key: string) {\n const output: string[] = []\n const error: string[] = []\n\n await cmd(\"forge\", [\"create\", name, `--rpc-url`, rpc, \"--private-key\", key], {\n stdout: (msg) => output.push(msg),\n stderr: (err) => error.push(err)\n })\n\n const address = output.join(\"\").match(/Deployed to: (0x.{40})/)\n const hash = output.join(\"\").match(/Transaction hash: (0x.{64})/)\n\n return {\n address: address ? address[1] : null,\n hash: hash ? hash[1] : null\n }\n}\n\ntype AnvilListening = {\n host: string\n port: string\n keys: `0x${string}`[]\n}\n\nexport async function anvil(\n mnemonic: string,\n forkUrl: string\n): Promise<AnvilListening> {\n return new Promise((resolve) => {\n cmd(\n \"anvil\",\n [\"--mnemonic\", mnemonic, \"--fork-url\", forkUrl, \"--chain-id\", \"1337\"],\n {\n stdout: (str) => {\n const keys = str.match(/0x.{64}/g) as `0x${string}`[]\n const listens = str.match(/Listening on (.*?)\\n/)\n\n if (listens) {\n const [host, port] = listens[1].split(\":\")\n resolve({\n host,\n port,\n keys\n })\n }\n },\n stderr: (str) => process.stderr.write(str)\n }\n )\n })\n}\n","import * as foundry from \"../lib/foundry\"\nimport { spinner } from \"../lib/helpers\"\n\nexport async function build() {\n return spinner(\"Building contracts...\", () => foundry.build())\n}\n","import { execSync } from \"child_process\"\n\nexport async function test() {\n return execSync(\"forge test\", { stdio: \"inherit\" })\n}\n","import fs from \"fs\"\n\n// import { Abi } from \"abitype\";\n\n// export const ABI = {\n// MyNFT: require(\"./out/MyNFT.sol/MyNFT.json\").abi as Abi,\n// };\n\nexport const writeConfig = async () => {\n const contracts = await listContracts(process.cwd() + \"/contracts\")\n\n const abis = contracts.reduce((acc, filename: string) => {\n const name = filename.replace(\".sol\", \"\")\n acc[name] = `require(\"./out/${name}.sol/${name}.json\").abi as Abi`\n return acc\n }, {})\n\n return fs.writeFileSync(\n process.cwd() + \"/.hybrid/index.ts\",\n `\nimport { Abi } from \"abitype\";\n\nexport const ABI = {\n ${Object.keys(abis)\n .map((name) => `${name}: ${abis[name]}`)\n .join(\",\\n \")}\n};\n `\n )\n}\n\nconst listContracts = async (dir) => {\n const files = await fs.readdirSync(dir)\n return files.filter((f) => !f.match(/(t|test)\\.sol$/))\n}\n","import bip39 from \"bip39\"\nimport chokidar from \"chokidar\"\nimport path from \"path\"\nimport { anvil, forgeDeploy } from \"../lib/foundry\"\nimport boxen from \"boxen\"\nimport ora from \"ora\"\nimport { writeConfig } from \"../lib/builder\"\n\n// @todo\n// [] - switch to config object for paths\n\nexport async function dev() {\n const contractsDir = process.cwd() + \"/contracts\"\n const forkUrl = \"https://goerli.infura.io/v3/e6481145ca1442b7bf2a8444a8cd0fc8\"\n const mnemonic = bip39.generateMnemonic()\n\n const [testnet] = await Promise.all([\n anvil(mnemonic, forkUrl)\n // @todo - some sort of dev interface\n ])\n\n console.log()\n console.log(\n boxen(\n `\nDev UI | http://127.0.0.1:8580\nRPC Node | http://${testnet.host}:${testnet.port}\n----------+----------------------\nDocs | https://hybrid.dev\nWatching | ${\"./\" + path.relative(process.cwd(), contractsDir)}\n`.trim(),\n {\n title: \"Hybrid Dev Server\",\n titleAlignment: \"left\",\n borderColor: \"greenBright\",\n\n padding: 1,\n margin: 0.5,\n borderStyle: \"double\"\n }\n )\n )\n console.log()\n console.log(\"Keys:\")\n console.log(testnet.keys.join(\"\\n\"))\n console.log()\n\n // listCompiled().then((files) => {\n // return files.map((file) =>\n // readCompiled(file).then(({ abi, bytecode }) =>\n // deployContract({\n // privateKey: testnet.keys[0],\n // abi,\n // bytecode\n // }).then(console.log)\n // )\n // )\n // })\n\n chokidar.watch(contractsDir).on(\"all\", (event, file) => {\n switch (event) {\n // case \"add\":\n // console.log(event, path)\n // break\n\n case \"change\":\n if (!file.endsWith(\".sol\")) return\n if (file.endsWith(\".test.sol\")) {\n // console.log(\"Skipping test file\", file)\n return\n } else {\n // build().then(() => {\n\n // })\n\n const filename = path.basename(file)\n const name = filename.replace(\".sol\", \"\")\n\n let spinner = ora(\"Deploying \" + name).start()\n forgeDeploy(name, \"http://localhost:8545\", testnet.keys[0]).then(\n ({ address }) => {\n writeConfig()\n spinner.succeed(name + \" deployed to \" + address)\n }\n )\n\n // .then(() => readCompiled(file))\n // .then(\n // ({ abi, bytecode }) =>\n // forgeDeploy(contract, \"http://localhost:8545\", key)\n // // deployContract({\n // // privateKey: testnet.keys[0],\n // // abi,\n // // bytecode\n // // }).then(console.log)\n // )\n }\n\n break\n default:\n // console.log(event, path)\n break\n }\n })\n}\n\n// const readCompiled = async (file: string) => {\n// const distDir = process.cwd() + \"/.hybrid/out\"\n// const filename = path.basename(file)\n// const name = filename.replace(\".sol\", \"\")\n// const contents = await fs\n// .readFileSync(`${distDir}/${filename}/${name}.json`)\n// .toString()\n// return JSON.parse(contents)\n// }\n","{\n \"name\": \"hybrid\",\n \"version\": \"0.1.0\",\n \"description\": \"Solidity + TypeScript Framework for Web3 Development\",\n \"author\": \"Ian Hunter <ian@ianh.xyz>\",\n \"homepage\": \"https://github.com/ian/hybrid#readme\",\n \"license\": \"ISC\",\n \"main\": \"dist/cli.js\",\n \"module\": \"dist/cli.mjs\",\n \"bin\": {\n \"hy\": \"dist/cli.mjs\",\n \"hybrid\": \"dist/cli.mjs\"\n },\n \"files\": [\n \"dist\"\n ],\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/ian/hybrid.git\"\n },\n \"scripts\": {\n \"clean\": \"rm -rf dist\",\n \"build\": \"tsup\",\n \"dev\": \"nodemon\",\n \"test\": \"node ./__tests__/cli.test.js\"\n },\n \"bugs\": {\n \"url\": \"https://github.com/ian/hybrid/issues\"\n },\n \"dependencies\": {\n \"@hybrd/contracts\": \"^0.1.0\",\n \"@hybrd/react\": \"^0.1.0\",\n \"bip39\": \"^3.1.0\",\n \"boxen\": \"^7.0.2\",\n \"chalk\": \"4.1.2\",\n \"chokidar\": \"^3.5.3\",\n \"commander\": \"^10.0.0\",\n \"ethereum-private-key-to-address\": \"^0.0.7\",\n \"ethers\": \"^6.1.0\",\n \"figlet\": \"^1.5.2\",\n \"inquirer\": \"^9.1.4\",\n \"ora\": \"5.4.0\",\n \"viem\": \"^0.1.10\"\n },\n \"devDependencies\": {\n \"@types/inquirer\": \"^9.0.3\",\n \"@types/node\": \"^18.14.6\",\n \"nodemon\": \"^2.0.21\",\n \"tsup\": \"^6.6.3\",\n \"tsx\": \"^3.12.3\",\n \"typescript\": \"^4.9.5\"\n },\n \"gitHead\": \"4dc22eb383621ec5bcdb4989d123489b726af4e7\"\n}\n","import chalk from \"chalk\"\nimport fs from \"fs\"\nimport path from \"path\"\nimport inquirer from \"inquirer\"\nimport { cmd, spinner, writeFile } from \"../lib/helpers\"\n\nexport async function init() {\n const mdVersion = require(\"../../package.json\").version\n\n console.log(`\n\n ██▄\n ▄█▄ ▀██▄\n ▄██ ▀██ ██ ▀▀ ▓█ ▓█\n ██ ▄ ▀██ ██▄ ▐████▄▓██▓ ▓█ ▓████▄ ▓███ ▄██████ ▓██▌ ▄▓███▄ ▓█▓███▄\n ▓█ ▓█▀ ██ ██ ▐█ █▌ ██ ██ ██ █▌ ▓█ ██ ██ ▓█ ▐█ ██ ██ ██\n ██ ██ ▐█▀ ▓█ ▐█ █▌ ██ ██ ██ █▌ ▓█ ▀█▄ ▄██ ▓█ ▐█▄ ██ ██▄ ██\n ▐█▌ ▐██▄▄▓█▀ ██ ▀ ▀▀ ▀▀ ▀▀ ▀▀ ▀ ▀▀ ▀▀▀▀▀▀ ▀▀ ▀▀▀▀ ██▀▀▀▀\n ▀██▄ ▄█▀ ██\n ▀███████▀ The NFT Development Framework.\n\n\nInstalling Hybrid v${mdVersion} ...\n`)\n\n if (!fs.existsSync(\"./package.json\")) {\n console.error(\n chalk.red(\"Error: No package.json found. Are you in the right directory?\")\n )\n process.exit()\n }\n\n const pkgManager = fs.existsSync(\"./yarn.lock\")\n ? \"yarn\"\n : fs.existsSync(\"./pnpm-lock.yaml\")\n ? \"pnpm\"\n : \"npm\"\n\n const cwd = process.cwd()\n const answers = await inquirer.prompt([\n {\n name: \"chain\",\n type: \"list\",\n choices: [\n \"Ethereum\",\n \"Polygon\",\n \"Arbitrum\",\n \"Binance Smart Chain\",\n \"Base\"\n ]\n }\n ])\n\n await spinner(\"Installing Hybrid dependencies\", async () =>\n cmd(pkgManager, [\"add\", \"hybrid\", \"hybrid/react\"], {\n cwd\n })\n )\n\n await spinner(\"Adding smart contracts\", async () => {\n const solidityPragma = \"pragma solidity ^0.8.13\"\n\n await cmd(\"sh\", [\"-c\", \"curl -L https://foundry.paradigm.xyz | bash\"], {\n cwd\n })\n\n await cmd(\"foundryup\", [], {\n cwd\n })\n\n await writeFile(\n [cwd, \"foundry.toml\"].join(\"/\"),\n `# See more config options https://github.com/foundry-rs/foundry/tree/master/config\n\n[profile.default]\nsrc = './contracts'\ntest = './contracts'\ncache = true\ncache_path = '.hybrid/cache'\nout = '.hybrid/out'\nlibs = [\"node_modules\"]\ngas_reports = [\"*\"]`\n )\n\n await fs.mkdirSync([cwd, \"contracts\"].join(\"/\"), { recursive: true })\n\n await writeFile(\n [cwd, \"contracts/MyNFT.sol\"].join(\"/\"),\n `// SPDX-License-Identifier: UNLICENSED\n${solidityPragma};\n\nimport \"erc721a/contracts/ERC721A.sol\";\n\ncontract MyNFT is ERC721A {\n\tconstructor() ERC721A(\"My NFT\", \"NFT\") {}\n\n\t// We prefer tokenIds to start at 1\n\tfunction _startTokenId() internal pure override returns (uint256) {\n\t\treturn 1;\n\t}\n\n\tfunction mint(uint256 quantity) external payable {\n\t\t_mint(msg.sender, quantity);\n\t}\n\n\t/**\n\t * @dev override both ERC721A and ERC2981\n\t */\n\tfunction supportsInterface(\n\t\tbytes4 interfaceId\n\t) public view override(ERC721A) returns (bool) {\n\t\treturn ERC721A.supportsInterface(interfaceId);\n\t}\n}\n `\n )\n\n await writeFile(\n [cwd, \"contracts/MyNFT.test.sol\"].join(\"/\"),\n `// SPDX-License-Identifier: UNLICENSED\n${solidityPragma};\n\nimport \"forge-std/console.sol\";\nimport \"forge-std/Test.sol\";\n\nimport \"./MyNFT.sol\";\n\ncontract MyContractTest is Test {\n\tMyNFT public mock;\n\n\tfunction setUp() public {\n\t\tmock = new MyNFT();\n\t}\n\n\tfunction testMint() public {\n\t\taddress minter = makeAddr(\"minter\");\n\t\tassertEq(mock.balanceOf(minter), 0);\n\t\tvm.prank(minter);\n\t\tmock.mint(1);\n\t\tassertEq(mock.balanceOf(minter), 1);\n\t}\n}\n `\n )\n })\n\n await spinner(\"Adding hybrid.config.js\", async () =>\n writeFile(\n [cwd, \"hybrid.config.js\"].join(\"/\"),\n `\nmodule.exports = {\n token: \"1234567890\",\n chain: \"${answers.chain}\",\n}\n `\n )\n )\n\n console.log()\n console.log(\n chalk.green.bold(\"Success!\"),\n `Hybrid Installed`,\n path.relative(process.cwd(), cwd)\n )\n}\n","import inquirer from \"inquirer\"\nimport { cmd } from \"../lib/helpers\"\nimport { forgeDeploy } from \"../lib/foundry\"\n\nexport async function deploy(contract: string, target: string) {\n // \"contracts:goerli\": \"forge create contracts/src/MintingTest.sol:MintingTest --constructor-args-path ./contracts/.args.goerli --verify --etherscan-api-key $ETHERSCAN_API_KEY --chain goerli --rpc-url $GOERLI_RPC_URL --interactive\",\n // \"contracts:mainnet\": \"forge create contracts/src/AerialExplorers.sol:AerialExplorers --gas-limit 3000000 --constructor-args-path ./contracts/.args.mainnet --verify --etherscan-api-key $ETHERSCAN_API_KEY --chain mainnet --rpc-url $MAINNET_RPC_URL --interactive\",\n\n const { key } = await inquirer.prompt([\n {\n name: \"key\",\n message: \"Private Key\",\n type: \"input\"\n }\n ])\n\n switch (target) {\n case \"local\":\n return forgeDeploy(contract, \"http://localhost:8545\", key)\n default:\n throw new Error(\"Unknown target\" + target)\n }\n}\n","#!/usr/bin/env node\n\nimport { Command } from \"commander\"\nimport { build } from \"./cmd/build\"\nimport { test } from \"./cmd/test\"\nimport { dev } from \"./cmd/dev\"\nimport { init } from \"./cmd/init\"\nimport { deploy } from \"./cmd/deploy\"\nimport boxen from \"boxen\"\n\nif (process.argv[2] === \"init\") {\n // Handle init separately, best to not surface this in the help menu\n init()\n} else {\n const program = new Command()\n program\n .name(\"mint\")\n .description(\"The Hybrid NFT Development Framework\")\n .version(require(\"../package.json\").version)\n\n program\n .command(\"build\")\n .description(\"Builds smart contracts and generates TS types\")\n .action((/* opts */) => {\n build()\n })\n\n program\n .command(\"test\")\n .description(\"Run smart contract tests\")\n .action((/* opts */) => {\n test()\n })\n\n program\n .command(\"dev\")\n .description(\"Starts hybrid in development mode\")\n .action((/* opts */) => {\n dev()\n })\n\n program\n .command(\"deploy\")\n .description(\"Deploy smart contracts\")\n .argument(\"<contract>\", \"Contract name\")\n .argument(\"<target>\", \"Deploy target [test|prod]\")\n .action(async (contract, target) => {\n await deploy(contract, target).then(({ address, hash }) => {\n console.log()\n console.log(\n boxen(\n `Address: ${address}\nTx Hash: ${hash}`,\n {\n title: `Contract ${contract} Deployed to ${target}`,\n titleAlignment: \"left\",\n borderColor: \"yellowBright\",\n padding: 1,\n margin: 0.5,\n borderStyle: \"double\"\n }\n )\n )\n console.log()\n })\n })\n\n program.parse()\n}\n"],"mappings":"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","names":["path","cmd","spinner","build","fs","ora","spinner","fs","path","inquirer","boxen","build"]}
|
|
1
|
+
{"version":3,"file":"cli.mjs","sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { run } from \"@hybrd/cli\"\n\nrun()\n"],"names":[],"mappings":";;;AAIA,CAAG,CAAA,CAAA,CAAA,CAAA"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
export type DefaultButtonProps = {
|
|
3
|
+
className?: string;
|
|
4
|
+
intent?: "default" | "success" | "error";
|
|
5
|
+
onClick?: () => void;
|
|
6
|
+
children: React.ReactNode;
|
|
7
|
+
disabled?: boolean;
|
|
8
|
+
};
|
|
9
|
+
declare const DefaultButton: (props: DefaultButtonProps) => JSX.Element;
|
|
10
|
+
export default DefaultButton;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
import { DefaultButtonProps } from "./DefaultButton";
|
|
3
|
+
import { Contract } from "types";
|
|
4
|
+
type MintButtonProps = {
|
|
5
|
+
className?: string;
|
|
6
|
+
contract: Contract;
|
|
7
|
+
button?: React.FC<DefaultButtonProps>;
|
|
8
|
+
};
|
|
9
|
+
declare const MintButton: (props: MintButtonProps) => JSX.Element;
|
|
10
|
+
export default MintButton;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default as MintButton } from "./MintButton";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./useMinting";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./useContext";
|