@sun-protocol/sun-sdk-runtime 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 +29 -0
- package/dist/browser.cjs +98 -0
- package/dist/browser.cjs.map +1 -0
- package/dist/browser.d.cts +16 -0
- package/dist/browser.d.ts +16 -0
- package/dist/browser.js +33 -0
- package/dist/browser.js.map +1 -0
- package/dist/capabilities-0q9k2fGU.d.ts +7 -0
- package/dist/capabilities-CpGxiDmg.d.cts +7 -0
- package/dist/chunk-AJSGBCSK.js +277 -0
- package/dist/chunk-AJSGBCSK.js.map +1 -0
- package/dist/chunk-NVRQ3Z7L.js +9 -0
- package/dist/chunk-NVRQ3Z7L.js.map +1 -0
- package/dist/chunk-VYEUIAUC.js +42 -0
- package/dist/chunk-VYEUIAUC.js.map +1 -0
- package/dist/index.cjs +458 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +31 -0
- package/dist/index.d.ts +31 -0
- package/dist/index.js +397 -0
- package/dist/index.js.map +1 -0
- package/dist/mock.cjs +79 -0
- package/dist/mock.cjs.map +1 -0
- package/dist/mock.d.cts +15 -0
- package/dist/mock.d.ts +15 -0
- package/dist/mock.js +53 -0
- package/dist/mock.js.map +1 -0
- package/dist/node.cjs +371 -0
- package/dist/node.cjs.map +1 -0
- package/dist/node.d.cts +14 -0
- package/dist/node.d.ts +14 -0
- package/dist/node.js +40 -0
- package/dist/node.js.map +1 -0
- package/dist/tronweb.cjs +336 -0
- package/dist/tronweb.cjs.map +1 -0
- package/dist/tronweb.d.cts +12 -0
- package/dist/tronweb.d.ts +12 -0
- package/dist/tronweb.js +8 -0
- package/dist/tronweb.js.map +1 -0
- package/dist/types-CZnHFnQK.d.cts +212 -0
- package/dist/types-CZnHFnQK.d.ts +212 -0
- package/package.json +93 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,397 @@
|
|
|
1
|
+
import {
|
|
2
|
+
walletSupportsTypedData
|
|
3
|
+
} from "./chunk-NVRQ3Z7L.js";
|
|
4
|
+
import {
|
|
5
|
+
normalizeTxResult
|
|
6
|
+
} from "./chunk-VYEUIAUC.js";
|
|
7
|
+
|
|
8
|
+
// src/runtime.ts
|
|
9
|
+
import { getChainConfig } from "@sun-protocol/sun-sdk-chains";
|
|
10
|
+
import {
|
|
11
|
+
SDKError as SDKError3,
|
|
12
|
+
assertTronAddress as assertTronAddress3
|
|
13
|
+
} from "@sun-protocol/sun-sdk-core";
|
|
14
|
+
|
|
15
|
+
// src/multicall/aggregate.ts
|
|
16
|
+
import { SDKError, assertTronAddress } from "@sun-protocol/sun-sdk-core";
|
|
17
|
+
var TRY_AGGREGATE_ABI = {
|
|
18
|
+
type: "function",
|
|
19
|
+
name: "tryAggregate",
|
|
20
|
+
stateMutability: "view",
|
|
21
|
+
inputs: [
|
|
22
|
+
{ name: "requireSuccess", type: "bool" },
|
|
23
|
+
{
|
|
24
|
+
name: "calls",
|
|
25
|
+
type: "tuple[]",
|
|
26
|
+
components: [
|
|
27
|
+
{ name: "target", type: "address" },
|
|
28
|
+
{ name: "callData", type: "bytes" }
|
|
29
|
+
]
|
|
30
|
+
}
|
|
31
|
+
],
|
|
32
|
+
outputs: [
|
|
33
|
+
{
|
|
34
|
+
name: "returnData",
|
|
35
|
+
type: "tuple[]",
|
|
36
|
+
components: [
|
|
37
|
+
{ name: "success", type: "bool" },
|
|
38
|
+
{ name: "returnData", type: "bytes" }
|
|
39
|
+
]
|
|
40
|
+
}
|
|
41
|
+
]
|
|
42
|
+
};
|
|
43
|
+
var CALL_COMPONENTS = [
|
|
44
|
+
{ name: "target", type: "address" },
|
|
45
|
+
{ name: "callData", type: "bytes" }
|
|
46
|
+
];
|
|
47
|
+
function hexData(value, label) {
|
|
48
|
+
if (!/^0x(?:[0-9a-fA-F]{2})*$/.test(value)) {
|
|
49
|
+
throw new SDKError("SDK_INVALID_ARGUMENT", `${label} must be 0x-prefixed, byte-aligned hex data`, {
|
|
50
|
+
[label]: value
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
return value;
|
|
54
|
+
}
|
|
55
|
+
function aggregateRows(value) {
|
|
56
|
+
if (Array.isArray(value)) {
|
|
57
|
+
if (value.every(isAggregateRow)) return value;
|
|
58
|
+
if (value.length === 1 && Array.isArray(value[0]) && value[0].every(isAggregateRow)) return value[0];
|
|
59
|
+
}
|
|
60
|
+
if (typeof value === "object" && value !== null) {
|
|
61
|
+
const record = value;
|
|
62
|
+
const nested = record.returnData ?? record[0];
|
|
63
|
+
if (nested !== value) return aggregateRows(nested);
|
|
64
|
+
}
|
|
65
|
+
throw new SDKError("SDK_CONTRACT_ERROR", "Invalid tryAggregate result", { result: value });
|
|
66
|
+
}
|
|
67
|
+
function isAggregateRow(value) {
|
|
68
|
+
if (Array.isArray(value)) {
|
|
69
|
+
return value.length >= 2 && isBooleanValue(value[0]) && typeof value[1] === "string";
|
|
70
|
+
}
|
|
71
|
+
if (typeof value !== "object" || value === null) return false;
|
|
72
|
+
const record = value;
|
|
73
|
+
return isBooleanValue(record.success ?? record[0]) && typeof (record.returnData ?? record[1]) === "string";
|
|
74
|
+
}
|
|
75
|
+
function isBooleanValue(value) {
|
|
76
|
+
return value === true || value === false || value === 1 || value === 0 || value === "true" || value === "false";
|
|
77
|
+
}
|
|
78
|
+
function booleanValue(value) {
|
|
79
|
+
return value === true || value === 1 || value === "true";
|
|
80
|
+
}
|
|
81
|
+
function normalizeRow(value, index) {
|
|
82
|
+
const success = Array.isArray(value) ? value[0] : value.success ?? value[0];
|
|
83
|
+
const returnData = Array.isArray(value) ? value[1] : value.returnData ?? value[1];
|
|
84
|
+
if (!isBooleanValue(success) || typeof returnData !== "string") {
|
|
85
|
+
throw new SDKError("SDK_CONTRACT_ERROR", `Invalid tryAggregate result at index ${index}`, { index, value });
|
|
86
|
+
}
|
|
87
|
+
return {
|
|
88
|
+
success: booleanValue(success),
|
|
89
|
+
returnData: hexData(returnData.startsWith("0x") ? returnData : `0x${returnData}`, "returnData")
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
async function aggregateMulticall(tronClient, multicallAddress, input) {
|
|
93
|
+
if (input.calls.length === 0) return [];
|
|
94
|
+
const calls = input.calls.map((call, index) => [
|
|
95
|
+
assertTronAddress(call.target, `calls[${index}].target`),
|
|
96
|
+
hexData(call.callData, `calls[${index}].callData`)
|
|
97
|
+
]);
|
|
98
|
+
const parameters2 = [
|
|
99
|
+
{ type: "bool", value: input.requireSuccess },
|
|
100
|
+
{
|
|
101
|
+
type: "tuple[]",
|
|
102
|
+
value: calls,
|
|
103
|
+
components: CALL_COMPONENTS
|
|
104
|
+
}
|
|
105
|
+
];
|
|
106
|
+
const result = await tronClient.readContract({
|
|
107
|
+
target: assertTronAddress(multicallAddress, "multicall address"),
|
|
108
|
+
functionSelector: "tryAggregate(bool,(address,bytes)[])",
|
|
109
|
+
parameters: parameters2,
|
|
110
|
+
abiFunction: TRY_AGGREGATE_ABI,
|
|
111
|
+
outputs: TRY_AGGREGATE_ABI.outputs ?? []
|
|
112
|
+
});
|
|
113
|
+
const rows = aggregateRows(result);
|
|
114
|
+
if (rows.length !== calls.length) {
|
|
115
|
+
throw new SDKError("SDK_CONTRACT_ERROR", "tryAggregate result length does not match calls", {
|
|
116
|
+
expected: calls.length,
|
|
117
|
+
actual: rows.length
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
return rows.map(normalizeRow);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// src/multicall/fallback.ts
|
|
124
|
+
async function fallbackMulticall(provider, calls) {
|
|
125
|
+
return Promise.all(
|
|
126
|
+
calls.map(async (call) => {
|
|
127
|
+
try {
|
|
128
|
+
return { success: true, value: await provider.readContract(call) };
|
|
129
|
+
} catch (error) {
|
|
130
|
+
return { success: false, error };
|
|
131
|
+
}
|
|
132
|
+
})
|
|
133
|
+
);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// src/contracts/abi.ts
|
|
137
|
+
import {
|
|
138
|
+
SDKError as SDKError2,
|
|
139
|
+
assertTronAddress as assertTronAddress2
|
|
140
|
+
} from "@sun-protocol/sun-sdk-core";
|
|
141
|
+
function abiFunction(input) {
|
|
142
|
+
const functions = input.abi.filter(isAbiFunction);
|
|
143
|
+
const matchingFunctions = input.functionName.includes("(") ? functions.filter((candidate) => selector(candidate) === input.functionName) : functions.filter((candidate) => candidate.name === input.functionName);
|
|
144
|
+
const item = matchingFunctions[0];
|
|
145
|
+
if (!item) {
|
|
146
|
+
throw new SDKError2("SDK_INVALID_ARGUMENT", `ABI function not found: ${input.functionName}`, { functionName: input.functionName });
|
|
147
|
+
}
|
|
148
|
+
if (matchingFunctions.length > 1) {
|
|
149
|
+
throw new SDKError2(
|
|
150
|
+
"SDK_INVALID_ARGUMENT",
|
|
151
|
+
`ABI function name is ambiguous: ${input.functionName}; use a canonical signature such as ${selector(item)}`,
|
|
152
|
+
{ functionName: input.functionName, signatures: matchingFunctions.map(selector) }
|
|
153
|
+
);
|
|
154
|
+
}
|
|
155
|
+
return item;
|
|
156
|
+
}
|
|
157
|
+
function isAbiFunction(item) {
|
|
158
|
+
return item.type === "function" && typeof item.name === "string" && (item.inputs === void 0 || Array.isArray(item.inputs)) && (item.outputs === void 0 || Array.isArray(item.outputs));
|
|
159
|
+
}
|
|
160
|
+
function parameters(item, args) {
|
|
161
|
+
const inputs = item.inputs ?? [];
|
|
162
|
+
if (inputs.length !== args.length) {
|
|
163
|
+
throw new SDKError2("SDK_INVALID_ARGUMENT", `ABI argument count does not match ${item.name}`, {
|
|
164
|
+
functionName: item.name,
|
|
165
|
+
expected: inputs.length,
|
|
166
|
+
actual: args.length
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
return inputs.map((input, index) => ({
|
|
170
|
+
type: input.type,
|
|
171
|
+
value: args[index],
|
|
172
|
+
...input.components !== void 0 ? { components: input.components } : {}
|
|
173
|
+
}));
|
|
174
|
+
}
|
|
175
|
+
function selector(item) {
|
|
176
|
+
return `${item.name}(${(item.inputs ?? []).map(canonicalType).join(",")})`;
|
|
177
|
+
}
|
|
178
|
+
function canonicalType(input) {
|
|
179
|
+
if (!/^tuple(?:\[\d*\])*$/.test(input.type) || input.components === void 0) {
|
|
180
|
+
return input.type;
|
|
181
|
+
}
|
|
182
|
+
return `(${input.components.map(canonicalType).join(",")})${input.type.slice("tuple".length)}`;
|
|
183
|
+
}
|
|
184
|
+
function selectorRead(input) {
|
|
185
|
+
const functionSelector = input.functionSelector.trim();
|
|
186
|
+
if (!functionSelector) {
|
|
187
|
+
throw new SDKError2("SDK_INVALID_ARGUMENT", "Contract functionSelector cannot be empty");
|
|
188
|
+
}
|
|
189
|
+
return {
|
|
190
|
+
target: assertTronAddress2(input.address, "contract address"),
|
|
191
|
+
functionSelector,
|
|
192
|
+
...input.parameters !== void 0 ? { parameters: input.parameters } : {},
|
|
193
|
+
...input.rawParameter !== void 0 ? { rawParameter: input.rawParameter } : {},
|
|
194
|
+
...input.outputs !== void 0 ? { outputs: input.outputs } : { rawResult: true },
|
|
195
|
+
...input.from !== void 0 ? { from: assertTronAddress2(input.from, "contract read from") } : {}
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
function contractReadFromInput(input) {
|
|
199
|
+
if (input.abi === void 0) return selectorRead(input);
|
|
200
|
+
const item = abiFunction(input);
|
|
201
|
+
return {
|
|
202
|
+
target: assertTronAddress2(input.address, "contract address"),
|
|
203
|
+
functionSelector: selector(item),
|
|
204
|
+
parameters: parameters(item, input.args ?? []),
|
|
205
|
+
abiFunction: item,
|
|
206
|
+
outputs: (item.outputs ?? []).map((output) => ({
|
|
207
|
+
type: output.type,
|
|
208
|
+
...output.name !== void 0 ? { name: output.name } : {}
|
|
209
|
+
})),
|
|
210
|
+
...input.from !== void 0 ? { from: assertTronAddress2(input.from, "contract read from") } : {}
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
function contractCallFromInput(input) {
|
|
214
|
+
const method = input.abi !== void 0 ? (() => {
|
|
215
|
+
const item = abiFunction(input);
|
|
216
|
+
return {
|
|
217
|
+
functionSelector: selector(item),
|
|
218
|
+
parameters: parameters(item, input.args ?? []),
|
|
219
|
+
abiFunction: item
|
|
220
|
+
};
|
|
221
|
+
})() : {
|
|
222
|
+
functionSelector: input.functionSelector.trim(),
|
|
223
|
+
...input.parameters !== void 0 ? { parameters: input.parameters } : {},
|
|
224
|
+
...input.rawParameter !== void 0 ? { rawParameter: input.rawParameter } : {}
|
|
225
|
+
};
|
|
226
|
+
if (!method.functionSelector) {
|
|
227
|
+
throw new SDKError2("SDK_INVALID_ARGUMENT", "Contract functionSelector cannot be empty");
|
|
228
|
+
}
|
|
229
|
+
return {
|
|
230
|
+
target: assertTronAddress2(input.address, "contract address"),
|
|
231
|
+
...method,
|
|
232
|
+
...input.callValue !== void 0 ? { callValue: input.callValue } : {},
|
|
233
|
+
...input.feeLimit !== void 0 ? { feeLimit: input.feeLimit } : {},
|
|
234
|
+
...input.tokenId !== void 0 ? { tokenId: input.tokenId } : {},
|
|
235
|
+
...input.tokenValue !== void 0 ? { tokenValue: input.tokenValue } : {},
|
|
236
|
+
...input.permissionId !== void 0 ? { permissionId: input.permissionId } : {}
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
// src/runtime.ts
|
|
241
|
+
function createRuntime(input) {
|
|
242
|
+
if (input.tronClient.network !== input.network) {
|
|
243
|
+
throw new SDKError3("SDK_INVALID_ARGUMENT", "Runtime tronClient network mismatch", {
|
|
244
|
+
runtimeNetwork: input.network,
|
|
245
|
+
tronClientNetwork: input.tronClient.network
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
if (input.wallet && input.getWallet) {
|
|
249
|
+
throw new SDKError3("SDK_INVALID_ARGUMENT", "Use either wallet or getWallet when creating Runtime");
|
|
250
|
+
}
|
|
251
|
+
const chain = getChainConfig(input.network);
|
|
252
|
+
async function resolveWallet() {
|
|
253
|
+
return input.wallet ?? await input.getWallet?.();
|
|
254
|
+
}
|
|
255
|
+
async function requireWallet(operation, walletOverride) {
|
|
256
|
+
const wallet = walletOverride ?? await resolveWallet();
|
|
257
|
+
if (!wallet) {
|
|
258
|
+
throw new SDKError3("SDK_WALLET_CAPABILITY_ERROR", `Runtime requires a wallet for ${operation}`);
|
|
259
|
+
}
|
|
260
|
+
return wallet;
|
|
261
|
+
}
|
|
262
|
+
async function walletAddress(wallet) {
|
|
263
|
+
return assertTronAddress3(await wallet.getAddress(), "wallet address");
|
|
264
|
+
}
|
|
265
|
+
async function submitContractCall(call, submission, walletOverride) {
|
|
266
|
+
const wallet = await requireWallet("transaction signing", walletOverride);
|
|
267
|
+
const ownerAddress = await walletAddress(wallet);
|
|
268
|
+
const tx = await input.tronClient.buildTransaction(call, { ownerAddress });
|
|
269
|
+
let result;
|
|
270
|
+
if (wallet.sendStrategy === "sign-and-send" && wallet.signAndSendTransaction && wallet.capabilities.signAndSendTransaction) {
|
|
271
|
+
result = normalizeTxResult(await wallet.signAndSendTransaction(tx));
|
|
272
|
+
} else {
|
|
273
|
+
if (!wallet.signTransaction || !wallet.capabilities.signTransaction) {
|
|
274
|
+
throw new SDKError3("SDK_WALLET_CAPABILITY_ERROR", "Wallet does not support transaction signing");
|
|
275
|
+
}
|
|
276
|
+
const signed = await wallet.signTransaction(tx);
|
|
277
|
+
result = await input.tronClient.broadcastTransaction(signed);
|
|
278
|
+
}
|
|
279
|
+
notifySubmitted({
|
|
280
|
+
txid: result.txid,
|
|
281
|
+
network: input.network,
|
|
282
|
+
ownerAddress,
|
|
283
|
+
walletKind: wallet.kind,
|
|
284
|
+
source: submission.source,
|
|
285
|
+
...submission.actionId === void 0 ? {} : { actionId: submission.actionId },
|
|
286
|
+
...submission.intent === void 0 ? {} : { intent: submission.intent }
|
|
287
|
+
});
|
|
288
|
+
return result;
|
|
289
|
+
}
|
|
290
|
+
function notifySubmitted(event) {
|
|
291
|
+
if (!input.onSubmitted) return;
|
|
292
|
+
try {
|
|
293
|
+
void Promise.resolve(input.onSubmitted(event)).catch(() => void 0);
|
|
294
|
+
} catch {
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
const contract = {
|
|
298
|
+
read(contractInput) {
|
|
299
|
+
return input.tronClient.readContract(contractReadFromInput(contractInput));
|
|
300
|
+
},
|
|
301
|
+
async write(contractInput, options) {
|
|
302
|
+
return submitContractCall(
|
|
303
|
+
contractCallFromInput(contractInput),
|
|
304
|
+
{
|
|
305
|
+
source: "contract-write",
|
|
306
|
+
...options?.intent === void 0 ? {} : { intent: options.intent }
|
|
307
|
+
},
|
|
308
|
+
options?.wallet
|
|
309
|
+
);
|
|
310
|
+
}
|
|
311
|
+
};
|
|
312
|
+
return {
|
|
313
|
+
network: input.network,
|
|
314
|
+
chain,
|
|
315
|
+
tronClient: input.tronClient,
|
|
316
|
+
contract,
|
|
317
|
+
...input.wallet ? { wallet: input.wallet } : {},
|
|
318
|
+
getWallet: resolveWallet,
|
|
319
|
+
requireWallet(operation) {
|
|
320
|
+
return requireWallet(operation);
|
|
321
|
+
},
|
|
322
|
+
async getAddress() {
|
|
323
|
+
const wallet = await resolveWallet();
|
|
324
|
+
if (!wallet) return void 0;
|
|
325
|
+
return walletAddress(wallet);
|
|
326
|
+
},
|
|
327
|
+
readContract(call) {
|
|
328
|
+
return input.tronClient.readContract(call);
|
|
329
|
+
},
|
|
330
|
+
async buildTransaction(action, options) {
|
|
331
|
+
const ownerAddress = options?.ownerAddress ?? await walletAddress(
|
|
332
|
+
await requireWallet("transaction building", options?.wallet)
|
|
333
|
+
);
|
|
334
|
+
return input.tronClient.buildTransaction(action, { ownerAddress });
|
|
335
|
+
},
|
|
336
|
+
async sendAction(action, options) {
|
|
337
|
+
return submitContractCall(
|
|
338
|
+
action,
|
|
339
|
+
{
|
|
340
|
+
source: "runtime-action",
|
|
341
|
+
actionId: action.id,
|
|
342
|
+
...action.intent === void 0 ? {} : { intent: action.intent }
|
|
343
|
+
},
|
|
344
|
+
options?.wallet
|
|
345
|
+
);
|
|
346
|
+
},
|
|
347
|
+
...input.tronClient.waitForTransactionReceipt ? {
|
|
348
|
+
waitForTransactionReceipt: (txid, options) => input.tronClient.waitForTransactionReceipt(txid, options)
|
|
349
|
+
} : {},
|
|
350
|
+
async signTypedData(payload, options) {
|
|
351
|
+
const wallet = await requireWallet("typed data signing", options?.wallet);
|
|
352
|
+
if (!wallet.signTypedData || !wallet.capabilities.signTypedData) {
|
|
353
|
+
throw new SDKError3("SDK_WALLET_CAPABILITY_ERROR", "Wallet does not support typed data signing");
|
|
354
|
+
}
|
|
355
|
+
return wallet.signTypedData(payload);
|
|
356
|
+
},
|
|
357
|
+
async multicall(calls) {
|
|
358
|
+
return fallbackMulticall(input.tronClient, calls);
|
|
359
|
+
},
|
|
360
|
+
async aggregateMulticall(aggregateInput) {
|
|
361
|
+
return aggregateMulticall(input.tronClient, chain.contracts.multicall, aggregateInput);
|
|
362
|
+
}
|
|
363
|
+
};
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
// src/balances.ts
|
|
367
|
+
import { getChainConfig as getChainConfig2 } from "@sun-protocol/sun-sdk-chains";
|
|
368
|
+
import { SDKError as SDKError4, assertTronAddress as assertTronAddress4 } from "@sun-protocol/sun-sdk-core";
|
|
369
|
+
function isNativeToken(client, token) {
|
|
370
|
+
return token === "TRX" || token === getChainConfig2(client.network).contracts.trx;
|
|
371
|
+
}
|
|
372
|
+
async function readBalances(client, input) {
|
|
373
|
+
const owner = assertTronAddress4(input.owner, "balance owner");
|
|
374
|
+
return Promise.all(input.tokens.map(async (token) => {
|
|
375
|
+
if (isNativeToken(client, token)) {
|
|
376
|
+
if (!client.getNativeBalance) {
|
|
377
|
+
throw new SDKError4("SDK_RUNTIME_ERROR", "Tron client does not support native balance reads");
|
|
378
|
+
}
|
|
379
|
+
return { token, balance: await client.getNativeBalance(owner), decimals: 6 };
|
|
380
|
+
}
|
|
381
|
+
const balance = await client.readContract({
|
|
382
|
+
target: assertTronAddress4(token, "token address"),
|
|
383
|
+
functionSelector: "balanceOf(address)",
|
|
384
|
+
parameters: [{ type: "address", value: owner }],
|
|
385
|
+
outputs: [{ type: "uint256" }]
|
|
386
|
+
});
|
|
387
|
+
return { token, balance: String(balance) };
|
|
388
|
+
}));
|
|
389
|
+
}
|
|
390
|
+
export {
|
|
391
|
+
aggregateMulticall,
|
|
392
|
+
createRuntime,
|
|
393
|
+
normalizeTxResult,
|
|
394
|
+
readBalances,
|
|
395
|
+
walletSupportsTypedData
|
|
396
|
+
};
|
|
397
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/runtime.ts","../src/multicall/aggregate.ts","../src/multicall/fallback.ts","../src/contracts/abi.ts","../src/balances.ts"],"sourcesContent":["import { getChainConfig } from '@sun-protocol/sun-sdk-chains'\nimport {\n SDKError,\n assertTronAddress,\n type ContractCallAction,\n type Network,\n type TronAddress,\n} from '@sun-protocol/sun-sdk-core'\nimport { aggregateMulticall } from './multicall/aggregate.js'\nimport { fallbackMulticall } from './multicall/fallback.js'\nimport { contractCallFromInput, contractReadFromInput } from './contracts/abi.js'\nimport { normalizeTxResult } from './tx/normalize-result.js'\nimport type {\n ContractCall,\n ContractClient,\n ContractRead,\n ContractReadInput,\n ContractWriteExecutionOptions,\n ContractWriteInput,\n GetWallet,\n MulticallResult,\n Runtime,\n SubmittedCallback,\n SubmittedEvent,\n TronClient,\n TxResult,\n TypedDataPayload,\n WalletAdapter,\n} from './types.js'\n\nexport interface RuntimeInput {\n readonly network: Network\n readonly tronClient: TronClient\n readonly wallet?: WalletAdapter\n /** Resolves the current browser wallet at operation time without coupling Runtime to a UI lifecycle. */\n readonly getWallet?: GetWallet\n /** Best-effort hook for every successful Runtime transaction submission. */\n readonly onSubmitted?: SubmittedCallback\n}\n\nexport function createRuntime(input: RuntimeInput): Runtime {\n if (input.tronClient.network !== input.network) {\n throw new SDKError('SDK_INVALID_ARGUMENT', 'Runtime tronClient network mismatch', {\n runtimeNetwork: input.network,\n tronClientNetwork: input.tronClient.network,\n })\n }\n if (input.wallet && input.getWallet) {\n throw new SDKError('SDK_INVALID_ARGUMENT', 'Use either wallet or getWallet when creating Runtime')\n }\n\n const chain = getChainConfig(input.network)\n\n async function resolveWallet(): Promise<WalletAdapter | undefined> {\n return input.wallet ?? await input.getWallet?.()\n }\n\n async function requireWallet(\n operation: string,\n walletOverride?: WalletAdapter,\n ): Promise<WalletAdapter> {\n const wallet = walletOverride ?? await resolveWallet()\n if (!wallet) {\n throw new SDKError('SDK_WALLET_CAPABILITY_ERROR', `Runtime requires a wallet for ${operation}`)\n }\n return wallet\n }\n\n async function walletAddress(wallet: WalletAdapter): Promise<TronAddress> {\n return assertTronAddress(await wallet.getAddress(), 'wallet address')\n }\n\n async function submitContractCall(\n call: ContractCall,\n submission: Pick<SubmittedEvent, 'source'> & Partial<Pick<SubmittedEvent, 'actionId' | 'intent'>>,\n walletOverride?: WalletAdapter,\n ): Promise<TxResult> {\n const wallet = await requireWallet('transaction signing', walletOverride)\n const ownerAddress = await walletAddress(wallet)\n const tx = await input.tronClient.buildTransaction(call, { ownerAddress })\n let result: TxResult\n\n if (\n wallet.sendStrategy === 'sign-and-send' &&\n wallet.signAndSendTransaction &&\n wallet.capabilities.signAndSendTransaction\n ) {\n result = normalizeTxResult(await wallet.signAndSendTransaction(tx))\n } else {\n if (!wallet.signTransaction || !wallet.capabilities.signTransaction) {\n throw new SDKError('SDK_WALLET_CAPABILITY_ERROR', 'Wallet does not support transaction signing')\n }\n\n const signed = await wallet.signTransaction(tx)\n result = await input.tronClient.broadcastTransaction(signed)\n }\n\n notifySubmitted({\n txid: result.txid,\n network: input.network,\n ownerAddress,\n walletKind: wallet.kind,\n source: submission.source,\n ...(submission.actionId === undefined ? {} : { actionId: submission.actionId }),\n ...(submission.intent === undefined ? {} : { intent: submission.intent }),\n })\n return result\n }\n\n function notifySubmitted(event: SubmittedEvent): void {\n if (!input.onSubmitted) return\n try {\n void Promise.resolve(input.onSubmitted(event)).catch(() => undefined)\n } catch {\n // Observability is deliberately best-effort: the transaction is already submitted.\n }\n }\n\n const contract: ContractClient = {\n read<T = unknown>(contractInput: ContractReadInput): Promise<T> {\n return input.tronClient.readContract<T>(contractReadFromInput(contractInput))\n },\n async write(\n contractInput: ContractWriteInput,\n options?: ContractWriteExecutionOptions,\n ): Promise<TxResult> {\n return submitContractCall(\n contractCallFromInput(contractInput),\n {\n source: 'contract-write',\n ...(options?.intent === undefined ? {} : { intent: options.intent }),\n },\n options?.wallet,\n )\n },\n }\n\n return {\n network: input.network,\n chain,\n tronClient: input.tronClient,\n contract,\n ...(input.wallet ? { wallet: input.wallet } : {}),\n getWallet: resolveWallet,\n requireWallet(operation) {\n return requireWallet(operation)\n },\n async getAddress() {\n const wallet = await resolveWallet()\n if (!wallet) return undefined\n return walletAddress(wallet)\n },\n readContract(call) {\n return input.tronClient.readContract(call)\n },\n async buildTransaction(action, options) {\n const ownerAddress = options?.ownerAddress ?? await walletAddress(\n await requireWallet('transaction building', options?.wallet),\n )\n return input.tronClient.buildTransaction(action, { ownerAddress })\n },\n async sendAction(action: ContractCallAction, options) {\n return submitContractCall(\n action,\n {\n source: 'runtime-action',\n actionId: action.id,\n ...(action.intent === undefined ? {} : { intent: action.intent }),\n },\n options?.wallet,\n )\n },\n ...(input.tronClient.waitForTransactionReceipt\n ? {\n waitForTransactionReceipt: (txid, options) =>\n input.tronClient.waitForTransactionReceipt!(txid, options),\n }\n : {}),\n async signTypedData(payload: TypedDataPayload, options) {\n const wallet = await requireWallet('typed data signing', options?.wallet)\n if (!wallet.signTypedData || !wallet.capabilities.signTypedData) {\n throw new SDKError('SDK_WALLET_CAPABILITY_ERROR', 'Wallet does not support typed data signing')\n }\n return wallet.signTypedData(payload)\n },\n async multicall<T = unknown>(calls: readonly ContractRead[]): Promise<readonly MulticallResult<T>[]> {\n return fallbackMulticall<T>(input.tronClient, calls)\n },\n async aggregateMulticall(aggregateInput) {\n return aggregateMulticall(input.tronClient, chain.contracts.multicall, aggregateInput)\n },\n }\n}\n","import { SDKError, assertTronAddress, type ContractParameter } from '@sun-protocol/sun-sdk-core'\nimport type {\n AbiFunction,\n AggregateMulticallInput,\n AggregateMulticallResult,\n TronClient,\n} from '../types.js'\n\nconst TRY_AGGREGATE_ABI: AbiFunction = {\n type: 'function',\n name: 'tryAggregate',\n stateMutability: 'view',\n inputs: [\n { name: 'requireSuccess', type: 'bool' },\n {\n name: 'calls',\n type: 'tuple[]',\n components: [\n { name: 'target', type: 'address' },\n { name: 'callData', type: 'bytes' },\n ],\n },\n ],\n outputs: [\n {\n name: 'returnData',\n type: 'tuple[]',\n components: [\n { name: 'success', type: 'bool' },\n { name: 'returnData', type: 'bytes' },\n ],\n },\n ],\n}\n\nconst CALL_COMPONENTS = [\n { name: 'target', type: 'address' },\n { name: 'callData', type: 'bytes' },\n] as const\n\nfunction hexData(value: string, label: string): string {\n if (!/^0x(?:[0-9a-fA-F]{2})*$/.test(value)) {\n throw new SDKError('SDK_INVALID_ARGUMENT', `${label} must be 0x-prefixed, byte-aligned hex data`, {\n [label]: value,\n })\n }\n return value\n}\n\nfunction aggregateRows(value: unknown): readonly unknown[] {\n if (Array.isArray(value)) {\n if (value.every(isAggregateRow)) return value\n if (value.length === 1 && Array.isArray(value[0]) && value[0].every(isAggregateRow)) return value[0]\n }\n\n if (typeof value === 'object' && value !== null) {\n const record = value as Record<string, unknown>\n const nested = record.returnData ?? record[0]\n if (nested !== value) return aggregateRows(nested)\n }\n\n throw new SDKError('SDK_CONTRACT_ERROR', 'Invalid tryAggregate result', { result: value })\n}\n\nfunction isAggregateRow(value: unknown): boolean {\n if (Array.isArray(value)) {\n return value.length >= 2 && isBooleanValue(value[0]) && typeof value[1] === 'string'\n }\n if (typeof value !== 'object' || value === null) return false\n const record = value as Record<string, unknown>\n return isBooleanValue(record.success ?? record[0]) && typeof (record.returnData ?? record[1]) === 'string'\n}\n\nfunction isBooleanValue(value: unknown): boolean {\n return value === true || value === false || value === 1 || value === 0 || value === 'true' || value === 'false'\n}\n\nfunction booleanValue(value: unknown): boolean {\n return value === true || value === 1 || value === 'true'\n}\n\nfunction normalizeRow(value: unknown, index: number): AggregateMulticallResult {\n const success = Array.isArray(value)\n ? value[0]\n : (value as Record<string, unknown>).success ?? (value as Record<string, unknown>)[0]\n const returnData = Array.isArray(value)\n ? value[1]\n : (value as Record<string, unknown>).returnData ?? (value as Record<string, unknown>)[1]\n\n if (!isBooleanValue(success) || typeof returnData !== 'string') {\n throw new SDKError('SDK_CONTRACT_ERROR', `Invalid tryAggregate result at index ${index}`, { index, value })\n }\n\n return {\n success: booleanValue(success),\n returnData: hexData(returnData.startsWith('0x') ? returnData : `0x${returnData}`, 'returnData'),\n }\n}\n\nexport async function aggregateMulticall(\n tronClient: TronClient,\n multicallAddress: string,\n input: AggregateMulticallInput,\n): Promise<readonly AggregateMulticallResult[]> {\n if (input.calls.length === 0) return []\n\n const calls = input.calls.map((call, index) => [\n assertTronAddress(call.target, `calls[${index}].target`),\n hexData(call.callData, `calls[${index}].callData`),\n ])\n const parameters: readonly ContractParameter[] = [\n { type: 'bool', value: input.requireSuccess },\n {\n type: 'tuple[]',\n value: calls,\n components: CALL_COMPONENTS,\n },\n ]\n const result = await tronClient.readContract({\n target: assertTronAddress(multicallAddress, 'multicall address'),\n functionSelector: 'tryAggregate(bool,(address,bytes)[])',\n parameters,\n abiFunction: TRY_AGGREGATE_ABI,\n outputs: TRY_AGGREGATE_ABI.outputs ?? [],\n })\n\n const rows = aggregateRows(result)\n if (rows.length !== calls.length) {\n throw new SDKError('SDK_CONTRACT_ERROR', 'tryAggregate result length does not match calls', {\n expected: calls.length,\n actual: rows.length,\n })\n }\n return rows.map(normalizeRow)\n}\n","import type { ContractRead, MulticallResult, TronClient } from '../types.js'\n\nexport async function fallbackMulticall<T = unknown>(\n provider: TronClient,\n calls: readonly ContractRead[],\n): Promise<readonly MulticallResult<T>[]> {\n return Promise.all(\n calls.map(async (call) => {\n try {\n return { success: true, value: await provider.readContract<T>(call) }\n } catch (error) {\n return { success: false, error }\n }\n }),\n )\n}\n","import {\n SDKError,\n assertTronAddress,\n type ContractParameter,\n} from '@sun-protocol/sun-sdk-core'\nimport type {\n AbiFunction,\n AbiItem,\n AbiParameter,\n ContractCall,\n ContractRead,\n ContractReadInput,\n ContractWriteInput,\n} from '../types.js'\n\ninterface AbiFunctionInput {\n readonly abi: readonly AbiItem[]\n readonly functionName: string\n}\n\nfunction abiFunction(input: AbiFunctionInput): AbiFunction {\n const functions = input.abi.filter(isAbiFunction)\n const matchingFunctions = input.functionName.includes('(')\n ? functions.filter((candidate) => selector(candidate) === input.functionName)\n : functions.filter((candidate) => candidate.name === input.functionName)\n const item = matchingFunctions[0]\n if (!item) {\n throw new SDKError('SDK_INVALID_ARGUMENT', `ABI function not found: ${input.functionName}`, { functionName: input.functionName })\n }\n if (matchingFunctions.length > 1) {\n throw new SDKError(\n 'SDK_INVALID_ARGUMENT',\n `ABI function name is ambiguous: ${input.functionName}; use a canonical signature such as ${selector(item)}`,\n { functionName: input.functionName, signatures: matchingFunctions.map(selector) },\n )\n }\n return item\n}\n\nfunction isAbiFunction(item: AbiItem): item is AbiFunction {\n return item.type === 'function'\n && typeof item.name === 'string'\n && (item.inputs === undefined || Array.isArray(item.inputs))\n && (item.outputs === undefined || Array.isArray(item.outputs))\n}\n\nfunction parameters(item: AbiFunction, args: readonly unknown[]): readonly ContractParameter[] {\n const inputs = item.inputs ?? []\n if (inputs.length !== args.length) {\n throw new SDKError('SDK_INVALID_ARGUMENT', `ABI argument count does not match ${item.name}`, {\n functionName: item.name,\n expected: inputs.length,\n actual: args.length,\n })\n }\n return inputs.map((input, index) => ({\n type: input.type,\n value: args[index],\n ...(input.components !== undefined ? { components: input.components } : {}),\n }))\n}\n\nfunction selector(item: AbiFunction): string {\n return `${item.name}(${(item.inputs ?? []).map(canonicalType).join(',')})`\n}\n\nfunction canonicalType(input: AbiParameter): string {\n if (!/^tuple(?:\\[\\d*\\])*$/.test(input.type) || input.components === undefined) {\n return input.type\n }\n\n return `(${input.components.map(canonicalType).join(',')})${input.type.slice('tuple'.length)}`\n}\n\nfunction selectorRead(input: Extract<ContractReadInput, { readonly functionSelector: string }>): ContractRead {\n const functionSelector = input.functionSelector.trim()\n if (!functionSelector) {\n throw new SDKError('SDK_INVALID_ARGUMENT', 'Contract functionSelector cannot be empty')\n }\n return {\n target: assertTronAddress(input.address, 'contract address'),\n functionSelector,\n ...(input.parameters !== undefined ? { parameters: input.parameters } : {}),\n ...(input.rawParameter !== undefined ? { rawParameter: input.rawParameter } : {}),\n ...(input.outputs !== undefined ? { outputs: input.outputs } : { rawResult: true }),\n ...(input.from !== undefined ? { from: assertTronAddress(input.from, 'contract read from') } : {}),\n }\n}\n\nexport function contractReadFromInput(input: ContractReadInput): ContractRead {\n if (input.abi === undefined) return selectorRead(input)\n\n const item = abiFunction(input)\n return {\n target: assertTronAddress(input.address, 'contract address'),\n functionSelector: selector(item),\n parameters: parameters(item, input.args ?? []),\n abiFunction: item,\n outputs: (item.outputs ?? []).map((output) => ({\n type: output.type,\n ...(output.name !== undefined ? { name: output.name } : {}),\n })),\n ...(input.from !== undefined ? { from: assertTronAddress(input.from, 'contract read from') } : {}),\n }\n}\n\nexport function contractCallFromInput(input: ContractWriteInput): ContractCall {\n const method = input.abi !== undefined\n ? (() => {\n const item = abiFunction(input)\n return {\n functionSelector: selector(item),\n parameters: parameters(item, input.args ?? []),\n abiFunction: item,\n }\n })()\n : {\n functionSelector: input.functionSelector.trim(),\n ...(input.parameters !== undefined ? { parameters: input.parameters } : {}),\n ...(input.rawParameter !== undefined ? { rawParameter: input.rawParameter } : {}),\n }\n\n if (!method.functionSelector) {\n throw new SDKError('SDK_INVALID_ARGUMENT', 'Contract functionSelector cannot be empty')\n }\n\n return {\n target: assertTronAddress(input.address, 'contract address'),\n ...method,\n ...(input.callValue !== undefined ? { callValue: input.callValue } : {}),\n ...(input.feeLimit !== undefined ? { feeLimit: input.feeLimit } : {}),\n ...(input.tokenId !== undefined ? { tokenId: input.tokenId } : {}),\n ...(input.tokenValue !== undefined ? { tokenValue: input.tokenValue } : {}),\n ...(input.permissionId !== undefined ? { permissionId: input.permissionId } : {}),\n }\n}\n","import { getChainConfig } from '@sun-protocol/sun-sdk-chains'\nimport { SDKError, assertTronAddress, type TronAddress } from '@sun-protocol/sun-sdk-core'\nimport type { TronClient } from './types.js'\n\nexport interface ReadBalancesInput {\n readonly owner: TronAddress | string\n readonly tokens: readonly (TronAddress | string)[]\n}\n\nexport interface BalanceResult {\n readonly token: TronAddress | string\n readonly balance: string\n readonly decimals?: number\n}\n\nfunction isNativeToken(client: TronClient, token: TronAddress | string): boolean {\n return token === 'TRX' || token === getChainConfig(client.network).contracts.trx\n}\n\nexport async function readBalances(client: TronClient, input: ReadBalancesInput): Promise<readonly BalanceResult[]> {\n const owner = assertTronAddress(input.owner, 'balance owner')\n return Promise.all(input.tokens.map(async (token) => {\n if (isNativeToken(client, token)) {\n if (!client.getNativeBalance) {\n throw new SDKError('SDK_RUNTIME_ERROR', 'Tron client does not support native balance reads')\n }\n return { token, balance: await client.getNativeBalance(owner), decimals: 6 }\n }\n\n const balance = await client.readContract<string>({\n target: assertTronAddress(token, 'token address'),\n functionSelector: 'balanceOf(address)',\n parameters: [{ type: 'address', value: owner }],\n outputs: [{ type: 'uint256' }],\n })\n return { token, balance: String(balance) }\n }))\n}\n"],"mappings":"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","names":["SDKError","assertTronAddress","parameters","SDKError","assertTronAddress","SDKError","assertTronAddress","getChainConfig","SDKError","assertTronAddress"]}
|
package/dist/mock.cjs
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/mock.ts
|
|
21
|
+
var mock_exports = {};
|
|
22
|
+
__export(mock_exports, {
|
|
23
|
+
createMockClient: () => createMockClient,
|
|
24
|
+
createMockWallet: () => createMockWallet
|
|
25
|
+
});
|
|
26
|
+
module.exports = __toCommonJS(mock_exports);
|
|
27
|
+
var import_sun_sdk_core = require("@sun-protocol/sun-sdk-core");
|
|
28
|
+
function createMockClient(input) {
|
|
29
|
+
return {
|
|
30
|
+
kind: "mock",
|
|
31
|
+
network: input.network,
|
|
32
|
+
async getNativeBalance(owner) {
|
|
33
|
+
const balance = input.nativeBalances?.[owner] ?? input.nativeBalance;
|
|
34
|
+
if (balance !== void 0) return balance;
|
|
35
|
+
throw new import_sun_sdk_core.SDKError("SDK_RUNTIME_ERROR", `No mock native balance configured for ${owner}`, { owner });
|
|
36
|
+
},
|
|
37
|
+
async readContract(call) {
|
|
38
|
+
if (input.reads && call.functionSelector in input.reads) return input.reads[call.functionSelector];
|
|
39
|
+
throw new import_sun_sdk_core.SDKError("SDK_CONTRACT_ERROR", `No mock read configured for ${call.functionSelector}`, { call });
|
|
40
|
+
},
|
|
41
|
+
async buildTransaction(call) {
|
|
42
|
+
return { txID: `mock-build-${call.functionSelector}` };
|
|
43
|
+
},
|
|
44
|
+
async broadcastTransaction(tx) {
|
|
45
|
+
return { txid: tx.txID ?? "mock-broadcast", raw: tx };
|
|
46
|
+
},
|
|
47
|
+
async waitForTransactionReceipt(txid) {
|
|
48
|
+
const raw = { id: txid, receipt: { result: "SUCCESS" } };
|
|
49
|
+
return { txid, result: "SUCCESS", success: true, raw };
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
function createMockWallet(input = {}) {
|
|
54
|
+
const address = (0, import_sun_sdk_core.assertTronAddress)(input.address ?? import_sun_sdk_core.TRON_ZERO_ADDRESS, "mock wallet address");
|
|
55
|
+
return {
|
|
56
|
+
kind: "mock",
|
|
57
|
+
capabilities: {
|
|
58
|
+
signTransaction: true,
|
|
59
|
+
signAndSendTransaction: false,
|
|
60
|
+
signTypedData: true,
|
|
61
|
+
userInteractive: false
|
|
62
|
+
},
|
|
63
|
+
async getAddress() {
|
|
64
|
+
return address;
|
|
65
|
+
},
|
|
66
|
+
async signTransaction(tx) {
|
|
67
|
+
return { ...tx, signature: ["mock-signature"] };
|
|
68
|
+
},
|
|
69
|
+
async signTypedData() {
|
|
70
|
+
return "mock-typed-data-signature";
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
75
|
+
0 && (module.exports = {
|
|
76
|
+
createMockClient,
|
|
77
|
+
createMockWallet
|
|
78
|
+
});
|
|
79
|
+
//# sourceMappingURL=mock.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/mock.ts"],"sourcesContent":["import { SDKError, TRON_ZERO_ADDRESS, assertTronAddress, type Network, type TronAddress } from '@sun-protocol/sun-sdk-core'\nimport type { ContractCall, ContractRead, TronClient, TxResult, WalletAdapter } from './types.js'\n\nexport function createMockClient(input: {\n network: Network\n reads?: Record<string, unknown>\n nativeBalance?: string\n nativeBalances?: Record<string, string>\n}): TronClient {\n return {\n kind: 'mock',\n network: input.network,\n async getNativeBalance(owner) {\n const balance = input.nativeBalances?.[owner] ?? input.nativeBalance\n if (balance !== undefined) return balance\n throw new SDKError('SDK_RUNTIME_ERROR', `No mock native balance configured for ${owner}`, { owner })\n },\n async readContract<T = unknown>(call: ContractRead): Promise<T> {\n if (input.reads && call.functionSelector in input.reads) return input.reads[call.functionSelector] as T\n throw new SDKError('SDK_CONTRACT_ERROR', `No mock read configured for ${call.functionSelector}`, { call })\n },\n async buildTransaction(call: ContractCall) {\n return { txID: `mock-build-${call.functionSelector}` }\n },\n async broadcastTransaction(tx): Promise<TxResult> {\n return { txid: tx.txID ?? 'mock-broadcast', raw: tx }\n },\n async waitForTransactionReceipt(txid) {\n const raw = { id: txid, receipt: { result: 'SUCCESS' } }\n return { txid, result: 'SUCCESS', success: true, raw }\n },\n }\n}\n\nexport function createMockWallet(input: { address?: TronAddress | string } = {}): WalletAdapter {\n const address = assertTronAddress(input.address ?? TRON_ZERO_ADDRESS, 'mock wallet address')\n return {\n kind: 'mock',\n capabilities: {\n signTransaction: true,\n signAndSendTransaction: false,\n signTypedData: true,\n userInteractive: false,\n },\n async getAddress() {\n return address\n },\n async signTransaction(tx) {\n return { ...tx, signature: ['mock-signature'] }\n },\n async signTypedData() {\n return 'mock-typed-data-signature'\n },\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BAA+F;AAGxF,SAAS,iBAAiB,OAKlB;AACb,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS,MAAM;AAAA,IACf,MAAM,iBAAiB,OAAO;AAC5B,YAAM,UAAU,MAAM,iBAAiB,KAAK,KAAK,MAAM;AACvD,UAAI,YAAY,OAAW,QAAO;AAClC,YAAM,IAAI,6BAAS,qBAAqB,yCAAyC,KAAK,IAAI,EAAE,MAAM,CAAC;AAAA,IACrG;AAAA,IACA,MAAM,aAA0B,MAAgC;AAC9D,UAAI,MAAM,SAAS,KAAK,oBAAoB,MAAM,MAAO,QAAO,MAAM,MAAM,KAAK,gBAAgB;AACjG,YAAM,IAAI,6BAAS,sBAAsB,+BAA+B,KAAK,gBAAgB,IAAI,EAAE,KAAK,CAAC;AAAA,IAC3G;AAAA,IACA,MAAM,iBAAiB,MAAoB;AACzC,aAAO,EAAE,MAAM,cAAc,KAAK,gBAAgB,GAAG;AAAA,IACvD;AAAA,IACA,MAAM,qBAAqB,IAAuB;AAChD,aAAO,EAAE,MAAM,GAAG,QAAQ,kBAAkB,KAAK,GAAG;AAAA,IACtD;AAAA,IACA,MAAM,0BAA0B,MAAM;AACpC,YAAM,MAAM,EAAE,IAAI,MAAM,SAAS,EAAE,QAAQ,UAAU,EAAE;AACvD,aAAO,EAAE,MAAM,QAAQ,WAAW,SAAS,MAAM,IAAI;AAAA,IACvD;AAAA,EACF;AACF;AAEO,SAAS,iBAAiB,QAA4C,CAAC,GAAkB;AAC9F,QAAM,cAAU,uCAAkB,MAAM,WAAW,uCAAmB,qBAAqB;AAC3F,SAAO;AAAA,IACL,MAAM;AAAA,IACN,cAAc;AAAA,MACZ,iBAAiB;AAAA,MACjB,wBAAwB;AAAA,MACxB,eAAe;AAAA,MACf,iBAAiB;AAAA,IACnB;AAAA,IACA,MAAM,aAAa;AACjB,aAAO;AAAA,IACT;AAAA,IACA,MAAM,gBAAgB,IAAI;AACxB,aAAO,EAAE,GAAG,IAAI,WAAW,CAAC,gBAAgB,EAAE;AAAA,IAChD;AAAA,IACA,MAAM,gBAAgB;AACpB,aAAO;AAAA,IACT;AAAA,EACF;AACF;","names":[]}
|
package/dist/mock.d.cts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Network, TronAddress } from '@sun-protocol/sun-sdk-core';
|
|
2
|
+
import { d as TronClient, b as WalletAdapter } from './types-CZnHFnQK.cjs';
|
|
3
|
+
import '@sun-protocol/sun-sdk-chains';
|
|
4
|
+
|
|
5
|
+
declare function createMockClient(input: {
|
|
6
|
+
network: Network;
|
|
7
|
+
reads?: Record<string, unknown>;
|
|
8
|
+
nativeBalance?: string;
|
|
9
|
+
nativeBalances?: Record<string, string>;
|
|
10
|
+
}): TronClient;
|
|
11
|
+
declare function createMockWallet(input?: {
|
|
12
|
+
address?: TronAddress | string;
|
|
13
|
+
}): WalletAdapter;
|
|
14
|
+
|
|
15
|
+
export { createMockClient, createMockWallet };
|
package/dist/mock.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Network, TronAddress } from '@sun-protocol/sun-sdk-core';
|
|
2
|
+
import { d as TronClient, b as WalletAdapter } from './types-CZnHFnQK.js';
|
|
3
|
+
import '@sun-protocol/sun-sdk-chains';
|
|
4
|
+
|
|
5
|
+
declare function createMockClient(input: {
|
|
6
|
+
network: Network;
|
|
7
|
+
reads?: Record<string, unknown>;
|
|
8
|
+
nativeBalance?: string;
|
|
9
|
+
nativeBalances?: Record<string, string>;
|
|
10
|
+
}): TronClient;
|
|
11
|
+
declare function createMockWallet(input?: {
|
|
12
|
+
address?: TronAddress | string;
|
|
13
|
+
}): WalletAdapter;
|
|
14
|
+
|
|
15
|
+
export { createMockClient, createMockWallet };
|
package/dist/mock.js
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
// src/mock.ts
|
|
2
|
+
import { SDKError, TRON_ZERO_ADDRESS, assertTronAddress } from "@sun-protocol/sun-sdk-core";
|
|
3
|
+
function createMockClient(input) {
|
|
4
|
+
return {
|
|
5
|
+
kind: "mock",
|
|
6
|
+
network: input.network,
|
|
7
|
+
async getNativeBalance(owner) {
|
|
8
|
+
const balance = input.nativeBalances?.[owner] ?? input.nativeBalance;
|
|
9
|
+
if (balance !== void 0) return balance;
|
|
10
|
+
throw new SDKError("SDK_RUNTIME_ERROR", `No mock native balance configured for ${owner}`, { owner });
|
|
11
|
+
},
|
|
12
|
+
async readContract(call) {
|
|
13
|
+
if (input.reads && call.functionSelector in input.reads) return input.reads[call.functionSelector];
|
|
14
|
+
throw new SDKError("SDK_CONTRACT_ERROR", `No mock read configured for ${call.functionSelector}`, { call });
|
|
15
|
+
},
|
|
16
|
+
async buildTransaction(call) {
|
|
17
|
+
return { txID: `mock-build-${call.functionSelector}` };
|
|
18
|
+
},
|
|
19
|
+
async broadcastTransaction(tx) {
|
|
20
|
+
return { txid: tx.txID ?? "mock-broadcast", raw: tx };
|
|
21
|
+
},
|
|
22
|
+
async waitForTransactionReceipt(txid) {
|
|
23
|
+
const raw = { id: txid, receipt: { result: "SUCCESS" } };
|
|
24
|
+
return { txid, result: "SUCCESS", success: true, raw };
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
function createMockWallet(input = {}) {
|
|
29
|
+
const address = assertTronAddress(input.address ?? TRON_ZERO_ADDRESS, "mock wallet address");
|
|
30
|
+
return {
|
|
31
|
+
kind: "mock",
|
|
32
|
+
capabilities: {
|
|
33
|
+
signTransaction: true,
|
|
34
|
+
signAndSendTransaction: false,
|
|
35
|
+
signTypedData: true,
|
|
36
|
+
userInteractive: false
|
|
37
|
+
},
|
|
38
|
+
async getAddress() {
|
|
39
|
+
return address;
|
|
40
|
+
},
|
|
41
|
+
async signTransaction(tx) {
|
|
42
|
+
return { ...tx, signature: ["mock-signature"] };
|
|
43
|
+
},
|
|
44
|
+
async signTypedData() {
|
|
45
|
+
return "mock-typed-data-signature";
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
export {
|
|
50
|
+
createMockClient,
|
|
51
|
+
createMockWallet
|
|
52
|
+
};
|
|
53
|
+
//# sourceMappingURL=mock.js.map
|
package/dist/mock.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/mock.ts"],"sourcesContent":["import { SDKError, TRON_ZERO_ADDRESS, assertTronAddress, type Network, type TronAddress } from '@sun-protocol/sun-sdk-core'\nimport type { ContractCall, ContractRead, TronClient, TxResult, WalletAdapter } from './types.js'\n\nexport function createMockClient(input: {\n network: Network\n reads?: Record<string, unknown>\n nativeBalance?: string\n nativeBalances?: Record<string, string>\n}): TronClient {\n return {\n kind: 'mock',\n network: input.network,\n async getNativeBalance(owner) {\n const balance = input.nativeBalances?.[owner] ?? input.nativeBalance\n if (balance !== undefined) return balance\n throw new SDKError('SDK_RUNTIME_ERROR', `No mock native balance configured for ${owner}`, { owner })\n },\n async readContract<T = unknown>(call: ContractRead): Promise<T> {\n if (input.reads && call.functionSelector in input.reads) return input.reads[call.functionSelector] as T\n throw new SDKError('SDK_CONTRACT_ERROR', `No mock read configured for ${call.functionSelector}`, { call })\n },\n async buildTransaction(call: ContractCall) {\n return { txID: `mock-build-${call.functionSelector}` }\n },\n async broadcastTransaction(tx): Promise<TxResult> {\n return { txid: tx.txID ?? 'mock-broadcast', raw: tx }\n },\n async waitForTransactionReceipt(txid) {\n const raw = { id: txid, receipt: { result: 'SUCCESS' } }\n return { txid, result: 'SUCCESS', success: true, raw }\n },\n }\n}\n\nexport function createMockWallet(input: { address?: TronAddress | string } = {}): WalletAdapter {\n const address = assertTronAddress(input.address ?? TRON_ZERO_ADDRESS, 'mock wallet address')\n return {\n kind: 'mock',\n capabilities: {\n signTransaction: true,\n signAndSendTransaction: false,\n signTypedData: true,\n userInteractive: false,\n },\n async getAddress() {\n return address\n },\n async signTransaction(tx) {\n return { ...tx, signature: ['mock-signature'] }\n },\n async signTypedData() {\n return 'mock-typed-data-signature'\n },\n }\n}\n"],"mappings":";AAAA,SAAS,UAAU,mBAAmB,yBAAyD;AAGxF,SAAS,iBAAiB,OAKlB;AACb,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS,MAAM;AAAA,IACf,MAAM,iBAAiB,OAAO;AAC5B,YAAM,UAAU,MAAM,iBAAiB,KAAK,KAAK,MAAM;AACvD,UAAI,YAAY,OAAW,QAAO;AAClC,YAAM,IAAI,SAAS,qBAAqB,yCAAyC,KAAK,IAAI,EAAE,MAAM,CAAC;AAAA,IACrG;AAAA,IACA,MAAM,aAA0B,MAAgC;AAC9D,UAAI,MAAM,SAAS,KAAK,oBAAoB,MAAM,MAAO,QAAO,MAAM,MAAM,KAAK,gBAAgB;AACjG,YAAM,IAAI,SAAS,sBAAsB,+BAA+B,KAAK,gBAAgB,IAAI,EAAE,KAAK,CAAC;AAAA,IAC3G;AAAA,IACA,MAAM,iBAAiB,MAAoB;AACzC,aAAO,EAAE,MAAM,cAAc,KAAK,gBAAgB,GAAG;AAAA,IACvD;AAAA,IACA,MAAM,qBAAqB,IAAuB;AAChD,aAAO,EAAE,MAAM,GAAG,QAAQ,kBAAkB,KAAK,GAAG;AAAA,IACtD;AAAA,IACA,MAAM,0BAA0B,MAAM;AACpC,YAAM,MAAM,EAAE,IAAI,MAAM,SAAS,EAAE,QAAQ,UAAU,EAAE;AACvD,aAAO,EAAE,MAAM,QAAQ,WAAW,SAAS,MAAM,IAAI;AAAA,IACvD;AAAA,EACF;AACF;AAEO,SAAS,iBAAiB,QAA4C,CAAC,GAAkB;AAC9F,QAAM,UAAU,kBAAkB,MAAM,WAAW,mBAAmB,qBAAqB;AAC3F,SAAO;AAAA,IACL,MAAM;AAAA,IACN,cAAc;AAAA,MACZ,iBAAiB;AAAA,MACjB,wBAAwB;AAAA,MACxB,eAAe;AAAA,MACf,iBAAiB;AAAA,IACnB;AAAA,IACA,MAAM,aAAa;AACjB,aAAO;AAAA,IACT;AAAA,IACA,MAAM,gBAAgB,IAAI;AACxB,aAAO,EAAE,GAAG,IAAI,WAAW,CAAC,gBAAgB,EAAE;AAAA,IAChD;AAAA,IACA,MAAM,gBAAgB;AACpB,aAAO;AAAA,IACT;AAAA,EACF;AACF;","names":[]}
|