@sundaeswap/sprinkles 0.6.1 → 0.8.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/README.md +178 -181
- package/dist/cjs/Sprinkle/__tests__/action-integration.test.js +590 -0
- package/dist/cjs/Sprinkle/__tests__/action-integration.test.js.map +1 -0
- package/dist/cjs/Sprinkle/__tests__/action-registry.test.js +193 -0
- package/dist/cjs/Sprinkle/__tests__/action-registry.test.js.map +1 -0
- package/dist/cjs/Sprinkle/__tests__/action-runner.test.js +304 -0
- package/dist/cjs/Sprinkle/__tests__/action-runner.test.js.map +1 -0
- package/dist/cjs/Sprinkle/__tests__/builtin-actions.test.js +1110 -0
- package/dist/cjs/Sprinkle/__tests__/builtin-actions.test.js.map +1 -0
- package/dist/cjs/Sprinkle/__tests__/cli-adapter.test.js +744 -0
- package/dist/cjs/Sprinkle/__tests__/cli-adapter.test.js.map +1 -0
- package/dist/cjs/Sprinkle/__tests__/fill-in-struct.test.js +15 -1
- package/dist/cjs/Sprinkle/__tests__/fill-in-struct.test.js.map +1 -1
- package/dist/cjs/Sprinkle/__tests__/mcp-adapter.test.js +711 -0
- package/dist/cjs/Sprinkle/__tests__/mcp-adapter.test.js.map +1 -0
- package/dist/cjs/Sprinkle/__tests__/native-script.test.js +390 -0
- package/dist/cjs/Sprinkle/__tests__/native-script.test.js.map +1 -0
- package/dist/cjs/Sprinkle/__tests__/tui-helpers.test.js +334 -0
- package/dist/cjs/Sprinkle/__tests__/tui-helpers.test.js.map +1 -0
- package/dist/cjs/Sprinkle/__tests__/utility-actions.test.js +367 -0
- package/dist/cjs/Sprinkle/__tests__/utility-actions.test.js.map +1 -0
- package/dist/cjs/Sprinkle/__tests__/wallet-transaction-actions.test.js +749 -0
- package/dist/cjs/Sprinkle/__tests__/wallet-transaction-actions.test.js.map +1 -0
- package/dist/cjs/Sprinkle/actions/builtin/addressbook-actions.js +164 -0
- package/dist/cjs/Sprinkle/actions/builtin/addressbook-actions.js.map +1 -0
- package/dist/cjs/Sprinkle/actions/builtin/blaze-helper.js +61 -0
- package/dist/cjs/Sprinkle/actions/builtin/blaze-helper.js.map +1 -0
- package/dist/cjs/Sprinkle/actions/builtin/index.js +174 -0
- package/dist/cjs/Sprinkle/actions/builtin/index.js.map +1 -0
- package/dist/cjs/Sprinkle/actions/builtin/native-script.js +139 -0
- package/dist/cjs/Sprinkle/actions/builtin/native-script.js.map +1 -0
- package/dist/cjs/Sprinkle/actions/builtin/profile-actions.js +202 -0
- package/dist/cjs/Sprinkle/actions/builtin/profile-actions.js.map +1 -0
- package/dist/cjs/Sprinkle/actions/builtin/settings-actions.js +87 -0
- package/dist/cjs/Sprinkle/actions/builtin/settings-actions.js.map +1 -0
- package/dist/cjs/Sprinkle/actions/builtin/transaction-actions.js +345 -0
- package/dist/cjs/Sprinkle/actions/builtin/transaction-actions.js.map +1 -0
- package/dist/cjs/Sprinkle/actions/builtin/utility-actions.js +218 -0
- package/dist/cjs/Sprinkle/actions/builtin/utility-actions.js.map +1 -0
- package/dist/cjs/Sprinkle/actions/builtin/wallet-actions.js +212 -0
- package/dist/cjs/Sprinkle/actions/builtin/wallet-actions.js.map +1 -0
- package/dist/cjs/Sprinkle/actions/cli-adapter.js +390 -0
- package/dist/cjs/Sprinkle/actions/cli-adapter.js.map +1 -0
- package/dist/cjs/Sprinkle/actions/index.js +139 -0
- package/dist/cjs/Sprinkle/actions/index.js.map +1 -0
- package/dist/cjs/Sprinkle/actions/mcp-adapter.js +557 -0
- package/dist/cjs/Sprinkle/actions/mcp-adapter.js.map +1 -0
- package/dist/cjs/Sprinkle/actions/registry.js +92 -0
- package/dist/cjs/Sprinkle/actions/registry.js.map +1 -0
- package/dist/cjs/Sprinkle/actions/runner.js +190 -0
- package/dist/cjs/Sprinkle/actions/runner.js.map +1 -0
- package/dist/cjs/Sprinkle/actions/tui-helpers.js +96 -0
- package/dist/cjs/Sprinkle/actions/tui-helpers.js.map +1 -0
- package/dist/cjs/Sprinkle/actions/types.js +68 -0
- package/dist/cjs/Sprinkle/actions/types.js.map +1 -0
- package/dist/cjs/Sprinkle/index.js +678 -5
- package/dist/cjs/Sprinkle/index.js.map +1 -1
- package/dist/cjs/Sprinkle/prompts.js +12 -7
- package/dist/cjs/Sprinkle/prompts.js.map +1 -1
- package/dist/cjs/Sprinkle/schemas.js +17 -1
- package/dist/cjs/Sprinkle/schemas.js.map +1 -1
- package/dist/cjs/Sprinkle/type-guards.js +7 -1
- package/dist/cjs/Sprinkle/type-guards.js.map +1 -1
- package/dist/esm/Sprinkle/__tests__/action-integration.test.js +588 -0
- package/dist/esm/Sprinkle/__tests__/action-integration.test.js.map +1 -0
- package/dist/esm/Sprinkle/__tests__/action-registry.test.js +192 -0
- package/dist/esm/Sprinkle/__tests__/action-registry.test.js.map +1 -0
- package/dist/esm/Sprinkle/__tests__/action-runner.test.js +302 -0
- package/dist/esm/Sprinkle/__tests__/action-runner.test.js.map +1 -0
- package/dist/esm/Sprinkle/__tests__/builtin-actions.test.js +1107 -0
- package/dist/esm/Sprinkle/__tests__/builtin-actions.test.js.map +1 -0
- package/dist/esm/Sprinkle/__tests__/cli-adapter.test.js +742 -0
- package/dist/esm/Sprinkle/__tests__/cli-adapter.test.js.map +1 -0
- package/dist/esm/Sprinkle/__tests__/fill-in-struct.test.js +15 -1
- package/dist/esm/Sprinkle/__tests__/fill-in-struct.test.js.map +1 -1
- package/dist/esm/Sprinkle/__tests__/mcp-adapter.test.js +710 -0
- package/dist/esm/Sprinkle/__tests__/mcp-adapter.test.js.map +1 -0
- package/dist/esm/Sprinkle/__tests__/native-script.test.js +388 -0
- package/dist/esm/Sprinkle/__tests__/native-script.test.js.map +1 -0
- package/dist/esm/Sprinkle/__tests__/tui-helpers.test.js +332 -0
- package/dist/esm/Sprinkle/__tests__/tui-helpers.test.js.map +1 -0
- package/dist/esm/Sprinkle/__tests__/utility-actions.test.js +365 -0
- package/dist/esm/Sprinkle/__tests__/utility-actions.test.js.map +1 -0
- package/dist/esm/Sprinkle/__tests__/wallet-transaction-actions.test.js +747 -0
- package/dist/esm/Sprinkle/__tests__/wallet-transaction-actions.test.js.map +1 -0
- package/dist/esm/Sprinkle/actions/builtin/addressbook-actions.js +159 -0
- package/dist/esm/Sprinkle/actions/builtin/addressbook-actions.js.map +1 -0
- package/dist/esm/Sprinkle/actions/builtin/blaze-helper.js +55 -0
- package/dist/esm/Sprinkle/actions/builtin/blaze-helper.js.map +1 -0
- package/dist/esm/Sprinkle/actions/builtin/index.js +37 -0
- package/dist/esm/Sprinkle/actions/builtin/index.js.map +1 -0
- package/dist/esm/Sprinkle/actions/builtin/native-script.js +133 -0
- package/dist/esm/Sprinkle/actions/builtin/native-script.js.map +1 -0
- package/dist/esm/Sprinkle/actions/builtin/profile-actions.js +197 -0
- package/dist/esm/Sprinkle/actions/builtin/profile-actions.js.map +1 -0
- package/dist/esm/Sprinkle/actions/builtin/settings-actions.js +81 -0
- package/dist/esm/Sprinkle/actions/builtin/settings-actions.js.map +1 -0
- package/dist/esm/Sprinkle/actions/builtin/transaction-actions.js +340 -0
- package/dist/esm/Sprinkle/actions/builtin/transaction-actions.js.map +1 -0
- package/dist/esm/Sprinkle/actions/builtin/utility-actions.js +213 -0
- package/dist/esm/Sprinkle/actions/builtin/utility-actions.js.map +1 -0
- package/dist/esm/Sprinkle/actions/builtin/wallet-actions.js +207 -0
- package/dist/esm/Sprinkle/actions/builtin/wallet-actions.js.map +1 -0
- package/dist/esm/Sprinkle/actions/cli-adapter.js +379 -0
- package/dist/esm/Sprinkle/actions/cli-adapter.js.map +1 -0
- package/dist/esm/Sprinkle/actions/index.js +12 -0
- package/dist/esm/Sprinkle/actions/index.js.map +1 -0
- package/dist/esm/Sprinkle/actions/mcp-adapter.js +547 -0
- package/dist/esm/Sprinkle/actions/mcp-adapter.js.map +1 -0
- package/dist/esm/Sprinkle/actions/registry.js +85 -0
- package/dist/esm/Sprinkle/actions/registry.js.map +1 -0
- package/dist/esm/Sprinkle/actions/runner.js +182 -0
- package/dist/esm/Sprinkle/actions/runner.js.map +1 -0
- package/dist/esm/Sprinkle/actions/tui-helpers.js +91 -0
- package/dist/esm/Sprinkle/actions/tui-helpers.js.map +1 -0
- package/dist/esm/Sprinkle/actions/types.js +61 -0
- package/dist/esm/Sprinkle/actions/types.js.map +1 -0
- package/dist/esm/Sprinkle/index.js +517 -7
- package/dist/esm/Sprinkle/index.js.map +1 -1
- package/dist/esm/Sprinkle/prompts.js +12 -7
- package/dist/esm/Sprinkle/prompts.js.map +1 -1
- package/dist/esm/Sprinkle/schemas.js +16 -0
- package/dist/esm/Sprinkle/schemas.js.map +1 -1
- package/dist/esm/Sprinkle/type-guards.js +3 -0
- package/dist/esm/Sprinkle/type-guards.js.map +1 -1
- package/dist/types/Sprinkle/actions/builtin/addressbook-actions.d.ts +50 -0
- package/dist/types/Sprinkle/actions/builtin/addressbook-actions.d.ts.map +1 -0
- package/dist/types/Sprinkle/actions/builtin/blaze-helper.d.ts +39 -0
- package/dist/types/Sprinkle/actions/builtin/blaze-helper.d.ts.map +1 -0
- package/dist/types/Sprinkle/actions/builtin/index.d.ts +30 -0
- package/dist/types/Sprinkle/actions/builtin/index.d.ts.map +1 -0
- package/dist/types/Sprinkle/actions/builtin/native-script.d.ts +27 -0
- package/dist/types/Sprinkle/actions/builtin/native-script.d.ts.map +1 -0
- package/dist/types/Sprinkle/actions/builtin/profile-actions.d.ts +55 -0
- package/dist/types/Sprinkle/actions/builtin/profile-actions.d.ts.map +1 -0
- package/dist/types/Sprinkle/actions/builtin/settings-actions.d.ts +32 -0
- package/dist/types/Sprinkle/actions/builtin/settings-actions.d.ts.map +1 -0
- package/dist/types/Sprinkle/actions/builtin/transaction-actions.d.ts +70 -0
- package/dist/types/Sprinkle/actions/builtin/transaction-actions.d.ts.map +1 -0
- package/dist/types/Sprinkle/actions/builtin/utility-actions.d.ts +48 -0
- package/dist/types/Sprinkle/actions/builtin/utility-actions.d.ts.map +1 -0
- package/dist/types/Sprinkle/actions/builtin/wallet-actions.d.ts +50 -0
- package/dist/types/Sprinkle/actions/builtin/wallet-actions.d.ts.map +1 -0
- package/dist/types/Sprinkle/actions/cli-adapter.d.ts +104 -0
- package/dist/types/Sprinkle/actions/cli-adapter.d.ts.map +1 -0
- package/dist/types/Sprinkle/actions/index.d.ts +13 -0
- package/dist/types/Sprinkle/actions/index.d.ts.map +1 -0
- package/dist/types/Sprinkle/actions/mcp-adapter.d.ts +116 -0
- package/dist/types/Sprinkle/actions/mcp-adapter.d.ts.map +1 -0
- package/dist/types/Sprinkle/actions/registry.d.ts +42 -0
- package/dist/types/Sprinkle/actions/registry.d.ts.map +1 -0
- package/dist/types/Sprinkle/actions/runner.d.ts +45 -0
- package/dist/types/Sprinkle/actions/runner.d.ts.map +1 -0
- package/dist/types/Sprinkle/actions/tui-helpers.d.ts +53 -0
- package/dist/types/Sprinkle/actions/tui-helpers.d.ts.map +1 -0
- package/dist/types/Sprinkle/actions/types.d.ts +76 -0
- package/dist/types/Sprinkle/actions/types.d.ts.map +1 -0
- package/dist/types/Sprinkle/index.d.ts +84 -2
- package/dist/types/Sprinkle/index.d.ts.map +1 -1
- package/dist/types/Sprinkle/prompts.d.ts.map +1 -1
- package/dist/types/Sprinkle/schemas.d.ts +72 -0
- package/dist/types/Sprinkle/schemas.d.ts.map +1 -1
- package/dist/types/Sprinkle/type-guards.d.ts +4 -1
- package/dist/types/Sprinkle/type-guards.d.ts.map +1 -1
- package/dist/types/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +9 -2
- package/src/Sprinkle/__tests__/action-integration.test.ts +558 -0
- package/src/Sprinkle/__tests__/action-registry.test.ts +187 -0
- package/src/Sprinkle/__tests__/action-runner.test.ts +324 -0
- package/src/Sprinkle/__tests__/builtin-actions.test.ts +1022 -0
- package/src/Sprinkle/__tests__/cli-adapter.test.ts +736 -0
- package/src/Sprinkle/__tests__/fill-in-struct.test.ts +23 -1
- package/src/Sprinkle/__tests__/mcp-adapter.test.ts +720 -0
- package/src/Sprinkle/__tests__/native-script.test.ts +341 -0
- package/src/Sprinkle/__tests__/tui-helpers.test.ts +325 -0
- package/src/Sprinkle/__tests__/utility-actions.test.ts +348 -0
- package/src/Sprinkle/__tests__/wallet-transaction-actions.test.ts +695 -0
- package/src/Sprinkle/actions/builtin/addressbook-actions.ts +168 -0
- package/src/Sprinkle/actions/builtin/blaze-helper.ts +89 -0
- package/src/Sprinkle/actions/builtin/index.ts +125 -0
- package/src/Sprinkle/actions/builtin/native-script.ts +165 -0
- package/src/Sprinkle/actions/builtin/profile-actions.ts +229 -0
- package/src/Sprinkle/actions/builtin/settings-actions.ts +99 -0
- package/src/Sprinkle/actions/builtin/transaction-actions.ts +381 -0
- package/src/Sprinkle/actions/builtin/utility-actions.ts +285 -0
- package/src/Sprinkle/actions/builtin/wallet-actions.ts +233 -0
- package/src/Sprinkle/actions/cli-adapter.ts +446 -0
- package/src/Sprinkle/actions/index.ts +33 -0
- package/src/Sprinkle/actions/mcp-adapter.ts +638 -0
- package/src/Sprinkle/actions/registry.ts +97 -0
- package/src/Sprinkle/actions/runner.ts +200 -0
- package/src/Sprinkle/actions/tui-helpers.ts +114 -0
- package/src/Sprinkle/actions/types.ts +91 -0
- package/src/Sprinkle/index.ts +612 -3
- package/src/Sprinkle/prompts.ts +118 -72
- package/src/Sprinkle/schemas.ts +20 -0
- package/src/Sprinkle/type-guards.ts +9 -0
|
@@ -0,0 +1,345 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.submitTransaction = exports.signTransaction = exports.signAndSubmit = exports.decodeTransaction = void 0;
|
|
7
|
+
var _typebox = require("@sinclair/typebox");
|
|
8
|
+
var _sdk = require("@blaze-cardano/sdk");
|
|
9
|
+
var _types = require("../types.js");
|
|
10
|
+
var _blazeHelper = require("./blaze-helper.js");
|
|
11
|
+
var _txDialog = require("../../tx-dialog.js");
|
|
12
|
+
/**
|
|
13
|
+
* Built-in transaction actions for the Sprinkle action system.
|
|
14
|
+
* These actions expose transaction signing, submission, and decoding
|
|
15
|
+
* as non-interactive actions available in CLI and MCP modes.
|
|
16
|
+
*
|
|
17
|
+
* Sign/submit actions use category "wallet".
|
|
18
|
+
* The decode action uses category "transaction" (no wallet required).
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
/** Shared token entry schema (also used in wallet-actions) */
|
|
22
|
+
const TokenEntrySchema = _typebox.Type.Object({
|
|
23
|
+
policyId: _typebox.Type.String({
|
|
24
|
+
description: "Policy ID of the token"
|
|
25
|
+
}),
|
|
26
|
+
assetName: _typebox.Type.String({
|
|
27
|
+
description: "Asset name of the token (hex)"
|
|
28
|
+
}),
|
|
29
|
+
quantity: _typebox.Type.String({
|
|
30
|
+
description: "Token quantity as string (BigInt-safe)"
|
|
31
|
+
})
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Parses a hex CBOR string into a `Core.Transaction`.
|
|
36
|
+
* Throws `ActionError("INVALID_CBOR")` if the string is not valid transaction CBOR.
|
|
37
|
+
*/
|
|
38
|
+
function parseTxCbor(txCbor) {
|
|
39
|
+
try {
|
|
40
|
+
return _sdk.Core.Transaction.fromCbor(_sdk.Core.TxCBOR(txCbor));
|
|
41
|
+
} catch (err) {
|
|
42
|
+
throw new _types.ActionError(`Invalid transaction CBOR: ${err instanceof Error ? err.message : String(err)}`, "INVALID_CBOR", {
|
|
43
|
+
error: err instanceof Error ? err.message : String(err)
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* `sign-transaction` -- Signs a transaction with the configured hot wallet.
|
|
50
|
+
* Cold wallets cannot sign; use an external signing tool and submit the result.
|
|
51
|
+
*/
|
|
52
|
+
const signTransaction = exports.signTransaction = {
|
|
53
|
+
name: "sign-transaction",
|
|
54
|
+
description: "Sign a transaction with the configured hot wallet. Requires a hot wallet; cold wallets cannot sign.",
|
|
55
|
+
category: "wallet",
|
|
56
|
+
inputSchema: _typebox.Type.Object({
|
|
57
|
+
txCbor: _typebox.Type.String({
|
|
58
|
+
description: "Transaction CBOR hex string to sign"
|
|
59
|
+
})
|
|
60
|
+
}),
|
|
61
|
+
outputSchema: _typebox.Type.Object({
|
|
62
|
+
signedTxCbor: _typebox.Type.String({
|
|
63
|
+
description: "Signed transaction CBOR hex"
|
|
64
|
+
}),
|
|
65
|
+
txHash: _typebox.Type.String({
|
|
66
|
+
description: "Transaction hash"
|
|
67
|
+
}),
|
|
68
|
+
signatureCount: _typebox.Type.Number({
|
|
69
|
+
description: "Number of VKey witnesses after signing"
|
|
70
|
+
})
|
|
71
|
+
}),
|
|
72
|
+
execute: async (input, context) => {
|
|
73
|
+
const blaze = await (0, _blazeHelper.getBlazeFromContext)(context);
|
|
74
|
+
if (!(0, _blazeHelper.isHotWallet)(blaze)) {
|
|
75
|
+
throw new _types.ActionError("Cold wallets cannot sign transactions. Export the CBOR and sign externally, then use submit-transaction.", "COLD_WALLET");
|
|
76
|
+
}
|
|
77
|
+
const tx = parseTxCbor(input.txCbor);
|
|
78
|
+
let signedTx;
|
|
79
|
+
try {
|
|
80
|
+
signedTx = await blaze.signTransaction(tx);
|
|
81
|
+
} catch (err) {
|
|
82
|
+
throw new _types.ActionError(`Failed to sign transaction: ${err instanceof Error ? err.message : String(err)}`, "SIGN_ERROR", {
|
|
83
|
+
error: err instanceof Error ? err.message : String(err)
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
return {
|
|
87
|
+
signedTxCbor: signedTx.toCbor(),
|
|
88
|
+
txHash: signedTx.body().hash().toString(),
|
|
89
|
+
signatureCount: (0, _txDialog.countSignatures)(signedTx)
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* `submit-transaction` -- Submits a signed transaction to the blockchain.
|
|
96
|
+
*/
|
|
97
|
+
const submitTransaction = exports.submitTransaction = {
|
|
98
|
+
name: "submit-transaction",
|
|
99
|
+
description: "Submit a signed transaction to the blockchain.",
|
|
100
|
+
category: "wallet",
|
|
101
|
+
inputSchema: _typebox.Type.Object({
|
|
102
|
+
txCbor: _typebox.Type.String({
|
|
103
|
+
description: "Signed transaction CBOR hex string to submit"
|
|
104
|
+
})
|
|
105
|
+
}),
|
|
106
|
+
outputSchema: _typebox.Type.Object({
|
|
107
|
+
txHash: _typebox.Type.String({
|
|
108
|
+
description: "Submitted transaction hash"
|
|
109
|
+
}),
|
|
110
|
+
submitted: _typebox.Type.Boolean()
|
|
111
|
+
}),
|
|
112
|
+
execute: async (input, context) => {
|
|
113
|
+
const blaze = await (0, _blazeHelper.getBlazeFromContext)(context);
|
|
114
|
+
const tx = parseTxCbor(input.txCbor);
|
|
115
|
+
let txHash;
|
|
116
|
+
try {
|
|
117
|
+
txHash = await blaze.submitTransaction(tx);
|
|
118
|
+
} catch (err) {
|
|
119
|
+
throw new _types.ActionError(`Transaction submission failed: ${err instanceof Error ? err.message : String(err)}`, "SUBMISSION_ERROR", {
|
|
120
|
+
error: err instanceof Error ? err.message : String(err)
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
return {
|
|
124
|
+
txHash: txHash.toString(),
|
|
125
|
+
submitted: true
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
};
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* `sign-and-submit` -- Signs a transaction and immediately submits it.
|
|
132
|
+
* Optionally waits for on-chain confirmation with a configurable timeout.
|
|
133
|
+
*/
|
|
134
|
+
const signAndSubmit = exports.signAndSubmit = {
|
|
135
|
+
name: "sign-and-submit",
|
|
136
|
+
description: "Sign and submit a transaction. Optionally wait for on-chain confirmation.",
|
|
137
|
+
category: "wallet",
|
|
138
|
+
inputSchema: _typebox.Type.Object({
|
|
139
|
+
txCbor: _typebox.Type.String({
|
|
140
|
+
description: "Transaction CBOR hex string to sign and submit"
|
|
141
|
+
}),
|
|
142
|
+
waitForConfirmation: _typebox.Type.Optional(_typebox.Type.Boolean({
|
|
143
|
+
default: false,
|
|
144
|
+
description: "Whether to wait for on-chain confirmation before returning"
|
|
145
|
+
})),
|
|
146
|
+
confirmationTimeout: _typebox.Type.Optional(_typebox.Type.Number({
|
|
147
|
+
default: 60,
|
|
148
|
+
description: "Timeout in seconds to wait for confirmation"
|
|
149
|
+
}))
|
|
150
|
+
}),
|
|
151
|
+
outputSchema: _typebox.Type.Object({
|
|
152
|
+
txHash: _typebox.Type.String({
|
|
153
|
+
description: "Transaction hash"
|
|
154
|
+
}),
|
|
155
|
+
submitted: _typebox.Type.Boolean(),
|
|
156
|
+
confirmed: _typebox.Type.Optional(_typebox.Type.Boolean({
|
|
157
|
+
description: "Whether tx was confirmed on-chain"
|
|
158
|
+
})),
|
|
159
|
+
signedTxCbor: _typebox.Type.String({
|
|
160
|
+
description: "Signed transaction CBOR hex"
|
|
161
|
+
})
|
|
162
|
+
}),
|
|
163
|
+
execute: async (input, context) => {
|
|
164
|
+
const blaze = await (0, _blazeHelper.getBlazeFromContext)(context);
|
|
165
|
+
if (!(0, _blazeHelper.isHotWallet)(blaze)) {
|
|
166
|
+
throw new _types.ActionError("Cold wallets cannot sign transactions. Export the CBOR and sign externally, then use submit-transaction.", "COLD_WALLET");
|
|
167
|
+
}
|
|
168
|
+
const tx = parseTxCbor(input.txCbor);
|
|
169
|
+
|
|
170
|
+
// Sign
|
|
171
|
+
let signedTx;
|
|
172
|
+
try {
|
|
173
|
+
signedTx = await blaze.signTransaction(tx);
|
|
174
|
+
} catch (err) {
|
|
175
|
+
throw new _types.ActionError(`Failed to sign transaction: ${err instanceof Error ? err.message : String(err)}`, "SIGN_ERROR", {
|
|
176
|
+
error: err instanceof Error ? err.message : String(err)
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
const signedTxCbor = signedTx.toCbor();
|
|
180
|
+
|
|
181
|
+
// Submit
|
|
182
|
+
let txHash;
|
|
183
|
+
try {
|
|
184
|
+
txHash = await blaze.submitTransaction(signedTx);
|
|
185
|
+
} catch (err) {
|
|
186
|
+
throw new _types.ActionError(`Transaction submission failed: ${err instanceof Error ? err.message : String(err)}`, "SUBMISSION_ERROR", {
|
|
187
|
+
error: err instanceof Error ? err.message : String(err),
|
|
188
|
+
signedTxCbor
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
const txHashStr = txHash.toString();
|
|
192
|
+
|
|
193
|
+
// If confirmation not requested, return immediately
|
|
194
|
+
if (!input.waitForConfirmation) {
|
|
195
|
+
return {
|
|
196
|
+
txHash: txHashStr,
|
|
197
|
+
submitted: true,
|
|
198
|
+
signedTxCbor
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
// Poll for confirmation
|
|
203
|
+
const timeoutSeconds = input.confirmationTimeout ?? 60;
|
|
204
|
+
const deadline = Date.now() + timeoutSeconds * 1000;
|
|
205
|
+
const pollIntervalMs = 5000; // 5 seconds between polls
|
|
206
|
+
|
|
207
|
+
let confirmed = false;
|
|
208
|
+
while (Date.now() < deadline) {
|
|
209
|
+
await new Promise(resolve => setTimeout(resolve, pollIntervalMs));
|
|
210
|
+
try {
|
|
211
|
+
// Query UTxOs and check if any reference this tx hash
|
|
212
|
+
// This is a lightweight confirmation check using the provider
|
|
213
|
+
const utxos = await blaze.provider.getUnspentOutputs(await blaze.wallet.getChangeAddress());
|
|
214
|
+
// If provider returns without error and tx hash appears in a UTxO input or
|
|
215
|
+
// the query succeeds after submission, assume confirmed.
|
|
216
|
+
// A more precise check would be to look up the tx directly.
|
|
217
|
+
// Use resolveUnspentOutputs if available, otherwise accept the provider response.
|
|
218
|
+
const anyMatch = utxos.some(u => u.input().transactionId().toString() === txHashStr);
|
|
219
|
+
// If we get a fresh UTxO referencing our tx, confirmed
|
|
220
|
+
if (anyMatch) {
|
|
221
|
+
confirmed = true;
|
|
222
|
+
break;
|
|
223
|
+
}
|
|
224
|
+
// Check if we got back any UTxOs at all - for a send transaction the
|
|
225
|
+
// change output should be visible once confirmed
|
|
226
|
+
// Fall through and keep polling
|
|
227
|
+
} catch {
|
|
228
|
+
// Provider error during poll -- keep trying until timeout
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
if (!confirmed && input.waitForConfirmation) {
|
|
232
|
+
// Return partial success rather than throwing -- tx was submitted successfully
|
|
233
|
+
// but we couldn't confirm within the timeout
|
|
234
|
+
return {
|
|
235
|
+
txHash: txHashStr,
|
|
236
|
+
submitted: true,
|
|
237
|
+
confirmed: false,
|
|
238
|
+
signedTxCbor
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
return {
|
|
242
|
+
txHash: txHashStr,
|
|
243
|
+
submitted: true,
|
|
244
|
+
confirmed,
|
|
245
|
+
signedTxCbor
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
};
|
|
249
|
+
|
|
250
|
+
/**
|
|
251
|
+
* `decode-transaction` -- Decodes a transaction CBOR hex without requiring a wallet.
|
|
252
|
+
* Extracts inputs, outputs, fee, witness count, and required signers from the tx body.
|
|
253
|
+
*/
|
|
254
|
+
const decodeTransaction = exports.decodeTransaction = {
|
|
255
|
+
name: "decode-transaction",
|
|
256
|
+
description: "Decode a transaction CBOR hex and return its inputs, outputs, fee, and signers. Does not require a wallet.",
|
|
257
|
+
category: "transaction",
|
|
258
|
+
inputSchema: _typebox.Type.Object({
|
|
259
|
+
txCbor: _typebox.Type.String({
|
|
260
|
+
description: "Transaction CBOR hex string to decode"
|
|
261
|
+
})
|
|
262
|
+
}),
|
|
263
|
+
outputSchema: _typebox.Type.Object({
|
|
264
|
+
txHash: _typebox.Type.String({
|
|
265
|
+
description: "Transaction body hash"
|
|
266
|
+
}),
|
|
267
|
+
inputs: _typebox.Type.Array(_typebox.Type.Object({
|
|
268
|
+
txHash: _typebox.Type.String({
|
|
269
|
+
description: "Input transaction hash"
|
|
270
|
+
}),
|
|
271
|
+
outputIndex: _typebox.Type.Number({
|
|
272
|
+
description: "Input output index"
|
|
273
|
+
})
|
|
274
|
+
})),
|
|
275
|
+
outputs: _typebox.Type.Array(_typebox.Type.Object({
|
|
276
|
+
address: _typebox.Type.String({
|
|
277
|
+
description: "Output address (bech32 or hex)"
|
|
278
|
+
}),
|
|
279
|
+
lovelace: _typebox.Type.String({
|
|
280
|
+
description: "Output lovelace amount as string"
|
|
281
|
+
}),
|
|
282
|
+
tokens: _typebox.Type.Array(TokenEntrySchema)
|
|
283
|
+
})),
|
|
284
|
+
fee: _typebox.Type.String({
|
|
285
|
+
description: "Transaction fee in lovelace as string"
|
|
286
|
+
}),
|
|
287
|
+
signatureCount: _typebox.Type.Number({
|
|
288
|
+
description: "Number of VKey witnesses"
|
|
289
|
+
}),
|
|
290
|
+
requiredSigners: _typebox.Type.Array(_typebox.Type.String({
|
|
291
|
+
description: "Required signer key hashes"
|
|
292
|
+
}))
|
|
293
|
+
}),
|
|
294
|
+
execute: async (input, _context) => {
|
|
295
|
+
// No Blaze instance needed -- pure CBOR parsing
|
|
296
|
+
const tx = parseTxCbor(input.txCbor);
|
|
297
|
+
const body = tx.body();
|
|
298
|
+
const txHash = body.hash().toString();
|
|
299
|
+
|
|
300
|
+
// Extract inputs
|
|
301
|
+
const inputSet = body.inputs();
|
|
302
|
+
const inputs = Array.from(inputSet.values()).map(txInput => ({
|
|
303
|
+
txHash: txInput.transactionId().toString(),
|
|
304
|
+
outputIndex: Number(txInput.index())
|
|
305
|
+
}));
|
|
306
|
+
|
|
307
|
+
// Extract outputs
|
|
308
|
+
const outputs = body.outputs().map(txOutput => {
|
|
309
|
+
const value = txOutput.amount();
|
|
310
|
+
const tokens = [];
|
|
311
|
+
const multiasset = value.multiasset();
|
|
312
|
+
if (multiasset) {
|
|
313
|
+
for (const [assetId, quantity] of multiasset.entries()) {
|
|
314
|
+
tokens.push({
|
|
315
|
+
policyId: _sdk.Core.AssetId.getPolicyId(assetId),
|
|
316
|
+
assetName: _sdk.Core.AssetId.getAssetName(assetId),
|
|
317
|
+
quantity: quantity.toString()
|
|
318
|
+
});
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
// Attempt bech32 address, fall back to hex if conversion fails
|
|
323
|
+
let address;
|
|
324
|
+
try {
|
|
325
|
+
address = txOutput.address().toBech32();
|
|
326
|
+
} catch {
|
|
327
|
+
address = txOutput.address().toBytes();
|
|
328
|
+
}
|
|
329
|
+
return {
|
|
330
|
+
address,
|
|
331
|
+
lovelace: value.coin().toString(),
|
|
332
|
+
tokens
|
|
333
|
+
};
|
|
334
|
+
});
|
|
335
|
+
return {
|
|
336
|
+
txHash,
|
|
337
|
+
inputs,
|
|
338
|
+
outputs,
|
|
339
|
+
fee: body.fee().toString(),
|
|
340
|
+
signatureCount: (0, _txDialog.countSignatures)(tx),
|
|
341
|
+
requiredSigners: (0, _txDialog.getRequiredSigners)(tx)
|
|
342
|
+
};
|
|
343
|
+
}
|
|
344
|
+
};
|
|
345
|
+
//# sourceMappingURL=transaction-actions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transaction-actions.js","names":["_typebox","require","_sdk","_types","_blazeHelper","_txDialog","TokenEntrySchema","Type","Object","policyId","String","description","assetName","quantity","parseTxCbor","txCbor","Core","Transaction","fromCbor","TxCBOR","err","ActionError","Error","message","error","signTransaction","exports","name","category","inputSchema","outputSchema","signedTxCbor","txHash","signatureCount","Number","execute","input","context","blaze","getBlazeFromContext","isHotWallet","tx","signedTx","toCbor","body","hash","toString","countSignatures","submitTransaction","submitted","Boolean","signAndSubmit","waitForConfirmation","Optional","default","confirmationTimeout","confirmed","txHashStr","timeoutSeconds","deadline","Date","now","pollIntervalMs","Promise","resolve","setTimeout","utxos","provider","getUnspentOutputs","wallet","getChangeAddress","anyMatch","some","u","transactionId","decodeTransaction","inputs","Array","outputIndex","outputs","address","lovelace","tokens","fee","requiredSigners","_context","inputSet","from","values","map","txInput","index","txOutput","value","amount","multiasset","assetId","entries","push","AssetId","getPolicyId","getAssetName","toBech32","toBytes","coin","getRequiredSigners"],"sources":["../../../../../src/Sprinkle/actions/builtin/transaction-actions.ts"],"sourcesContent":["/**\n * Built-in transaction actions for the Sprinkle action system.\n * These actions expose transaction signing, submission, and decoding\n * as non-interactive actions available in CLI and MCP modes.\n *\n * Sign/submit actions use category \"wallet\".\n * The decode action uses category \"transaction\" (no wallet required).\n */\n\nimport { Type } from \"@sinclair/typebox\";\nimport type { TSchema } from \"@sinclair/typebox\";\nimport { Core } from \"@blaze-cardano/sdk\";\nimport { ActionError } from \"../types.js\";\nimport type { IAction } from \"../types.js\";\nimport { getBlazeFromContext, isHotWallet } from \"./blaze-helper.js\";\nimport { countSignatures, getRequiredSigners } from \"../../tx-dialog.js\";\n\n/** Shared token entry schema (also used in wallet-actions) */\nconst TokenEntrySchema = Type.Object({\n policyId: Type.String({ description: \"Policy ID of the token\" }),\n assetName: Type.String({ description: \"Asset name of the token (hex)\" }),\n quantity: Type.String({ description: \"Token quantity as string (BigInt-safe)\" }),\n});\n\n/**\n * Parses a hex CBOR string into a `Core.Transaction`.\n * Throws `ActionError(\"INVALID_CBOR\")` if the string is not valid transaction CBOR.\n */\nfunction parseTxCbor(txCbor: string): Core.Transaction {\n try {\n return Core.Transaction.fromCbor(Core.TxCBOR(txCbor));\n } catch (err) {\n throw new ActionError(\n `Invalid transaction CBOR: ${err instanceof Error ? err.message : String(err)}`,\n \"INVALID_CBOR\",\n { error: err instanceof Error ? err.message : String(err) },\n );\n }\n}\n\n/**\n * `sign-transaction` -- Signs a transaction with the configured hot wallet.\n * Cold wallets cannot sign; use an external signing tool and submit the result.\n */\nexport const signTransaction: IAction<\n { txCbor: string },\n { signedTxCbor: string; txHash: string; signatureCount: number },\n TSchema\n> = {\n name: \"sign-transaction\",\n description:\n \"Sign a transaction with the configured hot wallet. Requires a hot wallet; cold wallets cannot sign.\",\n category: \"wallet\",\n inputSchema: Type.Object({\n txCbor: Type.String({ description: \"Transaction CBOR hex string to sign\" }),\n }),\n outputSchema: Type.Object({\n signedTxCbor: Type.String({ description: \"Signed transaction CBOR hex\" }),\n txHash: Type.String({ description: \"Transaction hash\" }),\n signatureCount: Type.Number({ description: \"Number of VKey witnesses after signing\" }),\n }),\n execute: async (input, context) => {\n const blaze = await getBlazeFromContext(context);\n\n if (!isHotWallet(blaze)) {\n throw new ActionError(\n \"Cold wallets cannot sign transactions. Export the CBOR and sign externally, then use submit-transaction.\",\n \"COLD_WALLET\",\n );\n }\n\n const tx = parseTxCbor(input.txCbor);\n\n let signedTx: Core.Transaction;\n try {\n signedTx = await blaze.signTransaction(tx);\n } catch (err) {\n throw new ActionError(\n `Failed to sign transaction: ${err instanceof Error ? err.message : String(err)}`,\n \"SIGN_ERROR\",\n { error: err instanceof Error ? err.message : String(err) },\n );\n }\n\n return {\n signedTxCbor: signedTx.toCbor(),\n txHash: signedTx.body().hash().toString(),\n signatureCount: countSignatures(signedTx),\n };\n },\n};\n\n/**\n * `submit-transaction` -- Submits a signed transaction to the blockchain.\n */\nexport const submitTransaction: IAction<\n { txCbor: string },\n { txHash: string; submitted: boolean },\n TSchema\n> = {\n name: \"submit-transaction\",\n description: \"Submit a signed transaction to the blockchain.\",\n category: \"wallet\",\n inputSchema: Type.Object({\n txCbor: Type.String({ description: \"Signed transaction CBOR hex string to submit\" }),\n }),\n outputSchema: Type.Object({\n txHash: Type.String({ description: \"Submitted transaction hash\" }),\n submitted: Type.Boolean(),\n }),\n execute: async (input, context) => {\n const blaze = await getBlazeFromContext(context);\n const tx = parseTxCbor(input.txCbor);\n\n let txHash: Core.TransactionId;\n try {\n txHash = await blaze.submitTransaction(tx);\n } catch (err) {\n throw new ActionError(\n `Transaction submission failed: ${err instanceof Error ? err.message : String(err)}`,\n \"SUBMISSION_ERROR\",\n { error: err instanceof Error ? err.message : String(err) },\n );\n }\n\n return {\n txHash: txHash.toString(),\n submitted: true,\n };\n },\n};\n\n/**\n * `sign-and-submit` -- Signs a transaction and immediately submits it.\n * Optionally waits for on-chain confirmation with a configurable timeout.\n */\nexport const signAndSubmit: IAction<\n {\n txCbor: string;\n waitForConfirmation?: boolean;\n confirmationTimeout?: number;\n },\n {\n txHash: string;\n submitted: boolean;\n confirmed?: boolean;\n signedTxCbor: string;\n },\n TSchema\n> = {\n name: \"sign-and-submit\",\n description:\n \"Sign and submit a transaction. Optionally wait for on-chain confirmation.\",\n category: \"wallet\",\n inputSchema: Type.Object({\n txCbor: Type.String({ description: \"Transaction CBOR hex string to sign and submit\" }),\n waitForConfirmation: Type.Optional(\n Type.Boolean({\n default: false,\n description: \"Whether to wait for on-chain confirmation before returning\",\n }),\n ),\n confirmationTimeout: Type.Optional(\n Type.Number({\n default: 60,\n description: \"Timeout in seconds to wait for confirmation\",\n }),\n ),\n }),\n outputSchema: Type.Object({\n txHash: Type.String({ description: \"Transaction hash\" }),\n submitted: Type.Boolean(),\n confirmed: Type.Optional(Type.Boolean({ description: \"Whether tx was confirmed on-chain\" })),\n signedTxCbor: Type.String({ description: \"Signed transaction CBOR hex\" }),\n }),\n execute: async (input, context) => {\n const blaze = await getBlazeFromContext(context);\n\n if (!isHotWallet(blaze)) {\n throw new ActionError(\n \"Cold wallets cannot sign transactions. Export the CBOR and sign externally, then use submit-transaction.\",\n \"COLD_WALLET\",\n );\n }\n\n const tx = parseTxCbor(input.txCbor);\n\n // Sign\n let signedTx: Core.Transaction;\n try {\n signedTx = await blaze.signTransaction(tx);\n } catch (err) {\n throw new ActionError(\n `Failed to sign transaction: ${err instanceof Error ? err.message : String(err)}`,\n \"SIGN_ERROR\",\n { error: err instanceof Error ? err.message : String(err) },\n );\n }\n\n const signedTxCbor = signedTx.toCbor();\n\n // Submit\n let txHash: Core.TransactionId;\n try {\n txHash = await blaze.submitTransaction(signedTx);\n } catch (err) {\n throw new ActionError(\n `Transaction submission failed: ${err instanceof Error ? err.message : String(err)}`,\n \"SUBMISSION_ERROR\",\n { error: err instanceof Error ? err.message : String(err), signedTxCbor },\n );\n }\n\n const txHashStr = txHash.toString();\n\n // If confirmation not requested, return immediately\n if (!input.waitForConfirmation) {\n return {\n txHash: txHashStr,\n submitted: true,\n signedTxCbor,\n };\n }\n\n // Poll for confirmation\n const timeoutSeconds = input.confirmationTimeout ?? 60;\n const deadline = Date.now() + timeoutSeconds * 1000;\n const pollIntervalMs = 5000; // 5 seconds between polls\n\n let confirmed = false;\n while (Date.now() < deadline) {\n await new Promise((resolve) => setTimeout(resolve, pollIntervalMs));\n try {\n // Query UTxOs and check if any reference this tx hash\n // This is a lightweight confirmation check using the provider\n const utxos = await blaze.provider.getUnspentOutputs(\n await blaze.wallet.getChangeAddress(),\n );\n // If provider returns without error and tx hash appears in a UTxO input or\n // the query succeeds after submission, assume confirmed.\n // A more precise check would be to look up the tx directly.\n // Use resolveUnspentOutputs if available, otherwise accept the provider response.\n const anyMatch = utxos.some(\n (u) => u.input().transactionId().toString() === txHashStr,\n );\n // If we get a fresh UTxO referencing our tx, confirmed\n if (anyMatch) {\n confirmed = true;\n break;\n }\n // Check if we got back any UTxOs at all - for a send transaction the\n // change output should be visible once confirmed\n // Fall through and keep polling\n } catch {\n // Provider error during poll -- keep trying until timeout\n }\n }\n\n if (!confirmed && input.waitForConfirmation) {\n // Return partial success rather than throwing -- tx was submitted successfully\n // but we couldn't confirm within the timeout\n return {\n txHash: txHashStr,\n submitted: true,\n confirmed: false,\n signedTxCbor,\n };\n }\n\n return {\n txHash: txHashStr,\n submitted: true,\n confirmed,\n signedTxCbor,\n };\n },\n};\n\n/**\n * `decode-transaction` -- Decodes a transaction CBOR hex without requiring a wallet.\n * Extracts inputs, outputs, fee, witness count, and required signers from the tx body.\n */\nexport const decodeTransaction: IAction<\n { txCbor: string },\n {\n txHash: string;\n inputs: Array<{ txHash: string; outputIndex: number }>;\n outputs: Array<{\n address: string;\n lovelace: string;\n tokens: Array<{ policyId: string; assetName: string; quantity: string }>;\n }>;\n fee: string;\n signatureCount: number;\n requiredSigners: string[];\n },\n TSchema\n> = {\n name: \"decode-transaction\",\n description:\n \"Decode a transaction CBOR hex and return its inputs, outputs, fee, and signers. Does not require a wallet.\",\n category: \"transaction\",\n inputSchema: Type.Object({\n txCbor: Type.String({ description: \"Transaction CBOR hex string to decode\" }),\n }),\n outputSchema: Type.Object({\n txHash: Type.String({ description: \"Transaction body hash\" }),\n inputs: Type.Array(\n Type.Object({\n txHash: Type.String({ description: \"Input transaction hash\" }),\n outputIndex: Type.Number({ description: \"Input output index\" }),\n }),\n ),\n outputs: Type.Array(\n Type.Object({\n address: Type.String({ description: \"Output address (bech32 or hex)\" }),\n lovelace: Type.String({ description: \"Output lovelace amount as string\" }),\n tokens: Type.Array(TokenEntrySchema),\n }),\n ),\n fee: Type.String({ description: \"Transaction fee in lovelace as string\" }),\n signatureCount: Type.Number({ description: \"Number of VKey witnesses\" }),\n requiredSigners: Type.Array(\n Type.String({ description: \"Required signer key hashes\" }),\n ),\n }),\n execute: async (input, _context) => {\n // No Blaze instance needed -- pure CBOR parsing\n const tx = parseTxCbor(input.txCbor);\n\n const body = tx.body();\n const txHash = body.hash().toString();\n\n // Extract inputs\n const inputSet = body.inputs();\n const inputs = Array.from(inputSet.values()).map((txInput) => ({\n txHash: txInput.transactionId().toString(),\n outputIndex: Number(txInput.index()),\n }));\n\n // Extract outputs\n const outputs = body.outputs().map((txOutput) => {\n const value = txOutput.amount();\n const tokens: Array<{ policyId: string; assetName: string; quantity: string }> = [];\n\n const multiasset = value.multiasset();\n if (multiasset) {\n for (const [assetId, quantity] of multiasset.entries()) {\n tokens.push({\n policyId: Core.AssetId.getPolicyId(assetId),\n assetName: Core.AssetId.getAssetName(assetId),\n quantity: quantity.toString(),\n });\n }\n }\n\n // Attempt bech32 address, fall back to hex if conversion fails\n let address: string;\n try {\n address = txOutput.address().toBech32();\n } catch {\n address = txOutput.address().toBytes();\n }\n\n return {\n address,\n lovelace: value.coin().toString(),\n tokens,\n };\n });\n\n return {\n txHash,\n inputs,\n outputs,\n fee: body.fee().toString(),\n signatureCount: countSignatures(tx),\n requiredSigners: getRequiredSigners(tx),\n };\n },\n};\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.simpleSend = exports.registerStakeScript = exports.mintToken = void 0;
|
|
7
|
+
var _typebox = require("@sinclair/typebox");
|
|
8
|
+
var _sdk = require("@blaze-cardano/sdk");
|
|
9
|
+
var _types = require("../types.js");
|
|
10
|
+
var _blazeHelper = require("./blaze-helper.js");
|
|
11
|
+
var _schemas = require("../../schemas.js");
|
|
12
|
+
var _nativeScript = require("./native-script.js");
|
|
13
|
+
/**
|
|
14
|
+
* Built-in utility actions for the Sprinkle action system.
|
|
15
|
+
* These actions provide common Cardano operations: minting tokens,
|
|
16
|
+
* sending ADA/tokens, and registering stake scripts.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* `mint-token` -- Mint native tokens using a native script derived from the wallet's payment key.
|
|
21
|
+
* The policy is a simple ScriptPubkey requiring the wallet's payment credential to sign.
|
|
22
|
+
* Requires a hot wallet.
|
|
23
|
+
*/
|
|
24
|
+
const mintToken = exports.mintToken = {
|
|
25
|
+
name: "mint-token",
|
|
26
|
+
description: "Mint native tokens using a native script policy derived from the wallet's payment key.",
|
|
27
|
+
category: "utility",
|
|
28
|
+
inputSchema: _typebox.Type.Object({
|
|
29
|
+
tokenName: _typebox.Type.String({
|
|
30
|
+
description: "Name of the token to mint"
|
|
31
|
+
}),
|
|
32
|
+
amount: _typebox.Type.String({
|
|
33
|
+
description: "Amount of tokens to mint (as string for BigInt safety)"
|
|
34
|
+
}),
|
|
35
|
+
nativeScripts: _schemas.NativeScriptsParam
|
|
36
|
+
}),
|
|
37
|
+
outputSchema: _typebox.Type.Object({
|
|
38
|
+
policyId: _typebox.Type.String({
|
|
39
|
+
description: "Policy ID of the minted token"
|
|
40
|
+
}),
|
|
41
|
+
tokenName: _typebox.Type.String({
|
|
42
|
+
description: "Token name"
|
|
43
|
+
}),
|
|
44
|
+
amount: _typebox.Type.String({
|
|
45
|
+
description: "Amount minted"
|
|
46
|
+
}),
|
|
47
|
+
txCbor: _typebox.Type.String({
|
|
48
|
+
description: "Unsigned transaction CBOR hex ready for signing"
|
|
49
|
+
})
|
|
50
|
+
}),
|
|
51
|
+
execute: async (input, context) => {
|
|
52
|
+
const blaze = await (0, _blazeHelper.getBlazeFromContext)(context);
|
|
53
|
+
if (!(0, _blazeHelper.isHotWallet)(blaze)) {
|
|
54
|
+
throw new _types.ActionError("Mint token requires a hot wallet to derive the native script policy.", "COLD_WALLET");
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// Get the wallet's payment credential hash for the native script
|
|
58
|
+
let address;
|
|
59
|
+
try {
|
|
60
|
+
address = await blaze.wallet.getChangeAddress();
|
|
61
|
+
} catch (err) {
|
|
62
|
+
throw new _types.ActionError(`Failed to get wallet address: ${err instanceof Error ? err.message : String(err)}`, "NO_ADDRESS", {
|
|
63
|
+
error: err instanceof Error ? err.message : String(err)
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
const baseAddress = address.asBase();
|
|
67
|
+
if (!baseAddress) {
|
|
68
|
+
throw new _types.ActionError("Could not derive base address from wallet. Ensure the wallet has a payment credential.", "INVALID_ADDRESS");
|
|
69
|
+
}
|
|
70
|
+
const paymentCredential = baseAddress.getPaymentCredential();
|
|
71
|
+
if (!paymentCredential?.hash) {
|
|
72
|
+
throw new _types.ActionError("Could not extract payment credential hash from wallet address.", "NO_PAYMENT_CREDENTIAL");
|
|
73
|
+
}
|
|
74
|
+
const hash = _sdk.Core.Ed25519KeyHashHex(paymentCredential.hash.toString());
|
|
75
|
+
const tokenPolicy = new _sdk.Core.ScriptPubkey(hash);
|
|
76
|
+
const policy = _sdk.Core.Script.newNativeScript(_sdk.Core.NativeScript.newScriptPubkey(tokenPolicy));
|
|
77
|
+
const policyId = policy.hash();
|
|
78
|
+
const assetName = _sdk.Core.AssetName(_sdk.Core.toHex(Buffer.from(input.tokenName)));
|
|
79
|
+
const mintAmount = BigInt(input.amount);
|
|
80
|
+
const mints = new Map();
|
|
81
|
+
mints.set(assetName, mintAmount);
|
|
82
|
+
let tx;
|
|
83
|
+
try {
|
|
84
|
+
const txBuilder = blaze.newTransaction().addMint(_sdk.Core.PolicyId(policyId), mints).provideScript(policy);
|
|
85
|
+
tx = await (0, _nativeScript.completeWithScripts)(txBuilder, input.nativeScripts, context);
|
|
86
|
+
} catch (err) {
|
|
87
|
+
if (err instanceof _types.ActionError) throw err;
|
|
88
|
+
throw new _types.ActionError(`Failed to build mint transaction: ${err instanceof Error ? err.message : String(err)}`, "BUILD_ERROR", {
|
|
89
|
+
error: err instanceof Error ? err.message : String(err)
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
return {
|
|
93
|
+
policyId: policyId.toString(),
|
|
94
|
+
tokenName: input.tokenName,
|
|
95
|
+
amount: input.amount,
|
|
96
|
+
txCbor: tx.toCbor()
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* `simple-send` -- Send ADA or a native token to a recipient address.
|
|
103
|
+
* Builds an unsigned transaction that can be signed via TxDialog or sign-transaction.
|
|
104
|
+
*/
|
|
105
|
+
const simpleSend = exports.simpleSend = {
|
|
106
|
+
name: "simple-send",
|
|
107
|
+
description: "Send ADA or a native token to a recipient address.",
|
|
108
|
+
category: "wallet",
|
|
109
|
+
inputSchema: _typebox.Type.Object({
|
|
110
|
+
recipientAddress: _typebox.Type.String({
|
|
111
|
+
description: "Bech32 recipient address"
|
|
112
|
+
}),
|
|
113
|
+
lovelace: _typebox.Type.Optional(_typebox.Type.String({
|
|
114
|
+
description: "Amount of lovelace to send (as string for BigInt safety). Required if not sending a token."
|
|
115
|
+
})),
|
|
116
|
+
policyId: _typebox.Type.Optional(_typebox.Type.String({
|
|
117
|
+
description: "Policy ID of the token to send"
|
|
118
|
+
})),
|
|
119
|
+
assetName: _typebox.Type.Optional(_typebox.Type.String({
|
|
120
|
+
description: "Asset name of the token to send (hex-encoded)"
|
|
121
|
+
})),
|
|
122
|
+
tokenAmount: _typebox.Type.Optional(_typebox.Type.String({
|
|
123
|
+
description: "Amount of tokens to send (as string for BigInt safety)"
|
|
124
|
+
})),
|
|
125
|
+
nativeScripts: _schemas.NativeScriptsParam
|
|
126
|
+
}),
|
|
127
|
+
outputSchema: _typebox.Type.Object({
|
|
128
|
+
txCbor: _typebox.Type.String({
|
|
129
|
+
description: "Unsigned transaction CBOR hex ready for signing"
|
|
130
|
+
})
|
|
131
|
+
}),
|
|
132
|
+
execute: async (input, context) => {
|
|
133
|
+
const blaze = await (0, _blazeHelper.getBlazeFromContext)(context);
|
|
134
|
+
|
|
135
|
+
// Validate: must provide lovelace or token details
|
|
136
|
+
const hasToken = input.policyId && input.assetName && input.tokenAmount;
|
|
137
|
+
if (!input.lovelace && !hasToken) {
|
|
138
|
+
throw new _types.ActionError("Must provide either lovelace amount or token details (policyId, assetName, tokenAmount).", "INVALID_INPUT");
|
|
139
|
+
}
|
|
140
|
+
let recipient;
|
|
141
|
+
try {
|
|
142
|
+
recipient = _sdk.Core.Address.fromBech32(input.recipientAddress);
|
|
143
|
+
} catch (err) {
|
|
144
|
+
throw new _types.ActionError(`Invalid recipient address: ${err instanceof Error ? err.message : String(err)}`, "INVALID_ADDRESS", {
|
|
145
|
+
error: err instanceof Error ? err.message : String(err)
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
let value;
|
|
149
|
+
if (hasToken) {
|
|
150
|
+
const assetId = `${input.policyId}${input.assetName}`;
|
|
151
|
+
value = (0, _sdk.makeValue)(BigInt(input.lovelace ?? "0"), [assetId, BigInt(input.tokenAmount)]);
|
|
152
|
+
} else {
|
|
153
|
+
value = (0, _sdk.makeValue)(BigInt(input.lovelace));
|
|
154
|
+
}
|
|
155
|
+
let tx;
|
|
156
|
+
try {
|
|
157
|
+
const txBuilder = blaze.newTransaction().payAssets(recipient, value);
|
|
158
|
+
tx = await (0, _nativeScript.completeWithScripts)(txBuilder, input.nativeScripts, context);
|
|
159
|
+
} catch (err) {
|
|
160
|
+
if (err instanceof _types.ActionError) throw err;
|
|
161
|
+
throw new _types.ActionError(`Failed to build send transaction: ${err instanceof Error ? err.message : String(err)}`, "BUILD_ERROR", {
|
|
162
|
+
error: err instanceof Error ? err.message : String(err)
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
return {
|
|
166
|
+
txCbor: tx.toCbor()
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
};
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* `register-stake-script` -- Register a stake script credential on-chain.
|
|
173
|
+
* Takes a script hash and builds a stake registration transaction.
|
|
174
|
+
*/
|
|
175
|
+
const registerStakeScript = exports.registerStakeScript = {
|
|
176
|
+
name: "register-stake-script",
|
|
177
|
+
description: "Register a stake script credential on-chain. Takes a script hash (hex) and builds the registration transaction.",
|
|
178
|
+
category: "utility",
|
|
179
|
+
inputSchema: _typebox.Type.Object({
|
|
180
|
+
scriptHash: _typebox.Type.String({
|
|
181
|
+
description: "Stake script hash in hex (28 bytes / 56 hex characters)"
|
|
182
|
+
}),
|
|
183
|
+
nativeScripts: _schemas.NativeScriptsParam
|
|
184
|
+
}),
|
|
185
|
+
outputSchema: _typebox.Type.Object({
|
|
186
|
+
txCbor: _typebox.Type.String({
|
|
187
|
+
description: "Unsigned transaction CBOR hex ready for signing"
|
|
188
|
+
})
|
|
189
|
+
}),
|
|
190
|
+
execute: async (input, context) => {
|
|
191
|
+
const blaze = await (0, _blazeHelper.getBlazeFromContext)(context);
|
|
192
|
+
|
|
193
|
+
// Validate hex format
|
|
194
|
+
if (!/^[0-9a-fA-F]{56}$/.test(input.scriptHash)) {
|
|
195
|
+
throw new _types.ActionError("Script hash must be exactly 56 hex characters (28 bytes).", "INVALID_SCRIPT_HASH", {
|
|
196
|
+
provided: input.scriptHash
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
const credential = _sdk.Core.Credential.fromCore({
|
|
200
|
+
hash: _sdk.Core.Hash28ByteBase16(input.scriptHash),
|
|
201
|
+
type: _sdk.Core.CredentialType.ScriptHash
|
|
202
|
+
});
|
|
203
|
+
let tx;
|
|
204
|
+
try {
|
|
205
|
+
const txBuilder = blaze.newTransaction().addRegisterStake(credential);
|
|
206
|
+
tx = await (0, _nativeScript.completeWithScripts)(txBuilder, input.nativeScripts, context);
|
|
207
|
+
} catch (err) {
|
|
208
|
+
if (err instanceof _types.ActionError) throw err;
|
|
209
|
+
throw new _types.ActionError(`Failed to build stake registration transaction: ${err instanceof Error ? err.message : String(err)}`, "BUILD_ERROR", {
|
|
210
|
+
error: err instanceof Error ? err.message : String(err)
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
return {
|
|
214
|
+
txCbor: tx.toCbor()
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
};
|
|
218
|
+
//# sourceMappingURL=utility-actions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utility-actions.js","names":["_typebox","require","_sdk","_types","_blazeHelper","_schemas","_nativeScript","mintToken","exports","name","description","category","inputSchema","Type","Object","tokenName","String","amount","nativeScripts","NativeScriptsParam","outputSchema","policyId","txCbor","execute","input","context","blaze","getBlazeFromContext","isHotWallet","ActionError","address","wallet","getChangeAddress","err","Error","message","error","baseAddress","asBase","paymentCredential","getPaymentCredential","hash","Core","Ed25519KeyHashHex","toString","tokenPolicy","ScriptPubkey","policy","Script","newNativeScript","NativeScript","newScriptPubkey","assetName","AssetName","toHex","Buffer","from","mintAmount","BigInt","mints","Map","set","tx","txBuilder","newTransaction","addMint","PolicyId","provideScript","completeWithScripts","toCbor","simpleSend","recipientAddress","lovelace","Optional","tokenAmount","hasToken","recipient","Address","fromBech32","value","assetId","makeValue","payAssets","registerStakeScript","scriptHash","test","provided","credential","Credential","fromCore","Hash28ByteBase16","type","CredentialType","ScriptHash","addRegisterStake"],"sources":["../../../../../src/Sprinkle/actions/builtin/utility-actions.ts"],"sourcesContent":["/**\n * Built-in utility actions for the Sprinkle action system.\n * These actions provide common Cardano operations: minting tokens,\n * sending ADA/tokens, and registering stake scripts.\n */\n\nimport { Type } from \"@sinclair/typebox\";\nimport type { TSchema } from \"@sinclair/typebox\";\nimport { Core, makeValue } from \"@blaze-cardano/sdk\";\nimport { ActionError } from \"../types.js\";\nimport type { IAction } from \"../types.js\";\nimport { getBlazeFromContext, isHotWallet } from \"./blaze-helper.js\";\nimport { NativeScriptsParam } from \"../../schemas.js\";\nimport type { NativeScriptInput } from \"./native-script.js\";\nimport { completeWithScripts } from \"./native-script.js\";\n\n/**\n * `mint-token` -- Mint native tokens using a native script derived from the wallet's payment key.\n * The policy is a simple ScriptPubkey requiring the wallet's payment credential to sign.\n * Requires a hot wallet.\n */\nexport const mintToken: IAction<\n { tokenName: string; amount: string; nativeScripts?: NativeScriptInput[] },\n { policyId: string; tokenName: string; amount: string; txCbor: string },\n TSchema\n> = {\n name: \"mint-token\",\n description:\n \"Mint native tokens using a native script policy derived from the wallet's payment key.\",\n category: \"utility\",\n inputSchema: Type.Object({\n tokenName: Type.String({ description: \"Name of the token to mint\" }),\n amount: Type.String({\n description: \"Amount of tokens to mint (as string for BigInt safety)\",\n }),\n nativeScripts: NativeScriptsParam,\n }),\n outputSchema: Type.Object({\n policyId: Type.String({ description: \"Policy ID of the minted token\" }),\n tokenName: Type.String({ description: \"Token name\" }),\n amount: Type.String({ description: \"Amount minted\" }),\n txCbor: Type.String({\n description: \"Unsigned transaction CBOR hex ready for signing\",\n }),\n }),\n execute: async (input, context) => {\n const blaze = await getBlazeFromContext(context);\n\n if (!isHotWallet(blaze)) {\n throw new ActionError(\n \"Mint token requires a hot wallet to derive the native script policy.\",\n \"COLD_WALLET\",\n );\n }\n\n // Get the wallet's payment credential hash for the native script\n let address: Core.Address;\n try {\n address = await blaze.wallet.getChangeAddress();\n } catch (err) {\n throw new ActionError(\n `Failed to get wallet address: ${err instanceof Error ? err.message : String(err)}`,\n \"NO_ADDRESS\",\n { error: err instanceof Error ? err.message : String(err) },\n );\n }\n\n const baseAddress = address.asBase();\n if (!baseAddress) {\n throw new ActionError(\n \"Could not derive base address from wallet. Ensure the wallet has a payment credential.\",\n \"INVALID_ADDRESS\",\n );\n }\n\n const paymentCredential = baseAddress.getPaymentCredential();\n if (!paymentCredential?.hash) {\n throw new ActionError(\n \"Could not extract payment credential hash from wallet address.\",\n \"NO_PAYMENT_CREDENTIAL\",\n );\n }\n\n const hash = Core.Ed25519KeyHashHex(paymentCredential.hash.toString());\n const tokenPolicy = new Core.ScriptPubkey(hash);\n const policy = Core.Script.newNativeScript(\n Core.NativeScript.newScriptPubkey(tokenPolicy),\n );\n\n const policyId = policy.hash();\n const assetName = Core.AssetName(\n Core.toHex(Buffer.from(input.tokenName)),\n );\n const mintAmount = BigInt(input.amount);\n\n const mints = new Map<Core.AssetName, bigint>();\n mints.set(assetName, mintAmount);\n\n let tx: Core.Transaction;\n try {\n const txBuilder = blaze\n .newTransaction()\n .addMint(Core.PolicyId(policyId), mints)\n .provideScript(policy);\n tx = await completeWithScripts(txBuilder, input.nativeScripts, context);\n } catch (err) {\n if (err instanceof ActionError) throw err;\n throw new ActionError(\n `Failed to build mint transaction: ${err instanceof Error ? err.message : String(err)}`,\n \"BUILD_ERROR\",\n { error: err instanceof Error ? err.message : String(err) },\n );\n }\n\n return {\n policyId: policyId.toString(),\n tokenName: input.tokenName,\n amount: input.amount,\n txCbor: tx.toCbor(),\n };\n },\n};\n\n/**\n * `simple-send` -- Send ADA or a native token to a recipient address.\n * Builds an unsigned transaction that can be signed via TxDialog or sign-transaction.\n */\nexport const simpleSend: IAction<\n {\n recipientAddress: string;\n lovelace?: string;\n policyId?: string;\n assetName?: string;\n tokenAmount?: string;\n nativeScripts?: NativeScriptInput[];\n },\n { txCbor: string },\n TSchema\n> = {\n name: \"simple-send\",\n description: \"Send ADA or a native token to a recipient address.\",\n category: \"wallet\",\n inputSchema: Type.Object({\n recipientAddress: Type.String({\n description: \"Bech32 recipient address\",\n }),\n lovelace: Type.Optional(\n Type.String({\n description:\n \"Amount of lovelace to send (as string for BigInt safety). Required if not sending a token.\",\n }),\n ),\n policyId: Type.Optional(\n Type.String({ description: \"Policy ID of the token to send\" }),\n ),\n assetName: Type.Optional(\n Type.String({\n description: \"Asset name of the token to send (hex-encoded)\",\n }),\n ),\n tokenAmount: Type.Optional(\n Type.String({\n description: \"Amount of tokens to send (as string for BigInt safety)\",\n }),\n ),\n nativeScripts: NativeScriptsParam,\n }),\n outputSchema: Type.Object({\n txCbor: Type.String({\n description: \"Unsigned transaction CBOR hex ready for signing\",\n }),\n }),\n execute: async (input, context) => {\n const blaze = await getBlazeFromContext(context);\n\n // Validate: must provide lovelace or token details\n const hasToken = input.policyId && input.assetName && input.tokenAmount;\n if (!input.lovelace && !hasToken) {\n throw new ActionError(\n \"Must provide either lovelace amount or token details (policyId, assetName, tokenAmount).\",\n \"INVALID_INPUT\",\n );\n }\n\n let recipient: Core.Address;\n try {\n recipient = Core.Address.fromBech32(input.recipientAddress);\n } catch (err) {\n throw new ActionError(\n `Invalid recipient address: ${err instanceof Error ? err.message : String(err)}`,\n \"INVALID_ADDRESS\",\n { error: err instanceof Error ? err.message : String(err) },\n );\n }\n\n let value: Core.Value;\n if (hasToken) {\n const assetId =\n `${input.policyId}${input.assetName}` as Core.AssetId;\n value = makeValue(\n BigInt(input.lovelace ?? \"0\"),\n [assetId, BigInt(input.tokenAmount!)],\n );\n } else {\n value = makeValue(BigInt(input.lovelace!));\n }\n\n let tx: Core.Transaction;\n try {\n const txBuilder = blaze.newTransaction().payAssets(recipient, value);\n tx = await completeWithScripts(txBuilder, input.nativeScripts, context);\n } catch (err) {\n if (err instanceof ActionError) throw err;\n throw new ActionError(\n `Failed to build send transaction: ${err instanceof Error ? err.message : String(err)}`,\n \"BUILD_ERROR\",\n { error: err instanceof Error ? err.message : String(err) },\n );\n }\n\n return {\n txCbor: tx.toCbor(),\n };\n },\n};\n\n/**\n * `register-stake-script` -- Register a stake script credential on-chain.\n * Takes a script hash and builds a stake registration transaction.\n */\nexport const registerStakeScript: IAction<\n { scriptHash: string; nativeScripts?: NativeScriptInput[] },\n { txCbor: string },\n TSchema\n> = {\n name: \"register-stake-script\",\n description:\n \"Register a stake script credential on-chain. Takes a script hash (hex) and builds the registration transaction.\",\n category: \"utility\",\n inputSchema: Type.Object({\n scriptHash: Type.String({\n description: \"Stake script hash in hex (28 bytes / 56 hex characters)\",\n }),\n nativeScripts: NativeScriptsParam,\n }),\n outputSchema: Type.Object({\n txCbor: Type.String({\n description: \"Unsigned transaction CBOR hex ready for signing\",\n }),\n }),\n execute: async (input, context) => {\n const blaze = await getBlazeFromContext(context);\n\n // Validate hex format\n if (!/^[0-9a-fA-F]{56}$/.test(input.scriptHash)) {\n throw new ActionError(\n \"Script hash must be exactly 56 hex characters (28 bytes).\",\n \"INVALID_SCRIPT_HASH\",\n { provided: input.scriptHash },\n );\n }\n\n const credential = Core.Credential.fromCore({\n hash: Core.Hash28ByteBase16(input.scriptHash),\n type: Core.CredentialType.ScriptHash,\n });\n\n let tx: Core.Transaction;\n try {\n const txBuilder = blaze.newTransaction().addRegisterStake(credential);\n tx = await completeWithScripts(txBuilder, input.nativeScripts, context);\n } catch (err) {\n if (err instanceof ActionError) throw err;\n throw new ActionError(\n `Failed to build stake registration transaction: ${err instanceof Error ? err.message : String(err)}`,\n \"BUILD_ERROR\",\n { error: err instanceof Error ? err.message : String(err) },\n );\n }\n\n return {\n txCbor: tx.toCbor(),\n };\n },\n};\n"],"mappings":"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","ignoreList":[]}
|