@sun-protocol/sun-sdk-protocols 0.1.0-beta.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 +30 -0
- package/dist/chunk-5XDX5563.js +99 -0
- package/dist/chunk-5XDX5563.js.map +1 -0
- package/dist/chunk-C2YCVBPI.js +212 -0
- package/dist/chunk-C2YCVBPI.js.map +1 -0
- package/dist/chunk-ECCGOXNA.js +1317 -0
- package/dist/chunk-ECCGOXNA.js.map +1 -0
- package/dist/chunk-HD2S3Q7L.js +746 -0
- package/dist/chunk-HD2S3Q7L.js.map +1 -0
- package/dist/chunk-L5TZCDPH.js +561 -0
- package/dist/chunk-L5TZCDPH.js.map +1 -0
- package/dist/chunk-OM4OW4KB.js +224 -0
- package/dist/chunk-OM4OW4KB.js.map +1 -0
- package/dist/chunk-PEGREDLT.js +935 -0
- package/dist/chunk-PEGREDLT.js.map +1 -0
- package/dist/chunk-TSHXXRH2.js +103 -0
- package/dist/chunk-TSHXXRH2.js.map +1 -0
- package/dist/chunk-VFVKMC4H.js +521 -0
- package/dist/chunk-VFVKMC4H.js.map +1 -0
- package/dist/chunk-YMGZDXI4.js +1209 -0
- package/dist/chunk-YMGZDXI4.js.map +1 -0
- package/dist/common-8VQQ0FSU.d.cts +146 -0
- package/dist/common-8VQQ0FSU.d.ts +146 -0
- package/dist/execute-BNKh6dT6.d.cts +187 -0
- package/dist/execute-CVhcKZxF.d.ts +187 -0
- package/dist/index.cjs +5619 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +139 -0
- package/dist/index.d.ts +139 -0
- package/dist/index.js +200 -0
- package/dist/index.js.map +1 -0
- package/dist/intents-BSXq1HvW.d.cts +200 -0
- package/dist/intents-CwOttD75.d.ts +200 -0
- package/dist/liquidity/index.cjs +2441 -0
- package/dist/liquidity/index.cjs.map +1 -0
- package/dist/liquidity/index.d.cts +83 -0
- package/dist/liquidity/index.d.ts +83 -0
- package/dist/liquidity/index.js +32 -0
- package/dist/liquidity/index.js.map +1 -0
- package/dist/positions/index.cjs +1544 -0
- package/dist/positions/index.cjs.map +1 -0
- package/dist/positions/index.d.cts +159 -0
- package/dist/positions/index.d.ts +159 -0
- package/dist/positions/index.js +25 -0
- package/dist/positions/index.js.map +1 -0
- package/dist/pump/index.cjs +1178 -0
- package/dist/pump/index.cjs.map +1 -0
- package/dist/pump/index.d.cts +16 -0
- package/dist/pump/index.d.ts +16 -0
- package/dist/pump/index.js +29 -0
- package/dist/pump/index.js.map +1 -0
- package/dist/swap/index.cjs +2259 -0
- package/dist/swap/index.cjs.map +1 -0
- package/dist/swap/index.d.cts +33 -0
- package/dist/swap/index.d.ts +33 -0
- package/dist/swap/index.js +61 -0
- package/dist/swap/index.js.map +1 -0
- package/dist/types-BTPdCC7k.d.cts +160 -0
- package/dist/types-BfrouFmO.d.ts +160 -0
- package/package.json +94 -0
|
@@ -0,0 +1,521 @@
|
|
|
1
|
+
// src/execute-http-action.ts
|
|
2
|
+
import {
|
|
3
|
+
defaultJsonParser,
|
|
4
|
+
requestJson
|
|
5
|
+
} from "@sun-protocol/sun-sdk-api";
|
|
6
|
+
import {
|
|
7
|
+
SDKError
|
|
8
|
+
} from "@sun-protocol/sun-sdk-core";
|
|
9
|
+
async function executeHttpAction(action, fetchImpl, jsonParser = defaultJsonParser) {
|
|
10
|
+
if (action.type !== "http-request" || action.execute !== "api") {
|
|
11
|
+
throw new SDKError("SDK_INVALID_ARGUMENT", `Action ${action.id} is not an HTTP action`, {
|
|
12
|
+
actionId: action.id,
|
|
13
|
+
actionType: action.type
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
const request = action.request;
|
|
17
|
+
const headers = {
|
|
18
|
+
Accept: "application/json",
|
|
19
|
+
...request.headers
|
|
20
|
+
};
|
|
21
|
+
let body;
|
|
22
|
+
if (request.body !== void 0) {
|
|
23
|
+
if (typeof request.body === "string") {
|
|
24
|
+
body = request.body;
|
|
25
|
+
} else {
|
|
26
|
+
body = JSON.stringify(request.body);
|
|
27
|
+
if (!headers["Content-Type"]) headers["Content-Type"] = "application/json";
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return requestJson(request.url, {
|
|
31
|
+
service: "Protocols HTTP action",
|
|
32
|
+
fetchImpl,
|
|
33
|
+
jsonParser,
|
|
34
|
+
init: {
|
|
35
|
+
method: request.method,
|
|
36
|
+
headers,
|
|
37
|
+
...body !== void 0 ? { body } : {}
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// src/context.ts
|
|
43
|
+
import {
|
|
44
|
+
RouterApiClient,
|
|
45
|
+
SunPumpApiClient,
|
|
46
|
+
defaultFetch,
|
|
47
|
+
defaultJsonParser as defaultJsonParser2,
|
|
48
|
+
getServerTime
|
|
49
|
+
} from "@sun-protocol/sun-sdk-api";
|
|
50
|
+
import {
|
|
51
|
+
getChainConfig,
|
|
52
|
+
getNetworkEndpoints
|
|
53
|
+
} from "@sun-protocol/sun-sdk-chains";
|
|
54
|
+
import {
|
|
55
|
+
SDKError as SDKError2,
|
|
56
|
+
assertTronAddress
|
|
57
|
+
} from "@sun-protocol/sun-sdk-core";
|
|
58
|
+
import { createRuntime } from "@sun-protocol/sun-sdk-runtime";
|
|
59
|
+
function createDefaultIdFactory() {
|
|
60
|
+
let nextPlanId2 = 0;
|
|
61
|
+
return () => {
|
|
62
|
+
nextPlanId2 += 1;
|
|
63
|
+
return `sun-plan-${nextPlanId2}`;
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
function createProtocolsContext(options) {
|
|
67
|
+
if (options.runtime && (options.tronClient || options.wallet || options.getWallet || options.onSubmitted)) {
|
|
68
|
+
throw new SDKError2(
|
|
69
|
+
"SDK_INVALID_ARGUMENT",
|
|
70
|
+
"Use either runtime or tronClient/wallet/onSubmitted when creating a protocol client"
|
|
71
|
+
);
|
|
72
|
+
}
|
|
73
|
+
if (options.wallet && !options.tronClient) {
|
|
74
|
+
throw new SDKError2("SDK_INVALID_ARGUMENT", "wallet requires a tronClient");
|
|
75
|
+
}
|
|
76
|
+
if (options.getWallet && !options.tronClient) {
|
|
77
|
+
throw new SDKError2("SDK_INVALID_ARGUMENT", "getWallet requires a tronClient");
|
|
78
|
+
}
|
|
79
|
+
if (options.wallet && options.getWallet) {
|
|
80
|
+
throw new SDKError2("SDK_INVALID_ARGUMENT", "Use either wallet or getWallet when creating a protocol client");
|
|
81
|
+
}
|
|
82
|
+
const runtime = options.runtime ?? (options.tronClient ? createRuntime({
|
|
83
|
+
network: options.network,
|
|
84
|
+
tronClient: options.tronClient,
|
|
85
|
+
...options.wallet ? { wallet: options.wallet } : {},
|
|
86
|
+
...options.getWallet ? { getWallet: options.getWallet } : {},
|
|
87
|
+
...options.onSubmitted ? { onSubmitted: options.onSubmitted } : {}
|
|
88
|
+
}) : void 0);
|
|
89
|
+
if (runtime && runtime.network !== options.network) {
|
|
90
|
+
throw new SDKError2("SDK_INVALID_ARGUMENT", "Protocols runtime network mismatch", {
|
|
91
|
+
sdkNetwork: options.network,
|
|
92
|
+
runtimeNetwork: runtime.network
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
const chain = getChainConfig(options.network);
|
|
96
|
+
const endpoints = { ...getNetworkEndpoints(options.network), ...options.endpoints };
|
|
97
|
+
const fetchImpl = options.fetchImpl ?? defaultFetch;
|
|
98
|
+
const jsonParser = options.jsonParser ?? defaultJsonParser2;
|
|
99
|
+
const now = options.now ?? Date.now;
|
|
100
|
+
const getTransactionTime = options.getTransactionTime ?? (() => getServerTime(endpoints.time, fetchImpl, jsonParser));
|
|
101
|
+
const sunPumpApi = options.clients?.sunPumpApi ?? (endpoints.sunPump ? new SunPumpApiClient({ baseUrl: endpoints.sunPump, fetchImpl, jsonParser }) : void 0);
|
|
102
|
+
return {
|
|
103
|
+
network: options.network,
|
|
104
|
+
chain,
|
|
105
|
+
endpoints,
|
|
106
|
+
...runtime ? { runtime } : {},
|
|
107
|
+
fetchImpl,
|
|
108
|
+
jsonParser,
|
|
109
|
+
routerApi: options.clients?.routerApi ?? new RouterApiClient({ fetchImpl, jsonParser }),
|
|
110
|
+
...sunPumpApi ? { sunPumpApi } : {},
|
|
111
|
+
adapters: options.adapters ?? {},
|
|
112
|
+
now,
|
|
113
|
+
getTransactionTime: async () => {
|
|
114
|
+
try {
|
|
115
|
+
const timestamp = await getTransactionTime();
|
|
116
|
+
if (Number.isSafeInteger(timestamp) && timestamp > 0) return timestamp;
|
|
117
|
+
} catch {
|
|
118
|
+
}
|
|
119
|
+
return now();
|
|
120
|
+
},
|
|
121
|
+
idFactory: options.idFactory ?? createDefaultIdFactory()
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
function requireRuntime(context, operation) {
|
|
125
|
+
if (!context.runtime) {
|
|
126
|
+
throw new SDKError2("SDK_RUNTIME_ERROR", `${operation} requires a runtime`, {
|
|
127
|
+
operation,
|
|
128
|
+
network: context.network
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
return context.runtime;
|
|
132
|
+
}
|
|
133
|
+
function resolveProtocolContract(context, overrides, name) {
|
|
134
|
+
const configured = context.chain.contracts;
|
|
135
|
+
const address = overrides?.[name] ?? configured[name];
|
|
136
|
+
if (!address) {
|
|
137
|
+
throw new SDKError2("SDK_INVALID_ARGUMENT", `No configured address for ${name}`, { name });
|
|
138
|
+
}
|
|
139
|
+
return assertTronAddress(address, name);
|
|
140
|
+
}
|
|
141
|
+
async function requireWalletAddress(context, operation) {
|
|
142
|
+
return (await requireWalletSnapshot(context, operation)).address;
|
|
143
|
+
}
|
|
144
|
+
async function requireWalletSnapshot(context, operation) {
|
|
145
|
+
const runtime = requireRuntime(context, operation);
|
|
146
|
+
const wallet = await runtime.requireWallet(operation);
|
|
147
|
+
return {
|
|
148
|
+
wallet,
|
|
149
|
+
address: assertTronAddress(await wallet.getAddress(), "wallet address")
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
function createContextExecutor(context) {
|
|
153
|
+
const runtime = context.runtime;
|
|
154
|
+
let walletPromise;
|
|
155
|
+
const requireExecutionWallet = () => {
|
|
156
|
+
walletPromise ??= runtime?.requireWallet("transaction plan execution");
|
|
157
|
+
if (!walletPromise) {
|
|
158
|
+
return Promise.reject(new SDKError2("SDK_RUNTIME_ERROR", "Transaction plan execution requires a runtime"));
|
|
159
|
+
}
|
|
160
|
+
return walletPromise;
|
|
161
|
+
};
|
|
162
|
+
return {
|
|
163
|
+
network: context.network,
|
|
164
|
+
...runtime ? {
|
|
165
|
+
getAddress: async () => {
|
|
166
|
+
const wallet = await requireExecutionWallet();
|
|
167
|
+
return assertTronAddress(await wallet.getAddress(), "wallet address");
|
|
168
|
+
},
|
|
169
|
+
sendAction: async (action) => {
|
|
170
|
+
const wallet = await requireExecutionWallet();
|
|
171
|
+
return runtime.sendAction(action, { wallet });
|
|
172
|
+
},
|
|
173
|
+
...runtime.waitForTransactionReceipt ? { waitForTransactionReceipt: runtime.waitForTransactionReceipt.bind(runtime) } : {},
|
|
174
|
+
signTypedData: async (payload) => {
|
|
175
|
+
const wallet = await requireExecutionWallet();
|
|
176
|
+
return runtime.signTypedData(payload, { wallet });
|
|
177
|
+
}
|
|
178
|
+
} : {},
|
|
179
|
+
executeHttpAction: (action) => executeHttpAction(action, context.fetchImpl, context.jsonParser)
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
// src/common.ts
|
|
184
|
+
import {
|
|
185
|
+
Percent,
|
|
186
|
+
SDKError as SDKError3,
|
|
187
|
+
assertTronAddress as assertTronAddress2
|
|
188
|
+
} from "@sun-protocol/sun-sdk-core";
|
|
189
|
+
var PERCENT_PATTERN = /^(\d+)(?:\.(\d+))?%$/;
|
|
190
|
+
var BASE_UNIT_PATTERN = /^\d+$/;
|
|
191
|
+
function parseSlippage(value) {
|
|
192
|
+
if (value instanceof Percent) {
|
|
193
|
+
validateSlippage(value);
|
|
194
|
+
return value;
|
|
195
|
+
}
|
|
196
|
+
const match = PERCENT_PATTERN.exec(value);
|
|
197
|
+
if (!match) {
|
|
198
|
+
throw new SDKError3("SDK_INVALID_ARGUMENT", "Slippage must be a percentage string", {
|
|
199
|
+
slippage: value
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
const whole = match[1] ?? "0";
|
|
203
|
+
const fraction = match[2] ?? "";
|
|
204
|
+
const scale = 10n ** BigInt(fraction.length);
|
|
205
|
+
const percentageUnits = BigInt(whole) * scale + BigInt(fraction || "0");
|
|
206
|
+
const percent = new Percent(percentageUnits.toString(), (100n * scale).toString());
|
|
207
|
+
validateSlippage(percent);
|
|
208
|
+
return percent;
|
|
209
|
+
}
|
|
210
|
+
function validateSlippage(value) {
|
|
211
|
+
if (value.lessThan(0) || value.greaterThan(1)) {
|
|
212
|
+
throw new SDKError3("SDK_INVALID_ARGUMENT", "Slippage must be between 0% and 100%", {
|
|
213
|
+
slippage: value.toSignificant()
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
function slippageToBips(value) {
|
|
218
|
+
const percent = parseSlippage(value);
|
|
219
|
+
const numerator = BigInt(percent.numerator.toString()) * 10000n;
|
|
220
|
+
const denominator = BigInt(percent.denominator.toString());
|
|
221
|
+
if (numerator % denominator !== 0n) {
|
|
222
|
+
throw new SDKError3("SDK_INVALID_ARGUMENT", "Slippage must resolve to a whole basis point", {
|
|
223
|
+
slippage: typeof value === "string" ? value : value.toSignificant()
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
return Number(numerator / denominator);
|
|
227
|
+
}
|
|
228
|
+
function applySlippageMin(expected, slippageBips) {
|
|
229
|
+
return expected * BigInt(1e4 - slippageBips) / 10000n;
|
|
230
|
+
}
|
|
231
|
+
function applySlippageMax(expected, slippageBips) {
|
|
232
|
+
const numerator = expected * BigInt(1e4 + slippageBips);
|
|
233
|
+
return (numerator + 9999n) / 10000n;
|
|
234
|
+
}
|
|
235
|
+
function normalizeBaseUnitAmount(value, label = "amount", options = {}) {
|
|
236
|
+
if (typeof value === "number" && !Number.isSafeInteger(value)) {
|
|
237
|
+
throw new SDKError3("SDK_INVALID_ARGUMENT", `${label} must be a safe integer`, {
|
|
238
|
+
label,
|
|
239
|
+
value
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
const text = value.toString();
|
|
243
|
+
if (!BASE_UNIT_PATTERN.test(text)) {
|
|
244
|
+
throw new SDKError3("SDK_INVALID_ARGUMENT", `${label} must be an unsigned base-unit integer`, {
|
|
245
|
+
label,
|
|
246
|
+
value: text
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
const amount = BigInt(text);
|
|
250
|
+
if (options.allowZero ? amount < 0n : amount <= 0n) {
|
|
251
|
+
throw new SDKError3("SDK_INVALID_ARGUMENT", `${label} must be ${options.allowZero ? "non-negative" : "positive"}`, {
|
|
252
|
+
label,
|
|
253
|
+
value: text
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
return amount.toString();
|
|
257
|
+
}
|
|
258
|
+
function normalizeDeadline(context, options = {}) {
|
|
259
|
+
if (options.deadline !== void 0) {
|
|
260
|
+
return normalizeBaseUnitAmount(options.deadline, "deadline");
|
|
261
|
+
}
|
|
262
|
+
const ttlSeconds = options.ttlSeconds ?? 1200;
|
|
263
|
+
if (!Number.isSafeInteger(ttlSeconds) || ttlSeconds <= 0) {
|
|
264
|
+
throw new SDKError3("SDK_INVALID_ARGUMENT", "ttlSeconds must be a positive safe integer", {
|
|
265
|
+
ttlSeconds
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
return (BigInt(Math.floor(context.now() / 1e3)) + BigInt(ttlSeconds)).toString();
|
|
269
|
+
}
|
|
270
|
+
function normalizeTransactionValidForSeconds(value) {
|
|
271
|
+
const transactionValidForSeconds = value ?? 1200;
|
|
272
|
+
if (!Number.isSafeInteger(transactionValidForSeconds) || transactionValidForSeconds <= 0) {
|
|
273
|
+
throw new SDKError3(
|
|
274
|
+
"SDK_INVALID_ARGUMENT",
|
|
275
|
+
"transactionValidForSeconds must be a positive safe integer",
|
|
276
|
+
{ transactionValidForSeconds }
|
|
277
|
+
);
|
|
278
|
+
}
|
|
279
|
+
return transactionValidForSeconds;
|
|
280
|
+
}
|
|
281
|
+
function normalizeFeeLimit(value, defaultValue) {
|
|
282
|
+
const feeLimit = value ?? defaultValue;
|
|
283
|
+
if (!Number.isSafeInteger(feeLimit) || feeLimit <= 0) {
|
|
284
|
+
throw new SDKError3("SDK_INVALID_ARGUMENT", "feeLimit must be a positive safe integer in sun", {
|
|
285
|
+
feeLimit
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
return feeLimit;
|
|
289
|
+
}
|
|
290
|
+
async function resolveTransactionDeadline(context, transactionValidForSeconds) {
|
|
291
|
+
const nowSeconds = BigInt(Math.ceil(await context.getTransactionTime() / 1e3));
|
|
292
|
+
return (nowSeconds + BigInt(transactionValidForSeconds)).toString();
|
|
293
|
+
}
|
|
294
|
+
async function normalizeRecipient(context, recipient, operation, walletAddress) {
|
|
295
|
+
if (recipient !== void 0) return assertTronAddress2(recipient, "recipient");
|
|
296
|
+
if (walletAddress !== void 0) return walletAddress;
|
|
297
|
+
return requireWalletAddress(context, operation);
|
|
298
|
+
}
|
|
299
|
+
function nextPlanId(context, prefix) {
|
|
300
|
+
return `${prefix}-${context.idFactory()}`;
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
// src/errors.ts
|
|
304
|
+
import {
|
|
305
|
+
SDKError as SDKError4
|
|
306
|
+
} from "@sun-protocol/sun-sdk-core";
|
|
307
|
+
function isWalletRejection(error) {
|
|
308
|
+
if (!error || typeof error !== "object") return false;
|
|
309
|
+
const candidate = error;
|
|
310
|
+
return candidate.code === 4001 || typeof candidate.message === "string" && /reject|denied|cancel/i.test(candidate.message);
|
|
311
|
+
}
|
|
312
|
+
function normalizeProtocolError(error, fallbackCode, message, context = {}) {
|
|
313
|
+
if (error instanceof SDKError4) return error;
|
|
314
|
+
const code = isWalletRejection(error) ? "SDK_WALLET_REJECTED" : fallbackCode;
|
|
315
|
+
return new SDKError4(code, message, { ...context, cause: error });
|
|
316
|
+
}
|
|
317
|
+
function withExecutionContext(error, context) {
|
|
318
|
+
return new SDKError4(error.code, error.message, {
|
|
319
|
+
...error.context,
|
|
320
|
+
actionId: context.actionId,
|
|
321
|
+
completedActionIds: context.completedActionIds,
|
|
322
|
+
cause: error
|
|
323
|
+
});
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
// src/execute-plan.ts
|
|
327
|
+
import {
|
|
328
|
+
SDKError as SDKError5
|
|
329
|
+
} from "@sun-protocol/sun-sdk-core";
|
|
330
|
+
async function executePlanAction(action, executor, completedActions = []) {
|
|
331
|
+
try {
|
|
332
|
+
if (action.waitForReceipt && !executor.waitForTransactionReceipt) {
|
|
333
|
+
throw new SDKError5(
|
|
334
|
+
"SDK_RUNTIME_ERROR",
|
|
335
|
+
`Action ${action.id} requires transaction receipt waiting capability`,
|
|
336
|
+
{ actionId: action.id, finality: action.waitForReceipt }
|
|
337
|
+
);
|
|
338
|
+
}
|
|
339
|
+
if (action.execute === "runtime") {
|
|
340
|
+
let actionToSend;
|
|
341
|
+
let materializedAction;
|
|
342
|
+
if (action.type === "deferred-contract-call") {
|
|
343
|
+
if (!executor.materializeAction) {
|
|
344
|
+
throw new SDKError5("SDK_RUNTIME_ERROR", `Action ${action.id} requires a deferred action materializer`);
|
|
345
|
+
}
|
|
346
|
+
const resolvedAction = await executor.materializeAction(action, completedActions);
|
|
347
|
+
materializedAction = {
|
|
348
|
+
...resolvedAction,
|
|
349
|
+
id: action.id,
|
|
350
|
+
...action.intent === void 0 ? {} : { intent: action.intent }
|
|
351
|
+
};
|
|
352
|
+
actionToSend = materializedAction;
|
|
353
|
+
} else if (action.type === "contract-call" || action.type === "approve") {
|
|
354
|
+
actionToSend = action;
|
|
355
|
+
} else {
|
|
356
|
+
throw new SDKError5(
|
|
357
|
+
"SDK_RUNTIME_ERROR",
|
|
358
|
+
`Runtime action ${action.id} materialized to unsupported type: ${action.type}`
|
|
359
|
+
);
|
|
360
|
+
}
|
|
361
|
+
if (!executor.sendAction) {
|
|
362
|
+
throw new SDKError5("SDK_RUNTIME_ERROR", `Action ${action.id} requires a runtime executor`);
|
|
363
|
+
}
|
|
364
|
+
const result = await executor.sendAction(actionToSend);
|
|
365
|
+
const receipt = action.waitForReceipt && executor.waitForTransactionReceipt ? await executor.waitForTransactionReceipt(result.txid, { finality: action.waitForReceipt }) : void 0;
|
|
366
|
+
if (receipt && !receipt.success) {
|
|
367
|
+
throw new SDKError5("SDK_CONTRACT_ERROR", `Transaction ${result.txid} failed`, {
|
|
368
|
+
actionId: action.id,
|
|
369
|
+
txid: result.txid,
|
|
370
|
+
receipt
|
|
371
|
+
});
|
|
372
|
+
}
|
|
373
|
+
return {
|
|
374
|
+
action,
|
|
375
|
+
result,
|
|
376
|
+
txid: result.txid,
|
|
377
|
+
...receipt ? { receipt } : {},
|
|
378
|
+
...materializedAction ? { materializedAction } : {}
|
|
379
|
+
};
|
|
380
|
+
}
|
|
381
|
+
if (action.execute === "wallet-signature") {
|
|
382
|
+
if (!action.typedData) {
|
|
383
|
+
throw new SDKError5("SDK_INVALID_ARGUMENT", `Action ${action.id} is missing typedData`);
|
|
384
|
+
}
|
|
385
|
+
if (!executor.signTypedData) {
|
|
386
|
+
throw new SDKError5("SDK_WALLET_CAPABILITY_ERROR", `Action ${action.id} requires typed-data signing`);
|
|
387
|
+
}
|
|
388
|
+
const signature = await executor.signTypedData(action.typedData);
|
|
389
|
+
return { action, result: signature };
|
|
390
|
+
}
|
|
391
|
+
if (action.execute === "api") {
|
|
392
|
+
if (!executor.executeHttpAction) {
|
|
393
|
+
throw new SDKError5("SDK_RUNTIME_ERROR", `Action ${action.id} requires an API executor`);
|
|
394
|
+
}
|
|
395
|
+
return { action, result: await executor.executeHttpAction(action) };
|
|
396
|
+
}
|
|
397
|
+
throw new SDKError5("SDK_RUNTIME_ERROR", "Unsupported action executor");
|
|
398
|
+
} catch (error) {
|
|
399
|
+
const normalized = normalizeProtocolError(
|
|
400
|
+
error,
|
|
401
|
+
action.execute === "api" ? "SDK_API_ERROR" : "SDK_RUNTIME_ERROR",
|
|
402
|
+
`Failed to execute action ${action.id}`
|
|
403
|
+
);
|
|
404
|
+
throw withExecutionContext(normalized, {
|
|
405
|
+
actionId: action.id,
|
|
406
|
+
completedActionIds: completedActions.map((result) => result.action.id)
|
|
407
|
+
});
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
async function executeTransactionPlan(plan, executor) {
|
|
411
|
+
if (executor.network && executor.network !== plan.network) {
|
|
412
|
+
throw new SDKError5("SDK_INVALID_ARGUMENT", "Plan and executor network mismatch", {
|
|
413
|
+
planNetwork: plan.network,
|
|
414
|
+
executorNetwork: executor.network
|
|
415
|
+
});
|
|
416
|
+
}
|
|
417
|
+
if (plan.owner) {
|
|
418
|
+
if (!executor.getAddress) {
|
|
419
|
+
throw new SDKError5("SDK_RUNTIME_ERROR", `Plan ${plan.id} requires a wallet address`, {
|
|
420
|
+
planId: plan.id,
|
|
421
|
+
owner: plan.owner
|
|
422
|
+
});
|
|
423
|
+
}
|
|
424
|
+
const actualAddress = await executor.getAddress();
|
|
425
|
+
if (actualAddress !== plan.owner) {
|
|
426
|
+
throw new SDKError5(
|
|
427
|
+
"SDK_WALLET_ACCOUNT_MISMATCH",
|
|
428
|
+
"Transaction plan was created for a different wallet",
|
|
429
|
+
{
|
|
430
|
+
planId: plan.id,
|
|
431
|
+
expectedAddress: plan.owner,
|
|
432
|
+
actualAddress
|
|
433
|
+
}
|
|
434
|
+
);
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
const orderedActions = [...plan.approvals, ...plan.transactions];
|
|
438
|
+
const receiptAction = orderedActions.find((action) => action.waitForReceipt !== void 0);
|
|
439
|
+
if (receiptAction && !executor.waitForTransactionReceipt) {
|
|
440
|
+
throw new SDKError5(
|
|
441
|
+
"SDK_RUNTIME_ERROR",
|
|
442
|
+
`Action ${receiptAction.id} requires transaction receipt waiting capability`,
|
|
443
|
+
{ planId: plan.id, actionId: receiptAction.id, finality: receiptAction.waitForReceipt }
|
|
444
|
+
);
|
|
445
|
+
}
|
|
446
|
+
const actionResults = [];
|
|
447
|
+
const txids = [];
|
|
448
|
+
let finalResult;
|
|
449
|
+
for (const action of orderedActions) {
|
|
450
|
+
const actionResult = await executePlanAction(action, executor, actionResults);
|
|
451
|
+
actionResults.push(actionResult);
|
|
452
|
+
if (action.execute === "runtime") {
|
|
453
|
+
if (!actionResult.txid) {
|
|
454
|
+
throw new SDKError5("SDK_RUNTIME_ERROR", `Runtime action ${action.id} did not return a transaction id`);
|
|
455
|
+
}
|
|
456
|
+
txids.push(actionResult.txid);
|
|
457
|
+
const raw = typeof actionResult.result === "object" && actionResult.result !== null ? actionResult.result.raw : void 0;
|
|
458
|
+
finalResult = { type: "transaction", txid: actionResult.txid, raw };
|
|
459
|
+
continue;
|
|
460
|
+
}
|
|
461
|
+
if (action.execute === "wallet-signature") {
|
|
462
|
+
finalResult = { type: "signature", signature: actionResult.result };
|
|
463
|
+
continue;
|
|
464
|
+
}
|
|
465
|
+
finalResult = { type: "api", data: actionResult.result };
|
|
466
|
+
}
|
|
467
|
+
return {
|
|
468
|
+
plan,
|
|
469
|
+
actions: actionResults,
|
|
470
|
+
txids,
|
|
471
|
+
finalResult
|
|
472
|
+
};
|
|
473
|
+
}
|
|
474
|
+
function isTransactionPlan(input) {
|
|
475
|
+
if (typeof input !== "object" || input === null) return false;
|
|
476
|
+
const candidate = input;
|
|
477
|
+
return Array.isArray(candidate.approvals) && Array.isArray(candidate.transactions);
|
|
478
|
+
}
|
|
479
|
+
async function executePlanTransactions(plan, executor) {
|
|
480
|
+
const result = await executeTransactionPlan(
|
|
481
|
+
{ ...plan, approvals: [] },
|
|
482
|
+
executor
|
|
483
|
+
);
|
|
484
|
+
return { ...result, plan };
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
// src/internal/intents.ts
|
|
488
|
+
function attachApprovalIntent(actions, scope, tokenSymbol) {
|
|
489
|
+
const intent = { kind: "approve", scope, tokenSymbol };
|
|
490
|
+
return actions.map((action) => action.execute === "runtime" ? { ...action, intent } : action);
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
export {
|
|
494
|
+
executeHttpAction,
|
|
495
|
+
createProtocolsContext,
|
|
496
|
+
requireRuntime,
|
|
497
|
+
resolveProtocolContract,
|
|
498
|
+
requireWalletAddress,
|
|
499
|
+
requireWalletSnapshot,
|
|
500
|
+
createContextExecutor,
|
|
501
|
+
parseSlippage,
|
|
502
|
+
validateSlippage,
|
|
503
|
+
slippageToBips,
|
|
504
|
+
applySlippageMin,
|
|
505
|
+
applySlippageMax,
|
|
506
|
+
normalizeBaseUnitAmount,
|
|
507
|
+
normalizeDeadline,
|
|
508
|
+
normalizeTransactionValidForSeconds,
|
|
509
|
+
normalizeFeeLimit,
|
|
510
|
+
resolveTransactionDeadline,
|
|
511
|
+
normalizeRecipient,
|
|
512
|
+
nextPlanId,
|
|
513
|
+
normalizeProtocolError,
|
|
514
|
+
withExecutionContext,
|
|
515
|
+
executePlanAction,
|
|
516
|
+
executeTransactionPlan,
|
|
517
|
+
isTransactionPlan,
|
|
518
|
+
executePlanTransactions,
|
|
519
|
+
attachApprovalIntent
|
|
520
|
+
};
|
|
521
|
+
//# sourceMappingURL=chunk-VFVKMC4H.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/execute-http-action.ts","../src/context.ts","../src/common.ts","../src/errors.ts","../src/execute-plan.ts","../src/internal/intents.ts"],"sourcesContent":["import {\n defaultJsonParser,\n requestJson,\n type FetchLike,\n type JsonParser,\n} from '@sun-protocol/sun-sdk-api'\nimport {\n SDKError,\n type HttpRequestAction,\n type TransactionAction,\n} from '@sun-protocol/sun-sdk-core'\n\nexport async function executeHttpAction(\n action: TransactionAction,\n fetchImpl: FetchLike,\n jsonParser: JsonParser = defaultJsonParser,\n): Promise<unknown> {\n if (action.type !== 'http-request' || action.execute !== 'api') {\n throw new SDKError('SDK_INVALID_ARGUMENT', `Action ${action.id} is not an HTTP action`, {\n actionId: action.id,\n actionType: action.type,\n })\n }\n\n const request = (action as HttpRequestAction).request\n const headers: Record<string, string> = {\n Accept: 'application/json',\n ...request.headers,\n }\n let body: BodyInit | undefined\n if (request.body !== undefined) {\n if (typeof request.body === 'string') {\n body = request.body\n } else {\n body = JSON.stringify(request.body)\n if (!headers['Content-Type']) headers['Content-Type'] = 'application/json'\n }\n }\n\n return requestJson(request.url, {\n service: 'Protocols HTTP action',\n fetchImpl,\n jsonParser,\n init: {\n method: request.method,\n headers,\n ...(body !== undefined ? { body } : {}),\n },\n })\n}\n","import {\n RouterApiClient,\n SunPumpApiClient,\n defaultFetch,\n defaultJsonParser,\n getServerTime,\n type FetchLike,\n type JsonParser,\n} from '@sun-protocol/sun-sdk-api'\nimport {\n getChainConfig,\n getNetworkEndpoints,\n type ChainConfig,\n type NetworkEndpoints,\n} from '@sun-protocol/sun-sdk-chains'\nimport {\n SDKError,\n assertTronAddress,\n type Network,\n type TronAddress,\n} from '@sun-protocol/sun-sdk-core'\nimport { createRuntime, type Runtime, type WalletAdapter } from '@sun-protocol/sun-sdk-runtime'\nimport { executeHttpAction } from './execute-http-action.js'\nimport type { TransactionPlanExecutor } from './execute-plan.js'\nimport type {\n ProtocolAdapterDependencies,\n ContractOverrides,\n ProtocolContractName,\n SunSDKCreateOptions,\n} from './types/options.js'\n\nexport interface ProtocolsContext {\n readonly network: Network\n readonly chain: ChainConfig\n readonly endpoints: NetworkEndpoints\n readonly runtime?: Runtime\n readonly fetchImpl: FetchLike\n readonly jsonParser?: JsonParser\n readonly routerApi: RouterApiClient\n readonly sunPumpApi?: SunPumpApiClient\n readonly adapters: ProtocolAdapterDependencies\n readonly now: () => number\n readonly getTransactionTime: () => Promise<number>\n readonly idFactory: () => string\n}\n\nfunction createDefaultIdFactory(): () => string {\n let nextPlanId = 0\n return () => {\n nextPlanId += 1\n return `sun-plan-${nextPlanId}`\n }\n}\n\n/**\n * Creates the public context used by staged transaction orchestration.\n *\n * Keep this available to consumers that render and execute TransactionPlan\n * actions one step at a time instead of using a client's execute() shortcut.\n */\nexport function createProtocolsContext(options: SunSDKCreateOptions): ProtocolsContext {\n if (options.runtime && (options.tronClient || options.wallet || options.getWallet || options.onSubmitted)) {\n throw new SDKError(\n 'SDK_INVALID_ARGUMENT',\n 'Use either runtime or tronClient/wallet/onSubmitted when creating a protocol client',\n )\n }\n if (options.wallet && !options.tronClient) {\n throw new SDKError('SDK_INVALID_ARGUMENT', 'wallet requires a tronClient')\n }\n if (options.getWallet && !options.tronClient) {\n throw new SDKError('SDK_INVALID_ARGUMENT', 'getWallet requires a tronClient')\n }\n if (options.wallet && options.getWallet) {\n throw new SDKError('SDK_INVALID_ARGUMENT', 'Use either wallet or getWallet when creating a protocol client')\n }\n\n const runtime = options.runtime ?? (options.tronClient\n ? createRuntime({\n network: options.network,\n tronClient: options.tronClient,\n ...(options.wallet ? { wallet: options.wallet } : {}),\n ...(options.getWallet ? { getWallet: options.getWallet } : {}),\n ...(options.onSubmitted ? { onSubmitted: options.onSubmitted } : {}),\n })\n : undefined)\n\n if (runtime && runtime.network !== options.network) {\n throw new SDKError('SDK_INVALID_ARGUMENT', 'Protocols runtime network mismatch', {\n sdkNetwork: options.network,\n runtimeNetwork: runtime.network,\n })\n }\n\n const chain = getChainConfig(options.network)\n const endpoints = { ...getNetworkEndpoints(options.network), ...options.endpoints }\n const fetchImpl = options.fetchImpl ?? defaultFetch\n const jsonParser = options.jsonParser ?? defaultJsonParser\n const now = options.now ?? Date.now\n const getTransactionTime = options.getTransactionTime ?? (() => getServerTime(endpoints.time, fetchImpl, jsonParser))\n const sunPumpApi = options.clients?.sunPumpApi ??\n (endpoints.sunPump\n ? new SunPumpApiClient({ baseUrl: endpoints.sunPump, fetchImpl, jsonParser })\n : undefined)\n\n return {\n network: options.network,\n chain,\n endpoints,\n ...(runtime ? { runtime } : {}),\n fetchImpl,\n jsonParser,\n routerApi: options.clients?.routerApi ?? new RouterApiClient({ fetchImpl, jsonParser }),\n ...(sunPumpApi ? { sunPumpApi } : {}),\n adapters: options.adapters ?? {},\n now,\n getTransactionTime: async () => {\n try {\n const timestamp = await getTransactionTime()\n if (Number.isSafeInteger(timestamp) && timestamp > 0) return timestamp\n } catch {\n // Preserve the local-time fallback, sampled after the request fails.\n }\n return now()\n },\n idFactory: options.idFactory ?? createDefaultIdFactory(),\n }\n}\n\nexport function requireRuntime(context: ProtocolsContext, operation: string): Runtime {\n if (!context.runtime) {\n throw new SDKError('SDK_RUNTIME_ERROR', `${operation} requires a runtime`, {\n operation,\n network: context.network,\n })\n }\n return context.runtime\n}\n\nexport function resolveProtocolContract(\n context: ProtocolsContext,\n overrides: ContractOverrides | undefined,\n name: ProtocolContractName,\n): TronAddress {\n const configured = context.chain.contracts as Partial<Record<ProtocolContractName, TronAddress>>\n const address = overrides?.[name] ?? configured[name]\n if (!address) {\n throw new SDKError('SDK_INVALID_ARGUMENT', `No configured address for ${name}`, { name })\n }\n return assertTronAddress(address, name)\n}\n\nexport async function requireWalletAddress(\n context: ProtocolsContext,\n operation: string,\n): Promise<TronAddress> {\n return (await requireWalletSnapshot(context, operation)).address\n}\n\nexport interface ProtocolWalletSnapshot {\n readonly wallet: WalletAdapter\n readonly address: TronAddress\n}\n\n/** Resolves one wallet adapter for the current plan boundary. */\nexport async function requireWalletSnapshot(\n context: ProtocolsContext,\n operation: string,\n): Promise<ProtocolWalletSnapshot> {\n const runtime = requireRuntime(context, operation)\n const wallet = await runtime.requireWallet(operation)\n return {\n wallet,\n address: assertTronAddress(await wallet.getAddress(), 'wallet address'),\n }\n}\n\n/** Creates the base public executor for staged TransactionPlan execution. */\nexport function createContextExecutor(context: ProtocolsContext): TransactionPlanExecutor {\n const runtime = context.runtime\n let walletPromise: ReturnType<Runtime['requireWallet']> | undefined\n const requireExecutionWallet = () => {\n walletPromise ??= runtime?.requireWallet('transaction plan execution')\n if (!walletPromise) {\n return Promise.reject(new SDKError('SDK_RUNTIME_ERROR', 'Transaction plan execution requires a runtime'))\n }\n return walletPromise\n }\n return {\n network: context.network,\n ...(runtime\n ? {\n getAddress: async () => {\n const wallet = await requireExecutionWallet()\n return assertTronAddress(await wallet.getAddress(), 'wallet address')\n },\n sendAction: async (action: Parameters<Runtime['sendAction']>[0]) => {\n const wallet = await requireExecutionWallet()\n return runtime.sendAction(action, { wallet })\n },\n ...(runtime.waitForTransactionReceipt\n ? { waitForTransactionReceipt: runtime.waitForTransactionReceipt.bind(runtime) }\n : {}),\n signTypedData: async (payload: Parameters<Runtime['signTypedData']>[0]) => {\n const wallet = await requireExecutionWallet()\n return runtime.signTypedData(payload, { wallet })\n },\n }\n : {}),\n executeHttpAction: (action) => executeHttpAction(action, context.fetchImpl, context.jsonParser),\n }\n}\n","import {\n Percent,\n SDKError,\n assertTronAddress,\n type BigintIsh,\n type TronAddress,\n} from '@sun-protocol/sun-sdk-core'\nimport type { ProtocolsContext } from './context.js'\nimport { requireWalletAddress } from './context.js'\nimport type {\n PlanTimingOptions,\n SlippageInput,\n} from './types/common.js'\n\nconst PERCENT_PATTERN = /^(\\d+)(?:\\.(\\d+))?%$/\nconst BASE_UNIT_PATTERN = /^\\d+$/\n\nexport function parseSlippage(value: SlippageInput): Percent {\n if (value instanceof Percent) {\n validateSlippage(value)\n return value\n }\n\n const match = PERCENT_PATTERN.exec(value)\n if (!match) {\n throw new SDKError('SDK_INVALID_ARGUMENT', 'Slippage must be a percentage string', {\n slippage: value,\n })\n }\n\n const whole = match[1] ?? '0'\n const fraction = match[2] ?? ''\n const scale = 10n ** BigInt(fraction.length)\n const percentageUnits = BigInt(whole) * scale + BigInt(fraction || '0')\n const percent = new Percent(percentageUnits.toString(), (100n * scale).toString())\n validateSlippage(percent)\n return percent\n}\n\nexport function validateSlippage(value: Percent): void {\n if (value.lessThan(0) || value.greaterThan(1)) {\n throw new SDKError('SDK_INVALID_ARGUMENT', 'Slippage must be between 0% and 100%', {\n slippage: value.toSignificant(),\n })\n }\n}\n\nexport function slippageToBips(value: SlippageInput): number {\n const percent = parseSlippage(value)\n const numerator = BigInt(percent.numerator.toString()) * 10_000n\n const denominator = BigInt(percent.denominator.toString())\n if (numerator % denominator !== 0n) {\n throw new SDKError('SDK_INVALID_ARGUMENT', 'Slippage must resolve to a whole basis point', {\n slippage: typeof value === 'string' ? value : value.toSignificant(),\n })\n }\n return Number(numerator / denominator)\n}\n\nexport function applySlippageMin(expected: bigint, slippageBips: number): bigint {\n return (expected * BigInt(10_000 - slippageBips)) / 10_000n\n}\n\nexport function applySlippageMax(expected: bigint, slippageBips: number): bigint {\n const numerator = expected * BigInt(10_000 + slippageBips)\n return (numerator + 9_999n) / 10_000n\n}\n\nexport function normalizeBaseUnitAmount(\n value: BigintIsh,\n label = 'amount',\n options: { allowZero?: boolean } = {},\n): string {\n if (typeof value === 'number' && !Number.isSafeInteger(value)) {\n throw new SDKError('SDK_INVALID_ARGUMENT', `${label} must be a safe integer`, {\n label,\n value,\n })\n }\n const text = value.toString()\n if (!BASE_UNIT_PATTERN.test(text)) {\n throw new SDKError('SDK_INVALID_ARGUMENT', `${label} must be an unsigned base-unit integer`, {\n label,\n value: text,\n })\n }\n\n const amount = BigInt(text)\n if (options.allowZero ? amount < 0n : amount <= 0n) {\n throw new SDKError('SDK_INVALID_ARGUMENT', `${label} must be ${options.allowZero ? 'non-negative' : 'positive'}`, {\n label,\n value: text,\n })\n }\n return amount.toString()\n}\n\nexport function normalizeDeadline(\n context: ProtocolsContext,\n options: PlanTimingOptions = {},\n): string {\n if (options.deadline !== undefined) {\n return normalizeBaseUnitAmount(options.deadline, 'deadline')\n }\n\n const ttlSeconds = options.ttlSeconds ?? 1_200\n if (!Number.isSafeInteger(ttlSeconds) || ttlSeconds <= 0) {\n throw new SDKError('SDK_INVALID_ARGUMENT', 'ttlSeconds must be a positive safe integer', {\n ttlSeconds,\n })\n }\n\n return (BigInt(Math.floor(context.now() / 1_000)) + BigInt(ttlSeconds)).toString()\n}\n\nexport function normalizeTransactionValidForSeconds(value: number | undefined): number {\n const transactionValidForSeconds = value ?? 1_200\n if (!Number.isSafeInteger(transactionValidForSeconds) || transactionValidForSeconds <= 0) {\n throw new SDKError(\n 'SDK_INVALID_ARGUMENT',\n 'transactionValidForSeconds must be a positive safe integer',\n { transactionValidForSeconds },\n )\n }\n return transactionValidForSeconds\n}\n\nexport function normalizeFeeLimit(value: number | undefined, defaultValue: number): number {\n const feeLimit = value ?? defaultValue\n if (!Number.isSafeInteger(feeLimit) || feeLimit <= 0) {\n throw new SDKError('SDK_INVALID_ARGUMENT', 'feeLimit must be a positive safe integer in sun', {\n feeLimit,\n })\n }\n return feeLimit\n}\n\nexport async function resolveTransactionDeadline(\n context: ProtocolsContext,\n transactionValidForSeconds: number,\n): Promise<string> {\n const nowSeconds = BigInt(Math.ceil(await context.getTransactionTime() / 1_000))\n return (nowSeconds + BigInt(transactionValidForSeconds)).toString()\n}\n\nexport async function normalizeRecipient(\n context: ProtocolsContext,\n recipient: TronAddress | string | undefined,\n operation: string,\n walletAddress?: TronAddress,\n): Promise<TronAddress> {\n if (recipient !== undefined) return assertTronAddress(recipient, 'recipient')\n if (walletAddress !== undefined) return walletAddress\n return requireWalletAddress(context, operation)\n}\n\nexport function nextPlanId(context: ProtocolsContext, prefix: string): string {\n return `${prefix}-${context.idFactory()}`\n}\n","import {\n SDKError,\n} from '@sun-protocol/sun-sdk-core'\n\nfunction isWalletRejection(error: unknown): boolean {\n if (!error || typeof error !== 'object') return false\n const candidate = error as { code?: unknown; message?: unknown }\n return candidate.code === 4001 ||\n (typeof candidate.message === 'string' && /reject|denied|cancel/i.test(candidate.message))\n}\n\nexport function normalizeProtocolError(\n error: unknown,\n fallbackCode: string,\n message: string,\n context: Record<string, unknown> = {},\n): SDKError<string> {\n if (error instanceof SDKError) return error as SDKError<string>\n const code = isWalletRejection(error) ? 'SDK_WALLET_REJECTED' : fallbackCode\n return new SDKError(code, message, { ...context, cause: error })\n}\n\nexport function withExecutionContext(\n error: SDKError<string>,\n context: {\n readonly actionId: string\n readonly completedActionIds: readonly string[]\n },\n): SDKError<string> {\n return new SDKError<string>(error.code, error.message, {\n ...error.context,\n actionId: context.actionId,\n completedActionIds: context.completedActionIds,\n cause: error,\n })\n}\n","import {\n SDKError,\n type ContractCallAction,\n type DeferredContractCallAction,\n type Network,\n type TransactionAction,\n type TronAddress,\n} from '@sun-protocol/sun-sdk-core'\nimport type { TypedDataPayload } from '@sun-protocol/sun-sdk-runtime'\nimport type { Runtime } from '@sun-protocol/sun-sdk-runtime'\nimport {\n normalizeProtocolError,\n withExecutionContext,\n} from './errors.js'\nimport type { ExecutedActionResult, TransactionPlan, TransactionPlanExecutionResult } from './types/plan.js'\n\nexport interface TransactionPlanExecutor {\n readonly network?: Network\n getAddress?(): Promise<TronAddress>\n sendAction?: Runtime['sendAction']\n waitForTransactionReceipt?: NonNullable<Runtime['waitForTransactionReceipt']>\n signTypedData?: Runtime['signTypedData']\n executeHttpAction?(action: TransactionAction): Promise<unknown>\n materializeAction?(\n action: DeferredContractCallAction,\n completedActions: readonly ExecutedActionResult[],\n ): Promise<ContractCallAction>\n}\n\n/** Executes one plan action without retaining any client-side execution state. */\nexport async function executePlanAction(\n action: TransactionAction,\n executor: TransactionPlanExecutor,\n completedActions: readonly ExecutedActionResult[] = [],\n): Promise<ExecutedActionResult> {\n try {\n if (action.waitForReceipt && !executor.waitForTransactionReceipt) {\n throw new SDKError(\n 'SDK_RUNTIME_ERROR',\n `Action ${action.id} requires transaction receipt waiting capability`,\n { actionId: action.id, finality: action.waitForReceipt },\n )\n }\n\n if (action.execute === 'runtime') {\n let actionToSend: ContractCallAction\n let materializedAction: ContractCallAction | undefined\n\n if (action.type === 'deferred-contract-call') {\n if (!executor.materializeAction) {\n throw new SDKError('SDK_RUNTIME_ERROR', `Action ${action.id} requires a deferred action materializer`)\n }\n const resolvedAction = await executor.materializeAction(action, completedActions)\n materializedAction = {\n ...resolvedAction,\n id: action.id,\n ...(action.intent === undefined ? {} : { intent: action.intent }),\n }\n actionToSend = materializedAction\n } else if (action.type === 'contract-call' || action.type === 'approve') {\n actionToSend = action\n } else {\n throw new SDKError(\n 'SDK_RUNTIME_ERROR',\n `Runtime action ${action.id} materialized to unsupported type: ${action.type}`,\n )\n }\n\n if (!executor.sendAction) {\n throw new SDKError('SDK_RUNTIME_ERROR', `Action ${action.id} requires a runtime executor`)\n }\n const result = await executor.sendAction(actionToSend)\n const receipt = action.waitForReceipt && executor.waitForTransactionReceipt\n ? await executor.waitForTransactionReceipt(result.txid, { finality: action.waitForReceipt })\n : undefined\n if (receipt && !receipt.success) {\n throw new SDKError('SDK_CONTRACT_ERROR', `Transaction ${result.txid} failed`, {\n actionId: action.id,\n txid: result.txid,\n receipt,\n })\n }\n return {\n action,\n result,\n txid: result.txid,\n ...(receipt ? { receipt } : {}),\n ...(materializedAction ? { materializedAction } : {}),\n }\n }\n\n if (action.execute === 'wallet-signature') {\n if (!action.typedData) {\n throw new SDKError('SDK_INVALID_ARGUMENT', `Action ${action.id} is missing typedData`)\n }\n if (!executor.signTypedData) {\n throw new SDKError('SDK_WALLET_CAPABILITY_ERROR', `Action ${action.id} requires typed-data signing`)\n }\n const signature = await executor.signTypedData(action.typedData as TypedDataPayload)\n return { action, result: signature }\n }\n\n if (action.execute === 'api') {\n if (!executor.executeHttpAction) {\n throw new SDKError('SDK_RUNTIME_ERROR', `Action ${action.id} requires an API executor`)\n }\n return { action, result: await executor.executeHttpAction(action) }\n }\n\n throw new SDKError('SDK_RUNTIME_ERROR', 'Unsupported action executor')\n } catch (error) {\n const normalized = normalizeProtocolError(\n error,\n action.execute === 'api' ? 'SDK_API_ERROR' : 'SDK_RUNTIME_ERROR',\n `Failed to execute action ${action.id}`,\n )\n throw withExecutionContext(normalized, {\n actionId: action.id,\n completedActionIds: completedActions.map((result) => result.action.id),\n })\n }\n}\n\nexport async function executeTransactionPlan(\n plan: TransactionPlan,\n executor: TransactionPlanExecutor,\n): Promise<TransactionPlanExecutionResult> {\n if (executor.network && executor.network !== plan.network) {\n throw new SDKError('SDK_INVALID_ARGUMENT', 'Plan and executor network mismatch', {\n planNetwork: plan.network,\n executorNetwork: executor.network,\n })\n }\n if (plan.owner) {\n if (!executor.getAddress) {\n throw new SDKError('SDK_RUNTIME_ERROR', `Plan ${plan.id} requires a wallet address`, {\n planId: plan.id,\n owner: plan.owner,\n })\n }\n const actualAddress = await executor.getAddress()\n if (actualAddress !== plan.owner) {\n throw new SDKError(\n 'SDK_WALLET_ACCOUNT_MISMATCH',\n 'Transaction plan was created for a different wallet',\n {\n planId: plan.id,\n expectedAddress: plan.owner,\n actualAddress,\n },\n )\n }\n }\n\n const orderedActions = [...plan.approvals, ...plan.transactions]\n const receiptAction = orderedActions.find((action) => action.waitForReceipt !== undefined)\n if (receiptAction && !executor.waitForTransactionReceipt) {\n throw new SDKError(\n 'SDK_RUNTIME_ERROR',\n `Action ${receiptAction.id} requires transaction receipt waiting capability`,\n { planId: plan.id, actionId: receiptAction.id, finality: receiptAction.waitForReceipt },\n )\n }\n const actionResults: ExecutedActionResult[] = []\n const txids: string[] = []\n let finalResult: TransactionPlanExecutionResult['finalResult']\n\n for (const action of orderedActions) {\n const actionResult = await executePlanAction(action, executor, actionResults)\n actionResults.push(actionResult)\n\n if (action.execute === 'runtime') {\n if (!actionResult.txid) {\n throw new SDKError('SDK_RUNTIME_ERROR', `Runtime action ${action.id} did not return a transaction id`)\n }\n txids.push(actionResult.txid)\n const raw = typeof actionResult.result === 'object' && actionResult.result !== null\n ? (actionResult.result as { raw?: unknown }).raw\n : undefined\n finalResult = { type: 'transaction', txid: actionResult.txid, raw }\n continue\n }\n\n if (action.execute === 'wallet-signature') {\n finalResult = { type: 'signature', signature: actionResult.result as string }\n continue\n }\n\n finalResult = { type: 'api', data: actionResult.result }\n }\n\n return {\n plan,\n actions: actionResults,\n txids,\n finalResult,\n }\n}\n\nexport function isTransactionPlan(input: unknown): input is TransactionPlan {\n if (typeof input !== 'object' || input === null) return false\n const candidate = input as Partial<TransactionPlan>\n return Array.isArray(candidate.approvals) && Array.isArray(candidate.transactions)\n}\n\n/** Executes only a plan's final transactions and preserves the caller's original plan. */\nexport async function executePlanTransactions(\n plan: TransactionPlan,\n executor: TransactionPlanExecutor,\n): Promise<TransactionPlanExecutionResult> {\n const result = await executeTransactionPlan(\n { ...plan, approvals: [] },\n executor,\n )\n return { ...result, plan }\n}\n","import type {\n TransactionAction,\n TransactionIntent,\n TransactionIntentScope,\n} from '@sun-protocol/sun-sdk-core'\n\nexport function attachApprovalIntent(\n actions: readonly TransactionAction[],\n scope: TransactionIntentScope,\n tokenSymbol: string,\n): readonly TransactionAction[] {\n const intent: TransactionIntent = { kind: 'approve', scope, tokenSymbol }\n return actions.map((action) => action.execute === 'runtime'\n ? { ...action, intent }\n : action)\n}\n"],"mappings":"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","names":["defaultJsonParser","SDKError","nextPlanId","SDKError","defaultJsonParser","SDKError","assertTronAddress","SDKError","assertTronAddress","SDKError","SDKError","SDKError"]}
|