pha-deploy 0.2.1 → 0.2.3
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 +92 -20
- package/config/config.example.toml +6 -0
- package/dist/actions/mintFungibleToken.d.ts +17 -0
- package/dist/actions/mintFungibleToken.d.ts.map +1 -0
- package/dist/actions/mintFungibleToken.js +103 -0
- package/dist/actions/mintFungibleToken.js.map +1 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +113 -13
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +2 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +7 -0
- package/dist/config.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
CLI utility for deploying fungible tokens and NFTs on the Phantasma blockchain. The tool consumes structured metadata and token schemas defined in TOML configuration files and relies on the latest `phantasma-sdk-ts` builders for serialization.
|
|
4
4
|
|
|
5
|
-
-
|
|
5
|
+
- Four primary actions: `--create-token`, `--create-series`, `--mint-fungible`, `--mint-nft`.
|
|
6
6
|
- Configuration-first workflow: fill in `config.toml` (JSON blobs embedded in TOML) and let the CLI generate and submit Carbon transactions.
|
|
7
7
|
- Dry-run mode available for payload inspection without broadcasting.
|
|
8
8
|
|
|
@@ -172,6 +172,17 @@ Each action reads the active configuration, prints a summary (without exposing y
|
|
|
172
172
|
- `token_schemas.rom` to drive ROM serialization.
|
|
173
173
|
- `nft_metadata` containing per-instance values.
|
|
174
174
|
|
|
175
|
+
- **Mint fungible tokens**
|
|
176
|
+
|
|
177
|
+
```bash
|
|
178
|
+
pha-deploy --mint-fungible --config path/to/config.toml
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
Requirements:
|
|
182
|
+
- `carbon_token_id`.
|
|
183
|
+
- `mint_fungible_amount` (integer atomic units).
|
|
184
|
+
- Optional `mint_fungible_to` (defaults to the WIF owner when omitted).
|
|
185
|
+
|
|
175
186
|
Append `--dry-run` to any command to inspect the serialized payload without submitting it:
|
|
176
187
|
|
|
177
188
|
```bash
|
|
@@ -180,12 +191,71 @@ pha-deploy --create-token --dry-run
|
|
|
180
191
|
|
|
181
192
|
---
|
|
182
193
|
|
|
194
|
+
|
|
195
|
+
## Usage without config.toml
|
|
196
|
+
|
|
197
|
+
These examples do not use `config.toml`. Every required value is passed via CLI flags. All JSON values **must** be single-line strings; line breaks will break JSON parsing.
|
|
198
|
+
|
|
199
|
+
```bash
|
|
200
|
+
TOKEN_SCHEMAS_JSON='{"seriesMetadata":[{"name":"extraSharedSampleField","type":"String"}],"rom":[{"name":"name","type":"String"},{"name":"description","type":"String"},{"name":"imageURL","type":"String"},{"name":"infoURL","type":"String"},{"name":"royalties","type":"Int32"},{"name":"extraSampleField","type":"String"}],"ram":[]}'
|
|
201
|
+
TOKEN_METADATA_JSON='{"name":"My test token!","icon":"data:image/png;base64,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","url":"http://example.com","description":"My test token description"}'
|
|
202
|
+
|
|
203
|
+
pha-deploy --create-token \
|
|
204
|
+
--rpc https://testnet.phantasma.info/rpc \
|
|
205
|
+
--nexus testnet \
|
|
206
|
+
--wif <WIF> \
|
|
207
|
+
--symbol NFTMY \
|
|
208
|
+
--token-type nft \
|
|
209
|
+
--token-schemas "$TOKEN_SCHEMAS_JSON" \
|
|
210
|
+
--token-metadata "$TOKEN_METADATA_JSON" \
|
|
211
|
+
--create-token-max-data 1000000000 \
|
|
212
|
+
--gas-fee-base 10000 \
|
|
213
|
+
--gas-fee-create-token-base 10000000000 \
|
|
214
|
+
--gas-fee-create-token-symbol 10000000000 \
|
|
215
|
+
--gas-fee-multiplier 10000
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
```bash
|
|
219
|
+
TOKEN_SCHEMAS_JSON='{"seriesMetadata":[{"name":"extraSharedSampleField","type":"String"}],"rom":[{"name":"name","type":"String"},{"name":"description","type":"String"},{"name":"imageURL","type":"String"},{"name":"infoURL","type":"String"},{"name":"royalties","type":"Int32"},{"name":"extraSampleField","type":"String"}],"ram":[]}'
|
|
220
|
+
SERIES_METADATA_JSON='{"rom":"0xAABBCC","extraSharedSampleField":"aabbsadsd"}'
|
|
221
|
+
|
|
222
|
+
pha-deploy --create-series \
|
|
223
|
+
--rpc https://testnet.phantasma.info/rpc \
|
|
224
|
+
--nexus testnet \
|
|
225
|
+
--wif <WIF> \
|
|
226
|
+
--carbon-token-id <TOKEN_ID> \
|
|
227
|
+
--token-schemas "$TOKEN_SCHEMAS_JSON" \
|
|
228
|
+
--series-metadata "$SERIES_METADATA_JSON" \
|
|
229
|
+
--create-token-series-max-data 100000000 \
|
|
230
|
+
--gas-fee-base 10000 \
|
|
231
|
+
--gas-fee-create-token-series 2500000000 \
|
|
232
|
+
--gas-fee-multiplier 10000
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
```bash
|
|
236
|
+
TOKEN_SCHEMAS_JSON='{"seriesMetadata":[{"name":"extraSharedSampleField","type":"String"}],"rom":[{"name":"name","type":"String"},{"name":"description","type":"String"},{"name":"imageURL","type":"String"},{"name":"infoURL","type":"String"},{"name":"royalties","type":"Int32"},{"name":"extraSampleField","type":"String"}],"ram":[]}'
|
|
237
|
+
NFT_METADATA_JSON='{"name":"Test NFT Name","description":"Test NFT Description","imageURL":"images-assets.nasa.gov/image/PIA13227/PIA13227~orig.jpg","infoURL":"https://images.nasa.gov/details/PIA13227","royalties":10000000,"extraSampleField":"abc"}'
|
|
238
|
+
|
|
239
|
+
pha-deploy --mint-nft \
|
|
240
|
+
--rpc https://testnet.phantasma.info/rpc \
|
|
241
|
+
--nexus testnet \
|
|
242
|
+
--wif <WIF> \
|
|
243
|
+
--carbon-token-id <TOKEN_ID> \
|
|
244
|
+
--carbon-token-series-id <SERIES_ID> \
|
|
245
|
+
--token-schemas "$TOKEN_SCHEMAS_JSON" \
|
|
246
|
+
--nft-metadata "$NFT_METADATA_JSON" \
|
|
247
|
+
--mint-token-max-data 100000000 \
|
|
248
|
+
--gas-fee-base 10000 \
|
|
249
|
+
--gas-fee-multiplier 10000
|
|
250
|
+
```
|
|
251
|
+
|
|
183
252
|
## CLI Flags and Overrides
|
|
184
253
|
|
|
185
254
|
Action selectors (first match wins):
|
|
186
255
|
|
|
187
256
|
- `--create-token`
|
|
188
257
|
- `--create-series`
|
|
258
|
+
- `--mint-fungible`
|
|
189
259
|
- `--mint-nft`
|
|
190
260
|
|
|
191
261
|
Common utility flags:
|
|
@@ -197,28 +267,30 @@ Common utility flags:
|
|
|
197
267
|
|
|
198
268
|
Configuration overrides (values override `config.toml` when provided):
|
|
199
269
|
|
|
200
|
-
- `--rpc <url>` – RPC endpoint.
|
|
201
|
-
- `--nexus <
|
|
270
|
+
- `--rpc <url>` – RPC endpoint (fallback: `https://testnet.phantasma.info/rpc`).
|
|
271
|
+
- `--nexus <name>` – chain nexus (example: `mainnet` or `testnet`).
|
|
202
272
|
- `--wif <wif>` – signer WIF.
|
|
203
273
|
- `--symbol <symbol>` – token symbol.
|
|
204
|
-
- `--token-type <nft|fungible>` – token kind.
|
|
205
|
-
- `--token-max-supply <
|
|
206
|
-
- `--fungible-decimals <
|
|
207
|
-
- `--carbon-token-id <
|
|
208
|
-
- `--carbon-token-series-id <
|
|
274
|
+
- `--token-type <nft|fungible>` – token kind (default: `nft`).
|
|
275
|
+
- `--token-max-supply <int>` / `--fungible-max-supply <int>` – max supply (required when token-type is `fungible`).
|
|
276
|
+
- `--fungible-decimals <0..255>` – decimals for fungible token (required when token-type is `fungible`).
|
|
277
|
+
- `--carbon-token-id <int>` – existing carbon token id (for series or mint).
|
|
278
|
+
- `--carbon-token-series-id <int>` – existing series id (for mint).
|
|
279
|
+
- `--mint-fungible-to <address>` – recipient address for fungible mint (default: WIF owner).
|
|
280
|
+
- `--mint-fungible-amount <int>` – amount to mint (integer atomic units).
|
|
209
281
|
- `--rom <hex>` – token ROM as hex string.
|
|
210
|
-
- `--token-schemas '<json>'` – inline JSON for schemas.
|
|
211
|
-
- `--token-metadata '<json>'` – inline JSON for token metadata.
|
|
212
|
-
- `--series-metadata '<json>'` – inline JSON
|
|
213
|
-
- `--nft-metadata '<json>'` – inline JSON
|
|
214
|
-
- `--create-token-max-data <
|
|
215
|
-
- `--create-token-series-max-data <
|
|
216
|
-
- `--mint-token-max-data <
|
|
217
|
-
- `--gas-fee-base <
|
|
218
|
-
- `--gas-fee-create-token-base <
|
|
219
|
-
- `--gas-fee-create-token-symbol <
|
|
220
|
-
- `--gas-fee-create-token-series <
|
|
221
|
-
- `--gas-fee-multiplier <
|
|
282
|
+
- `--token-schemas '<json>'` – inline JSON for token schemas (`seriesMetadata`, `rom`, `ram`).
|
|
283
|
+
- `--token-metadata '<json>'` – inline JSON for token metadata fields.
|
|
284
|
+
- `--series-metadata '<json>'` – inline JSON object or array of `{ name, value }` pairs.
|
|
285
|
+
- `--nft-metadata '<json>'` – inline JSON object or array of `{ name, value }` pairs.
|
|
286
|
+
- `--create-token-max-data <int>` – payload limit for token creation.
|
|
287
|
+
- `--create-token-series-max-data <int>` – payload limit for series creation.
|
|
288
|
+
- `--mint-token-max-data <int>` – payload limit for minting.
|
|
289
|
+
- `--gas-fee-base <int>` – base gas fee.
|
|
290
|
+
- `--gas-fee-create-token-base <int>` – gas fee for token creation.
|
|
291
|
+
- `--gas-fee-create-token-symbol <int>` – symbol registration fee.
|
|
292
|
+
- `--gas-fee-create-token-series <int>` – fee for series creation.
|
|
293
|
+
- `--gas-fee-multiplier <int>` – multiplier applied to gas fee.
|
|
222
294
|
|
|
223
295
|
Notes:
|
|
224
296
|
- JSON arguments must be passed as single-line quoted strings; for substantial edits, updating `config.toml` is usually more convenient.
|
|
@@ -37,6 +37,12 @@ carbon_token_id = 0
|
|
|
37
37
|
# Optional: If your token's series has been deployed already, provide carbon series ID below:
|
|
38
38
|
carbon_token_series_id = 0
|
|
39
39
|
|
|
40
|
+
# Mint fungible (optional; used by --mint-fungible)
|
|
41
|
+
# If omitted, the CLI defaults the recipient to the WIF owner.
|
|
42
|
+
# mint_fungible_to = "P2K..."
|
|
43
|
+
# Amount is in atomic units (integer).
|
|
44
|
+
# mint_fungible_amount = 1
|
|
45
|
+
|
|
40
46
|
# Token ROM (HEX-encoded string, optional)
|
|
41
47
|
rom = ""
|
|
42
48
|
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export declare class mintFungibleTokenCfg {
|
|
2
|
+
rpc: string;
|
|
3
|
+
nexus: string;
|
|
4
|
+
wif: string;
|
|
5
|
+
carbonTokenId: bigint;
|
|
6
|
+
to: string;
|
|
7
|
+
amount: bigint;
|
|
8
|
+
gasFeeBase: bigint;
|
|
9
|
+
gasFeeMultiplier: bigint;
|
|
10
|
+
mintTokenMaxData: bigint;
|
|
11
|
+
constructor(rpc: string, nexus: string, wif: string, carbonTokenId: bigint, to: string, amount: bigint, gasFeeBase: bigint, gasFeeMultiplier: bigint, mintTokenMaxData: bigint);
|
|
12
|
+
toPrintable(): Omit<this, "wif" | "toPrintable"> & {
|
|
13
|
+
owner: string;
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
export declare function mintFungibleToken(cfg: mintFungibleTokenCfg, dryRun: boolean, logSettings?: boolean): Promise<void>;
|
|
17
|
+
//# sourceMappingURL=mintFungibleToken.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mintFungibleToken.d.ts","sourceRoot":"","sources":["../../src/actions/mintFungibleToken.ts"],"names":[],"mappings":"AAqBA,qBAAa,oBAAoB;IAEtB,GAAG,EAAE,MAAM;IACX,KAAK,EAAE,MAAM;IACb,GAAG,EAAE,MAAM;IACX,aAAa,EAAE,MAAM;IACrB,EAAE,EAAE,MAAM;IACV,MAAM,EAAE,MAAM;IACd,UAAU,EAAE,MAAM;IAClB,gBAAgB,EAAE,MAAM;IACxB,gBAAgB,EAAE,MAAM;gBARxB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,EACX,aAAa,EAAE,MAAM,EACrB,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,gBAAgB,EAAE,MAAM,EACxB,gBAAgB,EAAE,MAAM;IAajC,WAAW;;;CAUZ;AAED,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,oBAAoB,EACzB,MAAM,EAAE,OAAO,EACf,WAAW,GAAE,OAAe,iBA2E7B"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.mintFungibleTokenCfg = void 0;
|
|
4
|
+
exports.mintFungibleToken = mintFungibleToken;
|
|
5
|
+
const phantasma_sdk_ts_1 = require("phantasma-sdk-ts");
|
|
6
|
+
const waitForTx_1 = require("./waitForTx");
|
|
7
|
+
const helpers_1 = require("./helpers");
|
|
8
|
+
class mintFungibleTokenCfg {
|
|
9
|
+
rpc;
|
|
10
|
+
nexus;
|
|
11
|
+
wif;
|
|
12
|
+
carbonTokenId;
|
|
13
|
+
to;
|
|
14
|
+
amount;
|
|
15
|
+
gasFeeBase;
|
|
16
|
+
gasFeeMultiplier;
|
|
17
|
+
mintTokenMaxData;
|
|
18
|
+
constructor(rpc, nexus, wif, carbonTokenId, to, amount, gasFeeBase, gasFeeMultiplier, mintTokenMaxData) {
|
|
19
|
+
this.rpc = rpc;
|
|
20
|
+
this.nexus = nexus;
|
|
21
|
+
this.wif = wif;
|
|
22
|
+
this.carbonTokenId = carbonTokenId;
|
|
23
|
+
this.to = to;
|
|
24
|
+
this.amount = amount;
|
|
25
|
+
this.gasFeeBase = gasFeeBase;
|
|
26
|
+
this.gasFeeMultiplier = gasFeeMultiplier;
|
|
27
|
+
this.mintTokenMaxData = mintTokenMaxData;
|
|
28
|
+
this.rpc = rpc;
|
|
29
|
+
this.nexus = nexus;
|
|
30
|
+
this.wif = wif;
|
|
31
|
+
this.carbonTokenId = carbonTokenId;
|
|
32
|
+
this.to = to;
|
|
33
|
+
this.amount = amount;
|
|
34
|
+
this.gasFeeBase = gasFeeBase;
|
|
35
|
+
this.gasFeeMultiplier = gasFeeMultiplier;
|
|
36
|
+
this.mintTokenMaxData = mintTokenMaxData;
|
|
37
|
+
}
|
|
38
|
+
toPrintable() {
|
|
39
|
+
// Do not leak WIF; derive owner address.
|
|
40
|
+
const { wif: _omit, ...rest } = this;
|
|
41
|
+
const owner = phantasma_sdk_ts_1.PhantasmaKeys.fromWIF(this.wif).Address.toString();
|
|
42
|
+
return {
|
|
43
|
+
...rest,
|
|
44
|
+
owner,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
exports.mintFungibleTokenCfg = mintFungibleTokenCfg;
|
|
49
|
+
async function mintFungibleToken(cfg, dryRun, logSettings = false) {
|
|
50
|
+
if (cfg.amount <= 0n) {
|
|
51
|
+
throw new Error("mint_fungible_amount must be a positive integer");
|
|
52
|
+
}
|
|
53
|
+
const txSender = phantasma_sdk_ts_1.PhantasmaKeys.fromWIF(cfg.wif);
|
|
54
|
+
const senderPubKey = new phantasma_sdk_ts_1.Bytes32(txSender.PublicKey);
|
|
55
|
+
const toAddr = phantasma_sdk_ts_1.Address.Parse(cfg.to);
|
|
56
|
+
const receiverPubKey = new phantasma_sdk_ts_1.Bytes32(toAddr.GetPublicKey());
|
|
57
|
+
if (logSettings) {
|
|
58
|
+
console.log("Minting fungible tokens using these settings:", JSON.stringify(cfg.toPrintable(), helpers_1.bigintReplacer, 2));
|
|
59
|
+
}
|
|
60
|
+
// There is no dedicated MintFungible TxHelper in `phantasma-sdk-ts` yet, so we build the
|
|
61
|
+
// Carbon TxMsg manually using the SDK core types. TokenContract::MintFungible returns the
|
|
62
|
+
// receiver's new balance after minting, encoded as IntX in the tx result.
|
|
63
|
+
const feeOptions = new phantasma_sdk_ts_1.FeeOptions(cfg.gasFeeBase, cfg.gasFeeMultiplier);
|
|
64
|
+
const maxGas = feeOptions.calculateMaxGas();
|
|
65
|
+
const msg = new phantasma_sdk_ts_1.TxMsg();
|
|
66
|
+
msg.type = phantasma_sdk_ts_1.TxTypes.MintFungible;
|
|
67
|
+
msg.expiry = BigInt(Date.now() + 60_000); // 60s from now (same pattern as other tx helpers)
|
|
68
|
+
msg.maxGas = maxGas;
|
|
69
|
+
msg.maxData = cfg.mintTokenMaxData;
|
|
70
|
+
msg.gasFrom = senderPubKey;
|
|
71
|
+
msg.payload = phantasma_sdk_ts_1.SmallString.empty;
|
|
72
|
+
const mint = new phantasma_sdk_ts_1.TxMsgMintFungible();
|
|
73
|
+
mint.tokenId = cfg.carbonTokenId;
|
|
74
|
+
mint.to = receiverPubKey;
|
|
75
|
+
mint.amount = phantasma_sdk_ts_1.IntX.fromBigInt(cfg.amount);
|
|
76
|
+
msg.msg = mint;
|
|
77
|
+
const txBytes = phantasma_sdk_ts_1.TxMsgSigner.signAndSerialize(msg, txSender);
|
|
78
|
+
const txHex = (0, phantasma_sdk_ts_1.bytesToHex)(txBytes);
|
|
79
|
+
if (dryRun) {
|
|
80
|
+
console.log(`[dry-run] Prepared tx (not sent): ${txHex}`);
|
|
81
|
+
console.log((0, helpers_1.formatForLog)(phantasma_sdk_ts_1.CarbonBlob.NewFromBytes(phantasma_sdk_ts_1.SignedTxMsg, (0, phantasma_sdk_ts_1.hexToBytes)(txHex), 0)));
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
console.log("Broadcasting transaction...");
|
|
85
|
+
const rpc = new phantasma_sdk_ts_1.PhantasmaAPI(cfg.rpc, null, cfg.nexus);
|
|
86
|
+
const txHash = await rpc.sendCarbonTransaction(txHex);
|
|
87
|
+
console.log("txHash: ", txHash);
|
|
88
|
+
const { success, result } = await (0, waitForTx_1.waitForTx)(rpc, txHash);
|
|
89
|
+
if (!success) {
|
|
90
|
+
console.log("Could not mint fungible tokens");
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
try {
|
|
94
|
+
const r = new phantasma_sdk_ts_1.CarbonBinaryReader((0, phantasma_sdk_ts_1.hexToBytes)(result));
|
|
95
|
+
const newBalance = phantasma_sdk_ts_1.IntX.read(r).toBigInt();
|
|
96
|
+
console.log("New balance after mint:", newBalance.toString());
|
|
97
|
+
}
|
|
98
|
+
catch (err) {
|
|
99
|
+
console.log("Mint succeeded but could not decode result as IntX; raw result:", result);
|
|
100
|
+
console.log("Decode error:", err instanceof Error ? err.message : String(err));
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=mintFungibleToken.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mintFungibleToken.js","sourceRoot":"","sources":["../../src/actions/mintFungibleToken.ts"],"names":[],"mappings":";;;AAwDA,8CA8EC;AAtID,uDAiB0B;AAC1B,2CAAwC;AACxC,uCAAyD;AAEzD,MAAa,oBAAoB;IAEtB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IATT,YACS,GAAW,EACX,KAAa,EACb,GAAW,EACX,aAAqB,EACrB,EAAU,EACV,MAAc,EACd,UAAkB,EAClB,gBAAwB,EACxB,gBAAwB;QARxB,QAAG,GAAH,GAAG,CAAQ;QACX,UAAK,GAAL,KAAK,CAAQ;QACb,QAAG,GAAH,GAAG,CAAQ;QACX,kBAAa,GAAb,aAAa,CAAQ;QACrB,OAAE,GAAF,EAAE,CAAQ;QACV,WAAM,GAAN,MAAM,CAAQ;QACd,eAAU,GAAV,UAAU,CAAQ;QAClB,qBAAgB,GAAhB,gBAAgB,CAAQ;QACxB,qBAAgB,GAAhB,gBAAgB,CAAQ;QAE/B,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;QACzC,IAAI,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;IAC3C,CAAC;IAED,WAAW;QACT,yCAAyC;QACzC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC;QACrC,MAAM,KAAK,GAAG,gCAAa,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;QAEjE,OAAO;YACL,GAAG,IAAI;YACP,KAAK;SACN,CAAC;IACJ,CAAC;CACF;AAjCD,oDAiCC;AAEM,KAAK,UAAU,iBAAiB,CACrC,GAAyB,EACzB,MAAe,EACf,cAAuB,KAAK;IAE5B,IAAI,GAAG,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACrE,CAAC;IAED,MAAM,QAAQ,GAAG,gCAAa,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAChD,MAAM,YAAY,GAAG,IAAI,0BAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IAErD,MAAM,MAAM,GAAG,0BAAO,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACrC,MAAM,cAAc,GAAG,IAAI,0BAAO,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;IAE1D,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,CACT,+CAA+C,EAC/C,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,wBAAc,EAAE,CAAC,CAAC,CACrD,CAAC;IACJ,CAAC;IAED,yFAAyF;IACzF,0FAA0F;IAC1F,0EAA0E;IAC1E,MAAM,UAAU,GAAG,IAAI,6BAAU,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,gBAAgB,CAAC,CAAC;IACxE,MAAM,MAAM,GAAG,UAAU,CAAC,eAAe,EAAE,CAAC;IAE5C,MAAM,GAAG,GAAG,IAAI,wBAAK,EAAE,CAAC;IACxB,GAAG,CAAC,IAAI,GAAG,0BAAO,CAAC,YAAY,CAAC;IAChC,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,kDAAkD;IAC5F,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC;IACpB,GAAG,CAAC,OAAO,GAAG,GAAG,CAAC,gBAAgB,CAAC;IACnC,GAAG,CAAC,OAAO,GAAG,YAAY,CAAC;IAC3B,GAAG,CAAC,OAAO,GAAG,8BAAW,CAAC,KAAK,CAAC;IAEhC,MAAM,IAAI,GAAG,IAAI,oCAAiB,EAAE,CAAC;IACrC,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,aAAa,CAAC;IACjC,IAAI,CAAC,EAAE,GAAG,cAAc,CAAC;IACzB,IAAI,CAAC,MAAM,GAAG,uBAAI,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC1C,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC;IAEf,MAAM,OAAO,GAAG,8BAAW,CAAC,gBAAgB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC5D,MAAM,KAAK,GAAG,IAAA,6BAAU,EAAC,OAAO,CAAC,CAAC;IAElC,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,CAAC,GAAG,CAAC,qCAAqC,KAAK,EAAE,CAAC,CAAC;QAC1D,OAAO,CAAC,GAAG,CACT,IAAA,sBAAY,EAAC,6BAAU,CAAC,YAAY,CAAC,8BAAW,EAAE,IAAA,6BAAU,EAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CACzE,CAAC;QACF,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;IAE3C,MAAM,GAAG,GAAG,IAAI,+BAAY,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;IAEvD,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC;IACtD,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAEhC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,IAAA,qBAAS,EAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAEzD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;QAC9C,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,IAAI,qCAAkB,CAAC,IAAA,6BAAU,EAAC,MAAM,CAAC,CAAC,CAAC;QACrD,MAAM,UAAU,GAAG,uBAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,yBAAyB,EAAE,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC;IAChE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CACT,iEAAiE,EACjE,MAAM,CACP,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IACjF,CAAC;AACH,CAAC","sourcesContent":["import {\n Address,\n Bytes32,\n CarbonBinaryReader,\n CarbonBlob,\n FeeOptions,\n hexToBytes,\n IntX,\n PhantasmaAPI,\n PhantasmaKeys,\n SignedTxMsg,\n SmallString,\n TxMsg,\n TxMsgMintFungible,\n TxMsgSigner,\n TxTypes,\n bytesToHex,\n} from \"phantasma-sdk-ts\";\nimport { waitForTx } from \"./waitForTx\";\nimport { bigintReplacer, formatForLog } from \"./helpers\";\n\nexport class mintFungibleTokenCfg {\n constructor(\n public rpc: string,\n public nexus: string,\n public wif: string,\n public carbonTokenId: bigint,\n public to: string,\n public amount: bigint,\n public gasFeeBase: bigint,\n public gasFeeMultiplier: bigint,\n public mintTokenMaxData: bigint,\n ) {\n this.rpc = rpc;\n this.nexus = nexus;\n this.wif = wif;\n this.carbonTokenId = carbonTokenId;\n this.to = to;\n this.amount = amount;\n this.gasFeeBase = gasFeeBase;\n this.gasFeeMultiplier = gasFeeMultiplier;\n this.mintTokenMaxData = mintTokenMaxData;\n }\n\n toPrintable() {\n // Do not leak WIF; derive owner address.\n const { wif: _omit, ...rest } = this;\n const owner = PhantasmaKeys.fromWIF(this.wif).Address.toString();\n\n return {\n ...rest,\n owner,\n };\n }\n}\n\nexport async function mintFungibleToken(\n cfg: mintFungibleTokenCfg,\n dryRun: boolean,\n logSettings: boolean = false,\n) {\n if (cfg.amount <= 0n) {\n throw new Error(\"mint_fungible_amount must be a positive integer\");\n }\n\n const txSender = PhantasmaKeys.fromWIF(cfg.wif);\n const senderPubKey = new Bytes32(txSender.PublicKey);\n\n const toAddr = Address.Parse(cfg.to);\n const receiverPubKey = new Bytes32(toAddr.GetPublicKey());\n\n if (logSettings) {\n console.log(\n \"Minting fungible tokens using these settings:\",\n JSON.stringify(cfg.toPrintable(), bigintReplacer, 2),\n );\n }\n\n // There is no dedicated MintFungible TxHelper in `phantasma-sdk-ts` yet, so we build the\n // Carbon TxMsg manually using the SDK core types. TokenContract::MintFungible returns the\n // receiver's new balance after minting, encoded as IntX in the tx result.\n const feeOptions = new FeeOptions(cfg.gasFeeBase, cfg.gasFeeMultiplier);\n const maxGas = feeOptions.calculateMaxGas();\n\n const msg = new TxMsg();\n msg.type = TxTypes.MintFungible;\n msg.expiry = BigInt(Date.now() + 60_000); // 60s from now (same pattern as other tx helpers)\n msg.maxGas = maxGas;\n msg.maxData = cfg.mintTokenMaxData;\n msg.gasFrom = senderPubKey;\n msg.payload = SmallString.empty;\n\n const mint = new TxMsgMintFungible();\n mint.tokenId = cfg.carbonTokenId;\n mint.to = receiverPubKey;\n mint.amount = IntX.fromBigInt(cfg.amount);\n msg.msg = mint;\n\n const txBytes = TxMsgSigner.signAndSerialize(msg, txSender);\n const txHex = bytesToHex(txBytes);\n\n if (dryRun) {\n console.log(`[dry-run] Prepared tx (not sent): ${txHex}`);\n console.log(\n formatForLog(CarbonBlob.NewFromBytes(SignedTxMsg, hexToBytes(txHex), 0)),\n );\n return;\n }\n\n console.log(\"Broadcasting transaction...\");\n\n const rpc = new PhantasmaAPI(cfg.rpc, null, cfg.nexus);\n\n const txHash = await rpc.sendCarbonTransaction(txHex);\n console.log(\"txHash: \", txHash);\n\n const { success, result } = await waitForTx(rpc, txHash);\n\n if (!success) {\n console.log(\"Could not mint fungible tokens\");\n return;\n }\n\n try {\n const r = new CarbonBinaryReader(hexToBytes(result));\n const newBalance = IntX.read(r).toBigInt();\n console.log(\"New balance after mint:\", newBalance.toString());\n } catch (err) {\n console.log(\n \"Mint succeeded but could not decode result as IntX; raw result:\",\n result,\n );\n console.log(\"Decode error:\", err instanceof Error ? err.message : String(err));\n }\n}\n\n"]}
|
package/dist/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AA+OA,iBAAe,IAAI,kBAqJlB;AAcD,eAAe,IAAI,CAAC"}
|
package/dist/cli.js
CHANGED
|
@@ -10,6 +10,7 @@ const config_1 = __importDefault(require("./config"));
|
|
|
10
10
|
const node_util_1 = require("node:util");
|
|
11
11
|
const createToken_1 = require("./actions/createToken");
|
|
12
12
|
const createSeries_1 = require("./actions/createSeries");
|
|
13
|
+
const mintFungibleToken_1 = require("./actions/mintFungibleToken");
|
|
13
14
|
const mintNftToken_1 = require("./actions/mintNftToken");
|
|
14
15
|
const phantasma_sdk_ts_1 = require("phantasma-sdk-ts");
|
|
15
16
|
/**
|
|
@@ -22,8 +23,61 @@ const phantasma_sdk_ts_1 = require("phantasma-sdk-ts");
|
|
|
22
23
|
* Actions:
|
|
23
24
|
* - create-token
|
|
24
25
|
* - create-series
|
|
26
|
+
* - mint-fungible
|
|
25
27
|
* - mint-nft
|
|
26
28
|
*/
|
|
29
|
+
function printHelp() {
|
|
30
|
+
const text = `Usage:
|
|
31
|
+
pha-deploy --create-token [options]
|
|
32
|
+
pha-deploy --create-series [options]
|
|
33
|
+
pha-deploy --mint-fungible [options]
|
|
34
|
+
pha-deploy --mint-nft [options]
|
|
35
|
+
|
|
36
|
+
Actions:
|
|
37
|
+
--create-token Create a token
|
|
38
|
+
--create-series Create a token series
|
|
39
|
+
--mint-fungible Mint fungible tokens
|
|
40
|
+
--mint-nft Mint tokens
|
|
41
|
+
|
|
42
|
+
Common flags:
|
|
43
|
+
--config <path> Path to TOML config file (default: config.toml)
|
|
44
|
+
--dry-run Do not broadcast transactions; just show payloads
|
|
45
|
+
--rpc-log Enable SDK JSON-RPC logging (full response payloads)
|
|
46
|
+
--settings-log Print resolved configuration before executing an action
|
|
47
|
+
--help Show this help
|
|
48
|
+
--version Show version number
|
|
49
|
+
|
|
50
|
+
Overrides (replace values from config.toml when provided):
|
|
51
|
+
--rpc <url> RPC endpoint (fallback: https://testnet.phantasma.info/rpc)
|
|
52
|
+
--nexus <name> Chain nexus (example: mainnet or testnet)
|
|
53
|
+
--wif <wif> WIF for signing
|
|
54
|
+
--symbol <symbol> Token symbol
|
|
55
|
+
--token-type <nft|fungible> Token type to create (default: nft)
|
|
56
|
+
--token-max-supply <int> Non-negative integer; required when token-type=fungible
|
|
57
|
+
--fungible-max-supply <int> Alias for --token-max-supply
|
|
58
|
+
--fungible-decimals <0..255> Decimal places; required when token-type=fungible
|
|
59
|
+
--carbon-token-id <int> Existing carbon token ID (for series or mint)
|
|
60
|
+
--carbon-token-series-id <int> Existing series ID (for mint)
|
|
61
|
+
--mint-fungible-to <address> Recipient address for fungible mint (default: WIF owner)
|
|
62
|
+
--mint-fungible-amount <int> Amount to mint (integer atomic units)
|
|
63
|
+
--rom <hex> Token ROM hex (optional; for token creation)
|
|
64
|
+
--token-schemas <json> JSON string with schemas (seriesMetadata, rom, ram)
|
|
65
|
+
--token-metadata <json> JSON string of token metadata fields
|
|
66
|
+
--series-metadata <json> JSON object or array of series metadata fields
|
|
67
|
+
--nft-metadata <json> JSON object or array of NFT metadata fields
|
|
68
|
+
--create-token-max-data <int> Max data for create-token tx
|
|
69
|
+
--create-token-series-max-data <int> Max data for create-series tx
|
|
70
|
+
--mint-token-max-data <int> Max data for mint-nft tx
|
|
71
|
+
--gas-fee-base <int> Gas fee base
|
|
72
|
+
--gas-fee-create-token-base <int> Gas fee base for create-token
|
|
73
|
+
--gas-fee-create-token-symbol <int> Gas fee per symbol
|
|
74
|
+
--gas-fee-create-token-series <int> Gas fee for create-series
|
|
75
|
+
--gas-fee-multiplier <int> Gas fee multiplier
|
|
76
|
+
|
|
77
|
+
pha-deploy - Phantasma token deployment and minting CLI
|
|
78
|
+
`;
|
|
79
|
+
console.log(text);
|
|
80
|
+
}
|
|
27
81
|
function requireArg(value, name) {
|
|
28
82
|
if (value === undefined || value === null) {
|
|
29
83
|
throw new Error(`${name} is required`);
|
|
@@ -76,23 +130,43 @@ async function actionMintNft(cfg, dryRun, logSettings) {
|
|
|
76
130
|
requireArg(cfg.mintTokenMaxData, "mint_token_max_data");
|
|
77
131
|
await (0, mintNftToken_1.mintNftToken)(new mintNftToken_1.mintNftTokenCfg(cfg.rpc, cfg.nexus, cfg.wif, cfg.carbonTokenId, cfg.carbonTokenSeriesId, cfg.tokenSchemas.rom, cfg.nftMetadata, cfg.gasFeeBase, cfg.gasFeeMultiplier, cfg.mintTokenMaxData), dryRun, logSettings);
|
|
78
132
|
}
|
|
133
|
+
async function actionMintFungible(cfg, dryRun, logSettings) {
|
|
134
|
+
requireArg(cfg.rpc, "rpc");
|
|
135
|
+
requireArg(cfg.nexus, "nexus");
|
|
136
|
+
requireArg(cfg.wif, "wif");
|
|
137
|
+
requireArg(cfg.carbonTokenId, "carbon_token_id");
|
|
138
|
+
requireArg(cfg.mintFungibleAmount, "mint_fungible_amount");
|
|
139
|
+
requireArg(cfg.gasFeeBase, "gas_fee_base");
|
|
140
|
+
requireArg(cfg.gasFeeMultiplier, "gas_fee_multiplier");
|
|
141
|
+
requireArg(cfg.mintTokenMaxData, "mint_token_max_data");
|
|
142
|
+
const to = cfg.mintFungibleTo ?? phantasma_sdk_ts_1.PhantasmaKeys.fromWIF(cfg.wif).Address.toString();
|
|
143
|
+
await (0, mintFungibleToken_1.mintFungibleToken)(new mintFungibleToken_1.mintFungibleTokenCfg(cfg.rpc, cfg.nexus, cfg.wif, cfg.carbonTokenId, to, cfg.mintFungibleAmount, cfg.gasFeeBase, cfg.gasFeeMultiplier, cfg.mintTokenMaxData), dryRun, logSettings);
|
|
144
|
+
}
|
|
79
145
|
/* ------------------------------- Main ------------------------------- */
|
|
80
146
|
async function main() {
|
|
81
|
-
|
|
82
|
-
|
|
147
|
+
const rawArgv = (0, helpers_1.hideBin)(process.argv);
|
|
148
|
+
// Pre-parse --config and --help early so the TOML file can be loaded before the main yargs parsing.
|
|
149
|
+
const pre = (0, yargs_1.default)(rawArgv)
|
|
83
150
|
.option("config", {
|
|
84
151
|
type: "string",
|
|
85
152
|
alias: "c",
|
|
86
153
|
description: "Path to TOML config file (default: config.toml)",
|
|
87
154
|
})
|
|
155
|
+
.option("help", {
|
|
156
|
+
type: "boolean",
|
|
157
|
+
})
|
|
158
|
+
.alias("h", "help")
|
|
88
159
|
.help(false)
|
|
160
|
+
.version(false)
|
|
89
161
|
.parseSync();
|
|
90
|
-
|
|
91
|
-
|
|
162
|
+
if (pre.help) {
|
|
163
|
+
printHelp();
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
92
166
|
// Minimal yargs parsing for the top-level CLI behavior
|
|
93
|
-
const
|
|
167
|
+
const parser = (0, yargs_1.default)(rawArgv)
|
|
94
168
|
.scriptName("pha-deploy")
|
|
95
|
-
.usage("Usage: $0 [options] [--create-token|--mint-nft
|
|
169
|
+
.usage("Usage: $0 [options] [--create-token|--create-series|--mint-fungible|--mint-nft]")
|
|
96
170
|
.option("rpc", { type: "string", describe: "RPC endpoint" })
|
|
97
171
|
.option("nexus", { type: "string", describe: "Chain nexus" })
|
|
98
172
|
.option("wif", { type: "string", describe: "WIF for signing" })
|
|
@@ -122,6 +196,11 @@ async function main() {
|
|
|
122
196
|
type: "boolean",
|
|
123
197
|
describe: "Print resolved configuration before executing an action",
|
|
124
198
|
})
|
|
199
|
+
.option("help", {
|
|
200
|
+
type: "boolean",
|
|
201
|
+
describe: "Show help",
|
|
202
|
+
})
|
|
203
|
+
.alias("h", "help")
|
|
125
204
|
.option("config", {
|
|
126
205
|
type: "string",
|
|
127
206
|
describe: "Path to TOML config file (default: config.toml). Takes precedence as the file used for defaults.",
|
|
@@ -131,11 +210,25 @@ async function main() {
|
|
|
131
210
|
type: "boolean",
|
|
132
211
|
describe: "Create a token series",
|
|
133
212
|
})
|
|
213
|
+
.option("mint-fungible", { type: "boolean", describe: "Mint fungible tokens" })
|
|
134
214
|
.option("mint-nft", { type: "boolean", describe: "Mint tokens" })
|
|
135
|
-
.
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
215
|
+
.option("mint-fungible-to", {
|
|
216
|
+
type: "string",
|
|
217
|
+
describe: "Recipient address for fungible mint (default: WIF owner)",
|
|
218
|
+
})
|
|
219
|
+
.option("mint-fungible-amount", {
|
|
220
|
+
type: "string",
|
|
221
|
+
describe: "Amount to mint (integer atomic units)",
|
|
222
|
+
})
|
|
223
|
+
.version()
|
|
224
|
+
.epilog("pha-deploy - Phantasma token deployment and minting CLI");
|
|
225
|
+
const argv = await parser.parseAsync();
|
|
226
|
+
if (argv.help) {
|
|
227
|
+
printHelp();
|
|
228
|
+
return;
|
|
229
|
+
}
|
|
230
|
+
// Load TOML configuration (if present) before doing full parsing
|
|
231
|
+
const cfg = (0, config_1.default)({ configPath: pre.config ?? null });
|
|
139
232
|
const rpcLogEnabled = Boolean(argv["rpc-log"]);
|
|
140
233
|
const settingsLogEnabled = Boolean(argv["settings-log"]);
|
|
141
234
|
if (rpcLogEnabled) {
|
|
@@ -156,9 +249,11 @@ async function main() {
|
|
|
156
249
|
// Determine dry-run (CLI flag overrides config)
|
|
157
250
|
const dryRun = Boolean(argv["dry-run"]) || cfg.dryRun || false;
|
|
158
251
|
// One-shot actions: pick the first matching action
|
|
159
|
-
const actions = ["create-token", "create-series", "mint-nft"];
|
|
252
|
+
const actions = ["create-token", "create-series", "mint-fungible", "mint-nft"];
|
|
253
|
+
let foundAction = false;
|
|
160
254
|
for (const action of actions) {
|
|
161
255
|
if (argv[action]) {
|
|
256
|
+
foundAction = true;
|
|
162
257
|
switch (action) {
|
|
163
258
|
case "create-token": {
|
|
164
259
|
await actionCreateToken(cfg, dryRun, settingsLogEnabled);
|
|
@@ -168,6 +263,10 @@ async function main() {
|
|
|
168
263
|
await actionCreateSeries(cfg, dryRun, settingsLogEnabled);
|
|
169
264
|
return;
|
|
170
265
|
}
|
|
266
|
+
case "mint-fungible": {
|
|
267
|
+
await actionMintFungible(cfg, dryRun, settingsLogEnabled);
|
|
268
|
+
return;
|
|
269
|
+
}
|
|
171
270
|
case "mint-nft": {
|
|
172
271
|
await actionMintNft(cfg, dryRun, settingsLogEnabled);
|
|
173
272
|
return;
|
|
@@ -176,8 +275,9 @@ async function main() {
|
|
|
176
275
|
}
|
|
177
276
|
}
|
|
178
277
|
// No action requested -> show help
|
|
179
|
-
|
|
180
|
-
|
|
278
|
+
if (!foundAction) {
|
|
279
|
+
printHelp();
|
|
280
|
+
}
|
|
181
281
|
}
|
|
182
282
|
/* ----------------------------- Run Script ---------------------------- */
|
|
183
283
|
if (require.main === module) {
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;;;;AACA,2CAAwC;AACxC,kDAA0B;AAC1B,sDAAyD;AACzD,yCAAoC;AACpC,uDAAoE;AACpE,yDAAuE;AACvE,yDAAuE;AACvE,uDAA6C;AAE7C;;;;;;;;;;;GAWG;AAEH,SAAS,UAAU,CACjB,KAAQ,EACR,IAAY;IAEZ,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,cAAc,CAAC,CAAC;IACzC,CAAC;AACH,CAAC;AAED,yEAAyE;AACzE,KAAK,UAAU,iBAAiB,CAC9B,GAAW,EACX,MAAe,EACf,WAAoB;IAEpB,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC3B,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC/B,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC3B,UAAU,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACjC,UAAU,CAAC,GAAG,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;IAC3C,UAAU,CAAC,GAAG,CAAC,qBAAqB,EAAE,2BAA2B,CAAC,CAAC;IACnE,UAAU,CAAC,GAAG,CAAC,uBAAuB,EAAE,6BAA6B,CAAC,CAAC;IACvE,UAAU,CAAC,GAAG,CAAC,gBAAgB,EAAE,oBAAoB,CAAC,CAAC;IACvD,UAAU,CAAC,GAAG,CAAC,kBAAkB,EAAE,uBAAuB,CAAC,CAAC;IAE5D,MAAM,SAAS,GACb,CAAC,GAAG,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC;IAE/D,IAAI,SAAS,KAAK,UAAU,EAAE,CAAC;QAC7B,UAAU,CAAC,GAAG,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;QACnD,UAAU,CAAC,GAAG,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,CAAC;IACxD,CAAC;SAAM,CAAC;QACN,UAAU,CAAC,GAAG,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;IAChD,CAAC;IAED,MAAM,IAAA,yBAAW,EACf,IAAI,4BAAc,CAChB,GAAG,CAAC,GAAG,EACP,GAAG,CAAC,KAAK,EACT,GAAG,CAAC,GAAG,EACP,GAAG,CAAC,MAAM,EACV,GAAG,CAAC,UAAU,EACd,GAAG,CAAC,qBAAqB,EACzB,GAAG,CAAC,uBAAuB,EAC3B,GAAG,CAAC,gBAAgB,EACpB,GAAG,CAAC,kBAAkB,EACtB,GAAG,CAAC,YAAY,EAChB,GAAG,CAAC,aAAa,EACjB,SAAS,EACT,GAAG,CAAC,cAAc,EAClB,GAAG,CAAC,gBAAgB,CACrB,EACD,MAAM,EACN,WAAW,CACZ,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,kBAAkB,CAC/B,GAAW,EACX,MAAe,EACf,WAAoB;IAEpB,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC3B,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC/B,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC3B,UAAU,CAAC,GAAG,CAAC,aAAa,EAAE,iBAAiB,CAAC,CAAC;IACjD,UAAU,CAAC,GAAG,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;IAC9C,UAAU,CAAC,GAAG,CAAC,cAAc,EAAE,iBAAiB,CAAC,CAAC;IAClD,UAAU,CAAC,GAAG,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;IAC3C,UAAU,CAAC,GAAG,CAAC,uBAAuB,EAAE,6BAA6B,CAAC,CAAC;IACvE,UAAU,CAAC,GAAG,CAAC,gBAAgB,EAAE,oBAAoB,CAAC,CAAC;IACvD,UAAU,CAAC,GAAG,CAAC,wBAAwB,EAAE,8BAA8B,CAAC,CAAC;IAEzE,MAAM,IAAA,2BAAY,EAChB,IAAI,8BAAe,CACjB,GAAG,CAAC,GAAG,EACP,GAAG,CAAC,KAAK,EACT,GAAG,CAAC,GAAG,EACP,GAAG,CAAC,aAAa,EACjB,GAAG,CAAC,UAAU,EACd,GAAG,CAAC,uBAAuB,EAC3B,GAAG,CAAC,gBAAgB,EACpB,GAAG,CAAC,wBAAwB,EAC5B,GAAG,CAAC,YAAY,EAAE,cAAc,EAChC,GAAG,CAAC,cAAc,CACnB,EACD,MAAM,EACN,WAAW,CACZ,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,aAAa,CAC1B,GAAW,EACX,MAAe,EACf,WAAoB;IAEpB,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC3B,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC/B,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC3B,UAAU,CAAC,GAAG,CAAC,aAAa,EAAE,iBAAiB,CAAC,CAAC;IACjD,UAAU,CAAC,GAAG,CAAC,mBAAmB,EAAE,wBAAwB,CAAC,CAAC;IAC9D,UAAU,CAAC,GAAG,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;IAC9C,UAAU,CAAC,GAAG,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;IAC5C,UAAU,CAAC,GAAG,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;IAC3C,UAAU,CAAC,GAAG,CAAC,gBAAgB,EAAE,oBAAoB,CAAC,CAAC;IACvD,UAAU,CAAC,GAAG,CAAC,gBAAgB,EAAE,qBAAqB,CAAC,CAAC;IAExD,MAAM,IAAA,2BAAY,EAChB,IAAI,8BAAe,CACjB,GAAG,CAAC,GAAG,EACP,GAAG,CAAC,KAAK,EACT,GAAG,CAAC,GAAG,EACP,GAAG,CAAC,aAAa,EACjB,GAAG,CAAC,mBAAmB,EACvB,GAAG,CAAC,YAAY,CAAC,GAAG,EACpB,GAAG,CAAC,WAAW,EACf,GAAG,CAAC,UAAU,EACd,GAAG,CAAC,gBAAgB,EACpB,GAAG,CAAC,gBAAgB,CACrB,EACD,MAAM,EACN,WAAW,CACZ,CAAC;AACJ,CAAC;AAED,0EAA0E;AAE1E,KAAK,UAAU,IAAI;IACjB,yFAAyF;IACzF,MAAM,GAAG,GAAG,IAAA,eAAK,EAAC,IAAA,iBAAO,EAAC,OAAO,CAAC,IAAI,CAAC,CAAC;SACrC,MAAM,CAAC,QAAQ,EAAE;QAChB,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,GAAG;QACV,WAAW,EAAE,iDAAiD;KAC/D,CAAC;SACD,IAAI,CAAC,KAAK,CAAC;SACX,SAAS,EAAE,CAAC;IAEf,iEAAiE;IACjE,MAAM,GAAG,GAAG,IAAA,gBAAU,EAAC,EAAE,UAAU,EAAE,GAAG,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC,CAAC;IAE3D,uDAAuD;IACvD,MAAM,IAAI,GAAG,MAAM,IAAA,eAAK,EAAC,IAAA,iBAAO,EAAC,OAAO,CAAC,IAAI,CAAC,CAAC;SAC5C,UAAU,CAAC,YAAY,CAAC;SACxB,KAAK,CAAC,4DAA4D,CAAC;SACnE,MAAM,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC;SAC3D,MAAM,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC;SAC5D,MAAM,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,iBAAiB,EAAE,CAAC;SAC9D,MAAM,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC;SAC9D,MAAM,CAAC,YAAY,EAAE;QACpB,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,CAAC,KAAK,EAAE,UAAU,CAAC;QAC5B,QAAQ,EAAE,qCAAqC;KAChD,CAAC;SACD,MAAM,CAAC,kBAAkB,EAAE;QAC1B,IAAI,EAAE,QAAQ;QACd,QAAQ,EACN,0EAA0E;KAC7E,CAAC;SACD,MAAM,CAAC,mBAAmB,EAAE;QAC3B,IAAI,EAAE,QAAQ;QACd,QAAQ,EACN,yEAAyE;KAC5E,CAAC;SACD,MAAM,CAAC,SAAS,EAAE;QACjB,IAAI,EAAE,SAAS;QACf,QAAQ,EAAE,mDAAmD;KAC9D,CAAC;SACD,MAAM,CAAC,SAAS,EAAE;QACjB,IAAI,EAAE,SAAS;QACf,QAAQ,EACN,uEAAuE;KAC1E,CAAC;SACD,MAAM,CAAC,cAAc,EAAE;QACtB,IAAI,EAAE,SAAS;QACf,QAAQ,EAAE,yDAAyD;KACpE,CAAC;SACD,MAAM,CAAC,QAAQ,EAAE;QAChB,IAAI,EAAE,QAAQ;QACd,QAAQ,EACN,kGAAkG;KACrG,CAAC;SACD,MAAM,CAAC,cAAc,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,gBAAgB,EAAE,CAAC;SACvE,MAAM,CAAC,eAAe,EAAE;QACvB,IAAI,EAAE,SAAS;QACf,QAAQ,EAAE,uBAAuB;KAClC,CAAC;SACD,MAAM,CAAC,UAAU,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC;SAChE,IAAI,EAAE;SACN,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC;SAClB,MAAM,CAAC,yDAAyD,CAAC;SACjE,UAAU,EAAE,CAAC;IAEhB,MAAM,aAAa,GAAG,OAAO,CAAE,IAAY,CAAC,SAAS,CAAC,CAAC,CAAC;IACxD,MAAM,kBAAkB,GAAG,OAAO,CAAE,IAAY,CAAC,cAAc,CAAC,CAAC,CAAC;IAClE,IAAI,aAAa,EAAE,CAAC;QAClB,8EAA8E;QAC9E,IAAA,4BAAS,EAAC;YACR,GAAG,EAAE,CAAC,GAAG,IAAe,EAAE,EAAE;gBAC1B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CACjC,OAAO,GAAG,KAAK,QAAQ;oBACrB,CAAC,CAAC,GAAG;oBACL,CAAC,CAAC,IAAA,mBAAO,EAAC,GAAG,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CACjD,CAAC;gBACF,OAAO,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,CAAC;YAC5B,CAAC;SACF,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,qDAAqD;QACrD,IAAA,4BAAS,GAAE,CAAC;IACd,CAAC;IAED,gDAAgD;IAChD,MAAM,MAAM,GAAG,OAAO,CAAE,IAAY,CAAC,SAAS,CAAC,CAAC,IAAI,GAAG,CAAC,MAAM,IAAI,KAAK,CAAC;IAExE,mDAAmD;IACnD,MAAM,OAAO,GAAG,CAAC,cAAc,EAAE,eAAe,EAAE,UAAU,CAAC,CAAC;IAC9D,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAK,IAAY,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1B,QAAQ,MAAM,EAAE,CAAC;gBACf,KAAK,cAAc,CAAC,CAAC,CAAC;oBACpB,MAAM,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,kBAAkB,CAAC,CAAC;oBACzD,OAAO;gBACT,CAAC;gBACD,KAAK,eAAe,CAAC,CAAC,CAAC;oBACrB,MAAM,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,kBAAkB,CAAC,CAAC;oBAC1D,OAAO;gBACT,CAAC;gBACD,KAAK,UAAU,CAAC,CAAC,CAAC;oBAChB,MAAM,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,kBAAkB,CAAC,CAAC;oBACrD,OAAO;gBACT,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,mCAAmC;IACnC,OAAO,CAAC,GAAG,CACT,+EAA+E,CAChF,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;AACpD,CAAC;AAED,2EAA2E;AAE3E,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;IAC5B,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;QACnB,OAAO,CAAC,KAAK,CACX,yBAAyB,EACzB,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CACnC,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,kBAAe,IAAI,CAAC","sourcesContent":["#!/usr/bin/env node\nimport { hideBin } from \"yargs/helpers\";\nimport yargs from \"yargs\";\nimport loadConfig, { Config, TokenType } from \"./config\";\nimport { inspect } from \"node:util\";\nimport { createToken, createTokenCfg } from \"./actions/createToken\";\nimport { createSeries, createSeriesCfg } from \"./actions/createSeries\";\nimport { mintNftToken, mintNftTokenCfg } from \"./actions/mintNftToken\";\nimport { setLogger } from \"phantasma-sdk-ts\";\n\n/**\n * CLI for pha-deploy.\n *\n * Modes:\n * - CLI one-shot: use flags to perform actions immediately\n * - TOML-driven: use `--config` or default `config.toml` for config values\n *\n * Actions:\n * - create-token\n * - create-series\n * - mint-nft\n */\n\nfunction requireArg<T>(\n value: T,\n name: string,\n): asserts value is NonNullable<T> {\n if (value === undefined || value === null) {\n throw new Error(`${name} is required`);\n }\n}\n\n/* ----------------------------- Actions ----------------------------- */\nasync function actionCreateToken(\n cfg: Config,\n dryRun: boolean,\n logSettings: boolean,\n) {\n requireArg(cfg.rpc, \"rpc\");\n requireArg(cfg.nexus, \"nexus\");\n requireArg(cfg.wif, \"wif\");\n requireArg(cfg.symbol, \"symbol\");\n requireArg(cfg.gasFeeBase, \"gas_fee_base\");\n requireArg(cfg.gasFeeCreateTokenBase, \"gas_fee_create_token_base\");\n requireArg(cfg.gasFeeCreateTokenSymbol, \"gas_fee_create_token_symbol\");\n requireArg(cfg.gasFeeMultiplier, \"gas_fee_multiplier\");\n requireArg(cfg.createTokenMaxData, \"create_token_max_data\");\n\n const tokenType: TokenType =\n (cfg.tokenType ?? \"nft\") === \"fungible\" ? \"fungible\" : \"nft\";\n\n if (tokenType === \"fungible\") {\n requireArg(cfg.tokenMaxSupply, \"token_max_supply\");\n requireArg(cfg.fungibleDecimals, \"fungible_decimals\");\n } else {\n requireArg(cfg.tokenSchemas, \"token_schemas\");\n }\n\n await createToken(\n new createTokenCfg(\n cfg.rpc,\n cfg.nexus,\n cfg.wif,\n cfg.symbol,\n cfg.gasFeeBase,\n cfg.gasFeeCreateTokenBase,\n cfg.gasFeeCreateTokenSymbol,\n cfg.gasFeeMultiplier,\n cfg.createTokenMaxData,\n cfg.tokenSchemas,\n cfg.tokenMetadata,\n tokenType,\n cfg.tokenMaxSupply,\n cfg.fungibleDecimals,\n ),\n dryRun,\n logSettings,\n );\n}\n\nasync function actionCreateSeries(\n cfg: Config,\n dryRun: boolean,\n logSettings: boolean,\n) {\n requireArg(cfg.rpc, \"rpc\");\n requireArg(cfg.nexus, \"nexus\");\n requireArg(cfg.wif, \"wif\");\n requireArg(cfg.carbonTokenId, \"carbon_token_id\");\n requireArg(cfg.tokenSchemas, \"token_schemas\");\n requireArg(cfg.seriesMetadata, \"series_metadata\");\n requireArg(cfg.gasFeeBase, \"gas_fee_base\");\n requireArg(cfg.gasFeeCreateTokenSeries, \"gas_fee_create_token_series\");\n requireArg(cfg.gasFeeMultiplier, \"gas_fee_multiplier\");\n requireArg(cfg.createTokenSeriesMaxData, \"create_token_series_max_data\");\n\n await createSeries(\n new createSeriesCfg(\n cfg.rpc,\n cfg.nexus,\n cfg.wif,\n cfg.carbonTokenId,\n cfg.gasFeeBase,\n cfg.gasFeeCreateTokenSeries,\n cfg.gasFeeMultiplier,\n cfg.createTokenSeriesMaxData,\n cfg.tokenSchemas?.seriesMetadata,\n cfg.seriesMetadata\n ),\n dryRun,\n logSettings,\n );\n}\n\nasync function actionMintNft(\n cfg: Config,\n dryRun: boolean,\n logSettings: boolean,\n) {\n requireArg(cfg.rpc, \"rpc\");\n requireArg(cfg.nexus, \"nexus\");\n requireArg(cfg.wif, \"wif\");\n requireArg(cfg.carbonTokenId, \"carbon_token_id\");\n requireArg(cfg.carbonTokenSeriesId, \"carbon_token_series_id\");\n requireArg(cfg.tokenSchemas, \"token_schemas\");\n requireArg(cfg.nftMetadata, \"nft_metadata\");\n requireArg(cfg.gasFeeBase, \"gas_fee_base\");\n requireArg(cfg.gasFeeMultiplier, \"gas_fee_multiplier\");\n requireArg(cfg.mintTokenMaxData, \"mint_token_max_data\");\n\n await mintNftToken(\n new mintNftTokenCfg(\n cfg.rpc,\n cfg.nexus,\n cfg.wif,\n cfg.carbonTokenId,\n cfg.carbonTokenSeriesId,\n cfg.tokenSchemas.rom,\n cfg.nftMetadata,\n cfg.gasFeeBase,\n cfg.gasFeeMultiplier,\n cfg.mintTokenMaxData,\n ),\n dryRun,\n logSettings,\n );\n}\n\n/* ------------------------------- Main ------------------------------- */\n\nasync function main() {\n // Pre-parse --config early so the TOML file can be loaded before the main yargs parsing.\n const pre = yargs(hideBin(process.argv))\n .option(\"config\", {\n type: \"string\",\n alias: \"c\",\n description: \"Path to TOML config file (default: config.toml)\",\n })\n .help(false)\n .parseSync();\n\n // Load TOML configuration (if present) before doing full parsing\n const cfg = loadConfig({ configPath: pre.config ?? null });\n\n // Minimal yargs parsing for the top-level CLI behavior\n const argv = await yargs(hideBin(process.argv))\n .scriptName(\"pha-deploy\")\n .usage(\"Usage: $0 [options] [--create-token|--mint-nft|--transfer]\")\n .option(\"rpc\", { type: \"string\", describe: \"RPC endpoint\" })\n .option(\"nexus\", { type: \"string\", describe: \"Chain nexus\" })\n .option(\"wif\", { type: \"string\", describe: \"WIF for signing\" })\n .option(\"symbol\", { type: \"string\", describe: \"Token symbol\" })\n .option(\"token-type\", {\n type: \"string\",\n choices: [\"nft\", \"fungible\"],\n describe: \"Token type to create (default: nft)\",\n })\n .option(\"token-max-supply\", {\n type: \"string\",\n describe:\n \"Token max supply (optional for NFT; required when --token-type fungible)\",\n })\n .option(\"fungible-decimals\", {\n type: \"number\",\n describe:\n \"Decimal places for fungible token (required when --token-type fungible)\",\n })\n .option(\"dry-run\", {\n type: \"boolean\",\n describe: \"Do not broadcast transactions; just show payloads\",\n })\n .option(\"rpc-log\", {\n type: \"boolean\",\n describe:\n \"Enable SDK RPC logging (prints full JSON-RPC responses for debugging)\",\n })\n .option(\"settings-log\", {\n type: \"boolean\",\n describe: \"Print resolved configuration before executing an action\",\n })\n .option(\"config\", {\n type: \"string\",\n describe:\n \"Path to TOML config file (default: config.toml). Takes precedence as the file used for defaults.\",\n })\n .option(\"create-token\", { type: \"boolean\", describe: \"Create a token\" })\n .option(\"create-series\", {\n type: \"boolean\",\n describe: \"Create a token series\",\n })\n .option(\"mint-nft\", { type: \"boolean\", describe: \"Mint tokens\" })\n .help()\n .alias(\"h\", \"help\")\n .epilog(\"pha-deploy - Phantasma token deployment and minting CLI\")\n .parseAsync();\n\n const rpcLogEnabled = Boolean((argv as any)[\"rpc-log\"]);\n const settingsLogEnabled = Boolean((argv as any)[\"settings-log\"]);\n if (rpcLogEnabled) {\n // SDK logs JSON-RPC responses as raw objects; inspect avoids [Object] output.\n setLogger({\n log: (...args: unknown[]) => {\n const formatted = args.map((arg) =>\n typeof arg === \"string\"\n ? arg\n : inspect(arg, { depth: null, colors: false }),\n );\n console.log(...formatted);\n },\n });\n } else {\n // Enforce silent SDK logs unless explicitly enabled.\n setLogger();\n }\n\n // Determine dry-run (CLI flag overrides config)\n const dryRun = Boolean((argv as any)[\"dry-run\"]) || cfg.dryRun || false;\n\n // One-shot actions: pick the first matching action\n const actions = [\"create-token\", \"create-series\", \"mint-nft\"];\n for (const action of actions) {\n if ((argv as any)[action]) {\n switch (action) {\n case \"create-token\": {\n await actionCreateToken(cfg, dryRun, settingsLogEnabled);\n return;\n }\n case \"create-series\": {\n await actionCreateSeries(cfg, dryRun, settingsLogEnabled);\n return;\n }\n case \"mint-nft\": {\n await actionMintNft(cfg, dryRun, settingsLogEnabled);\n return;\n }\n }\n }\n }\n\n // No action requested -> show help\n console.log(\n \"No action specified. Pass an action flag (e.g. --create-token or --mint-nft).\",\n );\n console.log(\"Use --help to see available flags.\");\n}\n\n/* ----------------------------- Run Script ---------------------------- */\n\nif (require.main === module) {\n main().catch((err) => {\n console.error(\n \"Unhandled error in CLI:\",\n err && err.stack ? err.stack : err,\n );\n process.exit(2);\n });\n}\n\nexport default main;\n"]}
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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","sourcesContent":["#!/usr/bin/env node\nimport { hideBin } from \"yargs/helpers\";\nimport yargs from \"yargs\";\nimport loadConfig, { Config, TokenType } from \"./config\";\nimport { inspect } from \"node:util\";\nimport { createToken, createTokenCfg } from \"./actions/createToken\";\nimport { createSeries, createSeriesCfg } from \"./actions/createSeries\";\nimport { mintFungibleToken, mintFungibleTokenCfg } from \"./actions/mintFungibleToken\";\nimport { mintNftToken, mintNftTokenCfg } from \"./actions/mintNftToken\";\nimport { PhantasmaKeys, setLogger } from \"phantasma-sdk-ts\";\n\n/**\n * CLI for pha-deploy.\n *\n * Modes:\n * - CLI one-shot: use flags to perform actions immediately\n * - TOML-driven: use `--config` or default `config.toml` for config values\n *\n * Actions:\n * - create-token\n * - create-series\n * - mint-fungible\n * - mint-nft\n */\n\nfunction printHelp(): void {\n const text = `Usage:\n pha-deploy --create-token [options]\n pha-deploy --create-series [options]\n pha-deploy --mint-fungible [options]\n pha-deploy --mint-nft [options]\n\nActions:\n --create-token Create a token\n --create-series Create a token series\n --mint-fungible Mint fungible tokens\n --mint-nft Mint tokens\n\nCommon flags:\n --config <path> Path to TOML config file (default: config.toml)\n --dry-run Do not broadcast transactions; just show payloads\n --rpc-log Enable SDK JSON-RPC logging (full response payloads)\n --settings-log Print resolved configuration before executing an action\n --help Show this help\n --version Show version number\n\nOverrides (replace values from config.toml when provided):\n --rpc <url> RPC endpoint (fallback: https://testnet.phantasma.info/rpc)\n --nexus <name> Chain nexus (example: mainnet or testnet)\n --wif <wif> WIF for signing\n --symbol <symbol> Token symbol\n --token-type <nft|fungible> Token type to create (default: nft)\n --token-max-supply <int> Non-negative integer; required when token-type=fungible\n --fungible-max-supply <int> Alias for --token-max-supply\n --fungible-decimals <0..255> Decimal places; required when token-type=fungible\n --carbon-token-id <int> Existing carbon token ID (for series or mint)\n --carbon-token-series-id <int> Existing series ID (for mint)\n --mint-fungible-to <address> Recipient address for fungible mint (default: WIF owner)\n --mint-fungible-amount <int> Amount to mint (integer atomic units)\n --rom <hex> Token ROM hex (optional; for token creation)\n --token-schemas <json> JSON string with schemas (seriesMetadata, rom, ram)\n --token-metadata <json> JSON string of token metadata fields\n --series-metadata <json> JSON object or array of series metadata fields\n --nft-metadata <json> JSON object or array of NFT metadata fields\n --create-token-max-data <int> Max data for create-token tx\n --create-token-series-max-data <int> Max data for create-series tx\n --mint-token-max-data <int> Max data for mint-nft tx\n --gas-fee-base <int> Gas fee base\n --gas-fee-create-token-base <int> Gas fee base for create-token\n --gas-fee-create-token-symbol <int> Gas fee per symbol\n --gas-fee-create-token-series <int> Gas fee for create-series\n --gas-fee-multiplier <int> Gas fee multiplier\n\npha-deploy - Phantasma token deployment and minting CLI\n`;\n console.log(text);\n}\n\nfunction requireArg<T>(\n value: T,\n name: string,\n): asserts value is NonNullable<T> {\n if (value === undefined || value === null) {\n throw new Error(`${name} is required`);\n }\n}\n\n/* ----------------------------- Actions ----------------------------- */\nasync function actionCreateToken(\n cfg: Config,\n dryRun: boolean,\n logSettings: boolean,\n) {\n requireArg(cfg.rpc, \"rpc\");\n requireArg(cfg.nexus, \"nexus\");\n requireArg(cfg.wif, \"wif\");\n requireArg(cfg.symbol, \"symbol\");\n requireArg(cfg.gasFeeBase, \"gas_fee_base\");\n requireArg(cfg.gasFeeCreateTokenBase, \"gas_fee_create_token_base\");\n requireArg(cfg.gasFeeCreateTokenSymbol, \"gas_fee_create_token_symbol\");\n requireArg(cfg.gasFeeMultiplier, \"gas_fee_multiplier\");\n requireArg(cfg.createTokenMaxData, \"create_token_max_data\");\n\n const tokenType: TokenType =\n (cfg.tokenType ?? \"nft\") === \"fungible\" ? \"fungible\" : \"nft\";\n\n if (tokenType === \"fungible\") {\n requireArg(cfg.tokenMaxSupply, \"token_max_supply\");\n requireArg(cfg.fungibleDecimals, \"fungible_decimals\");\n } else {\n requireArg(cfg.tokenSchemas, \"token_schemas\");\n }\n\n await createToken(\n new createTokenCfg(\n cfg.rpc,\n cfg.nexus,\n cfg.wif,\n cfg.symbol,\n cfg.gasFeeBase,\n cfg.gasFeeCreateTokenBase,\n cfg.gasFeeCreateTokenSymbol,\n cfg.gasFeeMultiplier,\n cfg.createTokenMaxData,\n cfg.tokenSchemas,\n cfg.tokenMetadata,\n tokenType,\n cfg.tokenMaxSupply,\n cfg.fungibleDecimals,\n ),\n dryRun,\n logSettings,\n );\n}\n\nasync function actionCreateSeries(\n cfg: Config,\n dryRun: boolean,\n logSettings: boolean,\n) {\n requireArg(cfg.rpc, \"rpc\");\n requireArg(cfg.nexus, \"nexus\");\n requireArg(cfg.wif, \"wif\");\n requireArg(cfg.carbonTokenId, \"carbon_token_id\");\n requireArg(cfg.tokenSchemas, \"token_schemas\");\n requireArg(cfg.seriesMetadata, \"series_metadata\");\n requireArg(cfg.gasFeeBase, \"gas_fee_base\");\n requireArg(cfg.gasFeeCreateTokenSeries, \"gas_fee_create_token_series\");\n requireArg(cfg.gasFeeMultiplier, \"gas_fee_multiplier\");\n requireArg(cfg.createTokenSeriesMaxData, \"create_token_series_max_data\");\n\n await createSeries(\n new createSeriesCfg(\n cfg.rpc,\n cfg.nexus,\n cfg.wif,\n cfg.carbonTokenId,\n cfg.gasFeeBase,\n cfg.gasFeeCreateTokenSeries,\n cfg.gasFeeMultiplier,\n cfg.createTokenSeriesMaxData,\n cfg.tokenSchemas?.seriesMetadata,\n cfg.seriesMetadata\n ),\n dryRun,\n logSettings,\n );\n}\n\nasync function actionMintNft(\n cfg: Config,\n dryRun: boolean,\n logSettings: boolean,\n) {\n requireArg(cfg.rpc, \"rpc\");\n requireArg(cfg.nexus, \"nexus\");\n requireArg(cfg.wif, \"wif\");\n requireArg(cfg.carbonTokenId, \"carbon_token_id\");\n requireArg(cfg.carbonTokenSeriesId, \"carbon_token_series_id\");\n requireArg(cfg.tokenSchemas, \"token_schemas\");\n requireArg(cfg.nftMetadata, \"nft_metadata\");\n requireArg(cfg.gasFeeBase, \"gas_fee_base\");\n requireArg(cfg.gasFeeMultiplier, \"gas_fee_multiplier\");\n requireArg(cfg.mintTokenMaxData, \"mint_token_max_data\");\n\n await mintNftToken(\n new mintNftTokenCfg(\n cfg.rpc,\n cfg.nexus,\n cfg.wif,\n cfg.carbonTokenId,\n cfg.carbonTokenSeriesId,\n cfg.tokenSchemas.rom,\n cfg.nftMetadata,\n cfg.gasFeeBase,\n cfg.gasFeeMultiplier,\n cfg.mintTokenMaxData,\n ),\n dryRun,\n logSettings,\n );\n}\n\nasync function actionMintFungible(\n cfg: Config,\n dryRun: boolean,\n logSettings: boolean,\n) {\n requireArg(cfg.rpc, \"rpc\");\n requireArg(cfg.nexus, \"nexus\");\n requireArg(cfg.wif, \"wif\");\n requireArg(cfg.carbonTokenId, \"carbon_token_id\");\n requireArg(cfg.mintFungibleAmount, \"mint_fungible_amount\");\n requireArg(cfg.gasFeeBase, \"gas_fee_base\");\n requireArg(cfg.gasFeeMultiplier, \"gas_fee_multiplier\");\n requireArg(cfg.mintTokenMaxData, \"mint_token_max_data\");\n\n const to =\n cfg.mintFungibleTo ?? PhantasmaKeys.fromWIF(cfg.wif).Address.toString();\n\n await mintFungibleToken(\n new mintFungibleTokenCfg(\n cfg.rpc,\n cfg.nexus,\n cfg.wif,\n cfg.carbonTokenId,\n to,\n cfg.mintFungibleAmount,\n cfg.gasFeeBase,\n cfg.gasFeeMultiplier,\n cfg.mintTokenMaxData,\n ),\n dryRun,\n logSettings,\n );\n}\n\n/* ------------------------------- Main ------------------------------- */\n\nasync function main() {\n const rawArgv = hideBin(process.argv);\n\n // Pre-parse --config and --help early so the TOML file can be loaded before the main yargs parsing.\n const pre = yargs(rawArgv)\n .option(\"config\", {\n type: \"string\",\n alias: \"c\",\n description: \"Path to TOML config file (default: config.toml)\",\n })\n .option(\"help\", {\n type: \"boolean\",\n })\n .alias(\"h\", \"help\")\n .help(false)\n .version(false)\n .parseSync();\n\n if ((pre as any).help) {\n printHelp();\n return;\n }\n\n // Minimal yargs parsing for the top-level CLI behavior\n const parser = yargs(rawArgv)\n .scriptName(\"pha-deploy\")\n .usage(\"Usage: $0 [options] [--create-token|--create-series|--mint-fungible|--mint-nft]\")\n .option(\"rpc\", { type: \"string\", describe: \"RPC endpoint\" })\n .option(\"nexus\", { type: \"string\", describe: \"Chain nexus\" })\n .option(\"wif\", { type: \"string\", describe: \"WIF for signing\" })\n .option(\"symbol\", { type: \"string\", describe: \"Token symbol\" })\n .option(\"token-type\", {\n type: \"string\",\n choices: [\"nft\", \"fungible\"],\n describe: \"Token type to create (default: nft)\",\n })\n .option(\"token-max-supply\", {\n type: \"string\",\n describe:\n \"Token max supply (optional for NFT; required when --token-type fungible)\",\n })\n .option(\"fungible-decimals\", {\n type: \"number\",\n describe:\n \"Decimal places for fungible token (required when --token-type fungible)\",\n })\n .option(\"dry-run\", {\n type: \"boolean\",\n describe: \"Do not broadcast transactions; just show payloads\",\n })\n .option(\"rpc-log\", {\n type: \"boolean\",\n describe:\n \"Enable SDK RPC logging (prints full JSON-RPC responses for debugging)\",\n })\n .option(\"settings-log\", {\n type: \"boolean\",\n describe: \"Print resolved configuration before executing an action\",\n })\n .option(\"help\", {\n type: \"boolean\",\n describe: \"Show help\",\n })\n .alias(\"h\", \"help\")\n .option(\"config\", {\n type: \"string\",\n describe:\n \"Path to TOML config file (default: config.toml). Takes precedence as the file used for defaults.\",\n })\n .option(\"create-token\", { type: \"boolean\", describe: \"Create a token\" })\n .option(\"create-series\", {\n type: \"boolean\",\n describe: \"Create a token series\",\n })\n .option(\"mint-fungible\", { type: \"boolean\", describe: \"Mint fungible tokens\" })\n .option(\"mint-nft\", { type: \"boolean\", describe: \"Mint tokens\" })\n .option(\"mint-fungible-to\", {\n type: \"string\",\n describe: \"Recipient address for fungible mint (default: WIF owner)\",\n })\n .option(\"mint-fungible-amount\", {\n type: \"string\",\n describe: \"Amount to mint (integer atomic units)\",\n })\n .version()\n .epilog(\"pha-deploy - Phantasma token deployment and minting CLI\");\n\n const argv = await parser.parseAsync();\n if ((argv as any).help) {\n printHelp();\n return;\n }\n\n // Load TOML configuration (if present) before doing full parsing\n const cfg = loadConfig({ configPath: pre.config ?? null });\n\n const rpcLogEnabled = Boolean((argv as any)[\"rpc-log\"]);\n const settingsLogEnabled = Boolean((argv as any)[\"settings-log\"]);\n if (rpcLogEnabled) {\n // SDK logs JSON-RPC responses as raw objects; inspect avoids [Object] output.\n setLogger({\n log: (...args: unknown[]) => {\n const formatted = args.map((arg) =>\n typeof arg === \"string\"\n ? arg\n : inspect(arg, { depth: null, colors: false }),\n );\n console.log(...formatted);\n },\n });\n } else {\n // Enforce silent SDK logs unless explicitly enabled.\n setLogger();\n }\n\n // Determine dry-run (CLI flag overrides config)\n const dryRun = Boolean((argv as any)[\"dry-run\"]) || cfg.dryRun || false;\n\n // One-shot actions: pick the first matching action\n const actions = [\"create-token\", \"create-series\", \"mint-fungible\", \"mint-nft\"];\n let foundAction = false;\n for (const action of actions) {\n if ((argv as any)[action]) {\n foundAction = true;\n switch (action) {\n case \"create-token\": {\n await actionCreateToken(cfg, dryRun, settingsLogEnabled);\n return;\n }\n case \"create-series\": {\n await actionCreateSeries(cfg, dryRun, settingsLogEnabled);\n return;\n }\n case \"mint-fungible\": {\n await actionMintFungible(cfg, dryRun, settingsLogEnabled);\n return;\n }\n case \"mint-nft\": {\n await actionMintNft(cfg, dryRun, settingsLogEnabled);\n return;\n }\n }\n }\n }\n\n // No action requested -> show help\n if (!foundAction) {\n printHelp();\n }\n}\n\n/* ----------------------------- Run Script ---------------------------- */\n\nif (require.main === module) {\n main().catch((err) => {\n console.error(\n \"Unhandled error in CLI:\",\n err && err.stack ? err.stack : err,\n );\n process.exit(2);\n });\n}\n\nexport default main;\n"]}
|
package/dist/config.d.ts
CHANGED
|
@@ -16,6 +16,8 @@ export interface Config {
|
|
|
16
16
|
carbonTokenSeriesId?: number | null;
|
|
17
17
|
seriesMetadata?: MetadataField[] | null;
|
|
18
18
|
nftMetadata?: MetadataField[] | null;
|
|
19
|
+
mintFungibleTo?: string | null;
|
|
20
|
+
mintFungibleAmount?: bigint | null;
|
|
19
21
|
createTokenMaxData?: bigint | null;
|
|
20
22
|
createTokenSeriesMaxData?: bigint | null;
|
|
21
23
|
mintTokenMaxData?: bigint | null;
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,QAAQ,EAAkB,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,YAAY,EAAuB,MAAM,kBAAkB,CAAC;AAEpF,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG,UAAU,CAAC;AAE3C,MAAM,WAAW,MAAM;IAErB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAGpB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,YAAY,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;IACnC,aAAa,EAAE,QAAQ,CAAC;IACxB,SAAS,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;IAC7B,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAGjC,mBAAmB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,cAAc,CAAC,EAAE,aAAa,EAAE,GAAG,IAAI,CAAC;IAGxC,WAAW,CAAC,EAAE,aAAa,EAAE,GAAG,IAAI,CAAC;IAGrC,kBAAkB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,wBAAwB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzC,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAGjC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,qBAAqB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,uBAAuB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,uBAAuB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAGjC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAsKD;;;;;;;;;GASG;AACH,wBAAgB,UAAU,CAAC,OAAO,CAAC,EAAE;IACnC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,QAAQ,EAAkB,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,YAAY,EAAuB,MAAM,kBAAkB,CAAC;AAEpF,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG,UAAU,CAAC;AAE3C,MAAM,WAAW,MAAM;IAErB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAGpB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,YAAY,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;IACnC,aAAa,EAAE,QAAQ,CAAC;IACxB,SAAS,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;IAC7B,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAGjC,mBAAmB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,cAAc,CAAC,EAAE,aAAa,EAAE,GAAG,IAAI,CAAC;IAGxC,WAAW,CAAC,EAAE,aAAa,EAAE,GAAG,IAAI,CAAC;IAGrC,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,kBAAkB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAGnC,kBAAkB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,wBAAwB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzC,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAGjC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,qBAAqB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,uBAAuB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,uBAAuB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAGjC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAsKD;;;;;;;;;GASG;AACH,wBAAgB,UAAU,CAAC,OAAO,CAAC,EAAE;IACnC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B,GAAG,MAAM,CA8NT;AAED,eAAe,UAAU,CAAC"}
|
package/dist/config.js
CHANGED
|
@@ -175,6 +175,8 @@ function loadConfig(options) {
|
|
|
175
175
|
tokenMaxSupply: null,
|
|
176
176
|
fungibleDecimals: null,
|
|
177
177
|
nftMetadata: null,
|
|
178
|
+
mintFungibleTo: null,
|
|
179
|
+
mintFungibleAmount: null,
|
|
178
180
|
createTokenMaxData: null,
|
|
179
181
|
createTokenSeriesMaxData: null,
|
|
180
182
|
mintTokenMaxData: null,
|
|
@@ -199,6 +201,11 @@ function loadConfig(options) {
|
|
|
199
201
|
parseBigInt(pickValue(argv, "carbon-token-id", "carbon_token_id")) ?? null;
|
|
200
202
|
cfg.carbonTokenSeriesId =
|
|
201
203
|
parseNumber(pickValue(argv, "carbon-token-series-id", "carbon_token_series_id")) ?? null;
|
|
204
|
+
// Mint-fungible args (optional; required only for --mint-fungible action).
|
|
205
|
+
cfg.mintFungibleTo =
|
|
206
|
+
pickValue(argv, "mint-fungible-to", "mint_fungible_to") ?? null;
|
|
207
|
+
cfg.mintFungibleAmount =
|
|
208
|
+
parseBigInt(pickValue(argv, "mint-fungible-amount", "mint_fungible_amount")) ?? null;
|
|
202
209
|
cfg.rom = pickValue(argv, "rom", "rom") ?? null;
|
|
203
210
|
const tokenTypeRaw = pickValue(argv, "token-type", "token_type");
|
|
204
211
|
if (tokenTypeRaw) {
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from \"fs\";\nimport path from \"path\";\nimport toml from \"@iarna/toml\";\nimport yargs from \"yargs/yargs\";\nimport { Metadata, MetadataFields } from \"./actions/helpers\";\nimport { MetadataField, TokenSchemas, TokenSchemasBuilder } from \"phantasma-sdk-ts\";\n\nexport type TokenType = \"nft\" | \"fungible\";\n\nexport interface Config {\n // Core / connection\n rpc: string;\n nexus?: string | null;\n wif?: string | null;\n\n // Token\n symbol?: string | null;\n carbonTokenId?: bigint | null;\n rom?: string | null;\n tokenSchemas?: TokenSchemas | null;\n tokenMetadata: Metadata;\n tokenType?: TokenType | null;\n tokenMaxSupply?: bigint | null;\n fungibleDecimals?: number | null;\n\n // Series\n carbonTokenSeriesId?: number | null;\n seriesMetadata?: MetadataField[] | null;\n\n // NFT-specific\n nftMetadata?: MetadataField[] | null;\n\n // Limits / sizes\n createTokenMaxData?: bigint | null;\n createTokenSeriesMaxData?: bigint | null;\n mintTokenMaxData?: bigint | null;\n\n // Gas / fees\n gasFeeBase?: bigint | null;\n gasFeeCreateTokenBase?: bigint | null;\n gasFeeCreateTokenSymbol?: bigint | null;\n gasFeeCreateTokenSeries?: bigint | null;\n gasFeeMultiplier?: bigint | null;\n\n // Runtime flags\n configPath?: string | null;\n dryRun?: boolean;\n}\n\n/**\n * Try to parse a JSON string, returning undefined if parsing fails.\n */\nfunction tryParseJSON<T = unknown>(value?: string | null): T | undefined {\n if (!value) return undefined;\n try {\n // Some users may provide single-quoted JSON; normalize quotes if necessary\n const trimmed = value.trim();\n return JSON.parse(trimmed) as T;\n } catch(e) {\n console.error(\"JSON parsing error: \", e);\n // ignore parse errors; caller will handle fallback\n return undefined;\n }\n}\n\nfunction makeMetadataField(\n name: string,\n value: unknown,\n context: string,\n): MetadataField {\n const trimmed = name.trim();\n if (!trimmed) {\n throw new Error(`${context}: metadata field name cannot be empty`);\n }\n\n if (\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"bigint\" ||\n value instanceof Uint8Array\n ) {\n const field = new MetadataField();\n field.name = trimmed;\n field.value = value;\n return field;\n }\n\n throw new Error(\n `${context}.${trimmed} must be a string, number, bigint or Uint8Array`,\n );\n}\n\nfunction parseMetadataFieldArray(\n raw: string | undefined,\n context: string,\n): MetadataField[] | undefined {\n if (!raw) {\n return undefined;\n }\n\n const parsed = tryParseJSON<unknown>(raw);\n if (parsed === undefined) {\n return undefined;\n }\n\n if (Array.isArray(parsed)) {\n return parsed.map((entry, idx) => {\n if (\n entry &&\n typeof entry === \"object\" &&\n !Array.isArray(entry) &&\n \"name\" in entry &&\n \"value\" in entry &&\n typeof (entry as any).name === \"string\"\n ) {\n return makeMetadataField(\n (entry as any).name,\n (entry as any).value,\n `${context}[${idx}]`,\n );\n }\n throw new Error(\n `${context}[${idx}] must be an object like { name: string; value: ... }`,\n );\n });\n }\n\n if (parsed && typeof parsed === \"object\") {\n return Object.entries(parsed as Record<string, unknown>).map(\n ([name, value]) => makeMetadataField(name, value, context),\n );\n }\n\n throw new Error(`${context} must be a JSON object or array`);\n}\n\n/**\n * Parse a numeric-ish value into a number or undefined.\n */\nfunction parseNumber(value?: string | number | null): number | undefined {\n if (value == null) return undefined;\n\n if (typeof value === \"number\")\n return Number.isFinite(value) ? value : undefined;\n const v = value.toString().trim();\n if (v === \"\") return undefined;\n const n = Number(v);\n return Number.isFinite(n) ? n : undefined;\n}\n\nfunction parseBigInt(value?: string | bigint | null): bigint | undefined {\n if (value == null) return undefined;\n\n if (typeof value === \"bigint\") return value;\n\n const v = value.toString().trim();\n if (v === \"\") return undefined;\n return BigInt(v);\n}\n\n/**\n * Load TOML configuration from a provided path (if exists) or from default `config.toml`.\n * The parsed result is stored in the module-scoped `tomlConfig` object and used as\n * the source of truth for configuration values unless overridden by CLI flags.\n */\nlet tomlConfig: Record<string, any> = {};\n\nfunction loadToml(configPath?: string | null) {\n const file = configPath ? configPath : \"config.toml\";\n try {\n const resolved = path.resolve(process.cwd(), file);\n if (fs.existsSync(resolved)) {\n const raw = fs.readFileSync(resolved, { encoding: \"utf8\" });\n // Parse TOML into a plain object. If parse fails, keep an empty config.\n try {\n tomlConfig = toml.parse(raw) as Record<string, any>;\n } catch {\n tomlConfig = {};\n }\n } else {\n tomlConfig = {};\n }\n } catch {\n tomlConfig = {};\n }\n}\n\n/**\n * Helper to obtain a value by preferring CLI args -> TOML config -> fallback.\n * Accepts multiple possible CLI keys (kebab-case and camelCase).\n */\nfunction pickValue<T = string | undefined>(\n argv: Record<string, unknown>,\n cliKey: string, // prefer these (kebab/camel)\n tomlKey: string,\n): T | undefined {\n // try as-is from CLI\n if (Object.prototype.hasOwnProperty.call(argv, cliKey)) {\n const v = argv[cliKey];\n // yargs may map flags to boolean when not provided with value\n if (!(v === undefined)) {\n return v as unknown as T;\n }\n }\n\n // Fall back to TOML configuration.\n if (tomlConfig) {\n return tomlConfig[tomlKey] as unknown as T;\n }\n\n return undefined;\n}\n\n/**\n * Build Config by merging:\n * - TOML config file (config.toml) values\n * - CLI flags (override TOML)\n * - defaults (where applicable)\n *\n * Usage:\n * loadConfig(); // uses process.argv and config.toml if present\n * loadConfig({ argv: ['--rpc','https://...'], configPath: 'custom-config.toml' })\n */\nexport function loadConfig(options?: {\n argv?: string[];\n configPath?: string | null;\n}): Config {\n // Load TOML config (if any)\n loadToml(options?.configPath ?? null);\n\n // Parse CLI args using yargs; pass provided argv or process.argv\n const rawArgv = options?.argv ?? process.argv.slice(2);\n const argv = yargs(rawArgv)\n .help(false)\n .version(false)\n .parseSync();\n\n const cfg: Config = {\n rpc: \"\",\n nexus: \"\",\n wif: null,\n symbol: null,\n carbonTokenId: null,\n carbonTokenSeriesId: null,\n rom: null,\n tokenSchemas: null,\n tokenMetadata: new Metadata(undefined, \"token_metadata\"),\n seriesMetadata: null,\n tokenType: null,\n tokenMaxSupply: null,\n fungibleDecimals: null,\n nftMetadata: null,\n createTokenMaxData: null,\n createTokenSeriesMaxData: null,\n mintTokenMaxData: null,\n gasFeeBase: null,\n gasFeeCreateTokenBase: null,\n gasFeeCreateTokenSymbol: null,\n gasFeeCreateTokenSeries: null,\n gasFeeMultiplier: null,\n configPath: null,\n dryRun: false,\n };\n\n // Core / connection\n cfg.rpc =\n (pickValue(argv, \"rpc\", \"rpc\") as string | undefined) ??\n \"https://testnet.phantasma.info/rpc\";\n cfg.nexus = (pickValue(argv, \"nexus\", \"nexus\") as string | undefined) ?? null;\n cfg.wif = (pickValue(argv, \"wif\", \"wif\") as string | undefined) ?? null;\n\n // Token defaults\n cfg.symbol =\n (pickValue(argv, \"symbol\", \"symbol\") as string | undefined) ?? null;\n cfg.carbonTokenId =\n parseBigInt(\n pickValue(argv, \"carbon-token-id\", \"carbon_token_id\") as\n | string\n | bigint\n | undefined,\n ) ?? null;\n cfg.carbonTokenSeriesId =\n parseNumber(\n pickValue(argv, \"carbon-token-series-id\", \"carbon_token_series_id\") as\n | string\n | number\n | undefined,\n ) ?? null;\n cfg.rom = (pickValue(argv, \"rom\", \"rom\") as string | undefined) ?? null;\n\n const tokenTypeRaw = pickValue(argv, \"token-type\", \"token_type\") as\n | string\n | undefined;\n if (tokenTypeRaw) {\n const lowered = tokenTypeRaw.trim().toLowerCase();\n if (lowered === \"fungible\" || lowered === \"nft\") {\n cfg.tokenType = lowered;\n } else {\n throw Error(`Unsupported token type ${lowered}`);\n }\n }\n\n // tokenSchemas\n const tokenSchemasRaw = pickValue<string>(\n argv,\n \"token-schemas\",\n \"token_schemas\",\n );\n if (tokenSchemasRaw) {\n cfg.tokenSchemas = TokenSchemasBuilder.fromJson(tokenSchemasRaw);\n }\n\n\n // tokenMetadata\n const tmfRaw = pickValue<string>(\n argv,\n \"token-metadata\",\n \"token_metadata\",\n );\n if (tmfRaw) {\n const tokenMetadataFields = tryParseJSON<MetadataFields>(tmfRaw);\n if (!tokenMetadataFields) {\n throw new Error(\"token_metadata must be valid JSON\");\n }\n cfg.tokenMetadata = new Metadata(tokenMetadataFields, \"token_metadata\");\n }\n\n const smfRaw = pickValue(\n argv,\n \"series-metadata\",\n \"series_metadata\",\n );\n cfg.seriesMetadata = parseMetadataFieldArray(smfRaw, \"series_metadata\") ?? null;\n\n const rawMaxSupply =\n (pickValue(argv, \"token-max-supply\", \"token_max_supply\") as\n | string\n | bigint\n | undefined) ??\n (pickValue(argv, \"fungible-max-supply\", \"fungible_max_supply\") as\n | string\n | bigint\n | undefined);\n cfg.tokenMaxSupply = parseBigInt(rawMaxSupply) ?? null;\n cfg.fungibleDecimals =\n parseNumber(\n pickValue(argv, \"fungible-decimals\", \"fungible_decimals\") as\n | string\n | number\n | undefined,\n ) ?? null;\n\n // NFT metadata\n const nmfRaw = pickValue(\n argv,\n \"nft-metadata\",\n \"nft_metadata\",\n );\n cfg.nftMetadata = parseMetadataFieldArray(nmfRaw, \"nft_metadata\") ?? null;\n\n // Limits and sizes\n cfg.createTokenMaxData =\n parseBigInt(\n pickValue(argv, \"create-token-max-data\", \"create_token_max_data\") as\n | string\n | bigint\n | undefined,\n ) ?? null;\n cfg.createTokenSeriesMaxData =\n parseBigInt(\n pickValue(\n argv,\n \"create-token-series-max-data\",\n \"create_token_series_max_data\",\n ) as string | bigint | undefined,\n ) ?? null;\n cfg.mintTokenMaxData =\n parseBigInt(\n pickValue(argv, \"mint-token-max-data\", \"mint_token_max_data\") as\n | string\n | bigint\n | undefined,\n ) ?? null;\n\n // Gas / fees\n cfg.gasFeeBase =\n parseBigInt(\n pickValue(argv, \"gas-fee-base\", \"gas_fee_base\") as\n | string\n | bigint\n | undefined,\n ) ?? null;\n cfg.gasFeeCreateTokenBase =\n parseBigInt(\n pickValue(\n argv,\n \"gas-fee-create-token-base\",\n \"gas_fee_create_token_base\",\n ) as string | bigint | undefined,\n ) ?? null;\n cfg.gasFeeCreateTokenSymbol =\n parseBigInt(\n pickValue(\n argv,\n \"gas-fee-create-token-symbol\",\n \"gas_fee_create_token_symbol\",\n ) as string | bigint | undefined,\n ) ?? null;\n cfg.gasFeeCreateTokenSeries =\n parseBigInt(\n pickValue(\n argv,\n \"gas-fee-create-token-series\",\n \"gas_fee_create_token_series\",\n ) as string | bigint | undefined,\n ) ?? null;\n cfg.gasFeeMultiplier =\n parseBigInt(\n pickValue(argv, \"gas-fee-multiplier\", \"gas_fee_multiplier\") as\n | string\n | bigint\n | undefined,\n ) ?? null;\n\n // Runtime flags\n cfg.configPath =\n (pickValue(argv, \"config\", \"CONFIG_PATH\") as string | undefined) ??\n options?.configPath ??\n null;\n cfg.dryRun = Boolean(pickValue(argv, \"dry-run\", \"dry_run\")) || false;\n\n return cfg;\n}\n\nexport default loadConfig;\n"]}
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from \"fs\";\nimport path from \"path\";\nimport toml from \"@iarna/toml\";\nimport yargs from \"yargs/yargs\";\nimport { Metadata, MetadataFields } from \"./actions/helpers\";\nimport { MetadataField, TokenSchemas, TokenSchemasBuilder } from \"phantasma-sdk-ts\";\n\nexport type TokenType = \"nft\" | \"fungible\";\n\nexport interface Config {\n // Core / connection\n rpc: string;\n nexus?: string | null;\n wif?: string | null;\n\n // Token\n symbol?: string | null;\n carbonTokenId?: bigint | null;\n rom?: string | null;\n tokenSchemas?: TokenSchemas | null;\n tokenMetadata: Metadata;\n tokenType?: TokenType | null;\n tokenMaxSupply?: bigint | null;\n fungibleDecimals?: number | null;\n\n // Series\n carbonTokenSeriesId?: number | null;\n seriesMetadata?: MetadataField[] | null;\n\n // NFT-specific\n nftMetadata?: MetadataField[] | null;\n\n // Mint fungible\n mintFungibleTo?: string | null;\n mintFungibleAmount?: bigint | null;\n\n // Limits / sizes\n createTokenMaxData?: bigint | null;\n createTokenSeriesMaxData?: bigint | null;\n mintTokenMaxData?: bigint | null;\n\n // Gas / fees\n gasFeeBase?: bigint | null;\n gasFeeCreateTokenBase?: bigint | null;\n gasFeeCreateTokenSymbol?: bigint | null;\n gasFeeCreateTokenSeries?: bigint | null;\n gasFeeMultiplier?: bigint | null;\n\n // Runtime flags\n configPath?: string | null;\n dryRun?: boolean;\n}\n\n/**\n * Try to parse a JSON string, returning undefined if parsing fails.\n */\nfunction tryParseJSON<T = unknown>(value?: string | null): T | undefined {\n if (!value) return undefined;\n try {\n // Some users may provide single-quoted JSON; normalize quotes if necessary\n const trimmed = value.trim();\n return JSON.parse(trimmed) as T;\n } catch(e) {\n console.error(\"JSON parsing error: \", e);\n // ignore parse errors; caller will handle fallback\n return undefined;\n }\n}\n\nfunction makeMetadataField(\n name: string,\n value: unknown,\n context: string,\n): MetadataField {\n const trimmed = name.trim();\n if (!trimmed) {\n throw new Error(`${context}: metadata field name cannot be empty`);\n }\n\n if (\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"bigint\" ||\n value instanceof Uint8Array\n ) {\n const field = new MetadataField();\n field.name = trimmed;\n field.value = value;\n return field;\n }\n\n throw new Error(\n `${context}.${trimmed} must be a string, number, bigint or Uint8Array`,\n );\n}\n\nfunction parseMetadataFieldArray(\n raw: string | undefined,\n context: string,\n): MetadataField[] | undefined {\n if (!raw) {\n return undefined;\n }\n\n const parsed = tryParseJSON<unknown>(raw);\n if (parsed === undefined) {\n return undefined;\n }\n\n if (Array.isArray(parsed)) {\n return parsed.map((entry, idx) => {\n if (\n entry &&\n typeof entry === \"object\" &&\n !Array.isArray(entry) &&\n \"name\" in entry &&\n \"value\" in entry &&\n typeof (entry as any).name === \"string\"\n ) {\n return makeMetadataField(\n (entry as any).name,\n (entry as any).value,\n `${context}[${idx}]`,\n );\n }\n throw new Error(\n `${context}[${idx}] must be an object like { name: string; value: ... }`,\n );\n });\n }\n\n if (parsed && typeof parsed === \"object\") {\n return Object.entries(parsed as Record<string, unknown>).map(\n ([name, value]) => makeMetadataField(name, value, context),\n );\n }\n\n throw new Error(`${context} must be a JSON object or array`);\n}\n\n/**\n * Parse a numeric-ish value into a number or undefined.\n */\nfunction parseNumber(value?: string | number | null): number | undefined {\n if (value == null) return undefined;\n\n if (typeof value === \"number\")\n return Number.isFinite(value) ? value : undefined;\n const v = value.toString().trim();\n if (v === \"\") return undefined;\n const n = Number(v);\n return Number.isFinite(n) ? n : undefined;\n}\n\nfunction parseBigInt(value?: string | bigint | null): bigint | undefined {\n if (value == null) return undefined;\n\n if (typeof value === \"bigint\") return value;\n\n const v = value.toString().trim();\n if (v === \"\") return undefined;\n return BigInt(v);\n}\n\n/**\n * Load TOML configuration from a provided path (if exists) or from default `config.toml`.\n * The parsed result is stored in the module-scoped `tomlConfig` object and used as\n * the source of truth for configuration values unless overridden by CLI flags.\n */\nlet tomlConfig: Record<string, any> = {};\n\nfunction loadToml(configPath?: string | null) {\n const file = configPath ? configPath : \"config.toml\";\n try {\n const resolved = path.resolve(process.cwd(), file);\n if (fs.existsSync(resolved)) {\n const raw = fs.readFileSync(resolved, { encoding: \"utf8\" });\n // Parse TOML into a plain object. If parse fails, keep an empty config.\n try {\n tomlConfig = toml.parse(raw) as Record<string, any>;\n } catch {\n tomlConfig = {};\n }\n } else {\n tomlConfig = {};\n }\n } catch {\n tomlConfig = {};\n }\n}\n\n/**\n * Helper to obtain a value by preferring CLI args -> TOML config -> fallback.\n * Accepts multiple possible CLI keys (kebab-case and camelCase).\n */\nfunction pickValue<T = string | undefined>(\n argv: Record<string, unknown>,\n cliKey: string, // prefer these (kebab/camel)\n tomlKey: string,\n): T | undefined {\n // try as-is from CLI\n if (Object.prototype.hasOwnProperty.call(argv, cliKey)) {\n const v = argv[cliKey];\n // yargs may map flags to boolean when not provided with value\n if (!(v === undefined)) {\n return v as unknown as T;\n }\n }\n\n // Fall back to TOML configuration.\n if (tomlConfig) {\n return tomlConfig[tomlKey] as unknown as T;\n }\n\n return undefined;\n}\n\n/**\n * Build Config by merging:\n * - TOML config file (config.toml) values\n * - CLI flags (override TOML)\n * - defaults (where applicable)\n *\n * Usage:\n * loadConfig(); // uses process.argv and config.toml if present\n * loadConfig({ argv: ['--rpc','https://...'], configPath: 'custom-config.toml' })\n */\nexport function loadConfig(options?: {\n argv?: string[];\n configPath?: string | null;\n}): Config {\n // Load TOML config (if any)\n loadToml(options?.configPath ?? null);\n\n // Parse CLI args using yargs; pass provided argv or process.argv\n const rawArgv = options?.argv ?? process.argv.slice(2);\n const argv = yargs(rawArgv)\n .help(false)\n .version(false)\n .parseSync();\n\n const cfg: Config = {\n rpc: \"\",\n nexus: \"\",\n wif: null,\n symbol: null,\n carbonTokenId: null,\n carbonTokenSeriesId: null,\n rom: null,\n tokenSchemas: null,\n tokenMetadata: new Metadata(undefined, \"token_metadata\"),\n seriesMetadata: null,\n tokenType: null,\n tokenMaxSupply: null,\n fungibleDecimals: null,\n nftMetadata: null,\n mintFungibleTo: null,\n mintFungibleAmount: null,\n createTokenMaxData: null,\n createTokenSeriesMaxData: null,\n mintTokenMaxData: null,\n gasFeeBase: null,\n gasFeeCreateTokenBase: null,\n gasFeeCreateTokenSymbol: null,\n gasFeeCreateTokenSeries: null,\n gasFeeMultiplier: null,\n configPath: null,\n dryRun: false,\n };\n\n // Core / connection\n cfg.rpc =\n (pickValue(argv, \"rpc\", \"rpc\") as string | undefined) ??\n \"https://testnet.phantasma.info/rpc\";\n cfg.nexus = (pickValue(argv, \"nexus\", \"nexus\") as string | undefined) ?? null;\n cfg.wif = (pickValue(argv, \"wif\", \"wif\") as string | undefined) ?? null;\n\n // Token defaults\n cfg.symbol =\n (pickValue(argv, \"symbol\", \"symbol\") as string | undefined) ?? null;\n cfg.carbonTokenId =\n parseBigInt(\n pickValue(argv, \"carbon-token-id\", \"carbon_token_id\") as\n | string\n | bigint\n | undefined,\n ) ?? null;\n cfg.carbonTokenSeriesId =\n parseNumber(\n pickValue(argv, \"carbon-token-series-id\", \"carbon_token_series_id\") as\n | string\n | number\n | undefined,\n ) ?? null;\n\n // Mint-fungible args (optional; required only for --mint-fungible action).\n cfg.mintFungibleTo =\n (pickValue(argv, \"mint-fungible-to\", \"mint_fungible_to\") as\n | string\n | undefined) ?? null;\n cfg.mintFungibleAmount =\n parseBigInt(\n pickValue(argv, \"mint-fungible-amount\", \"mint_fungible_amount\") as\n | string\n | bigint\n | undefined,\n ) ?? null;\n\n cfg.rom = (pickValue(argv, \"rom\", \"rom\") as string | undefined) ?? null;\n\n const tokenTypeRaw = pickValue(argv, \"token-type\", \"token_type\") as\n | string\n | undefined;\n if (tokenTypeRaw) {\n const lowered = tokenTypeRaw.trim().toLowerCase();\n if (lowered === \"fungible\" || lowered === \"nft\") {\n cfg.tokenType = lowered;\n } else {\n throw Error(`Unsupported token type ${lowered}`);\n }\n }\n\n // tokenSchemas\n const tokenSchemasRaw = pickValue<string>(\n argv,\n \"token-schemas\",\n \"token_schemas\",\n );\n if (tokenSchemasRaw) {\n cfg.tokenSchemas = TokenSchemasBuilder.fromJson(tokenSchemasRaw);\n }\n\n\n // tokenMetadata\n const tmfRaw = pickValue<string>(\n argv,\n \"token-metadata\",\n \"token_metadata\",\n );\n if (tmfRaw) {\n const tokenMetadataFields = tryParseJSON<MetadataFields>(tmfRaw);\n if (!tokenMetadataFields) {\n throw new Error(\"token_metadata must be valid JSON\");\n }\n cfg.tokenMetadata = new Metadata(tokenMetadataFields, \"token_metadata\");\n }\n\n const smfRaw = pickValue(\n argv,\n \"series-metadata\",\n \"series_metadata\",\n );\n cfg.seriesMetadata = parseMetadataFieldArray(smfRaw, \"series_metadata\") ?? null;\n\n const rawMaxSupply =\n (pickValue(argv, \"token-max-supply\", \"token_max_supply\") as\n | string\n | bigint\n | undefined) ??\n (pickValue(argv, \"fungible-max-supply\", \"fungible_max_supply\") as\n | string\n | bigint\n | undefined);\n cfg.tokenMaxSupply = parseBigInt(rawMaxSupply) ?? null;\n cfg.fungibleDecimals =\n parseNumber(\n pickValue(argv, \"fungible-decimals\", \"fungible_decimals\") as\n | string\n | number\n | undefined,\n ) ?? null;\n\n // NFT metadata\n const nmfRaw = pickValue(\n argv,\n \"nft-metadata\",\n \"nft_metadata\",\n );\n cfg.nftMetadata = parseMetadataFieldArray(nmfRaw, \"nft_metadata\") ?? null;\n\n // Limits and sizes\n cfg.createTokenMaxData =\n parseBigInt(\n pickValue(argv, \"create-token-max-data\", \"create_token_max_data\") as\n | string\n | bigint\n | undefined,\n ) ?? null;\n cfg.createTokenSeriesMaxData =\n parseBigInt(\n pickValue(\n argv,\n \"create-token-series-max-data\",\n \"create_token_series_max_data\",\n ) as string | bigint | undefined,\n ) ?? null;\n cfg.mintTokenMaxData =\n parseBigInt(\n pickValue(argv, \"mint-token-max-data\", \"mint_token_max_data\") as\n | string\n | bigint\n | undefined,\n ) ?? null;\n\n // Gas / fees\n cfg.gasFeeBase =\n parseBigInt(\n pickValue(argv, \"gas-fee-base\", \"gas_fee_base\") as\n | string\n | bigint\n | undefined,\n ) ?? null;\n cfg.gasFeeCreateTokenBase =\n parseBigInt(\n pickValue(\n argv,\n \"gas-fee-create-token-base\",\n \"gas_fee_create_token_base\",\n ) as string | bigint | undefined,\n ) ?? null;\n cfg.gasFeeCreateTokenSymbol =\n parseBigInt(\n pickValue(\n argv,\n \"gas-fee-create-token-symbol\",\n \"gas_fee_create_token_symbol\",\n ) as string | bigint | undefined,\n ) ?? null;\n cfg.gasFeeCreateTokenSeries =\n parseBigInt(\n pickValue(\n argv,\n \"gas-fee-create-token-series\",\n \"gas_fee_create_token_series\",\n ) as string | bigint | undefined,\n ) ?? null;\n cfg.gasFeeMultiplier =\n parseBigInt(\n pickValue(argv, \"gas-fee-multiplier\", \"gas_fee_multiplier\") as\n | string\n | bigint\n | undefined,\n ) ?? null;\n\n // Runtime flags\n cfg.configPath =\n (pickValue(argv, \"config\", \"CONFIG_PATH\") as string | undefined) ??\n options?.configPath ??\n null;\n cfg.dryRun = Boolean(pickValue(argv, \"dry-run\", \"dry_run\")) || false;\n\n return cfg;\n}\n\nexport default loadConfig;\n"]}
|