pha-deploy 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +223 -0
- package/config/config.example.toml +117 -0
- package/dist/actions/createSeries.d.ts +20 -0
- package/dist/actions/createSeries.d.ts.map +1 -0
- package/dist/actions/createSeries.js +79 -0
- package/dist/actions/createSeries.js.map +1 -0
- package/dist/actions/createToken.d.ts +25 -0
- package/dist/actions/createToken.d.ts.map +1 -0
- package/dist/actions/createToken.js +124 -0
- package/dist/actions/createToken.js.map +1 -0
- package/dist/actions/helpers.d.ts +11 -0
- package/dist/actions/helpers.d.ts.map +1 -0
- package/dist/actions/helpers.js +78 -0
- package/dist/actions/helpers.js.map +1 -0
- package/dist/actions/mintNftToken.d.ts +20 -0
- package/dist/actions/mintNftToken.d.ts.map +1 -0
- package/dist/actions/mintNftToken.js +79 -0
- package/dist/actions/mintNftToken.js.map +1 -0
- package/dist/actions/waitForTx.d.ts +6 -0
- package/dist/actions/waitForTx.d.ts.map +1 -0
- package/dist/actions/waitForTx.js +54 -0
- package/dist/actions/waitForTx.js.map +1 -0
- package/dist/cli.d.ts +4 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +160 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +45 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +269 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -0
- package/package.json +56 -0
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createTokenCfg = void 0;
|
|
4
|
+
exports.createToken = createToken;
|
|
5
|
+
const phantasma_sdk_ts_1 = require("phantasma-sdk-ts");
|
|
6
|
+
const waitForTx_1 = require("./waitForTx");
|
|
7
|
+
const helpers_1 = require("./helpers");
|
|
8
|
+
class createTokenCfg {
|
|
9
|
+
rpc;
|
|
10
|
+
nexus;
|
|
11
|
+
wif;
|
|
12
|
+
symbol;
|
|
13
|
+
gasFeeBase;
|
|
14
|
+
gasFeeCreateTokenBase;
|
|
15
|
+
gasFeeCreateTokenSymbol;
|
|
16
|
+
gasFeeMultiplier;
|
|
17
|
+
createTokenMaxData;
|
|
18
|
+
tokenSchemas;
|
|
19
|
+
tokenMetadataFields;
|
|
20
|
+
tokenType;
|
|
21
|
+
tokenMaxSupply;
|
|
22
|
+
fungibleDecimals;
|
|
23
|
+
constructor(rpc, nexus, wif, symbol, gasFeeBase, gasFeeCreateTokenBase, gasFeeCreateTokenSymbol, gasFeeMultiplier, createTokenMaxData, tokenSchemas, tokenMetadataFields, tokenType, tokenMaxSupply, fungibleDecimals) {
|
|
24
|
+
this.rpc = rpc;
|
|
25
|
+
this.nexus = nexus;
|
|
26
|
+
this.wif = wif;
|
|
27
|
+
this.symbol = symbol;
|
|
28
|
+
this.gasFeeBase = gasFeeBase;
|
|
29
|
+
this.gasFeeCreateTokenBase = gasFeeCreateTokenBase;
|
|
30
|
+
this.gasFeeCreateTokenSymbol = gasFeeCreateTokenSymbol;
|
|
31
|
+
this.gasFeeMultiplier = gasFeeMultiplier;
|
|
32
|
+
this.createTokenMaxData = createTokenMaxData;
|
|
33
|
+
this.tokenSchemas = tokenSchemas;
|
|
34
|
+
this.tokenMetadataFields = tokenMetadataFields;
|
|
35
|
+
this.tokenType = tokenType;
|
|
36
|
+
this.tokenMaxSupply = tokenMaxSupply;
|
|
37
|
+
this.fungibleDecimals = fungibleDecimals;
|
|
38
|
+
this.rpc = rpc;
|
|
39
|
+
this.nexus = nexus;
|
|
40
|
+
this.wif = wif;
|
|
41
|
+
this.symbol = symbol;
|
|
42
|
+
this.gasFeeBase = gasFeeBase;
|
|
43
|
+
this.gasFeeCreateTokenBase = gasFeeCreateTokenBase;
|
|
44
|
+
this.gasFeeCreateTokenSymbol = gasFeeCreateTokenSymbol;
|
|
45
|
+
this.gasFeeMultiplier = gasFeeMultiplier;
|
|
46
|
+
this.createTokenMaxData = createTokenMaxData;
|
|
47
|
+
this.tokenSchemas = tokenSchemas;
|
|
48
|
+
this.tokenMetadataFields = tokenMetadataFields;
|
|
49
|
+
this.tokenType = tokenType;
|
|
50
|
+
this.tokenMaxSupply = tokenMaxSupply;
|
|
51
|
+
this.fungibleDecimals = fungibleDecimals;
|
|
52
|
+
}
|
|
53
|
+
toPrintable() {
|
|
54
|
+
// Do not leak WIF; derive owner
|
|
55
|
+
const { wif: _omit, ...rest } = this; // rest has all public fields except wif
|
|
56
|
+
const owner = phantasma_sdk_ts_1.PhantasmaKeys.fromWIF(this.wif).Address.toString();
|
|
57
|
+
return {
|
|
58
|
+
...rest,
|
|
59
|
+
owner,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
exports.createTokenCfg = createTokenCfg;
|
|
64
|
+
async function createToken(cfg, dryRun) {
|
|
65
|
+
const txSender = phantasma_sdk_ts_1.PhantasmaKeys.fromWIF(cfg.wif);
|
|
66
|
+
const senderPubKey = new phantasma_sdk_ts_1.Bytes32(txSender.PublicKey);
|
|
67
|
+
console.log("Deploying new token using these settings:", JSON.stringify(cfg.toPrintable(), helpers_1.bigintReplacer, 2));
|
|
68
|
+
if (cfg.tokenMetadataFields == null) {
|
|
69
|
+
throw Error('Token metadata is mandatory');
|
|
70
|
+
}
|
|
71
|
+
const tokenType = cfg.tokenType === "fungible" ? "fungible" : "nft";
|
|
72
|
+
const isFungible = tokenType === "fungible";
|
|
73
|
+
let maxSupply;
|
|
74
|
+
let decimals = 0;
|
|
75
|
+
if (isFungible) {
|
|
76
|
+
if (cfg.tokenMaxSupply == null) {
|
|
77
|
+
throw Error("token_max_supply is required for fungible tokens");
|
|
78
|
+
}
|
|
79
|
+
if (cfg.fungibleDecimals == null) {
|
|
80
|
+
throw Error("fungible_decimals is required for fungible tokens");
|
|
81
|
+
}
|
|
82
|
+
if (!Number.isInteger(cfg.fungibleDecimals) || cfg.fungibleDecimals < 0) {
|
|
83
|
+
throw Error("fungible_decimals must be a non-negative integer");
|
|
84
|
+
}
|
|
85
|
+
if (cfg.fungibleDecimals > 255) {
|
|
86
|
+
throw Error("fungible_decimals must be <= 255");
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
const maxSupplyValue = cfg.tokenMaxSupply != null ? cfg.tokenMaxSupply : 0n;
|
|
90
|
+
if (maxSupplyValue < 0n) {
|
|
91
|
+
throw Error("token_max_supply must be non-negative");
|
|
92
|
+
}
|
|
93
|
+
if (isFungible) {
|
|
94
|
+
decimals = cfg.fungibleDecimals;
|
|
95
|
+
maxSupply = phantasma_sdk_ts_1.IntX.fromBigInt(maxSupplyValue);
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
maxSupply =
|
|
99
|
+
maxSupplyValue === 0n
|
|
100
|
+
? phantasma_sdk_ts_1.IntX.fromI64(0n)
|
|
101
|
+
: phantasma_sdk_ts_1.IntX.fromBigInt(maxSupplyValue);
|
|
102
|
+
}
|
|
103
|
+
const info = phantasma_sdk_ts_1.TokenInfoBuilder.build(cfg.symbol, maxSupply, !isFungible, decimals, senderPubKey, phantasma_sdk_ts_1.TokenMetadataBuilder.buildAndSerialize(cfg.tokenMetadataFields.fields), cfg.tokenSchemas);
|
|
104
|
+
const feeOptions = new phantasma_sdk_ts_1.CreateTokenFeeOptions(cfg.gasFeeBase, cfg.gasFeeCreateTokenBase, cfg.gasFeeCreateTokenSymbol, cfg.gasFeeMultiplier);
|
|
105
|
+
const tx = phantasma_sdk_ts_1.CreateTokenTxHelper.buildTxAndSignHex(info, txSender, feeOptions, cfg.createTokenMaxData);
|
|
106
|
+
if (dryRun) {
|
|
107
|
+
console.log(`[dry-run] Prepared tx (not sent): ${tx}`);
|
|
108
|
+
console.log(phantasma_sdk_ts_1.CarbonBlob.NewFromBytes(phantasma_sdk_ts_1.SignedTxMsg, (0, phantasma_sdk_ts_1.hexToBytes)(tx), 0));
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
console.log("Broadcasting transaction...");
|
|
112
|
+
const rpc = new phantasma_sdk_ts_1.PhantasmaAPI(cfg.rpc, null, cfg.nexus);
|
|
113
|
+
let txHash = await rpc.sendCarbonTransaction(tx);
|
|
114
|
+
console.log("txHash: ", txHash);
|
|
115
|
+
const { success, result } = await (0, waitForTx_1.waitForTx)(rpc, txHash);
|
|
116
|
+
if (success) {
|
|
117
|
+
var tokenId = phantasma_sdk_ts_1.CreateTokenTxHelper.parseResult(result);
|
|
118
|
+
console.log("Deployed carbon token ID:", tokenId);
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
console.log("Could not deploy token");
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=createToken.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createToken.js","sourceRoot":"","sources":["../../src/actions/createToken.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Bytes32,\n CarbonBlob,\n CreateTokenFeeOptions,\n CreateTokenTxHelper,\n hexToBytes,\n IntX,\n SignedTxMsg,\n PhantasmaAPI,\n PhantasmaKeys,\n TokenInfoBuilder,\n TokenMetadataBuilder,\n TokenSchemas,\n} from \"phantasma-sdk-ts\";\nimport { TokenType } from \"../config\";\nimport { waitForTx } from \"./waitForTx\";\nimport { bigintReplacer, Metadata } from \"./helpers\";\n\nexport class createTokenCfg {\n constructor(\n public rpc: string,\n public nexus: string,\n public wif: string,\n public symbol: string,\n public gasFeeBase: bigint,\n public gasFeeCreateTokenBase: bigint,\n public gasFeeCreateTokenSymbol: bigint,\n public gasFeeMultiplier: bigint,\n public createTokenMaxData: bigint,\n public tokenSchemas: TokenSchemas | null | undefined,\n public tokenMetadataFields: Metadata,\n public tokenType: TokenType,\n public tokenMaxSupply: bigint | null | undefined,\n public fungibleDecimals: number | null | undefined,\n ) {\n this.rpc = rpc;\n this.nexus = nexus;\n this.wif = wif;\n this.symbol = symbol;\n this.gasFeeBase = gasFeeBase;\n this.gasFeeCreateTokenBase = gasFeeCreateTokenBase;\n this.gasFeeCreateTokenSymbol = gasFeeCreateTokenSymbol;\n this.gasFeeMultiplier = gasFeeMultiplier;\n this.createTokenMaxData = createTokenMaxData;\n this.tokenSchemas = tokenSchemas;\n this.tokenMetadataFields = tokenMetadataFields;\n this.tokenType = tokenType;\n this.tokenMaxSupply = tokenMaxSupply;\n this.fungibleDecimals = fungibleDecimals;\n }\n\n toPrintable() {\n // Do not leak WIF; derive owner\n const { wif: _omit, ...rest } = this; // rest has all public fields except wif\n const owner = PhantasmaKeys.fromWIF(this.wif).Address.toString();\n\n return {\n ...rest,\n owner,\n };\n }\n}\n\nexport async function createToken(cfg: createTokenCfg, dryRun: boolean) {\n const txSender = PhantasmaKeys.fromWIF(cfg.wif);\n const senderPubKey = new Bytes32(txSender.PublicKey);\n\n console.log(\n \"Deploying new token using these settings:\",\n JSON.stringify(cfg.toPrintable(), bigintReplacer, 2),\n );\n\n if (cfg.tokenMetadataFields == null) {\n throw Error('Token metadata is mandatory');\n }\n\n const tokenType = cfg.tokenType === \"fungible\" ? \"fungible\" : \"nft\";\n const isFungible = tokenType === \"fungible\";\n\n let maxSupply: IntX;\n let decimals = 0;\n\n if (isFungible) {\n if (cfg.tokenMaxSupply == null) {\n throw Error(\"token_max_supply is required for fungible tokens\");\n }\n if (cfg.fungibleDecimals == null) {\n throw Error(\"fungible_decimals is required for fungible tokens\");\n }\n if (!Number.isInteger(cfg.fungibleDecimals) || cfg.fungibleDecimals < 0) {\n throw Error(\"fungible_decimals must be a non-negative integer\");\n }\n if (cfg.fungibleDecimals > 255) {\n throw Error(\"fungible_decimals must be <= 255\");\n }\n }\n\n const maxSupplyValue =\n cfg.tokenMaxSupply != null ? cfg.tokenMaxSupply : 0n;\n if (maxSupplyValue < 0n) {\n throw Error(\"token_max_supply must be non-negative\");\n }\n if (isFungible) {\n decimals = cfg.fungibleDecimals!;\n maxSupply = IntX.fromBigInt(maxSupplyValue);\n } else {\n maxSupply =\n maxSupplyValue === 0n\n ? IntX.fromI64(0n)\n : IntX.fromBigInt(maxSupplyValue);\n }\n\n const info = TokenInfoBuilder.build(\n cfg.symbol,\n maxSupply,\n !isFungible,\n decimals,\n senderPubKey,\n TokenMetadataBuilder.buildAndSerialize(cfg.tokenMetadataFields.fields),\n cfg.tokenSchemas\n );\n\n const feeOptions = new CreateTokenFeeOptions(\n cfg.gasFeeBase,\n cfg.gasFeeCreateTokenBase,\n cfg.gasFeeCreateTokenSymbol,\n cfg.gasFeeMultiplier,\n );\n\n const tx = CreateTokenTxHelper.buildTxAndSignHex(\n info,\n txSender,\n feeOptions,\n cfg.createTokenMaxData,\n );\n\n if (dryRun) {\n console.log(`[dry-run] Prepared tx (not sent): ${tx}`);\n console.log(CarbonBlob.NewFromBytes(SignedTxMsg, hexToBytes(tx), 0));\n return;\n }\n\n console.log(\"Broadcasting transaction...\");\n\n const rpc = new PhantasmaAPI(cfg.rpc, null, cfg.nexus);\n\n let txHash = await rpc.sendCarbonTransaction(tx);\n console.log(\"txHash: \", txHash);\n\n const { success, result } = await waitForTx(rpc, txHash);\n\n if (success) {\n var tokenId = CreateTokenTxHelper.parseResult(result);\n console.log(\"Deployed carbon token ID:\", tokenId);\n } else {\n console.log(\"Could not deploy token\");\n }\n}\n"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare const bigintReplacer: (_: string, v: unknown) => unknown;
|
|
2
|
+
export type MetadataFields = Record<string, unknown>;
|
|
3
|
+
export declare class Metadata {
|
|
4
|
+
fields?: MetadataFields | undefined;
|
|
5
|
+
jsonName: string;
|
|
6
|
+
constructor(fields: MetadataFields | undefined, jsonName: string);
|
|
7
|
+
pickString(mandatory: boolean, key: string): string | undefined;
|
|
8
|
+
pickHexAndDecode(mandatory: boolean, key: string): Uint8Array | undefined;
|
|
9
|
+
pickNumber(mandatory: boolean, key: string): number | undefined;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/actions/helpers.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,cAAc,GAAI,GAAG,MAAM,EAAE,GAAG,OAAO,YACV,CAAC;AAE3C,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAErD,qBAAa,QAAQ;IACnB,MAAM,CAAC,EAAE,cAAc,GAAG,SAAS,CAAC;IACpC,QAAQ,EAAE,MAAM,CAAC;gBAEL,MAAM,EAAE,cAAc,GAAG,SAAS,EAAE,QAAQ,EAAE,MAAM;IAKhE,UAAU,CACR,SAAS,EAAE,OAAO,EAClB,GAAG,EAAE,MAAM,GACV,MAAM,GAAG,SAAS;IAoBrB,gBAAgB,CACd,SAAS,EAAE,OAAO,EAClB,GAAG,EAAE,MAAM,GACV,UAAU,GAAG,SAAS;IASzB,UAAU,CACR,SAAS,EAAE,OAAO,EAClB,GAAG,EAAE,MAAM,GACV,MAAM,GAAG,SAAS;CAwCtB"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Metadata = exports.bigintReplacer = void 0;
|
|
4
|
+
const phantasma_sdk_ts_1 = require("phantasma-sdk-ts");
|
|
5
|
+
// Helper: stringify BigInt as string
|
|
6
|
+
const bigintReplacer = (_, v) => typeof v === "bigint" ? v.toString() : v;
|
|
7
|
+
exports.bigintReplacer = bigintReplacer;
|
|
8
|
+
class Metadata {
|
|
9
|
+
fields;
|
|
10
|
+
jsonName;
|
|
11
|
+
constructor(fields, jsonName) {
|
|
12
|
+
this.fields = fields;
|
|
13
|
+
this.jsonName = jsonName;
|
|
14
|
+
}
|
|
15
|
+
pickString(mandatory, key) {
|
|
16
|
+
if (!this.fields) {
|
|
17
|
+
return undefined;
|
|
18
|
+
}
|
|
19
|
+
const value = this.fields[key];
|
|
20
|
+
if (!value) {
|
|
21
|
+
return undefined;
|
|
22
|
+
}
|
|
23
|
+
if (typeof value === "string") {
|
|
24
|
+
const trimmed = value.trim();
|
|
25
|
+
if (trimmed.length === 0 && mandatory) {
|
|
26
|
+
throw new Error(`${this.jsonName}.${key} cannot be empty`);
|
|
27
|
+
}
|
|
28
|
+
return trimmed;
|
|
29
|
+
}
|
|
30
|
+
throw new Error(`${this.jsonName}.${key} must be a string`);
|
|
31
|
+
}
|
|
32
|
+
pickHexAndDecode(mandatory, key) {
|
|
33
|
+
const s = this.pickString(mandatory, key);
|
|
34
|
+
if (!s) {
|
|
35
|
+
return undefined;
|
|
36
|
+
}
|
|
37
|
+
return (0, phantasma_sdk_ts_1.hexToBytes)(s);
|
|
38
|
+
}
|
|
39
|
+
pickNumber(mandatory, key) {
|
|
40
|
+
if (!this.fields) {
|
|
41
|
+
return undefined;
|
|
42
|
+
}
|
|
43
|
+
let value = this.fields[key];
|
|
44
|
+
if (value == null) {
|
|
45
|
+
if (mandatory) {
|
|
46
|
+
throw new Error(`${this.jsonName}.${key} is required`);
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
return undefined;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
if (typeof value === "string") {
|
|
53
|
+
const trimmed = value.trim();
|
|
54
|
+
if (trimmed.length === 0) {
|
|
55
|
+
throw new Error(`${this.jsonName}.${key} cannot be empty`);
|
|
56
|
+
}
|
|
57
|
+
value = Number(trimmed);
|
|
58
|
+
}
|
|
59
|
+
else if (typeof value === "bigint") {
|
|
60
|
+
value = Number(value);
|
|
61
|
+
}
|
|
62
|
+
else if (typeof value !== "number") {
|
|
63
|
+
throw new Error(`${this.jsonName}.${key} must be a number or numeric string`);
|
|
64
|
+
}
|
|
65
|
+
if (typeof value !== "number") {
|
|
66
|
+
throw new Error(`${this.jsonName}.${key} should be convertable to number`);
|
|
67
|
+
}
|
|
68
|
+
if (!Number.isFinite(value) || !Number.isInteger(value)) {
|
|
69
|
+
throw new Error(`${this.jsonName}.${key} must be an integer`);
|
|
70
|
+
}
|
|
71
|
+
if (value < 0) {
|
|
72
|
+
throw new Error(`${this.jsonName}.${key} must be non-negative`);
|
|
73
|
+
}
|
|
74
|
+
return value;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
exports.Metadata = Metadata;
|
|
78
|
+
//# sourceMappingURL=helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/actions/helpers.ts"],"names":[],"mappings":"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","sourcesContent":["import { hexToBytes } from \"phantasma-sdk-ts\";\n\n// Helper: stringify BigInt as string\nexport const bigintReplacer = (_: string, v: unknown) =>\n typeof v === \"bigint\" ? v.toString() : v;\n\nexport type MetadataFields = Record<string, unknown>;\n\nexport class Metadata {\n fields?: MetadataFields | undefined;\n jsonName: string;\n\n constructor(fields: MetadataFields | undefined, jsonName: string ) {\n this.fields = fields\n this.jsonName = jsonName\n }\n\n pickString(\n mandatory: boolean,\n key: string\n ): string | undefined {\n if (!this.fields) {\n return undefined;\n }\n\n const value = this.fields[key];\n if (!value) {\n return undefined;\n }\n\n if (typeof value === \"string\") {\n const trimmed = value.trim();\n if (trimmed.length === 0 && mandatory) {\n throw new Error(`${this.jsonName}.${key} cannot be empty`);\n }\n return trimmed;\n }\n throw new Error(`${this.jsonName}.${key} must be a string`);\n }\n\n pickHexAndDecode(\n mandatory: boolean,\n key: string\n ): Uint8Array | undefined {\n const s = this.pickString(mandatory, key);\n if(!s){\n return undefined;\n }\n\n return hexToBytes(s);\n }\n\n pickNumber(\n mandatory: boolean,\n key: string\n ): number | undefined {\n if (!this.fields) {\n return undefined;\n }\n\n let value = this.fields[key];\n\n if (value == null) {\n if (mandatory) {\n throw new Error(`${this.jsonName}.${key} is required`);\n } else {\n return undefined;\n }\n }\n\n if (typeof value === \"string\") {\n const trimmed = (value as string).trim();\n if (trimmed.length === 0) {\n throw new Error(`${this.jsonName}.${key} cannot be empty`);\n }\n value = Number(trimmed);\n } else if (typeof value === \"bigint\") {\n value = Number(value);\n } else if(typeof value !== \"number\"){\n throw new Error(`${this.jsonName}.${key} must be a number or numeric string`);\n }\n\n if (typeof value !== \"number\") {\n throw new Error(`${this.jsonName}.${key} should be convertable to number`);\n }\n\n if (!Number.isFinite(value) || !Number.isInteger(value)) {\n throw new Error(`${this.jsonName}.${key} must be an integer`);\n }\n if (value < 0) {\n throw new Error(`${this.jsonName}.${key} must be non-negative`);\n }\n\n return value;\n }\n}\n"]}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { VmStructSchema, MetadataField } from "phantasma-sdk-ts";
|
|
2
|
+
export declare class mintNftTokenCfg {
|
|
3
|
+
rpc: string;
|
|
4
|
+
nexus: string;
|
|
5
|
+
wif: string;
|
|
6
|
+
carbonTokenId: bigint;
|
|
7
|
+
carbonSeriesId: number;
|
|
8
|
+
nftRomSchema: VmStructSchema;
|
|
9
|
+
nftMetadata: MetadataField[];
|
|
10
|
+
gasFeeBase: bigint;
|
|
11
|
+
gasFeeMultiplier: bigint;
|
|
12
|
+
mintTokenMaxData: bigint;
|
|
13
|
+
constructor(rpc: string, nexus: string, wif: string, carbonTokenId: bigint, carbonSeriesId: number, nftRomSchema: VmStructSchema, nftMetadata: MetadataField[], gasFeeBase: bigint, gasFeeMultiplier: bigint, mintTokenMaxData: bigint);
|
|
14
|
+
toPrintable(): Omit<this, "wif" | "toPrintable" | "nftMetadata"> & {
|
|
15
|
+
owner: string;
|
|
16
|
+
nftMetadata: MetadataField[];
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
export declare function mintNftToken(cfg: mintNftTokenCfg, dryRun: boolean): Promise<void>;
|
|
20
|
+
//# sourceMappingURL=mintNftToken.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mintNftToken.d.ts","sourceRoot":"","sources":["../../src/actions/mintNftToken.ts"],"names":[],"mappings":"AAAA,OAAO,EAWL,cAAc,EACd,aAAa,EACd,MAAM,kBAAkB,CAAC;AAI1B,qBAAa,eAAe;IAEjB,GAAG,EAAE,MAAM;IACX,KAAK,EAAE,MAAM;IACb,GAAG,EAAE,MAAM;IACX,aAAa,EAAE,MAAM;IACrB,cAAc,EAAE,MAAM;IACtB,YAAY,EAAE,cAAc;IAC5B,WAAW,EAAE,aAAa,EAAE;IAC5B,UAAU,EAAE,MAAM;IAClB,gBAAgB,EAAE,MAAM;IACxB,gBAAgB,EAAE,MAAM;gBATxB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,EACX,aAAa,EAAE,MAAM,EACrB,cAAc,EAAE,MAAM,EACtB,YAAY,EAAE,cAAc,EAC5B,WAAW,EAAE,aAAa,EAAE,EAC5B,UAAU,EAAE,MAAM,EAClB,gBAAgB,EAAE,MAAM,EACxB,gBAAgB,EAAE,MAAM;IAcjC,WAAW;;;;CAYZ;AAED,wBAAsB,YAAY,CAAC,GAAG,EAAE,eAAe,EAAE,MAAM,EAAE,OAAO,iBA2DvE"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.mintNftTokenCfg = void 0;
|
|
4
|
+
exports.mintNftToken = mintNftToken;
|
|
5
|
+
const phantasma_sdk_ts_1 = require("phantasma-sdk-ts");
|
|
6
|
+
const waitForTx_1 = require("./waitForTx");
|
|
7
|
+
const helpers_1 = require("./helpers");
|
|
8
|
+
class mintNftTokenCfg {
|
|
9
|
+
rpc;
|
|
10
|
+
nexus;
|
|
11
|
+
wif;
|
|
12
|
+
carbonTokenId;
|
|
13
|
+
carbonSeriesId;
|
|
14
|
+
nftRomSchema;
|
|
15
|
+
nftMetadata;
|
|
16
|
+
gasFeeBase;
|
|
17
|
+
gasFeeMultiplier;
|
|
18
|
+
mintTokenMaxData;
|
|
19
|
+
constructor(rpc, nexus, wif, carbonTokenId, carbonSeriesId, nftRomSchema, nftMetadata, gasFeeBase, gasFeeMultiplier, mintTokenMaxData) {
|
|
20
|
+
this.rpc = rpc;
|
|
21
|
+
this.nexus = nexus;
|
|
22
|
+
this.wif = wif;
|
|
23
|
+
this.carbonTokenId = carbonTokenId;
|
|
24
|
+
this.carbonSeriesId = carbonSeriesId;
|
|
25
|
+
this.nftRomSchema = nftRomSchema;
|
|
26
|
+
this.nftMetadata = nftMetadata;
|
|
27
|
+
this.gasFeeBase = gasFeeBase;
|
|
28
|
+
this.gasFeeMultiplier = gasFeeMultiplier;
|
|
29
|
+
this.mintTokenMaxData = mintTokenMaxData;
|
|
30
|
+
this.rpc = rpc;
|
|
31
|
+
this.nexus = nexus;
|
|
32
|
+
this.wif = wif;
|
|
33
|
+
this.carbonTokenId = carbonTokenId;
|
|
34
|
+
this.carbonSeriesId = carbonSeriesId;
|
|
35
|
+
this.nftRomSchema = nftRomSchema;
|
|
36
|
+
this.nftMetadata = nftMetadata;
|
|
37
|
+
this.gasFeeBase = gasFeeBase;
|
|
38
|
+
this.gasFeeMultiplier = gasFeeMultiplier;
|
|
39
|
+
this.mintTokenMaxData = mintTokenMaxData;
|
|
40
|
+
}
|
|
41
|
+
toPrintable() {
|
|
42
|
+
// Do not leak WIF; derive owner
|
|
43
|
+
const { wif: _omit, nftMetadata, ...rest } = this; // rest has all public fields except wif/metadata strings
|
|
44
|
+
const owner = phantasma_sdk_ts_1.PhantasmaKeys.fromWIF(this.wif).Address.toString();
|
|
45
|
+
return {
|
|
46
|
+
...rest,
|
|
47
|
+
owner,
|
|
48
|
+
nftMetadata
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
exports.mintNftTokenCfg = mintNftTokenCfg;
|
|
53
|
+
async function mintNftToken(cfg, dryRun) {
|
|
54
|
+
const txSender = phantasma_sdk_ts_1.PhantasmaKeys.fromWIF(cfg.wif);
|
|
55
|
+
const senderPubKey = new phantasma_sdk_ts_1.Bytes32(txSender.PublicKey);
|
|
56
|
+
const newPhantasmaNftId = await (0, phantasma_sdk_ts_1.getRandomPhantasmaId)();
|
|
57
|
+
console.log(`Minting new token '${newPhantasmaNftId}' using these settings:`, JSON.stringify(cfg.toPrintable(), helpers_1.bigintReplacer, 2));
|
|
58
|
+
const rom = phantasma_sdk_ts_1.NftRomBuilder.buildAndSerialize(cfg.nftRomSchema, newPhantasmaNftId, cfg.nftMetadata);
|
|
59
|
+
const feeOptions = new phantasma_sdk_ts_1.MintNftFeeOptions(cfg.gasFeeBase, cfg.gasFeeMultiplier);
|
|
60
|
+
const tx = phantasma_sdk_ts_1.MintNonFungibleTxHelper.buildTxAndSignHex(cfg.carbonTokenId, cfg.carbonSeriesId, txSender, senderPubKey, rom, new Uint8Array(), feeOptions, cfg.mintTokenMaxData);
|
|
61
|
+
if (dryRun) {
|
|
62
|
+
console.log(`[dry-run] Prepared tx (not sent): ${tx}`);
|
|
63
|
+
console.log(phantasma_sdk_ts_1.CarbonBlob.NewFromBytes(phantasma_sdk_ts_1.SignedTxMsg, (0, phantasma_sdk_ts_1.hexToBytes)(tx), 0));
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
console.log("Broadcasting transaction...");
|
|
67
|
+
const rpc = new phantasma_sdk_ts_1.PhantasmaAPI(cfg.rpc, null, cfg.nexus);
|
|
68
|
+
let txHash = await rpc.sendCarbonTransaction(tx);
|
|
69
|
+
console.log("txHash: ", txHash);
|
|
70
|
+
const { success, result } = await (0, waitForTx_1.waitForTx)(rpc, txHash);
|
|
71
|
+
if (success) {
|
|
72
|
+
const carbonNftAddresses = phantasma_sdk_ts_1.MintNonFungibleTxHelper.parseResult(cfg.carbonTokenId, result);
|
|
73
|
+
console.log(`Deployed NFT with phantasma ID ${newPhantasmaNftId} and carbon NFT address ${carbonNftAddresses[0]}`);
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
console.log("Could not mint NFT");
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=mintNftToken.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mintNftToken.js","sourceRoot":"","sources":["../../src/actions/mintNftToken.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Bytes32,\n CarbonBlob,\n hexToBytes,\n getRandomPhantasmaId,\n MintNftFeeOptions,\n MintNonFungibleTxHelper,\n NftRomBuilder,\n PhantasmaAPI,\n PhantasmaKeys,\n SignedTxMsg,\n VmStructSchema,\n MetadataField,\n} from \"phantasma-sdk-ts\";\nimport { waitForTx } from \"./waitForTx\";\nimport { bigintReplacer } from \"./helpers\";\n\nexport class mintNftTokenCfg {\n constructor(\n public rpc: string,\n public nexus: string,\n public wif: string,\n public carbonTokenId: bigint,\n public carbonSeriesId: number,\n public nftRomSchema: VmStructSchema,\n public nftMetadata: MetadataField[],\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.carbonSeriesId = carbonSeriesId;\n this.nftRomSchema = nftRomSchema;\n this.nftMetadata = nftMetadata;\n this.gasFeeBase = gasFeeBase;\n this.gasFeeMultiplier = gasFeeMultiplier;\n this.mintTokenMaxData = mintTokenMaxData;\n }\n\n toPrintable() {\n // Do not leak WIF; derive owner\n const { wif: _omit, nftMetadata, ...rest } =\n this; // rest has all public fields except wif/metadata strings\n const owner = PhantasmaKeys.fromWIF(this.wif).Address.toString();\n\n return {\n ...rest,\n owner,\n nftMetadata\n };\n }\n}\n\nexport async function mintNftToken(cfg: mintNftTokenCfg, dryRun: boolean) {\n const txSender = PhantasmaKeys.fromWIF(cfg.wif);\n const senderPubKey = new Bytes32(txSender.PublicKey);\n\n const newPhantasmaNftId = await getRandomPhantasmaId();\n\n console.log(\n `Minting new token '${newPhantasmaNftId}' using these settings:`,\n JSON.stringify(cfg.toPrintable(), bigintReplacer, 2),\n );\n\n const rom = NftRomBuilder.buildAndSerialize(\n cfg.nftRomSchema,\n newPhantasmaNftId,\n cfg.nftMetadata\n );\n\n const feeOptions = new MintNftFeeOptions(\n cfg.gasFeeBase,\n cfg.gasFeeMultiplier,\n );\n\n const tx = MintNonFungibleTxHelper.buildTxAndSignHex(\n cfg.carbonTokenId,\n cfg.carbonSeriesId,\n txSender,\n senderPubKey,\n rom,\n new Uint8Array(),\n feeOptions,\n cfg.mintTokenMaxData,\n );\n\n if (dryRun) {\n console.log(`[dry-run] Prepared tx (not sent): ${tx}`);\n console.log(CarbonBlob.NewFromBytes(SignedTxMsg, hexToBytes(tx), 0));\n return;\n }\n\n console.log(\"Broadcasting transaction...\");\n\n const rpc = new PhantasmaAPI(cfg.rpc, null, cfg.nexus);\n\n let txHash = await rpc.sendCarbonTransaction(tx);\n console.log(\"txHash: \", txHash);\n\n const { success, result } = await waitForTx(rpc, txHash);\n\n if (success) {\n const carbonNftAddresses = MintNonFungibleTxHelper.parseResult(\n cfg.carbonTokenId,\n result,\n );\n console.log(\n `Deployed NFT with phantasma ID ${newPhantasmaNftId} and carbon NFT address ${carbonNftAddresses[0]}`,\n );\n } else {\n console.log(\"Could not mint NFT\");\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"waitForTx.d.ts","sourceRoot":"","sources":["../../src/actions/waitForTx.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,YAAY,EAEb,MAAM,kBAAkB,CAAC;AAE1B,wBAAsB,SAAS,CAC7B,GAAG,EAAE,YAAY,EACjB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC;IACT,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC,CA6DD"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.waitForTx = waitForTx;
|
|
4
|
+
const phantasma_sdk_ts_1 = require("phantasma-sdk-ts");
|
|
5
|
+
async function waitForTx(rpc, txHash) {
|
|
6
|
+
const start = Date.now();
|
|
7
|
+
const timeoutMs = 30_000; // 30 seconds total
|
|
8
|
+
const intervalMs = 2_000; // poll every 2 seconds
|
|
9
|
+
let verified = false;
|
|
10
|
+
const runningName = phantasma_sdk_ts_1.ExecutionState[phantasma_sdk_ts_1.ExecutionState.Running];
|
|
11
|
+
const breakName = phantasma_sdk_ts_1.ExecutionState[phantasma_sdk_ts_1.ExecutionState.Break];
|
|
12
|
+
const faultName = phantasma_sdk_ts_1.ExecutionState[phantasma_sdk_ts_1.ExecutionState.Fault];
|
|
13
|
+
const haltName = phantasma_sdk_ts_1.ExecutionState[phantasma_sdk_ts_1.ExecutionState.Halt];
|
|
14
|
+
console.log("Waiting up to 30s for transaction execution state...");
|
|
15
|
+
while (Date.now() - start < timeoutMs) {
|
|
16
|
+
try {
|
|
17
|
+
const txInfo = await rpc.getTransaction(txHash);
|
|
18
|
+
// Print only the state field for clarity
|
|
19
|
+
console.log("getTransaction response: state:", txInfo.state);
|
|
20
|
+
// txInfo.state is provided by the SDK as a string name (e.g. "Running","Halt", etc.)
|
|
21
|
+
const stateStr = txInfo.state;
|
|
22
|
+
if (stateStr === runningName) {
|
|
23
|
+
// still running -> continue polling
|
|
24
|
+
}
|
|
25
|
+
else if (stateStr === breakName || stateStr === faultName) {
|
|
26
|
+
// Break or Fault -> failure
|
|
27
|
+
console.log(`Transaction failed: ${stateStr} result: '${txInfo.result}' debugComment: '${txInfo.debugComment}'`);
|
|
28
|
+
verified = true;
|
|
29
|
+
break;
|
|
30
|
+
}
|
|
31
|
+
else if (stateStr === haltName) {
|
|
32
|
+
// Halt -> success
|
|
33
|
+
console.log("Transaction succeeded");
|
|
34
|
+
return { success: true, result: txInfo.result };
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
// Unknown state name -> log and continue polling
|
|
38
|
+
console.log("Unknown ExecutionState value:", stateStr);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
catch (err) {
|
|
42
|
+
// Transient RPC errors are logged and retried until timeout
|
|
43
|
+
const e = err;
|
|
44
|
+
console.log("Error while checking transaction status (will retry):", e && e.message ? e.message : String(err));
|
|
45
|
+
}
|
|
46
|
+
// wait before next poll
|
|
47
|
+
await new Promise((r) => setTimeout(r, intervalMs));
|
|
48
|
+
}
|
|
49
|
+
if (!verified) {
|
|
50
|
+
console.log("Unable to verify transaction execution state within 30 seconds. Please check manually. txHash:", txHash);
|
|
51
|
+
}
|
|
52
|
+
return { success: false, result: "" };
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=waitForTx.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"waitForTx.js","sourceRoot":"","sources":["../../src/actions/waitForTx.ts"],"names":[],"mappings":";;AAMA,8BAmEC;AAzED,uDAI0B;AAEnB,KAAK,UAAU,SAAS,CAC7B,GAAiB,EACjB,MAAc;IAKd,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACzB,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,mBAAmB;IAC7C,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,uBAAuB;IACjD,IAAI,QAAQ,GAAG,KAAK,CAAC;IAErB,MAAM,WAAW,GAAG,iCAAc,CAAC,iCAAc,CAAC,OAAO,CAAC,CAAC;IAC3D,MAAM,SAAS,GAAG,iCAAc,CAAC,iCAAc,CAAC,KAAK,CAAC,CAAC;IACvD,MAAM,SAAS,GAAG,iCAAc,CAAC,iCAAc,CAAC,KAAK,CAAC,CAAC;IACvD,MAAM,QAAQ,GAAG,iCAAc,CAAC,iCAAc,CAAC,IAAI,CAAC,CAAC;IAErD,OAAO,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC;IAEpE,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,SAAS,EAAE,CAAC;QACtC,IAAI,CAAC;YACH,MAAM,MAAM,GAAoB,MAAM,GAAG,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;YAEjE,yCAAyC;YACzC,OAAO,CAAC,GAAG,CAAC,iCAAiC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;YAE7D,qFAAqF;YACrF,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC;YAE9B,IAAI,QAAQ,KAAK,WAAW,EAAE,CAAC;gBAC7B,oCAAoC;YACtC,CAAC;iBAAM,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC5D,4BAA4B;gBAC5B,OAAO,CAAC,GAAG,CACT,uBAAuB,QAAQ,aAAa,MAAM,CAAC,MAAM,oBAAoB,MAAM,CAAC,YAAY,GAAG,CACpG,CAAC;gBACF,QAAQ,GAAG,IAAI,CAAC;gBAChB,MAAM;YACR,CAAC;iBAAM,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBACjC,kBAAkB;gBAClB,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;gBACrC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;YAClD,CAAC;iBAAM,CAAC;gBACN,iDAAiD;gBACjD,OAAO,CAAC,GAAG,CAAC,+BAA+B,EAAE,QAAQ,CAAC,CAAC;YACzD,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,4DAA4D;YAC5D,MAAM,CAAC,GAAG,GAAY,CAAC;YACvB,OAAO,CAAC,GAAG,CACT,uDAAuD,EACvD,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CACzC,CAAC;QACJ,CAAC;QAED,wBAAwB;QACxB,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC;IACtD,CAAC;IAED,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CACT,gGAAgG,EAChG,MAAM,CACP,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;AACxC,CAAC","sourcesContent":["import {\n ExecutionState,\n PhantasmaAPI,\n TransactionData,\n} from \"phantasma-sdk-ts\";\n\nexport async function waitForTx(\n rpc: PhantasmaAPI,\n txHash: string,\n): Promise<{\n success: boolean;\n result: string;\n}> {\n const start = Date.now();\n const timeoutMs = 30_000; // 30 seconds total\n const intervalMs = 2_000; // poll every 2 seconds\n let verified = false;\n\n const runningName = ExecutionState[ExecutionState.Running];\n const breakName = ExecutionState[ExecutionState.Break];\n const faultName = ExecutionState[ExecutionState.Fault];\n const haltName = ExecutionState[ExecutionState.Halt];\n\n console.log(\"Waiting up to 30s for transaction execution state...\");\n\n while (Date.now() - start < timeoutMs) {\n try {\n const txInfo: TransactionData = await rpc.getTransaction(txHash);\n\n // Print only the state field for clarity\n console.log(\"getTransaction response: state:\", txInfo.state);\n\n // txInfo.state is provided by the SDK as a string name (e.g. \"Running\",\"Halt\", etc.)\n const stateStr = txInfo.state;\n\n if (stateStr === runningName) {\n // still running -> continue polling\n } else if (stateStr === breakName || stateStr === faultName) {\n // Break or Fault -> failure\n console.log(\n `Transaction failed: ${stateStr} result: '${txInfo.result}' debugComment: '${txInfo.debugComment}'`,\n );\n verified = true;\n break;\n } else if (stateStr === haltName) {\n // Halt -> success\n console.log(\"Transaction succeeded\");\n return { success: true, result: txInfo.result };\n } else {\n // Unknown state name -> log and continue polling\n console.log(\"Unknown ExecutionState value:\", stateStr);\n }\n } catch (err) {\n // Transient RPC errors are logged and retried until timeout\n const e = err as Error;\n console.log(\n \"Error while checking transaction status (will retry):\",\n e && e.message ? e.message : String(err),\n );\n }\n\n // wait before next poll\n await new Promise((r) => setTimeout(r, intervalMs));\n }\n\n if (!verified) {\n console.log(\n \"Unable to verify transaction execution state within 30 seconds. Please check manually. txHash:\",\n txHash,\n );\n }\n\n return { success: false, result: \"\" };\n}\n"]}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAmIA,iBAAe,IAAI,kBAsFlB;AAcD,eAAe,IAAI,CAAC"}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
5
|
+
};
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
const helpers_1 = require("yargs/helpers");
|
|
8
|
+
const yargs_1 = __importDefault(require("yargs"));
|
|
9
|
+
const config_1 = __importDefault(require("./config"));
|
|
10
|
+
const createToken_1 = require("./actions/createToken");
|
|
11
|
+
const createSeries_1 = require("./actions/createSeries");
|
|
12
|
+
const mintNftToken_1 = require("./actions/mintNftToken");
|
|
13
|
+
/**
|
|
14
|
+
* CLI for pha-deploy.
|
|
15
|
+
*
|
|
16
|
+
* Modes:
|
|
17
|
+
* - CLI one-shot: use flags to perform actions immediately
|
|
18
|
+
* - TOML-driven: use `--config` or default `config.toml` for config values
|
|
19
|
+
*
|
|
20
|
+
* Actions:
|
|
21
|
+
* - create-token
|
|
22
|
+
* - create-series
|
|
23
|
+
* - mint-nft
|
|
24
|
+
*/
|
|
25
|
+
function requireArg(value, name) {
|
|
26
|
+
if (value === undefined || value === null) {
|
|
27
|
+
throw new Error(`${name} is required`);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/* ----------------------------- Actions ----------------------------- */
|
|
31
|
+
async function actionCreateToken(cfg, dryRun) {
|
|
32
|
+
requireArg(cfg.rpc, "rpc");
|
|
33
|
+
requireArg(cfg.nexus, "nexus");
|
|
34
|
+
requireArg(cfg.wif, "wif");
|
|
35
|
+
requireArg(cfg.symbol, "symbol");
|
|
36
|
+
requireArg(cfg.gasFeeBase, "gas_fee_base");
|
|
37
|
+
requireArg(cfg.gasFeeCreateTokenBase, "gas_fee_create_token_base");
|
|
38
|
+
requireArg(cfg.gasFeeCreateTokenSymbol, "gas_fee_create_token_symbol");
|
|
39
|
+
requireArg(cfg.gasFeeMultiplier, "gas_fee_multiplier");
|
|
40
|
+
requireArg(cfg.createTokenMaxData, "create_token_max_data");
|
|
41
|
+
const tokenType = (cfg.tokenType ?? "nft") === "fungible" ? "fungible" : "nft";
|
|
42
|
+
if (tokenType === "fungible") {
|
|
43
|
+
requireArg(cfg.tokenMaxSupply, "token_max_supply");
|
|
44
|
+
requireArg(cfg.fungibleDecimals, "fungible_decimals");
|
|
45
|
+
}
|
|
46
|
+
await (0, createToken_1.createToken)(new createToken_1.createTokenCfg(cfg.rpc, cfg.nexus, cfg.wif, cfg.symbol, cfg.gasFeeBase, cfg.gasFeeCreateTokenBase, cfg.gasFeeCreateTokenSymbol, cfg.gasFeeMultiplier, cfg.createTokenMaxData, cfg.tokenSchemas, cfg.tokenMetadata, tokenType, cfg.tokenMaxSupply, cfg.fungibleDecimals), dryRun);
|
|
47
|
+
}
|
|
48
|
+
async function actionCreateSeries(cfg, dryRun) {
|
|
49
|
+
requireArg(cfg.rpc, "rpc");
|
|
50
|
+
requireArg(cfg.nexus, "nexus");
|
|
51
|
+
requireArg(cfg.wif, "wif");
|
|
52
|
+
requireArg(cfg.carbonTokenId, "carbon_token_id");
|
|
53
|
+
requireArg(cfg.tokenSchemas, "token_schemas");
|
|
54
|
+
requireArg(cfg.seriesMetadata, "series_metadata");
|
|
55
|
+
requireArg(cfg.gasFeeBase, "gas_fee_base");
|
|
56
|
+
requireArg(cfg.gasFeeCreateTokenSeries, "gas_fee_create_token_series");
|
|
57
|
+
requireArg(cfg.gasFeeMultiplier, "gas_fee_multiplier");
|
|
58
|
+
requireArg(cfg.createTokenSeriesMaxData, "create_token_series_max_data");
|
|
59
|
+
await (0, createSeries_1.createSeries)(new createSeries_1.createSeriesCfg(cfg.rpc, cfg.nexus, cfg.wif, cfg.carbonTokenId, cfg.gasFeeBase, cfg.gasFeeCreateTokenSeries, cfg.gasFeeMultiplier, cfg.createTokenSeriesMaxData, cfg.tokenSchemas?.seriesMetadata, cfg.seriesMetadata), dryRun);
|
|
60
|
+
}
|
|
61
|
+
async function actionMintNft(cfg, dryRun) {
|
|
62
|
+
requireArg(cfg.rpc, "rpc");
|
|
63
|
+
requireArg(cfg.nexus, "nexus");
|
|
64
|
+
requireArg(cfg.wif, "wif");
|
|
65
|
+
requireArg(cfg.carbonTokenId, "carbon_token_id");
|
|
66
|
+
requireArg(cfg.carbonTokenSeriesId, "carbon_token_series_id");
|
|
67
|
+
requireArg(cfg.tokenSchemas, "token_schemas");
|
|
68
|
+
requireArg(cfg.nftMetadata, "nft_metadata");
|
|
69
|
+
requireArg(cfg.gasFeeBase, "gas_fee_base");
|
|
70
|
+
requireArg(cfg.gasFeeMultiplier, "gas_fee_multiplier");
|
|
71
|
+
requireArg(cfg.mintTokenMaxData, "mint_token_max_data");
|
|
72
|
+
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);
|
|
73
|
+
}
|
|
74
|
+
/* ------------------------------- Main ------------------------------- */
|
|
75
|
+
async function main() {
|
|
76
|
+
// Pre-parse --config early so the TOML file can be loaded before the main yargs parsing.
|
|
77
|
+
const pre = (0, yargs_1.default)((0, helpers_1.hideBin)(process.argv))
|
|
78
|
+
.option("config", {
|
|
79
|
+
type: "string",
|
|
80
|
+
alias: "c",
|
|
81
|
+
description: "Path to TOML config file (default: config.toml)",
|
|
82
|
+
})
|
|
83
|
+
.help(false)
|
|
84
|
+
.parseSync();
|
|
85
|
+
// Load TOML configuration (if present) before doing full parsing
|
|
86
|
+
const cfg = (0, config_1.default)({ configPath: pre.config ?? null });
|
|
87
|
+
// Minimal yargs parsing for the top-level CLI behavior
|
|
88
|
+
const argv = await (0, yargs_1.default)((0, helpers_1.hideBin)(process.argv))
|
|
89
|
+
.scriptName("pha-deploy")
|
|
90
|
+
.usage("Usage: $0 [options] [--create-token|--mint-nft|--transfer]")
|
|
91
|
+
.option("rpc", { type: "string", describe: "RPC endpoint" })
|
|
92
|
+
.option("nexus", { type: "string", describe: "Chain nexus" })
|
|
93
|
+
.option("wif", { type: "string", describe: "WIF for signing" })
|
|
94
|
+
.option("symbol", { type: "string", describe: "Token symbol" })
|
|
95
|
+
.option("token-type", {
|
|
96
|
+
type: "string",
|
|
97
|
+
choices: ["nft", "fungible"],
|
|
98
|
+
describe: "Token type to create (default: nft)",
|
|
99
|
+
})
|
|
100
|
+
.option("token-max-supply", {
|
|
101
|
+
type: "string",
|
|
102
|
+
describe: "Token max supply (optional for NFT; required when --token-type fungible)",
|
|
103
|
+
})
|
|
104
|
+
.option("fungible-decimals", {
|
|
105
|
+
type: "number",
|
|
106
|
+
describe: "Decimal places for fungible token (required when --token-type fungible)",
|
|
107
|
+
})
|
|
108
|
+
.option("dry-run", {
|
|
109
|
+
type: "boolean",
|
|
110
|
+
describe: "Do not broadcast transactions; just show payloads",
|
|
111
|
+
})
|
|
112
|
+
.option("config", {
|
|
113
|
+
type: "string",
|
|
114
|
+
describe: "Path to TOML config file (default: config.toml). Takes precedence as the file used for defaults.",
|
|
115
|
+
})
|
|
116
|
+
.option("create-token", { type: "boolean", describe: "Create a token" })
|
|
117
|
+
.option("create-series", {
|
|
118
|
+
type: "boolean",
|
|
119
|
+
describe: "Create a token series",
|
|
120
|
+
})
|
|
121
|
+
.option("mint-nft", { type: "boolean", describe: "Mint tokens" })
|
|
122
|
+
.help()
|
|
123
|
+
.alias("h", "help")
|
|
124
|
+
.epilog("pha-deploy - minimal template")
|
|
125
|
+
.parseAsync();
|
|
126
|
+
// Determine dry-run (CLI flag overrides config)
|
|
127
|
+
const dryRun = Boolean(argv["dry-run"]) || cfg.dryRun || false;
|
|
128
|
+
// One-shot actions: pick the first matching action
|
|
129
|
+
const actions = ["create-token", "create-series", "mint-nft"];
|
|
130
|
+
for (const action of actions) {
|
|
131
|
+
if (argv[action]) {
|
|
132
|
+
switch (action) {
|
|
133
|
+
case "create-token": {
|
|
134
|
+
await actionCreateToken(cfg, dryRun);
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
case "create-series": {
|
|
138
|
+
await actionCreateSeries(cfg, dryRun);
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
case "mint-nft": {
|
|
142
|
+
await actionMintNft(cfg, dryRun);
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
// No action requested -> show help
|
|
149
|
+
console.log("No action specified. Pass an action flag (e.g. --create-token or --mint-nft).");
|
|
150
|
+
console.log("Use --help to see available flags.");
|
|
151
|
+
}
|
|
152
|
+
/* ----------------------------- Run Script ---------------------------- */
|
|
153
|
+
if (require.main === module) {
|
|
154
|
+
main().catch((err) => {
|
|
155
|
+
console.error("Unhandled error in CLI:", err && err.stack ? err.stack : err);
|
|
156
|
+
process.exit(2);
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
exports.default = main;
|
|
160
|
+
//# sourceMappingURL=cli.js.map
|