dappily-agent-kit 0.1.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 +192 -0
- package/dist/actions/associate_token.d.ts +4 -0
- package/dist/actions/associate_token.d.ts.map +1 -0
- package/dist/actions/associate_token.js +156 -0
- package/dist/actions/associate_token.js.map +1 -0
- package/dist/actions/burn_nft.d.ts +4 -0
- package/dist/actions/burn_nft.d.ts.map +1 -0
- package/dist/actions/burn_nft.js +123 -0
- package/dist/actions/burn_nft.js.map +1 -0
- package/dist/actions/burn_token.d.ts +4 -0
- package/dist/actions/burn_token.d.ts.map +1 -0
- package/dist/actions/burn_token.js +147 -0
- package/dist/actions/burn_token.js.map +1 -0
- package/dist/actions/create_nft_collection.d.ts +4 -0
- package/dist/actions/create_nft_collection.d.ts.map +1 -0
- package/dist/actions/create_nft_collection.js +176 -0
- package/dist/actions/create_nft_collection.js.map +1 -0
- package/dist/actions/create_token.d.ts +4 -0
- package/dist/actions/create_token.d.ts.map +1 -0
- package/dist/actions/create_token.js +159 -0
- package/dist/actions/create_token.js.map +1 -0
- package/dist/actions/get_balance.d.ts +4 -0
- package/dist/actions/get_balance.d.ts.map +1 -0
- package/dist/actions/get_balance.js +106 -0
- package/dist/actions/get_balance.js.map +1 -0
- package/dist/actions/index.d.ts +17 -0
- package/dist/actions/index.d.ts.map +1 -0
- package/dist/actions/index.js +76 -0
- package/dist/actions/index.js.map +1 -0
- package/dist/actions/mint_nft.d.ts +4 -0
- package/dist/actions/mint_nft.d.ts.map +1 -0
- package/dist/actions/mint_nft.js +162 -0
- package/dist/actions/mint_nft.js.map +1 -0
- package/dist/actions/mint_token.d.ts +4 -0
- package/dist/actions/mint_token.d.ts.map +1 -0
- package/dist/actions/mint_token.js +127 -0
- package/dist/actions/mint_token.js.map +1 -0
- package/dist/actions/transfer.d.ts +4 -0
- package/dist/actions/transfer.d.ts.map +1 -0
- package/dist/actions/transfer.js +118 -0
- package/dist/actions/transfer.js.map +1 -0
- package/dist/actions/transfer_nft.d.ts +4 -0
- package/dist/actions/transfer_nft.d.ts.map +1 -0
- package/dist/actions/transfer_nft.js +177 -0
- package/dist/actions/transfer_nft.js.map +1 -0
- package/dist/actions/transfer_token.d.ts +4 -0
- package/dist/actions/transfer_token.d.ts.map +1 -0
- package/dist/actions/transfer_token.js +180 -0
- package/dist/actions/transfer_token.js.map +1 -0
- package/dist/agent/index.d.ts +13 -0
- package/dist/agent/index.d.ts.map +1 -0
- package/dist/agent/index.js +33 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +28 -0
- package/dist/index.js.map +1 -0
- package/dist/types/action.d.ts +39 -0
- package/dist/types/action.d.ts.map +1 -0
- package/dist/types/action.js +3 -0
- package/dist/types/action.js.map +1 -0
- package/package.json +50 -0
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const zod_1 = require("zod");
|
|
4
|
+
const sdk_1 = require("@hashgraph/sdk");
|
|
5
|
+
const burnTokenAction = {
|
|
6
|
+
name: "BURN_TOKEN",
|
|
7
|
+
similes: [
|
|
8
|
+
"burn token",
|
|
9
|
+
"burn tokens",
|
|
10
|
+
"decrease supply",
|
|
11
|
+
"destroy tokens",
|
|
12
|
+
"reduce supply",
|
|
13
|
+
],
|
|
14
|
+
description: "Burn fungible tokens, permanently reducing the total supply. The tokens are burned from the treasury account. The token must have been created with a supply key. By default, the agent's operator key is used to sign.",
|
|
15
|
+
examples: [
|
|
16
|
+
[
|
|
17
|
+
{
|
|
18
|
+
input: {
|
|
19
|
+
tokenId: "0.0.99999",
|
|
20
|
+
amount: 1000,
|
|
21
|
+
},
|
|
22
|
+
output: {
|
|
23
|
+
ok: true,
|
|
24
|
+
summary: "Burned 1,000 of token 0.0.99999",
|
|
25
|
+
txId: "0.0.12345@1700000000.000000000",
|
|
26
|
+
receipt: { status: "SUCCESS" },
|
|
27
|
+
data: {
|
|
28
|
+
tokenId: "0.0.99999",
|
|
29
|
+
amountBurned: 1000,
|
|
30
|
+
newTotalSupply: "9000",
|
|
31
|
+
explorerUrl: "https://hashscan.io/testnet/transaction/...",
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
explanation: "Burn 1,000 tokens from the treasury supply",
|
|
35
|
+
},
|
|
36
|
+
],
|
|
37
|
+
],
|
|
38
|
+
schema: zod_1.z.object({
|
|
39
|
+
tokenId: zod_1.z
|
|
40
|
+
.string()
|
|
41
|
+
.regex(/^\d+\.\d+\.\d+$/, "Invalid Hedera Token ID format (must be 0.0.X)")
|
|
42
|
+
.describe("The token ID to burn (e.g. 0.0.99999)"),
|
|
43
|
+
amount: zod_1.z
|
|
44
|
+
.number()
|
|
45
|
+
.int()
|
|
46
|
+
.positive()
|
|
47
|
+
.describe("Amount of tokens to burn (in smallest unit)"),
|
|
48
|
+
memo: zod_1.z
|
|
49
|
+
.string()
|
|
50
|
+
.max(100)
|
|
51
|
+
.optional()
|
|
52
|
+
.describe("Optional memo for the transaction"),
|
|
53
|
+
supplyPrivateKey: zod_1.z
|
|
54
|
+
.string()
|
|
55
|
+
.optional()
|
|
56
|
+
.describe("⚠️ Supply key for the token (only needed if different from operator key)"),
|
|
57
|
+
}),
|
|
58
|
+
requiresConfirmation: true,
|
|
59
|
+
simulate: async (agent, input) => {
|
|
60
|
+
const warnings = [];
|
|
61
|
+
if (input.amount >= 1000000) {
|
|
62
|
+
warnings.push(`Large burn: ${input.amount.toLocaleString()} units. This is permanent and irreversible.`);
|
|
63
|
+
}
|
|
64
|
+
// Always warn — burns are destructive
|
|
65
|
+
warnings.push("⚠️ Token burns are irreversible. Supply cannot be recovered.");
|
|
66
|
+
return {
|
|
67
|
+
summary: `Burn ${input.amount.toLocaleString()} of token ${input.tokenId}`,
|
|
68
|
+
estimatedFeeHbar: 0.001,
|
|
69
|
+
warnings,
|
|
70
|
+
};
|
|
71
|
+
},
|
|
72
|
+
handler: async (agent, input) => {
|
|
73
|
+
try {
|
|
74
|
+
const tx = new sdk_1.TokenBurnTransaction()
|
|
75
|
+
.setTokenId(input.tokenId)
|
|
76
|
+
.setAmount(input.amount);
|
|
77
|
+
if (input.memo) {
|
|
78
|
+
tx.setTransactionMemo(input.memo);
|
|
79
|
+
}
|
|
80
|
+
// Freeze before signing
|
|
81
|
+
const frozenTx = await tx.freezeWith(agent.client);
|
|
82
|
+
// Sign with custom supply key if provided
|
|
83
|
+
if (input.supplyPrivateKey) {
|
|
84
|
+
const supplyKey = sdk_1.PrivateKey.fromString(input.supplyPrivateKey);
|
|
85
|
+
await frozenTx.sign(supplyKey);
|
|
86
|
+
}
|
|
87
|
+
const response = await frozenTx.execute(agent.client);
|
|
88
|
+
const receipt = await response.getReceipt(agent.client);
|
|
89
|
+
if (receipt.status !== sdk_1.Status.Success) {
|
|
90
|
+
const statusStr = receipt.status.toString();
|
|
91
|
+
if (statusStr.includes("INSUFFICIENT_TOKEN_BALANCE")) {
|
|
92
|
+
return {
|
|
93
|
+
ok: false,
|
|
94
|
+
error: "INSUFFICIENT_TOKEN_BALANCE",
|
|
95
|
+
details: `Cannot burn ${input.amount.toLocaleString()} tokens — the treasury does not hold enough. Check the current supply.`,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
return {
|
|
99
|
+
ok: false,
|
|
100
|
+
error: statusStr,
|
|
101
|
+
details: `Burn failed with status: ${statusStr}`,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
const txId = response.transactionId.toString();
|
|
105
|
+
return {
|
|
106
|
+
ok: true,
|
|
107
|
+
summary: `Burned ${input.amount.toLocaleString()} of token ${input.tokenId}`,
|
|
108
|
+
txId,
|
|
109
|
+
receipt: {
|
|
110
|
+
status: receipt.status.toString(),
|
|
111
|
+
},
|
|
112
|
+
data: {
|
|
113
|
+
tokenId: input.tokenId,
|
|
114
|
+
amountBurned: input.amount,
|
|
115
|
+
newTotalSupply: receipt.totalSupply?.toString() ?? "unknown",
|
|
116
|
+
explorerUrl: agent.getExplorerUrl(txId),
|
|
117
|
+
},
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
catch (err) {
|
|
121
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
122
|
+
// Catch insufficient balance at SDK level too
|
|
123
|
+
if (message.includes("INSUFFICIENT_TOKEN_BALANCE")) {
|
|
124
|
+
return {
|
|
125
|
+
ok: false,
|
|
126
|
+
error: "INSUFFICIENT_TOKEN_BALANCE",
|
|
127
|
+
details: `Cannot burn ${input.amount.toLocaleString()} tokens — the treasury does not hold enough.`,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
const knownErrors = {
|
|
131
|
+
TOKEN_HAS_NO_SUPPLY_KEY: "This token was created without a supply key. Burning is permanently disabled.",
|
|
132
|
+
INVALID_SIGNATURE: "Transaction signature is invalid. The supply key doesn't match.",
|
|
133
|
+
INVALID_TOKEN_ID: "The token ID does not exist on this network.",
|
|
134
|
+
TOKEN_WAS_DELETED: "This token has been deleted.",
|
|
135
|
+
INSUFFICIENT_PAYER_BALANCE: "Not enough HBAR to cover the transaction fee.",
|
|
136
|
+
};
|
|
137
|
+
const errorCode = Object.keys(knownErrors).find((code) => message.includes(code));
|
|
138
|
+
return {
|
|
139
|
+
ok: false,
|
|
140
|
+
error: errorCode || "BURN_TOKEN_FAILED",
|
|
141
|
+
details: errorCode ? knownErrors[errorCode] : message,
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
},
|
|
145
|
+
};
|
|
146
|
+
exports.default = burnTokenAction;
|
|
147
|
+
//# sourceMappingURL=burn_token.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"burn_token.js","sourceRoot":"","sources":["../../src/actions/burn_token.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create_nft_collection.d.ts","sourceRoot":"","sources":["../../src/actions/create_nft_collection.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAgB,MAAM,iBAAiB,CAAC;AASvD,QAAA,MAAM,yBAAyB,EAAE,MA2LhC,CAAC;AAEF,eAAe,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const zod_1 = require("zod");
|
|
4
|
+
const sdk_1 = require("@hashgraph/sdk");
|
|
5
|
+
const createNftCollectionAction = {
|
|
6
|
+
name: "CREATE_NFT_COLLECTION",
|
|
7
|
+
similes: [
|
|
8
|
+
"create nft collection",
|
|
9
|
+
"create nft",
|
|
10
|
+
"launch nft",
|
|
11
|
+
"deploy nft",
|
|
12
|
+
"new nft collection",
|
|
13
|
+
"nft collection",
|
|
14
|
+
"make nft",
|
|
15
|
+
],
|
|
16
|
+
description: "Create a new NFT collection (NonFungibleUnique token) on the Hedera Token Service. The operator key is used as admin and supply key by default. Max supply can optionally be capped.",
|
|
17
|
+
examples: [
|
|
18
|
+
[
|
|
19
|
+
{
|
|
20
|
+
input: {
|
|
21
|
+
name: "Dappily Genesis",
|
|
22
|
+
symbol: "DGEN",
|
|
23
|
+
memo: "The first Dappily NFT collection",
|
|
24
|
+
},
|
|
25
|
+
output: {
|
|
26
|
+
ok: true,
|
|
27
|
+
summary: "Created NFT collection DGEN (0.0.88888)",
|
|
28
|
+
txId: "0.0.12345@1700000000.000000000",
|
|
29
|
+
receipt: { status: "SUCCESS" },
|
|
30
|
+
data: {
|
|
31
|
+
tokenId: "0.0.88888",
|
|
32
|
+
name: "Dappily Genesis",
|
|
33
|
+
symbol: "DGEN",
|
|
34
|
+
type: "NON_FUNGIBLE_UNIQUE",
|
|
35
|
+
treasury: "0.0.12345",
|
|
36
|
+
maxSupply: "unlimited",
|
|
37
|
+
hasAdminKey: true,
|
|
38
|
+
hasSupplyKey: true,
|
|
39
|
+
explorerUrl: "https://hashscan.io/testnet/transaction/...",
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
explanation: "Create an NFT collection with unlimited supply",
|
|
43
|
+
},
|
|
44
|
+
],
|
|
45
|
+
],
|
|
46
|
+
schema: zod_1.z.object({
|
|
47
|
+
name: zod_1.z
|
|
48
|
+
.string()
|
|
49
|
+
.min(1)
|
|
50
|
+
.max(100)
|
|
51
|
+
.describe("The human-readable name of the NFT collection"),
|
|
52
|
+
symbol: zod_1.z
|
|
53
|
+
.string()
|
|
54
|
+
.min(1)
|
|
55
|
+
.max(100)
|
|
56
|
+
.describe("The ticker symbol for the collection (e.g. 'DGEN')"),
|
|
57
|
+
maxSupply: zod_1.z
|
|
58
|
+
.number()
|
|
59
|
+
.int()
|
|
60
|
+
.positive()
|
|
61
|
+
.optional()
|
|
62
|
+
.describe("Optional max supply cap. Omit for unlimited."),
|
|
63
|
+
memo: zod_1.z
|
|
64
|
+
.string()
|
|
65
|
+
.max(100)
|
|
66
|
+
.optional()
|
|
67
|
+
.describe("Optional memo attached to the collection"),
|
|
68
|
+
adminPrivateKey: zod_1.z
|
|
69
|
+
.string()
|
|
70
|
+
.optional()
|
|
71
|
+
.describe("⚠️ Admin key (only if different from operator key)"),
|
|
72
|
+
supplyPrivateKey: zod_1.z
|
|
73
|
+
.string()
|
|
74
|
+
.optional()
|
|
75
|
+
.describe("⚠️ Supply key (only if different from operator key)"),
|
|
76
|
+
}),
|
|
77
|
+
requiresConfirmation: true,
|
|
78
|
+
simulate: async (_agent, input) => {
|
|
79
|
+
return {
|
|
80
|
+
summary: `Create NFT collection "${input.name}" (${input.symbol})${input.maxSupply ? `, max supply: ${input.maxSupply}` : ", unlimited supply"}`,
|
|
81
|
+
estimatedFeeHbar: 1,
|
|
82
|
+
warnings: [],
|
|
83
|
+
};
|
|
84
|
+
},
|
|
85
|
+
handler: async (agent, input) => {
|
|
86
|
+
try {
|
|
87
|
+
const adminKey = input.adminPrivateKey
|
|
88
|
+
? sdk_1.PrivateKey.fromString(input.adminPrivateKey).publicKey
|
|
89
|
+
: agent.privateKey.publicKey;
|
|
90
|
+
const supplyKey = input.supplyPrivateKey
|
|
91
|
+
? sdk_1.PrivateKey.fromString(input.supplyPrivateKey).publicKey
|
|
92
|
+
: agent.privateKey.publicKey;
|
|
93
|
+
const tx = new sdk_1.TokenCreateTransaction()
|
|
94
|
+
.setTokenName(input.name)
|
|
95
|
+
.setTokenSymbol(input.symbol)
|
|
96
|
+
.setTokenType(sdk_1.TokenType.NonFungibleUnique)
|
|
97
|
+
.setDecimals(0)
|
|
98
|
+
.setInitialSupply(0)
|
|
99
|
+
.setTreasuryAccountId(agent.accountId)
|
|
100
|
+
.setAdminKey(adminKey)
|
|
101
|
+
.setSupplyKey(supplyKey);
|
|
102
|
+
if (input.maxSupply) {
|
|
103
|
+
tx.setSupplyType(sdk_1.TokenSupplyType.Finite);
|
|
104
|
+
tx.setMaxSupply(input.maxSupply);
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
tx.setSupplyType(sdk_1.TokenSupplyType.Infinite);
|
|
108
|
+
}
|
|
109
|
+
if (input.memo) {
|
|
110
|
+
tx.setTokenMemo(input.memo);
|
|
111
|
+
}
|
|
112
|
+
// Freeze, sign with custom keys if needed, execute
|
|
113
|
+
const frozenTx = await tx.freezeWith(agent.client);
|
|
114
|
+
if (input.adminPrivateKey) {
|
|
115
|
+
await frozenTx.sign(sdk_1.PrivateKey.fromString(input.adminPrivateKey));
|
|
116
|
+
}
|
|
117
|
+
if (input.supplyPrivateKey && input.supplyPrivateKey !== input.adminPrivateKey) {
|
|
118
|
+
await frozenTx.sign(sdk_1.PrivateKey.fromString(input.supplyPrivateKey));
|
|
119
|
+
}
|
|
120
|
+
const response = await frozenTx.execute(agent.client);
|
|
121
|
+
const receipt = await response.getReceipt(agent.client);
|
|
122
|
+
if (receipt.status !== sdk_1.Status.Success) {
|
|
123
|
+
return {
|
|
124
|
+
ok: false,
|
|
125
|
+
error: receipt.status.toString(),
|
|
126
|
+
details: `NFT collection creation failed with status: ${receipt.status.toString()}`,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
const tokenId = receipt.tokenId;
|
|
130
|
+
if (!tokenId) {
|
|
131
|
+
return {
|
|
132
|
+
ok: false,
|
|
133
|
+
error: "NO_TOKEN_ID",
|
|
134
|
+
details: "Transaction succeeded but no token ID was returned.",
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
const txId = response.transactionId.toString();
|
|
138
|
+
return {
|
|
139
|
+
ok: true,
|
|
140
|
+
summary: `Created NFT collection ${input.symbol} (${tokenId.toString()})`,
|
|
141
|
+
txId,
|
|
142
|
+
receipt: { status: receipt.status.toString() },
|
|
143
|
+
data: {
|
|
144
|
+
tokenId: tokenId.toString(),
|
|
145
|
+
name: input.name,
|
|
146
|
+
symbol: input.symbol,
|
|
147
|
+
type: "NON_FUNGIBLE_UNIQUE",
|
|
148
|
+
treasury: agent.accountId.toString(),
|
|
149
|
+
maxSupply: input.maxSupply?.toString() ?? "unlimited",
|
|
150
|
+
hasAdminKey: true,
|
|
151
|
+
hasSupplyKey: true,
|
|
152
|
+
explorerUrl: agent.getExplorerUrl(txId),
|
|
153
|
+
},
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
catch (err) {
|
|
157
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
158
|
+
const knownErrors = {
|
|
159
|
+
INSUFFICIENT_PAYER_BALANCE: "Not enough HBAR to cover the NFT collection creation fee (~1 HBAR).",
|
|
160
|
+
INVALID_TOKEN_SYMBOL: "Token symbol is invalid.",
|
|
161
|
+
INVALID_TOKEN_NAME: "Token name is invalid.",
|
|
162
|
+
INVALID_SIGNATURE: "Transaction signature is invalid. Check your keys.",
|
|
163
|
+
INVALID_ACCOUNT_ID: "The account ID does not exist on this network.",
|
|
164
|
+
TOKEN_WAS_DELETED: "This token has been deleted.",
|
|
165
|
+
};
|
|
166
|
+
const errorCode = Object.keys(knownErrors).find((code) => message.includes(code));
|
|
167
|
+
return {
|
|
168
|
+
ok: false,
|
|
169
|
+
error: errorCode || "CREATE_NFT_COLLECTION_FAILED",
|
|
170
|
+
details: errorCode ? knownErrors[errorCode] : message,
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
},
|
|
174
|
+
};
|
|
175
|
+
exports.default = createNftCollectionAction;
|
|
176
|
+
//# sourceMappingURL=create_nft_collection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create_nft_collection.js","sourceRoot":"","sources":["../../src/actions/create_nft_collection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create_token.d.ts","sourceRoot":"","sources":["../../src/actions/create_token.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAgB,MAAM,iBAAiB,CAAC;AAQvD,QAAA,MAAM,iBAAiB,EAAE,MAuKxB,CAAC;AAEF,eAAe,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const zod_1 = require("zod");
|
|
4
|
+
const sdk_1 = require("@hashgraph/sdk");
|
|
5
|
+
const createTokenAction = {
|
|
6
|
+
name: "CREATE_TOKEN",
|
|
7
|
+
similes: [
|
|
8
|
+
"create token",
|
|
9
|
+
"launch token",
|
|
10
|
+
"deploy token",
|
|
11
|
+
"make token",
|
|
12
|
+
"new token",
|
|
13
|
+
"mint token",
|
|
14
|
+
"token factory",
|
|
15
|
+
],
|
|
16
|
+
description: "Create a new fungible token on the Hedera Token Service (HTS). The agent's operator account is used as the treasury by default. The operator key is set as both admin key and supply key, enabling future mint/burn operations.",
|
|
17
|
+
examples: [
|
|
18
|
+
[
|
|
19
|
+
{
|
|
20
|
+
input: {
|
|
21
|
+
name: "Dappily Coin",
|
|
22
|
+
symbol: "DAPP",
|
|
23
|
+
initialSupply: 1000000,
|
|
24
|
+
decimals: 2,
|
|
25
|
+
memo: "The Dappily utility token",
|
|
26
|
+
},
|
|
27
|
+
output: {
|
|
28
|
+
ok: true,
|
|
29
|
+
summary: "Created token DAPP (0.0.99999) with initial supply 1,000,000",
|
|
30
|
+
txId: "0.0.12345@1700000000.000000000",
|
|
31
|
+
receipt: { status: "SUCCESS" },
|
|
32
|
+
data: {
|
|
33
|
+
tokenId: "0.0.99999",
|
|
34
|
+
name: "Dappily Coin",
|
|
35
|
+
symbol: "DAPP",
|
|
36
|
+
decimals: 2,
|
|
37
|
+
initialSupply: 1000000,
|
|
38
|
+
treasury: "0.0.12345",
|
|
39
|
+
hasAdminKey: true,
|
|
40
|
+
hasSupplyKey: true,
|
|
41
|
+
explorerUrl: "https://hashscan.io/testnet/transaction/...",
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
explanation: "Create a fungible token with 2 decimal places and 1M initial supply",
|
|
45
|
+
},
|
|
46
|
+
],
|
|
47
|
+
],
|
|
48
|
+
schema: zod_1.z.object({
|
|
49
|
+
name: zod_1.z
|
|
50
|
+
.string()
|
|
51
|
+
.min(1)
|
|
52
|
+
.max(100)
|
|
53
|
+
.describe("The human-readable name of the token (e.g. 'Dappily Coin')"),
|
|
54
|
+
symbol: zod_1.z
|
|
55
|
+
.string()
|
|
56
|
+
.min(1)
|
|
57
|
+
.max(100)
|
|
58
|
+
.describe("The ticker symbol for the token (e.g. 'DAPP')"),
|
|
59
|
+
decimals: zod_1.z
|
|
60
|
+
.number()
|
|
61
|
+
.int()
|
|
62
|
+
.min(0)
|
|
63
|
+
.max(18)
|
|
64
|
+
.optional()
|
|
65
|
+
.default(0)
|
|
66
|
+
.describe("Number of decimal places (default 0, max 18)"),
|
|
67
|
+
initialSupply: zod_1.z
|
|
68
|
+
.number()
|
|
69
|
+
.int()
|
|
70
|
+
.min(0)
|
|
71
|
+
.describe("Initial supply of the token (in the smallest unit)"),
|
|
72
|
+
memo: zod_1.z
|
|
73
|
+
.string()
|
|
74
|
+
.max(100)
|
|
75
|
+
.optional()
|
|
76
|
+
.describe("Optional memo attached to the token"),
|
|
77
|
+
}),
|
|
78
|
+
requiresConfirmation: true,
|
|
79
|
+
simulate: async (agent, input) => {
|
|
80
|
+
return {
|
|
81
|
+
summary: `Create token "${input.name}" (${input.symbol}) with supply ${input.initialSupply.toLocaleString()} and ${input.decimals ?? 0} decimals`,
|
|
82
|
+
estimatedFeeHbar: 1, // Token creation costs ~1 HBAR
|
|
83
|
+
warnings: [],
|
|
84
|
+
};
|
|
85
|
+
},
|
|
86
|
+
handler: async (agent, input) => {
|
|
87
|
+
try {
|
|
88
|
+
const decimals = input.decimals ?? 0;
|
|
89
|
+
const tx = new sdk_1.TokenCreateTransaction()
|
|
90
|
+
.setTokenName(input.name)
|
|
91
|
+
.setTokenSymbol(input.symbol)
|
|
92
|
+
.setDecimals(decimals)
|
|
93
|
+
.setInitialSupply(input.initialSupply)
|
|
94
|
+
.setTreasuryAccountId(agent.accountId)
|
|
95
|
+
.setAdminKey(agent.privateKey.publicKey)
|
|
96
|
+
.setSupplyKey(agent.privateKey.publicKey)
|
|
97
|
+
.setTokenType(sdk_1.TokenType.FungibleCommon)
|
|
98
|
+
.setSupplyType(sdk_1.TokenSupplyType.Infinite);
|
|
99
|
+
if (input.memo) {
|
|
100
|
+
tx.setTokenMemo(input.memo);
|
|
101
|
+
}
|
|
102
|
+
const response = await tx.execute(agent.client);
|
|
103
|
+
const receipt = await response.getReceipt(agent.client);
|
|
104
|
+
if (receipt.status !== sdk_1.Status.Success) {
|
|
105
|
+
return {
|
|
106
|
+
ok: false,
|
|
107
|
+
error: receipt.status.toString(),
|
|
108
|
+
details: `Token creation failed with status: ${receipt.status.toString()}`,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
const tokenId = receipt.tokenId;
|
|
112
|
+
if (!tokenId) {
|
|
113
|
+
return {
|
|
114
|
+
ok: false,
|
|
115
|
+
error: "NO_TOKEN_ID",
|
|
116
|
+
details: "Transaction succeeded but no token ID was returned.",
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
const txId = response.transactionId.toString();
|
|
120
|
+
return {
|
|
121
|
+
ok: true,
|
|
122
|
+
summary: `Created token ${input.symbol} (${tokenId.toString()}) with initial supply ${input.initialSupply.toLocaleString()}`,
|
|
123
|
+
txId,
|
|
124
|
+
receipt: {
|
|
125
|
+
status: receipt.status.toString(),
|
|
126
|
+
},
|
|
127
|
+
data: {
|
|
128
|
+
tokenId: tokenId.toString(),
|
|
129
|
+
name: input.name,
|
|
130
|
+
symbol: input.symbol,
|
|
131
|
+
decimals,
|
|
132
|
+
initialSupply: input.initialSupply,
|
|
133
|
+
treasury: agent.accountId.toString(),
|
|
134
|
+
hasAdminKey: true,
|
|
135
|
+
hasSupplyKey: true,
|
|
136
|
+
explorerUrl: agent.getExplorerUrl(txId),
|
|
137
|
+
},
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
catch (err) {
|
|
141
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
142
|
+
const knownErrors = {
|
|
143
|
+
INSUFFICIENT_PAYER_BALANCE: "Not enough HBAR to cover the token creation fee (~1 HBAR).",
|
|
144
|
+
INVALID_TOKEN_SYMBOL: "Token symbol is invalid.",
|
|
145
|
+
INVALID_TOKEN_NAME: "Token name is invalid.",
|
|
146
|
+
TOKEN_ALREADY_ASSOCIATED_TO_ACCOUNT: "This token is already associated with the treasury.",
|
|
147
|
+
TOKENS_PER_ACCOUNT_LIMIT_EXCEEDED: "The treasury account has reached its token association limit.",
|
|
148
|
+
};
|
|
149
|
+
const errorCode = Object.keys(knownErrors).find((code) => message.includes(code));
|
|
150
|
+
return {
|
|
151
|
+
ok: false,
|
|
152
|
+
error: errorCode || "CREATE_TOKEN_FAILED",
|
|
153
|
+
details: errorCode ? knownErrors[errorCode] : message,
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
},
|
|
157
|
+
};
|
|
158
|
+
exports.default = createTokenAction;
|
|
159
|
+
//# sourceMappingURL=create_token.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create_token.js","sourceRoot":"","sources":["../../src/actions/create_token.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get_balance.d.ts","sourceRoot":"","sources":["../../src/actions/get_balance.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAgB,MAAM,iBAAiB,CAAC;AAGvD,QAAA,MAAM,gBAAgB,EAAE,MAoHvB,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const zod_1 = require("zod");
|
|
4
|
+
const sdk_1 = require("@hashgraph/sdk");
|
|
5
|
+
const getBalanceAction = {
|
|
6
|
+
name: "GET_BALANCE",
|
|
7
|
+
similes: [
|
|
8
|
+
"check balance",
|
|
9
|
+
"get balance",
|
|
10
|
+
"account balance",
|
|
11
|
+
"how much hbar",
|
|
12
|
+
"show balance",
|
|
13
|
+
"wallet balance",
|
|
14
|
+
],
|
|
15
|
+
description: "Get the HBAR and token balances for a Hedera account. If no account ID is provided, returns the agent's own balance.",
|
|
16
|
+
examples: [
|
|
17
|
+
[
|
|
18
|
+
{
|
|
19
|
+
input: {},
|
|
20
|
+
output: {
|
|
21
|
+
ok: true,
|
|
22
|
+
summary: "Balance for 0.0.12345: 150.5 ℏ",
|
|
23
|
+
data: {
|
|
24
|
+
accountId: "0.0.12345",
|
|
25
|
+
hbarBalance: "150.5",
|
|
26
|
+
tokens: [],
|
|
27
|
+
},
|
|
28
|
+
},
|
|
29
|
+
explanation: "Get the agent's own balance when no accountId is specified",
|
|
30
|
+
},
|
|
31
|
+
],
|
|
32
|
+
[
|
|
33
|
+
{
|
|
34
|
+
input: { accountId: "0.0.98765" },
|
|
35
|
+
output: {
|
|
36
|
+
ok: true,
|
|
37
|
+
summary: "Balance for 0.0.98765: 42.0 ℏ",
|
|
38
|
+
data: {
|
|
39
|
+
accountId: "0.0.98765",
|
|
40
|
+
hbarBalance: "42.0",
|
|
41
|
+
tokens: [
|
|
42
|
+
{ tokenId: "0.0.55555", balance: "1000", decimals: 2 },
|
|
43
|
+
],
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
explanation: "Get balance for a specific account, including tokens",
|
|
47
|
+
},
|
|
48
|
+
],
|
|
49
|
+
],
|
|
50
|
+
schema: zod_1.z.object({
|
|
51
|
+
accountId: zod_1.z
|
|
52
|
+
.string()
|
|
53
|
+
.regex(/^\d+\.\d+\.\d+$/, "Invalid Hedera Account ID format (must be 0.0.X)")
|
|
54
|
+
.optional()
|
|
55
|
+
.describe("The Hedera Account ID to check (e.g. 0.0.12345). Defaults to the agent's own account."),
|
|
56
|
+
}),
|
|
57
|
+
handler: async (agent, input) => {
|
|
58
|
+
try {
|
|
59
|
+
const targetId = input.accountId
|
|
60
|
+
? sdk_1.AccountId.fromString(input.accountId)
|
|
61
|
+
: agent.accountId;
|
|
62
|
+
const balance = await new sdk_1.AccountBalanceQuery()
|
|
63
|
+
.setAccountId(targetId)
|
|
64
|
+
.execute(agent.client);
|
|
65
|
+
// Build token list from the balance map
|
|
66
|
+
const tokens = [];
|
|
67
|
+
if (balance.tokens) {
|
|
68
|
+
const tokenJson = balance.toJSON().tokens;
|
|
69
|
+
for (const t of tokenJson) {
|
|
70
|
+
tokens.push({
|
|
71
|
+
tokenId: t.tokenId,
|
|
72
|
+
balance: t.balance,
|
|
73
|
+
decimals: t.decimals,
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
const hbarStr = balance.hbars.toString();
|
|
78
|
+
const accountStr = targetId.toString();
|
|
79
|
+
return {
|
|
80
|
+
ok: true,
|
|
81
|
+
summary: `Balance for ${accountStr}: ${hbarStr}`,
|
|
82
|
+
data: {
|
|
83
|
+
accountId: accountStr,
|
|
84
|
+
hbarBalance: hbarStr,
|
|
85
|
+
tokens,
|
|
86
|
+
},
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
catch (err) {
|
|
90
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
91
|
+
// Parse known Hedera error codes
|
|
92
|
+
const knownErrors = {
|
|
93
|
+
INVALID_ACCOUNT_ID: "The account ID does not exist on this network.",
|
|
94
|
+
ACCOUNT_DELETED: "This account has been deleted.",
|
|
95
|
+
};
|
|
96
|
+
const errorCode = Object.keys(knownErrors).find((code) => message.includes(code));
|
|
97
|
+
return {
|
|
98
|
+
ok: false,
|
|
99
|
+
error: errorCode || "BALANCE_QUERY_FAILED",
|
|
100
|
+
details: errorCode ? knownErrors[errorCode] : message,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
},
|
|
104
|
+
};
|
|
105
|
+
exports.default = getBalanceAction;
|
|
106
|
+
//# sourceMappingURL=get_balance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get_balance.js","sourceRoot":"","sources":["../../src/actions/get_balance.ts"],"names":[],"mappings":"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"}
|