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
@@ -0,0 +1,17 @@
1
+ import getBalanceAction from "./get_balance";
2
+ import hbarTransferAction from "./transfer";
3
+ import createTokenAction from "./create_token";
4
+ import associateTokenAction from "./associate_token";
5
+ import transferTokenAction from "./transfer_token";
6
+ import mintTokenAction from "./mint_token";
7
+ import burnTokenAction from "./burn_token";
8
+ import createNftCollectionAction from "./create_nft_collection";
9
+ import mintNftAction from "./mint_nft";
10
+ import transferNftAction from "./transfer_nft";
11
+ import burnNftAction from "./burn_nft";
12
+ import { Action } from "../types/action";
13
+ export declare const actions: Action[];
14
+ export { getBalanceAction, hbarTransferAction, createTokenAction, associateTokenAction, transferTokenAction, mintTokenAction, burnTokenAction, createNftCollectionAction, mintNftAction, transferNftAction, burnNftAction, };
15
+ export declare function getActionByName(name: string): Action | undefined;
16
+ export declare function findActionBySimile(query: string): Action | undefined;
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/actions/index.ts"],"names":[],"mappings":"AAIA,OAAO,gBAAgB,MAAM,eAAe,CAAC;AAC7C,OAAO,kBAAkB,MAAM,YAAY,CAAC;AAG5C,OAAO,iBAAiB,MAAM,gBAAgB,CAAC;AAC/C,OAAO,oBAAoB,MAAM,mBAAmB,CAAC;AACrD,OAAO,mBAAmB,MAAM,kBAAkB,CAAC;AACnD,OAAO,eAAe,MAAM,cAAc,CAAC;AAC3C,OAAO,eAAe,MAAM,cAAc,CAAC;AAG3C,OAAO,yBAAyB,MAAM,yBAAyB,CAAC;AAChE,OAAO,aAAa,MAAM,YAAY,CAAC;AACvC,OAAO,iBAAiB,MAAM,gBAAgB,CAAC;AAC/C,OAAO,aAAa,MAAM,YAAY,CAAC;AAEvC,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAGzC,eAAO,MAAM,OAAO,EAAE,MAAM,EAe3B,CAAC;AAGF,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,iBAAiB,EACjB,oBAAoB,EACpB,mBAAmB,EACnB,eAAe,EACf,eAAe,EACf,yBAAyB,EACzB,aAAa,EACb,iBAAiB,EACjB,aAAa,GACd,CAAC;AAGF,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAEhE;AAGD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAmBpE"}
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+ // ── Dappily Agent Kit: Action Registry ──────────────────────────
3
+ // All actions are exported here for easy consumption by agent runners.
4
+ var __importDefault = (this && this.__importDefault) || function (mod) {
5
+ return (mod && mod.__esModule) ? mod : { "default": mod };
6
+ };
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.burnNftAction = exports.transferNftAction = exports.mintNftAction = exports.createNftCollectionAction = exports.burnTokenAction = exports.mintTokenAction = exports.transferTokenAction = exports.associateTokenAction = exports.createTokenAction = exports.hbarTransferAction = exports.getBalanceAction = exports.actions = void 0;
9
+ exports.getActionByName = getActionByName;
10
+ exports.findActionBySimile = findActionBySimile;
11
+ // Core
12
+ const get_balance_1 = __importDefault(require("./get_balance"));
13
+ exports.getBalanceAction = get_balance_1.default;
14
+ const transfer_1 = __importDefault(require("./transfer"));
15
+ exports.hbarTransferAction = transfer_1.default;
16
+ // Fungible Tokens (HTS)
17
+ const create_token_1 = __importDefault(require("./create_token"));
18
+ exports.createTokenAction = create_token_1.default;
19
+ const associate_token_1 = __importDefault(require("./associate_token"));
20
+ exports.associateTokenAction = associate_token_1.default;
21
+ const transfer_token_1 = __importDefault(require("./transfer_token"));
22
+ exports.transferTokenAction = transfer_token_1.default;
23
+ const mint_token_1 = __importDefault(require("./mint_token"));
24
+ exports.mintTokenAction = mint_token_1.default;
25
+ const burn_token_1 = __importDefault(require("./burn_token"));
26
+ exports.burnTokenAction = burn_token_1.default;
27
+ // NFTs (HTS)
28
+ const create_nft_collection_1 = __importDefault(require("./create_nft_collection"));
29
+ exports.createNftCollectionAction = create_nft_collection_1.default;
30
+ const mint_nft_1 = __importDefault(require("./mint_nft"));
31
+ exports.mintNftAction = mint_nft_1.default;
32
+ const transfer_nft_1 = __importDefault(require("./transfer_nft"));
33
+ exports.transferNftAction = transfer_nft_1.default;
34
+ const burn_nft_1 = __importDefault(require("./burn_nft"));
35
+ exports.burnNftAction = burn_nft_1.default;
36
+ // Master list — order matters for display, not execution
37
+ exports.actions = [
38
+ // Core
39
+ get_balance_1.default,
40
+ transfer_1.default,
41
+ // Fungible
42
+ create_token_1.default,
43
+ associate_token_1.default,
44
+ transfer_token_1.default,
45
+ mint_token_1.default,
46
+ burn_token_1.default,
47
+ // NFT
48
+ create_nft_collection_1.default,
49
+ mint_nft_1.default,
50
+ transfer_nft_1.default,
51
+ burn_nft_1.default,
52
+ ];
53
+ // Lookup by name
54
+ function getActionByName(name) {
55
+ return exports.actions.find((a) => a.name === name);
56
+ }
57
+ // Fuzzy match by simile — scores by how many simile words appear in the query
58
+ function findActionBySimile(query) {
59
+ const q = query.toLowerCase();
60
+ let bestAction;
61
+ let bestScore = 0;
62
+ for (const action of exports.actions) {
63
+ for (const simile of action.similes) {
64
+ const sWords = simile.toLowerCase().split(/\s+/);
65
+ const matched = sWords.filter((w) => q.includes(w)).length;
66
+ const score = matched / sWords.length; // % of simile words found in query
67
+ if (score > bestScore) {
68
+ bestScore = score;
69
+ bestAction = action;
70
+ }
71
+ }
72
+ }
73
+ // Require at least 50% word overlap to count as a match
74
+ return bestScore >= 0.5 ? bestAction : undefined;
75
+ }
76
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/actions/index.ts"],"names":[],"mappings":";AAAA,mEAAmE;AACnE,uEAAuE;;;;;;AAuDvE,0CAEC;AAGD,gDAmBC;AA7ED,OAAO;AACP,gEAA6C;AAsC3C,2BAtCK,qBAAgB,CAsCL;AArClB,0DAA4C;AAsC1C,6BAtCK,kBAAkB,CAsCL;AApCpB,wBAAwB;AACxB,kEAA+C;AAoC7C,4BApCK,sBAAiB,CAoCL;AAnCnB,wEAAqD;AAoCnD,+BApCK,yBAAoB,CAoCL;AAnCtB,sEAAmD;AAoCjD,8BApCK,wBAAmB,CAoCL;AAnCrB,8DAA2C;AAoCzC,0BApCK,oBAAe,CAoCL;AAnCjB,8DAA2C;AAoCzC,0BApCK,oBAAe,CAoCL;AAlCjB,aAAa;AACb,oFAAgE;AAkC9D,oCAlCK,+BAAyB,CAkCL;AAjC3B,0DAAuC;AAkCrC,wBAlCK,kBAAa,CAkCL;AAjCf,kEAA+C;AAkC7C,4BAlCK,sBAAiB,CAkCL;AAjCnB,0DAAuC;AAkCrC,wBAlCK,kBAAa,CAkCL;AA9Bf,yDAAyD;AAC5C,QAAA,OAAO,GAAa;IAC/B,OAAO;IACP,qBAAgB;IAChB,kBAAkB;IAClB,WAAW;IACX,sBAAiB;IACjB,yBAAoB;IACpB,wBAAmB;IACnB,oBAAe;IACf,oBAAe;IACf,MAAM;IACN,+BAAyB;IACzB,kBAAa;IACb,sBAAiB;IACjB,kBAAa;CACd,CAAC;AAiBF,iBAAiB;AACjB,SAAgB,eAAe,CAAC,IAAY;IAC1C,OAAO,eAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AAC9C,CAAC;AAED,8EAA8E;AAC9E,SAAgB,kBAAkB,CAAC,KAAa;IAC9C,MAAM,CAAC,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IAC9B,IAAI,UAA8B,CAAC;IACnC,IAAI,SAAS,GAAG,CAAC,CAAC;IAElB,KAAK,MAAM,MAAM,IAAI,eAAO,EAAE,CAAC;QAC7B,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACpC,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACjD,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;YAC3D,MAAM,KAAK,GAAG,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,mCAAmC;YAC1E,IAAI,KAAK,GAAG,SAAS,EAAE,CAAC;gBACtB,SAAS,GAAG,KAAK,CAAC;gBAClB,UAAU,GAAG,MAAM,CAAC;YACtB,CAAC;QACH,CAAC;IACH,CAAC;IAED,wDAAwD;IACxD,OAAO,SAAS,IAAI,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;AACnD,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { Action } from "../types/action";
2
+ declare const mintNftAction: Action;
3
+ export default mintNftAction;
4
+ //# sourceMappingURL=mint_nft.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mint_nft.d.ts","sourceRoot":"","sources":["../../src/actions/mint_nft.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAgB,MAAM,iBAAiB,CAAC;AAqBvD,QAAA,MAAM,aAAa,EAAE,MAyKpB,CAAC;AAEF,eAAe,aAAa,CAAC"}
@@ -0,0 +1,162 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const zod_1 = require("zod");
4
+ const sdk_1 = require("@hashgraph/sdk");
5
+ // HTS limit: 100 bytes per NFT metadata
6
+ const MAX_METADATA_BYTES = 100;
7
+ // Sane per-transaction cap
8
+ const MAX_NFTS_PER_TX = 10;
9
+ /**
10
+ * Decode a base64 string to Uint8Array.
11
+ * Accepts raw base64 or "b64:..." prefix.
12
+ */
13
+ function decodeMetadata(input) {
14
+ const raw = input.startsWith("b64:") ? input.slice(4) : input;
15
+ return Buffer.from(raw, "base64");
16
+ }
17
+ const mintNftAction = {
18
+ name: "MINT_NFT",
19
+ similes: [
20
+ "mint nft",
21
+ "mint nfts",
22
+ "create nft",
23
+ "issue nft",
24
+ "add nft",
25
+ "nft mint",
26
+ ],
27
+ description: "Mint one or more NFTs in an existing collection. Each NFT gets its own metadata (base64-encoded, max 100 bytes each). Returns the serial numbers of the newly minted NFTs. The token must have a supply key.",
28
+ examples: [
29
+ [
30
+ {
31
+ input: {
32
+ tokenId: "0.0.88888",
33
+ metadata: ["SGVsbG8gV29ybGQ=", "RGFwcGlseSBORlQ="],
34
+ },
35
+ output: {
36
+ ok: true,
37
+ summary: "Minted 2 NFTs in collection 0.0.88888 (serials: 1, 2)",
38
+ txId: "0.0.12345@1700000000.000000000",
39
+ receipt: { status: "SUCCESS" },
40
+ data: {
41
+ tokenId: "0.0.88888",
42
+ serials: [1, 2],
43
+ count: 2,
44
+ explorerUrl: "https://hashscan.io/testnet/transaction/...",
45
+ },
46
+ },
47
+ explanation: "Mint 2 NFTs with base64-encoded metadata",
48
+ },
49
+ ],
50
+ ],
51
+ schema: zod_1.z.object({
52
+ tokenId: zod_1.z
53
+ .string()
54
+ .regex(/^\d+\.\d+\.\d+$/, "Invalid Hedera Token ID format (must be 0.0.X)")
55
+ .describe("The NFT collection token ID"),
56
+ metadata: zod_1.z
57
+ .array(zod_1.z.string())
58
+ .min(1)
59
+ .max(MAX_NFTS_PER_TX)
60
+ .describe(`Array of base64-encoded metadata strings (1-${MAX_NFTS_PER_TX} per transaction, max ${MAX_METADATA_BYTES} bytes each)`),
61
+ memo: zod_1.z
62
+ .string()
63
+ .max(100)
64
+ .optional()
65
+ .describe("Optional transaction memo"),
66
+ supplyPrivateKey: zod_1.z
67
+ .string()
68
+ .optional()
69
+ .describe("⚠️ Supply key (only if different from operator key)"),
70
+ }),
71
+ requiresConfirmation: true,
72
+ simulate: async (_agent, input) => {
73
+ const warnings = [];
74
+ const count = input.metadata.length;
75
+ if (count > MAX_NFTS_PER_TX) {
76
+ warnings.push(`Minting ${count} NFTs exceeds the recommended ${MAX_NFTS_PER_TX} per transaction. Consider batching.`);
77
+ }
78
+ return {
79
+ summary: `Mint ${count} NFT${count > 1 ? "s" : ""} in collection ${input.tokenId}`,
80
+ estimatedFeeHbar: 0.02 * count,
81
+ warnings,
82
+ };
83
+ },
84
+ handler: async (agent, input) => {
85
+ // ── Pre-flight: validate metadata sizes ──
86
+ const decodedMetadata = [];
87
+ for (let i = 0; i < input.metadata.length; i++) {
88
+ const bytes = decodeMetadata(input.metadata[i]);
89
+ if (bytes.length > MAX_METADATA_BYTES) {
90
+ return {
91
+ ok: false,
92
+ error: "METADATA_TOO_LARGE",
93
+ details: `Metadata at index ${i} is ${bytes.length} bytes (max ${MAX_METADATA_BYTES}). Shorten it or use an IPFS CID hash instead.`,
94
+ };
95
+ }
96
+ if (bytes.length === 0) {
97
+ return {
98
+ ok: false,
99
+ error: "METADATA_EMPTY",
100
+ details: `Metadata at index ${i} decoded to 0 bytes. Provide valid base64-encoded content.`,
101
+ };
102
+ }
103
+ decodedMetadata.push(bytes);
104
+ }
105
+ try {
106
+ const tx = new sdk_1.TokenMintTransaction()
107
+ .setTokenId(input.tokenId)
108
+ .setMetadata(decodedMetadata);
109
+ if (input.memo) {
110
+ tx.setTransactionMemo(input.memo);
111
+ }
112
+ const frozenTx = await tx.freezeWith(agent.client);
113
+ if (input.supplyPrivateKey) {
114
+ const supplyKey = sdk_1.PrivateKey.fromString(input.supplyPrivateKey);
115
+ await frozenTx.sign(supplyKey);
116
+ }
117
+ const response = await frozenTx.execute(agent.client);
118
+ const receipt = await response.getReceipt(agent.client);
119
+ if (receipt.status !== sdk_1.Status.Success) {
120
+ return {
121
+ ok: false,
122
+ error: receipt.status.toString(),
123
+ details: `NFT mint failed with status: ${receipt.status.toString()}`,
124
+ };
125
+ }
126
+ const serials = (receipt.serials || []).map((s) => Number(s.toString()));
127
+ const txId = response.transactionId.toString();
128
+ return {
129
+ ok: true,
130
+ summary: `Minted ${serials.length} NFT${serials.length > 1 ? "s" : ""} in collection ${input.tokenId} (serials: ${serials.join(", ")})`,
131
+ txId,
132
+ receipt: { status: receipt.status.toString() },
133
+ data: {
134
+ tokenId: input.tokenId,
135
+ serials,
136
+ count: serials.length,
137
+ explorerUrl: agent.getExplorerUrl(txId),
138
+ },
139
+ };
140
+ }
141
+ catch (err) {
142
+ const message = err instanceof Error ? err.message : String(err);
143
+ const knownErrors = {
144
+ TOKEN_HAS_NO_SUPPLY_KEY: "This collection has no supply key. NFT minting is permanently disabled.",
145
+ INVALID_SIGNATURE: "Transaction signature is invalid. The supply key doesn't match.",
146
+ INVALID_TOKEN_ID: "The token ID does not exist on this network.",
147
+ TOKEN_WAS_DELETED: "This collection has been deleted.",
148
+ TOKEN_MAX_SUPPLY_REACHED: "This collection has reached its maximum supply cap.",
149
+ MAX_NFTS_IN_PRICE_REGIME_HAVE_BEEN_MINTED: "Network-level NFT minting limit reached for this price regime.",
150
+ INSUFFICIENT_PAYER_BALANCE: "Not enough HBAR to cover the mint fee.",
151
+ };
152
+ const errorCode = Object.keys(knownErrors).find((code) => message.includes(code));
153
+ return {
154
+ ok: false,
155
+ error: errorCode || "MINT_NFT_FAILED",
156
+ details: errorCode ? knownErrors[errorCode] : message,
157
+ };
158
+ }
159
+ },
160
+ };
161
+ exports.default = mintNftAction;
162
+ //# sourceMappingURL=mint_nft.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mint_nft.js","sourceRoot":"","sources":["../../src/actions/mint_nft.ts"],"names":[],"mappings":";;AAAA,6BAAwB;AAExB,wCAIwB;AAExB,wCAAwC;AACxC,MAAM,kBAAkB,GAAG,GAAG,CAAC;AAC/B,2BAA2B;AAC3B,MAAM,eAAe,GAAG,EAAE,CAAC;AAE3B;;;GAGG;AACH,SAAS,cAAc,CAAC,KAAa;IACnC,MAAM,GAAG,GAAG,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAC9D,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,aAAa,GAAW;IAC5B,IAAI,EAAE,UAAU;IAChB,OAAO,EAAE;QACP,UAAU;QACV,WAAW;QACX,YAAY;QACZ,WAAW;QACX,SAAS;QACT,UAAU;KACX;IACD,WAAW,EACT,8MAA8M;IAChN,QAAQ,EAAE;QACR;YACE;gBACE,KAAK,EAAE;oBACL,OAAO,EAAE,WAAW;oBACpB,QAAQ,EAAE,CAAC,kBAAkB,EAAE,kBAAkB,CAAC;iBACnD;gBACD,MAAM,EAAE;oBACN,EAAE,EAAE,IAAI;oBACR,OAAO,EAAE,uDAAuD;oBAChE,IAAI,EAAE,gCAAgC;oBACtC,OAAO,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE;oBAC9B,IAAI,EAAE;wBACJ,OAAO,EAAE,WAAW;wBACpB,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;wBACf,KAAK,EAAE,CAAC;wBACR,WAAW,EAAE,6CAA6C;qBAC3D;iBACF;gBACD,WAAW,EAAE,0CAA0C;aACxD;SACF;KACF;IACD,MAAM,EAAE,OAAC,CAAC,MAAM,CAAC;QACf,OAAO,EAAE,OAAC;aACP,MAAM,EAAE;aACR,KAAK,CAAC,iBAAiB,EAAE,gDAAgD,CAAC;aAC1E,QAAQ,CAAC,6BAA6B,CAAC;QAC1C,QAAQ,EAAE,OAAC;aACR,KAAK,CAAC,OAAC,CAAC,MAAM,EAAE,CAAC;aACjB,GAAG,CAAC,CAAC,CAAC;aACN,GAAG,CAAC,eAAe,CAAC;aACpB,QAAQ,CACP,+CAA+C,eAAe,yBAAyB,kBAAkB,cAAc,CACxH;QACH,IAAI,EAAE,OAAC;aACJ,MAAM,EAAE;aACR,GAAG,CAAC,GAAG,CAAC;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,2BAA2B,CAAC;QACxC,gBAAgB,EAAE,OAAC;aAChB,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,qDAAqD,CAAC;KACnE,CAAC;IACF,oBAAoB,EAAE,IAAI;IAC1B,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE;QAChC,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;QAEpC,IAAI,KAAK,GAAG,eAAe,EAAE,CAAC;YAC5B,QAAQ,CAAC,IAAI,CACX,WAAW,KAAK,iCAAiC,eAAe,sCAAsC,CACvG,CAAC;QACJ,CAAC;QAED,OAAO;YACL,OAAO,EAAE,QAAQ,KAAK,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,kBAAkB,KAAK,CAAC,OAAO,EAAE;YAClF,gBAAgB,EAAE,IAAI,GAAG,KAAK;YAC9B,QAAQ;SACT,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAyB,EAAE;QACrD,4CAA4C;QAC5C,MAAM,eAAe,GAAiB,EAAE,CAAC;QACzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC/C,MAAM,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;YAChD,IAAI,KAAK,CAAC,MAAM,GAAG,kBAAkB,EAAE,CAAC;gBACtC,OAAO;oBACL,EAAE,EAAE,KAAK;oBACT,KAAK,EAAE,oBAAoB;oBAC3B,OAAO,EAAE,qBAAqB,CAAC,OAAO,KAAK,CAAC,MAAM,eAAe,kBAAkB,gDAAgD;iBACpI,CAAC;YACJ,CAAC;YACD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvB,OAAO;oBACL,EAAE,EAAE,KAAK;oBACT,KAAK,EAAE,gBAAgB;oBACvB,OAAO,EAAE,qBAAqB,CAAC,4DAA4D;iBAC5F,CAAC;YACJ,CAAC;YACD,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC;QAED,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,IAAI,0BAAoB,EAAE;iBAClC,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC;iBACzB,WAAW,CAAC,eAAe,CAAC,CAAC;YAEhC,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;gBACf,EAAE,CAAC,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACpC,CAAC;YAED,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,MAAa,CAAC,CAAC;YAE1D,IAAI,KAAK,CAAC,gBAAgB,EAAE,CAAC;gBAC3B,MAAM,SAAS,GAAG,gBAAU,CAAC,UAAU,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;gBAChE,MAAM,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACjC,CAAC;YAED,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,MAAa,CAAC,CAAC;YAC7D,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,MAAa,CAAC,CAAC;YAE/D,IAAI,OAAO,CAAC,MAAM,KAAK,YAAM,CAAC,OAAO,EAAE,CAAC;gBACtC,OAAO;oBACL,EAAE,EAAE,KAAK;oBACT,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE;oBAChC,OAAO,EAAE,gCAAgC,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE;iBACrE,CAAC;YACJ,CAAC;YAED,MAAM,OAAO,GAAG,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;YACzE,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC;YAE/C,OAAO;gBACL,EAAE,EAAE,IAAI;gBACR,OAAO,EAAE,UAAU,OAAO,CAAC,MAAM,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,kBAAkB,KAAK,CAAC,OAAO,cAAc,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;gBACvI,IAAI;gBACJ,OAAO,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE;gBAC9C,IAAI,EAAE;oBACJ,OAAO,EAAE,KAAK,CAAC,OAAO;oBACtB,OAAO;oBACP,KAAK,EAAE,OAAO,CAAC,MAAM;oBACrB,WAAW,EAAE,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC;iBACxC;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAEjE,MAAM,WAAW,GAA2B;gBAC1C,uBAAuB,EACrB,yEAAyE;gBAC3E,iBAAiB,EACf,iEAAiE;gBACnE,gBAAgB,EACd,8CAA8C;gBAChD,iBAAiB,EACf,mCAAmC;gBACrC,wBAAwB,EACtB,qDAAqD;gBACvD,yCAAyC,EACvC,gEAAgE;gBAClE,0BAA0B,EACxB,wCAAwC;aAC3C,CAAC;YAEF,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CACvD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CACvB,CAAC;YAEF,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE,SAAS,IAAI,iBAAiB;gBACrC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO;aACtD,CAAC;QACJ,CAAC;IACH,CAAC;CACF,CAAC;AAEF,kBAAe,aAAa,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { Action } from "../types/action";
2
+ declare const mintTokenAction: Action;
3
+ export default mintTokenAction;
4
+ //# sourceMappingURL=mint_token.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mint_token.d.ts","sourceRoot":"","sources":["../../src/actions/mint_token.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAgB,MAAM,iBAAiB,CAAC;AAOvD,QAAA,MAAM,eAAe,EAAE,MAyItB,CAAC;AAEF,eAAe,eAAe,CAAC"}
@@ -0,0 +1,127 @@
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 mintTokenAction = {
6
+ name: "MINT_TOKEN",
7
+ similes: [
8
+ "mint token",
9
+ "mint tokens",
10
+ "increase supply",
11
+ "create more tokens",
12
+ "add supply",
13
+ ],
14
+ description: "Mint additional fungible tokens, increasing the total supply. The token must have been created with a supply key. By default, the agent's operator key is used to sign. For tokens where the supply key differs, provide it via supplyPrivateKey.",
15
+ examples: [
16
+ [
17
+ {
18
+ input: {
19
+ tokenId: "0.0.99999",
20
+ amount: 5000,
21
+ },
22
+ output: {
23
+ ok: true,
24
+ summary: "Minted 5,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
+ amountMinted: 5000,
30
+ newTotalSupply: "15000",
31
+ explorerUrl: "https://hashscan.io/testnet/transaction/...",
32
+ },
33
+ },
34
+ explanation: "Mint 5,000 additional tokens using the operator's supply key",
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 mint (e.g. 0.0.99999)"),
43
+ amount: zod_1.z
44
+ .number()
45
+ .int()
46
+ .positive()
47
+ .describe("Amount of tokens to mint (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
+ return {
61
+ summary: `Mint ${input.amount.toLocaleString()} of token ${input.tokenId}`,
62
+ estimatedFeeHbar: 0.001,
63
+ warnings: input.amount >= 1000000000
64
+ ? [`Very large mint: ${input.amount.toLocaleString()} units. Double-check this is intentional.`]
65
+ : [],
66
+ };
67
+ },
68
+ handler: async (agent, input) => {
69
+ try {
70
+ const tx = new sdk_1.TokenMintTransaction()
71
+ .setTokenId(input.tokenId)
72
+ .setAmount(input.amount);
73
+ if (input.memo) {
74
+ tx.setTransactionMemo(input.memo);
75
+ }
76
+ // Freeze before signing
77
+ const frozenTx = await tx.freezeWith(agent.client);
78
+ // Sign with custom supply key if provided
79
+ if (input.supplyPrivateKey) {
80
+ const supplyKey = sdk_1.PrivateKey.fromString(input.supplyPrivateKey);
81
+ await frozenTx.sign(supplyKey);
82
+ }
83
+ const response = await frozenTx.execute(agent.client);
84
+ const receipt = await response.getReceipt(agent.client);
85
+ if (receipt.status !== sdk_1.Status.Success) {
86
+ return {
87
+ ok: false,
88
+ error: receipt.status.toString(),
89
+ details: `Mint failed with status: ${receipt.status.toString()}`,
90
+ };
91
+ }
92
+ const txId = response.transactionId.toString();
93
+ return {
94
+ ok: true,
95
+ summary: `Minted ${input.amount.toLocaleString()} of token ${input.tokenId}`,
96
+ txId,
97
+ receipt: {
98
+ status: receipt.status.toString(),
99
+ },
100
+ data: {
101
+ tokenId: input.tokenId,
102
+ amountMinted: input.amount,
103
+ newTotalSupply: receipt.totalSupply?.toString() ?? "unknown",
104
+ explorerUrl: agent.getExplorerUrl(txId),
105
+ },
106
+ };
107
+ }
108
+ catch (err) {
109
+ const message = err instanceof Error ? err.message : String(err);
110
+ const knownErrors = {
111
+ TOKEN_HAS_NO_SUPPLY_KEY: "This token was created without a supply key. Minting is permanently disabled.",
112
+ INVALID_SIGNATURE: "Transaction signature is invalid. The supply key doesn't match.",
113
+ INVALID_TOKEN_ID: "The token ID does not exist on this network.",
114
+ TOKEN_WAS_DELETED: "This token has been deleted and can no longer be minted.",
115
+ INSUFFICIENT_PAYER_BALANCE: "Not enough HBAR to cover the transaction fee.",
116
+ };
117
+ const errorCode = Object.keys(knownErrors).find((code) => message.includes(code));
118
+ return {
119
+ ok: false,
120
+ error: errorCode || "MINT_TOKEN_FAILED",
121
+ details: errorCode ? knownErrors[errorCode] : message,
122
+ };
123
+ }
124
+ },
125
+ };
126
+ exports.default = mintTokenAction;
127
+ //# sourceMappingURL=mint_token.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mint_token.js","sourceRoot":"","sources":["../../src/actions/mint_token.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { Action } from "../types/action";
2
+ declare const hbarTransferAction: Action;
3
+ export default hbarTransferAction;
4
+ //# sourceMappingURL=transfer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transfer.d.ts","sourceRoot":"","sources":["../../src/actions/transfer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAgB,MAAM,iBAAiB,CAAC;AAQvD,QAAA,MAAM,kBAAkB,EAAE,MAkIzB,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
@@ -0,0 +1,118 @@
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 hbarTransferAction = {
6
+ name: "HBAR_TRANSFER",
7
+ similes: [
8
+ "send hbar",
9
+ "pay hbar",
10
+ "transfer hbar",
11
+ "send money",
12
+ "transfer funds",
13
+ "tip hbar",
14
+ ],
15
+ description: "Send HBAR (native cryptocurrency) to another Hedera account.",
16
+ examples: [
17
+ [
18
+ {
19
+ input: {
20
+ to: "0.0.12345",
21
+ amount: 10,
22
+ memo: "Payment for services",
23
+ },
24
+ output: {
25
+ ok: true,
26
+ summary: "Sent 10 HBAR to 0.0.12345",
27
+ txId: "0.0.98765@1700000000.000000000",
28
+ receipt: { status: "SUCCESS" },
29
+ data: {
30
+ from: "0.0.98765",
31
+ to: "0.0.12345",
32
+ amount: 10,
33
+ memo: "Payment for services",
34
+ explorerUrl: "https://hashscan.io/testnet/transaction/0-0-98765-1700000000-000000000",
35
+ },
36
+ },
37
+ explanation: "Send 10 HBAR to account 0.0.12345 with a memo",
38
+ },
39
+ ],
40
+ ],
41
+ schema: zod_1.z.object({
42
+ to: zod_1.z
43
+ .string()
44
+ .regex(/^\d+\.\d+\.\d+$/, "Invalid Hedera Account ID format (must be 0.0.X)")
45
+ .describe("The recipient's Hedera Account ID (e.g. 0.0.12345)"),
46
+ amount: zod_1.z.number().positive().describe("Amount of HBAR to send"),
47
+ memo: zod_1.z
48
+ .string()
49
+ .max(100)
50
+ .optional()
51
+ .describe("Optional memo for the transaction"),
52
+ }),
53
+ requiresConfirmation: true,
54
+ simulate: async (agent, input) => {
55
+ return {
56
+ summary: `Send ${input.amount} HBAR from ${agent.accountId.toString()} to ${input.to}`,
57
+ estimatedFeeHbar: 0.0001,
58
+ warnings: input.amount >= 100
59
+ ? [`Large transfer: ${input.amount} HBAR. Please double-check.`]
60
+ : [],
61
+ };
62
+ },
63
+ handler: async (agent, input) => {
64
+ try {
65
+ const recipient = sdk_1.AccountId.fromString(input.to);
66
+ const amount = new sdk_1.Hbar(input.amount);
67
+ const tx = new sdk_1.TransferTransaction()
68
+ .addHbarTransfer(agent.accountId, amount.negated())
69
+ .addHbarTransfer(recipient, amount);
70
+ if (input.memo) {
71
+ tx.setTransactionMemo(input.memo);
72
+ }
73
+ const response = await tx.execute(agent.client);
74
+ const receipt = await response.getReceipt(agent.client);
75
+ if (receipt.status !== sdk_1.Status.Success) {
76
+ return {
77
+ ok: false,
78
+ error: receipt.status.toString(),
79
+ details: `Transaction ${response.transactionId.toString()} failed with status: ${receipt.status.toString()}`,
80
+ };
81
+ }
82
+ const txId = response.transactionId.toString();
83
+ return {
84
+ ok: true,
85
+ summary: `Sent ${input.amount} HBAR to ${input.to}`,
86
+ txId,
87
+ receipt: {
88
+ status: receipt.status.toString(),
89
+ },
90
+ data: {
91
+ from: agent.accountId.toString(),
92
+ to: input.to,
93
+ amount: input.amount,
94
+ memo: input.memo || null,
95
+ explorerUrl: agent.getExplorerUrl(txId),
96
+ },
97
+ };
98
+ }
99
+ catch (err) {
100
+ const message = err instanceof Error ? err.message : String(err);
101
+ // Parse known Hedera error codes
102
+ const knownErrors = {
103
+ INSUFFICIENT_PAYER_BALANCE: "The sending account does not have enough HBAR.",
104
+ INVALID_ACCOUNT_ID: "The recipient account ID does not exist on this network.",
105
+ ACCOUNT_DELETED: "The recipient account has been deleted.",
106
+ INVALID_SIGNATURE: "Transaction signature is invalid. Check your private key.",
107
+ };
108
+ const errorCode = Object.keys(knownErrors).find((code) => message.includes(code));
109
+ return {
110
+ ok: false,
111
+ error: errorCode || "TRANSFER_FAILED",
112
+ details: errorCode ? knownErrors[errorCode] : message,
113
+ };
114
+ }
115
+ },
116
+ };
117
+ exports.default = hbarTransferAction;
118
+ //# sourceMappingURL=transfer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transfer.js","sourceRoot":"","sources":["../../src/actions/transfer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { Action } from "../types/action";
2
+ declare const transferNftAction: Action;
3
+ export default transferNftAction;
4
+ //# sourceMappingURL=transfer_nft.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transfer_nft.d.ts","sourceRoot":"","sources":["../../src/actions/transfer_nft.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAgB,MAAM,iBAAiB,CAAC;AAUvD,QAAA,MAAM,iBAAiB,EAAE,MAsMxB,CAAC;AAEF,eAAe,iBAAiB,CAAC"}