@masterpeach/market-sdk 0.2.0-beta.20260930.1
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 +109 -0
- package/README.zh-CN.md +155 -0
- package/THIRD_PARTY_NOTICES.md +14 -0
- package/dist/abi/index.cjs +14051 -0
- package/dist/abi/index.cjs.map +1 -0
- package/dist/abi/index.d.cts +10882 -0
- package/dist/abi/index.d.ts +10882 -0
- package/dist/abi/index.js +27 -0
- package/dist/abi/index.js.map +1 -0
- package/dist/chunk-TMU4HSZR.js +231 -0
- package/dist/chunk-TMU4HSZR.js.map +1 -0
- package/dist/chunk-TTVBOGKZ.js +14015 -0
- package/dist/chunk-TTVBOGKZ.js.map +1 -0
- package/dist/core.cjs +271 -0
- package/dist/core.cjs.map +1 -0
- package/dist/core.d.cts +99 -0
- package/dist/core.d.ts +99 -0
- package/dist/core.js +35 -0
- package/dist/core.js.map +1 -0
- package/dist/index.cjs +13327 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +840 -0
- package/dist/index.d.ts +840 -0
- package/dist/index.js +2705 -0
- package/dist/index.js.map +1 -0
- package/docs/earnings.md +71 -0
- package/docs/frontend.md +153 -0
- package/docs/latest-contract.md +38 -0
- package/docs/liquidity.md +87 -0
- package/docs/management.md +73 -0
- package/docs/pool-state.md +30 -0
- package/docs/pools.md +118 -0
- package/docs/positions.md +94 -0
- package/docs/variants.md +24 -0
- package/package.json +82 -0
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import {
|
|
2
|
+
marketAbiArtifactCommit,
|
|
3
|
+
marketAccessManagerAbi,
|
|
4
|
+
marketClaimFeePolicyAbi,
|
|
5
|
+
marketExtsloadAbi,
|
|
6
|
+
marketMarketCalendarAbi,
|
|
7
|
+
marketPoolRegistryAbi,
|
|
8
|
+
marketRampAbi,
|
|
9
|
+
marketRampETHAbi,
|
|
10
|
+
marketRampReaderAbi,
|
|
11
|
+
marketRwaRampAbi,
|
|
12
|
+
marketStateViewAbi
|
|
13
|
+
} from "../chunk-TTVBOGKZ.js";
|
|
14
|
+
export {
|
|
15
|
+
marketAbiArtifactCommit,
|
|
16
|
+
marketAccessManagerAbi,
|
|
17
|
+
marketClaimFeePolicyAbi,
|
|
18
|
+
marketExtsloadAbi,
|
|
19
|
+
marketMarketCalendarAbi,
|
|
20
|
+
marketPoolRegistryAbi,
|
|
21
|
+
marketRampAbi,
|
|
22
|
+
marketRampETHAbi,
|
|
23
|
+
marketRampReaderAbi,
|
|
24
|
+
marketRwaRampAbi,
|
|
25
|
+
marketStateViewAbi
|
|
26
|
+
};
|
|
27
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
// ../core/src/amount.ts
|
|
2
|
+
import { formatUnits, parseUnits } from "viem";
|
|
3
|
+
|
|
4
|
+
// ../core/src/errors.ts
|
|
5
|
+
import { UserRejectedRequestError } from "viem";
|
|
6
|
+
var PEACH_SDK_ERROR_BRAND = /* @__PURE__ */ Symbol.for("masterpeach.sdk-core.PeachSdkError");
|
|
7
|
+
var PeachSdkError = class extends Error {
|
|
8
|
+
code;
|
|
9
|
+
metadata;
|
|
10
|
+
constructor(code, message, options = {}) {
|
|
11
|
+
super(message, { cause: options.cause });
|
|
12
|
+
this.name = "PeachSdkError";
|
|
13
|
+
this.code = code;
|
|
14
|
+
this.metadata = options.metadata ?? {};
|
|
15
|
+
Object.defineProperty(this, PEACH_SDK_ERROR_BRAND, { value: true });
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
var UnsupportedChainError = class extends PeachSdkError {
|
|
19
|
+
constructor(chainId) {
|
|
20
|
+
super("UNSUPPORTED_CHAIN", `Unsupported chain: ${chainId}`, {
|
|
21
|
+
metadata: { chainId }
|
|
22
|
+
});
|
|
23
|
+
this.name = "UnsupportedChainError";
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
var MissingChainError = class extends PeachSdkError {
|
|
27
|
+
constructor() {
|
|
28
|
+
super("MISSING_CHAIN", "A chain ID is required for this operation.");
|
|
29
|
+
this.name = "MissingChainError";
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
var MissingAccountError = class extends PeachSdkError {
|
|
33
|
+
constructor() {
|
|
34
|
+
super("MISSING_ACCOUNT", "A wallet account is required for this operation.");
|
|
35
|
+
this.name = "MissingAccountError";
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
function isPeachSdkError(value, code) {
|
|
39
|
+
if (typeof value !== "object" || value === null) {
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
if (value[PEACH_SDK_ERROR_BRAND] !== true) {
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
return code === void 0 || value.code === code;
|
|
46
|
+
}
|
|
47
|
+
function toPeachSdkError(error) {
|
|
48
|
+
if (isPeachSdkError(error)) {
|
|
49
|
+
return error;
|
|
50
|
+
}
|
|
51
|
+
if (error instanceof UserRejectedRequestError) {
|
|
52
|
+
return new PeachSdkError("USER_REJECTED", "The wallet request was rejected.", {
|
|
53
|
+
cause: error
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
return new PeachSdkError("UNKNOWN_ERROR", "An unknown SDK error occurred.", {
|
|
57
|
+
cause: error
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// ../core/src/amount.ts
|
|
62
|
+
var DECIMAL_AMOUNT_PATTERN = /^(0|[1-9]\d*)(\.\d+)?$/;
|
|
63
|
+
function assertDecimals(decimals) {
|
|
64
|
+
if (!Number.isInteger(decimals) || decimals < 0 || decimals > 255) {
|
|
65
|
+
throw new PeachSdkError("INVALID_AMOUNT", `Invalid decimals: ${decimals}`);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
function parseAmount(value, decimals) {
|
|
69
|
+
assertDecimals(decimals);
|
|
70
|
+
if (!DECIMAL_AMOUNT_PATTERN.test(value)) {
|
|
71
|
+
throw new PeachSdkError("INVALID_AMOUNT", `Invalid decimal amount: ${value}`);
|
|
72
|
+
}
|
|
73
|
+
const fraction = value.split(".")[1] ?? "";
|
|
74
|
+
if (fraction.length > decimals) {
|
|
75
|
+
throw new PeachSdkError(
|
|
76
|
+
"INVALID_AMOUNT",
|
|
77
|
+
`Amount has ${fraction.length} decimal places but token supports ${decimals}.`
|
|
78
|
+
);
|
|
79
|
+
}
|
|
80
|
+
return parseUnits(value, decimals);
|
|
81
|
+
}
|
|
82
|
+
function formatAmount(value, decimals) {
|
|
83
|
+
assertDecimals(decimals);
|
|
84
|
+
if (value < 0n) {
|
|
85
|
+
throw new PeachSdkError("INVALID_AMOUNT", "Token amounts cannot be negative.");
|
|
86
|
+
}
|
|
87
|
+
return formatUnits(value, decimals);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// ../core/src/chain.ts
|
|
91
|
+
function resolveChainValue(registry, chainId) {
|
|
92
|
+
const value = registry[chainId];
|
|
93
|
+
if (value === void 0) {
|
|
94
|
+
throw new UnsupportedChainError(chainId);
|
|
95
|
+
}
|
|
96
|
+
return value;
|
|
97
|
+
}
|
|
98
|
+
function requireWalletClient(walletClient) {
|
|
99
|
+
if (!walletClient?.account) {
|
|
100
|
+
throw new MissingAccountError();
|
|
101
|
+
}
|
|
102
|
+
return walletClient;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// ../core/src/prepared.ts
|
|
106
|
+
import { isAddressEqual } from "viem";
|
|
107
|
+
import { parseAccount } from "viem/accounts";
|
|
108
|
+
function immutableClone(value, seen = /* @__PURE__ */ new WeakMap()) {
|
|
109
|
+
if (value === null || typeof value !== "object") return value;
|
|
110
|
+
const source = value;
|
|
111
|
+
const existing = seen.get(source);
|
|
112
|
+
if (existing !== void 0) return existing;
|
|
113
|
+
const clone = Array.isArray(value) ? [] : Object.create(Object.getPrototypeOf(source));
|
|
114
|
+
seen.set(source, clone);
|
|
115
|
+
for (const key of Reflect.ownKeys(source)) {
|
|
116
|
+
const descriptor = Object.getOwnPropertyDescriptor(source, key);
|
|
117
|
+
if (!descriptor) continue;
|
|
118
|
+
if ("value" in descriptor) {
|
|
119
|
+
descriptor.value = immutableClone(descriptor.value, seen);
|
|
120
|
+
descriptor.writable = false;
|
|
121
|
+
}
|
|
122
|
+
descriptor.configurable = false;
|
|
123
|
+
Object.defineProperty(clone, key, descriptor);
|
|
124
|
+
}
|
|
125
|
+
return Object.freeze(clone);
|
|
126
|
+
}
|
|
127
|
+
function createPreparedTransactionStore() {
|
|
128
|
+
const canonicalRequests = /* @__PURE__ */ new WeakMap();
|
|
129
|
+
return Object.freeze({
|
|
130
|
+
create(request, preview, context) {
|
|
131
|
+
const canonicalRequest = immutableClone(request);
|
|
132
|
+
const prepared = Object.freeze({
|
|
133
|
+
request: immutableClone(request),
|
|
134
|
+
preview,
|
|
135
|
+
context
|
|
136
|
+
});
|
|
137
|
+
canonicalRequests.set(prepared, canonicalRequest);
|
|
138
|
+
return prepared;
|
|
139
|
+
},
|
|
140
|
+
has: (value) => canonicalRequests.has(value),
|
|
141
|
+
getCanonical: (value) => canonicalRequests.get(value)
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
async function resolveLiveWalletAccount(walletClient, expectedChainId, chainMismatch) {
|
|
145
|
+
const client = requireWalletClient(walletClient);
|
|
146
|
+
const actualChainId = await client.getChainId();
|
|
147
|
+
if (actualChainId !== expectedChainId) {
|
|
148
|
+
throw chainMismatch(expectedChainId, actualChainId);
|
|
149
|
+
}
|
|
150
|
+
const [liveAddress] = await client.getAddresses();
|
|
151
|
+
if (!liveAddress) throw new MissingAccountError();
|
|
152
|
+
const configuredAccount = client.account;
|
|
153
|
+
if (!configuredAccount) throw new MissingAccountError();
|
|
154
|
+
return isAddressEqual(configuredAccount.address, liveAddress) ? configuredAccount : parseAccount(liveAddress);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// ../core/src/requestAbort.ts
|
|
158
|
+
function createRequestAbortScope(timeoutMs, callerSignal) {
|
|
159
|
+
if (!Number.isFinite(timeoutMs) || timeoutMs <= 0) {
|
|
160
|
+
throw new RangeError("timeoutMs must be a positive, finite number of milliseconds.");
|
|
161
|
+
}
|
|
162
|
+
const controller = new AbortController();
|
|
163
|
+
let didTimeout = false;
|
|
164
|
+
const abortFromCaller = () => controller.abort(callerSignal?.reason);
|
|
165
|
+
if (callerSignal?.aborted) {
|
|
166
|
+
abortFromCaller();
|
|
167
|
+
} else {
|
|
168
|
+
callerSignal?.addEventListener("abort", abortFromCaller, { once: true });
|
|
169
|
+
}
|
|
170
|
+
const timeout = setTimeout(() => {
|
|
171
|
+
if (controller.signal.aborted) return;
|
|
172
|
+
didTimeout = true;
|
|
173
|
+
controller.abort(new Error(`Request timed out after ${timeoutMs}ms.`));
|
|
174
|
+
}, timeoutMs);
|
|
175
|
+
const waitFor = (operation) => {
|
|
176
|
+
if (controller.signal.aborted) {
|
|
177
|
+
return Promise.reject(controller.signal.reason);
|
|
178
|
+
}
|
|
179
|
+
return new Promise((resolve, reject) => {
|
|
180
|
+
const rejectFromAbort = () => reject(controller.signal.reason);
|
|
181
|
+
controller.signal.addEventListener("abort", rejectFromAbort, { once: true });
|
|
182
|
+
void Promise.resolve(operation).then(
|
|
183
|
+
(value) => {
|
|
184
|
+
controller.signal.removeEventListener("abort", rejectFromAbort);
|
|
185
|
+
resolve(value);
|
|
186
|
+
},
|
|
187
|
+
(error) => {
|
|
188
|
+
controller.signal.removeEventListener("abort", rejectFromAbort);
|
|
189
|
+
reject(error);
|
|
190
|
+
}
|
|
191
|
+
);
|
|
192
|
+
});
|
|
193
|
+
};
|
|
194
|
+
return Object.freeze({
|
|
195
|
+
signal: controller.signal,
|
|
196
|
+
timedOut: () => didTimeout,
|
|
197
|
+
waitFor,
|
|
198
|
+
release: () => {
|
|
199
|
+
clearTimeout(timeout);
|
|
200
|
+
callerSignal?.removeEventListener("abort", abortFromCaller);
|
|
201
|
+
}
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
// ../core/src/transaction.ts
|
|
206
|
+
function transactionResultFromReceipt(receipt) {
|
|
207
|
+
return {
|
|
208
|
+
hash: receipt.transactionHash,
|
|
209
|
+
status: receipt.status === "success" ? "confirmed" : "reverted",
|
|
210
|
+
receipt
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
export {
|
|
215
|
+
PeachSdkError,
|
|
216
|
+
UnsupportedChainError,
|
|
217
|
+
MissingChainError,
|
|
218
|
+
MissingAccountError,
|
|
219
|
+
isPeachSdkError,
|
|
220
|
+
toPeachSdkError,
|
|
221
|
+
parseAmount,
|
|
222
|
+
formatAmount,
|
|
223
|
+
resolveChainValue,
|
|
224
|
+
requireWalletClient,
|
|
225
|
+
immutableClone,
|
|
226
|
+
createPreparedTransactionStore,
|
|
227
|
+
resolveLiveWalletAccount,
|
|
228
|
+
createRequestAbortScope,
|
|
229
|
+
transactionResultFromReceipt
|
|
230
|
+
};
|
|
231
|
+
//# sourceMappingURL=chunk-TMU4HSZR.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../core/src/amount.ts","../../core/src/errors.ts","../../core/src/chain.ts","../../core/src/prepared.ts","../../core/src/requestAbort.ts","../../core/src/transaction.ts"],"sourcesContent":["import { formatUnits, parseUnits } from \"viem\";\n\nimport { PeachSdkError } from \"./errors\";\n\nconst DECIMAL_AMOUNT_PATTERN = /^(0|[1-9]\\d*)(\\.\\d+)?$/;\n\nfunction assertDecimals(decimals: number): void {\n if (!Number.isInteger(decimals) || decimals < 0 || decimals > 255) {\n throw new PeachSdkError(\"INVALID_AMOUNT\", `Invalid decimals: ${decimals}`);\n }\n}\n\n/** Parses a canonical unsigned decimal token amount into integer base units. */\nexport function parseAmount(value: string, decimals: number): bigint {\n assertDecimals(decimals);\n\n if (!DECIMAL_AMOUNT_PATTERN.test(value)) {\n throw new PeachSdkError(\"INVALID_AMOUNT\", `Invalid decimal amount: ${value}`);\n }\n\n const fraction = value.split(\".\")[1] ?? \"\";\n if (fraction.length > decimals) {\n throw new PeachSdkError(\n \"INVALID_AMOUNT\",\n `Amount has ${fraction.length} decimal places but token supports ${decimals}.`,\n );\n }\n\n return parseUnits(value, decimals);\n}\n\n/** Formats an unsigned base-unit token amount without introducing floating-point rounding. */\nexport function formatAmount(value: bigint, decimals: number): string {\n assertDecimals(decimals);\n\n if (value < 0n) {\n throw new PeachSdkError(\"INVALID_AMOUNT\", \"Token amounts cannot be negative.\");\n }\n\n return formatUnits(value, decimals);\n}\n","import { UserRejectedRequestError } from \"viem\";\n\nexport type PeachSdkErrorCode =\n | \"INVALID_AMOUNT\"\n | \"MISSING_ACCOUNT\"\n | \"MISSING_CHAIN\"\n | \"UNSUPPORTED_CHAIN\"\n | \"USER_REJECTED\"\n | \"TRANSPORT_ERROR\"\n | \"CONTRACT_ERROR\"\n | \"UNKNOWN_ERROR\";\n\n/**\n * Cross-copy brand for shared SDK errors.\n *\n * Every product SDK bundles its own copy of these primitives, so an error thrown by\n * `@masterpeach/launchpad-sdk` is not an `instanceof` the class of the same name exported by\n * `@masterpeach/lending-sdk`. `Symbol.for` resolves through the runtime-wide symbol registry, so\n * each copy brands its errors with the identical key and can recognize the others'.\n */\nconst PEACH_SDK_ERROR_BRAND = Symbol.for(\"masterpeach.sdk-core.PeachSdkError\");\n\n/** Base error carrying a stable machine-readable code and structured diagnostic metadata. */\nexport class PeachSdkError extends Error {\n readonly code: PeachSdkErrorCode;\n readonly metadata: Readonly<Record<string, unknown>>;\n\n constructor(\n code: PeachSdkErrorCode,\n message: string,\n options: { cause?: unknown; metadata?: Readonly<Record<string, unknown>> } = {},\n ) {\n super(message, { cause: options.cause });\n this.name = \"PeachSdkError\";\n this.code = code;\n this.metadata = options.metadata ?? {};\n // Non-enumerable so the brand stays out of structured clones and JSON diagnostics.\n Object.defineProperty(this, PEACH_SDK_ERROR_BRAND, { value: true });\n }\n}\n\nexport class UnsupportedChainError extends PeachSdkError {\n constructor(chainId: number) {\n super(\"UNSUPPORTED_CHAIN\", `Unsupported chain: ${chainId}`, {\n metadata: { chainId },\n });\n this.name = \"UnsupportedChainError\";\n }\n}\n\nexport class MissingChainError extends PeachSdkError {\n constructor() {\n super(\"MISSING_CHAIN\", \"A chain ID is required for this operation.\");\n this.name = \"MissingChainError\";\n }\n}\n\nexport class MissingAccountError extends PeachSdkError {\n constructor() {\n super(\"MISSING_ACCOUNT\", \"A wallet account is required for this operation.\");\n this.name = \"MissingAccountError\";\n }\n}\n\n/**\n * Recognizes a shared SDK error regardless of which product SDK created it.\n *\n * Prefer this over `instanceof PeachSdkError` whenever an application depends on more than one\n * MasterPeach SDK: each package carries its own copy of the class, so `instanceof` only matches\n * errors that happened to originate from the same package. Pass a `code` to narrow in one step.\n */\nexport function isPeachSdkError(value: unknown): value is PeachSdkError;\nexport function isPeachSdkError<TCode extends PeachSdkErrorCode>(\n value: unknown,\n code: TCode,\n): value is PeachSdkError & { readonly code: TCode };\nexport function isPeachSdkError(value: unknown, code?: PeachSdkErrorCode): boolean {\n if (typeof value !== \"object\" || value === null) {\n return false;\n }\n if ((value as Record<symbol, unknown>)[PEACH_SDK_ERROR_BRAND] !== true) {\n return false;\n }\n return code === undefined || (value as PeachSdkError).code === code;\n}\n\n/** Normalizes wallet rejection and unknown failures at a shared SDK boundary. */\nexport function toPeachSdkError(error: unknown): PeachSdkError {\n // Brand check rather than `instanceof`, so an error raised by a sibling SDK keeps its code\n // instead of being flattened into UNKNOWN_ERROR.\n if (isPeachSdkError(error)) {\n return error;\n }\n\n if (error instanceof UserRejectedRequestError) {\n return new PeachSdkError(\"USER_REJECTED\", \"The wallet request was rejected.\", {\n cause: error,\n });\n }\n\n return new PeachSdkError(\"UNKNOWN_ERROR\", \"An unknown SDK error occurred.\", {\n cause: error,\n });\n}\n","import type { WalletClient } from \"viem\";\n\nimport { MissingAccountError, UnsupportedChainError } from \"./errors\";\n\nexport type ChainRegistry<T> = Readonly<Record<number, T>>;\n\n/** Resolves a chain-scoped configuration value or throws a stable unsupported-chain error. */\nexport function resolveChainValue<T>(registry: ChainRegistry<T>, chainId: number): T {\n const value = registry[chainId];\n if (value === undefined) {\n throw new UnsupportedChainError(chainId);\n }\n return value;\n}\n\n/** Requires a Wallet Client with an attached account before a signing or write operation. */\nexport function requireWalletClient(walletClient: WalletClient | undefined): WalletClient {\n if (!walletClient?.account) {\n throw new MissingAccountError();\n }\n return walletClient;\n}\n","import type { Account, WalletClient } from \"viem\";\nimport { isAddressEqual } from \"viem\";\nimport { parseAccount } from \"viem/accounts\";\nimport { requireWalletClient } from \"./chain\";\nimport { MissingAccountError } from \"./errors\";\n\n/** Public inspection shape shared by product-specific prepared transaction types. */\nexport interface PreparedTransactionSnapshot<Request extends object, Preview, Context> {\n readonly request: Readonly<Request>;\n readonly preview: Preview;\n readonly context: Context;\n}\n\n/** A module-local provenance store. Its canonical requests are never exposed to consumers. */\nexport interface PreparedTransactionStore {\n create<Request extends object, Preview, Context>(\n request: Request,\n preview: Preview,\n context: Context,\n ): PreparedTransactionSnapshot<Request, Preview, Context>;\n has(value: object): boolean;\n getCanonical<Request extends object>(value: object): Request | undefined;\n}\n\n/**\n * Copies and freezes plain Viem request data, retaining cycles, symbols, prototypes and functions.\n * Accessor descriptors are preserved without invoking them.\n */\nexport function immutableClone<Value>(value: Value, seen = new WeakMap<object, unknown>()): Value {\n if (value === null || typeof value !== \"object\") return value;\n\n const source = value as object;\n const existing = seen.get(source);\n if (existing !== undefined) return existing as Value;\n\n const clone: object = Array.isArray(value)\n ? []\n : Object.create(Object.getPrototypeOf(source) as object | null);\n seen.set(source, clone);\n\n for (const key of Reflect.ownKeys(source)) {\n const descriptor = Object.getOwnPropertyDescriptor(source, key);\n if (!descriptor) continue;\n if (\"value\" in descriptor) {\n descriptor.value = immutableClone(descriptor.value, seen);\n descriptor.writable = false;\n }\n descriptor.configurable = false;\n Object.defineProperty(clone, key, descriptor);\n }\n\n return Object.freeze(clone) as Value;\n}\n\n/**\n * Creates an isolated prepared-request registry for one product module.\n *\n * Sharing the factory removes duplicated security logic without sharing registry state: a value\n * prepared by one SDK can never become valid in another SDK's store.\n */\nexport function createPreparedTransactionStore(): PreparedTransactionStore {\n const canonicalRequests = new WeakMap<object, object>();\n\n return Object.freeze({\n create<Request extends object, Preview, Context>(\n request: Request,\n preview: Preview,\n context: Context,\n ): PreparedTransactionSnapshot<Request, Preview, Context> {\n const canonicalRequest = immutableClone(request);\n const prepared = Object.freeze({\n request: immutableClone(request),\n preview,\n context,\n });\n canonicalRequests.set(prepared, canonicalRequest);\n return prepared;\n },\n has: (value: object) => canonicalRequests.has(value),\n getCanonical: <Request extends object>(value: object) =>\n canonicalRequests.get(value) as Request | undefined,\n });\n}\n\n/**\n * Resolves the wallet's live account after proving its current chain.\n *\n * Product SDKs provide their own chain-mismatch error factory so this shared state-transition\n * check does not erase protocol-specific error contracts.\n */\nexport async function resolveLiveWalletAccount(\n walletClient: WalletClient | undefined,\n expectedChainId: number,\n chainMismatch: (expectedChainId: number, actualChainId: number) => Error,\n): Promise<Account> {\n const client = requireWalletClient(walletClient);\n const actualChainId = await client.getChainId();\n if (actualChainId !== expectedChainId) {\n throw chainMismatch(expectedChainId, actualChainId);\n }\n\n const [liveAddress] = await client.getAddresses();\n if (!liveAddress) throw new MissingAccountError();\n\n const configuredAccount = client.account;\n if (!configuredAccount) throw new MissingAccountError();\n return isAddressEqual(configuredAccount.address, liveAddress)\n ? configuredAccount\n : parseAccount(liveAddress);\n}\n","export interface RequestAbortScope {\n readonly signal: AbortSignal;\n readonly timedOut: () => boolean;\n /** Races work that cannot consume an AbortSignal, such as async credential resolution. */\n readonly waitFor: <Value>(operation: PromiseLike<Value>) => Promise<Value>;\n readonly release: () => void;\n}\n\n/** Links caller cancellation and an SDK deadline while keeping their causes distinguishable. */\nexport function createRequestAbortScope(\n timeoutMs: number,\n callerSignal?: AbortSignal,\n): RequestAbortScope {\n if (!Number.isFinite(timeoutMs) || timeoutMs <= 0) {\n throw new RangeError(\"timeoutMs must be a positive, finite number of milliseconds.\");\n }\n\n const controller = new AbortController();\n let didTimeout = false;\n const abortFromCaller = () => controller.abort(callerSignal?.reason);\n if (callerSignal?.aborted) {\n abortFromCaller();\n } else {\n callerSignal?.addEventListener(\"abort\", abortFromCaller, { once: true });\n }\n\n const timeout = setTimeout(() => {\n // Caller cancellation wins permanently. Without this guard the timer can fire later and make\n // a cancelled request look timed out to consumers that inspect the scope after async cleanup.\n if (controller.signal.aborted) return;\n didTimeout = true;\n controller.abort(new Error(`Request timed out after ${timeoutMs}ms.`));\n }, timeoutMs);\n\n const waitFor = <Value>(operation: PromiseLike<Value>): Promise<Value> => {\n if (controller.signal.aborted) {\n return Promise.reject(controller.signal.reason);\n }\n return new Promise<Value>((resolve, reject) => {\n const rejectFromAbort = () => reject(controller.signal.reason);\n controller.signal.addEventListener(\"abort\", rejectFromAbort, { once: true });\n void Promise.resolve(operation).then(\n (value) => {\n controller.signal.removeEventListener(\"abort\", rejectFromAbort);\n resolve(value);\n },\n (error: unknown) => {\n controller.signal.removeEventListener(\"abort\", rejectFromAbort);\n reject(error);\n },\n );\n });\n };\n\n return Object.freeze({\n signal: controller.signal,\n timedOut: () => didTimeout,\n waitFor,\n release: () => {\n clearTimeout(timeout);\n callerSignal?.removeEventListener(\"abort\", abortFromCaller);\n },\n });\n}\n","import type { Hash, TransactionReceipt } from \"viem\";\n\nexport type SdkTransactionStatus = \"pending\" | \"confirmed\" | \"reverted\";\n\n/** Framework-neutral transaction result shared by product SDK packages. */\nexport interface SdkTransactionResult {\n readonly hash: Hash;\n readonly status: SdkTransactionStatus;\n readonly receipt?: TransactionReceipt;\n}\n\n/** Converts a Viem receipt into the stable shared transaction result shape. */\nexport function transactionResultFromReceipt(receipt: TransactionReceipt): SdkTransactionResult {\n return {\n hash: receipt.transactionHash,\n status: receipt.status === \"success\" ? \"confirmed\" : \"reverted\",\n receipt,\n };\n}\n"],"mappings":";AAAA,SAAS,aAAa,kBAAkB;;;ACAxC,SAAS,gCAAgC;AAoBzC,IAAM,wBAAwB,uBAAO,IAAI,oCAAoC;AAGtE,IAAM,gBAAN,cAA4B,MAAM;AAAA,EAC9B;AAAA,EACA;AAAA,EAET,YACE,MACA,SACA,UAA6E,CAAC,GAC9E;AACA,UAAM,SAAS,EAAE,OAAO,QAAQ,MAAM,CAAC;AACvC,SAAK,OAAO;AACZ,SAAK,OAAO;AACZ,SAAK,WAAW,QAAQ,YAAY,CAAC;AAErC,WAAO,eAAe,MAAM,uBAAuB,EAAE,OAAO,KAAK,CAAC;AAAA,EACpE;AACF;AAEO,IAAM,wBAAN,cAAoC,cAAc;AAAA,EACvD,YAAY,SAAiB;AAC3B,UAAM,qBAAqB,sBAAsB,OAAO,IAAI;AAAA,MAC1D,UAAU,EAAE,QAAQ;AAAA,IACtB,CAAC;AACD,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,oBAAN,cAAgC,cAAc;AAAA,EACnD,cAAc;AACZ,UAAM,iBAAiB,4CAA4C;AACnE,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,sBAAN,cAAkC,cAAc;AAAA,EACrD,cAAc;AACZ,UAAM,mBAAmB,kDAAkD;AAC3E,SAAK,OAAO;AAAA,EACd;AACF;AAcO,SAAS,gBAAgB,OAAgB,MAAmC;AACjF,MAAI,OAAO,UAAU,YAAY,UAAU,MAAM;AAC/C,WAAO;AAAA,EACT;AACA,MAAK,MAAkC,qBAAqB,MAAM,MAAM;AACtE,WAAO;AAAA,EACT;AACA,SAAO,SAAS,UAAc,MAAwB,SAAS;AACjE;AAGO,SAAS,gBAAgB,OAA+B;AAG7D,MAAI,gBAAgB,KAAK,GAAG;AAC1B,WAAO;AAAA,EACT;AAEA,MAAI,iBAAiB,0BAA0B;AAC7C,WAAO,IAAI,cAAc,iBAAiB,oCAAoC;AAAA,MAC5E,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AAEA,SAAO,IAAI,cAAc,iBAAiB,kCAAkC;AAAA,IAC1E,OAAO;AAAA,EACT,CAAC;AACH;;;ADnGA,IAAM,yBAAyB;AAE/B,SAAS,eAAe,UAAwB;AAC9C,MAAI,CAAC,OAAO,UAAU,QAAQ,KAAK,WAAW,KAAK,WAAW,KAAK;AACjE,UAAM,IAAI,cAAc,kBAAkB,qBAAqB,QAAQ,EAAE;AAAA,EAC3E;AACF;AAGO,SAAS,YAAY,OAAe,UAA0B;AACnE,iBAAe,QAAQ;AAEvB,MAAI,CAAC,uBAAuB,KAAK,KAAK,GAAG;AACvC,UAAM,IAAI,cAAc,kBAAkB,2BAA2B,KAAK,EAAE;AAAA,EAC9E;AAEA,QAAM,WAAW,MAAM,MAAM,GAAG,EAAE,CAAC,KAAK;AACxC,MAAI,SAAS,SAAS,UAAU;AAC9B,UAAM,IAAI;AAAA,MACR;AAAA,MACA,cAAc,SAAS,MAAM,sCAAsC,QAAQ;AAAA,IAC7E;AAAA,EACF;AAEA,SAAO,WAAW,OAAO,QAAQ;AACnC;AAGO,SAAS,aAAa,OAAe,UAA0B;AACpE,iBAAe,QAAQ;AAEvB,MAAI,QAAQ,IAAI;AACd,UAAM,IAAI,cAAc,kBAAkB,mCAAmC;AAAA,EAC/E;AAEA,SAAO,YAAY,OAAO,QAAQ;AACpC;;;AEjCO,SAAS,kBAAqB,UAA4B,SAAoB;AACnF,QAAM,QAAQ,SAAS,OAAO;AAC9B,MAAI,UAAU,QAAW;AACvB,UAAM,IAAI,sBAAsB,OAAO;AAAA,EACzC;AACA,SAAO;AACT;AAGO,SAAS,oBAAoB,cAAsD;AACxF,MAAI,CAAC,cAAc,SAAS;AAC1B,UAAM,IAAI,oBAAoB;AAAA,EAChC;AACA,SAAO;AACT;;;ACpBA,SAAS,sBAAsB;AAC/B,SAAS,oBAAoB;AA0BtB,SAAS,eAAsB,OAAc,OAAO,oBAAI,QAAyB,GAAU;AAChG,MAAI,UAAU,QAAQ,OAAO,UAAU,SAAU,QAAO;AAExD,QAAM,SAAS;AACf,QAAM,WAAW,KAAK,IAAI,MAAM;AAChC,MAAI,aAAa,OAAW,QAAO;AAEnC,QAAM,QAAgB,MAAM,QAAQ,KAAK,IACrC,CAAC,IACD,OAAO,OAAO,OAAO,eAAe,MAAM,CAAkB;AAChE,OAAK,IAAI,QAAQ,KAAK;AAEtB,aAAW,OAAO,QAAQ,QAAQ,MAAM,GAAG;AACzC,UAAM,aAAa,OAAO,yBAAyB,QAAQ,GAAG;AAC9D,QAAI,CAAC,WAAY;AACjB,QAAI,WAAW,YAAY;AACzB,iBAAW,QAAQ,eAAe,WAAW,OAAO,IAAI;AACxD,iBAAW,WAAW;AAAA,IACxB;AACA,eAAW,eAAe;AAC1B,WAAO,eAAe,OAAO,KAAK,UAAU;AAAA,EAC9C;AAEA,SAAO,OAAO,OAAO,KAAK;AAC5B;AAQO,SAAS,iCAA2D;AACzE,QAAM,oBAAoB,oBAAI,QAAwB;AAEtD,SAAO,OAAO,OAAO;AAAA,IACnB,OACE,SACA,SACA,SACwD;AACxD,YAAM,mBAAmB,eAAe,OAAO;AAC/C,YAAM,WAAW,OAAO,OAAO;AAAA,QAC7B,SAAS,eAAe,OAAO;AAAA,QAC/B;AAAA,QACA;AAAA,MACF,CAAC;AACD,wBAAkB,IAAI,UAAU,gBAAgB;AAChD,aAAO;AAAA,IACT;AAAA,IACA,KAAK,CAAC,UAAkB,kBAAkB,IAAI,KAAK;AAAA,IACnD,cAAc,CAAyB,UACrC,kBAAkB,IAAI,KAAK;AAAA,EAC/B,CAAC;AACH;AAQA,eAAsB,yBACpB,cACA,iBACA,eACkB;AAClB,QAAM,SAAS,oBAAoB,YAAY;AAC/C,QAAM,gBAAgB,MAAM,OAAO,WAAW;AAC9C,MAAI,kBAAkB,iBAAiB;AACrC,UAAM,cAAc,iBAAiB,aAAa;AAAA,EACpD;AAEA,QAAM,CAAC,WAAW,IAAI,MAAM,OAAO,aAAa;AAChD,MAAI,CAAC,YAAa,OAAM,IAAI,oBAAoB;AAEhD,QAAM,oBAAoB,OAAO;AACjC,MAAI,CAAC,kBAAmB,OAAM,IAAI,oBAAoB;AACtD,SAAO,eAAe,kBAAkB,SAAS,WAAW,IACxD,oBACA,aAAa,WAAW;AAC9B;;;ACpGO,SAAS,wBACd,WACA,cACmB;AACnB,MAAI,CAAC,OAAO,SAAS,SAAS,KAAK,aAAa,GAAG;AACjD,UAAM,IAAI,WAAW,8DAA8D;AAAA,EACrF;AAEA,QAAM,aAAa,IAAI,gBAAgB;AACvC,MAAI,aAAa;AACjB,QAAM,kBAAkB,MAAM,WAAW,MAAM,cAAc,MAAM;AACnE,MAAI,cAAc,SAAS;AACzB,oBAAgB;AAAA,EAClB,OAAO;AACL,kBAAc,iBAAiB,SAAS,iBAAiB,EAAE,MAAM,KAAK,CAAC;AAAA,EACzE;AAEA,QAAM,UAAU,WAAW,MAAM;AAG/B,QAAI,WAAW,OAAO,QAAS;AAC/B,iBAAa;AACb,eAAW,MAAM,IAAI,MAAM,2BAA2B,SAAS,KAAK,CAAC;AAAA,EACvE,GAAG,SAAS;AAEZ,QAAM,UAAU,CAAQ,cAAkD;AACxE,QAAI,WAAW,OAAO,SAAS;AAC7B,aAAO,QAAQ,OAAO,WAAW,OAAO,MAAM;AAAA,IAChD;AACA,WAAO,IAAI,QAAe,CAAC,SAAS,WAAW;AAC7C,YAAM,kBAAkB,MAAM,OAAO,WAAW,OAAO,MAAM;AAC7D,iBAAW,OAAO,iBAAiB,SAAS,iBAAiB,EAAE,MAAM,KAAK,CAAC;AAC3E,WAAK,QAAQ,QAAQ,SAAS,EAAE;AAAA,QAC9B,CAAC,UAAU;AACT,qBAAW,OAAO,oBAAoB,SAAS,eAAe;AAC9D,kBAAQ,KAAK;AAAA,QACf;AAAA,QACA,CAAC,UAAmB;AAClB,qBAAW,OAAO,oBAAoB,SAAS,eAAe;AAC9D,iBAAO,KAAK;AAAA,QACd;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO,OAAO,OAAO;AAAA,IACnB,QAAQ,WAAW;AAAA,IACnB,UAAU,MAAM;AAAA,IAChB;AAAA,IACA,SAAS,MAAM;AACb,mBAAa,OAAO;AACpB,oBAAc,oBAAoB,SAAS,eAAe;AAAA,IAC5D;AAAA,EACF,CAAC;AACH;;;ACnDO,SAAS,6BAA6B,SAAmD;AAC9F,SAAO;AAAA,IACL,MAAM,QAAQ;AAAA,IACd,QAAQ,QAAQ,WAAW,YAAY,cAAc;AAAA,IACrD;AAAA,EACF;AACF;","names":[]}
|