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 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
- - Three primary actions: `--create-token`, `--create-series`, `--mint-nft`.
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 <nexus>` – nexus name.
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 <number>` / `--fungible-max-supply <number>` – maximum supply.
206
- - `--fungible-decimals <number>` – decimals for fungible token.
207
- - `--carbon-token-id <id>` – existing Carbon token id.
208
- - `--carbon-token-series-id <id>` – existing Carbon 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 for series metadata.
213
- - `--nft-metadata '<json>'` – inline JSON for NFT metadata.
214
- - `--create-token-max-data <number>` – payload limit for token creation.
215
- - `--create-token-series-max-data <number>` – payload limit for series creation.
216
- - `--mint-token-max-data <number>` – payload limit for minting.
217
- - `--gas-fee-base <number>` – base gas fee.
218
- - `--gas-fee-create-token-base <number>` – gas fee for token creation.
219
- - `--gas-fee-create-token-symbol <number>` – symbol registration fee.
220
- - `--gas-fee-create-token-series <number>` – fee for series creation.
221
- - `--gas-fee-multiplier <number>` – multiplier applied to gas fee.
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":"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","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":";AAsJA,iBAAe,IAAI,kBAkHlB;AAcD,eAAe,IAAI,CAAC"}
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
- // Pre-parse --config early so the TOML file can be loaded before the main yargs parsing.
82
- const pre = (0, yargs_1.default)((0, helpers_1.hideBin)(process.argv))
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
- // Load TOML configuration (if present) before doing full parsing
91
- const cfg = (0, config_1.default)({ configPath: pre.config ?? null });
162
+ if (pre.help) {
163
+ printHelp();
164
+ return;
165
+ }
92
166
  // Minimal yargs parsing for the top-level CLI behavior
93
- const argv = await (0, yargs_1.default)((0, helpers_1.hideBin)(process.argv))
167
+ const parser = (0, yargs_1.default)(rawArgv)
94
168
  .scriptName("pha-deploy")
95
- .usage("Usage: $0 [options] [--create-token|--mint-nft|--transfer]")
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
- .help()
136
- .alias("h", "help")
137
- .epilog("pha-deploy - Phantasma token deployment and minting CLI")
138
- .parseAsync();
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
- console.log("No action specified. Pass an action flag (e.g. --create-token or --mint-nft).");
180
- console.log("Use --help to see available flags.");
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":"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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 { 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;
@@ -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,CA8MT;AAED,eAAe,UAAU,CAAC"}
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) {
@@ -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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pha-deploy",
3
- "version": "0.2.1",
3
+ "version": "0.2.3",
4
4
  "description": "CLI token deployment and minting tool for Phantasma blockchain",
5
5
  "type": "commonjs",
6
6
  "main": "dist/index.js",