@prism-ing/wallet 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +21 -0
- package/LICENSE +21 -0
- package/README.md +596 -0
- package/SPEC.md +192 -0
- package/dist/backends/squads-recovery-backend.d.ts +59 -0
- package/dist/backends/squads-recovery-backend.d.ts.map +1 -0
- package/dist/backends/squads-recovery-backend.js +81 -0
- package/dist/backends/squads-recovery-backend.js.map +1 -0
- package/dist/backends/squads-types.d.ts +74 -0
- package/dist/backends/squads-types.d.ts.map +1 -0
- package/dist/backends/squads-types.js +22 -0
- package/dist/backends/squads-types.js.map +1 -0
- package/dist/backends/zerodev-policy-mapper.d.ts +41 -0
- package/dist/backends/zerodev-policy-mapper.d.ts.map +1 -0
- package/dist/backends/zerodev-policy-mapper.js +127 -0
- package/dist/backends/zerodev-policy-mapper.js.map +1 -0
- package/dist/backends/zerodev-session-backend.d.ts +43 -0
- package/dist/backends/zerodev-session-backend.d.ts.map +1 -0
- package/dist/backends/zerodev-session-backend.js +63 -0
- package/dist/backends/zerodev-session-backend.js.map +1 -0
- package/dist/backends/zerodev-types.d.ts +104 -0
- package/dist/backends/zerodev-types.d.ts.map +1 -0
- package/dist/backends/zerodev-types.js +13 -0
- package/dist/backends/zerodev-types.js.map +1 -0
- package/dist/create-wallet.d.ts +89 -0
- package/dist/create-wallet.d.ts.map +1 -0
- package/dist/create-wallet.js +235 -0
- package/dist/create-wallet.js.map +1 -0
- package/dist/cross-chain.d.ts +64 -0
- package/dist/cross-chain.d.ts.map +1 -0
- package/dist/cross-chain.js +200 -0
- package/dist/cross-chain.js.map +1 -0
- package/dist/errors.d.ts +115 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +97 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +55 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +52 -0
- package/dist/index.js.map +1 -0
- package/dist/internal/base58.d.ts +8 -0
- package/dist/internal/base58.d.ts.map +1 -0
- package/dist/internal/base58.js +34 -0
- package/dist/internal/base58.js.map +1 -0
- package/dist/internal/eip712.d.ts +41 -0
- package/dist/internal/eip712.d.ts.map +1 -0
- package/dist/internal/eip712.js +182 -0
- package/dist/internal/eip712.js.map +1 -0
- package/dist/internal/file-spend-persistence.d.ts +9 -0
- package/dist/internal/file-spend-persistence.d.ts.map +1 -0
- package/dist/internal/file-spend-persistence.js +58 -0
- package/dist/internal/file-spend-persistence.js.map +1 -0
- package/dist/internal/onebalance-client.d.ts +59 -0
- package/dist/internal/onebalance-client.d.ts.map +1 -0
- package/dist/internal/onebalance-client.js +2 -0
- package/dist/internal/onebalance-client.js.map +1 -0
- package/dist/internal/onebalance-http-client.d.ts +25 -0
- package/dist/internal/onebalance-http-client.d.ts.map +1 -0
- package/dist/internal/onebalance-http-client.js +161 -0
- package/dist/internal/onebalance-http-client.js.map +1 -0
- package/dist/internal/onebalance-types.d.ts +201 -0
- package/dist/internal/onebalance-types.d.ts.map +1 -0
- package/dist/internal/onebalance-types.js +39 -0
- package/dist/internal/onebalance-types.js.map +1 -0
- package/dist/internal/platform.d.ts +14 -0
- package/dist/internal/platform.d.ts.map +1 -0
- package/dist/internal/platform.js +22 -0
- package/dist/internal/platform.js.map +1 -0
- package/dist/internal/quote-verifier.d.ts +71 -0
- package/dist/internal/quote-verifier.d.ts.map +1 -0
- package/dist/internal/quote-verifier.js +172 -0
- package/dist/internal/quote-verifier.js.map +1 -0
- package/dist/internal/recovery-manager.d.ts +29 -0
- package/dist/internal/recovery-manager.d.ts.map +1 -0
- package/dist/internal/recovery-manager.js +161 -0
- package/dist/internal/recovery-manager.js.map +1 -0
- package/dist/result.d.ts +132 -0
- package/dist/result.d.ts.map +1 -0
- package/dist/result.js +114 -0
- package/dist/result.js.map +1 -0
- package/dist/schemas.d.ts +184 -0
- package/dist/schemas.d.ts.map +1 -0
- package/dist/schemas.js +76 -0
- package/dist/schemas.js.map +1 -0
- package/dist/session-keys.d.ts +53 -0
- package/dist/session-keys.d.ts.map +1 -0
- package/dist/session-keys.js +345 -0
- package/dist/session-keys.js.map +1 -0
- package/dist/signers/node-signing-backend.d.ts +11 -0
- package/dist/signers/node-signing-backend.d.ts.map +1 -0
- package/dist/signers/node-signing-backend.js +120 -0
- package/dist/signers/node-signing-backend.js.map +1 -0
- package/dist/signers/ows-adapter.d.ts +70 -0
- package/dist/signers/ows-adapter.d.ts.map +1 -0
- package/dist/signers/ows-adapter.js +53 -0
- package/dist/signers/ows-adapter.js.map +1 -0
- package/dist/signers/ows-signing-backend.d.ts +25 -0
- package/dist/signers/ows-signing-backend.d.ts.map +1 -0
- package/dist/signers/ows-signing-backend.js +192 -0
- package/dist/signers/ows-signing-backend.js.map +1 -0
- package/dist/signers/secure-enclave-backend.d.ts +19 -0
- package/dist/signers/secure-enclave-backend.d.ts.map +1 -0
- package/dist/signers/secure-enclave-backend.js +201 -0
- package/dist/signers/secure-enclave-backend.js.map +1 -0
- package/dist/signers/secure-enclave-types.d.ts +98 -0
- package/dist/signers/secure-enclave-types.d.ts.map +1 -0
- package/dist/signers/secure-enclave-types.js +12 -0
- package/dist/signers/secure-enclave-types.js.map +1 -0
- package/dist/types.d.ts +371 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +85 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eip712.d.ts","sourceRoot":"","sources":["../../src/internal/eip712.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAQpD,yDAAyD;AACzD,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAKlD;AAMD,wBAAgB,UAAU,CACxB,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,CAAC,GAC/D,MAAM,CAUR;AAoBD,wBAAgB,QAAQ,CACtB,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,CAAC,GAC/D,UAAU,CAEZ;AAMD,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,OAAO,EACd,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,CAAC,GAC/D,UAAU,CAkBZ;AAED,wBAAgB,UAAU,CACxB,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,CAAC,GAC/D,UAAU,CAOZ;AAED,wBAAgB,UAAU,CACxB,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,CAAC,GAC/D,UAAU,CAEZ;AAMD,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,UAAU,CA0CxE;AAMD,iEAAiE;AACjE,wBAAgB,eAAe,CAC7B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,SAAS;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,CAY3C;AAMD,kDAAkD;AAClD,wBAAgB,aAAa,CAAC,OAAO,EAAE,gBAAgB,GAAG,UAAU,CAoBnE;AAMD,yDAAyD;AACzD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,CAS5D;AAMD,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE;QAAE,SAAS,IAAI,UAAU,CAAA;KAAE,CAAC;IACrC,UAAU,EAAE,UAAU,EAAE,CAAC;CAC1B;AAED,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,OAAO,GAAG,EAAE,IAAI,qBAAqB,CAO5E"}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EIP-712 typed data hashing and ABI encoding.
|
|
3
|
+
*
|
|
4
|
+
* @remarks
|
|
5
|
+
* Shared implementation used by all signing backends.
|
|
6
|
+
* Implements the EIP-712 `hashStruct` and `hashTypedData` algorithms
|
|
7
|
+
* with support for nested structs and arrays.
|
|
8
|
+
*
|
|
9
|
+
* @internal
|
|
10
|
+
*/
|
|
11
|
+
import { keccak_256 } from '@noble/hashes/sha3';
|
|
12
|
+
import { concatBytes, hexToBytes as nobleHexToBytes } from '@noble/hashes/utils';
|
|
13
|
+
const textEncoder = new TextEncoder();
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
// Hex Helpers
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
/** Strip `0x` prefix and convert hex string to bytes. */
|
|
18
|
+
export function hexToBytes(hex) {
|
|
19
|
+
const clean = hex.startsWith('0x') ? hex.slice(2) : hex;
|
|
20
|
+
if (clean.length === 0)
|
|
21
|
+
return new Uint8Array(0);
|
|
22
|
+
const padded = clean.length % 2 === 1 ? `0${clean}` : clean;
|
|
23
|
+
return nobleHexToBytes(padded);
|
|
24
|
+
}
|
|
25
|
+
// ---------------------------------------------------------------------------
|
|
26
|
+
// EIP-712 Type Encoding
|
|
27
|
+
// ---------------------------------------------------------------------------
|
|
28
|
+
export function encodeType(primaryType, types) {
|
|
29
|
+
const deps = findTypeDependencies(primaryType, types, new Set());
|
|
30
|
+
deps.delete(primaryType);
|
|
31
|
+
const sorted = [primaryType, ...Array.from(deps).sort()];
|
|
32
|
+
return sorted
|
|
33
|
+
.map((t) => `${t}(${(types[t] ?? []).map((f) => `${f.type} ${f.name}`).join(',')})`)
|
|
34
|
+
.join('');
|
|
35
|
+
}
|
|
36
|
+
function findTypeDependencies(typeName, types, found) {
|
|
37
|
+
if (found.has(typeName))
|
|
38
|
+
return found;
|
|
39
|
+
const fields = types[typeName];
|
|
40
|
+
if (!fields)
|
|
41
|
+
return found;
|
|
42
|
+
found.add(typeName);
|
|
43
|
+
for (const field of fields) {
|
|
44
|
+
const baseType = field.type.replace(/\[\]$/, '');
|
|
45
|
+
if (types[baseType]) {
|
|
46
|
+
findTypeDependencies(baseType, types, found);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return found;
|
|
50
|
+
}
|
|
51
|
+
export function typeHash(primaryType, types) {
|
|
52
|
+
return keccak_256(textEncoder.encode(encodeType(primaryType, types)));
|
|
53
|
+
}
|
|
54
|
+
// ---------------------------------------------------------------------------
|
|
55
|
+
// EIP-712 Value / Data Encoding
|
|
56
|
+
// ---------------------------------------------------------------------------
|
|
57
|
+
export function encodeValue(type, value, types) {
|
|
58
|
+
if (types[type]) {
|
|
59
|
+
return keccak_256(encodeData(type, value, types));
|
|
60
|
+
}
|
|
61
|
+
if (type === 'string') {
|
|
62
|
+
return keccak_256(textEncoder.encode(value));
|
|
63
|
+
}
|
|
64
|
+
if (type === 'bytes') {
|
|
65
|
+
return keccak_256(hexToBytes(value));
|
|
66
|
+
}
|
|
67
|
+
if (type.endsWith('[]')) {
|
|
68
|
+
const baseType = type.slice(0, -2);
|
|
69
|
+
const items = value;
|
|
70
|
+
const encoded = items.map((item) => encodeValue(baseType, item, types));
|
|
71
|
+
return keccak_256(concatBytes(...encoded));
|
|
72
|
+
}
|
|
73
|
+
// Atomic types: address, uint*, int*, bool, bytes1-32
|
|
74
|
+
return abiEncodeAtomic(type, value);
|
|
75
|
+
}
|
|
76
|
+
export function encodeData(primaryType, data, types) {
|
|
77
|
+
const hash = typeHash(primaryType, types);
|
|
78
|
+
const fields = types[primaryType] ?? [];
|
|
79
|
+
const values = fields.map((field) => encodeValue(field.type, data[field.name], types));
|
|
80
|
+
return concatBytes(hash, ...values);
|
|
81
|
+
}
|
|
82
|
+
export function hashStruct(primaryType, data, types) {
|
|
83
|
+
return keccak_256(encodeData(primaryType, data, types));
|
|
84
|
+
}
|
|
85
|
+
// ---------------------------------------------------------------------------
|
|
86
|
+
// ABI Encoding
|
|
87
|
+
// ---------------------------------------------------------------------------
|
|
88
|
+
export function abiEncodeAtomic(type, value) {
|
|
89
|
+
const result = new Uint8Array(32);
|
|
90
|
+
if (type === 'address') {
|
|
91
|
+
const addrBytes = hexToBytes(value);
|
|
92
|
+
result.set(addrBytes, 32 - addrBytes.length);
|
|
93
|
+
return result;
|
|
94
|
+
}
|
|
95
|
+
if (type === 'bool') {
|
|
96
|
+
result[31] = value ? 1 : 0;
|
|
97
|
+
return result;
|
|
98
|
+
}
|
|
99
|
+
if (type.startsWith('uint')) {
|
|
100
|
+
const val = BigInt(value);
|
|
101
|
+
const hex = val.toString(16).padStart(64, '0');
|
|
102
|
+
result.set(hexToBytes(`0x${hex}`));
|
|
103
|
+
return result;
|
|
104
|
+
}
|
|
105
|
+
if (type.startsWith('int')) {
|
|
106
|
+
let val = BigInt(value);
|
|
107
|
+
if (val < 0n) {
|
|
108
|
+
val = (1n << 256n) + val; // two's complement
|
|
109
|
+
}
|
|
110
|
+
const hex = val.toString(16).padStart(64, '0');
|
|
111
|
+
result.set(hexToBytes(`0x${hex}`));
|
|
112
|
+
return result;
|
|
113
|
+
}
|
|
114
|
+
if (type.startsWith('bytes')) {
|
|
115
|
+
// bytesN — right-padded
|
|
116
|
+
const data = hexToBytes(value);
|
|
117
|
+
result.set(data);
|
|
118
|
+
return result;
|
|
119
|
+
}
|
|
120
|
+
// Fallback for unknown types — treat as bytes32
|
|
121
|
+
const data = hexToBytes(value);
|
|
122
|
+
result.set(data, 32 - data.length);
|
|
123
|
+
return result;
|
|
124
|
+
}
|
|
125
|
+
// ---------------------------------------------------------------------------
|
|
126
|
+
// EIP-712 Domain Type Inference
|
|
127
|
+
// ---------------------------------------------------------------------------
|
|
128
|
+
/** Infer the EIP712Domain type from the domain object's keys. */
|
|
129
|
+
export function inferDomainType(domain) {
|
|
130
|
+
const fieldDefs = {
|
|
131
|
+
name: 'string',
|
|
132
|
+
version: 'string',
|
|
133
|
+
chainId: 'uint256',
|
|
134
|
+
verifyingContract: 'address',
|
|
135
|
+
salt: 'bytes32',
|
|
136
|
+
};
|
|
137
|
+
const order = ['name', 'version', 'chainId', 'verifyingContract', 'salt'];
|
|
138
|
+
return order
|
|
139
|
+
.filter((key) => domain[key] !== undefined)
|
|
140
|
+
.map((key) => ({ name: key, type: fieldDefs[key] }));
|
|
141
|
+
}
|
|
142
|
+
// ---------------------------------------------------------------------------
|
|
143
|
+
// EIP-712 Top-Level Hash
|
|
144
|
+
// ---------------------------------------------------------------------------
|
|
145
|
+
/** Hash a complete EIP-712 typed data payload. */
|
|
146
|
+
export function hashTypedData(payload) {
|
|
147
|
+
const domainSep = hashStruct('EIP712Domain', payload.domain, {
|
|
148
|
+
...payload.types,
|
|
149
|
+
EIP712Domain: inferDomainType(payload.domain),
|
|
150
|
+
});
|
|
151
|
+
const structHash = hashStruct(payload.primaryType, payload.message, payload.types);
|
|
152
|
+
const combined = new Uint8Array(2 + 32 + 32);
|
|
153
|
+
combined[0] = 0x19;
|
|
154
|
+
combined[1] = 0x01;
|
|
155
|
+
combined.set(domainSep, 2);
|
|
156
|
+
combined.set(structHash, 34);
|
|
157
|
+
return keccak_256(combined);
|
|
158
|
+
}
|
|
159
|
+
// ---------------------------------------------------------------------------
|
|
160
|
+
// EIP-191 Personal Sign
|
|
161
|
+
// ---------------------------------------------------------------------------
|
|
162
|
+
/** Hash a message per EIP-191 personal sign standard. */
|
|
163
|
+
export function personalSignHash(message) {
|
|
164
|
+
const msgBytes = hexToBytes(message);
|
|
165
|
+
const prefix = textEncoder.encode(`\x19Ethereum Signed Message:\n${msgBytes.length}`);
|
|
166
|
+
const combined = new Uint8Array(prefix.length + msgBytes.length);
|
|
167
|
+
combined.set(prefix);
|
|
168
|
+
combined.set(msgBytes, prefix.length);
|
|
169
|
+
return keccak_256(combined);
|
|
170
|
+
}
|
|
171
|
+
export function isSolanaTransaction(tx) {
|
|
172
|
+
if (typeof tx !== 'object' || tx === null)
|
|
173
|
+
return false;
|
|
174
|
+
const obj = tx;
|
|
175
|
+
if (typeof obj.message !== 'object' || obj.message === null)
|
|
176
|
+
return false;
|
|
177
|
+
const msg = obj.message;
|
|
178
|
+
if (typeof msg.serialize !== 'function')
|
|
179
|
+
return false;
|
|
180
|
+
return Array.isArray(obj.signatures);
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=eip712.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eip712.js","sourceRoot":"","sources":["../../src/internal/eip712.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { SpendPersistence } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Create a file-based spend persistence adapter.
|
|
4
|
+
*
|
|
5
|
+
* @param dir - Directory to store session spend files. Defaults to `~/.prism/sessions/`.
|
|
6
|
+
* @returns A {@link SpendPersistence} backed by the filesystem.
|
|
7
|
+
*/
|
|
8
|
+
export declare function createFileSpendPersistence(dir?: string): SpendPersistence;
|
|
9
|
+
//# sourceMappingURL=file-spend-persistence.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-spend-persistence.d.ts","sourceRoot":"","sources":["../../src/internal/file-spend-persistence.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAIpD;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAoCzE"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File-based spend persistence for Node.js environments.
|
|
3
|
+
*
|
|
4
|
+
* @remarks
|
|
5
|
+
* Stores session key cumulative spend as JSON files at
|
|
6
|
+
* `~/.prism/sessions/{sessionId}.json`. Uses atomic writes
|
|
7
|
+
* (write-to-temp + rename) to prevent corruption.
|
|
8
|
+
*
|
|
9
|
+
* @packageDocumentation
|
|
10
|
+
*/
|
|
11
|
+
import { writeFile, readFile, mkdir, rename } from 'node:fs/promises';
|
|
12
|
+
import { join } from 'node:path';
|
|
13
|
+
import { homedir } from 'node:os';
|
|
14
|
+
import { randomBytes } from '@noble/hashes/utils';
|
|
15
|
+
import { bytesToHex } from '@noble/hashes/utils';
|
|
16
|
+
const DEFAULT_DIR = join(homedir(), '.prism', 'sessions');
|
|
17
|
+
/**
|
|
18
|
+
* Create a file-based spend persistence adapter.
|
|
19
|
+
*
|
|
20
|
+
* @param dir - Directory to store session spend files. Defaults to `~/.prism/sessions/`.
|
|
21
|
+
* @returns A {@link SpendPersistence} backed by the filesystem.
|
|
22
|
+
*/
|
|
23
|
+
export function createFileSpendPersistence(dir) {
|
|
24
|
+
const baseDir = dir ?? DEFAULT_DIR;
|
|
25
|
+
let dirCreated = false;
|
|
26
|
+
async function ensureDir() {
|
|
27
|
+
if (dirCreated)
|
|
28
|
+
return;
|
|
29
|
+
await mkdir(baseDir, { recursive: true });
|
|
30
|
+
dirCreated = true;
|
|
31
|
+
}
|
|
32
|
+
function filePath(sessionId) {
|
|
33
|
+
// Sanitize sessionId to prevent path traversal
|
|
34
|
+
const safe = sessionId.replace(/[^a-fA-F0-9]/g, '');
|
|
35
|
+
return join(baseDir, `${safe}.json`);
|
|
36
|
+
}
|
|
37
|
+
return {
|
|
38
|
+
async load(sessionId) {
|
|
39
|
+
try {
|
|
40
|
+
const data = await readFile(filePath(sessionId), 'utf-8');
|
|
41
|
+
const parsed = JSON.parse(data);
|
|
42
|
+
return BigInt(parsed.totalSpent);
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return 0n;
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
async save(sessionId, amount) {
|
|
49
|
+
await ensureDir();
|
|
50
|
+
const target = filePath(sessionId);
|
|
51
|
+
const tmp = `${target}.${bytesToHex(randomBytes(4))}.tmp`;
|
|
52
|
+
const data = JSON.stringify({ totalSpent: String(amount) });
|
|
53
|
+
await writeFile(tmp, data, 'utf-8');
|
|
54
|
+
await rename(tmp, target);
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=file-spend-persistence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-spend-persistence.js","sourceRoot":"","sources":["../../src/internal/file-spend-persistence.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAGjD,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;AAE1D;;;;;GAKG;AACH,MAAM,UAAU,0BAA0B,CAAC,GAAY;IACrD,MAAM,OAAO,GAAG,GAAG,IAAI,WAAW,CAAC;IACnC,IAAI,UAAU,GAAG,KAAK,CAAC;IAEvB,KAAK,UAAU,SAAS;QACtB,IAAI,UAAU;YAAE,OAAO;QACvB,MAAM,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1C,UAAU,GAAG,IAAI,CAAC;IACpB,CAAC;IAED,SAAS,QAAQ,CAAC,SAAiB;QACjC,+CAA+C;QAC/C,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;QACpD,OAAO,IAAI,CAAC,OAAO,EAAE,GAAG,IAAI,OAAO,CAAC,CAAC;IACvC,CAAC;IAED,OAAO;QACL,KAAK,CAAC,IAAI,CAAC,SAAiB;YAC1B,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,CAAC;gBAC1D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAA2B,CAAC;gBAC1D,OAAO,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YACnC,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,EAAE,CAAC;YACZ,CAAC;QACH,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,SAAiB,EAAE,MAAc;YAC1C,MAAM,SAAS,EAAE,CAAC;YAClB,MAAM,MAAM,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;YACnC,MAAM,GAAG,GAAG,GAAG,MAAM,IAAI,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;YAC1D,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC5D,MAAM,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;YACpC,MAAM,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAC5B,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OneBalance API client interface and types.
|
|
3
|
+
*
|
|
4
|
+
* @remarks
|
|
5
|
+
* Defines the contract for interacting with the OneBalance REST API (v3).
|
|
6
|
+
* The {@link OneBalanceClient} interface is injectable — production code uses
|
|
7
|
+
* {@link createOneBalanceHttpClient}, tests use mocks.
|
|
8
|
+
*
|
|
9
|
+
* @internal
|
|
10
|
+
*/
|
|
11
|
+
import type { Address } from '../result.js';
|
|
12
|
+
import type { PredictAddressRequest, PredictAddressResponse, QuoteRequest, QuoteResponse, ExecutionStatusResponse, MultiAccount } from './onebalance-types.js';
|
|
13
|
+
/** Account initialization parameters. */
|
|
14
|
+
export interface InitAccountParams {
|
|
15
|
+
readonly signerAddress: Address;
|
|
16
|
+
readonly accountType: AccountType;
|
|
17
|
+
}
|
|
18
|
+
/** Supported OneBalance smart account type. ERC-4337 counterfactual accounts. */
|
|
19
|
+
export type AccountType = 'kernel-v3.1-ecdsa';
|
|
20
|
+
/** Initialized OneBalance account. */
|
|
21
|
+
export interface OneBalanceAccount {
|
|
22
|
+
readonly evmAddress: Address;
|
|
23
|
+
readonly accountType: AccountType;
|
|
24
|
+
readonly status: 'counterfactual' | 'deployed';
|
|
25
|
+
}
|
|
26
|
+
/** Balance response from OneBalance aggregation. */
|
|
27
|
+
export interface AggregatedBalance {
|
|
28
|
+
readonly totalUsd: string;
|
|
29
|
+
readonly breakdown: readonly ChainBalanceEntry[];
|
|
30
|
+
}
|
|
31
|
+
/** Per-chain balance entry from OneBalance. */
|
|
32
|
+
export interface ChainBalanceEntry {
|
|
33
|
+
readonly chainId: string;
|
|
34
|
+
readonly assetType: string;
|
|
35
|
+
readonly amount: string;
|
|
36
|
+
readonly fiatValue: string;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Client for the OneBalance API.
|
|
40
|
+
*
|
|
41
|
+
* @remarks
|
|
42
|
+
* Implementations: {@link createOneBalanceHttpClient} for production,
|
|
43
|
+
* mock from test-utils for testing.
|
|
44
|
+
*
|
|
45
|
+
* @internal
|
|
46
|
+
*/
|
|
47
|
+
export interface OneBalanceClient {
|
|
48
|
+
/** Predict the counterfactual smart account address for a signer. */
|
|
49
|
+
predictAddress(params: PredictAddressRequest): Promise<PredictAddressResponse>;
|
|
50
|
+
/** Get a quote for a cross-chain swap or transfer. */
|
|
51
|
+
getQuote(params: QuoteRequest): Promise<QuoteResponse>;
|
|
52
|
+
/** Execute a signed quote. Send back the full quote with signatures populated. */
|
|
53
|
+
executeQuote(signedQuote: QuoteResponse): Promise<void>;
|
|
54
|
+
/** Poll execution status for a submitted quote. */
|
|
55
|
+
getExecutionStatus(quoteId: string): Promise<ExecutionStatusResponse>;
|
|
56
|
+
/** Get aggregated balance across all chains. */
|
|
57
|
+
getAggregatedBalance(accounts: readonly MultiAccount[]): Promise<AggregatedBalance>;
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=onebalance-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"onebalance-client.d.ts","sourceRoot":"","sources":["../../src/internal/onebalance-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EACV,qBAAqB,EACrB,sBAAsB,EACtB,YAAY,EACZ,aAAa,EACb,uBAAuB,EACvB,YAAY,EACb,MAAM,uBAAuB,CAAC;AAM/B,yCAAyC;AACzC,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;CACnC;AAED,iFAAiF;AACjF,MAAM,MAAM,WAAW,GAAG,mBAAmB,CAAC;AAE9C,sCAAsC;AACtC,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC,QAAQ,CAAC,MAAM,EAAE,gBAAgB,GAAG,UAAU,CAAC;CAChD;AAED,oDAAoD;AACpD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,SAAS,iBAAiB,EAAE,CAAC;CAClD;AAED,+CAA+C;AAC/C,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAMD;;;;;;;;GAQG;AACH,MAAM,WAAW,gBAAgB;IAC/B,qEAAqE;IACrE,cAAc,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAE/E,sDAAsD;IACtD,QAAQ,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IAEvD,kFAAkF;IAClF,YAAY,CAAC,WAAW,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAExD,mDAAmD;IACnD,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAAC;IAEtE,gDAAgD;IAChD,oBAAoB,CAAC,QAAQ,EAAE,SAAS,YAAY,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;CACrF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"onebalance-client.js","sourceRoot":"","sources":["../../src/internal/onebalance-client.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { OneBalanceClient } from './onebalance-client.js';
|
|
2
|
+
export interface OneBalanceHttpConfig {
|
|
3
|
+
readonly apiKey: string;
|
|
4
|
+
readonly baseUrl?: string;
|
|
5
|
+
readonly timeoutMs?: number;
|
|
6
|
+
/** Maximum number of retries for transient errors. Defaults to 3. */
|
|
7
|
+
readonly maxRetries?: number;
|
|
8
|
+
/** Base delay for exponential backoff in ms. Defaults to 1000. */
|
|
9
|
+
readonly baseDelayMs?: number;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Create a production OneBalance HTTP client.
|
|
13
|
+
*
|
|
14
|
+
* @param config - API key and optional base URL / timeout overrides.
|
|
15
|
+
* @returns An {@link OneBalanceClient} backed by HTTP fetch calls.
|
|
16
|
+
*/
|
|
17
|
+
export declare function createOneBalanceHttpClient(config: OneBalanceHttpConfig): OneBalanceClient;
|
|
18
|
+
/** HTTP-level error from OneBalance API. Caught by fromPromise at call sites. */
|
|
19
|
+
export declare class OneBalanceHttpError extends Error {
|
|
20
|
+
readonly statusCode: number;
|
|
21
|
+
readonly body: string;
|
|
22
|
+
readonly path: string;
|
|
23
|
+
constructor(statusCode: number, body: string, path: string);
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=onebalance-http-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"onebalance-http-client.d.ts","sourceRoot":"","sources":["../../src/internal/onebalance-http-client.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EACV,gBAAgB,EAEjB,MAAM,wBAAwB,CAAC;AAWhC,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,qEAAqE;IACrE,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,kEAAkE;IAClE,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAMD;;;;;GAKG;AACH,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,oBAAoB,GAC3B,gBAAgB,CAyHlB;AAMD,iFAAiF;AACjF,qBAAa,mBAAoB,SAAQ,KAAK;IAE1C,QAAQ,CAAC,UAAU,EAAE,MAAM;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM;gBAFZ,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM;CAKxB"}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// Configuration
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
4
|
+
const DEFAULT_BASE_URL = 'https://be.onebalance.io/api';
|
|
5
|
+
const DEFAULT_TIMEOUT_MS = 30_000;
|
|
6
|
+
const DEFAULT_MAX_RETRIES = 3;
|
|
7
|
+
const DEFAULT_BASE_DELAY_MS = 1_000;
|
|
8
|
+
// ---------------------------------------------------------------------------
|
|
9
|
+
// HTTP Client Factory
|
|
10
|
+
// ---------------------------------------------------------------------------
|
|
11
|
+
/**
|
|
12
|
+
* Create a production OneBalance HTTP client.
|
|
13
|
+
*
|
|
14
|
+
* @param config - API key and optional base URL / timeout overrides.
|
|
15
|
+
* @returns An {@link OneBalanceClient} backed by HTTP fetch calls.
|
|
16
|
+
*/
|
|
17
|
+
export function createOneBalanceHttpClient(config) {
|
|
18
|
+
const baseUrl = config.baseUrl ?? DEFAULT_BASE_URL;
|
|
19
|
+
const timeoutMs = config.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
20
|
+
const maxRetries = config.maxRetries ?? DEFAULT_MAX_RETRIES;
|
|
21
|
+
const baseDelayMs = config.baseDelayMs ?? DEFAULT_BASE_DELAY_MS;
|
|
22
|
+
async function singleRequest(method, path, body) {
|
|
23
|
+
const url = `${baseUrl}${path}`;
|
|
24
|
+
const controller = new AbortController();
|
|
25
|
+
const timer = setTimeout(() => controller.abort(), timeoutMs);
|
|
26
|
+
try {
|
|
27
|
+
const init = {
|
|
28
|
+
method,
|
|
29
|
+
headers: {
|
|
30
|
+
'Content-Type': 'application/json',
|
|
31
|
+
'x-api-key': config.apiKey,
|
|
32
|
+
},
|
|
33
|
+
signal: controller.signal,
|
|
34
|
+
};
|
|
35
|
+
if (body !== undefined) {
|
|
36
|
+
init.body = JSON.stringify(body);
|
|
37
|
+
}
|
|
38
|
+
const response = await fetch(url, init);
|
|
39
|
+
if (!response.ok) {
|
|
40
|
+
const text = await response.text().catch(() => '');
|
|
41
|
+
throw new OneBalanceHttpError(response.status, text, path);
|
|
42
|
+
}
|
|
43
|
+
// Some endpoints return empty 200
|
|
44
|
+
const text = await response.text();
|
|
45
|
+
if (text.length === 0)
|
|
46
|
+
return undefined;
|
|
47
|
+
return JSON.parse(text);
|
|
48
|
+
}
|
|
49
|
+
finally {
|
|
50
|
+
clearTimeout(timer);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
async function request(method, path, body) {
|
|
54
|
+
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
55
|
+
try {
|
|
56
|
+
return await singleRequest(method, path, body);
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
if (!isRetryableHttpError(error) || attempt === maxRetries) {
|
|
60
|
+
throw error;
|
|
61
|
+
}
|
|
62
|
+
// Exponential backoff with jitter: baseDelay * 2^attempt + random(0-500ms)
|
|
63
|
+
const delay = baseDelayMs * Math.pow(2, attempt) + Math.random() * 500;
|
|
64
|
+
await sleep(delay);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
// Unreachable — loop always returns or throws
|
|
68
|
+
throw new Error('Retry loop exhausted');
|
|
69
|
+
}
|
|
70
|
+
const client = {
|
|
71
|
+
async predictAddress(params) {
|
|
72
|
+
return request('POST', '/account/predict-address', params);
|
|
73
|
+
},
|
|
74
|
+
async getQuote(params) {
|
|
75
|
+
return request('POST', '/v3/quote', params);
|
|
76
|
+
},
|
|
77
|
+
async executeQuote(signedQuote) {
|
|
78
|
+
await request('POST', '/v3/quote/execute-quote', signedQuote);
|
|
79
|
+
},
|
|
80
|
+
async getExecutionStatus(quoteId) {
|
|
81
|
+
return request('GET', `/v3/status/get-execution-status?quoteId=${encodeURIComponent(quoteId)}`);
|
|
82
|
+
},
|
|
83
|
+
async getAggregatedBalance(accounts) {
|
|
84
|
+
const caip10Accounts = accounts.map(toCaip10Account).filter(Boolean);
|
|
85
|
+
if (caip10Accounts.length === 0) {
|
|
86
|
+
return { totalUsd: '0', breakdown: [] };
|
|
87
|
+
}
|
|
88
|
+
const params = new URLSearchParams({
|
|
89
|
+
account: caip10Accounts.join(','),
|
|
90
|
+
aggregatedAssetId: DEFAULT_BALANCE_ASSETS,
|
|
91
|
+
});
|
|
92
|
+
const raw = await request('GET', `/v3/balances/aggregated-balance?${params.toString()}`);
|
|
93
|
+
return {
|
|
94
|
+
totalUsd: String(raw.totalBalance.fiatValue),
|
|
95
|
+
breakdown: raw.balanceByAggregatedAsset.flatMap((agg) => agg.individualAssetBalances.map((entry) => ({
|
|
96
|
+
chainId: entry.assetType,
|
|
97
|
+
assetType: entry.assetType,
|
|
98
|
+
amount: entry.balance,
|
|
99
|
+
fiatValue: String(entry.fiatValue),
|
|
100
|
+
}))),
|
|
101
|
+
};
|
|
102
|
+
},
|
|
103
|
+
};
|
|
104
|
+
return client;
|
|
105
|
+
}
|
|
106
|
+
// ---------------------------------------------------------------------------
|
|
107
|
+
// Error Type
|
|
108
|
+
// ---------------------------------------------------------------------------
|
|
109
|
+
/** HTTP-level error from OneBalance API. Caught by fromPromise at call sites. */
|
|
110
|
+
export class OneBalanceHttpError extends Error {
|
|
111
|
+
statusCode;
|
|
112
|
+
body;
|
|
113
|
+
path;
|
|
114
|
+
constructor(statusCode, body, path) {
|
|
115
|
+
super(`OneBalance API error ${statusCode} on ${path}: ${body}`);
|
|
116
|
+
this.statusCode = statusCode;
|
|
117
|
+
this.body = body;
|
|
118
|
+
this.path = path;
|
|
119
|
+
this.name = 'OneBalanceHttpError';
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
// ---------------------------------------------------------------------------
|
|
123
|
+
// Balance Helpers
|
|
124
|
+
// ---------------------------------------------------------------------------
|
|
125
|
+
/** Default aggregated assets to query for balance. */
|
|
126
|
+
const DEFAULT_BALANCE_ASSETS = 'ob:usdc,ob:eth';
|
|
127
|
+
// ---------------------------------------------------------------------------
|
|
128
|
+
// Retry Helpers
|
|
129
|
+
// ---------------------------------------------------------------------------
|
|
130
|
+
/**
|
|
131
|
+
* Determine if an HTTP error is retryable.
|
|
132
|
+
* Retries on: timeout/abort, network errors, and 5xx server errors.
|
|
133
|
+
* Does NOT retry on 4xx client errors (bad request, auth, validation).
|
|
134
|
+
*/
|
|
135
|
+
function isRetryableHttpError(error) {
|
|
136
|
+
// AbortError = timeout
|
|
137
|
+
if (error instanceof DOMException && error.name === 'AbortError')
|
|
138
|
+
return true;
|
|
139
|
+
// Network errors (no response)
|
|
140
|
+
if (error instanceof TypeError)
|
|
141
|
+
return true;
|
|
142
|
+
// 5xx server errors
|
|
143
|
+
if (error instanceof OneBalanceHttpError && error.statusCode >= 500)
|
|
144
|
+
return true;
|
|
145
|
+
return false;
|
|
146
|
+
}
|
|
147
|
+
function sleep(ms) {
|
|
148
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Convert a MultiAccount to a CAIP-10 account identifier for the balance API.
|
|
152
|
+
* Returns the identifier string, or empty string for unsupported types.
|
|
153
|
+
*/
|
|
154
|
+
function toCaip10Account(account) {
|
|
155
|
+
if (account.type === 'solana') {
|
|
156
|
+
return `solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp:${account.accountAddress}`;
|
|
157
|
+
}
|
|
158
|
+
// EVM accounts: use a default chain (Base) for CAIP-10 format
|
|
159
|
+
return `eip155:8453:${account.accountAddress}`;
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=onebalance-http-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"onebalance-http-client.js","sourceRoot":"","sources":["../../src/internal/onebalance-http-client.ts"],"names":[],"mappings":"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"}
|