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.
Files changed (63) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +192 -0
  3. package/dist/actions/associate_token.d.ts +4 -0
  4. package/dist/actions/associate_token.d.ts.map +1 -0
  5. package/dist/actions/associate_token.js +156 -0
  6. package/dist/actions/associate_token.js.map +1 -0
  7. package/dist/actions/burn_nft.d.ts +4 -0
  8. package/dist/actions/burn_nft.d.ts.map +1 -0
  9. package/dist/actions/burn_nft.js +123 -0
  10. package/dist/actions/burn_nft.js.map +1 -0
  11. package/dist/actions/burn_token.d.ts +4 -0
  12. package/dist/actions/burn_token.d.ts.map +1 -0
  13. package/dist/actions/burn_token.js +147 -0
  14. package/dist/actions/burn_token.js.map +1 -0
  15. package/dist/actions/create_nft_collection.d.ts +4 -0
  16. package/dist/actions/create_nft_collection.d.ts.map +1 -0
  17. package/dist/actions/create_nft_collection.js +176 -0
  18. package/dist/actions/create_nft_collection.js.map +1 -0
  19. package/dist/actions/create_token.d.ts +4 -0
  20. package/dist/actions/create_token.d.ts.map +1 -0
  21. package/dist/actions/create_token.js +159 -0
  22. package/dist/actions/create_token.js.map +1 -0
  23. package/dist/actions/get_balance.d.ts +4 -0
  24. package/dist/actions/get_balance.d.ts.map +1 -0
  25. package/dist/actions/get_balance.js +106 -0
  26. package/dist/actions/get_balance.js.map +1 -0
  27. package/dist/actions/index.d.ts +17 -0
  28. package/dist/actions/index.d.ts.map +1 -0
  29. package/dist/actions/index.js +76 -0
  30. package/dist/actions/index.js.map +1 -0
  31. package/dist/actions/mint_nft.d.ts +4 -0
  32. package/dist/actions/mint_nft.d.ts.map +1 -0
  33. package/dist/actions/mint_nft.js +162 -0
  34. package/dist/actions/mint_nft.js.map +1 -0
  35. package/dist/actions/mint_token.d.ts +4 -0
  36. package/dist/actions/mint_token.d.ts.map +1 -0
  37. package/dist/actions/mint_token.js +127 -0
  38. package/dist/actions/mint_token.js.map +1 -0
  39. package/dist/actions/transfer.d.ts +4 -0
  40. package/dist/actions/transfer.d.ts.map +1 -0
  41. package/dist/actions/transfer.js +118 -0
  42. package/dist/actions/transfer.js.map +1 -0
  43. package/dist/actions/transfer_nft.d.ts +4 -0
  44. package/dist/actions/transfer_nft.d.ts.map +1 -0
  45. package/dist/actions/transfer_nft.js +177 -0
  46. package/dist/actions/transfer_nft.js.map +1 -0
  47. package/dist/actions/transfer_token.d.ts +4 -0
  48. package/dist/actions/transfer_token.d.ts.map +1 -0
  49. package/dist/actions/transfer_token.js +180 -0
  50. package/dist/actions/transfer_token.js.map +1 -0
  51. package/dist/agent/index.d.ts +13 -0
  52. package/dist/agent/index.d.ts.map +1 -0
  53. package/dist/agent/index.js +33 -0
  54. package/dist/agent/index.js.map +1 -0
  55. package/dist/index.d.ts +5 -0
  56. package/dist/index.d.ts.map +1 -0
  57. package/dist/index.js +28 -0
  58. package/dist/index.js.map +1 -0
  59. package/dist/types/action.d.ts +39 -0
  60. package/dist/types/action.d.ts.map +1 -0
  61. package/dist/types/action.js +3 -0
  62. package/dist/types/action.js.map +1 -0
  63. package/package.json +50 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Dappily
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,192 @@
1
+ # 🦞 Dappily Agent Kit
2
+
3
+ **Solana Agent Kit-style actions for Hedera — HTS tokens, NFTs, transfers, and more.**
4
+
5
+ Give any AI agent the ability to interact with the Hedera network. Inspired by [solana-agent-kit](https://github.com/sendaifun/solana-agent-kit).
6
+
7
+ ## Proven on Testnet
8
+
9
+ Every action has been tested with real transactions on Hedera testnet — not just schema validation, but actual on-chain execution with verified receipts:
10
+
11
+ | Action | Testnet Proof |
12
+ |--------|---------------|
13
+ | GET_BALANCE | ✅ 999 ℏ queried |
14
+ | HBAR_TRANSFER | ✅ Receipt: SUCCESS |
15
+ | CREATE_TOKEN | ✅ Token `0.0.7932264` created |
16
+ | MINT_TOKEN | ✅ Supply 10000 → 15000 |
17
+ | BURN_TOKEN | ✅ Supply 15000 → 14000 |
18
+ | TRANSFER_TOKEN | ✅ 100 tokens moved |
19
+ | CREATE_NFT_COLLECTION | ✅ Collection `0.0.7932266` created |
20
+ | MINT_NFT | ✅ Serials [1, 2, 3] returned |
21
+ | BURN_NFT | ✅ Serial #3 destroyed |
22
+
23
+ ## Quickstart
24
+
25
+ ```bash
26
+ npm install dappily-agent-kit @hashgraph/sdk
27
+ ```
28
+
29
+ ```typescript
30
+ import { HederaAgentKit, getBalanceAction, createTokenAction } from "dappily-agent-kit";
31
+
32
+ // Initialize with your Hedera credentials
33
+ const agent = new HederaAgentKit(
34
+ "0.0.YOUR_ACCOUNT",
35
+ "YOUR_PRIVATE_KEY",
36
+ "testnet" // or "mainnet"
37
+ );
38
+
39
+ // Check balance
40
+ const balance = await getBalanceAction.handler(agent, {});
41
+ if (balance.ok) {
42
+ console.log(balance.data.hbarBalance); // "150.5 ℏ"
43
+ }
44
+
45
+ // Create a token
46
+ const token = await createTokenAction.handler(agent, {
47
+ name: "My Token",
48
+ symbol: "MTK",
49
+ initialSupply: 1000000,
50
+ decimals: 2,
51
+ });
52
+ if (token.ok) {
53
+ console.log(token.data.tokenId); // "0.0.XXXXX"
54
+ }
55
+ ```
56
+
57
+ ## Actions
58
+
59
+ ### Core
60
+
61
+ | Action | Input | Description |
62
+ |--------|-------|-------------|
63
+ | `GET_BALANCE` | `{ accountId?: string }` | Get HBAR + token balances. Defaults to agent's account. |
64
+ | `HBAR_TRANSFER` | `{ to, amount, memo? }` | Send HBAR to another account. |
65
+
66
+ ### Fungible Tokens (HTS)
67
+
68
+ | Action | Input | Description |
69
+ |--------|-------|-------------|
70
+ | `CREATE_TOKEN` | `{ name, symbol, initialSupply, decimals?, memo? }` | Create a new fungible token. |
71
+ | `ASSOCIATE_TOKEN` | `{ tokenId, accountId?, accountPrivateKey? }` | Associate a token with an account. |
72
+ | `TRANSFER_TOKEN` | `{ tokenId, to, amount, memo? }` | Transfer fungible tokens. Pre-flight association check. |
73
+ | `MINT_TOKEN` | `{ tokenId, amount, supplyPrivateKey? }` | Mint additional supply. |
74
+ | `BURN_TOKEN` | `{ tokenId, amount, supplyPrivateKey? }` | Burn supply (irreversible). |
75
+
76
+ ### NFTs (HTS)
77
+
78
+ | Action | Input | Description |
79
+ |--------|-------|-------------|
80
+ | `CREATE_NFT_COLLECTION` | `{ name, symbol, maxSupply?, memo? }` | Create an NFT collection. |
81
+ | `MINT_NFT` | `{ tokenId, metadata: string[], supplyPrivateKey? }` | Mint NFTs with base64 metadata. Returns serial numbers. |
82
+ | `TRANSFER_NFT` | `{ tokenId, serial, to, senderPrivateKey? }` | Transfer an NFT. Pre-flight association check. |
83
+ | `BURN_NFT` | `{ tokenId, serial, supplyPrivateKey? }` | Burn an NFT (irreversible). |
84
+
85
+ ## Standardized Output
86
+
87
+ Every action returns the same shape:
88
+
89
+ ```typescript
90
+ // Success
91
+ {
92
+ ok: true,
93
+ summary: "Sent 10 HBAR to 0.0.12345",
94
+ txId: "0.0.98765@1700000000.000000000",
95
+ receipt: { status: "SUCCESS" },
96
+ data: { /* action-specific */ }
97
+ }
98
+
99
+ // Failure
100
+ {
101
+ ok: false,
102
+ error: "INSUFFICIENT_PAYER_BALANCE",
103
+ details: "The sending account does not have enough HBAR."
104
+ }
105
+ ```
106
+
107
+ Error codes are mapped from Hedera's native codes to human-readable messages. Pre-flight checks (like association verification) prevent wasted transactions.
108
+
109
+ ## Action Discovery
110
+
111
+ ```typescript
112
+ import { actions, getActionByName, findActionBySimile } from "dappily-agent-kit";
113
+
114
+ // List all actions
115
+ actions.forEach(a => console.log(a.name, a.description));
116
+
117
+ // Lookup by name
118
+ const action = getActionByName("HBAR_TRANSFER");
119
+
120
+ // Fuzzy match (for AI agents)
121
+ const match = findActionBySimile("send some hbar");
122
+ // → hbarTransferAction
123
+ ```
124
+
125
+ ## Examples
126
+
127
+ See the [`examples/`](./examples) directory:
128
+
129
+ - **`balance.ts`** — Check account balance
130
+ - **`fungible-lifecycle.ts`** — Create → Mint → Transfer → Burn
131
+ - **`nft-lifecycle.ts`** — Create collection → Mint NFTs → Burn
132
+
133
+ ```bash
134
+ OPERATOR_ID=0.0.XXXXX OPERATOR_KEY=302e... npx ts-node examples/balance.ts
135
+ ```
136
+
137
+ ## Security
138
+
139
+ ⚠️ **Private keys in action inputs** are supported for development and testing. For production:
140
+
141
+ - Use environment variables or a vault for key storage
142
+ - Never log or persist private keys
143
+ - Plan to integrate wallet signing (HashPack / WalletConnect) for third-party accounts
144
+ - The `accountPrivateKey` and `supplyPrivateKey` fields will be replaced with a signing interface in a future version
145
+
146
+ ## Architecture
147
+
148
+ ```
149
+ dappily-agent-kit/
150
+ ├── src/
151
+ │ ├── index.ts # Public API surface
152
+ │ ├── agent/index.ts # HederaAgentKit (client + operator)
153
+ │ ├── actions/
154
+ │ │ ├── index.ts # Registry + lookup helpers
155
+ │ │ ├── get_balance.ts # GET_BALANCE
156
+ │ │ ├── transfer.ts # HBAR_TRANSFER
157
+ │ │ ├── create_token.ts # CREATE_TOKEN
158
+ │ │ ├── associate_token.ts
159
+ │ │ ├── transfer_token.ts
160
+ │ │ ├── mint_token.ts
161
+ │ │ ├── burn_token.ts
162
+ │ │ ├── create_nft_collection.ts
163
+ │ │ ├── mint_nft.ts
164
+ │ │ ├── transfer_nft.ts
165
+ │ │ └── burn_nft.ts
166
+ │ └── types/action.ts # ActionResult, Action, etc.
167
+ ├── examples/
168
+ │ ├── balance.ts
169
+ │ ├── fungible-lifecycle.ts
170
+ │ └── nft-lifecycle.ts
171
+ ├── dist/ # Built output (CJS + types)
172
+ ├── package.json
173
+ ├── tsconfig.build.json
174
+ └── LICENSE
175
+ ```
176
+
177
+ ## Roadmap
178
+
179
+ - [ ] HCS (Hedera Consensus Service) — topic create/submit
180
+ - [ ] Mirror Node queries — token info, NFT metadata, transaction history
181
+ - [ ] Wallet signing interface (replace private key inputs)
182
+ - [ ] Smart contract deployment + invocation
183
+ - [ ] Scheduled transactions
184
+ - [ ] Multi-sig support
185
+
186
+ ## License
187
+
188
+ MIT — see [LICENSE](./LICENSE).
189
+
190
+ ---
191
+
192
+ Built by [Dappily](https://dappily.io) 🦞
@@ -0,0 +1,4 @@
1
+ import { Action } from "../types/action";
2
+ declare const associateTokenAction: Action;
3
+ export default associateTokenAction;
4
+ //# sourceMappingURL=associate_token.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"associate_token.d.ts","sourceRoot":"","sources":["../../src/actions/associate_token.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAgB,MAAM,iBAAiB,CAAC;AAQvD,QAAA,MAAM,oBAAoB,EAAE,MAyL3B,CAAC;AAEF,eAAe,oBAAoB,CAAC"}
@@ -0,0 +1,156 @@
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 associateTokenAction = {
6
+ name: "ASSOCIATE_TOKEN",
7
+ similes: [
8
+ "associate token",
9
+ "link token",
10
+ "add token",
11
+ "enable token",
12
+ "opt in token",
13
+ "connect token",
14
+ ],
15
+ description: "Associate a token with a Hedera account so it can receive that token. On Hedera, accounts must explicitly opt-in to receive tokens. If no accountId is provided, associates with the agent's operator account. For third-party accounts, a private key is required (short-term; wallet signing planned).",
16
+ examples: [
17
+ [
18
+ {
19
+ input: {
20
+ tokenId: "0.0.99999",
21
+ },
22
+ output: {
23
+ ok: true,
24
+ summary: "Associated token 0.0.99999 with account 0.0.12345",
25
+ txId: "0.0.12345@1700000000.000000000",
26
+ receipt: { status: "SUCCESS" },
27
+ data: {
28
+ tokenId: "0.0.99999",
29
+ accountId: "0.0.12345",
30
+ explorerUrl: "https://hashscan.io/testnet/transaction/...",
31
+ },
32
+ },
33
+ explanation: "Associate a token with the agent's own account",
34
+ },
35
+ ],
36
+ [
37
+ {
38
+ input: {
39
+ tokenId: "0.0.99999",
40
+ accountId: "0.0.54321",
41
+ accountPrivateKey: "302e020100300506...hex...",
42
+ },
43
+ output: {
44
+ ok: true,
45
+ summary: "Associated token 0.0.99999 with account 0.0.54321",
46
+ txId: "0.0.12345@1700000000.000000000",
47
+ receipt: { status: "SUCCESS" },
48
+ data: {
49
+ tokenId: "0.0.99999",
50
+ accountId: "0.0.54321",
51
+ explorerUrl: "https://hashscan.io/testnet/transaction/...",
52
+ },
53
+ },
54
+ explanation: "Associate a token with a third-party account using their private key",
55
+ },
56
+ ],
57
+ ],
58
+ schema: zod_1.z.object({
59
+ tokenId: zod_1.z
60
+ .string()
61
+ .regex(/^\d+\.\d+\.\d+$/, "Invalid Hedera Token ID format (must be 0.0.X)")
62
+ .describe("The token ID to associate (e.g. 0.0.99999)"),
63
+ accountId: zod_1.z
64
+ .string()
65
+ .regex(/^\d+\.\d+\.\d+$/, "Invalid Hedera Account ID format (must be 0.0.X)")
66
+ .optional()
67
+ .describe("The account to associate the token with. Defaults to the agent's operator account."),
68
+ accountPrivateKey: zod_1.z
69
+ .string()
70
+ .optional()
71
+ .describe("⚠️ Private key of the target account (required for third-party accounts). Will be replaced by wallet signing in a future version."),
72
+ }),
73
+ requiresConfirmation: true,
74
+ simulate: async (agent, input) => {
75
+ const targetAccount = input.accountId || agent.accountId.toString();
76
+ const isThirdParty = input.accountId && input.accountId !== agent.accountId.toString();
77
+ const warnings = [];
78
+ if (isThirdParty && !input.accountPrivateKey) {
79
+ warnings.push("Third-party account requires a private key. The transaction will fail without it.");
80
+ }
81
+ return {
82
+ summary: `Associate token ${input.tokenId} with account ${targetAccount}`,
83
+ estimatedFeeHbar: 0.05,
84
+ warnings,
85
+ };
86
+ },
87
+ handler: async (agent, input) => {
88
+ try {
89
+ const targetAccountId = input.accountId
90
+ ? sdk_1.AccountId.fromString(input.accountId)
91
+ : agent.accountId;
92
+ const isThirdParty = input.accountId &&
93
+ input.accountId !== agent.accountId.toString();
94
+ // If third-party account but no key provided, fail early with guidance
95
+ if (isThirdParty && !input.accountPrivateKey) {
96
+ return {
97
+ ok: false,
98
+ error: "SIGNATURE_REQUIRED",
99
+ details: `Account ${input.accountId} is not the agent's operator. Provide 'accountPrivateKey' or have the account owner sign via a wallet.`,
100
+ };
101
+ }
102
+ const tx = new sdk_1.TokenAssociateTransaction()
103
+ .setAccountId(targetAccountId)
104
+ .setTokenIds([input.tokenId]);
105
+ // Freeze the transaction before signing
106
+ const frozenTx = await tx.freezeWith(agent.client);
107
+ // Sign with the target account's key
108
+ if (isThirdParty && input.accountPrivateKey) {
109
+ const thirdPartyKey = sdk_1.PrivateKey.fromString(input.accountPrivateKey);
110
+ await frozenTx.sign(thirdPartyKey);
111
+ }
112
+ const response = await frozenTx.execute(agent.client);
113
+ const receipt = await response.getReceipt(agent.client);
114
+ if (receipt.status !== sdk_1.Status.Success) {
115
+ return {
116
+ ok: false,
117
+ error: receipt.status.toString(),
118
+ details: `Token association failed with status: ${receipt.status.toString()}`,
119
+ };
120
+ }
121
+ const txId = response.transactionId.toString();
122
+ return {
123
+ ok: true,
124
+ summary: `Associated token ${input.tokenId} with account ${targetAccountId.toString()}`,
125
+ txId,
126
+ receipt: {
127
+ status: receipt.status.toString(),
128
+ },
129
+ data: {
130
+ tokenId: input.tokenId,
131
+ accountId: targetAccountId.toString(),
132
+ explorerUrl: agent.getExplorerUrl(txId),
133
+ },
134
+ };
135
+ }
136
+ catch (err) {
137
+ const message = err instanceof Error ? err.message : String(err);
138
+ const knownErrors = {
139
+ TOKEN_ALREADY_ASSOCIATED_TO_ACCOUNT: "This token is already associated with this account.",
140
+ INVALID_ACCOUNT_ID: "The account ID does not exist on this network.",
141
+ INVALID_TOKEN_ID: "The token ID does not exist on this network.",
142
+ TOKENS_PER_ACCOUNT_LIMIT_EXCEEDED: "This account has reached its maximum token association limit.",
143
+ INVALID_SIGNATURE: "Transaction signature is invalid. Check the private key provided.",
144
+ INSUFFICIENT_PAYER_BALANCE: "Not enough HBAR to cover the transaction fee.",
145
+ };
146
+ const errorCode = Object.keys(knownErrors).find((code) => message.includes(code));
147
+ return {
148
+ ok: false,
149
+ error: errorCode || "ASSOCIATE_TOKEN_FAILED",
150
+ details: errorCode ? knownErrors[errorCode] : message,
151
+ };
152
+ }
153
+ },
154
+ };
155
+ exports.default = associateTokenAction;
156
+ //# sourceMappingURL=associate_token.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"associate_token.js","sourceRoot":"","sources":["../../src/actions/associate_token.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { Action } from "../types/action";
2
+ declare const burnNftAction: Action;
3
+ export default burnNftAction;
4
+ //# sourceMappingURL=burn_nft.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"burn_nft.d.ts","sourceRoot":"","sources":["../../src/actions/burn_nft.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAgB,MAAM,iBAAiB,CAAC;AAOvD,QAAA,MAAM,aAAa,EAAE,MAuIpB,CAAC;AAEF,eAAe,aAAa,CAAC"}
@@ -0,0 +1,123 @@
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 burnNftAction = {
6
+ name: "BURN_NFT",
7
+ similes: [
8
+ "burn nft",
9
+ "destroy nft",
10
+ "delete nft",
11
+ "remove nft",
12
+ "nft burn",
13
+ ],
14
+ description: "Permanently burn an NFT by serial number from the treasury account. This is irreversible. The collection must have a supply key. The NFT must be owned by the treasury.",
15
+ examples: [
16
+ [
17
+ {
18
+ input: {
19
+ tokenId: "0.0.88888",
20
+ serial: 3,
21
+ },
22
+ output: {
23
+ ok: true,
24
+ summary: "Burned NFT 0.0.88888 #3",
25
+ txId: "0.0.12345@1700000000.000000000",
26
+ receipt: { status: "SUCCESS" },
27
+ data: {
28
+ tokenId: "0.0.88888",
29
+ serial: 3,
30
+ explorerUrl: "https://hashscan.io/testnet/transaction/...",
31
+ },
32
+ },
33
+ explanation: "Permanently burn NFT serial #3 from the treasury",
34
+ },
35
+ ],
36
+ ],
37
+ schema: zod_1.z.object({
38
+ tokenId: zod_1.z
39
+ .string()
40
+ .regex(/^\d+\.\d+\.\d+$/, "Invalid Hedera Token ID format (must be 0.0.X)")
41
+ .describe("The NFT collection token ID"),
42
+ serial: zod_1.z
43
+ .number()
44
+ .int()
45
+ .positive()
46
+ .describe("The serial number of the NFT to burn"),
47
+ memo: zod_1.z
48
+ .string()
49
+ .max(100)
50
+ .optional()
51
+ .describe("Optional transaction memo"),
52
+ supplyPrivateKey: zod_1.z
53
+ .string()
54
+ .optional()
55
+ .describe("⚠️ Supply key (only if different from operator key)"),
56
+ }),
57
+ requiresConfirmation: true,
58
+ simulate: async (_agent, input) => {
59
+ return {
60
+ summary: `Burn NFT ${input.tokenId} #${input.serial}`,
61
+ estimatedFeeHbar: 0.001,
62
+ warnings: [
63
+ "⚠️ NFT burns are irreversible. This serial number will be permanently destroyed.",
64
+ ],
65
+ };
66
+ },
67
+ handler: async (agent, input) => {
68
+ try {
69
+ const tx = new sdk_1.TokenBurnTransaction()
70
+ .setTokenId(input.tokenId)
71
+ .setSerials([input.serial]);
72
+ if (input.memo) {
73
+ tx.setTransactionMemo(input.memo);
74
+ }
75
+ const frozenTx = await tx.freezeWith(agent.client);
76
+ if (input.supplyPrivateKey) {
77
+ const supplyKey = sdk_1.PrivateKey.fromString(input.supplyPrivateKey);
78
+ await frozenTx.sign(supplyKey);
79
+ }
80
+ const response = await frozenTx.execute(agent.client);
81
+ const receipt = await response.getReceipt(agent.client);
82
+ if (receipt.status !== sdk_1.Status.Success) {
83
+ return {
84
+ ok: false,
85
+ error: receipt.status.toString(),
86
+ details: `NFT burn failed with status: ${receipt.status.toString()}`,
87
+ };
88
+ }
89
+ const txId = response.transactionId.toString();
90
+ return {
91
+ ok: true,
92
+ summary: `Burned NFT ${input.tokenId} #${input.serial}`,
93
+ txId,
94
+ receipt: { status: receipt.status.toString() },
95
+ data: {
96
+ tokenId: input.tokenId,
97
+ serial: input.serial,
98
+ explorerUrl: agent.getExplorerUrl(txId),
99
+ },
100
+ };
101
+ }
102
+ catch (err) {
103
+ const message = err instanceof Error ? err.message : String(err);
104
+ const knownErrors = {
105
+ TOKEN_HAS_NO_SUPPLY_KEY: "This collection has no supply key. Burning is permanently disabled.",
106
+ INVALID_SIGNATURE: "Transaction signature is invalid. The supply key doesn't match.",
107
+ INVALID_TOKEN_ID: "The token ID does not exist on this network.",
108
+ INVALID_NFT_ID: "The specified NFT serial does not exist in this collection.",
109
+ SENDER_DOES_NOT_OWN_NFT_SERIAL_NO: "The treasury does not own this NFT serial. Only treasury-held NFTs can be burned.",
110
+ TOKEN_WAS_DELETED: "This collection has been deleted.",
111
+ INSUFFICIENT_PAYER_BALANCE: "Not enough HBAR to cover the transaction fee.",
112
+ };
113
+ const errorCode = Object.keys(knownErrors).find((code) => message.includes(code));
114
+ return {
115
+ ok: false,
116
+ error: errorCode || "BURN_NFT_FAILED",
117
+ details: errorCode ? knownErrors[errorCode] : message,
118
+ };
119
+ }
120
+ },
121
+ };
122
+ exports.default = burnNftAction;
123
+ //# sourceMappingURL=burn_nft.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"burn_nft.js","sourceRoot":"","sources":["../../src/actions/burn_nft.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { Action } from "../types/action";
2
+ declare const burnTokenAction: Action;
3
+ export default burnTokenAction;
4
+ //# sourceMappingURL=burn_token.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"burn_token.d.ts","sourceRoot":"","sources":["../../src/actions/burn_token.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAgB,MAAM,iBAAiB,CAAC;AAOvD,QAAA,MAAM,eAAe,EAAE,MAqKtB,CAAC;AAEF,eAAe,eAAe,CAAC"}