@aboutcircles/sdk-rpc 0.1.5 → 0.1.6
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/dist/errors.d.ts +1 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +1 -1
- package/dist/index.js +2 -2658
- package/dist/methods/balance.js +1 -1
- package/dist/methods/pathfinder.d.ts.map +1 -1
- package/dist/methods/pathfinder.js +2 -2
- package/dist/methods/transaction.js +1 -1
- package/dist/rpc.d.ts +23 -10
- package/dist/rpc.d.ts.map +1 -1
- package/dist/rpc.js +73 -20
- package/dist/utils.js +1 -1
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -1,2658 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
function isCirclesEvent(obj) {
|
|
3
|
-
return obj && typeof obj === "object" && typeof obj.$event === "string" && typeof obj.blockNumber === "number" && typeof obj.transactionIndex === "number" && typeof obj.logIndex === "number";
|
|
4
|
-
}
|
|
5
|
-
// src/events/parser.ts
|
|
6
|
-
var hexToBigInt = (hex) => BigInt(hex);
|
|
7
|
-
var hexToNumber = (hex) => parseInt(hex, 16);
|
|
8
|
-
var hexToUint8Array = (hex) => {
|
|
9
|
-
if (hex.startsWith("0x")) {
|
|
10
|
-
hex = hex.slice(2);
|
|
11
|
-
}
|
|
12
|
-
if (hex.length % 2 !== 0) {
|
|
13
|
-
throw new Error("Invalid hex string");
|
|
14
|
-
}
|
|
15
|
-
const array = new Uint8Array(hex.length / 2);
|
|
16
|
-
for (let i = 0;i < hex.length; i += 2) {
|
|
17
|
-
array[i / 2] = parseInt(hex.substr(i, 2), 16);
|
|
18
|
-
}
|
|
19
|
-
return array;
|
|
20
|
-
};
|
|
21
|
-
function parseValue(key, value) {
|
|
22
|
-
if (typeof value === "string" && value.startsWith("0x")) {
|
|
23
|
-
const hex = value.slice(2);
|
|
24
|
-
if (hex.length === 40) {
|
|
25
|
-
return value;
|
|
26
|
-
}
|
|
27
|
-
if (hex.length === 64) {
|
|
28
|
-
if (key.toLowerCase().includes("digest") || key.toLowerCase().includes("data") || key.toLowerCase().includes("bytes")) {
|
|
29
|
-
return hexToUint8Array(value);
|
|
30
|
-
}
|
|
31
|
-
try {
|
|
32
|
-
return hexToBigInt(value);
|
|
33
|
-
} catch {
|
|
34
|
-
return value;
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
try {
|
|
38
|
-
const num = hexToNumber(value);
|
|
39
|
-
if (num < Number.MAX_SAFE_INTEGER) {
|
|
40
|
-
return num;
|
|
41
|
-
}
|
|
42
|
-
return hexToBigInt(value);
|
|
43
|
-
} catch {
|
|
44
|
-
return value;
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
if (value === "true")
|
|
48
|
-
return true;
|
|
49
|
-
if (value === "false")
|
|
50
|
-
return false;
|
|
51
|
-
return value;
|
|
52
|
-
}
|
|
53
|
-
function parseRpcEvent(rpcEvent) {
|
|
54
|
-
const { event, values } = rpcEvent;
|
|
55
|
-
const circlesEvent = {
|
|
56
|
-
$event: event,
|
|
57
|
-
blockNumber: values.blockNumber ? hexToNumber(values.blockNumber) : 0,
|
|
58
|
-
timestamp: values.timestamp ? hexToNumber(values.timestamp) : undefined,
|
|
59
|
-
transactionIndex: values.transactionIndex ? hexToNumber(values.transactionIndex) : 0,
|
|
60
|
-
logIndex: values.logIndex ? hexToNumber(values.logIndex) : 0,
|
|
61
|
-
transactionHash: values.transactionHash
|
|
62
|
-
};
|
|
63
|
-
for (const [key, value] of Object.entries(values)) {
|
|
64
|
-
if (["blockNumber", "timestamp", "transactionIndex", "logIndex", "transactionHash"].includes(key)) {
|
|
65
|
-
continue;
|
|
66
|
-
}
|
|
67
|
-
circlesEvent[key] = parseValue(key, value);
|
|
68
|
-
}
|
|
69
|
-
return circlesEvent;
|
|
70
|
-
}
|
|
71
|
-
function parseRpcSubscriptionMessage(message) {
|
|
72
|
-
return message.map(parseRpcEvent);
|
|
73
|
-
}
|
|
74
|
-
// src/events/observable.ts
|
|
75
|
-
class Observable {
|
|
76
|
-
_subscribers = [];
|
|
77
|
-
subscribe(subscriber) {
|
|
78
|
-
this._subscribers.push(subscriber);
|
|
79
|
-
return () => {
|
|
80
|
-
const index = this._subscribers.indexOf(subscriber);
|
|
81
|
-
if (index > -1) {
|
|
82
|
-
this._subscribers.splice(index, 1);
|
|
83
|
-
}
|
|
84
|
-
};
|
|
85
|
-
}
|
|
86
|
-
constructor() {
|
|
87
|
-
this._subscribers = [];
|
|
88
|
-
}
|
|
89
|
-
emit(value) {
|
|
90
|
-
this._subscribers.forEach((sub) => sub(value));
|
|
91
|
-
}
|
|
92
|
-
static create() {
|
|
93
|
-
const observable = new Observable;
|
|
94
|
-
return {
|
|
95
|
-
property: observable,
|
|
96
|
-
emit: (e) => observable.emit(e)
|
|
97
|
-
};
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
// ../utils/dist/index.js
|
|
101
|
-
class CirclesConverter {
|
|
102
|
-
static ONE_64 = 1n << 64n;
|
|
103
|
-
static GAMMA_64 = 18443079296116538654n;
|
|
104
|
-
static BETA_64 = 18450409579521241655n;
|
|
105
|
-
static SECONDS_PER_DAY = 86400n;
|
|
106
|
-
static INFLATION_DAY_ZERO_UNIX = 1602720000n;
|
|
107
|
-
static ATTO_FACTOR = 1000000000000000000n;
|
|
108
|
-
static FACTOR_1E12 = 1000000000000n;
|
|
109
|
-
static V1_ACCURACY = 100000000n;
|
|
110
|
-
static V1_INFLATION_PCT_NUM = 107n;
|
|
111
|
-
static V1_INFLATION_PCT_DEN = 100n;
|
|
112
|
-
static PERIOD_SEC = 31556952n;
|
|
113
|
-
static mul64(a, b) {
|
|
114
|
-
return a * b >> 64n;
|
|
115
|
-
}
|
|
116
|
-
static mulU(factor64x64, value) {
|
|
117
|
-
return factor64x64 * value >> 64n;
|
|
118
|
-
}
|
|
119
|
-
static pow64(base64x64, exp) {
|
|
120
|
-
let base = base64x64;
|
|
121
|
-
let exponent = exp;
|
|
122
|
-
let result = this.ONE_64;
|
|
123
|
-
while (exponent > 0n) {
|
|
124
|
-
if ((exponent & 1n) === 1n) {
|
|
125
|
-
result = this.mul64(result, base);
|
|
126
|
-
}
|
|
127
|
-
base = this.mul64(base, base);
|
|
128
|
-
exponent >>= 1n;
|
|
129
|
-
}
|
|
130
|
-
return result;
|
|
131
|
-
}
|
|
132
|
-
static ONE_36 = 1000000000000000000000000000000000000000n;
|
|
133
|
-
static GAMMA_36 = 999801332008598957430613406568191166n;
|
|
134
|
-
static BETA_36 = 1000198707468214629156271489013303962n;
|
|
135
|
-
static mul36(a, b) {
|
|
136
|
-
return a * b / this.ONE_36;
|
|
137
|
-
}
|
|
138
|
-
static pow36(base36, exp) {
|
|
139
|
-
let result = this.ONE_36;
|
|
140
|
-
let base = base36;
|
|
141
|
-
let e = exp;
|
|
142
|
-
while (e > 0n) {
|
|
143
|
-
const isOdd = (e & 1n) === 1n;
|
|
144
|
-
if (isOdd) {
|
|
145
|
-
result = this.mul36(result, base);
|
|
146
|
-
}
|
|
147
|
-
base = this.mul36(base, base);
|
|
148
|
-
e >>= 1n;
|
|
149
|
-
}
|
|
150
|
-
return result;
|
|
151
|
-
}
|
|
152
|
-
static attoCirclesToCircles(atto) {
|
|
153
|
-
if (atto === 0n)
|
|
154
|
-
return 0;
|
|
155
|
-
const whole = atto / this.ATTO_FACTOR;
|
|
156
|
-
const frac = atto % this.ATTO_FACTOR;
|
|
157
|
-
const MAX_SAFE_INT = BigInt(Number.MAX_SAFE_INTEGER);
|
|
158
|
-
if (whole > MAX_SAFE_INT || whole < -MAX_SAFE_INT) {
|
|
159
|
-
throw new RangeError("Atto value’s integer component exceeds JS double precision.");
|
|
160
|
-
}
|
|
161
|
-
return Number(whole) + Number(frac) / Number(this.ATTO_FACTOR);
|
|
162
|
-
}
|
|
163
|
-
static circlesToAttoCircles(circles) {
|
|
164
|
-
return BigInt(Math.trunc(circles * Number(this.ATTO_FACTOR)));
|
|
165
|
-
}
|
|
166
|
-
static inflationaryToDemurrage(inflationary, day) {
|
|
167
|
-
return this.mulU(this.pow64(this.GAMMA_64, day), inflationary);
|
|
168
|
-
}
|
|
169
|
-
static demurrageToInflationary(demurraged, day) {
|
|
170
|
-
return this.mulU(this.pow64(this.BETA_64, day), demurraged);
|
|
171
|
-
}
|
|
172
|
-
static dayFromTimestamp(unixSeconds) {
|
|
173
|
-
return (unixSeconds - this.INFLATION_DAY_ZERO_UNIX) / this.SECONDS_PER_DAY;
|
|
174
|
-
}
|
|
175
|
-
static attoCirclesToAttoStaticCircles(demurraged, nowUnixSeconds = BigInt(Math.floor(Date.now() / 1000))) {
|
|
176
|
-
return this.demurrageToInflationary(demurraged, this.dayFromTimestamp(nowUnixSeconds));
|
|
177
|
-
}
|
|
178
|
-
static attoStaticCirclesToAttoCircles(staticCircles, nowUnixSeconds = BigInt(Math.floor(Date.now() / 1000))) {
|
|
179
|
-
return this.inflationaryToDemurrage(staticCircles, this.dayFromTimestamp(nowUnixSeconds));
|
|
180
|
-
}
|
|
181
|
-
static inflationaryToDemurrageExact(inflationary, day) {
|
|
182
|
-
const factor = this.pow36(this.GAMMA_36, day);
|
|
183
|
-
return inflationary * factor / this.ONE_36;
|
|
184
|
-
}
|
|
185
|
-
static demurrageToInflationaryExact(demurraged, day) {
|
|
186
|
-
const factor = this.pow36(this.BETA_36, day);
|
|
187
|
-
return demurraged * factor / this.ONE_36;
|
|
188
|
-
}
|
|
189
|
-
static attoCirclesToAttoStaticCirclesExact(demurraged, nowUnixSeconds = BigInt(Math.floor(Date.now() / 1000))) {
|
|
190
|
-
const day = this.dayFromTimestamp(nowUnixSeconds);
|
|
191
|
-
return this.demurrageToInflationaryExact(demurraged, day);
|
|
192
|
-
}
|
|
193
|
-
static attoStaticCirclesToAttoCirclesExact(staticCircles, nowUnixSeconds = BigInt(Math.floor(Date.now() / 1000))) {
|
|
194
|
-
const day = this.dayFromTimestamp(nowUnixSeconds);
|
|
195
|
-
return this.inflationaryToDemurrageExact(staticCircles, day);
|
|
196
|
-
}
|
|
197
|
-
static truncateToInt64(wei) {
|
|
198
|
-
const truncated = wei / this.FACTOR_1E12;
|
|
199
|
-
const MAX_INT64 = 9223372036854775807n;
|
|
200
|
-
return truncated > MAX_INT64 ? MAX_INT64 : truncated;
|
|
201
|
-
}
|
|
202
|
-
static blowUpToBigInt(sixDecimals) {
|
|
203
|
-
return sixDecimals * this.FACTOR_1E12;
|
|
204
|
-
}
|
|
205
|
-
static truncateToSixDecimals(wei) {
|
|
206
|
-
return this.blowUpToBigInt(this.truncateToInt64(wei));
|
|
207
|
-
}
|
|
208
|
-
static v1InflateFactor(periodIdx) {
|
|
209
|
-
if (periodIdx === 0n)
|
|
210
|
-
return this.V1_ACCURACY;
|
|
211
|
-
return this.V1_ACCURACY * this.V1_INFLATION_PCT_NUM ** periodIdx / this.V1_INFLATION_PCT_DEN ** periodIdx;
|
|
212
|
-
}
|
|
213
|
-
static attoCrcToAttoCircles(v1Amount, blockTimestampUtc) {
|
|
214
|
-
const secondsSinceEpoch = blockTimestampUtc - this.INFLATION_DAY_ZERO_UNIX;
|
|
215
|
-
const periodIdx = secondsSinceEpoch / this.PERIOD_SEC;
|
|
216
|
-
const secondsIntoPeriod = secondsSinceEpoch % this.PERIOD_SEC;
|
|
217
|
-
const factorCur = this.v1InflateFactor(periodIdx);
|
|
218
|
-
const factorNext = this.v1InflateFactor(periodIdx + 1n);
|
|
219
|
-
return this.v1ToDemurrage(v1Amount, factorCur, factorNext, secondsIntoPeriod, this.PERIOD_SEC);
|
|
220
|
-
}
|
|
221
|
-
static attoCirclesToAttoCrc(demurraged, blockTimestampUtc) {
|
|
222
|
-
const secondsSinceEpoch = blockTimestampUtc - this.INFLATION_DAY_ZERO_UNIX;
|
|
223
|
-
const periodIdx = secondsSinceEpoch / this.PERIOD_SEC;
|
|
224
|
-
const secondsIntoPeriod = secondsSinceEpoch % this.PERIOD_SEC;
|
|
225
|
-
const factorCur = this.v1InflateFactor(periodIdx);
|
|
226
|
-
const factorNext = this.v1InflateFactor(periodIdx + 1n);
|
|
227
|
-
const rP = factorCur * (this.PERIOD_SEC - secondsIntoPeriod) + factorNext * secondsIntoPeriod;
|
|
228
|
-
return demurraged * 3n * this.V1_ACCURACY * this.PERIOD_SEC / rP;
|
|
229
|
-
}
|
|
230
|
-
static v1ToDemurrage(v1Amount, factorCur, factorNext, secondsInto, periodSec) {
|
|
231
|
-
const rP = factorCur * (periodSec - secondsInto) + factorNext * secondsInto;
|
|
232
|
-
return v1Amount * 3n * this.V1_ACCURACY * periodSec / rP;
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
var byteToHex = [];
|
|
236
|
-
for (let i = 0;i < 256; i++) {
|
|
237
|
-
byteToHex[i] = i.toString(16).padStart(2, "0");
|
|
238
|
-
}
|
|
239
|
-
function bytesToHex(bytes) {
|
|
240
|
-
let hex = "0x";
|
|
241
|
-
for (let i = 0;i < bytes.length; i++) {
|
|
242
|
-
hex += byteToHex[bytes[i]];
|
|
243
|
-
}
|
|
244
|
-
return hex;
|
|
245
|
-
}
|
|
246
|
-
var U32_MASK64 = /* @__PURE__ */ BigInt(2 ** 32 - 1);
|
|
247
|
-
var _32n = /* @__PURE__ */ BigInt(32);
|
|
248
|
-
function fromBig(n, le = false) {
|
|
249
|
-
if (le)
|
|
250
|
-
return { h: Number(n & U32_MASK64), l: Number(n >> _32n & U32_MASK64) };
|
|
251
|
-
return { h: Number(n >> _32n & U32_MASK64) | 0, l: Number(n & U32_MASK64) | 0 };
|
|
252
|
-
}
|
|
253
|
-
function split(lst, le = false) {
|
|
254
|
-
const len = lst.length;
|
|
255
|
-
let Ah = new Uint32Array(len);
|
|
256
|
-
let Al = new Uint32Array(len);
|
|
257
|
-
for (let i = 0;i < len; i++) {
|
|
258
|
-
const { h, l } = fromBig(lst[i], le);
|
|
259
|
-
[Ah[i], Al[i]] = [h, l];
|
|
260
|
-
}
|
|
261
|
-
return [Ah, Al];
|
|
262
|
-
}
|
|
263
|
-
var rotlSH = (h, l, s) => h << s | l >>> 32 - s;
|
|
264
|
-
var rotlSL = (h, l, s) => l << s | h >>> 32 - s;
|
|
265
|
-
var rotlBH = (h, l, s) => l << s - 32 | h >>> 64 - s;
|
|
266
|
-
var rotlBL = (h, l, s) => h << s - 32 | l >>> 64 - s;
|
|
267
|
-
/*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) */
|
|
268
|
-
function isBytes(a) {
|
|
269
|
-
return a instanceof Uint8Array || ArrayBuffer.isView(a) && a.constructor.name === "Uint8Array";
|
|
270
|
-
}
|
|
271
|
-
function anumber(n) {
|
|
272
|
-
if (!Number.isSafeInteger(n) || n < 0)
|
|
273
|
-
throw new Error("positive integer expected, got " + n);
|
|
274
|
-
}
|
|
275
|
-
function abytes(b, ...lengths) {
|
|
276
|
-
if (!isBytes(b))
|
|
277
|
-
throw new Error("Uint8Array expected");
|
|
278
|
-
if (lengths.length > 0 && !lengths.includes(b.length))
|
|
279
|
-
throw new Error("Uint8Array expected of length " + lengths + ", got length=" + b.length);
|
|
280
|
-
}
|
|
281
|
-
function aexists(instance, checkFinished = true) {
|
|
282
|
-
if (instance.destroyed)
|
|
283
|
-
throw new Error("Hash instance has been destroyed");
|
|
284
|
-
if (checkFinished && instance.finished)
|
|
285
|
-
throw new Error("Hash#digest() has already been called");
|
|
286
|
-
}
|
|
287
|
-
function aoutput(out, instance) {
|
|
288
|
-
abytes(out);
|
|
289
|
-
const min = instance.outputLen;
|
|
290
|
-
if (out.length < min) {
|
|
291
|
-
throw new Error("digestInto() expects output buffer of length at least " + min);
|
|
292
|
-
}
|
|
293
|
-
}
|
|
294
|
-
function u32(arr) {
|
|
295
|
-
return new Uint32Array(arr.buffer, arr.byteOffset, Math.floor(arr.byteLength / 4));
|
|
296
|
-
}
|
|
297
|
-
function clean(...arrays) {
|
|
298
|
-
for (let i = 0;i < arrays.length; i++) {
|
|
299
|
-
arrays[i].fill(0);
|
|
300
|
-
}
|
|
301
|
-
}
|
|
302
|
-
var isLE = /* @__PURE__ */ (() => new Uint8Array(new Uint32Array([287454020]).buffer)[0] === 68)();
|
|
303
|
-
function byteSwap(word) {
|
|
304
|
-
return word << 24 & 4278190080 | word << 8 & 16711680 | word >>> 8 & 65280 | word >>> 24 & 255;
|
|
305
|
-
}
|
|
306
|
-
function byteSwap32(arr) {
|
|
307
|
-
for (let i = 0;i < arr.length; i++) {
|
|
308
|
-
arr[i] = byteSwap(arr[i]);
|
|
309
|
-
}
|
|
310
|
-
return arr;
|
|
311
|
-
}
|
|
312
|
-
var swap32IfBE = isLE ? (u) => u : byteSwap32;
|
|
313
|
-
function utf8ToBytes(str) {
|
|
314
|
-
if (typeof str !== "string")
|
|
315
|
-
throw new Error("string expected");
|
|
316
|
-
return new Uint8Array(new TextEncoder().encode(str));
|
|
317
|
-
}
|
|
318
|
-
function toBytes(data) {
|
|
319
|
-
if (typeof data === "string")
|
|
320
|
-
data = utf8ToBytes(data);
|
|
321
|
-
abytes(data);
|
|
322
|
-
return data;
|
|
323
|
-
}
|
|
324
|
-
|
|
325
|
-
class Hash {
|
|
326
|
-
}
|
|
327
|
-
function createHasher(hashCons) {
|
|
328
|
-
const hashC = (msg) => hashCons().update(toBytes(msg)).digest();
|
|
329
|
-
const tmp = hashCons();
|
|
330
|
-
hashC.outputLen = tmp.outputLen;
|
|
331
|
-
hashC.blockLen = tmp.blockLen;
|
|
332
|
-
hashC.create = () => hashCons();
|
|
333
|
-
return hashC;
|
|
334
|
-
}
|
|
335
|
-
var _0n = BigInt(0);
|
|
336
|
-
var _1n = BigInt(1);
|
|
337
|
-
var _2n = BigInt(2);
|
|
338
|
-
var _7n = BigInt(7);
|
|
339
|
-
var _256n = BigInt(256);
|
|
340
|
-
var _0x71n = BigInt(113);
|
|
341
|
-
var SHA3_PI = [];
|
|
342
|
-
var SHA3_ROTL = [];
|
|
343
|
-
var _SHA3_IOTA = [];
|
|
344
|
-
for (let round = 0, R = _1n, x = 1, y = 0;round < 24; round++) {
|
|
345
|
-
[x, y] = [y, (2 * x + 3 * y) % 5];
|
|
346
|
-
SHA3_PI.push(2 * (5 * y + x));
|
|
347
|
-
SHA3_ROTL.push((round + 1) * (round + 2) / 2 % 64);
|
|
348
|
-
let t = _0n;
|
|
349
|
-
for (let j = 0;j < 7; j++) {
|
|
350
|
-
R = (R << _1n ^ (R >> _7n) * _0x71n) % _256n;
|
|
351
|
-
if (R & _2n)
|
|
352
|
-
t ^= _1n << (_1n << /* @__PURE__ */ BigInt(j)) - _1n;
|
|
353
|
-
}
|
|
354
|
-
_SHA3_IOTA.push(t);
|
|
355
|
-
}
|
|
356
|
-
var IOTAS = split(_SHA3_IOTA, true);
|
|
357
|
-
var SHA3_IOTA_H = IOTAS[0];
|
|
358
|
-
var SHA3_IOTA_L = IOTAS[1];
|
|
359
|
-
var rotlH = (h, l, s) => s > 32 ? rotlBH(h, l, s) : rotlSH(h, l, s);
|
|
360
|
-
var rotlL = (h, l, s) => s > 32 ? rotlBL(h, l, s) : rotlSL(h, l, s);
|
|
361
|
-
function keccakP(s, rounds = 24) {
|
|
362
|
-
const B = new Uint32Array(5 * 2);
|
|
363
|
-
for (let round = 24 - rounds;round < 24; round++) {
|
|
364
|
-
for (let x = 0;x < 10; x++)
|
|
365
|
-
B[x] = s[x] ^ s[x + 10] ^ s[x + 20] ^ s[x + 30] ^ s[x + 40];
|
|
366
|
-
for (let x = 0;x < 10; x += 2) {
|
|
367
|
-
const idx1 = (x + 8) % 10;
|
|
368
|
-
const idx0 = (x + 2) % 10;
|
|
369
|
-
const B0 = B[idx0];
|
|
370
|
-
const B1 = B[idx0 + 1];
|
|
371
|
-
const Th = rotlH(B0, B1, 1) ^ B[idx1];
|
|
372
|
-
const Tl = rotlL(B0, B1, 1) ^ B[idx1 + 1];
|
|
373
|
-
for (let y = 0;y < 50; y += 10) {
|
|
374
|
-
s[x + y] ^= Th;
|
|
375
|
-
s[x + y + 1] ^= Tl;
|
|
376
|
-
}
|
|
377
|
-
}
|
|
378
|
-
let curH = s[2];
|
|
379
|
-
let curL = s[3];
|
|
380
|
-
for (let t = 0;t < 24; t++) {
|
|
381
|
-
const shift = SHA3_ROTL[t];
|
|
382
|
-
const Th = rotlH(curH, curL, shift);
|
|
383
|
-
const Tl = rotlL(curH, curL, shift);
|
|
384
|
-
const PI = SHA3_PI[t];
|
|
385
|
-
curH = s[PI];
|
|
386
|
-
curL = s[PI + 1];
|
|
387
|
-
s[PI] = Th;
|
|
388
|
-
s[PI + 1] = Tl;
|
|
389
|
-
}
|
|
390
|
-
for (let y = 0;y < 50; y += 10) {
|
|
391
|
-
for (let x = 0;x < 10; x++)
|
|
392
|
-
B[x] = s[y + x];
|
|
393
|
-
for (let x = 0;x < 10; x++)
|
|
394
|
-
s[y + x] ^= ~B[(x + 2) % 10] & B[(x + 4) % 10];
|
|
395
|
-
}
|
|
396
|
-
s[0] ^= SHA3_IOTA_H[round];
|
|
397
|
-
s[1] ^= SHA3_IOTA_L[round];
|
|
398
|
-
}
|
|
399
|
-
clean(B);
|
|
400
|
-
}
|
|
401
|
-
|
|
402
|
-
class Keccak extends Hash {
|
|
403
|
-
constructor(blockLen, suffix, outputLen, enableXOF = false, rounds = 24) {
|
|
404
|
-
super();
|
|
405
|
-
this.pos = 0;
|
|
406
|
-
this.posOut = 0;
|
|
407
|
-
this.finished = false;
|
|
408
|
-
this.destroyed = false;
|
|
409
|
-
this.enableXOF = false;
|
|
410
|
-
this.blockLen = blockLen;
|
|
411
|
-
this.suffix = suffix;
|
|
412
|
-
this.outputLen = outputLen;
|
|
413
|
-
this.enableXOF = enableXOF;
|
|
414
|
-
this.rounds = rounds;
|
|
415
|
-
anumber(outputLen);
|
|
416
|
-
if (!(0 < blockLen && blockLen < 200))
|
|
417
|
-
throw new Error("only keccak-f1600 function is supported");
|
|
418
|
-
this.state = new Uint8Array(200);
|
|
419
|
-
this.state32 = u32(this.state);
|
|
420
|
-
}
|
|
421
|
-
clone() {
|
|
422
|
-
return this._cloneInto();
|
|
423
|
-
}
|
|
424
|
-
keccak() {
|
|
425
|
-
swap32IfBE(this.state32);
|
|
426
|
-
keccakP(this.state32, this.rounds);
|
|
427
|
-
swap32IfBE(this.state32);
|
|
428
|
-
this.posOut = 0;
|
|
429
|
-
this.pos = 0;
|
|
430
|
-
}
|
|
431
|
-
update(data) {
|
|
432
|
-
aexists(this);
|
|
433
|
-
data = toBytes(data);
|
|
434
|
-
abytes(data);
|
|
435
|
-
const { blockLen, state } = this;
|
|
436
|
-
const len = data.length;
|
|
437
|
-
for (let pos = 0;pos < len; ) {
|
|
438
|
-
const take = Math.min(blockLen - this.pos, len - pos);
|
|
439
|
-
for (let i = 0;i < take; i++)
|
|
440
|
-
state[this.pos++] ^= data[pos++];
|
|
441
|
-
if (this.pos === blockLen)
|
|
442
|
-
this.keccak();
|
|
443
|
-
}
|
|
444
|
-
return this;
|
|
445
|
-
}
|
|
446
|
-
finish() {
|
|
447
|
-
if (this.finished)
|
|
448
|
-
return;
|
|
449
|
-
this.finished = true;
|
|
450
|
-
const { state, suffix, pos, blockLen } = this;
|
|
451
|
-
state[pos] ^= suffix;
|
|
452
|
-
if ((suffix & 128) !== 0 && pos === blockLen - 1)
|
|
453
|
-
this.keccak();
|
|
454
|
-
state[blockLen - 1] ^= 128;
|
|
455
|
-
this.keccak();
|
|
456
|
-
}
|
|
457
|
-
writeInto(out) {
|
|
458
|
-
aexists(this, false);
|
|
459
|
-
abytes(out);
|
|
460
|
-
this.finish();
|
|
461
|
-
const bufferOut = this.state;
|
|
462
|
-
const { blockLen } = this;
|
|
463
|
-
for (let pos = 0, len = out.length;pos < len; ) {
|
|
464
|
-
if (this.posOut >= blockLen)
|
|
465
|
-
this.keccak();
|
|
466
|
-
const take = Math.min(blockLen - this.posOut, len - pos);
|
|
467
|
-
out.set(bufferOut.subarray(this.posOut, this.posOut + take), pos);
|
|
468
|
-
this.posOut += take;
|
|
469
|
-
pos += take;
|
|
470
|
-
}
|
|
471
|
-
return out;
|
|
472
|
-
}
|
|
473
|
-
xofInto(out) {
|
|
474
|
-
if (!this.enableXOF)
|
|
475
|
-
throw new Error("XOF is not possible for this instance");
|
|
476
|
-
return this.writeInto(out);
|
|
477
|
-
}
|
|
478
|
-
xof(bytes) {
|
|
479
|
-
anumber(bytes);
|
|
480
|
-
return this.xofInto(new Uint8Array(bytes));
|
|
481
|
-
}
|
|
482
|
-
digestInto(out) {
|
|
483
|
-
aoutput(out, this);
|
|
484
|
-
if (this.finished)
|
|
485
|
-
throw new Error("digest() was already called");
|
|
486
|
-
this.writeInto(out);
|
|
487
|
-
this.destroy();
|
|
488
|
-
return out;
|
|
489
|
-
}
|
|
490
|
-
digest() {
|
|
491
|
-
return this.digestInto(new Uint8Array(this.outputLen));
|
|
492
|
-
}
|
|
493
|
-
destroy() {
|
|
494
|
-
this.destroyed = true;
|
|
495
|
-
clean(this.state);
|
|
496
|
-
}
|
|
497
|
-
_cloneInto(to) {
|
|
498
|
-
const { blockLen, suffix, outputLen, rounds, enableXOF } = this;
|
|
499
|
-
to || (to = new Keccak(blockLen, suffix, outputLen, enableXOF, rounds));
|
|
500
|
-
to.state32.set(this.state32);
|
|
501
|
-
to.pos = this.pos;
|
|
502
|
-
to.posOut = this.posOut;
|
|
503
|
-
to.finished = this.finished;
|
|
504
|
-
to.rounds = rounds;
|
|
505
|
-
to.suffix = suffix;
|
|
506
|
-
to.outputLen = outputLen;
|
|
507
|
-
to.enableXOF = enableXOF;
|
|
508
|
-
to.destroyed = this.destroyed;
|
|
509
|
-
return to;
|
|
510
|
-
}
|
|
511
|
-
}
|
|
512
|
-
var gen = (suffix, blockLen, outputLen) => createHasher(() => new Keccak(blockLen, suffix, outputLen));
|
|
513
|
-
var keccak_256 = /* @__PURE__ */ (() => gen(1, 136, 256 / 8))();
|
|
514
|
-
function checksumAddress(address) {
|
|
515
|
-
const addr = address.toLowerCase().replace("0x", "");
|
|
516
|
-
const hash = bytesToHex(keccak_256(new TextEncoder().encode(addr))).slice(2);
|
|
517
|
-
let result = "0x";
|
|
518
|
-
for (let i = 0;i < addr.length; i++) {
|
|
519
|
-
result += parseInt(hash[i], 16) >= 8 ? addr[i].toUpperCase() : addr[i];
|
|
520
|
-
}
|
|
521
|
-
return result;
|
|
522
|
-
}
|
|
523
|
-
var empty = new Uint8Array(0);
|
|
524
|
-
function equals(aa, bb) {
|
|
525
|
-
if (aa === bb) {
|
|
526
|
-
return true;
|
|
527
|
-
}
|
|
528
|
-
if (aa.byteLength !== bb.byteLength) {
|
|
529
|
-
return false;
|
|
530
|
-
}
|
|
531
|
-
for (let ii = 0;ii < aa.byteLength; ii++) {
|
|
532
|
-
if (aa[ii] !== bb[ii]) {
|
|
533
|
-
return false;
|
|
534
|
-
}
|
|
535
|
-
}
|
|
536
|
-
return true;
|
|
537
|
-
}
|
|
538
|
-
function coerce(o) {
|
|
539
|
-
if (o instanceof Uint8Array && o.constructor.name === "Uint8Array") {
|
|
540
|
-
return o;
|
|
541
|
-
}
|
|
542
|
-
if (o instanceof ArrayBuffer) {
|
|
543
|
-
return new Uint8Array(o);
|
|
544
|
-
}
|
|
545
|
-
if (ArrayBuffer.isView(o)) {
|
|
546
|
-
return new Uint8Array(o.buffer, o.byteOffset, o.byteLength);
|
|
547
|
-
}
|
|
548
|
-
throw new Error("Unknown type, must be binary type");
|
|
549
|
-
}
|
|
550
|
-
function base(ALPHABET, name) {
|
|
551
|
-
if (ALPHABET.length >= 255) {
|
|
552
|
-
throw new TypeError("Alphabet too long");
|
|
553
|
-
}
|
|
554
|
-
var BASE_MAP = new Uint8Array(256);
|
|
555
|
-
for (var j = 0;j < BASE_MAP.length; j++) {
|
|
556
|
-
BASE_MAP[j] = 255;
|
|
557
|
-
}
|
|
558
|
-
for (var i = 0;i < ALPHABET.length; i++) {
|
|
559
|
-
var x = ALPHABET.charAt(i);
|
|
560
|
-
var xc = x.charCodeAt(0);
|
|
561
|
-
if (BASE_MAP[xc] !== 255) {
|
|
562
|
-
throw new TypeError(x + " is ambiguous");
|
|
563
|
-
}
|
|
564
|
-
BASE_MAP[xc] = i;
|
|
565
|
-
}
|
|
566
|
-
var BASE = ALPHABET.length;
|
|
567
|
-
var LEADER = ALPHABET.charAt(0);
|
|
568
|
-
var FACTOR = Math.log(BASE) / Math.log(256);
|
|
569
|
-
var iFACTOR = Math.log(256) / Math.log(BASE);
|
|
570
|
-
function encode(source) {
|
|
571
|
-
if (source instanceof Uint8Array)
|
|
572
|
-
;
|
|
573
|
-
else if (ArrayBuffer.isView(source)) {
|
|
574
|
-
source = new Uint8Array(source.buffer, source.byteOffset, source.byteLength);
|
|
575
|
-
} else if (Array.isArray(source)) {
|
|
576
|
-
source = Uint8Array.from(source);
|
|
577
|
-
}
|
|
578
|
-
if (!(source instanceof Uint8Array)) {
|
|
579
|
-
throw new TypeError("Expected Uint8Array");
|
|
580
|
-
}
|
|
581
|
-
if (source.length === 0) {
|
|
582
|
-
return "";
|
|
583
|
-
}
|
|
584
|
-
var zeroes = 0;
|
|
585
|
-
var length = 0;
|
|
586
|
-
var pbegin = 0;
|
|
587
|
-
var pend = source.length;
|
|
588
|
-
while (pbegin !== pend && source[pbegin] === 0) {
|
|
589
|
-
pbegin++;
|
|
590
|
-
zeroes++;
|
|
591
|
-
}
|
|
592
|
-
var size = (pend - pbegin) * iFACTOR + 1 >>> 0;
|
|
593
|
-
var b58 = new Uint8Array(size);
|
|
594
|
-
while (pbegin !== pend) {
|
|
595
|
-
var carry = source[pbegin];
|
|
596
|
-
var i2 = 0;
|
|
597
|
-
for (var it1 = size - 1;(carry !== 0 || i2 < length) && it1 !== -1; it1--, i2++) {
|
|
598
|
-
carry += 256 * b58[it1] >>> 0;
|
|
599
|
-
b58[it1] = carry % BASE >>> 0;
|
|
600
|
-
carry = carry / BASE >>> 0;
|
|
601
|
-
}
|
|
602
|
-
if (carry !== 0) {
|
|
603
|
-
throw new Error("Non-zero carry");
|
|
604
|
-
}
|
|
605
|
-
length = i2;
|
|
606
|
-
pbegin++;
|
|
607
|
-
}
|
|
608
|
-
var it2 = size - length;
|
|
609
|
-
while (it2 !== size && b58[it2] === 0) {
|
|
610
|
-
it2++;
|
|
611
|
-
}
|
|
612
|
-
var str = LEADER.repeat(zeroes);
|
|
613
|
-
for (;it2 < size; ++it2) {
|
|
614
|
-
str += ALPHABET.charAt(b58[it2]);
|
|
615
|
-
}
|
|
616
|
-
return str;
|
|
617
|
-
}
|
|
618
|
-
function decodeUnsafe(source) {
|
|
619
|
-
if (typeof source !== "string") {
|
|
620
|
-
throw new TypeError("Expected String");
|
|
621
|
-
}
|
|
622
|
-
if (source.length === 0) {
|
|
623
|
-
return new Uint8Array;
|
|
624
|
-
}
|
|
625
|
-
var psz = 0;
|
|
626
|
-
if (source[psz] === " ") {
|
|
627
|
-
return;
|
|
628
|
-
}
|
|
629
|
-
var zeroes = 0;
|
|
630
|
-
var length = 0;
|
|
631
|
-
while (source[psz] === LEADER) {
|
|
632
|
-
zeroes++;
|
|
633
|
-
psz++;
|
|
634
|
-
}
|
|
635
|
-
var size = (source.length - psz) * FACTOR + 1 >>> 0;
|
|
636
|
-
var b256 = new Uint8Array(size);
|
|
637
|
-
while (source[psz]) {
|
|
638
|
-
var carry = BASE_MAP[source.charCodeAt(psz)];
|
|
639
|
-
if (carry === 255) {
|
|
640
|
-
return;
|
|
641
|
-
}
|
|
642
|
-
var i2 = 0;
|
|
643
|
-
for (var it3 = size - 1;(carry !== 0 || i2 < length) && it3 !== -1; it3--, i2++) {
|
|
644
|
-
carry += BASE * b256[it3] >>> 0;
|
|
645
|
-
b256[it3] = carry % 256 >>> 0;
|
|
646
|
-
carry = carry / 256 >>> 0;
|
|
647
|
-
}
|
|
648
|
-
if (carry !== 0) {
|
|
649
|
-
throw new Error("Non-zero carry");
|
|
650
|
-
}
|
|
651
|
-
length = i2;
|
|
652
|
-
psz++;
|
|
653
|
-
}
|
|
654
|
-
if (source[psz] === " ") {
|
|
655
|
-
return;
|
|
656
|
-
}
|
|
657
|
-
var it4 = size - length;
|
|
658
|
-
while (it4 !== size && b256[it4] === 0) {
|
|
659
|
-
it4++;
|
|
660
|
-
}
|
|
661
|
-
var vch = new Uint8Array(zeroes + (size - it4));
|
|
662
|
-
var j2 = zeroes;
|
|
663
|
-
while (it4 !== size) {
|
|
664
|
-
vch[j2++] = b256[it4++];
|
|
665
|
-
}
|
|
666
|
-
return vch;
|
|
667
|
-
}
|
|
668
|
-
function decode(string) {
|
|
669
|
-
var buffer = decodeUnsafe(string);
|
|
670
|
-
if (buffer) {
|
|
671
|
-
return buffer;
|
|
672
|
-
}
|
|
673
|
-
throw new Error(`Non-${name} character`);
|
|
674
|
-
}
|
|
675
|
-
return {
|
|
676
|
-
encode,
|
|
677
|
-
decodeUnsafe,
|
|
678
|
-
decode
|
|
679
|
-
};
|
|
680
|
-
}
|
|
681
|
-
var src = base;
|
|
682
|
-
var _brrp__multiformats_scope_baseX = src;
|
|
683
|
-
var base_x_default = _brrp__multiformats_scope_baseX;
|
|
684
|
-
|
|
685
|
-
class Encoder {
|
|
686
|
-
name;
|
|
687
|
-
prefix;
|
|
688
|
-
baseEncode;
|
|
689
|
-
constructor(name, prefix, baseEncode) {
|
|
690
|
-
this.name = name;
|
|
691
|
-
this.prefix = prefix;
|
|
692
|
-
this.baseEncode = baseEncode;
|
|
693
|
-
}
|
|
694
|
-
encode(bytes) {
|
|
695
|
-
if (bytes instanceof Uint8Array) {
|
|
696
|
-
return `${this.prefix}${this.baseEncode(bytes)}`;
|
|
697
|
-
} else {
|
|
698
|
-
throw Error("Unknown type, must be binary type");
|
|
699
|
-
}
|
|
700
|
-
}
|
|
701
|
-
}
|
|
702
|
-
|
|
703
|
-
class Decoder {
|
|
704
|
-
name;
|
|
705
|
-
prefix;
|
|
706
|
-
baseDecode;
|
|
707
|
-
prefixCodePoint;
|
|
708
|
-
constructor(name, prefix, baseDecode) {
|
|
709
|
-
this.name = name;
|
|
710
|
-
this.prefix = prefix;
|
|
711
|
-
const prefixCodePoint = prefix.codePointAt(0);
|
|
712
|
-
if (prefixCodePoint === undefined) {
|
|
713
|
-
throw new Error("Invalid prefix character");
|
|
714
|
-
}
|
|
715
|
-
this.prefixCodePoint = prefixCodePoint;
|
|
716
|
-
this.baseDecode = baseDecode;
|
|
717
|
-
}
|
|
718
|
-
decode(text) {
|
|
719
|
-
if (typeof text === "string") {
|
|
720
|
-
if (text.codePointAt(0) !== this.prefixCodePoint) {
|
|
721
|
-
throw Error(`Unable to decode multibase string ${JSON.stringify(text)}, ${this.name} decoder only supports inputs prefixed with ${this.prefix}`);
|
|
722
|
-
}
|
|
723
|
-
return this.baseDecode(text.slice(this.prefix.length));
|
|
724
|
-
} else {
|
|
725
|
-
throw Error("Can only multibase decode strings");
|
|
726
|
-
}
|
|
727
|
-
}
|
|
728
|
-
or(decoder) {
|
|
729
|
-
return or(this, decoder);
|
|
730
|
-
}
|
|
731
|
-
}
|
|
732
|
-
|
|
733
|
-
class ComposedDecoder {
|
|
734
|
-
decoders;
|
|
735
|
-
constructor(decoders) {
|
|
736
|
-
this.decoders = decoders;
|
|
737
|
-
}
|
|
738
|
-
or(decoder) {
|
|
739
|
-
return or(this, decoder);
|
|
740
|
-
}
|
|
741
|
-
decode(input) {
|
|
742
|
-
const prefix = input[0];
|
|
743
|
-
const decoder = this.decoders[prefix];
|
|
744
|
-
if (decoder != null) {
|
|
745
|
-
return decoder.decode(input);
|
|
746
|
-
} else {
|
|
747
|
-
throw RangeError(`Unable to decode multibase string ${JSON.stringify(input)}, only inputs prefixed with ${Object.keys(this.decoders)} are supported`);
|
|
748
|
-
}
|
|
749
|
-
}
|
|
750
|
-
}
|
|
751
|
-
function or(left, right) {
|
|
752
|
-
return new ComposedDecoder({
|
|
753
|
-
...left.decoders ?? { [left.prefix]: left },
|
|
754
|
-
...right.decoders ?? { [right.prefix]: right }
|
|
755
|
-
});
|
|
756
|
-
}
|
|
757
|
-
|
|
758
|
-
class Codec {
|
|
759
|
-
name;
|
|
760
|
-
prefix;
|
|
761
|
-
baseEncode;
|
|
762
|
-
baseDecode;
|
|
763
|
-
encoder;
|
|
764
|
-
decoder;
|
|
765
|
-
constructor(name, prefix, baseEncode, baseDecode) {
|
|
766
|
-
this.name = name;
|
|
767
|
-
this.prefix = prefix;
|
|
768
|
-
this.baseEncode = baseEncode;
|
|
769
|
-
this.baseDecode = baseDecode;
|
|
770
|
-
this.encoder = new Encoder(name, prefix, baseEncode);
|
|
771
|
-
this.decoder = new Decoder(name, prefix, baseDecode);
|
|
772
|
-
}
|
|
773
|
-
encode(input) {
|
|
774
|
-
return this.encoder.encode(input);
|
|
775
|
-
}
|
|
776
|
-
decode(input) {
|
|
777
|
-
return this.decoder.decode(input);
|
|
778
|
-
}
|
|
779
|
-
}
|
|
780
|
-
function from({ name, prefix, encode, decode }) {
|
|
781
|
-
return new Codec(name, prefix, encode, decode);
|
|
782
|
-
}
|
|
783
|
-
function baseX({ name, prefix, alphabet }) {
|
|
784
|
-
const { encode, decode } = base_x_default(alphabet, name);
|
|
785
|
-
return from({
|
|
786
|
-
prefix,
|
|
787
|
-
name,
|
|
788
|
-
encode,
|
|
789
|
-
decode: (text) => coerce(decode(text))
|
|
790
|
-
});
|
|
791
|
-
}
|
|
792
|
-
function decode(string, alphabetIdx, bitsPerChar, name) {
|
|
793
|
-
let end = string.length;
|
|
794
|
-
while (string[end - 1] === "=") {
|
|
795
|
-
--end;
|
|
796
|
-
}
|
|
797
|
-
const out = new Uint8Array(end * bitsPerChar / 8 | 0);
|
|
798
|
-
let bits = 0;
|
|
799
|
-
let buffer = 0;
|
|
800
|
-
let written = 0;
|
|
801
|
-
for (let i = 0;i < end; ++i) {
|
|
802
|
-
const value = alphabetIdx[string[i]];
|
|
803
|
-
if (value === undefined) {
|
|
804
|
-
throw new SyntaxError(`Non-${name} character`);
|
|
805
|
-
}
|
|
806
|
-
buffer = buffer << bitsPerChar | value;
|
|
807
|
-
bits += bitsPerChar;
|
|
808
|
-
if (bits >= 8) {
|
|
809
|
-
bits -= 8;
|
|
810
|
-
out[written++] = 255 & buffer >> bits;
|
|
811
|
-
}
|
|
812
|
-
}
|
|
813
|
-
if (bits >= bitsPerChar || (255 & buffer << 8 - bits) !== 0) {
|
|
814
|
-
throw new SyntaxError("Unexpected end of data");
|
|
815
|
-
}
|
|
816
|
-
return out;
|
|
817
|
-
}
|
|
818
|
-
function encode(data, alphabet, bitsPerChar) {
|
|
819
|
-
const pad = alphabet[alphabet.length - 1] === "=";
|
|
820
|
-
const mask = (1 << bitsPerChar) - 1;
|
|
821
|
-
let out = "";
|
|
822
|
-
let bits = 0;
|
|
823
|
-
let buffer = 0;
|
|
824
|
-
for (let i = 0;i < data.length; ++i) {
|
|
825
|
-
buffer = buffer << 8 | data[i];
|
|
826
|
-
bits += 8;
|
|
827
|
-
while (bits > bitsPerChar) {
|
|
828
|
-
bits -= bitsPerChar;
|
|
829
|
-
out += alphabet[mask & buffer >> bits];
|
|
830
|
-
}
|
|
831
|
-
}
|
|
832
|
-
if (bits !== 0) {
|
|
833
|
-
out += alphabet[mask & buffer << bitsPerChar - bits];
|
|
834
|
-
}
|
|
835
|
-
if (pad) {
|
|
836
|
-
while ((out.length * bitsPerChar & 7) !== 0) {
|
|
837
|
-
out += "=";
|
|
838
|
-
}
|
|
839
|
-
}
|
|
840
|
-
return out;
|
|
841
|
-
}
|
|
842
|
-
function createAlphabetIdx(alphabet) {
|
|
843
|
-
const alphabetIdx = {};
|
|
844
|
-
for (let i = 0;i < alphabet.length; ++i) {
|
|
845
|
-
alphabetIdx[alphabet[i]] = i;
|
|
846
|
-
}
|
|
847
|
-
return alphabetIdx;
|
|
848
|
-
}
|
|
849
|
-
function rfc4648({ name, prefix, bitsPerChar, alphabet }) {
|
|
850
|
-
const alphabetIdx = createAlphabetIdx(alphabet);
|
|
851
|
-
return from({
|
|
852
|
-
prefix,
|
|
853
|
-
name,
|
|
854
|
-
encode(input) {
|
|
855
|
-
return encode(input, alphabet, bitsPerChar);
|
|
856
|
-
},
|
|
857
|
-
decode(input) {
|
|
858
|
-
return decode(input, alphabetIdx, bitsPerChar, name);
|
|
859
|
-
}
|
|
860
|
-
});
|
|
861
|
-
}
|
|
862
|
-
var base32 = rfc4648({
|
|
863
|
-
prefix: "b",
|
|
864
|
-
name: "base32",
|
|
865
|
-
alphabet: "abcdefghijklmnopqrstuvwxyz234567",
|
|
866
|
-
bitsPerChar: 5
|
|
867
|
-
});
|
|
868
|
-
var base32upper = rfc4648({
|
|
869
|
-
prefix: "B",
|
|
870
|
-
name: "base32upper",
|
|
871
|
-
alphabet: "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567",
|
|
872
|
-
bitsPerChar: 5
|
|
873
|
-
});
|
|
874
|
-
var base32pad = rfc4648({
|
|
875
|
-
prefix: "c",
|
|
876
|
-
name: "base32pad",
|
|
877
|
-
alphabet: "abcdefghijklmnopqrstuvwxyz234567=",
|
|
878
|
-
bitsPerChar: 5
|
|
879
|
-
});
|
|
880
|
-
var base32padupper = rfc4648({
|
|
881
|
-
prefix: "C",
|
|
882
|
-
name: "base32padupper",
|
|
883
|
-
alphabet: "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567=",
|
|
884
|
-
bitsPerChar: 5
|
|
885
|
-
});
|
|
886
|
-
var base32hex = rfc4648({
|
|
887
|
-
prefix: "v",
|
|
888
|
-
name: "base32hex",
|
|
889
|
-
alphabet: "0123456789abcdefghijklmnopqrstuv",
|
|
890
|
-
bitsPerChar: 5
|
|
891
|
-
});
|
|
892
|
-
var base32hexupper = rfc4648({
|
|
893
|
-
prefix: "V",
|
|
894
|
-
name: "base32hexupper",
|
|
895
|
-
alphabet: "0123456789ABCDEFGHIJKLMNOPQRSTUV",
|
|
896
|
-
bitsPerChar: 5
|
|
897
|
-
});
|
|
898
|
-
var base32hexpad = rfc4648({
|
|
899
|
-
prefix: "t",
|
|
900
|
-
name: "base32hexpad",
|
|
901
|
-
alphabet: "0123456789abcdefghijklmnopqrstuv=",
|
|
902
|
-
bitsPerChar: 5
|
|
903
|
-
});
|
|
904
|
-
var base32hexpadupper = rfc4648({
|
|
905
|
-
prefix: "T",
|
|
906
|
-
name: "base32hexpadupper",
|
|
907
|
-
alphabet: "0123456789ABCDEFGHIJKLMNOPQRSTUV=",
|
|
908
|
-
bitsPerChar: 5
|
|
909
|
-
});
|
|
910
|
-
var base32z = rfc4648({
|
|
911
|
-
prefix: "h",
|
|
912
|
-
name: "base32z",
|
|
913
|
-
alphabet: "ybndrfg8ejkmcpqxot1uwisza345h769",
|
|
914
|
-
bitsPerChar: 5
|
|
915
|
-
});
|
|
916
|
-
var base36 = baseX({
|
|
917
|
-
prefix: "k",
|
|
918
|
-
name: "base36",
|
|
919
|
-
alphabet: "0123456789abcdefghijklmnopqrstuvwxyz"
|
|
920
|
-
});
|
|
921
|
-
var base36upper = baseX({
|
|
922
|
-
prefix: "K",
|
|
923
|
-
name: "base36upper",
|
|
924
|
-
alphabet: "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
|
925
|
-
});
|
|
926
|
-
var base58btc = baseX({
|
|
927
|
-
name: "base58btc",
|
|
928
|
-
prefix: "z",
|
|
929
|
-
alphabet: "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"
|
|
930
|
-
});
|
|
931
|
-
var base58flickr = baseX({
|
|
932
|
-
name: "base58flickr",
|
|
933
|
-
prefix: "Z",
|
|
934
|
-
alphabet: "123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ"
|
|
935
|
-
});
|
|
936
|
-
var encode_1 = encode2;
|
|
937
|
-
var MSB = 128;
|
|
938
|
-
var REST = 127;
|
|
939
|
-
var MSBALL = ~REST;
|
|
940
|
-
var INT = Math.pow(2, 31);
|
|
941
|
-
function encode2(num, out, offset) {
|
|
942
|
-
out = out || [];
|
|
943
|
-
offset = offset || 0;
|
|
944
|
-
var oldOffset = offset;
|
|
945
|
-
while (num >= INT) {
|
|
946
|
-
out[offset++] = num & 255 | MSB;
|
|
947
|
-
num /= 128;
|
|
948
|
-
}
|
|
949
|
-
while (num & MSBALL) {
|
|
950
|
-
out[offset++] = num & 255 | MSB;
|
|
951
|
-
num >>>= 7;
|
|
952
|
-
}
|
|
953
|
-
out[offset] = num | 0;
|
|
954
|
-
encode2.bytes = offset - oldOffset + 1;
|
|
955
|
-
return out;
|
|
956
|
-
}
|
|
957
|
-
var decode2 = read;
|
|
958
|
-
var MSB$1 = 128;
|
|
959
|
-
var REST$1 = 127;
|
|
960
|
-
function read(buf, offset) {
|
|
961
|
-
var res = 0, offset = offset || 0, shift = 0, counter = offset, b, l = buf.length;
|
|
962
|
-
do {
|
|
963
|
-
if (counter >= l) {
|
|
964
|
-
read.bytes = 0;
|
|
965
|
-
throw new RangeError("Could not decode varint");
|
|
966
|
-
}
|
|
967
|
-
b = buf[counter++];
|
|
968
|
-
res += shift < 28 ? (b & REST$1) << shift : (b & REST$1) * Math.pow(2, shift);
|
|
969
|
-
shift += 7;
|
|
970
|
-
} while (b >= MSB$1);
|
|
971
|
-
read.bytes = counter - offset;
|
|
972
|
-
return res;
|
|
973
|
-
}
|
|
974
|
-
var N1 = Math.pow(2, 7);
|
|
975
|
-
var N2 = Math.pow(2, 14);
|
|
976
|
-
var N3 = Math.pow(2, 21);
|
|
977
|
-
var N4 = Math.pow(2, 28);
|
|
978
|
-
var N5 = Math.pow(2, 35);
|
|
979
|
-
var N6 = Math.pow(2, 42);
|
|
980
|
-
var N7 = Math.pow(2, 49);
|
|
981
|
-
var N8 = Math.pow(2, 56);
|
|
982
|
-
var N9 = Math.pow(2, 63);
|
|
983
|
-
var length = function(value) {
|
|
984
|
-
return value < N1 ? 1 : value < N2 ? 2 : value < N3 ? 3 : value < N4 ? 4 : value < N5 ? 5 : value < N6 ? 6 : value < N7 ? 7 : value < N8 ? 8 : value < N9 ? 9 : 10;
|
|
985
|
-
};
|
|
986
|
-
var varint = {
|
|
987
|
-
encode: encode_1,
|
|
988
|
-
decode: decode2,
|
|
989
|
-
encodingLength: length
|
|
990
|
-
};
|
|
991
|
-
var _brrp_varint = varint;
|
|
992
|
-
var varint_default = _brrp_varint;
|
|
993
|
-
function decode3(data, offset = 0) {
|
|
994
|
-
const code = varint_default.decode(data, offset);
|
|
995
|
-
return [code, varint_default.decode.bytes];
|
|
996
|
-
}
|
|
997
|
-
function encodeTo(int, target, offset = 0) {
|
|
998
|
-
varint_default.encode(int, target, offset);
|
|
999
|
-
return target;
|
|
1000
|
-
}
|
|
1001
|
-
function encodingLength(int) {
|
|
1002
|
-
return varint_default.encodingLength(int);
|
|
1003
|
-
}
|
|
1004
|
-
function create(code, digest) {
|
|
1005
|
-
const size = digest.byteLength;
|
|
1006
|
-
const sizeOffset = encodingLength(code);
|
|
1007
|
-
const digestOffset = sizeOffset + encodingLength(size);
|
|
1008
|
-
const bytes = new Uint8Array(digestOffset + size);
|
|
1009
|
-
encodeTo(code, bytes, 0);
|
|
1010
|
-
encodeTo(size, bytes, sizeOffset);
|
|
1011
|
-
bytes.set(digest, digestOffset);
|
|
1012
|
-
return new Digest(code, size, digest, bytes);
|
|
1013
|
-
}
|
|
1014
|
-
function decode4(multihash) {
|
|
1015
|
-
const bytes = coerce(multihash);
|
|
1016
|
-
const [code, sizeOffset] = decode3(bytes);
|
|
1017
|
-
const [size, digestOffset] = decode3(bytes.subarray(sizeOffset));
|
|
1018
|
-
const digest = bytes.subarray(sizeOffset + digestOffset);
|
|
1019
|
-
if (digest.byteLength !== size) {
|
|
1020
|
-
throw new Error("Incorrect length");
|
|
1021
|
-
}
|
|
1022
|
-
return new Digest(code, size, digest, bytes);
|
|
1023
|
-
}
|
|
1024
|
-
function equals2(a, b) {
|
|
1025
|
-
if (a === b) {
|
|
1026
|
-
return true;
|
|
1027
|
-
} else {
|
|
1028
|
-
const data = b;
|
|
1029
|
-
return a.code === data.code && a.size === data.size && data.bytes instanceof Uint8Array && equals(a.bytes, data.bytes);
|
|
1030
|
-
}
|
|
1031
|
-
}
|
|
1032
|
-
|
|
1033
|
-
class Digest {
|
|
1034
|
-
code;
|
|
1035
|
-
size;
|
|
1036
|
-
digest;
|
|
1037
|
-
bytes;
|
|
1038
|
-
constructor(code, size, digest, bytes) {
|
|
1039
|
-
this.code = code;
|
|
1040
|
-
this.size = size;
|
|
1041
|
-
this.digest = digest;
|
|
1042
|
-
this.bytes = bytes;
|
|
1043
|
-
}
|
|
1044
|
-
}
|
|
1045
|
-
function format(link, base2) {
|
|
1046
|
-
const { bytes, version } = link;
|
|
1047
|
-
switch (version) {
|
|
1048
|
-
case 0:
|
|
1049
|
-
return toStringV0(bytes, baseCache(link), base2 ?? base58btc.encoder);
|
|
1050
|
-
default:
|
|
1051
|
-
return toStringV1(bytes, baseCache(link), base2 ?? base32.encoder);
|
|
1052
|
-
}
|
|
1053
|
-
}
|
|
1054
|
-
var cache = new WeakMap;
|
|
1055
|
-
function baseCache(cid) {
|
|
1056
|
-
const baseCache2 = cache.get(cid);
|
|
1057
|
-
if (baseCache2 == null) {
|
|
1058
|
-
const baseCache3 = new Map;
|
|
1059
|
-
cache.set(cid, baseCache3);
|
|
1060
|
-
return baseCache3;
|
|
1061
|
-
}
|
|
1062
|
-
return baseCache2;
|
|
1063
|
-
}
|
|
1064
|
-
|
|
1065
|
-
class CID {
|
|
1066
|
-
code;
|
|
1067
|
-
version;
|
|
1068
|
-
multihash;
|
|
1069
|
-
bytes;
|
|
1070
|
-
"/";
|
|
1071
|
-
constructor(version, code, multihash, bytes) {
|
|
1072
|
-
this.code = code;
|
|
1073
|
-
this.version = version;
|
|
1074
|
-
this.multihash = multihash;
|
|
1075
|
-
this.bytes = bytes;
|
|
1076
|
-
this["/"] = bytes;
|
|
1077
|
-
}
|
|
1078
|
-
get asCID() {
|
|
1079
|
-
return this;
|
|
1080
|
-
}
|
|
1081
|
-
get byteOffset() {
|
|
1082
|
-
return this.bytes.byteOffset;
|
|
1083
|
-
}
|
|
1084
|
-
get byteLength() {
|
|
1085
|
-
return this.bytes.byteLength;
|
|
1086
|
-
}
|
|
1087
|
-
toV0() {
|
|
1088
|
-
switch (this.version) {
|
|
1089
|
-
case 0: {
|
|
1090
|
-
return this;
|
|
1091
|
-
}
|
|
1092
|
-
case 1: {
|
|
1093
|
-
const { code, multihash } = this;
|
|
1094
|
-
if (code !== DAG_PB_CODE) {
|
|
1095
|
-
throw new Error("Cannot convert a non dag-pb CID to CIDv0");
|
|
1096
|
-
}
|
|
1097
|
-
if (multihash.code !== SHA_256_CODE) {
|
|
1098
|
-
throw new Error("Cannot convert non sha2-256 multihash CID to CIDv0");
|
|
1099
|
-
}
|
|
1100
|
-
return CID.createV0(multihash);
|
|
1101
|
-
}
|
|
1102
|
-
default: {
|
|
1103
|
-
throw Error(`Can not convert CID version ${this.version} to version 0. This is a bug please report`);
|
|
1104
|
-
}
|
|
1105
|
-
}
|
|
1106
|
-
}
|
|
1107
|
-
toV1() {
|
|
1108
|
-
switch (this.version) {
|
|
1109
|
-
case 0: {
|
|
1110
|
-
const { code, digest } = this.multihash;
|
|
1111
|
-
const multihash = create(code, digest);
|
|
1112
|
-
return CID.createV1(this.code, multihash);
|
|
1113
|
-
}
|
|
1114
|
-
case 1: {
|
|
1115
|
-
return this;
|
|
1116
|
-
}
|
|
1117
|
-
default: {
|
|
1118
|
-
throw Error(`Can not convert CID version ${this.version} to version 1. This is a bug please report`);
|
|
1119
|
-
}
|
|
1120
|
-
}
|
|
1121
|
-
}
|
|
1122
|
-
equals(other) {
|
|
1123
|
-
return CID.equals(this, other);
|
|
1124
|
-
}
|
|
1125
|
-
static equals(self, other) {
|
|
1126
|
-
const unknown = other;
|
|
1127
|
-
return unknown != null && self.code === unknown.code && self.version === unknown.version && equals2(self.multihash, unknown.multihash);
|
|
1128
|
-
}
|
|
1129
|
-
toString(base2) {
|
|
1130
|
-
return format(this, base2);
|
|
1131
|
-
}
|
|
1132
|
-
toJSON() {
|
|
1133
|
-
return { "/": format(this) };
|
|
1134
|
-
}
|
|
1135
|
-
link() {
|
|
1136
|
-
return this;
|
|
1137
|
-
}
|
|
1138
|
-
[Symbol.toStringTag] = "CID";
|
|
1139
|
-
[Symbol.for("nodejs.util.inspect.custom")]() {
|
|
1140
|
-
return `CID(${this.toString()})`;
|
|
1141
|
-
}
|
|
1142
|
-
static asCID(input) {
|
|
1143
|
-
if (input == null) {
|
|
1144
|
-
return null;
|
|
1145
|
-
}
|
|
1146
|
-
const value = input;
|
|
1147
|
-
if (value instanceof CID) {
|
|
1148
|
-
return value;
|
|
1149
|
-
} else if (value["/"] != null && value["/"] === value.bytes || value.asCID === value) {
|
|
1150
|
-
const { version, code, multihash, bytes } = value;
|
|
1151
|
-
return new CID(version, code, multihash, bytes ?? encodeCID(version, code, multihash.bytes));
|
|
1152
|
-
} else if (value[cidSymbol] === true) {
|
|
1153
|
-
const { version, multihash, code } = value;
|
|
1154
|
-
const digest = decode4(multihash);
|
|
1155
|
-
return CID.create(version, code, digest);
|
|
1156
|
-
} else {
|
|
1157
|
-
return null;
|
|
1158
|
-
}
|
|
1159
|
-
}
|
|
1160
|
-
static create(version, code, digest) {
|
|
1161
|
-
if (typeof code !== "number") {
|
|
1162
|
-
throw new Error("String codecs are no longer supported");
|
|
1163
|
-
}
|
|
1164
|
-
if (!(digest.bytes instanceof Uint8Array)) {
|
|
1165
|
-
throw new Error("Invalid digest");
|
|
1166
|
-
}
|
|
1167
|
-
switch (version) {
|
|
1168
|
-
case 0: {
|
|
1169
|
-
if (code !== DAG_PB_CODE) {
|
|
1170
|
-
throw new Error(`Version 0 CID must use dag-pb (code: ${DAG_PB_CODE}) block encoding`);
|
|
1171
|
-
} else {
|
|
1172
|
-
return new CID(version, code, digest, digest.bytes);
|
|
1173
|
-
}
|
|
1174
|
-
}
|
|
1175
|
-
case 1: {
|
|
1176
|
-
const bytes = encodeCID(version, code, digest.bytes);
|
|
1177
|
-
return new CID(version, code, digest, bytes);
|
|
1178
|
-
}
|
|
1179
|
-
default: {
|
|
1180
|
-
throw new Error("Invalid version");
|
|
1181
|
-
}
|
|
1182
|
-
}
|
|
1183
|
-
}
|
|
1184
|
-
static createV0(digest) {
|
|
1185
|
-
return CID.create(0, DAG_PB_CODE, digest);
|
|
1186
|
-
}
|
|
1187
|
-
static createV1(code, digest) {
|
|
1188
|
-
return CID.create(1, code, digest);
|
|
1189
|
-
}
|
|
1190
|
-
static decode(bytes) {
|
|
1191
|
-
const [cid, remainder] = CID.decodeFirst(bytes);
|
|
1192
|
-
if (remainder.length !== 0) {
|
|
1193
|
-
throw new Error("Incorrect length");
|
|
1194
|
-
}
|
|
1195
|
-
return cid;
|
|
1196
|
-
}
|
|
1197
|
-
static decodeFirst(bytes) {
|
|
1198
|
-
const specs = CID.inspectBytes(bytes);
|
|
1199
|
-
const prefixSize = specs.size - specs.multihashSize;
|
|
1200
|
-
const multihashBytes = coerce(bytes.subarray(prefixSize, prefixSize + specs.multihashSize));
|
|
1201
|
-
if (multihashBytes.byteLength !== specs.multihashSize) {
|
|
1202
|
-
throw new Error("Incorrect length");
|
|
1203
|
-
}
|
|
1204
|
-
const digestBytes = multihashBytes.subarray(specs.multihashSize - specs.digestSize);
|
|
1205
|
-
const digest = new Digest(specs.multihashCode, specs.digestSize, digestBytes, multihashBytes);
|
|
1206
|
-
const cid = specs.version === 0 ? CID.createV0(digest) : CID.createV1(specs.codec, digest);
|
|
1207
|
-
return [cid, bytes.subarray(specs.size)];
|
|
1208
|
-
}
|
|
1209
|
-
static inspectBytes(initialBytes) {
|
|
1210
|
-
let offset = 0;
|
|
1211
|
-
const next = () => {
|
|
1212
|
-
const [i, length2] = decode3(initialBytes.subarray(offset));
|
|
1213
|
-
offset += length2;
|
|
1214
|
-
return i;
|
|
1215
|
-
};
|
|
1216
|
-
let version = next();
|
|
1217
|
-
let codec = DAG_PB_CODE;
|
|
1218
|
-
if (version === 18) {
|
|
1219
|
-
version = 0;
|
|
1220
|
-
offset = 0;
|
|
1221
|
-
} else {
|
|
1222
|
-
codec = next();
|
|
1223
|
-
}
|
|
1224
|
-
if (version !== 0 && version !== 1) {
|
|
1225
|
-
throw new RangeError(`Invalid CID version ${version}`);
|
|
1226
|
-
}
|
|
1227
|
-
const prefixSize = offset;
|
|
1228
|
-
const multihashCode = next();
|
|
1229
|
-
const digestSize = next();
|
|
1230
|
-
const size = offset + digestSize;
|
|
1231
|
-
const multihashSize = size - prefixSize;
|
|
1232
|
-
return { version, codec, multihashCode, digestSize, multihashSize, size };
|
|
1233
|
-
}
|
|
1234
|
-
static parse(source, base2) {
|
|
1235
|
-
const [prefix, bytes] = parseCIDtoBytes(source, base2);
|
|
1236
|
-
const cid = CID.decode(bytes);
|
|
1237
|
-
if (cid.version === 0 && source[0] !== "Q") {
|
|
1238
|
-
throw Error("Version 0 CID string must not include multibase prefix");
|
|
1239
|
-
}
|
|
1240
|
-
baseCache(cid).set(prefix, source);
|
|
1241
|
-
return cid;
|
|
1242
|
-
}
|
|
1243
|
-
}
|
|
1244
|
-
function parseCIDtoBytes(source, base2) {
|
|
1245
|
-
switch (source[0]) {
|
|
1246
|
-
case "Q": {
|
|
1247
|
-
const decoder = base2 ?? base58btc;
|
|
1248
|
-
return [
|
|
1249
|
-
base58btc.prefix,
|
|
1250
|
-
decoder.decode(`${base58btc.prefix}${source}`)
|
|
1251
|
-
];
|
|
1252
|
-
}
|
|
1253
|
-
case base58btc.prefix: {
|
|
1254
|
-
const decoder = base2 ?? base58btc;
|
|
1255
|
-
return [base58btc.prefix, decoder.decode(source)];
|
|
1256
|
-
}
|
|
1257
|
-
case base32.prefix: {
|
|
1258
|
-
const decoder = base2 ?? base32;
|
|
1259
|
-
return [base32.prefix, decoder.decode(source)];
|
|
1260
|
-
}
|
|
1261
|
-
case base36.prefix: {
|
|
1262
|
-
const decoder = base2 ?? base36;
|
|
1263
|
-
return [base36.prefix, decoder.decode(source)];
|
|
1264
|
-
}
|
|
1265
|
-
default: {
|
|
1266
|
-
if (base2 == null) {
|
|
1267
|
-
throw Error("To parse non base32, base36 or base58btc encoded CID multibase decoder must be provided");
|
|
1268
|
-
}
|
|
1269
|
-
return [source[0], base2.decode(source)];
|
|
1270
|
-
}
|
|
1271
|
-
}
|
|
1272
|
-
}
|
|
1273
|
-
function toStringV0(bytes, cache2, base2) {
|
|
1274
|
-
const { prefix } = base2;
|
|
1275
|
-
if (prefix !== base58btc.prefix) {
|
|
1276
|
-
throw Error(`Cannot string encode V0 in ${base2.name} encoding`);
|
|
1277
|
-
}
|
|
1278
|
-
const cid = cache2.get(prefix);
|
|
1279
|
-
if (cid == null) {
|
|
1280
|
-
const cid2 = base2.encode(bytes).slice(1);
|
|
1281
|
-
cache2.set(prefix, cid2);
|
|
1282
|
-
return cid2;
|
|
1283
|
-
} else {
|
|
1284
|
-
return cid;
|
|
1285
|
-
}
|
|
1286
|
-
}
|
|
1287
|
-
function toStringV1(bytes, cache2, base2) {
|
|
1288
|
-
const { prefix } = base2;
|
|
1289
|
-
const cid = cache2.get(prefix);
|
|
1290
|
-
if (cid == null) {
|
|
1291
|
-
const cid2 = base2.encode(bytes);
|
|
1292
|
-
cache2.set(prefix, cid2);
|
|
1293
|
-
return cid2;
|
|
1294
|
-
} else {
|
|
1295
|
-
return cid;
|
|
1296
|
-
}
|
|
1297
|
-
}
|
|
1298
|
-
var DAG_PB_CODE = 112;
|
|
1299
|
-
var SHA_256_CODE = 18;
|
|
1300
|
-
function encodeCID(version, code, multihash) {
|
|
1301
|
-
const codeOffset = encodingLength(version);
|
|
1302
|
-
const hashOffset = codeOffset + encodingLength(code);
|
|
1303
|
-
const bytes = new Uint8Array(hashOffset + multihash.byteLength);
|
|
1304
|
-
encodeTo(version, bytes, 0);
|
|
1305
|
-
encodeTo(code, bytes, codeOffset);
|
|
1306
|
-
bytes.set(multihash, hashOffset);
|
|
1307
|
-
return bytes;
|
|
1308
|
-
}
|
|
1309
|
-
var cidSymbol = Symbol.for("@ipld/js-cid/CID");
|
|
1310
|
-
class CirclesError extends Error {
|
|
1311
|
-
name;
|
|
1312
|
-
code;
|
|
1313
|
-
source;
|
|
1314
|
-
cause;
|
|
1315
|
-
context;
|
|
1316
|
-
constructor(name, message, options) {
|
|
1317
|
-
super(message);
|
|
1318
|
-
this.name = name;
|
|
1319
|
-
this.code = options?.code;
|
|
1320
|
-
this.source = options?.source ?? "UNKNOWN";
|
|
1321
|
-
this.cause = options?.cause;
|
|
1322
|
-
this.context = options?.context;
|
|
1323
|
-
if (Error.captureStackTrace) {
|
|
1324
|
-
Error.captureStackTrace(this, this.constructor);
|
|
1325
|
-
}
|
|
1326
|
-
}
|
|
1327
|
-
toJSON() {
|
|
1328
|
-
return {
|
|
1329
|
-
name: this.name,
|
|
1330
|
-
message: this.message,
|
|
1331
|
-
code: this.code,
|
|
1332
|
-
source: this.source,
|
|
1333
|
-
context: this.context,
|
|
1334
|
-
cause: this.cause instanceof Error ? {
|
|
1335
|
-
name: this.cause.name,
|
|
1336
|
-
message: this.cause.message
|
|
1337
|
-
} : this.cause,
|
|
1338
|
-
stack: this.stack
|
|
1339
|
-
};
|
|
1340
|
-
}
|
|
1341
|
-
toString() {
|
|
1342
|
-
let result = `[${this.source}] ${this.name}: ${this.message}`;
|
|
1343
|
-
if (this.code) {
|
|
1344
|
-
result += ` (Code: ${this.code})`;
|
|
1345
|
-
}
|
|
1346
|
-
if (this.context) {
|
|
1347
|
-
result += `
|
|
1348
|
-
Context: ${JSON.stringify(this.context, null, 2)}`;
|
|
1349
|
-
}
|
|
1350
|
-
return result;
|
|
1351
|
-
}
|
|
1352
|
-
}
|
|
1353
|
-
|
|
1354
|
-
// src/errors.ts
|
|
1355
|
-
class RpcError extends CirclesError {
|
|
1356
|
-
constructor(message, options) {
|
|
1357
|
-
super("RpcError", message, { ...options, source: options?.source ?? "RPC_REQUEST" });
|
|
1358
|
-
}
|
|
1359
|
-
static connectionFailed(url, cause) {
|
|
1360
|
-
return new RpcError("Failed to connect to RPC endpoint", {
|
|
1361
|
-
code: "RPC_CONNECTION_FAILED",
|
|
1362
|
-
source: "RPC_CONNECTION",
|
|
1363
|
-
cause,
|
|
1364
|
-
context: { url }
|
|
1365
|
-
});
|
|
1366
|
-
}
|
|
1367
|
-
static timeout(method, timeout) {
|
|
1368
|
-
return new RpcError("RPC request timed out", {
|
|
1369
|
-
code: "RPC_TIMEOUT",
|
|
1370
|
-
source: "RPC_TIMEOUT",
|
|
1371
|
-
context: { method, timeout }
|
|
1372
|
-
});
|
|
1373
|
-
}
|
|
1374
|
-
static invalidResponse(method, response) {
|
|
1375
|
-
return new RpcError("Invalid RPC response", {
|
|
1376
|
-
code: "RPC_INVALID_RESPONSE",
|
|
1377
|
-
source: "RPC_RESPONSE",
|
|
1378
|
-
context: { method, response }
|
|
1379
|
-
});
|
|
1380
|
-
}
|
|
1381
|
-
static fromJsonRpcError(error) {
|
|
1382
|
-
return new RpcError(error.message, {
|
|
1383
|
-
code: error.code,
|
|
1384
|
-
source: "RPC_RESPONSE",
|
|
1385
|
-
context: { data: error.data }
|
|
1386
|
-
});
|
|
1387
|
-
}
|
|
1388
|
-
static websocketError(message, cause) {
|
|
1389
|
-
return new RpcError(message, {
|
|
1390
|
-
code: "RPC_WEBSOCKET_ERROR",
|
|
1391
|
-
source: "RPC_WEBSOCKET",
|
|
1392
|
-
cause
|
|
1393
|
-
});
|
|
1394
|
-
}
|
|
1395
|
-
}
|
|
1396
|
-
|
|
1397
|
-
// src/client.ts
|
|
1398
|
-
class RpcClient {
|
|
1399
|
-
rpcUrl;
|
|
1400
|
-
requestId = 0;
|
|
1401
|
-
websocket = null;
|
|
1402
|
-
websocketConnected = false;
|
|
1403
|
-
pendingResponses = {};
|
|
1404
|
-
subscriptionListeners = {};
|
|
1405
|
-
reconnectAttempt = 0;
|
|
1406
|
-
initialBackoff = 2000;
|
|
1407
|
-
maxBackoff = 120000;
|
|
1408
|
-
constructor(rpcUrl) {
|
|
1409
|
-
this.rpcUrl = rpcUrl;
|
|
1410
|
-
}
|
|
1411
|
-
async call(method, params) {
|
|
1412
|
-
this.requestId++;
|
|
1413
|
-
const request = {
|
|
1414
|
-
jsonrpc: "2.0",
|
|
1415
|
-
id: this.requestId,
|
|
1416
|
-
method,
|
|
1417
|
-
params
|
|
1418
|
-
};
|
|
1419
|
-
try {
|
|
1420
|
-
const response = await fetch(this.rpcUrl, {
|
|
1421
|
-
method: "POST",
|
|
1422
|
-
headers: {
|
|
1423
|
-
"Content-Type": "application/json"
|
|
1424
|
-
},
|
|
1425
|
-
body: JSON.stringify(request)
|
|
1426
|
-
});
|
|
1427
|
-
if (!response.ok) {
|
|
1428
|
-
throw RpcError.connectionFailed(this.rpcUrl, new Error(`HTTP ${response.status}: ${response.statusText}`));
|
|
1429
|
-
}
|
|
1430
|
-
const jsonResponse = await response.json();
|
|
1431
|
-
if (jsonResponse.error) {
|
|
1432
|
-
throw RpcError.fromJsonRpcError(jsonResponse.error);
|
|
1433
|
-
}
|
|
1434
|
-
if (jsonResponse.result === undefined) {
|
|
1435
|
-
throw RpcError.invalidResponse(method, jsonResponse);
|
|
1436
|
-
}
|
|
1437
|
-
return jsonResponse.result;
|
|
1438
|
-
} catch (error) {
|
|
1439
|
-
if (error instanceof RpcError) {
|
|
1440
|
-
throw error;
|
|
1441
|
-
}
|
|
1442
|
-
throw RpcError.connectionFailed(this.rpcUrl, error);
|
|
1443
|
-
}
|
|
1444
|
-
}
|
|
1445
|
-
setRpcUrl(rpcUrl) {
|
|
1446
|
-
this.rpcUrl = rpcUrl;
|
|
1447
|
-
}
|
|
1448
|
-
getRpcUrl() {
|
|
1449
|
-
return this.rpcUrl;
|
|
1450
|
-
}
|
|
1451
|
-
connect() {
|
|
1452
|
-
return new Promise((resolve) => {
|
|
1453
|
-
let wsUrl = this.rpcUrl.replace("http", "ws");
|
|
1454
|
-
if (wsUrl.endsWith("/")) {
|
|
1455
|
-
wsUrl += "ws";
|
|
1456
|
-
} else {
|
|
1457
|
-
wsUrl += "/ws";
|
|
1458
|
-
}
|
|
1459
|
-
this.websocket = new WebSocket(wsUrl);
|
|
1460
|
-
this.websocket.onopen = () => {
|
|
1461
|
-
console.log("WebSocket connected");
|
|
1462
|
-
this.websocketConnected = true;
|
|
1463
|
-
this.reconnectAttempt = 0;
|
|
1464
|
-
resolve();
|
|
1465
|
-
};
|
|
1466
|
-
this.websocket.onmessage = (event) => {
|
|
1467
|
-
const message = JSON.parse(event.data);
|
|
1468
|
-
const { id, method, params } = message;
|
|
1469
|
-
if (id !== undefined && this.pendingResponses[id]) {
|
|
1470
|
-
this.pendingResponses[id].resolve(message);
|
|
1471
|
-
delete this.pendingResponses[id];
|
|
1472
|
-
}
|
|
1473
|
-
if (method === "eth_subscription" && params) {
|
|
1474
|
-
const { subscription, result } = params;
|
|
1475
|
-
if (this.subscriptionListeners[subscription]) {
|
|
1476
|
-
this.subscriptionListeners[subscription].forEach((listener) => listener(result));
|
|
1477
|
-
}
|
|
1478
|
-
}
|
|
1479
|
-
};
|
|
1480
|
-
this.websocket.onclose = () => {
|
|
1481
|
-
console.warn("WebSocket closed");
|
|
1482
|
-
this.websocketConnected = false;
|
|
1483
|
-
};
|
|
1484
|
-
this.websocket.onerror = (error) => {
|
|
1485
|
-
console.error("WebSocket error:", error);
|
|
1486
|
-
this.websocketConnected = false;
|
|
1487
|
-
this.scheduleReconnect();
|
|
1488
|
-
};
|
|
1489
|
-
});
|
|
1490
|
-
}
|
|
1491
|
-
scheduleReconnect() {
|
|
1492
|
-
const delay = Math.min(this.initialBackoff * Math.pow(2, this.reconnectAttempt), this.maxBackoff);
|
|
1493
|
-
const jitter = delay * (Math.random() * 0.5);
|
|
1494
|
-
const timeout = delay + jitter;
|
|
1495
|
-
console.log(`Reconnecting in ${Math.round(timeout)}ms (attempt #${this.reconnectAttempt + 1})`);
|
|
1496
|
-
this.reconnectAttempt++;
|
|
1497
|
-
setTimeout(() => {
|
|
1498
|
-
this.reconnect();
|
|
1499
|
-
}, timeout);
|
|
1500
|
-
}
|
|
1501
|
-
async reconnect() {
|
|
1502
|
-
if (this.websocketConnected)
|
|
1503
|
-
return;
|
|
1504
|
-
try {
|
|
1505
|
-
await this.connect();
|
|
1506
|
-
console.log("Reconnection successful");
|
|
1507
|
-
} catch (err) {
|
|
1508
|
-
console.error("Reconnection attempt failed:", err);
|
|
1509
|
-
this.scheduleReconnect();
|
|
1510
|
-
}
|
|
1511
|
-
}
|
|
1512
|
-
sendMessage(method, params, timeout = 5000) {
|
|
1513
|
-
if (!this.websocket || this.websocket.readyState !== WebSocket.OPEN) {
|
|
1514
|
-
return Promise.reject(RpcError.connectionFailed(this.rpcUrl));
|
|
1515
|
-
}
|
|
1516
|
-
const id = this.requestId++;
|
|
1517
|
-
const message = { jsonrpc: "2.0", method, params, id };
|
|
1518
|
-
return new Promise((resolve, reject) => {
|
|
1519
|
-
this.pendingResponses[id] = { resolve, reject };
|
|
1520
|
-
this.websocket.send(JSON.stringify(message));
|
|
1521
|
-
setTimeout(() => {
|
|
1522
|
-
if (this.pendingResponses[id]) {
|
|
1523
|
-
this.pendingResponses[id].reject(RpcError.timeout(method, timeout));
|
|
1524
|
-
delete this.pendingResponses[id];
|
|
1525
|
-
}
|
|
1526
|
-
}, timeout);
|
|
1527
|
-
});
|
|
1528
|
-
}
|
|
1529
|
-
async subscribe(address) {
|
|
1530
|
-
const normalizedAddress = address?.toLowerCase();
|
|
1531
|
-
if (!this.websocketConnected) {
|
|
1532
|
-
await this.connect();
|
|
1533
|
-
}
|
|
1534
|
-
const observable = Observable.create();
|
|
1535
|
-
const subscriptionArgs = JSON.stringify(normalizedAddress ? { address: normalizedAddress } : {});
|
|
1536
|
-
const response = await this.sendMessage("eth_subscribe", ["circles", subscriptionArgs]);
|
|
1537
|
-
const subscriptionId = response.result;
|
|
1538
|
-
if (!this.subscriptionListeners[subscriptionId]) {
|
|
1539
|
-
this.subscriptionListeners[subscriptionId] = [];
|
|
1540
|
-
}
|
|
1541
|
-
this.subscriptionListeners[subscriptionId].push((events) => {
|
|
1542
|
-
parseRpcSubscriptionMessage(events).forEach((event) => observable.emit(event));
|
|
1543
|
-
});
|
|
1544
|
-
return observable.property;
|
|
1545
|
-
}
|
|
1546
|
-
}
|
|
1547
|
-
|
|
1548
|
-
// src/utils.ts
|
|
1549
|
-
function normalizeAddress(address) {
|
|
1550
|
-
return address.toLowerCase();
|
|
1551
|
-
}
|
|
1552
|
-
function normalizeAddresses(addresses) {
|
|
1553
|
-
return addresses.map((addr) => normalizeAddress(addr));
|
|
1554
|
-
}
|
|
1555
|
-
function checksumAddress2(address) {
|
|
1556
|
-
return checksumAddress(address);
|
|
1557
|
-
}
|
|
1558
|
-
function isAddress(value) {
|
|
1559
|
-
if (typeof value !== "string")
|
|
1560
|
-
return false;
|
|
1561
|
-
const cleaned = value.replace("0x", "");
|
|
1562
|
-
return cleaned.length === 40 && /^[0-9a-fA-F]{40}$/.test(cleaned);
|
|
1563
|
-
}
|
|
1564
|
-
function checksumAddresses(value) {
|
|
1565
|
-
if (value === null || value === undefined) {
|
|
1566
|
-
return value;
|
|
1567
|
-
}
|
|
1568
|
-
if (isAddress(value)) {
|
|
1569
|
-
return checksumAddress2(value);
|
|
1570
|
-
}
|
|
1571
|
-
if (Array.isArray(value)) {
|
|
1572
|
-
return value.map((item) => checksumAddresses(item));
|
|
1573
|
-
}
|
|
1574
|
-
if (typeof value === "object" && value !== null) {
|
|
1575
|
-
const result = {};
|
|
1576
|
-
for (const key in value) {
|
|
1577
|
-
if (Object.prototype.hasOwnProperty.call(value, key)) {
|
|
1578
|
-
result[key] = checksumAddresses(value[key]);
|
|
1579
|
-
}
|
|
1580
|
-
}
|
|
1581
|
-
return result;
|
|
1582
|
-
}
|
|
1583
|
-
return value;
|
|
1584
|
-
}
|
|
1585
|
-
function normalizeFindPathParams(params) {
|
|
1586
|
-
return {
|
|
1587
|
-
Source: normalizeAddress(params.from),
|
|
1588
|
-
Sink: normalizeAddress(params.to),
|
|
1589
|
-
TargetFlow: params.targetFlow.toString(),
|
|
1590
|
-
WithWrap: params.useWrappedBalances,
|
|
1591
|
-
FromTokens: params.fromTokens?.map(normalizeAddress),
|
|
1592
|
-
ToTokens: params.toTokens?.map(normalizeAddress),
|
|
1593
|
-
ExcludedFromTokens: params.excludeFromTokens?.map(normalizeAddress),
|
|
1594
|
-
ExcludedToTokens: params.excludeToTokens?.map(normalizeAddress),
|
|
1595
|
-
SimulatedBalances: params.simulatedBalances?.map((balance) => ({
|
|
1596
|
-
Holder: normalizeAddress(balance.holder),
|
|
1597
|
-
Token: normalizeAddress(balance.token),
|
|
1598
|
-
Amount: balance.amount.toString(),
|
|
1599
|
-
IsWrapped: balance.isWrapped,
|
|
1600
|
-
IsStatic: balance.isStatic
|
|
1601
|
-
})),
|
|
1602
|
-
SimulatedTrusts: params.simulatedTrusts?.map((trust) => ({
|
|
1603
|
-
Truster: normalizeAddress(trust.truster),
|
|
1604
|
-
Trustee: normalizeAddress(trust.trustee)
|
|
1605
|
-
})),
|
|
1606
|
-
MaxTransfers: params.maxTransfers
|
|
1607
|
-
};
|
|
1608
|
-
}
|
|
1609
|
-
function parseStringsToBigInt(obj) {
|
|
1610
|
-
const result = {};
|
|
1611
|
-
for (const key in obj) {
|
|
1612
|
-
const value = obj[key];
|
|
1613
|
-
if (value === null || value === undefined) {
|
|
1614
|
-
result[key] = value;
|
|
1615
|
-
} else if (typeof value === "string" && /^\d+$/.test(value)) {
|
|
1616
|
-
result[key] = BigInt(value);
|
|
1617
|
-
} else if (typeof value === "object" && !Array.isArray(value)) {
|
|
1618
|
-
result[key] = parseStringsToBigInt(value);
|
|
1619
|
-
} else if (Array.isArray(value)) {
|
|
1620
|
-
result[key] = value.map((item) => typeof item === "object" && item !== null ? parseStringsToBigInt(item) : item);
|
|
1621
|
-
} else {
|
|
1622
|
-
result[key] = value;
|
|
1623
|
-
}
|
|
1624
|
-
}
|
|
1625
|
-
return result;
|
|
1626
|
-
}
|
|
1627
|
-
|
|
1628
|
-
// src/methods/pathfinder.ts
|
|
1629
|
-
class PathfinderMethods {
|
|
1630
|
-
client;
|
|
1631
|
-
constructor(client) {
|
|
1632
|
-
this.client = client;
|
|
1633
|
-
}
|
|
1634
|
-
async findPath(params) {
|
|
1635
|
-
const normalizedParams = normalizeFindPathParams(params);
|
|
1636
|
-
const result = await this.client.call("circlesV2_findPath", [normalizedParams]);
|
|
1637
|
-
const parsed = parseStringsToBigInt(result);
|
|
1638
|
-
return checksumAddresses(parsed);
|
|
1639
|
-
}
|
|
1640
|
-
async findMaxFlow(params) {
|
|
1641
|
-
const targetFlow = 9999999999999999999999999999999999999n;
|
|
1642
|
-
const path = await this.findPath({
|
|
1643
|
-
...params,
|
|
1644
|
-
targetFlow
|
|
1645
|
-
});
|
|
1646
|
-
return BigInt(path.maxFlow);
|
|
1647
|
-
}
|
|
1648
|
-
}
|
|
1649
|
-
// src/methods/query.ts
|
|
1650
|
-
class QueryMethods {
|
|
1651
|
-
client;
|
|
1652
|
-
constructor(client) {
|
|
1653
|
-
this.client = client;
|
|
1654
|
-
}
|
|
1655
|
-
async query(params) {
|
|
1656
|
-
const result = await this.client.call("circles_query", [params]);
|
|
1657
|
-
return checksumAddresses(result);
|
|
1658
|
-
}
|
|
1659
|
-
async tables() {
|
|
1660
|
-
return this.client.call("circles_tables", []);
|
|
1661
|
-
}
|
|
1662
|
-
async events(fromBlock, toBlock, eventTypes = null, address = null, includeTransactionData = false) {
|
|
1663
|
-
const result = await this.client.call("circles_events", [fromBlock, toBlock, eventTypes, address, includeTransactionData]);
|
|
1664
|
-
return checksumAddresses(result);
|
|
1665
|
-
}
|
|
1666
|
-
}
|
|
1667
|
-
// src/pagedQuery.ts
|
|
1668
|
-
var EVENT_CURSOR_COLUMNS = [
|
|
1669
|
-
{ name: "blockNumber", sortOrder: "DESC" },
|
|
1670
|
-
{ name: "transactionIndex", sortOrder: "DESC" },
|
|
1671
|
-
{ name: "logIndex", sortOrder: "DESC" }
|
|
1672
|
-
];
|
|
1673
|
-
|
|
1674
|
-
class PagedQuery {
|
|
1675
|
-
params;
|
|
1676
|
-
client;
|
|
1677
|
-
rowTransformer;
|
|
1678
|
-
cursorColumns;
|
|
1679
|
-
orderColumns;
|
|
1680
|
-
get currentPage() {
|
|
1681
|
-
return this._currentPage;
|
|
1682
|
-
}
|
|
1683
|
-
_currentPage;
|
|
1684
|
-
constructor(client, params, rowTransformer) {
|
|
1685
|
-
this.client = client;
|
|
1686
|
-
this.params = params;
|
|
1687
|
-
this.rowTransformer = rowTransformer || params.rowTransformer;
|
|
1688
|
-
this.orderColumns = params.orderColumns;
|
|
1689
|
-
this.cursorColumns = params.cursorColumns || this.buildEventCursorColumns();
|
|
1690
|
-
}
|
|
1691
|
-
buildEventCursorColumns() {
|
|
1692
|
-
const columns = EVENT_CURSOR_COLUMNS.map((col) => ({
|
|
1693
|
-
...col,
|
|
1694
|
-
sortOrder: this.params.sortOrder
|
|
1695
|
-
}));
|
|
1696
|
-
if (this.params.table === "TransferBatch") {
|
|
1697
|
-
columns.push({ name: "batchIndex", sortOrder: this.params.sortOrder });
|
|
1698
|
-
}
|
|
1699
|
-
return columns;
|
|
1700
|
-
}
|
|
1701
|
-
transformCursorValue(value, transformer) {
|
|
1702
|
-
if (transformer)
|
|
1703
|
-
return transformer(value);
|
|
1704
|
-
if (typeof value === "bigint")
|
|
1705
|
-
return value.toString();
|
|
1706
|
-
return value;
|
|
1707
|
-
}
|
|
1708
|
-
createEqualityPredicate(column, value) {
|
|
1709
|
-
return {
|
|
1710
|
-
Type: "FilterPredicate",
|
|
1711
|
-
FilterType: "Equals",
|
|
1712
|
-
Column: column.name,
|
|
1713
|
-
Value: this.transformCursorValue(value, column.toValue)
|
|
1714
|
-
};
|
|
1715
|
-
}
|
|
1716
|
-
createComparisonPredicate(column, value) {
|
|
1717
|
-
const filterType = column.sortOrder === "ASC" ? "GreaterThan" : "LessThan";
|
|
1718
|
-
return {
|
|
1719
|
-
Type: "FilterPredicate",
|
|
1720
|
-
FilterType: filterType,
|
|
1721
|
-
Column: column.name,
|
|
1722
|
-
Value: this.transformCursorValue(value, column.toValue)
|
|
1723
|
-
};
|
|
1724
|
-
}
|
|
1725
|
-
buildCursorFilter(cursor) {
|
|
1726
|
-
if (!cursor)
|
|
1727
|
-
return [];
|
|
1728
|
-
const orPredicates = [];
|
|
1729
|
-
for (let level = 0;level < this.cursorColumns.length; level++) {
|
|
1730
|
-
const currentColumn = this.cursorColumns[level];
|
|
1731
|
-
const cursorValue = cursor[currentColumn.name];
|
|
1732
|
-
if (cursorValue === undefined)
|
|
1733
|
-
continue;
|
|
1734
|
-
if (level === 0) {
|
|
1735
|
-
orPredicates.push(this.createComparisonPredicate(currentColumn, cursorValue));
|
|
1736
|
-
} else {
|
|
1737
|
-
const andPredicates = [];
|
|
1738
|
-
for (let prevLevel = 0;prevLevel < level; prevLevel++) {
|
|
1739
|
-
const prevColumn = this.cursorColumns[prevLevel];
|
|
1740
|
-
const prevValue = cursor[prevColumn.name];
|
|
1741
|
-
if (prevValue !== undefined) {
|
|
1742
|
-
andPredicates.push(this.createEqualityPredicate(prevColumn, prevValue));
|
|
1743
|
-
}
|
|
1744
|
-
}
|
|
1745
|
-
andPredicates.push(this.createComparisonPredicate(currentColumn, cursorValue));
|
|
1746
|
-
orPredicates.push({
|
|
1747
|
-
Type: "Conjunction",
|
|
1748
|
-
ConjunctionType: "And",
|
|
1749
|
-
Predicates: andPredicates
|
|
1750
|
-
});
|
|
1751
|
-
}
|
|
1752
|
-
}
|
|
1753
|
-
if (orPredicates.length === 0)
|
|
1754
|
-
return [];
|
|
1755
|
-
return [{
|
|
1756
|
-
Type: "Conjunction",
|
|
1757
|
-
ConjunctionType: "Or",
|
|
1758
|
-
Predicates: orPredicates
|
|
1759
|
-
}];
|
|
1760
|
-
}
|
|
1761
|
-
buildOrderBy() {
|
|
1762
|
-
if (this.orderColumns && this.orderColumns.length > 0) {
|
|
1763
|
-
return this.orderColumns;
|
|
1764
|
-
}
|
|
1765
|
-
return this.cursorColumns.map((col) => ({
|
|
1766
|
-
Column: col.name,
|
|
1767
|
-
SortOrder: col.sortOrder
|
|
1768
|
-
}));
|
|
1769
|
-
}
|
|
1770
|
-
combineFilters(baseFilters, cursorFilter) {
|
|
1771
|
-
if (!baseFilters?.length && !cursorFilter?.length)
|
|
1772
|
-
return [];
|
|
1773
|
-
if (!baseFilters?.length)
|
|
1774
|
-
return cursorFilter || [];
|
|
1775
|
-
if (!cursorFilter?.length)
|
|
1776
|
-
return baseFilters;
|
|
1777
|
-
return [{
|
|
1778
|
-
Type: "Conjunction",
|
|
1779
|
-
ConjunctionType: "And",
|
|
1780
|
-
Predicates: [...baseFilters, ...cursorFilter]
|
|
1781
|
-
}];
|
|
1782
|
-
}
|
|
1783
|
-
rowsToObjects(response) {
|
|
1784
|
-
const { columns, rows } = response;
|
|
1785
|
-
return rows.map((row) => {
|
|
1786
|
-
const rowObj = {};
|
|
1787
|
-
columns.forEach((col, index) => {
|
|
1788
|
-
rowObj[col] = row[index];
|
|
1789
|
-
});
|
|
1790
|
-
return this.rowTransformer ? this.rowTransformer(rowObj) : rowObj;
|
|
1791
|
-
});
|
|
1792
|
-
}
|
|
1793
|
-
rowToCursor(row) {
|
|
1794
|
-
const cursor = {};
|
|
1795
|
-
for (const column of this.cursorColumns) {
|
|
1796
|
-
cursor[column.name] = row[column.name];
|
|
1797
|
-
}
|
|
1798
|
-
return cursor;
|
|
1799
|
-
}
|
|
1800
|
-
getCursors(results) {
|
|
1801
|
-
if (results.length === 0)
|
|
1802
|
-
return {};
|
|
1803
|
-
return {
|
|
1804
|
-
first: this.rowToCursor(results[0]),
|
|
1805
|
-
last: this.rowToCursor(results[results.length - 1])
|
|
1806
|
-
};
|
|
1807
|
-
}
|
|
1808
|
-
async queryNextPage() {
|
|
1809
|
-
const cursorFilter = this.buildCursorFilter(this._currentPage?.lastCursor);
|
|
1810
|
-
const combinedFilter = this.combineFilters(this.params.filter, cursorFilter);
|
|
1811
|
-
const queryParams = {
|
|
1812
|
-
Namespace: this.params.namespace,
|
|
1813
|
-
Table: this.params.table,
|
|
1814
|
-
Columns: this.params.columns,
|
|
1815
|
-
Filter: combinedFilter,
|
|
1816
|
-
Order: this.buildOrderBy(),
|
|
1817
|
-
Limit: this.params.limit
|
|
1818
|
-
};
|
|
1819
|
-
const response = await this.client.call("circles_query", [queryParams]);
|
|
1820
|
-
const results = this.rowsToObjects(response);
|
|
1821
|
-
const cursors = this.getCursors(results);
|
|
1822
|
-
this._currentPage = {
|
|
1823
|
-
limit: this.params.limit,
|
|
1824
|
-
size: results.length,
|
|
1825
|
-
firstCursor: cursors.first,
|
|
1826
|
-
lastCursor: cursors.last,
|
|
1827
|
-
sortOrder: this.params.sortOrder,
|
|
1828
|
-
hasMore: results.length === this.params.limit,
|
|
1829
|
-
results
|
|
1830
|
-
};
|
|
1831
|
-
return results.length > 0;
|
|
1832
|
-
}
|
|
1833
|
-
reset() {
|
|
1834
|
-
this._currentPage = undefined;
|
|
1835
|
-
}
|
|
1836
|
-
}
|
|
1837
|
-
|
|
1838
|
-
// src/methods/trust.ts
|
|
1839
|
-
class TrustMethods {
|
|
1840
|
-
client;
|
|
1841
|
-
constructor(client) {
|
|
1842
|
-
this.client = client;
|
|
1843
|
-
}
|
|
1844
|
-
transformQueryResponse(response) {
|
|
1845
|
-
const { columns, rows } = response;
|
|
1846
|
-
return rows.map((row) => {
|
|
1847
|
-
const obj = {};
|
|
1848
|
-
columns.forEach((col, index) => {
|
|
1849
|
-
obj[col] = row[index];
|
|
1850
|
-
});
|
|
1851
|
-
return obj;
|
|
1852
|
-
});
|
|
1853
|
-
}
|
|
1854
|
-
async getCommonTrust(address1, address2) {
|
|
1855
|
-
const result = await this.client.call("circles_getCommonTrust", [
|
|
1856
|
-
normalizeAddress(address1),
|
|
1857
|
-
normalizeAddress(address2)
|
|
1858
|
-
]);
|
|
1859
|
-
return checksumAddresses(result);
|
|
1860
|
-
}
|
|
1861
|
-
getTrustRelations(avatar, limit = 100, sortOrder = "DESC") {
|
|
1862
|
-
const normalized = normalizeAddress(avatar);
|
|
1863
|
-
const filter = [
|
|
1864
|
-
{
|
|
1865
|
-
Type: "Conjunction",
|
|
1866
|
-
ConjunctionType: "And",
|
|
1867
|
-
Predicates: [
|
|
1868
|
-
{
|
|
1869
|
-
Type: "FilterPredicate",
|
|
1870
|
-
FilterType: "Equals",
|
|
1871
|
-
Column: "version",
|
|
1872
|
-
Value: 2
|
|
1873
|
-
},
|
|
1874
|
-
{
|
|
1875
|
-
Type: "Conjunction",
|
|
1876
|
-
ConjunctionType: "Or",
|
|
1877
|
-
Predicates: [
|
|
1878
|
-
{
|
|
1879
|
-
Type: "FilterPredicate",
|
|
1880
|
-
FilterType: "Equals",
|
|
1881
|
-
Column: "trustee",
|
|
1882
|
-
Value: normalized
|
|
1883
|
-
},
|
|
1884
|
-
{
|
|
1885
|
-
Type: "FilterPredicate",
|
|
1886
|
-
FilterType: "Equals",
|
|
1887
|
-
Column: "truster",
|
|
1888
|
-
Value: normalized
|
|
1889
|
-
}
|
|
1890
|
-
]
|
|
1891
|
-
}
|
|
1892
|
-
]
|
|
1893
|
-
}
|
|
1894
|
-
];
|
|
1895
|
-
return new PagedQuery(this.client, {
|
|
1896
|
-
namespace: "V_Crc",
|
|
1897
|
-
table: "TrustRelations",
|
|
1898
|
-
sortOrder,
|
|
1899
|
-
columns: [
|
|
1900
|
-
"blockNumber",
|
|
1901
|
-
"timestamp",
|
|
1902
|
-
"transactionIndex",
|
|
1903
|
-
"logIndex",
|
|
1904
|
-
"transactionHash",
|
|
1905
|
-
"version",
|
|
1906
|
-
"trustee",
|
|
1907
|
-
"truster",
|
|
1908
|
-
"expiryTime"
|
|
1909
|
-
],
|
|
1910
|
-
filter,
|
|
1911
|
-
limit
|
|
1912
|
-
}, (row) => checksumAddresses(row));
|
|
1913
|
-
}
|
|
1914
|
-
async getAggregatedTrustRelations(avatar) {
|
|
1915
|
-
const normalized = normalizeAddress(avatar);
|
|
1916
|
-
const query = this.getTrustRelations(normalized, 1000);
|
|
1917
|
-
const trustListRows = [];
|
|
1918
|
-
while (await query.queryNextPage()) {
|
|
1919
|
-
trustListRows.push(...query.currentPage.results);
|
|
1920
|
-
if (!query.currentPage.hasMore)
|
|
1921
|
-
break;
|
|
1922
|
-
}
|
|
1923
|
-
const trustBucket = {};
|
|
1924
|
-
trustListRows.forEach((row) => {
|
|
1925
|
-
const trusterNorm = normalizeAddress(row.truster);
|
|
1926
|
-
const trusteeNorm = normalizeAddress(row.trustee);
|
|
1927
|
-
const counterpart = trusterNorm !== normalized ? row.truster : row.trustee;
|
|
1928
|
-
if (!trustBucket[counterpart]) {
|
|
1929
|
-
trustBucket[counterpart] = [];
|
|
1930
|
-
}
|
|
1931
|
-
trustBucket[counterpart].push(row);
|
|
1932
|
-
});
|
|
1933
|
-
const result = Object.entries(trustBucket).filter(([address]) => normalizeAddress(address) !== normalized).map(([address, rows]) => {
|
|
1934
|
-
const maxTimestamp = Math.max(...rows.map((o) => o.timestamp));
|
|
1935
|
-
let relation;
|
|
1936
|
-
if (rows.length === 2) {
|
|
1937
|
-
relation = "mutuallyTrusts";
|
|
1938
|
-
} else if (normalizeAddress(rows[0]?.trustee) === normalized) {
|
|
1939
|
-
relation = "trustedBy";
|
|
1940
|
-
} else if (normalizeAddress(rows[0]?.truster) === normalized) {
|
|
1941
|
-
relation = "trusts";
|
|
1942
|
-
} else {
|
|
1943
|
-
throw new Error(`Unexpected trust list row. Couldn't determine trust relation.`);
|
|
1944
|
-
}
|
|
1945
|
-
return {
|
|
1946
|
-
subjectAvatar: normalized,
|
|
1947
|
-
relation,
|
|
1948
|
-
objectAvatar: address,
|
|
1949
|
-
timestamp: maxTimestamp
|
|
1950
|
-
};
|
|
1951
|
-
});
|
|
1952
|
-
return checksumAddresses(result);
|
|
1953
|
-
}
|
|
1954
|
-
async getTrustedBy(avatar) {
|
|
1955
|
-
const normalized = normalizeAddress(avatar);
|
|
1956
|
-
const relations = await this.getAggregatedTrustRelations(normalized);
|
|
1957
|
-
const filtered = relations.filter((r) => r.relation === "trustedBy");
|
|
1958
|
-
return checksumAddresses(filtered);
|
|
1959
|
-
}
|
|
1960
|
-
async getTrusts(avatar) {
|
|
1961
|
-
const normalized = normalizeAddress(avatar);
|
|
1962
|
-
const relations = await this.getAggregatedTrustRelations(normalized);
|
|
1963
|
-
const filtered = relations.filter((r) => r.relation === "trusts");
|
|
1964
|
-
return checksumAddresses(filtered);
|
|
1965
|
-
}
|
|
1966
|
-
async getMutualTrusts(avatar) {
|
|
1967
|
-
const normalized = normalizeAddress(avatar);
|
|
1968
|
-
const relations = await this.getAggregatedTrustRelations(normalized);
|
|
1969
|
-
const filtered = relations.filter((r) => r.relation === "mutuallyTrusts");
|
|
1970
|
-
return checksumAddresses(filtered);
|
|
1971
|
-
}
|
|
1972
|
-
}
|
|
1973
|
-
// src/methods/balance.ts
|
|
1974
|
-
class BalanceMethods {
|
|
1975
|
-
client;
|
|
1976
|
-
constructor(client) {
|
|
1977
|
-
this.client = client;
|
|
1978
|
-
}
|
|
1979
|
-
async getTotalBalance(address, asTimeCircles = true) {
|
|
1980
|
-
const result = await this.client.call("circlesV2_getTotalBalance", [
|
|
1981
|
-
normalizeAddress(address),
|
|
1982
|
-
asTimeCircles
|
|
1983
|
-
]);
|
|
1984
|
-
return CirclesConverter.circlesToAttoCircles(result);
|
|
1985
|
-
}
|
|
1986
|
-
async getTokenBalances(address) {
|
|
1987
|
-
const result = await this.client.call("circles_getTokenBalances", [
|
|
1988
|
-
normalizeAddress(address)
|
|
1989
|
-
]);
|
|
1990
|
-
const parsed = result.map((item) => parseStringsToBigInt(item));
|
|
1991
|
-
return checksumAddresses(parsed);
|
|
1992
|
-
}
|
|
1993
|
-
}
|
|
1994
|
-
// src/methods/avatar.ts
|
|
1995
|
-
class AvatarMethods {
|
|
1996
|
-
client;
|
|
1997
|
-
constructor(client) {
|
|
1998
|
-
this.client = client;
|
|
1999
|
-
}
|
|
2000
|
-
async getAvatarInfo(address) {
|
|
2001
|
-
const results = await this.getAvatarInfoBatch([address]);
|
|
2002
|
-
return results.length > 0 ? results[0] : undefined;
|
|
2003
|
-
}
|
|
2004
|
-
async getAvatarInfoBatch(addresses) {
|
|
2005
|
-
if (addresses.length === 0) {
|
|
2006
|
-
return [];
|
|
2007
|
-
}
|
|
2008
|
-
const normalizedAddresses = addresses.map((addr) => normalizeAddress(addr));
|
|
2009
|
-
const result = await this.client.call("circles_getAvatarInfoBatch", [normalizedAddresses]);
|
|
2010
|
-
return checksumAddresses(result);
|
|
2011
|
-
}
|
|
2012
|
-
async getNetworkSnapshot() {
|
|
2013
|
-
const result = await this.client.call("circles_getNetworkSnapshot", []);
|
|
2014
|
-
return checksumAddresses(result);
|
|
2015
|
-
}
|
|
2016
|
-
}
|
|
2017
|
-
// src/methods/profile.ts
|
|
2018
|
-
class ProfileMethods {
|
|
2019
|
-
client;
|
|
2020
|
-
constructor(client) {
|
|
2021
|
-
this.client = client;
|
|
2022
|
-
}
|
|
2023
|
-
async getProfileByCid(cid) {
|
|
2024
|
-
return this.client.call("circles_getProfileByCid", [cid]);
|
|
2025
|
-
}
|
|
2026
|
-
async getProfileByCidBatch(cids) {
|
|
2027
|
-
return this.client.call("circles_getProfileByCidBatch", [cids]);
|
|
2028
|
-
}
|
|
2029
|
-
async getProfileByAddress(address) {
|
|
2030
|
-
return this.client.call("circles_getProfileByAddress", [
|
|
2031
|
-
normalizeAddress(address)
|
|
2032
|
-
]);
|
|
2033
|
-
}
|
|
2034
|
-
async getProfileByAddressBatch(addresses) {
|
|
2035
|
-
return this.client.call("circles_getProfileByAddressBatch", [addresses.map((addr) => addr === null ? null : normalizeAddress(addr))]);
|
|
2036
|
-
}
|
|
2037
|
-
async searchProfiles(query, limit = 10, offset = 0, avatarTypes) {
|
|
2038
|
-
return this.client.call("circles_searchProfiles", [
|
|
2039
|
-
query.toLowerCase(),
|
|
2040
|
-
limit,
|
|
2041
|
-
offset,
|
|
2042
|
-
avatarTypes
|
|
2043
|
-
]);
|
|
2044
|
-
}
|
|
2045
|
-
async searchByAddressOrName(query, limit = 10, offset = 0, avatarTypes) {
|
|
2046
|
-
const results = [];
|
|
2047
|
-
const isAddress2 = /^0x[a-fA-F0-9]{40}$/.test(query);
|
|
2048
|
-
if (isAddress2) {
|
|
2049
|
-
try {
|
|
2050
|
-
const profile = await this.getProfileByAddress(query);
|
|
2051
|
-
if (profile) {
|
|
2052
|
-
const searchResult = {
|
|
2053
|
-
...profile,
|
|
2054
|
-
address: query
|
|
2055
|
-
};
|
|
2056
|
-
if (!avatarTypes || !searchResult.avatarType || avatarTypes.includes(searchResult.avatarType)) {
|
|
2057
|
-
results.push(searchResult);
|
|
2058
|
-
}
|
|
2059
|
-
}
|
|
2060
|
-
} catch (error) {
|
|
2061
|
-
console.warn("Failed to get profile by address:", error);
|
|
2062
|
-
}
|
|
2063
|
-
}
|
|
2064
|
-
try {
|
|
2065
|
-
const textResults = await this.searchProfiles(query, limit, offset, avatarTypes);
|
|
2066
|
-
if (isAddress2 && results.length > 0) {
|
|
2067
|
-
const addressLower = query.toLowerCase();
|
|
2068
|
-
const filteredResults = textResults.filter((p) => p.address?.toLowerCase() !== addressLower);
|
|
2069
|
-
results.push(...filteredResults);
|
|
2070
|
-
} else {
|
|
2071
|
-
results.push(...textResults);
|
|
2072
|
-
}
|
|
2073
|
-
} catch (error) {
|
|
2074
|
-
console.warn("Failed to search profiles by text:", error);
|
|
2075
|
-
}
|
|
2076
|
-
return results.slice(0, limit);
|
|
2077
|
-
}
|
|
2078
|
-
}
|
|
2079
|
-
// src/methods/token.ts
|
|
2080
|
-
class TokenMethods {
|
|
2081
|
-
client;
|
|
2082
|
-
constructor(client) {
|
|
2083
|
-
this.client = client;
|
|
2084
|
-
}
|
|
2085
|
-
async getTokenInfo(address) {
|
|
2086
|
-
const results = await this.getTokenInfoBatch([address]);
|
|
2087
|
-
return results.length > 0 ? results[0] : undefined;
|
|
2088
|
-
}
|
|
2089
|
-
async getTokenInfoBatch(addresses) {
|
|
2090
|
-
if (addresses.length === 0) {
|
|
2091
|
-
return [];
|
|
2092
|
-
}
|
|
2093
|
-
const normalizedAddresses = addresses.map((addr) => normalizeAddress(addr));
|
|
2094
|
-
const result = await this.client.call("circles_getTokenInfoBatch", [normalizedAddresses]);
|
|
2095
|
-
const parsed = result.map((item) => parseStringsToBigInt(item));
|
|
2096
|
-
return checksumAddresses(parsed);
|
|
2097
|
-
}
|
|
2098
|
-
getTokenHolders(tokenAddress, limit = 100, sortOrder = "DESC") {
|
|
2099
|
-
const normalizedTokenAddress = normalizeAddress(tokenAddress);
|
|
2100
|
-
return new PagedQuery(this.client, {
|
|
2101
|
-
namespace: "V_CrcV2",
|
|
2102
|
-
table: "BalancesByAccountAndToken",
|
|
2103
|
-
columns: ["account", "tokenAddress", "demurragedTotalBalance"],
|
|
2104
|
-
filter: [{
|
|
2105
|
-
Type: "FilterPredicate",
|
|
2106
|
-
FilterType: "Equals",
|
|
2107
|
-
Column: "tokenAddress",
|
|
2108
|
-
Value: normalizedTokenAddress
|
|
2109
|
-
}],
|
|
2110
|
-
cursorColumns: [
|
|
2111
|
-
{ name: "demurragedTotalBalance", sortOrder },
|
|
2112
|
-
{ name: "account", sortOrder: "ASC" }
|
|
2113
|
-
],
|
|
2114
|
-
orderColumns: [
|
|
2115
|
-
{ Column: "demurragedTotalBalance", SortOrder: sortOrder },
|
|
2116
|
-
{ Column: "account", SortOrder: "ASC" }
|
|
2117
|
-
],
|
|
2118
|
-
limit,
|
|
2119
|
-
sortOrder
|
|
2120
|
-
}, (row) => ({
|
|
2121
|
-
account: row.account,
|
|
2122
|
-
tokenAddress: row.tokenAddress,
|
|
2123
|
-
demurragedTotalBalance: row.demurragedTotalBalance
|
|
2124
|
-
}));
|
|
2125
|
-
}
|
|
2126
|
-
}
|
|
2127
|
-
// src/methods/invitation.ts
|
|
2128
|
-
class InvitationMethods {
|
|
2129
|
-
client;
|
|
2130
|
-
constructor(client) {
|
|
2131
|
-
this.client = client;
|
|
2132
|
-
}
|
|
2133
|
-
transformQueryResponse(response) {
|
|
2134
|
-
const { columns, rows } = response;
|
|
2135
|
-
return rows.map((row) => {
|
|
2136
|
-
const obj = {};
|
|
2137
|
-
columns.forEach((col, index) => {
|
|
2138
|
-
obj[col] = row[index];
|
|
2139
|
-
});
|
|
2140
|
-
return obj;
|
|
2141
|
-
});
|
|
2142
|
-
}
|
|
2143
|
-
async getInvitedBy(address) {
|
|
2144
|
-
const normalized = normalizeAddress(address);
|
|
2145
|
-
const results = await this.client.call("circles_query", [
|
|
2146
|
-
{
|
|
2147
|
-
Namespace: "CrcV2",
|
|
2148
|
-
Table: "RegisterHuman",
|
|
2149
|
-
Columns: ["inviter"],
|
|
2150
|
-
Filter: [
|
|
2151
|
-
{
|
|
2152
|
-
Type: "FilterPredicate",
|
|
2153
|
-
FilterType: "Equals",
|
|
2154
|
-
Column: "avatar",
|
|
2155
|
-
Value: normalized
|
|
2156
|
-
}
|
|
2157
|
-
],
|
|
2158
|
-
Order: [
|
|
2159
|
-
{
|
|
2160
|
-
Column: "blockNumber",
|
|
2161
|
-
SortOrder: "DESC"
|
|
2162
|
-
}
|
|
2163
|
-
],
|
|
2164
|
-
Limit: 1
|
|
2165
|
-
}
|
|
2166
|
-
]);
|
|
2167
|
-
if (results.length > 0) {
|
|
2168
|
-
return checksumAddresses(results[0].inviter);
|
|
2169
|
-
}
|
|
2170
|
-
return;
|
|
2171
|
-
}
|
|
2172
|
-
async getInvitations(address) {
|
|
2173
|
-
const normalized = normalizeAddress(address);
|
|
2174
|
-
const MIN_TOKENS_REQUIRED = 96;
|
|
2175
|
-
const avatarInfoResults = await this.client.call("circles_getAvatarInfoBatch", [[normalized]]);
|
|
2176
|
-
const avatarInfo = avatarInfoResults.length > 0 ? avatarInfoResults[0] : undefined;
|
|
2177
|
-
if (avatarInfo?.version === 2) {
|
|
2178
|
-
return [];
|
|
2179
|
-
}
|
|
2180
|
-
const response = await this.client.call("circles_query", [
|
|
2181
|
-
{
|
|
2182
|
-
Namespace: "V_Crc",
|
|
2183
|
-
Table: "TrustRelations",
|
|
2184
|
-
Columns: ["truster", "trustee"],
|
|
2185
|
-
Filter: [
|
|
2186
|
-
{
|
|
2187
|
-
Type: "Conjunction",
|
|
2188
|
-
ConjunctionType: "And",
|
|
2189
|
-
Predicates: [
|
|
2190
|
-
{
|
|
2191
|
-
Type: "FilterPredicate",
|
|
2192
|
-
FilterType: "Equals",
|
|
2193
|
-
Column: "version",
|
|
2194
|
-
Value: 2
|
|
2195
|
-
},
|
|
2196
|
-
{
|
|
2197
|
-
Type: "FilterPredicate",
|
|
2198
|
-
FilterType: "Equals",
|
|
2199
|
-
Column: "trustee",
|
|
2200
|
-
Value: normalized
|
|
2201
|
-
}
|
|
2202
|
-
]
|
|
2203
|
-
}
|
|
2204
|
-
],
|
|
2205
|
-
Order: []
|
|
2206
|
-
}
|
|
2207
|
-
]);
|
|
2208
|
-
const trustRelations = this.transformQueryResponse(response);
|
|
2209
|
-
const v2Trusters = trustRelations.map((r) => r.truster);
|
|
2210
|
-
if (v2Trusters.length === 0) {
|
|
2211
|
-
return [];
|
|
2212
|
-
}
|
|
2213
|
-
const trusterInfos = await this.client.call("circles_getAvatarInfoBatch", [v2Trusters]);
|
|
2214
|
-
const humanInviters = [];
|
|
2215
|
-
for (const trusterInfo of trusterInfos) {
|
|
2216
|
-
if (!trusterInfo?.isHuman) {
|
|
2217
|
-
continue;
|
|
2218
|
-
}
|
|
2219
|
-
const balances = await this.client.call("circles_getTokenBalances", [trusterInfo.avatar]);
|
|
2220
|
-
const inviterOwnToken = balances.find((b) => normalizeAddress(b.tokenAddress) === normalizeAddress(trusterInfo.avatar));
|
|
2221
|
-
if (inviterOwnToken && inviterOwnToken.circles >= MIN_TOKENS_REQUIRED) {
|
|
2222
|
-
humanInviters.push(trusterInfo);
|
|
2223
|
-
}
|
|
2224
|
-
}
|
|
2225
|
-
return checksumAddresses(humanInviters);
|
|
2226
|
-
}
|
|
2227
|
-
async getInvitationsFrom(address, accepted = false) {
|
|
2228
|
-
const normalized = normalizeAddress(address);
|
|
2229
|
-
if (accepted) {
|
|
2230
|
-
const response = await this.client.call("circles_query", [
|
|
2231
|
-
{
|
|
2232
|
-
Namespace: "CrcV2",
|
|
2233
|
-
Table: "RegisterHuman",
|
|
2234
|
-
Columns: ["avatar"],
|
|
2235
|
-
Filter: [
|
|
2236
|
-
{
|
|
2237
|
-
Type: "FilterPredicate",
|
|
2238
|
-
FilterType: "Equals",
|
|
2239
|
-
Column: "inviter",
|
|
2240
|
-
Value: normalized
|
|
2241
|
-
}
|
|
2242
|
-
],
|
|
2243
|
-
Order: [
|
|
2244
|
-
{
|
|
2245
|
-
Column: "blockNumber",
|
|
2246
|
-
SortOrder: "DESC"
|
|
2247
|
-
}
|
|
2248
|
-
]
|
|
2249
|
-
}
|
|
2250
|
-
]);
|
|
2251
|
-
const results = this.transformQueryResponse(response);
|
|
2252
|
-
const avatars = results.map((r) => r.avatar);
|
|
2253
|
-
return checksumAddresses(avatars);
|
|
2254
|
-
} else {
|
|
2255
|
-
const response = await this.client.call("circles_query", [
|
|
2256
|
-
{
|
|
2257
|
-
Namespace: "V_Crc",
|
|
2258
|
-
Table: "TrustRelations",
|
|
2259
|
-
Columns: ["trustee", "truster"],
|
|
2260
|
-
Filter: [
|
|
2261
|
-
{
|
|
2262
|
-
Type: "Conjunction",
|
|
2263
|
-
ConjunctionType: "And",
|
|
2264
|
-
Predicates: [
|
|
2265
|
-
{
|
|
2266
|
-
Type: "FilterPredicate",
|
|
2267
|
-
FilterType: "Equals",
|
|
2268
|
-
Column: "version",
|
|
2269
|
-
Value: 2
|
|
2270
|
-
},
|
|
2271
|
-
{
|
|
2272
|
-
Type: "FilterPredicate",
|
|
2273
|
-
FilterType: "Equals",
|
|
2274
|
-
Column: "truster",
|
|
2275
|
-
Value: normalized
|
|
2276
|
-
}
|
|
2277
|
-
]
|
|
2278
|
-
}
|
|
2279
|
-
],
|
|
2280
|
-
Order: []
|
|
2281
|
-
}
|
|
2282
|
-
]);
|
|
2283
|
-
const trustRelations = this.transformQueryResponse(response);
|
|
2284
|
-
const v2Trusted = trustRelations.map((r) => r.trustee);
|
|
2285
|
-
if (v2Trusted.length === 0) {
|
|
2286
|
-
return [];
|
|
2287
|
-
}
|
|
2288
|
-
const trustedAvatarsInfo = await this.client.call("circles_getAvatarInfoBatch", [v2Trusted]);
|
|
2289
|
-
const registeredAvatarsSet = new Set(trustedAvatarsInfo.filter((a) => a !== null).map((a) => normalizeAddress(a.avatar)));
|
|
2290
|
-
const pending = v2Trusted.filter((addr) => !registeredAvatarsSet.has(normalizeAddress(addr)));
|
|
2291
|
-
return checksumAddresses(pending);
|
|
2292
|
-
}
|
|
2293
|
-
}
|
|
2294
|
-
}
|
|
2295
|
-
// src/methods/transaction.ts
|
|
2296
|
-
function calculateCircleAmounts(value, timestamp) {
|
|
2297
|
-
const attoCircles = BigInt(value);
|
|
2298
|
-
const circles = CirclesConverter.attoCirclesToCircles(attoCircles);
|
|
2299
|
-
const attoCrc = CirclesConverter.attoCirclesToAttoCrc(attoCircles, BigInt(timestamp));
|
|
2300
|
-
const crc = CirclesConverter.attoCirclesToCircles(attoCrc);
|
|
2301
|
-
const staticAttoCircles = CirclesConverter.attoCirclesToAttoStaticCircles(attoCircles, BigInt(timestamp));
|
|
2302
|
-
const staticCircles = CirclesConverter.attoCirclesToCircles(staticAttoCircles);
|
|
2303
|
-
return {
|
|
2304
|
-
attoCircles,
|
|
2305
|
-
circles,
|
|
2306
|
-
staticAttoCircles,
|
|
2307
|
-
staticCircles,
|
|
2308
|
-
attoCrc,
|
|
2309
|
-
crc
|
|
2310
|
-
};
|
|
2311
|
-
}
|
|
2312
|
-
|
|
2313
|
-
class TransactionMethods {
|
|
2314
|
-
client;
|
|
2315
|
-
constructor(client) {
|
|
2316
|
-
this.client = client;
|
|
2317
|
-
}
|
|
2318
|
-
getTransactionHistory(avatar, limit = 50, sortOrder = "DESC") {
|
|
2319
|
-
const normalized = normalizeAddress(avatar);
|
|
2320
|
-
const filter = [
|
|
2321
|
-
{
|
|
2322
|
-
Type: "Conjunction",
|
|
2323
|
-
ConjunctionType: "And",
|
|
2324
|
-
Predicates: [
|
|
2325
|
-
{
|
|
2326
|
-
Type: "FilterPredicate",
|
|
2327
|
-
FilterType: "Equals",
|
|
2328
|
-
Column: "version",
|
|
2329
|
-
Value: 2
|
|
2330
|
-
},
|
|
2331
|
-
{
|
|
2332
|
-
Type: "Conjunction",
|
|
2333
|
-
ConjunctionType: "Or",
|
|
2334
|
-
Predicates: [
|
|
2335
|
-
{
|
|
2336
|
-
Type: "FilterPredicate",
|
|
2337
|
-
FilterType: "Equals",
|
|
2338
|
-
Column: "from",
|
|
2339
|
-
Value: normalized
|
|
2340
|
-
},
|
|
2341
|
-
{
|
|
2342
|
-
Type: "FilterPredicate",
|
|
2343
|
-
FilterType: "Equals",
|
|
2344
|
-
Column: "to",
|
|
2345
|
-
Value: normalized
|
|
2346
|
-
}
|
|
2347
|
-
]
|
|
2348
|
-
}
|
|
2349
|
-
]
|
|
2350
|
-
}
|
|
2351
|
-
];
|
|
2352
|
-
return new PagedQuery(this.client, {
|
|
2353
|
-
namespace: "V_Crc",
|
|
2354
|
-
table: "TransferSummary",
|
|
2355
|
-
sortOrder,
|
|
2356
|
-
columns: [],
|
|
2357
|
-
filter,
|
|
2358
|
-
limit
|
|
2359
|
-
}, (row) => {
|
|
2360
|
-
const amounts = calculateCircleAmounts(row.value, row.timestamp);
|
|
2361
|
-
const result = {
|
|
2362
|
-
...row,
|
|
2363
|
-
...amounts
|
|
2364
|
-
};
|
|
2365
|
-
return checksumAddresses(result);
|
|
2366
|
-
});
|
|
2367
|
-
}
|
|
2368
|
-
}
|
|
2369
|
-
// src/methods/group.ts
|
|
2370
|
-
class GroupMethods {
|
|
2371
|
-
client;
|
|
2372
|
-
constructor(client) {
|
|
2373
|
-
this.client = client;
|
|
2374
|
-
}
|
|
2375
|
-
async findGroups(limit = 50, params) {
|
|
2376
|
-
const query = this.getGroups(limit, params, "DESC");
|
|
2377
|
-
const results = [];
|
|
2378
|
-
while (await query.queryNextPage()) {
|
|
2379
|
-
results.push(...query.currentPage.results);
|
|
2380
|
-
if (results.length >= limit) {
|
|
2381
|
-
break;
|
|
2382
|
-
}
|
|
2383
|
-
if (!query.currentPage.hasMore) {
|
|
2384
|
-
break;
|
|
2385
|
-
}
|
|
2386
|
-
}
|
|
2387
|
-
return results.slice(0, limit);
|
|
2388
|
-
}
|
|
2389
|
-
getGroupMemberships(avatar, limit = 50, sortOrder = "DESC") {
|
|
2390
|
-
const normalized = normalizeAddress(avatar);
|
|
2391
|
-
return new PagedQuery(this.client, {
|
|
2392
|
-
namespace: "V_CrcV2",
|
|
2393
|
-
table: "GroupMemberships",
|
|
2394
|
-
sortOrder,
|
|
2395
|
-
columns: [
|
|
2396
|
-
"blockNumber",
|
|
2397
|
-
"timestamp",
|
|
2398
|
-
"transactionIndex",
|
|
2399
|
-
"logIndex",
|
|
2400
|
-
"transactionHash",
|
|
2401
|
-
"group",
|
|
2402
|
-
"member",
|
|
2403
|
-
"expiryTime"
|
|
2404
|
-
],
|
|
2405
|
-
filter: [
|
|
2406
|
-
{
|
|
2407
|
-
Type: "FilterPredicate",
|
|
2408
|
-
FilterType: "Equals",
|
|
2409
|
-
Column: "member",
|
|
2410
|
-
Value: normalized
|
|
2411
|
-
}
|
|
2412
|
-
],
|
|
2413
|
-
limit
|
|
2414
|
-
}, (row) => checksumAddresses(row));
|
|
2415
|
-
}
|
|
2416
|
-
getGroupHolders(groupAddress, limit = 100) {
|
|
2417
|
-
const normalized = normalizeAddress(groupAddress);
|
|
2418
|
-
return new PagedQuery(this.client, {
|
|
2419
|
-
namespace: "V_CrcV2",
|
|
2420
|
-
table: "GroupTokenHoldersBalance",
|
|
2421
|
-
sortOrder: "DESC",
|
|
2422
|
-
columns: ["group", "holder", "totalBalance", "demurragedTotalBalance", "fractionOwnership"],
|
|
2423
|
-
cursorColumns: [
|
|
2424
|
-
{
|
|
2425
|
-
name: "holder",
|
|
2426
|
-
sortOrder: "ASC"
|
|
2427
|
-
}
|
|
2428
|
-
],
|
|
2429
|
-
orderColumns: [
|
|
2430
|
-
{ Column: "totalBalance", SortOrder: "DESC" },
|
|
2431
|
-
{ Column: "holder", SortOrder: "ASC" }
|
|
2432
|
-
],
|
|
2433
|
-
filter: [
|
|
2434
|
-
{
|
|
2435
|
-
Type: "FilterPredicate",
|
|
2436
|
-
FilterType: "Equals",
|
|
2437
|
-
Column: "group",
|
|
2438
|
-
Value: normalized
|
|
2439
|
-
}
|
|
2440
|
-
],
|
|
2441
|
-
limit,
|
|
2442
|
-
rowTransformer: (row) => {
|
|
2443
|
-
const transformed = {
|
|
2444
|
-
...row,
|
|
2445
|
-
totalBalance: BigInt(row.totalBalance),
|
|
2446
|
-
demurragedTotalBalance: BigInt(row.demurragedTotalBalance)
|
|
2447
|
-
};
|
|
2448
|
-
return checksumAddresses(transformed);
|
|
2449
|
-
}
|
|
2450
|
-
});
|
|
2451
|
-
}
|
|
2452
|
-
getGroupMembers(groupAddress, limit = 100, sortOrder = "DESC") {
|
|
2453
|
-
const normalized = normalizeAddress(groupAddress);
|
|
2454
|
-
return new PagedQuery(this.client, {
|
|
2455
|
-
namespace: "V_CrcV2",
|
|
2456
|
-
table: "GroupMemberships",
|
|
2457
|
-
sortOrder,
|
|
2458
|
-
columns: [
|
|
2459
|
-
"blockNumber",
|
|
2460
|
-
"timestamp",
|
|
2461
|
-
"transactionIndex",
|
|
2462
|
-
"logIndex",
|
|
2463
|
-
"transactionHash",
|
|
2464
|
-
"group",
|
|
2465
|
-
"member",
|
|
2466
|
-
"expiryTime"
|
|
2467
|
-
],
|
|
2468
|
-
filter: [
|
|
2469
|
-
{
|
|
2470
|
-
Type: "FilterPredicate",
|
|
2471
|
-
FilterType: "Equals",
|
|
2472
|
-
Column: "group",
|
|
2473
|
-
Value: normalized
|
|
2474
|
-
}
|
|
2475
|
-
],
|
|
2476
|
-
limit
|
|
2477
|
-
}, (row) => checksumAddresses(row));
|
|
2478
|
-
}
|
|
2479
|
-
getGroups(limit = 50, params, sortOrder = "DESC") {
|
|
2480
|
-
const filter = [];
|
|
2481
|
-
if (params) {
|
|
2482
|
-
if (params.nameStartsWith) {
|
|
2483
|
-
filter.push({
|
|
2484
|
-
Type: "FilterPredicate",
|
|
2485
|
-
FilterType: "Like",
|
|
2486
|
-
Column: "name",
|
|
2487
|
-
Value: params.nameStartsWith + "%"
|
|
2488
|
-
});
|
|
2489
|
-
}
|
|
2490
|
-
if (params.symbolStartsWith) {
|
|
2491
|
-
filter.push({
|
|
2492
|
-
Type: "FilterPredicate",
|
|
2493
|
-
FilterType: "Like",
|
|
2494
|
-
Column: "symbol",
|
|
2495
|
-
Value: params.symbolStartsWith + "%"
|
|
2496
|
-
});
|
|
2497
|
-
}
|
|
2498
|
-
if (params.groupAddressIn && params.groupAddressIn.length > 0) {
|
|
2499
|
-
const addressPredicates = params.groupAddressIn.map((addr) => ({
|
|
2500
|
-
Type: "FilterPredicate",
|
|
2501
|
-
FilterType: "Equals",
|
|
2502
|
-
Column: "group",
|
|
2503
|
-
Value: normalizeAddress(addr)
|
|
2504
|
-
}));
|
|
2505
|
-
if (addressPredicates.length === 1) {
|
|
2506
|
-
filter.push(addressPredicates[0]);
|
|
2507
|
-
} else {
|
|
2508
|
-
filter.push({
|
|
2509
|
-
Type: "Conjunction",
|
|
2510
|
-
ConjunctionType: "Or",
|
|
2511
|
-
Predicates: addressPredicates
|
|
2512
|
-
});
|
|
2513
|
-
}
|
|
2514
|
-
}
|
|
2515
|
-
if (params.groupTypeIn && params.groupTypeIn.length > 0) {
|
|
2516
|
-
const typePredicates = params.groupTypeIn.map((type) => ({
|
|
2517
|
-
Type: "FilterPredicate",
|
|
2518
|
-
FilterType: "Equals",
|
|
2519
|
-
Column: "type",
|
|
2520
|
-
Value: type
|
|
2521
|
-
}));
|
|
2522
|
-
if (typePredicates.length === 1) {
|
|
2523
|
-
filter.push(typePredicates[0]);
|
|
2524
|
-
} else {
|
|
2525
|
-
filter.push({
|
|
2526
|
-
Type: "Conjunction",
|
|
2527
|
-
ConjunctionType: "Or",
|
|
2528
|
-
Predicates: typePredicates
|
|
2529
|
-
});
|
|
2530
|
-
}
|
|
2531
|
-
}
|
|
2532
|
-
if (params.ownerIn && params.ownerIn.length > 0) {
|
|
2533
|
-
const ownerPredicates = params.ownerIn.map((addr) => ({
|
|
2534
|
-
Type: "FilterPredicate",
|
|
2535
|
-
FilterType: "Equals",
|
|
2536
|
-
Column: "owner",
|
|
2537
|
-
Value: normalizeAddress(addr)
|
|
2538
|
-
}));
|
|
2539
|
-
if (ownerPredicates.length === 1) {
|
|
2540
|
-
filter.push(ownerPredicates[0]);
|
|
2541
|
-
} else {
|
|
2542
|
-
filter.push({
|
|
2543
|
-
Type: "Conjunction",
|
|
2544
|
-
ConjunctionType: "Or",
|
|
2545
|
-
Predicates: ownerPredicates
|
|
2546
|
-
});
|
|
2547
|
-
}
|
|
2548
|
-
}
|
|
2549
|
-
if (params.mintHandlerEquals) {
|
|
2550
|
-
filter.push({
|
|
2551
|
-
Type: "FilterPredicate",
|
|
2552
|
-
FilterType: "Equals",
|
|
2553
|
-
Column: "mintHandler",
|
|
2554
|
-
Value: normalizeAddress(params.mintHandlerEquals)
|
|
2555
|
-
});
|
|
2556
|
-
}
|
|
2557
|
-
if (params.treasuryEquals) {
|
|
2558
|
-
filter.push({
|
|
2559
|
-
Type: "FilterPredicate",
|
|
2560
|
-
FilterType: "Equals",
|
|
2561
|
-
Column: "treasury",
|
|
2562
|
-
Value: normalizeAddress(params.treasuryEquals)
|
|
2563
|
-
});
|
|
2564
|
-
}
|
|
2565
|
-
}
|
|
2566
|
-
const finalFilter = filter.length > 1 ? [
|
|
2567
|
-
{
|
|
2568
|
-
Type: "Conjunction",
|
|
2569
|
-
ConjunctionType: "And",
|
|
2570
|
-
Predicates: filter
|
|
2571
|
-
}
|
|
2572
|
-
] : filter;
|
|
2573
|
-
return new PagedQuery(this.client, {
|
|
2574
|
-
namespace: "V_CrcV2",
|
|
2575
|
-
table: "Groups",
|
|
2576
|
-
sortOrder,
|
|
2577
|
-
columns: [
|
|
2578
|
-
"blockNumber",
|
|
2579
|
-
"timestamp",
|
|
2580
|
-
"transactionIndex",
|
|
2581
|
-
"logIndex",
|
|
2582
|
-
"transactionHash",
|
|
2583
|
-
"group",
|
|
2584
|
-
"type",
|
|
2585
|
-
"owner",
|
|
2586
|
-
"mintPolicy",
|
|
2587
|
-
"mintHandler",
|
|
2588
|
-
"treasury",
|
|
2589
|
-
"service",
|
|
2590
|
-
"feeCollection",
|
|
2591
|
-
"memberCount",
|
|
2592
|
-
"name",
|
|
2593
|
-
"symbol",
|
|
2594
|
-
"cidV0Digest",
|
|
2595
|
-
"erc20WrapperDemurraged",
|
|
2596
|
-
"erc20WrapperStatic"
|
|
2597
|
-
],
|
|
2598
|
-
filter: finalFilter,
|
|
2599
|
-
limit
|
|
2600
|
-
}, (row) => checksumAddresses(row));
|
|
2601
|
-
}
|
|
2602
|
-
}
|
|
2603
|
-
// src/rpc.ts
|
|
2604
|
-
class CirclesRpc {
|
|
2605
|
-
client;
|
|
2606
|
-
pathfinder;
|
|
2607
|
-
query;
|
|
2608
|
-
trust;
|
|
2609
|
-
balance;
|
|
2610
|
-
avatar;
|
|
2611
|
-
profile;
|
|
2612
|
-
token;
|
|
2613
|
-
invitation;
|
|
2614
|
-
transaction;
|
|
2615
|
-
group;
|
|
2616
|
-
constructor(rpcUrl = "https://rpc.circlesubi.network/") {
|
|
2617
|
-
this.client = new RpcClient(rpcUrl);
|
|
2618
|
-
this.pathfinder = new PathfinderMethods(this.client);
|
|
2619
|
-
this.query = new QueryMethods(this.client);
|
|
2620
|
-
this.trust = new TrustMethods(this.client);
|
|
2621
|
-
this.balance = new BalanceMethods(this.client);
|
|
2622
|
-
this.avatar = new AvatarMethods(this.client);
|
|
2623
|
-
this.profile = new ProfileMethods(this.client);
|
|
2624
|
-
this.token = new TokenMethods(this.client);
|
|
2625
|
-
this.invitation = new InvitationMethods(this.client);
|
|
2626
|
-
this.transaction = new TransactionMethods(this.client);
|
|
2627
|
-
this.group = new GroupMethods(this.client);
|
|
2628
|
-
}
|
|
2629
|
-
setRpcUrl(rpcUrl) {
|
|
2630
|
-
this.client.setRpcUrl(rpcUrl);
|
|
2631
|
-
}
|
|
2632
|
-
getRpcUrl() {
|
|
2633
|
-
return this.client.getRpcUrl();
|
|
2634
|
-
}
|
|
2635
|
-
}
|
|
2636
|
-
export {
|
|
2637
|
-
parseStringsToBigInt,
|
|
2638
|
-
parseRpcSubscriptionMessage,
|
|
2639
|
-
parseRpcEvent,
|
|
2640
|
-
normalizeAddresses,
|
|
2641
|
-
normalizeAddress,
|
|
2642
|
-
isCirclesEvent,
|
|
2643
|
-
TrustMethods,
|
|
2644
|
-
TransactionMethods,
|
|
2645
|
-
TokenMethods,
|
|
2646
|
-
RpcError,
|
|
2647
|
-
RpcClient,
|
|
2648
|
-
QueryMethods,
|
|
2649
|
-
ProfileMethods,
|
|
2650
|
-
PathfinderMethods,
|
|
2651
|
-
PagedQuery,
|
|
2652
|
-
Observable,
|
|
2653
|
-
InvitationMethods,
|
|
2654
|
-
GroupMethods,
|
|
2655
|
-
CirclesRpc,
|
|
2656
|
-
BalanceMethods,
|
|
2657
|
-
AvatarMethods
|
|
2658
|
-
};
|
|
1
|
+
function i(J){return J&&typeof J==="object"&&typeof J.$event==="string"&&typeof J.blockNumber==="number"&&typeof J.transactionIndex==="number"&&typeof J.logIndex==="number"}var n=(J)=>BigInt(J),I=(J)=>parseInt(J,16),DJ=(J)=>{if(J.startsWith("0x"))J=J.slice(2);if(J.length%2!==0)throw Error("Invalid hex string");let Z=new Uint8Array(J.length/2);for(let $=0;$<J.length;$+=2)Z[$/2]=parseInt(J.substr($,2),16);return Z};function PJ(J,Z){if(typeof Z==="string"&&Z.startsWith("0x")){let $=Z.slice(2);if($.length===40)return Z;if($.length===64){if(J.toLowerCase().includes("digest")||J.toLowerCase().includes("data")||J.toLowerCase().includes("bytes"))return DJ(Z);try{return n(Z)}catch{return Z}}try{let G=I(Z);if(G<Number.MAX_SAFE_INTEGER)return G;return n(Z)}catch{return Z}}if(Z==="true")return!0;if(Z==="false")return!1;return Z}function f(J){let{event:Z,values:$}=J,G={$event:Z,blockNumber:$.blockNumber?I($.blockNumber):0,timestamp:$.timestamp?I($.timestamp):void 0,transactionIndex:$.transactionIndex?I($.transactionIndex):0,logIndex:$.logIndex?I($.logIndex):0,transactionHash:$.transactionHash};for(let[Y,W]of Object.entries($)){if(["blockNumber","timestamp","transactionIndex","logIndex","transactionHash"].includes(Y))continue;G[Y]=PJ(Y,W)}return G}function x(J){return J.map(f)}class O{_subscribers=[];subscribe(J){return this._subscribers.push(J),()=>{let Z=this._subscribers.indexOf(J);if(Z>-1)this._subscribers.splice(Z,1)}}constructor(){this._subscribers=[]}emit(J){this._subscribers.forEach((Z)=>Z(J))}static create(){let J=new O;return{property:J,emit:(Z)=>J.emit(Z)}}}class v extends Error{name;code;source;cause;context;constructor(J,Z,$){super(Z);if(this.name=J,this.code=$?.code,this.source=$?.source??"UNKNOWN",this.cause=$?.cause,this.context=$?.context,Error.captureStackTrace)Error.captureStackTrace(this,this.constructor)}toJSON(){return{name:this.name,message:this.message,code:this.code,source:this.source,context:this.context,cause:this.cause instanceof Error?{name:this.cause.name,message:this.cause.message}:this.cause,stack:this.stack}}toString(){let J=`[${this.source}] ${this.name}: ${this.message}`;if(this.code)J+=` (Code: ${this.code})`;if(this.context)J+=`
|
|
2
|
+
Context: ${JSON.stringify(this.context,null,2)}`;return J}}class X extends v{constructor(J,Z){super("RpcError",J,{...Z,source:Z?.source??"RPC_REQUEST"})}static connectionFailed(J,Z){return new X("Failed to connect to RPC endpoint",{code:"RPC_CONNECTION_FAILED",source:"RPC_CONNECTION",cause:Z,context:{url:J}})}static timeout(J,Z){return new X("RPC request timed out",{code:"RPC_TIMEOUT",source:"RPC_TIMEOUT",context:{method:J,timeout:Z}})}static invalidResponse(J,Z){return new X("Invalid RPC response",{code:"RPC_INVALID_RESPONSE",source:"RPC_RESPONSE",context:{method:J,response:Z}})}static fromJsonRpcError(J){return new X(J.message,{code:J.code,source:"RPC_RESPONSE",context:{data:J.data}})}static websocketError(J,Z){return new X(J,{code:"RPC_WEBSOCKET_ERROR",source:"RPC_WEBSOCKET",cause:Z})}}class A{rpcUrl;requestId=0;websocket=null;websocketConnected=!1;pendingResponses={};subscriptionListeners={};reconnectAttempt=0;initialBackoff=2000;maxBackoff=120000;constructor(J){this.rpcUrl=J}async call(J,Z){this.requestId++;let $={jsonrpc:"2.0",id:this.requestId,method:J,params:Z};try{let G=await fetch(this.rpcUrl,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify($)});if(!G.ok)throw X.connectionFailed(this.rpcUrl,Error(`HTTP ${G.status}: ${G.statusText}`));let Y=await G.json();if(Y.error)throw X.fromJsonRpcError(Y.error);if(Y.result===void 0)throw X.invalidResponse(J,Y);return Y.result}catch(G){if(G instanceof X)throw G;throw X.connectionFailed(this.rpcUrl,G)}}setRpcUrl(J){this.rpcUrl=J}getRpcUrl(){return this.rpcUrl}connect(){return new Promise((J)=>{let Z=this.rpcUrl.replace("http","ws");if(Z.endsWith("/"))Z+="ws";else Z+="/ws";this.websocket=new WebSocket(Z),this.websocket.onopen=()=>{console.log("WebSocket connected"),this.websocketConnected=!0,this.reconnectAttempt=0,J()},this.websocket.onmessage=($)=>{let G=JSON.parse($.data),{id:Y,method:W,params:K}=G;if(Y!==void 0&&this.pendingResponses[Y])this.pendingResponses[Y].resolve(G),delete this.pendingResponses[Y];if(W==="eth_subscription"&&K){let{subscription:M,result:N}=K;if(this.subscriptionListeners[M])this.subscriptionListeners[M].forEach((q)=>q(N))}},this.websocket.onclose=()=>{console.warn("WebSocket closed"),this.websocketConnected=!1},this.websocket.onerror=($)=>{console.error("WebSocket error:",$),this.websocketConnected=!1,this.scheduleReconnect()}})}scheduleReconnect(){let J=Math.min(this.initialBackoff*Math.pow(2,this.reconnectAttempt),this.maxBackoff),Z=J*(Math.random()*0.5),$=J+Z;console.log(`Reconnecting in ${Math.round($)}ms (attempt #${this.reconnectAttempt+1})`),this.reconnectAttempt++,setTimeout(()=>{this.reconnect()},$)}async reconnect(){if(this.websocketConnected)return;try{await this.connect(),console.log("Reconnection successful")}catch(J){console.error("Reconnection attempt failed:",J),this.scheduleReconnect()}}sendMessage(J,Z,$=5000){if(!this.websocket||this.websocket.readyState!==WebSocket.OPEN)return Promise.reject(X.connectionFailed(this.rpcUrl));let G=this.requestId++,Y={jsonrpc:"2.0",method:J,params:Z,id:G};return new Promise((W,K)=>{this.pendingResponses[G]={resolve:W,reject:K},this.websocket.send(JSON.stringify(Y)),setTimeout(()=>{if(this.pendingResponses[G])this.pendingResponses[G].reject(X.timeout(J,$)),delete this.pendingResponses[G]},$)})}async subscribe(J){let Z=J?.toLowerCase();if(!this.websocketConnected)await this.connect();let $=O.create(),G=JSON.stringify(Z?{address:Z}:{}),W=(await this.sendMessage("eth_subscribe",["circles",G])).result;if(!this.subscriptionListeners[W])this.subscriptionListeners[W]=[];return this.subscriptionListeners[W].push((K)=>{x(K).forEach((M)=>$.emit(M))}),$.property}}var b=BigInt(4294967295),o=BigInt(32);function OJ(J,Z=!1){if(Z)return{h:Number(J&b),l:Number(J>>o&b)};return{h:Number(J>>o&b)|0,l:Number(J&b)|0}}function t(J,Z=!1){let $=J.length,G=new Uint32Array($),Y=new Uint32Array($);for(let W=0;W<$;W++){let{h:K,l:M}=OJ(J[W],Z);[G[W],Y[W]]=[K,M]}return[G,Y]}var a=(J,Z,$)=>J<<$|Z>>>32-$,s=(J,Z,$)=>Z<<$|J>>>32-$,r=(J,Z,$)=>Z<<$-32|J>>>64-$,e=(J,Z,$)=>J<<$-32|Z>>>64-$;/*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) */function IJ(J){return J instanceof Uint8Array||ArrayBuffer.isView(J)&&J.constructor.name==="Uint8Array"}function y(J){if(!Number.isSafeInteger(J)||J<0)throw Error("positive integer expected, got "+J)}function L(J,...Z){if(!IJ(J))throw Error("Uint8Array expected");if(Z.length>0&&!Z.includes(J.length))throw Error("Uint8Array expected of length "+Z+", got length="+J.length)}function h(J,Z=!0){if(J.destroyed)throw Error("Hash instance has been destroyed");if(Z&&J.finished)throw Error("Hash#digest() has already been called")}function JJ(J,Z){L(J);let $=Z.outputLen;if(J.length<$)throw Error("digestInto() expects output buffer of length at least "+$)}function ZJ(J){return new Uint32Array(J.buffer,J.byteOffset,Math.floor(J.byteLength/4))}function m(...J){for(let Z=0;Z<J.length;Z++)J[Z].fill(0)}var LJ=(()=>new Uint8Array(new Uint32Array([287454020]).buffer)[0]===68)();function zJ(J){return J<<24&4278190080|J<<8&16711680|J>>>8&65280|J>>>24&255}function _J(J){for(let Z=0;Z<J.length;Z++)J[Z]=zJ(J[Z]);return J}var p=LJ?(J)=>J:_J;function BJ(J){if(typeof J!=="string")throw Error("string expected");return new Uint8Array(new TextEncoder().encode(J))}function u(J){if(typeof J==="string")J=BJ(J);return L(J),J}class c{}function $J(J){let Z=(G)=>J().update(u(G)).digest(),$=J();return Z.outputLen=$.outputLen,Z.blockLen=$.blockLen,Z.create=()=>J(),Z}var RJ=BigInt(0),z=BigInt(1),TJ=BigInt(2),EJ=BigInt(7),SJ=BigInt(256),HJ=BigInt(113),WJ=[],KJ=[],QJ=[];for(let J=0,Z=z,$=1,G=0;J<24;J++){[$,G]=[G,(2*$+3*G)%5],WJ.push(2*(5*G+$)),KJ.push((J+1)*(J+2)/2%64);let Y=RJ;for(let W=0;W<7;W++)if(Z=(Z<<z^(Z>>EJ)*HJ)%SJ,Z&TJ)Y^=z<<(z<<BigInt(W))-z;QJ.push(Y)}var MJ=t(QJ,!0),kJ=MJ[0],wJ=MJ[1],GJ=(J,Z,$)=>$>32?r(J,Z,$):a(J,Z,$),YJ=(J,Z,$)=>$>32?e(J,Z,$):s(J,Z,$);function CJ(J,Z=24){let $=new Uint32Array(10);for(let G=24-Z;G<24;G++){for(let K=0;K<10;K++)$[K]=J[K]^J[K+10]^J[K+20]^J[K+30]^J[K+40];for(let K=0;K<10;K+=2){let M=(K+8)%10,N=(K+2)%10,q=$[N],U=$[N+1],d=GJ(q,U,1)^$[M],g=YJ(q,U,1)^$[M+1];for(let P=0;P<50;P+=10)J[K+P]^=d,J[K+P+1]^=g}let Y=J[2],W=J[3];for(let K=0;K<24;K++){let M=KJ[K],N=GJ(Y,W,M),q=YJ(Y,W,M),U=WJ[K];Y=J[U],W=J[U+1],J[U]=N,J[U+1]=q}for(let K=0;K<50;K+=10){for(let M=0;M<10;M++)$[M]=J[K+M];for(let M=0;M<10;M++)J[K+M]^=~$[(M+2)%10]&$[(M+4)%10]}J[0]^=kJ[G],J[1]^=wJ[G]}m($)}class l extends c{constructor(J,Z,$,G=!1,Y=24){super();if(this.pos=0,this.posOut=0,this.finished=!1,this.destroyed=!1,this.enableXOF=!1,this.blockLen=J,this.suffix=Z,this.outputLen=$,this.enableXOF=G,this.rounds=Y,y($),!(0<J&&J<200))throw Error("only keccak-f1600 function is supported");this.state=new Uint8Array(200),this.state32=ZJ(this.state)}clone(){return this._cloneInto()}keccak(){p(this.state32),CJ(this.state32,this.rounds),p(this.state32),this.posOut=0,this.pos=0}update(J){h(this),J=u(J),L(J);let{blockLen:Z,state:$}=this,G=J.length;for(let Y=0;Y<G;){let W=Math.min(Z-this.pos,G-Y);for(let K=0;K<W;K++)$[this.pos++]^=J[Y++];if(this.pos===Z)this.keccak()}return this}finish(){if(this.finished)return;this.finished=!0;let{state:J,suffix:Z,pos:$,blockLen:G}=this;if(J[$]^=Z,(Z&128)!==0&&$===G-1)this.keccak();J[G-1]^=128,this.keccak()}writeInto(J){h(this,!1),L(J),this.finish();let Z=this.state,{blockLen:$}=this;for(let G=0,Y=J.length;G<Y;){if(this.posOut>=$)this.keccak();let W=Math.min($-this.posOut,Y-G);J.set(Z.subarray(this.posOut,this.posOut+W),G),this.posOut+=W,G+=W}return J}xofInto(J){if(!this.enableXOF)throw Error("XOF is not possible for this instance");return this.writeInto(J)}xof(J){return y(J),this.xofInto(new Uint8Array(J))}digestInto(J){if(JJ(J,this),this.finished)throw Error("digest() was already called");return this.writeInto(J),this.destroy(),J}digest(){return this.digestInto(new Uint8Array(this.outputLen))}destroy(){this.destroyed=!0,m(this.state)}_cloneInto(J){let{blockLen:Z,suffix:$,outputLen:G,rounds:Y,enableXOF:W}=this;return J||(J=new l(Z,$,G,W,Y)),J.state32.set(this.state32),J.pos=this.pos,J.posOut=this.posOut,J.finished=this.finished,J.rounds=Y,J.suffix=$,J.outputLen=G,J.enableXOF=W,J.destroyed=this.destroyed,J}}var gJ=(J,Z,$)=>$J(()=>new l(Z,J,$));var VJ=(()=>gJ(1,136,32))();var qJ=[];for(let J=0;J<256;J++)qJ[J]=J.toString(16).padStart(2,"0");function NJ(J){let Z="0x";for(let $=0;$<J.length;$++)Z+=qJ[J[$]];return Z}function UJ(J){let Z=J.toLowerCase().replace("0x",""),$=NJ(VJ(new TextEncoder().encode(Z))).slice(2),G="0x";for(let Y=0;Y<Z.length;Y++)G+=parseInt($[Y],16)>=8?Z[Y].toUpperCase():Z[Y];return G}function Q(J){return J.toLowerCase()}function xJ(J){return J.map((Z)=>Q(Z))}function AJ(J){return UJ(J)}function bJ(J){if(typeof J!=="string")return!1;let Z=J.replace("0x","");return Z.length===40&&/^[0-9a-fA-F]{40}$/.test(Z)}function V(J){if(J===null||J===void 0)return J;if(bJ(J))return AJ(J);if(Array.isArray(J))return J.map((Z)=>V(Z));if(typeof J==="object"&&J!==null){let Z={};for(let $ in J)if(Object.prototype.hasOwnProperty.call(J,$))Z[$]=V(J[$]);return Z}return J}function XJ(J){return{Source:Q(J.from),Sink:Q(J.to),TargetFlow:J.targetFlow.toString(),WithWrap:J.useWrappedBalances,FromTokens:J.fromTokens?.map(Q),ToTokens:J.toTokens?.map(Q),ExcludedFromTokens:J.excludeFromTokens?.map(Q),ExcludedToTokens:J.excludeToTokens?.map(Q),SimulatedBalances:J.simulatedBalances?.map((Z)=>({Holder:Q(Z.holder),Token:Q(Z.token),Amount:Z.amount.toString(),IsWrapped:Z.isWrapped,IsStatic:Z.isStatic})),SimulatedTrusts:J.simulatedTrusts?.map((Z)=>({Truster:Q(Z.truster),Trustee:Q(Z.trustee)})),MaxTransfers:J.maxTransfers}}function F(J){let Z={};for(let $ in J){let G=J[$];if(G===null||G===void 0)Z[$]=G;else if(typeof G==="string"&&/^\d+$/.test(G))Z[$]=BigInt(G);else if(typeof G==="object"&&!Array.isArray(G))Z[$]=F(G);else if(Array.isArray(G))Z[$]=G.map((Y)=>typeof Y==="object"&&Y!==null?F(Y):Y);else Z[$]=G}return Z}var VZ=BigInt(96)*BigInt(1000000000000000000),jJ=BigInt("9999999999999999999999999999999999999");class _{client;constructor(J){this.client=J}async findPath(J){let Z=XJ(J),$=await this.client.call("circlesV2_findPath",[Z]),G=F($);return V(G)}async findMaxFlow(J){let Z=await this.findPath({...J,targetFlow:jJ});return BigInt(Z.maxFlow)}}class B{client;constructor(J){this.client=J}async query(J){let Z=await this.client.call("circles_query",[J]);return V(Z)}async tables(){return this.client.call("circles_tables",[])}async events(J,Z,$=null,G=null,Y=!1){let W=await this.client.call("circles_events",[J,Z,$,G,Y]);return V(W)}}var fJ=[{name:"blockNumber",sortOrder:"DESC"},{name:"transactionIndex",sortOrder:"DESC"},{name:"logIndex",sortOrder:"DESC"}];class j{params;client;rowTransformer;cursorColumns;orderColumns;get currentPage(){return this._currentPage}_currentPage;constructor(J,Z,$){this.client=J,this.params=Z,this.rowTransformer=$||Z.rowTransformer,this.orderColumns=Z.orderColumns,this.cursorColumns=Z.cursorColumns||this.buildEventCursorColumns()}buildEventCursorColumns(){let J=fJ.map((Z)=>({...Z,sortOrder:this.params.sortOrder}));if(this.params.table==="TransferBatch")J.push({name:"batchIndex",sortOrder:this.params.sortOrder});return J}transformCursorValue(J,Z){if(Z)return Z(J);if(typeof J==="bigint")return J.toString();return J}createEqualityPredicate(J,Z){return{Type:"FilterPredicate",FilterType:"Equals",Column:J.name,Value:this.transformCursorValue(Z,J.toValue)}}createComparisonPredicate(J,Z){return{Type:"FilterPredicate",FilterType:J.sortOrder==="ASC"?"GreaterThan":"LessThan",Column:J.name,Value:this.transformCursorValue(Z,J.toValue)}}buildCursorFilter(J){if(!J)return[];let Z=[];for(let $=0;$<this.cursorColumns.length;$++){let G=this.cursorColumns[$],Y=J[G.name];if(Y===void 0)continue;if($===0)Z.push(this.createComparisonPredicate(G,Y));else{let W=[];for(let K=0;K<$;K++){let M=this.cursorColumns[K],N=J[M.name];if(N!==void 0)W.push(this.createEqualityPredicate(M,N))}W.push(this.createComparisonPredicate(G,Y)),Z.push({Type:"Conjunction",ConjunctionType:"And",Predicates:W})}}if(Z.length===0)return[];return[{Type:"Conjunction",ConjunctionType:"Or",Predicates:Z}]}buildOrderBy(){if(this.orderColumns&&this.orderColumns.length>0)return this.orderColumns;return this.cursorColumns.map((J)=>({Column:J.name,SortOrder:J.sortOrder}))}combineFilters(J,Z){if(!J?.length&&!Z?.length)return[];if(!J?.length)return Z||[];if(!Z?.length)return J;return[{Type:"Conjunction",ConjunctionType:"And",Predicates:[...J,...Z]}]}rowsToObjects(J){let{columns:Z,rows:$}=J;return $.map((G)=>{let Y={};return Z.forEach((W,K)=>{Y[W]=G[K]}),this.rowTransformer?this.rowTransformer(Y):Y})}rowToCursor(J){let Z={};for(let $ of this.cursorColumns)Z[$.name]=J[$.name];return Z}getCursors(J){if(J.length===0)return{};return{first:this.rowToCursor(J[0]),last:this.rowToCursor(J[J.length-1])}}async queryNextPage(){let J=this.buildCursorFilter(this._currentPage?.lastCursor),Z=this.combineFilters(this.params.filter,J),$={Namespace:this.params.namespace,Table:this.params.table,Columns:this.params.columns,Filter:Z,Order:this.buildOrderBy(),Limit:this.params.limit},G=await this.client.call("circles_query",[$]),Y=this.rowsToObjects(G),W=this.getCursors(Y);return this._currentPage={limit:this.params.limit,size:Y.length,firstCursor:W.first,lastCursor:W.last,sortOrder:this.params.sortOrder,hasMore:Y.length===this.params.limit,results:Y},Y.length>0}reset(){this._currentPage=void 0}}class R{client;constructor(J){this.client=J}transformQueryResponse(J){let{columns:Z,rows:$}=J;return $.map((G)=>{let Y={};return Z.forEach((W,K)=>{Y[W]=G[K]}),Y})}async getCommonTrust(J,Z){let $=await this.client.call("circles_getCommonTrust",[Q(J),Q(Z)]);return V($)}getTrustRelations(J,Z=100,$="DESC"){let G=Q(J),Y=[{Type:"Conjunction",ConjunctionType:"And",Predicates:[{Type:"FilterPredicate",FilterType:"Equals",Column:"version",Value:2},{Type:"Conjunction",ConjunctionType:"Or",Predicates:[{Type:"FilterPredicate",FilterType:"Equals",Column:"trustee",Value:G},{Type:"FilterPredicate",FilterType:"Equals",Column:"truster",Value:G}]}]}];return new j(this.client,{namespace:"V_Crc",table:"TrustRelations",sortOrder:$,columns:["blockNumber","timestamp","transactionIndex","logIndex","transactionHash","version","trustee","truster","expiryTime"],filter:Y,limit:Z},(W)=>V(W))}async getAggregatedTrustRelations(J){let Z=Q(J),$=this.getTrustRelations(Z,1000),G=[];while(await $.queryNextPage())if(G.push(...$.currentPage.results),!$.currentPage.hasMore)break;let Y={};G.forEach((K)=>{let M=Q(K.truster),N=Q(K.trustee),q=M!==Z?K.truster:K.trustee;if(!Y[q])Y[q]=[];Y[q].push(K)});let W=Object.entries(Y).filter(([K])=>Q(K)!==Z).map(([K,M])=>{let N=Math.max(...M.map((U)=>U.timestamp)),q;if(M.length===2)q="mutuallyTrusts";else if(Q(M[0]?.trustee)===Z)q="trustedBy";else if(Q(M[0]?.truster)===Z)q="trusts";else throw Error("Unexpected trust list row. Couldn't determine trust relation.");return{subjectAvatar:Z,relation:q,objectAvatar:K,timestamp:N}});return V(W)}async getTrustedBy(J){let Z=Q(J),G=(await this.getAggregatedTrustRelations(Z)).filter((Y)=>Y.relation==="trustedBy");return V(G)}async getTrusts(J){let Z=Q(J),G=(await this.getAggregatedTrustRelations(Z)).filter((Y)=>Y.relation==="trusts");return V(G)}async getMutualTrusts(J){let Z=Q(J),G=(await this.getAggregatedTrustRelations(Z)).filter((Y)=>Y.relation==="mutuallyTrusts");return V(G)}}class D{static ONE_64=1n<<64n;static GAMMA_64=18443079296116538654n;static BETA_64=18450409579521241655n;static SECONDS_PER_DAY=86400n;static INFLATION_DAY_ZERO_UNIX=1602720000n;static ATTO_FACTOR=1000000000000000000n;static FACTOR_1E12=1000000000000n;static V1_ACCURACY=100000000n;static V1_INFLATION_PCT_NUM=107n;static V1_INFLATION_PCT_DEN=100n;static PERIOD_SEC=31556952n;static mul64(J,Z){return J*Z>>64n}static mulU(J,Z){return J*Z>>64n}static pow64(J,Z){let $=J,G=Z,Y=this.ONE_64;while(G>0n){if((G&1n)===1n)Y=this.mul64(Y,$);$=this.mul64($,$),G>>=1n}return Y}static ONE_36=1000000000000000000000000000000000000000n;static GAMMA_36=999801332008598957430613406568191166n;static BETA_36=1000198707468214629156271489013303962n;static mul36(J,Z){return J*Z/this.ONE_36}static pow36(J,Z){let $=this.ONE_36,G=J,Y=Z;while(Y>0n){if((Y&1n)===1n)$=this.mul36($,G);G=this.mul36(G,G),Y>>=1n}return $}static attoCirclesToCircles(J){if(J===0n)return 0;let Z=J/this.ATTO_FACTOR,$=J%this.ATTO_FACTOR,G=BigInt(Number.MAX_SAFE_INTEGER);if(Z>G||Z<-G)throw RangeError("Atto value’s integer component exceeds JS double precision.");return Number(Z)+Number($)/Number(this.ATTO_FACTOR)}static circlesToAttoCircles(J){return BigInt(Math.trunc(J*Number(this.ATTO_FACTOR)))}static inflationaryToDemurrage(J,Z){return this.mulU(this.pow64(this.GAMMA_64,Z),J)}static demurrageToInflationary(J,Z){return this.mulU(this.pow64(this.BETA_64,Z),J)}static dayFromTimestamp(J){return(J-this.INFLATION_DAY_ZERO_UNIX)/this.SECONDS_PER_DAY}static attoCirclesToAttoStaticCircles(J,Z=BigInt(Math.floor(Date.now()/1000))){return this.demurrageToInflationary(J,this.dayFromTimestamp(Z))}static attoStaticCirclesToAttoCircles(J,Z=BigInt(Math.floor(Date.now()/1000))){return this.inflationaryToDemurrage(J,this.dayFromTimestamp(Z))}static inflationaryToDemurrageExact(J,Z){let $=this.pow36(this.GAMMA_36,Z);return J*$/this.ONE_36}static demurrageToInflationaryExact(J,Z){let $=this.pow36(this.BETA_36,Z);return J*$/this.ONE_36}static attoCirclesToAttoStaticCirclesExact(J,Z=BigInt(Math.floor(Date.now()/1000))){let $=this.dayFromTimestamp(Z);return this.demurrageToInflationaryExact(J,$)}static attoStaticCirclesToAttoCirclesExact(J,Z=BigInt(Math.floor(Date.now()/1000))){let $=this.dayFromTimestamp(Z);return this.inflationaryToDemurrageExact(J,$)}static truncateToInt64(J){let Z=J/this.FACTOR_1E12,$=9223372036854775807n;return Z>$?$:Z}static blowUpToBigInt(J){return J*this.FACTOR_1E12}static truncateToSixDecimals(J){return this.blowUpToBigInt(this.truncateToInt64(J))}static v1InflateFactor(J){if(J===0n)return this.V1_ACCURACY;return this.V1_ACCURACY*this.V1_INFLATION_PCT_NUM**J/this.V1_INFLATION_PCT_DEN**J}static attoCrcToAttoCircles(J,Z){let $=Z-this.INFLATION_DAY_ZERO_UNIX,G=$/this.PERIOD_SEC,Y=$%this.PERIOD_SEC,W=this.v1InflateFactor(G),K=this.v1InflateFactor(G+1n);return this.v1ToDemurrage(J,W,K,Y,this.PERIOD_SEC)}static attoCirclesToAttoCrc(J,Z){let $=Z-this.INFLATION_DAY_ZERO_UNIX,G=$/this.PERIOD_SEC,Y=$%this.PERIOD_SEC,W=this.v1InflateFactor(G),K=this.v1InflateFactor(G+1n),M=W*(this.PERIOD_SEC-Y)+K*Y;return J*3n*this.V1_ACCURACY*this.PERIOD_SEC/M}static v1ToDemurrage(J,Z,$,G,Y){let W=Z*(Y-G)+$*G;return J*3n*this.V1_ACCURACY*Y/W}}class T{client;constructor(J){this.client=J}async getTotalBalance(J,Z=!0){let $=await this.client.call("circlesV2_getTotalBalance",[Q(J),Z]);return D.circlesToAttoCircles($)}async getTokenBalances(J){let $=(await this.client.call("circles_getTokenBalances",[Q(J)])).map((G)=>F(G));return V($)}}class E{client;constructor(J){this.client=J}async getAvatarInfo(J){let Z=await this.getAvatarInfoBatch([J]);return Z.length>0?Z[0]:void 0}async getAvatarInfoBatch(J){if(J.length===0)return[];let Z=J.map((G)=>Q(G)),$=await this.client.call("circles_getAvatarInfoBatch",[Z]);return V($)}async getNetworkSnapshot(){let J=await this.client.call("circles_getNetworkSnapshot",[]);return V(J)}}class S{client;constructor(J){this.client=J}async getProfileByCid(J){return this.client.call("circles_getProfileByCid",[J])}async getProfileByCidBatch(J){return this.client.call("circles_getProfileByCidBatch",[J])}async getProfileByAddress(J){return this.client.call("circles_getProfileByAddress",[Q(J)])}async getProfileByAddressBatch(J){return this.client.call("circles_getProfileByAddressBatch",[J.map((Z)=>Z===null?null:Q(Z))])}async searchProfiles(J,Z=10,$=0,G){return this.client.call("circles_searchProfiles",[J.toLowerCase(),Z,$,G])}async searchByAddressOrName(J,Z=10,$=0,G){let Y=[],W=/^0x[a-fA-F0-9]{40}$/.test(J);if(W)try{let K=await this.getProfileByAddress(J);if(K){let M={...K,address:J};if(!G||!M.avatarType||G.includes(M.avatarType))Y.push(M)}}catch(K){console.warn("Failed to get profile by address:",K)}try{let K=await this.searchProfiles(J,Z,$,G);if(W&&Y.length>0){let M=J.toLowerCase(),N=K.filter((q)=>q.address?.toLowerCase()!==M);Y.push(...N)}else Y.push(...K)}catch(K){console.warn("Failed to search profiles by text:",K)}return Y.slice(0,Z)}}class H{client;constructor(J){this.client=J}async getTokenInfo(J){let Z=await this.getTokenInfoBatch([J]);return Z.length>0?Z[0]:void 0}async getTokenInfoBatch(J){if(J.length===0)return[];let Z=J.map((Y)=>Q(Y)),G=(await this.client.call("circles_getTokenInfoBatch",[Z])).map((Y)=>F(Y));return V(G)}getTokenHolders(J,Z=100,$="DESC"){let G=Q(J);return new j(this.client,{namespace:"V_CrcV2",table:"BalancesByAccountAndToken",columns:["account","tokenAddress","demurragedTotalBalance"],filter:[{Type:"FilterPredicate",FilterType:"Equals",Column:"tokenAddress",Value:G}],cursorColumns:[{name:"demurragedTotalBalance",sortOrder:$},{name:"account",sortOrder:"ASC"}],orderColumns:[{Column:"demurragedTotalBalance",SortOrder:$},{Column:"account",SortOrder:"ASC"}],limit:Z,sortOrder:$},(Y)=>({account:Y.account,tokenAddress:Y.tokenAddress,demurragedTotalBalance:Y.demurragedTotalBalance}))}}class k{client;constructor(J){this.client=J}transformQueryResponse(J){let{columns:Z,rows:$}=J;return $.map((G)=>{let Y={};return Z.forEach((W,K)=>{Y[W]=G[K]}),Y})}async getInvitedBy(J){let Z=Q(J),$=await this.client.call("circles_query",[{Namespace:"CrcV2",Table:"RegisterHuman",Columns:["inviter"],Filter:[{Type:"FilterPredicate",FilterType:"Equals",Column:"avatar",Value:Z}],Order:[{Column:"blockNumber",SortOrder:"DESC"}],Limit:1}]);if($.length>0)return V($[0].inviter);return}async getInvitations(J){let Z=Q(J),$=96,G=await this.client.call("circles_getAvatarInfoBatch",[[Z]]);if((G.length>0?G[0]:void 0)?.version===2)return[];let W=await this.client.call("circles_query",[{Namespace:"V_Crc",Table:"TrustRelations",Columns:["truster","trustee"],Filter:[{Type:"Conjunction",ConjunctionType:"And",Predicates:[{Type:"FilterPredicate",FilterType:"Equals",Column:"version",Value:2},{Type:"FilterPredicate",FilterType:"Equals",Column:"trustee",Value:Z}]}],Order:[]}]),M=this.transformQueryResponse(W).map((U)=>U.truster);if(M.length===0)return[];let N=await this.client.call("circles_getAvatarInfoBatch",[M]),q=[];for(let U of N){if(!U?.isHuman)continue;let g=(await this.client.call("circles_getTokenBalances",[U.avatar])).find((P)=>Q(P.tokenAddress)===Q(U.avatar));if(g&&g.circles>=96)q.push(U)}return V(q)}async getInvitationsFrom(J,Z=!1){let $=Q(J);if(Z){let G=await this.client.call("circles_query",[{Namespace:"CrcV2",Table:"RegisterHuman",Columns:["avatar"],Filter:[{Type:"FilterPredicate",FilterType:"Equals",Column:"inviter",Value:$}],Order:[{Column:"blockNumber",SortOrder:"DESC"}]}]),W=this.transformQueryResponse(G).map((K)=>K.avatar);return V(W)}else{let G=await this.client.call("circles_query",[{Namespace:"V_Crc",Table:"TrustRelations",Columns:["trustee","truster"],Filter:[{Type:"Conjunction",ConjunctionType:"And",Predicates:[{Type:"FilterPredicate",FilterType:"Equals",Column:"version",Value:2},{Type:"FilterPredicate",FilterType:"Equals",Column:"truster",Value:$}]}],Order:[]}]),W=this.transformQueryResponse(G).map((q)=>q.trustee);if(W.length===0)return[];let K=await this.client.call("circles_getAvatarInfoBatch",[W]),M=new Set(K.filter((q)=>q!==null).map((q)=>Q(q.avatar))),N=W.filter((q)=>!M.has(Q(q)));return V(N)}}}function vJ(J,Z){let $=BigInt(J),G=D.attoCirclesToCircles($),Y=D.attoCirclesToAttoCrc($,BigInt(Z)),W=D.attoCirclesToCircles(Y),K=D.attoCirclesToAttoStaticCircles($,BigInt(Z)),M=D.attoCirclesToCircles(K);return{attoCircles:$,circles:G,staticAttoCircles:K,staticCircles:M,attoCrc:Y,crc:W}}class w{client;constructor(J){this.client=J}getTransactionHistory(J,Z=50,$="DESC"){let G=Q(J),Y=[{Type:"Conjunction",ConjunctionType:"And",Predicates:[{Type:"FilterPredicate",FilterType:"Equals",Column:"version",Value:2},{Type:"Conjunction",ConjunctionType:"Or",Predicates:[{Type:"FilterPredicate",FilterType:"Equals",Column:"from",Value:G},{Type:"FilterPredicate",FilterType:"Equals",Column:"to",Value:G}]}]}];return new j(this.client,{namespace:"V_Crc",table:"TransferSummary",sortOrder:$,columns:[],filter:Y,limit:Z},(W)=>{let K=vJ(W.value,W.timestamp),M={...W,...K};return V(M)})}}class C{client;constructor(J){this.client=J}async findGroups(J=50,Z){let $=this.getGroups(J,Z,"DESC"),G=[];while(await $.queryNextPage()){if(G.push(...$.currentPage.results),G.length>=J)break;if(!$.currentPage.hasMore)break}return G.slice(0,J)}getGroupMemberships(J,Z=50,$="DESC"){let G=Q(J);return new j(this.client,{namespace:"V_CrcV2",table:"GroupMemberships",sortOrder:$,columns:["blockNumber","timestamp","transactionIndex","logIndex","transactionHash","group","member","expiryTime"],filter:[{Type:"FilterPredicate",FilterType:"Equals",Column:"member",Value:G}],limit:Z},(Y)=>V(Y))}getGroupHolders(J,Z=100){let $=Q(J);return new j(this.client,{namespace:"V_CrcV2",table:"GroupTokenHoldersBalance",sortOrder:"DESC",columns:["group","holder","totalBalance","demurragedTotalBalance","fractionOwnership"],cursorColumns:[{name:"holder",sortOrder:"ASC"}],orderColumns:[{Column:"totalBalance",SortOrder:"DESC"},{Column:"holder",SortOrder:"ASC"}],filter:[{Type:"FilterPredicate",FilterType:"Equals",Column:"group",Value:$}],limit:Z,rowTransformer:(G)=>{let Y={...G,totalBalance:BigInt(G.totalBalance),demurragedTotalBalance:BigInt(G.demurragedTotalBalance)};return V(Y)}})}getGroupMembers(J,Z=100,$="DESC"){let G=Q(J);return new j(this.client,{namespace:"V_CrcV2",table:"GroupMemberships",sortOrder:$,columns:["blockNumber","timestamp","transactionIndex","logIndex","transactionHash","group","member","expiryTime"],filter:[{Type:"FilterPredicate",FilterType:"Equals",Column:"group",Value:G}],limit:Z},(Y)=>V(Y))}getGroups(J=50,Z,$="DESC"){let G=[];if(Z){if(Z.nameStartsWith)G.push({Type:"FilterPredicate",FilterType:"Like",Column:"name",Value:Z.nameStartsWith+"%"});if(Z.symbolStartsWith)G.push({Type:"FilterPredicate",FilterType:"Like",Column:"symbol",Value:Z.symbolStartsWith+"%"});if(Z.groupAddressIn&&Z.groupAddressIn.length>0){let W=Z.groupAddressIn.map((K)=>({Type:"FilterPredicate",FilterType:"Equals",Column:"group",Value:Q(K)}));if(W.length===1)G.push(W[0]);else G.push({Type:"Conjunction",ConjunctionType:"Or",Predicates:W})}if(Z.groupTypeIn&&Z.groupTypeIn.length>0){let W=Z.groupTypeIn.map((K)=>({Type:"FilterPredicate",FilterType:"Equals",Column:"type",Value:K}));if(W.length===1)G.push(W[0]);else G.push({Type:"Conjunction",ConjunctionType:"Or",Predicates:W})}if(Z.ownerIn&&Z.ownerIn.length>0){let W=Z.ownerIn.map((K)=>({Type:"FilterPredicate",FilterType:"Equals",Column:"owner",Value:Q(K)}));if(W.length===1)G.push(W[0]);else G.push({Type:"Conjunction",ConjunctionType:"Or",Predicates:W})}if(Z.mintHandlerEquals)G.push({Type:"FilterPredicate",FilterType:"Equals",Column:"mintHandler",Value:Q(Z.mintHandlerEquals)});if(Z.treasuryEquals)G.push({Type:"FilterPredicate",FilterType:"Equals",Column:"treasury",Value:Q(Z.treasuryEquals)})}let Y=G.length>1?[{Type:"Conjunction",ConjunctionType:"And",Predicates:G}]:G;return new j(this.client,{namespace:"V_CrcV2",table:"Groups",sortOrder:$,columns:["blockNumber","timestamp","transactionIndex","logIndex","transactionHash","group","type","owner","mintPolicy","mintHandler","treasury","service","feeCollection","memberCount","name","symbol","cidV0Digest","erc20WrapperDemurraged","erc20WrapperStatic"],filter:Y,limit:J},(W)=>V(W))}}class FJ{client;_pathfinder;_query;_trust;_balance;_avatar;_profile;_token;_invitation;_transaction;_group;constructor(J="https://rpc.circlesubi.network/"){this.client=new A(J)}get pathfinder(){if(!this._pathfinder)this._pathfinder=new _(this.client);return this._pathfinder}get query(){if(!this._query)this._query=new B(this.client);return this._query}get trust(){if(!this._trust)this._trust=new R(this.client);return this._trust}get balance(){if(!this._balance)this._balance=new T(this.client);return this._balance}get avatar(){if(!this._avatar)this._avatar=new E(this.client);return this._avatar}get profile(){if(!this._profile)this._profile=new S(this.client);return this._profile}get token(){if(!this._token)this._token=new H(this.client);return this._token}get invitation(){if(!this._invitation)this._invitation=new k(this.client);return this._invitation}get transaction(){if(!this._transaction)this._transaction=new w(this.client);return this._transaction}get group(){if(!this._group)this._group=new C(this.client);return this._group}setRpcUrl(J){this.client.setRpcUrl(J)}getRpcUrl(){return this.client.getRpcUrl()}}export{F as parseStringsToBigInt,x as parseRpcSubscriptionMessage,f as parseRpcEvent,xJ as normalizeAddresses,Q as normalizeAddress,i as isCirclesEvent,R as TrustMethods,w as TransactionMethods,H as TokenMethods,X as RpcError,A as RpcClient,B as QueryMethods,S as ProfileMethods,_ as PathfinderMethods,j as PagedQuery,O as Observable,k as InvitationMethods,C as GroupMethods,FJ as CirclesRpc,T as BalanceMethods,E as AvatarMethods};
|