@aboutcircles/sdk-invitations 0.1.16 → 0.1.18

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.
@@ -15,6 +15,7 @@ export declare class Invitations {
15
15
  private trust;
16
16
  private hubV2;
17
17
  private referralsModule;
18
+ private invitationFarm;
18
19
  constructor(config: CirclesConfig);
19
20
  /**
20
21
  * Save referral data to the referrals service
@@ -79,6 +80,17 @@ export declare class Invitations {
79
80
  * Otherwise, it will use the first available proxy inviter.
80
81
  */
81
82
  findInvitePath(inviter: Address, proxyInviterAddress?: Address): Promise<import("@aboutcircles/sdk-types").PathfindingResult>;
83
+ /**
84
+ * Find a fallback path from inviter to the farm destination
85
+ *
86
+ * @param inviter - Address of the inviter
87
+ * @returns PathfindingResult containing the transfer path to the farm
88
+ *
89
+ * @description
90
+ * This function finds a path from the inviter to the farm destination (0x9Eb51E6A39B3F17bB1883B80748b56170039ff1d)
91
+ * using FARM_TO_TOKEN as the target token. Used when no standard proxy inviters are available.
92
+ */
93
+ findFarmInvitePath(inviter: Address): Promise<import("@aboutcircles/sdk-types").PathfindingResult>;
82
94
  /**
83
95
  * Get real inviters who have enough balance to cover invitation fees
84
96
  *
@@ -90,30 +102,34 @@ export declare class Invitations {
90
102
  * This function:
91
103
  * 1. Gets all addresses that trust the inviter (set1) - includes both one-way trusts and mutual trusts
92
104
  * 2. Gets all addresses trusted by the invitation module (set2) - includes both one-way trusts and mutual trusts
93
- * 3. Verifies that the inviter is trusted by the invitation module (throws error if not)
94
- * 4. Finds the intersection of set1 and set2
95
- * 5. Adds the inviter's own address to the list of possible tokens
96
- * 6. Builds a path from inviter to invitation module using intersection addresses as toTokens
97
- * 7. Sums up transferred token amounts by tokenOwner
98
- * 8. Calculates possible invites (1 invite = 96 CRC)
99
- * 9. Orders real inviters by preference (best candidates first)
100
- * 10. Returns only those token owners whose total amounts exceed the invitation fee (96 CRC)
105
+ * 3. Gets all addresses trusted by the gnosis group (set3) - these will be excluded
106
+ * 4. Verifies that the inviter is trusted by the invitation module (throws error if not)
107
+ * 5. Finds the intersection of set1 and set2, excluding addresses in set3
108
+ * 6. Adds the inviter's own address to the list of possible tokens
109
+ * 7. Builds a path from inviter to invitation module using intersection addresses as toTokens
110
+ * 8. Sums up transferred token amounts by tokenOwner
111
+ * 9. Calculates possible invites (1 invite = 96 CRC)
112
+ * 10. Orders real inviters by preference (best candidates first)
113
+ * 11. Returns only those token owners whose total amounts exceed the invitation fee (96 CRC)
101
114
  */
102
115
  getRealInviters(inviter: Address): Promise<ProxyInviter[]>;
103
116
  /**
104
117
  * Generate a referral for inviting a new user
105
118
  *
106
119
  * @param inviter - Address of the inviter
107
- * @returns Object containing transactions and the generated private key
120
+ * @returns Object containing transactions, the generated private key, and whether farm was used
108
121
  *
109
122
  * @description
110
123
  * This function:
111
124
  * 1. Generates a new private key and signer address for the invitee
112
- * 2. Finds a proxy inviter (someone who has balance and is trusted by both inviter and invitation module)
113
- * 3. Builds transaction batch including transfers and invitation
114
- * 4. Uses generateInviteData to properly encode the Safe account creation data
115
- * 5. Saves the referral data (private key, signer, inviter) to database
116
- * 6. Returns transactions and the generated private key
125
+ * 2. Tries to find proxy inviters (accounts that trust inviter, trusted by module, NOT trusted by gnosis group)
126
+ * 3. If no proxy inviters found, falls back to farm-based invitation:
127
+ * - Sends 96 CRC to FARM_DESTINATION to increase quota on the invitation farm
128
+ * - Then uses the farm (claimInvite + safeTransferFrom) to create the referral
129
+ * 4. Builds transaction batch including transfers and invitation
130
+ * 5. Uses generateInviteData to properly encode the Safe account creation data
131
+ * 6. Saves the referral data (private key, signer, inviter) to database
132
+ * 7. Returns transactions and the generated private key
117
133
  */
118
134
  generateReferral(inviter: Address): Promise<{
119
135
  transactions: TransactionRequest[];
@@ -1 +1 @@
1
- {"version":3,"file":"Invitations.d.ts","sourceRoot":"","sources":["../src/Invitations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAI1F,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAgBnD,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED;;;GAGG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,UAAU,CAAoB;IACtC,OAAO,CAAC,KAAK,CAAe;IAC5B,OAAO,CAAC,KAAK,CAAuB;IACpC,OAAO,CAAC,eAAe,CAAiC;gBAE5C,MAAM,EAAE,aAAa;IAsBjC;;;;;;;;OAQG;IACG,gBAAgB,CACpB,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,KAAK,MAAM,EAAE,GACxB,OAAO,CAAC,IAAI,CAAC;IAgChB;;;;;;;OAOG;IACG,aAAa,CACjB,OAAO,EAAE,OAAO,EAChB,KAAK,GAAE,MAAW,EAClB,MAAM,GAAE,MAAU,GACjB,OAAO,CAAC,mBAAmB,CAAC;IAiC/B;;;;;;;;;;OAUG;IACH,OAAO,CAAC,iBAAiB;IAezB;;;;;;;;;;;;;;;;;OAiBG;IACG,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;IA+CvF;;;;;;;;;;;OAWG;IACG,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,mBAAmB,CAAC,EAAE,OAAO;IA+CpE;;;;;;;;;;;;;;;;;;;OAmBG;IACG,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAoGhE;;;;;;;;;;;;;;OAcG;IACG,gBAAgB,CACpB,OAAO,EAAE,OAAO,GACf,OAAO,CAAC;QAAE,YAAY,EAAE,kBAAkB,EAAE,CAAC;QAAC,UAAU,EAAE,KAAK,MAAM,EAAE,CAAA;KAAE,CAAC;IAiD7E;;;;;;;;;;;;;OAaG;IACG,kBAAkB,CAAC,SAAS,EAAE,OAAO,EAAE,EAAE,eAAe,GAAE,OAAc,GAAG,OAAO,CAAC,KAAK,MAAM,EAAE,CAAC;IA8CvG;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO;IA8BxC;;;OAGG;IACH,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,CAAC;QAAE,MAAM,EAAE,KAAK,MAAM,EAAE,CAAC;QAAC,MAAM,EAAE,OAAO,CAAA;KAAE,CAAC;CAOlF"}
1
+ {"version":3,"file":"Invitations.d.ts","sourceRoot":"","sources":["../src/Invitations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAO,MAAM,yBAAyB,CAAC;AAI/F,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAkBnD,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;CACzB;AAOD;;;GAGG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,UAAU,CAAoB;IACtC,OAAO,CAAC,KAAK,CAAe;IAC5B,OAAO,CAAC,KAAK,CAAuB;IACpC,OAAO,CAAC,eAAe,CAAiC;IACxD,OAAO,CAAC,cAAc,CAAgC;gBAE1C,MAAM,EAAE,aAAa;IA0BjC;;;;;;;;OAQG;IACG,gBAAgB,CACpB,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,KAAK,MAAM,EAAE,GACxB,OAAO,CAAC,IAAI,CAAC;IA+BhB;;;;;;;OAOG;IACG,aAAa,CACjB,OAAO,EAAE,OAAO,EAChB,KAAK,GAAE,MAAW,EAClB,MAAM,GAAE,MAAU,GACjB,OAAO,CAAC,mBAAmB,CAAC;IAiC/B;;;;;;;;;;OAUG;IACH,OAAO,CAAC,iBAAiB;IAezB;;;;;;;;;;;;;;;;;OAiBG;IACG,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAwFvF;;;;;;;;;;;OAWG;IACG,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,mBAAmB,CAAC,EAAE,OAAO;IAiDpE;;;;;;;;;OASG;IACG,kBAAkB,CAAC,OAAO,EAAE,OAAO;IAkCzC;;;;;;;;;;;;;;;;;;;;OAoBG;IACG,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAuHhE;;;;;;;;;;;;;;;;;OAiBG;IACG,gBAAgB,CACpB,OAAO,EAAE,OAAO,GACf,OAAO,CAAC;QAAE,YAAY,EAAE,kBAAkB,EAAE,CAAC;QAAC,UAAU,EAAE,KAAK,MAAM,EAAE,CAAA;KAAE,CAAC;IAuF7E;;;;;;;;;;;;;OAaG;IACG,kBAAkB,CAAC,SAAS,EAAE,OAAO,EAAE,EAAE,eAAe,GAAE,OAAc,GAAG,OAAO,CAAC,KAAK,MAAM,EAAE,CAAC;IA8CvG;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO;IA8BxC;;;OAGG;IACH,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,CAAC;QAAE,MAAM,EAAE,KAAK,MAAM,EAAE,CAAC;QAAC,MAAM,EAAE,OAAO,CAAA;KAAE,CAAC;CAOlF"}
@@ -1,8 +1,12 @@
1
1
  import { RpcClient, PathfinderMethods, TrustMethods } from '@aboutcircles/sdk-rpc';
2
- import { HubV2ContractMinimal, ReferralsModuleContractMinimal } from '@aboutcircles/sdk-core/minimal';
2
+ import { HubV2ContractMinimal, ReferralsModuleContractMinimal, InvitationFarmContractMinimal } from '@aboutcircles/sdk-core/minimal';
3
3
  import { InvitationError } from './errors';
4
4
  import { TransferBuilder } from '@aboutcircles/sdk-transfers';
5
- import { hexToBytes, INVITATION_FEE, MAX_FLOW, generatePrivateKey, privateKeyToAddress, encodeAbiParameters, keccak256, SAFE_PROXY_FACTORY, ACCOUNT_INITIALIZER_HASH, ACCOUNT_CREATION_CODE_HASH, checksumAddress } from '@aboutcircles/sdk-utils';
5
+ import { hexToBytes, INVITATION_FEE, MAX_FLOW, generatePrivateKey, privateKeyToAddress, encodeAbiParameters, keccak256, SAFE_PROXY_FACTORY, ACCOUNT_INITIALIZER_HASH, ACCOUNT_CREATION_CODE_HASH, checksumAddress, GNOSIS_GROUP_ADDRESS, FARM_DESTINATION } from '@aboutcircles/sdk-utils';
6
+ /**
7
+ * Token address used for farm-based invitations (same as Gnosis group address)
8
+ */
9
+ const FARM_TO_TOKEN = GNOSIS_GROUP_ADDRESS;
6
10
  /**
7
11
  * Invitations handles invitation operations for Circles
8
12
  * Supports both referral invitations (new users) and direct invitations (existing Safe wallets)
@@ -14,6 +18,7 @@ export class Invitations {
14
18
  trust;
15
19
  hubV2;
16
20
  referralsModule;
21
+ invitationFarm;
17
22
  constructor(config) {
18
23
  if (!config.referralsServiceUrl) {
19
24
  throw new InvitationError('referralsServiceUrl is required in config', {
@@ -34,6 +39,10 @@ export class Invitations {
34
39
  address: config.referralsModuleAddress,
35
40
  rpcUrl: config.circlesRpcUrl,
36
41
  });
42
+ this.invitationFarm = new InvitationFarmContractMinimal({
43
+ address: config.invitationFarmAddress,
44
+ rpcUrl: config.circlesRpcUrl,
45
+ });
37
46
  }
38
47
  /**
39
48
  * Save referral data to the referrals service
@@ -66,7 +75,6 @@ export class Invitations {
66
75
  }
67
76
  }
68
77
  catch (error) {
69
- console.error('Failed to save referral data:', error);
70
78
  throw new InvitationError(`Failed to save referral data: ${error instanceof Error ? error.message : 'Unknown error'}`, {
71
79
  code: 'INVITATION_SAVE_REFERRAL_FAILED',
72
80
  source: 'INVITATIONS',
@@ -160,27 +168,50 @@ export class Invitations {
160
168
  if (isHuman) {
161
169
  throw InvitationError.inviteeAlreadyRegistered(inviterLower, inviteeLower);
162
170
  }
163
- // Step 2: Find path to invitation module using proxy inviters
164
- const path = await this.findInvitePath(inviterLower);
165
- // Step 3: Generate invitation data for existing Safe wallet
166
- // For non-registered addresses (existing Safe wallets), we pass their address directly
167
- // useSafeCreation = false because the invitee already has a Safe wallet
168
- const transferData = await this.generateInviteData([inviteeLower], false);
169
- // Step 4: Build transactions using TransferBuilder to properly handle wrapped tokens
170
- const transferBuilder = new TransferBuilder(this.config);
171
- // Get the real inviter address from the path
171
+ // Step 2: Try to find proxy inviters
172
172
  const realInviters = await this.getRealInviters(inviterLower);
173
- if (realInviters.length === 0) {
174
- throw InvitationError.noPathFound(inviterLower, this.config.invitationModuleAddress);
173
+ const transactions = [];
174
+ if (realInviters.length > 0) {
175
+ // Standard path: use proxy inviters
176
+ console.log('[generateInvite] Using STANDARD PATH (proxy inviters available)');
177
+ const realInviterAddress = realInviters[0].address;
178
+ const path = await this.findInvitePath(inviterLower, realInviterAddress);
179
+ const transferData = await this.generateInviteData([inviteeLower], false);
180
+ const transferBuilder = new TransferBuilder(this.config);
181
+ const transferTransactions = await transferBuilder.buildFlowMatrixTx(inviterLower, this.config.invitationModuleAddress, path, {
182
+ toTokens: [realInviterAddress],
183
+ useWrappedBalances: true,
184
+ txData: hexToBytes(transferData)
185
+ }, true);
186
+ transactions.push(...transferTransactions);
175
187
  }
176
- const realInviterAddress = realInviters[0].address;
177
- // Use the buildFlowMatrixTx method to construct transactions from the path
178
- const transferTransactions = await transferBuilder.buildFlowMatrixTx(inviterLower, this.config.invitationModuleAddress, path, {
179
- toTokens: [realInviterAddress],
180
- useWrappedBalances: true,
181
- txData: hexToBytes(transferData)
182
- }, true);
183
- return transferTransactions;
188
+ else {
189
+ // Fallback: farm-based invitation
190
+ // 1. Send 96 CRC to the farm destination (invitation market) to increase quota
191
+ // 2. claimInvite() to claim a token ID from the farm
192
+ // 3. safeTransferFrom() to transfer the claimed token to the invitation module
193
+ // with the invitee address encoded as data
194
+ console.log('[generateInvite] Using FARM FALLBACK PATH (no proxy inviters available)');
195
+ // Farm Step 1: Send 96 CRC to farm destination to increase quota
196
+ const transferBuilder = new TransferBuilder(this.config);
197
+ const farmPath = await this.findFarmInvitePath(inviterLower);
198
+ const quotaTransactions = await transferBuilder.buildFlowMatrixTx(inviterLower, FARM_DESTINATION, farmPath, {
199
+ toTokens: [GNOSIS_GROUP_ADDRESS],
200
+ useWrappedBalances: true
201
+ }, true);
202
+ transactions.push(...quotaTransactions);
203
+ // Farm Step 2: Simulate claim to get the token ID (use an address with existing quota for simulation)
204
+ const QUOTA_HOLDER = '0x20EcD8bDeb2F48d8a7c94E542aA4feC5790D9676';
205
+ const claimedId = await this.invitationFarm.read('claimInvite', [], { from: QUOTA_HOLDER });
206
+ const claimTx = this.invitationFarm.claimInvite();
207
+ transactions.push(claimTx);
208
+ // Farm Step 3: Transfer claimed token to invitation module with invitee address
209
+ const invitationModule = await this.invitationFarm.invitationModule();
210
+ const transferData = encodeAbiParameters(['address'], [inviteeLower]);
211
+ const safeTransferTx = this.hubV2.safeTransferFrom(inviterLower, invitationModule, claimedId, INVITATION_FEE, transferData);
212
+ transactions.push(safeTransferTx);
213
+ }
214
+ return transactions;
184
215
  }
185
216
  /**
186
217
  * Find a path from inviter to the invitation module for a specific proxy inviter
@@ -226,6 +257,36 @@ export class Invitations {
226
257
  }
227
258
  return path;
228
259
  }
260
+ /**
261
+ * Find a fallback path from inviter to the farm destination
262
+ *
263
+ * @param inviter - Address of the inviter
264
+ * @returns PathfindingResult containing the transfer path to the farm
265
+ *
266
+ * @description
267
+ * This function finds a path from the inviter to the farm destination (0x9Eb51E6A39B3F17bB1883B80748b56170039ff1d)
268
+ * using FARM_TO_TOKEN as the target token. Used when no standard proxy inviters are available.
269
+ */
270
+ async findFarmInvitePath(inviter) {
271
+ const inviterLower = inviter.toLowerCase();
272
+ // Find path to farm destination using the farm token
273
+ const path = await this.pathfinder.findPath({
274
+ from: inviterLower,
275
+ to: FARM_DESTINATION,
276
+ targetFlow: INVITATION_FEE,
277
+ toTokens: [FARM_TO_TOKEN],
278
+ useWrappedBalances: true
279
+ });
280
+ if (!path.transfers || path.transfers.length === 0) {
281
+ throw InvitationError.noPathFound(inviterLower, FARM_DESTINATION);
282
+ }
283
+ if (path.maxFlow < INVITATION_FEE) {
284
+ const requestedInvites = 1;
285
+ const availableInvites = Number(path.maxFlow / INVITATION_FEE);
286
+ throw InvitationError.insufficientBalance(requestedInvites, availableInvites, INVITATION_FEE, path.maxFlow, inviterLower, FARM_DESTINATION);
287
+ }
288
+ return path;
289
+ }
229
290
  /**
230
291
  * Get real inviters who have enough balance to cover invitation fees
231
292
  *
@@ -237,19 +298,20 @@ export class Invitations {
237
298
  * This function:
238
299
  * 1. Gets all addresses that trust the inviter (set1) - includes both one-way trusts and mutual trusts
239
300
  * 2. Gets all addresses trusted by the invitation module (set2) - includes both one-way trusts and mutual trusts
240
- * 3. Verifies that the inviter is trusted by the invitation module (throws error if not)
241
- * 4. Finds the intersection of set1 and set2
242
- * 5. Adds the inviter's own address to the list of possible tokens
243
- * 6. Builds a path from inviter to invitation module using intersection addresses as toTokens
244
- * 7. Sums up transferred token amounts by tokenOwner
245
- * 8. Calculates possible invites (1 invite = 96 CRC)
246
- * 9. Orders real inviters by preference (best candidates first)
247
- * 10. Returns only those token owners whose total amounts exceed the invitation fee (96 CRC)
301
+ * 3. Gets all addresses trusted by the gnosis group (set3) - these will be excluded
302
+ * 4. Verifies that the inviter is trusted by the invitation module (throws error if not)
303
+ * 5. Finds the intersection of set1 and set2, excluding addresses in set3
304
+ * 6. Adds the inviter's own address to the list of possible tokens
305
+ * 7. Builds a path from inviter to invitation module using intersection addresses as toTokens
306
+ * 8. Sums up transferred token amounts by tokenOwner
307
+ * 9. Calculates possible invites (1 invite = 96 CRC)
308
+ * 10. Orders real inviters by preference (best candidates first)
309
+ * 11. Returns only those token owners whose total amounts exceed the invitation fee (96 CRC)
248
310
  */
249
311
  async getRealInviters(inviter) {
312
+ console.log('[getRealInviters] Finding valid proxy inviters for:', inviter);
250
313
  const inviterLower = inviter.toLowerCase();
251
314
  // Step 1: Get addresses that trust the inviter (set1)
252
- // This includes both one-way incoming trusts and mutual trusts
253
315
  const trustedByRelations = await this.trust.getTrustedBy(inviterLower);
254
316
  const mutualTrustRelations = await this.trust.getMutualTrusts(inviterLower);
255
317
  // Extract the addresses of avatars who trust the inviter
@@ -259,8 +321,9 @@ export class Invitations {
259
321
  ...mutualTrustRelations.map(relation => relation.objectAvatar.toLowerCase())
260
322
  ]);
261
323
  // Step 2: Get addresses trusted by the invitation module (set2)
324
+ // This includes both one-way outgoing trusts and mutual trusts
262
325
  // getTrusts returns only one-way outgoing trusts, so we also need getMutualTrusts
263
- // to catch addresses that mistakenly trusted the module back (creating a mutual trust)
326
+ // to catch addresses that trusted the module back (creating a mutual trust)
264
327
  const [trustsRelations, moduleMutualTrustRelations] = await Promise.all([
265
328
  this.trust.getTrusts(this.config.invitationModuleAddress),
266
329
  this.trust.getMutualTrusts(this.config.invitationModuleAddress),
@@ -269,8 +332,17 @@ export class Invitations {
269
332
  ...trustsRelations.map(relation => relation.objectAvatar.toLowerCase()),
270
333
  ...moduleMutualTrustRelations.map(relation => relation.objectAvatar.toLowerCase()),
271
334
  ]);
272
- // Step 3: Check if inviter is trusted by the invitation module
273
- // If not, the inviter needs to enable the invitation module first
335
+ // Step 3: Get addresses trusted by the gnosis group (set3) - these will be excluded
336
+ let trustedByGnosisGroup = new Set();
337
+ if (GNOSIS_GROUP_ADDRESS !== '0x0000000000000000000000000000000000000000') {
338
+ const gnosisGroupTrusts = await this.trust.getTrusts(GNOSIS_GROUP_ADDRESS);
339
+ trustedByGnosisGroup = new Set([
340
+ ...gnosisGroupTrusts.map(relation => relation.objectAvatar.toLowerCase()),
341
+ ]);
342
+ }
343
+ else {
344
+ }
345
+ // Step 4: Check if inviter is trusted by the invitation module
274
346
  const inviterTrustedByModule = trustedByModule.has(inviterLower);
275
347
  if (!inviterTrustedByModule) {
276
348
  throw new InvitationError('Inviter must enable the invitation module before creating invitations', {
@@ -279,21 +351,25 @@ export class Invitations {
279
351
  context: { inviter: inviterLower, invitationModule: this.config.invitationModuleAddress }
280
352
  });
281
353
  }
282
- // Step 4: Find intersection - addresses that trust inviter AND are trusted by invitation module
354
+ // Step 5: Find intersection - addresses that trust inviter AND are trusted by invitation module
355
+ // AND are NOT trusted by the gnosis group
283
356
  const intersection = [];
284
357
  for (const address of trustedByInviter) {
285
- if (trustedByModule.has(address)) {
358
+ if (trustedByModule.has(address) && !trustedByGnosisGroup.has(address)) {
286
359
  intersection.push(address);
287
360
  }
288
361
  }
289
- // Step 5: Add the inviter's own address to the list of possible tokens
290
- // This allows the inviter to use their own personal tokens for invitations
291
- const tokensToUse = [...intersection, inviterLower];
362
+ // Step 6: Add the inviter's own address to the list of possible tokens
363
+ const tokensToUse = [...intersection];
364
+ const inviterExcluded = trustedByGnosisGroup.has(inviterLower);
365
+ if (!inviterExcluded) {
366
+ tokensToUse.push(inviterLower);
367
+ }
292
368
  // If no tokens available at all, return empty
293
369
  if (tokensToUse.length === 0) {
294
370
  return [];
295
371
  }
296
- // Step 6: Build path from inviter to invitation module
372
+ // Step 7: Build path from inviter to invitation module
297
373
  const path = await this.pathfinder.findPath({
298
374
  from: inviterLower,
299
375
  to: this.config.invitationModuleAddress,
@@ -304,7 +380,7 @@ export class Invitations {
304
380
  if (!path.transfers || path.transfers.length === 0) {
305
381
  return [];
306
382
  }
307
- // Step 7: Sum up transferred token amounts by tokenOwner (only terminal transfers to invitation module)
383
+ // Step 8: Sum up transferred token amounts by tokenOwner (only terminal transfers to invitation module)
308
384
  const tokenOwnerAmounts = new Map();
309
385
  const invitationModuleLower = this.config.invitationModuleAddress.toLowerCase();
310
386
  for (const transfer of path.transfers) {
@@ -315,7 +391,7 @@ export class Invitations {
315
391
  tokenOwnerAmounts.set(tokenOwnerLower, currentAmount + transfer.value);
316
392
  }
317
393
  }
318
- // Step 8: Calculate possible invites and filter token owners
394
+ // Step 9: Calculate possible invites and filter token owners
319
395
  const realInviters = [];
320
396
  for (const [tokenOwner, amount] of tokenOwnerAmounts.entries()) {
321
397
  const possibleInvites = Number(amount / INVITATION_FEE);
@@ -326,57 +402,80 @@ export class Invitations {
326
402
  });
327
403
  }
328
404
  }
329
- // Step 9: Order real inviters by preference (best candidates first)
330
- // Prioritizes the inviter's own tokens first
405
+ // Step 10: Order real inviters by preference (best candidates first)
331
406
  const orderedRealInviters = this.orderRealInviters(realInviters, inviterLower);
407
+ console.log('[getRealInviters] Final result:', orderedRealInviters.length, 'valid proxy inviters');
408
+ for (const ri of orderedRealInviters) {
409
+ }
332
410
  return orderedRealInviters;
333
411
  }
334
412
  /**
335
413
  * Generate a referral for inviting a new user
336
414
  *
337
415
  * @param inviter - Address of the inviter
338
- * @returns Object containing transactions and the generated private key
416
+ * @returns Object containing transactions, the generated private key, and whether farm was used
339
417
  *
340
418
  * @description
341
419
  * This function:
342
420
  * 1. Generates a new private key and signer address for the invitee
343
- * 2. Finds a proxy inviter (someone who has balance and is trusted by both inviter and invitation module)
344
- * 3. Builds transaction batch including transfers and invitation
345
- * 4. Uses generateInviteData to properly encode the Safe account creation data
346
- * 5. Saves the referral data (private key, signer, inviter) to database
347
- * 6. Returns transactions and the generated private key
421
+ * 2. Tries to find proxy inviters (accounts that trust inviter, trusted by module, NOT trusted by gnosis group)
422
+ * 3. If no proxy inviters found, falls back to farm-based invitation:
423
+ * - Sends 96 CRC to FARM_DESTINATION to increase quota on the invitation farm
424
+ * - Then uses the farm (claimInvite + safeTransferFrom) to create the referral
425
+ * 4. Builds transaction batch including transfers and invitation
426
+ * 5. Uses generateInviteData to properly encode the Safe account creation data
427
+ * 6. Saves the referral data (private key, signer, inviter) to database
428
+ * 7. Returns transactions and the generated private key
348
429
  */
349
430
  async generateReferral(inviter) {
350
431
  const inviterLower = inviter.toLowerCase();
351
- // @todo use `generateSecrets` here
352
432
  // Step 1: Generate private key and derive signer address
353
433
  const privateKey = generatePrivateKey();
354
434
  const signerAddress = privateKeyToAddress(privateKey);
355
- // Step 2: Get real inviters
435
+ // Step 2: Get real inviters (filtered by gnosis group)
356
436
  const realInviters = await this.getRealInviters(inviterLower);
357
- if (realInviters.length === 0) {
358
- throw InvitationError.noProxyInviters(inviterLower);
359
- }
360
- // Step 3: Pick the first real inviter
361
- const firstRealInviter = realInviters[0];
362
- const realInviterAddress = firstRealInviter.address;
363
- // Step 4: Find path to invitation module
364
- const path = await this.findInvitePath(inviterLower, realInviterAddress);
365
- // Step 5: Build transactions using TransferBuilder to properly handle wrapped tokens
366
- const transferBuilder = new TransferBuilder(this.config);
367
- // useSafeCreation = true because we're creating a new Safe wallet via ReferralsModule
368
- const transferData = await this.generateInviteData([signerAddress], true);
369
- // Use the new buildFlowMatrixTx method to construct transactions from the path
370
- const transferTransactions = await transferBuilder.buildFlowMatrixTx(inviterLower, this.config.invitationModuleAddress, path, {
371
- toTokens: [realInviterAddress],
372
- useWrappedBalances: true,
373
- txData: hexToBytes(transferData)
374
- }, true);
375
- // Step 6: Save referral data to database
376
- await this.saveReferralData(inviterLower, privateKey);
377
- // Step 7: Build final transaction batch
378
437
  const transactions = [];
379
- transactions.push(...transferTransactions);
438
+ if (realInviters.length > 0) {
439
+ // Standard path: use proxy inviters
440
+ console.log('[generateReferral] Using STANDARD PATH (proxy inviters available)');
441
+ const transferBuilder = new TransferBuilder(this.config);
442
+ const transferData = await this.generateInviteData([signerAddress], true);
443
+ const realInviterAddress = realInviters[0].address;
444
+ const path = await this.findInvitePath(inviterLower, realInviterAddress);
445
+ const transferTransactions = await transferBuilder.buildFlowMatrixTx(inviterLower, this.config.invitationModuleAddress, path, {
446
+ toTokens: [realInviterAddress],
447
+ useWrappedBalances: true,
448
+ txData: hexToBytes(transferData)
449
+ }, true);
450
+ transactions.push(...transferTransactions);
451
+ }
452
+ else {
453
+ // Fallback: use farm-based invitation path
454
+ // 1. Send 96 CRC to the dispatcher to increase quota on the farm
455
+ // 2. claimInvite() to claim a token ID from the farm (uses the quota)
456
+ // 3. safeTransferFrom() to transfer the claimed token to the invitation module
457
+ // with createAccount calldata for the new signer
458
+ console.log('[generateReferral] Using FARM FALLBACK PATH (no proxy inviters available)');
459
+ // Farm Step 1: Send 96 CRC to dispatcher to increase quota
460
+ const transferBuilder = new TransferBuilder(this.config);
461
+ const farmPath = await this.findFarmInvitePath(inviterLower);
462
+ const quotaTransactions = await transferBuilder.buildFlowMatrixTx(inviterLower, FARM_DESTINATION, farmPath, {
463
+ toTokens: [FARM_TO_TOKEN],
464
+ useWrappedBalances: true
465
+ }, true);
466
+ transactions.push(...quotaTransactions);
467
+ // Farm Step 2: Simulate claim to get the token ID, then build claim tx
468
+ const QUOTA_HOLDER = '0x20EcD8bDeb2F48d8a7c94E542aA4feC5790D9676';
469
+ const claimedId = await this.invitationFarm.read('claimInvite', [], { from: QUOTA_HOLDER });
470
+ const claimTx = this.invitationFarm.claimInvite();
471
+ transactions.push(claimTx);
472
+ // Farm Step 3: Transfer claimed token to invitation module with createAccount calldata
473
+ const invitationModule = await this.invitationFarm.invitationModule();
474
+ const createAccountCalldata = this.referralsModule.createAccount(signerAddress).data;
475
+ const transferData = encodeAbiParameters(['address', 'bytes'], [this.config.referralsModuleAddress, createAccountCalldata]);
476
+ const safeTransferTx = this.hubV2.safeTransferFrom(inviterLower, invitationModule, claimedId, INVITATION_FEE, transferData);
477
+ transactions.push(safeTransferTx);
478
+ }
380
479
  return { transactions, privateKey };
381
480
  }
382
481
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"InviteFarm.d.ts","sourceRoot":"","sources":["../src/InviteFarm.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,GAAG,EAAE,MAAM,yBAAyB,CAAC;AAO/F,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAInD,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,GAAG,CAAC;IACZ,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,iBAAiB,EAAE,CAAC;IAC/B,YAAY,EAAE,kBAAkB,EAAE,CAAC;CACpC;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,YAAY,EAAE,kBAAkB,EAAE,CAAC;CACpC;AAED;;;GAGG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAU;IACjD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAC1C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAgC;IAC/D,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAiC;IACjE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAuB;gBAEjC,MAAM,EAAE,aAAa;IAiBjC,4DAA4D;IACtD,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;IAIjD,sCAAsC;IAChC,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC;IAIzC,sDAAsD;IAChD,mBAAmB,IAAI,OAAO,CAAC,OAAO,CAAC;IAI7C;;;;;;OAMG;IACG,iBAAiB,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAwC1F;;;;;;OAMG;IACG,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAoC5F;;;;;OAKG;IACG,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,SAAK,EAAE,MAAM,SAAI,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAI3F,2DAA2D;YAC7C,aAAa;IAQ3B,4FAA4F;IAC5F,OAAO,CAAC,qBAAqB;IAW7B,iGAAiG;IACjG,OAAO,CAAC,0BAA0B;IAYlC,yFAAyF;IACzF,OAAO,CAAC,mBAAmB;IAU3B,+FAA+F;IAC/F,OAAO,CAAC,wBAAwB;CAUjC"}
1
+ {"version":3,"file":"InviteFarm.d.ts","sourceRoot":"","sources":["../src/InviteFarm.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,GAAG,EAAE,MAAM,yBAAyB,CAAC;AAO/F,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAInD,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,GAAG,CAAC;IACZ,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,iBAAiB,EAAE,CAAC;IAC/B,YAAY,EAAE,kBAAkB,EAAE,CAAC;CACpC;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,YAAY,EAAE,kBAAkB,EAAE,CAAC;CACpC;AAED;;;GAGG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAU;IACjD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAC1C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAgC;IAC/D,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAiC;IACjE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAuB;gBAEjC,MAAM,EAAE,aAAa;IAiBjC,4DAA4D;IACtD,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;IAIjD,sCAAsC;IAChC,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC;IAIzC,sDAAsD;IAChD,mBAAmB,IAAI,OAAO,CAAC,OAAO,CAAC;IAI7C;;;;;;OAMG;IACG,iBAAiB,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAoC1F;;;;;;OAMG;IACG,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAoC5F;;;;;OAKG;IACG,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,SAAK,EAAE,MAAM,SAAI,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAI3F,2DAA2D;YAC7C,aAAa;IAQ3B,4FAA4F;IAC5F,OAAO,CAAC,qBAAqB;IAW7B,iGAAiG;IACjG,OAAO,CAAC,0BAA0B;IAYlC,yFAAyF;IACzF,OAAO,CAAC,mBAAmB;IAU3B,+FAA+F;IAC/F,OAAO,CAAC,wBAAwB;CAUjC"}
@@ -74,7 +74,6 @@ export class InviteFarm {
74
74
  const transferTx = isSingle
75
75
  ? this.buildReferralTransfer(inviterLower, invitationModule, ids[0], signers[0])
76
76
  : this.buildBatchReferralTransfer(inviterLower, invitationModule, ids, signers);
77
- await Promise.all(referrals.map(r => this.invitations.saveReferralData(inviterLower, r.secret)));
78
77
  return { referrals, transactions: [claimTx, transferTx] };
79
78
  }
80
79
  /**
package/dist/index.js CHANGED
@@ -1,3 +1,3 @@
1
- var TJ=($)=>BigInt($),a0=($)=>parseInt($,16),_8=($)=>{if($.startsWith("0x"))$=$.slice(2);if($.length%2!==0)throw Error("Invalid hex string");let J=new Uint8Array($.length/2);for(let Q=0;Q<$.length;Q+=2)J[Q/2]=parseInt($.substr(Q,2),16);return J};function E8($,J){if(typeof J==="string"&&J.startsWith("0x")){let Q=J.slice(2);if(Q.length===40)return J;if(Q.length===64){if($.toLowerCase().includes("digest")||$.toLowerCase().includes("data")||$.toLowerCase().includes("bytes"))return _8(J);try{return TJ(J)}catch{return J}}try{let G=a0(J);if(G<Number.MAX_SAFE_INTEGER)return G;return TJ(J)}catch{return J}}if(J==="true")return!0;if(J==="false")return!1;return J}function g$($){let{event:J,values:Q}=$,G={$event:J,blockNumber:Q.blockNumber?a0(Q.blockNumber):0,timestamp:Q.timestamp?a0(Q.timestamp):void 0,transactionIndex:Q.transactionIndex?a0(Q.transactionIndex):0,logIndex:Q.logIndex?a0(Q.logIndex):0,transactionHash:Q.transactionHash};for(let[Y,Z]of Object.entries(Q)){if(["blockNumber","timestamp","transactionIndex","logIndex","transactionHash"].includes(Y))continue;G[Y]=E8(Y,Z)}return G}function z$($){return $.map(g$)}class h0{_subscribers=[];subscribe($){return this._subscribers.push($),()=>{let J=this._subscribers.indexOf($);if(J>-1)this._subscribers.splice(J,1)}}constructor(){this._subscribers=[]}emit($){this._subscribers.forEach((J)=>J($))}static create(){let $=new h0;return{property:$,emit:(J)=>$.emit(J)}}}class s0 extends Error{name;code;source;cause;context;constructor($,J,Q){super(J);if(this.name=$,this.code=Q?.code,this.source=Q?.source??"UNKNOWN",this.cause=Q?.cause,this.context=Q?.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 $=`[${this.source}] ${this.name}: ${this.message}`;if(this.code)$+=` (Code: ${this.code})`;if(this.context)$+=`
2
- Context: ${JSON.stringify(this.context,null,2)}`;return $}}class t extends s0{constructor($,J){super("RpcError",$,{...J,source:J?.source??"RPC_REQUEST"})}static connectionFailed($,J){return new t("Failed to connect to RPC endpoint",{code:"RPC_CONNECTION_FAILED",source:"RPC_CONNECTION",cause:J,context:{url:$}})}static timeout($,J){return new t("RPC request timed out",{code:"RPC_TIMEOUT",source:"RPC_TIMEOUT",context:{method:$,timeout:J}})}static invalidResponse($,J){return new t("Invalid RPC response",{code:"RPC_INVALID_RESPONSE",source:"RPC_RESPONSE",context:{method:$,response:J}})}static fromJsonRpcError($){return new t($.message,{code:$.code,source:"RPC_RESPONSE",context:{data:$.data}})}static websocketError($,J){return new t($,{code:"RPC_WEBSOCKET_ERROR",source:"RPC_WEBSOCKET",cause:J})}}class R0{rpcUrl;requestId=0;websocket=null;websocketConnected=!1;pendingResponses={};subscriptionListeners={};reconnectAttempt=0;initialBackoff=2000;maxBackoff=120000;constructor($){this.rpcUrl=$}async call($,J){this.requestId++;let Q={jsonrpc:"2.0",id:this.requestId,method:$,params:J};try{let G=await fetch(this.rpcUrl,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(Q)});if(!G.ok)throw t.connectionFailed(this.rpcUrl,Error(`HTTP ${G.status}: ${G.statusText}`));let Y=await G.json();if(Y.error)throw t.fromJsonRpcError(Y.error);if(Y.result===void 0)throw t.invalidResponse($,Y);return Y.result}catch(G){if(G instanceof t)throw G;throw t.connectionFailed(this.rpcUrl,G)}}setRpcUrl($){this.rpcUrl=$}getRpcUrl(){return this.rpcUrl}connect(){return new Promise(($)=>{let J=this.rpcUrl.replace("http","ws");if(J.endsWith("/"))J+="ws";else J+="/ws";this.websocket=new WebSocket(J),this.websocket.onopen=()=>{console.log("WebSocket connected"),this.websocketConnected=!0,this.reconnectAttempt=0,$()},this.websocket.onmessage=(Q)=>{let G=JSON.parse(Q.data),{id:Y,method:Z,params:K}=G;if(Y!==void 0&&this.pendingResponses[Y])this.pendingResponses[Y].resolve(G),delete this.pendingResponses[Y];if(Z==="eth_subscription"&&K){let{subscription:X,result:q}=K;if(this.subscriptionListeners[X])this.subscriptionListeners[X].forEach((M)=>M(q))}},this.websocket.onclose=()=>{console.warn("WebSocket closed"),this.websocketConnected=!1},this.websocket.onerror=(Q)=>{console.error("WebSocket error:",Q),this.websocketConnected=!1,this.scheduleReconnect()}})}scheduleReconnect(){let $=Math.min(this.initialBackoff*Math.pow(2,this.reconnectAttempt),this.maxBackoff),J=$*(Math.random()*0.5),Q=$+J;console.log(`Reconnecting in ${Math.round(Q)}ms (attempt #${this.reconnectAttempt+1})`),this.reconnectAttempt++,setTimeout(()=>{this.reconnect()},Q)}async reconnect(){if(this.websocketConnected)return;try{await this.connect(),console.log("Reconnection successful")}catch($){console.error("Reconnection attempt failed:",$),this.scheduleReconnect()}}sendMessage($,J,Q=5000){if(!this.websocket||this.websocket.readyState!==WebSocket.OPEN)return Promise.reject(t.connectionFailed(this.rpcUrl));let G=this.requestId++,Y={jsonrpc:"2.0",method:$,params:J,id:G};return new Promise((Z,K)=>{this.pendingResponses[G]={resolve:Z,reject:K},this.websocket.send(JSON.stringify(Y)),setTimeout(()=>{if(this.pendingResponses[G])this.pendingResponses[G].reject(t.timeout($,Q)),delete this.pendingResponses[G]},Q)})}async subscribe($){let J=$?.toLowerCase();if(!this.websocketConnected)await this.connect();let Q=h0.create(),G=JSON.stringify(J?{address:J}:{}),Z=(await this.sendMessage("eth_subscribe",["circles",G])).result;if(!this.subscriptionListeners[Z])this.subscriptionListeners[Z]=[];return this.subscriptionListeners[Z].push((K)=>{z$(K).forEach((X)=>Q.emit(X))}),Q.property}}var D$=BigInt(4294967295),_J=BigInt(32);function A8($,J=!1){if(J)return{h:Number($&D$),l:Number($>>_J&D$)};return{h:Number($>>_J&D$)|0,l:Number($&D$)|0}}function EJ($,J=!1){let Q=$.length,G=new Uint32Array(Q),Y=new Uint32Array(Q);for(let Z=0;Z<Q;Z++){let{h:K,l:X}=A8($[Z],J);[G[Z],Y[Z]]=[K,X]}return[G,Y]}var xJ=($,J,Q)=>$<<Q|J>>>32-Q,AJ=($,J,Q)=>J<<Q|$>>>32-Q,kJ=($,J,Q)=>J<<Q-32|$>>>64-Q,wJ=($,J,Q)=>$<<Q-32|J>>>64-Q;var I0=typeof globalThis==="object"&&"crypto"in globalThis?globalThis.crypto:void 0;/*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) */function k8($){return $ instanceof Uint8Array||ArrayBuffer.isView($)&&$.constructor.name==="Uint8Array"}function T0($){if(!Number.isSafeInteger($)||$<0)throw Error("positive integer expected, got "+$)}function K0($,...J){if(!k8($))throw Error("Uint8Array expected");if(J.length>0&&!J.includes($.length))throw Error("Uint8Array expected of length "+J+", got length="+$.length)}function yJ($){if(typeof $!=="function"||typeof $.create!=="function")throw Error("Hash should be wrapped by utils.createHasher");T0($.outputLen),T0($.blockLen)}function M0($,J=!0){if($.destroyed)throw Error("Hash instance has been destroyed");if(J&&$.finished)throw Error("Hash#digest() has already been called")}function V$($,J){K0($);let Q=J.outputLen;if($.length<Q)throw Error("digestInto() expects output buffer of length at least "+Q)}function FJ($){return new Uint32Array($.buffer,$.byteOffset,Math.floor($.byteLength/4))}function X0(...$){for(let J=0;J<$.length;J++)$[J].fill(0)}function O$($){return new DataView($.buffer,$.byteOffset,$.byteLength)}function Y0($,J){return $<<32-J|$>>>J}var w8=(()=>new Uint8Array(new Uint32Array([287454020]).buffer)[0]===68)();function y8($){return $<<24&4278190080|$<<8&16711680|$>>>8&65280|$>>>24&255}function F8($){for(let J=0;J<$.length;J++)$[J]=y8($[J]);return $}var f$=w8?($)=>$:F8;function b8($){if(typeof $!=="string")throw Error("string expected");return new Uint8Array(new TextEncoder().encode($))}function _0($){if(typeof $==="string")$=b8($);return K0($),$}function bJ(...$){let J=0;for(let G=0;G<$.length;G++){let Y=$[G];K0(Y),J+=Y.length}let Q=new Uint8Array(J);for(let G=0,Y=0;G<$.length;G++){let Z=$[G];Q.set(Z,Y),Y+=Z.length}return Q}class E0{}function R$($){let J=(G)=>$().update(_0(G)).digest(),Q=$();return J.outputLen=Q.outputLen,J.blockLen=Q.blockLen,J.create=()=>$(),J}function gJ($=32){if(I0&&typeof I0.getRandomValues==="function")return I0.getRandomValues(new Uint8Array($));if(I0&&typeof I0.randomBytes==="function")return Uint8Array.from(I0.randomBytes($));throw Error("crypto.getRandomValues must be defined")}var g8=BigInt(0),r0=BigInt(1),f8=BigInt(2),v8=BigInt(7),h8=BigInt(256),m8=BigInt(113),hJ=[],mJ=[],uJ=[];for(let $=0,J=r0,Q=1,G=0;$<24;$++){[Q,G]=[G,(2*Q+3*G)%5],hJ.push(2*(5*G+Q)),mJ.push(($+1)*($+2)/2%64);let Y=g8;for(let Z=0;Z<7;Z++)if(J=(J<<r0^(J>>v8)*m8)%h8,J&f8)Y^=r0<<(r0<<BigInt(Z))-r0;uJ.push(Y)}var cJ=EJ(uJ,!0),u8=cJ[0],c8=cJ[1],fJ=($,J,Q)=>Q>32?kJ($,J,Q):xJ($,J,Q),vJ=($,J,Q)=>Q>32?wJ($,J,Q):AJ($,J,Q);function l8($,J=24){let Q=new Uint32Array(10);for(let G=24-J;G<24;G++){for(let K=0;K<10;K++)Q[K]=$[K]^$[K+10]^$[K+20]^$[K+30]^$[K+40];for(let K=0;K<10;K+=2){let X=(K+8)%10,q=(K+2)%10,M=Q[q],j=Q[q+1],N=fJ(M,j,1)^Q[X],z=vJ(M,j,1)^Q[X+1];for(let D=0;D<50;D+=10)$[K+D]^=N,$[K+D+1]^=z}let Y=$[2],Z=$[3];for(let K=0;K<24;K++){let X=mJ[K],q=fJ(Y,Z,X),M=vJ(Y,Z,X),j=hJ[K];Y=$[j],Z=$[j+1],$[j]=q,$[j+1]=M}for(let K=0;K<50;K+=10){for(let X=0;X<10;X++)Q[X]=$[K+X];for(let X=0;X<10;X++)$[K+X]^=~Q[(X+2)%10]&Q[(X+4)%10]}$[0]^=u8[G],$[1]^=c8[G]}X0(Q)}class v$ extends E0{constructor($,J,Q,G=!1,Y=24){super();if(this.pos=0,this.posOut=0,this.finished=!1,this.destroyed=!1,this.enableXOF=!1,this.blockLen=$,this.suffix=J,this.outputLen=Q,this.enableXOF=G,this.rounds=Y,T0(Q),!(0<$&&$<200))throw Error("only keccak-f1600 function is supported");this.state=new Uint8Array(200),this.state32=FJ(this.state)}clone(){return this._cloneInto()}keccak(){f$(this.state32),l8(this.state32,this.rounds),f$(this.state32),this.posOut=0,this.pos=0}update($){M0(this),$=_0($),K0($);let{blockLen:J,state:Q}=this,G=$.length;for(let Y=0;Y<G;){let Z=Math.min(J-this.pos,G-Y);for(let K=0;K<Z;K++)Q[this.pos++]^=$[Y++];if(this.pos===J)this.keccak()}return this}finish(){if(this.finished)return;this.finished=!0;let{state:$,suffix:J,pos:Q,blockLen:G}=this;if($[Q]^=J,(J&128)!==0&&Q===G-1)this.keccak();$[G-1]^=128,this.keccak()}writeInto($){M0(this,!1),K0($),this.finish();let J=this.state,{blockLen:Q}=this;for(let G=0,Y=$.length;G<Y;){if(this.posOut>=Q)this.keccak();let Z=Math.min(Q-this.posOut,Y-G);$.set(J.subarray(this.posOut,this.posOut+Z),G),this.posOut+=Z,G+=Z}return $}xofInto($){if(!this.enableXOF)throw Error("XOF is not possible for this instance");return this.writeInto($)}xof($){return T0($),this.xofInto(new Uint8Array($))}digestInto($){if(V$($,this),this.finished)throw Error("digest() was already called");return this.writeInto($),this.destroy(),$}digest(){return this.digestInto(new Uint8Array(this.outputLen))}destroy(){this.destroyed=!0,X0(this.state)}_cloneInto($){let{blockLen:J,suffix:Q,outputLen:G,rounds:Y,enableXOF:Z}=this;return $||($=new v$(J,Q,G,Z,Y)),$.state32.set(this.state32),$.pos=this.pos,$.posOut=this.posOut,$.finished=this.finished,$.rounds=Y,$.suffix=Q,$.outputLen=G,$.enableXOF=Z,$.destroyed=this.destroyed,$}}var p8=($,J,Q)=>R$(()=>new v$(J,$,Q));var m0=(()=>p8(1,136,32))();var lJ=[];for(let $=0;$<256;$++)lJ[$]=$.toString(16).padStart(2,"0");function C$($){let J="0x";for(let Q=0;Q<$.length;Q++)J+=lJ[$[Q]];return J}function P$($){let J=$.startsWith("0x")?$.slice(2):$,Q=new Uint8Array(J.length/2);for(let G=0;G<J.length;G+=2)Q[G/2]=parseInt(J.slice(G,G+2),16);return Q}var u=64,L$=32,B$=($)=>$.startsWith("0x")?$.slice(2):$;var q0=($)=>$.toString(16).padStart(u,"0");function P0($){let J=$.toLowerCase().replace("0x",""),Q=C$(m0(new TextEncoder().encode(J))).slice(2),G="0x";for(let Y=0;Y<J.length;Y++)G+=parseInt(Q[Y],16)>=8?J[Y].toUpperCase():J[Y];return G}function h$($,J){if($==="tuple"&&J)return`(${J.map((Y)=>h$(Y.type,Y.components)).join(",")})`;let Q=$.match(/^tuple(\[\d*\])$/);if(Q&&J)return`${h$("tuple",J)}${Q[1]}`;return $}function d8($){let Q=($.inputs||[]).map((G)=>h$(G.type,G.components));return`${$.name}(${Q.join(",")})`}function i8($){let J=d8($),Q=m0(new TextEncoder().encode(J));return C$(Q.slice(0,4))}function u0($,J){if($==="string"||$==="bytes")return!0;if($.includes("[")){let Q=$.slice(0,$.indexOf("["));if($.endsWith("[]"))return!0;if(Q==="tuple")return pJ(J);return u0(Q)}if($==="tuple")return pJ(J);return!1}function pJ($){return $?.some((J)=>u0(J.type,J.components))??!1}function C0($,J,Q){if($==="tuple"&&Q)return o8(Q,J);if($.includes("["))return n8($,J,Q);return t8($,J)}function n8($,J,Q){let G=$.slice(0,$.indexOf("[")),Y=$.endsWith("[]"),Z=u0(G,Q),K;if(Z){let X=J.map((j)=>C0(G,j,Q)),q=J.length*L$;K=X.map((j)=>{let N=q;return q+=j.length/2,q0(N)}).join("")+X.join("")}else K=J.map((X)=>C0(G,X,Q)).join("");return Y?q0(J.length)+K:K}function o8($,J){let Q=Array.isArray(J),G=[],Y=[],Z=[];for(let K=0;K<$.length;K++){let X=$[K],q=Q?J[K]:J[X.name||""],M=u0(X.type,X.components);if(Z.push(M),M)G.push(""),Y.push(C0(X.type,q,X.components));else G.push(C0(X.type,q,X.components))}if(Y.length>0){let K=G.reduce((M,j,N)=>M+(Z[N]?L$:j.length/2),0),X="",q=0;for(let M=0;M<$.length;M++)if(Z[M])X+=q0(K),K+=Y[q].length/2,q++;else X+=G[M];return X+Y.join("")}return G.join("")}function t8($,J){if($==="address")return B$(J).toLowerCase().padStart(u,"0");if($==="bool")return q0(J?1:0);if($.startsWith("uint")){let Q=typeof J==="bigint"?J:BigInt(J);return q0(Q)}if($.startsWith("int")){let Q=typeof J==="bigint"?J:BigInt(J);if(Q<0n){let G=$==="int"?256:parseInt($.slice(3));Q=(1n<<BigInt(G))+Q}return q0(Q)}if($.startsWith("bytes")&&$!=="bytes")return B$(J).padEnd(u,"0");if($==="bytes"){let Q=B$(J),G=q0(Q.length/2),Y=Q.padEnd(Math.ceil(Q.length/u)*u,"0");return G+Y}if($==="string"){let Q=Array.from(new TextEncoder().encode(J)).map((Z)=>Z.toString(16).padStart(2,"0")).join(""),G=q0(Q.length/2),Y=Q.padEnd(Math.ceil(Q.length/u)*u,"0");return G+Y}throw Error(`Unsupported type: ${$}`)}function e0($,J,Q=0,G){if($==="tuple"&&G)return s8(G,J,Q);if($.includes("["))return a8($,J,Q,G);return r8($,J,Q)}function a8($,J,Q,G){let Y=$.slice(0,$.indexOf("[")),Z=J.slice(Q,Q+u);if($.endsWith("[]")){let X=parseInt(Z,16)*2,q=parseInt(J.slice(X,X+u),16),M=[],j=X+u;for(let N=0;N<q;N++){let z=e0(Y,J,j,G);M.push(z.value),j+=z.consumed}return{value:M,consumed:u}}let K=$.match(/\[(\d+)\]$/);if(K){let X=parseInt(K[1]),q=[],M=0;for(let j=0;j<X;j++){let N=e0(Y,J,Q+M,G);q.push(N.value),M+=N.consumed}return{value:q,consumed:M}}throw Error(`Invalid array type: ${$}`)}function s8($,J,Q){let G=[],Y=Q;for(let Z of $){let K=e0(Z.type,J,Y,Z.components);G.push(K.value),Y+=K.consumed}return{value:G,consumed:Y-Q}}function r8($,J,Q){let G=J.slice(Q,Q+u);if($==="address")return{value:P0("0x"+G.slice(24)),consumed:u};if($==="bool")return{value:parseInt(G,16)!==0,consumed:u};if($.startsWith("uint"))return{value:BigInt("0x"+G),consumed:u};if($.startsWith("int")){let Y=BigInt("0x"+G),Z=$==="int"?256:parseInt($.slice(3)),K=1n<<BigInt(Z-1);return{value:Y>=K?Y-(1n<<BigInt(Z)):Y,consumed:u}}if($.startsWith("bytes")&&$!=="bytes"){let Y=parseInt($.match(/^bytes(\d+)$/)[1]);return{value:"0x"+G.slice(0,Y*2),consumed:u}}if($==="bytes"){let Y=parseInt(G,16)*2,Z=parseInt(J.slice(Y,Y+u),16)*2;return{value:"0x"+J.slice(Y+u,Y+u+Z),consumed:u}}if($==="string"){let Y=parseInt(G,16)*2,Z=parseInt(J.slice(Y,Y+u),16)*2,K=J.slice(Y+u,Y+u+Z),X=new Uint8Array(K.match(/.{2}/g)?.map((q)=>parseInt(q,16))||[]);return{value:new TextDecoder().decode(X),consumed:u}}throw Error(`Unsupported type: ${$}`)}function H$($){let{abi:J,functionName:Q,args:G=[]}=$,Y=J.find((D)=>D.type==="function"&&D.name===Q);if(!Y)throw Error(`Function "${Q}" not found in ABI`);let Z=i8(Y),K=Y.inputs||[];if(K.length===0)return Z;if(G.length!==K.length)throw Error(`Expected ${K.length} arguments, got ${G.length}`);let X=[],q=[],M=[];for(let D=0;D<K.length;D++){let H=K[D],V=H.components,B=u0(H.type,V);if(M.push(B),B)X.push(""),q.push(C0(H.type,G[D],V));else X.push(C0(H.type,G[D],V))}if(q.length===0)return Z+X.join("");let j=X.reduce((D,H,V)=>D+(M[V]?L$:H.length/2),0),N="",z=0;for(let D=0;D<K.length;D++)if(M[D])N+=q0(j),j+=q[z].length/2,z++;else N+=X[D];return Z+N+q.join("")}function m$($){let{abi:J,functionName:Q,data:G}=$,Y=J.find((M)=>M.type==="function"&&M.name===Q);if(!Y)throw Error(`Function "${Q}" not found in ABI`);let Z=Y.outputs||[];if(Z.length===0)return;let K=B$(G);if(Z.length===1)return e0(Z[0].type,K,0,Z[0].components).value;let X=[],q=0;for(let M of Z){let j=e0(M.type,K,q,M.components);X.push(j.value),q+=j.consumed}return X}function Z0($,J){if($.length!==J.length)throw Error(`Type/value length mismatch: ${$.length} types, ${J.length} values`);let Q=[],G=[],Y=[];for(let q=0;q<$.length;q++){let M=$[q],j=u0(M);if(Y.push(j),j)Q.push(""),G.push(C0(M,J[q]));else Q.push(C0(M,J[q]))}if(G.length===0)return"0x"+Q.join("");let Z=Q.reduce((q,M,j)=>q+(Y[j]?L$:M.length/2),0),K="",X=0;for(let q=0;q<$.length;q++)if(Y[q])K+=q0(Z),Z+=G[X].length/2,X++;else K+=Q[q];return"0x"+K+G.join("")}function P($){return $.toLowerCase()}function e8($){return P0($)}function $Q($){if(typeof $!=="string")return!1;let J=$.replace("0x","");return J.length===40&&/^[0-9a-fA-F]{40}$/.test(J)}function f($){if($===null||$===void 0)return $;if($Q($))return e8($);if(Array.isArray($))return $.map((J)=>f(J));if(typeof $==="object"&&$!==null){let J={};for(let Q in $)if(Object.prototype.hasOwnProperty.call($,Q))J[Q]=f($[Q]);return J}return $}function dJ($){return{Source:P($.from),Sink:P($.to),TargetFlow:$.targetFlow.toString(),WithWrap:$.useWrappedBalances,FromTokens:$.fromTokens?.map(P),ToTokens:$.toTokens?.map(P),ExcludedFromTokens:$.excludeFromTokens?.map(P),ExcludedToTokens:$.excludeToTokens?.map(P),SimulatedBalances:$.simulatedBalances?.map((J)=>({Holder:P(J.holder),Token:P(J.token),Amount:J.amount.toString(),IsWrapped:J.isWrapped,IsStatic:J.isStatic})),SimulatedTrusts:$.simulatedTrusts?.map((J)=>({Truster:P(J.truster),Trustee:P(J.trustee)})),MaxTransfers:$.maxTransfers}}function j0($){let J={};for(let Q in $){let G=$[Q];if(G===null||G===void 0)J[Q]=G;else if(typeof G==="string"&&/^\d+$/.test(G))J[Q]=BigInt(G);else if(typeof G==="object"&&!Array.isArray(G))J[Q]=j0(G);else if(Array.isArray(G))J[Q]=G.map((Y)=>typeof Y==="object"&&Y!==null?j0(Y):Y);else J[Q]=G}return J}var S$="0x0000000000000000000000000000000000000000",Q0=BigInt(96)*BigInt(1000000000000000000),$$=BigInt("9999999999999999999999999999999999999"),u$="0x4e1DCf7AD4e460CfD30791CCC4F9c8a4f820ec67",c$="0x89867a67674bd4bf33165a653cde826b696ab7d050166b71066dfa0b9b6f90f4",l$="0xe298282cefe913ab5d282047161268a8222e4bd4ed106300c547894bbefd31ee";class U0{client;constructor($){this.client=$}async findPath($){let J=dJ($),Q=await this.client.call("circlesV2_findPath",[J]),G=j0(Q);return f(G)}async findMaxFlow($){let J=await this.findPath({...$,targetFlow:$$});return BigInt(J.maxFlow)}}class J${client;constructor($){this.client=$}async query($){let J=await this.client.call("circles_query",[$]);return f(J)}async tables(){return this.client.call("circles_tables",[])}async events($,J,Q=null,G=null,Y=!1){let Z=await this.client.call("circles_events",[$,J,Q,G,Y]);return f(Z)}}var JQ=[{name:"blockNumber",sortOrder:"DESC"},{name:"transactionIndex",sortOrder:"DESC"},{name:"logIndex",sortOrder:"DESC"}];class $0{params;client;rowTransformer;cursorColumns;orderColumns;get currentPage(){return this._currentPage}_currentPage;constructor($,J,Q){this.client=$,this.params=J,this.rowTransformer=Q||J.rowTransformer,this.orderColumns=J.orderColumns,this.cursorColumns=J.cursorColumns||this.buildEventCursorColumns()}buildEventCursorColumns(){let $=JQ.map((J)=>({...J,sortOrder:this.params.sortOrder}));if(this.params.table==="TransferBatch")$.push({name:"batchIndex",sortOrder:this.params.sortOrder});return $}transformCursorValue($,J){if(J)return J($);if(typeof $==="bigint")return $.toString();return $}createEqualityPredicate($,J){return{Type:"FilterPredicate",FilterType:"Equals",Column:$.name,Value:this.transformCursorValue(J,$.toValue)}}createComparisonPredicate($,J){return{Type:"FilterPredicate",FilterType:$.sortOrder==="ASC"?"GreaterThan":"LessThan",Column:$.name,Value:this.transformCursorValue(J,$.toValue)}}buildCursorFilter($){if(!$)return[];let J=[];for(let Q=0;Q<this.cursorColumns.length;Q++){let G=this.cursorColumns[Q],Y=$[G.name];if(Y===void 0)continue;if(Q===0)J.push(this.createComparisonPredicate(G,Y));else{let Z=[];for(let K=0;K<Q;K++){let X=this.cursorColumns[K],q=$[X.name];if(q!==void 0)Z.push(this.createEqualityPredicate(X,q))}Z.push(this.createComparisonPredicate(G,Y)),J.push({Type:"Conjunction",ConjunctionType:"And",Predicates:Z})}}if(J.length===0)return[];return[{Type:"Conjunction",ConjunctionType:"Or",Predicates:J}]}buildOrderBy(){if(this.orderColumns&&this.orderColumns.length>0)return this.orderColumns;return this.cursorColumns.map(($)=>({Column:$.name,SortOrder:$.sortOrder}))}combineFilters($,J){if(!$?.length&&!J?.length)return[];if(!$?.length)return J||[];if(!J?.length)return $;return[{Type:"Conjunction",ConjunctionType:"And",Predicates:[...$,...J]}]}rowsToObjects($){let{columns:J,rows:Q}=$;return Q.map((G)=>{let Y={};return J.forEach((Z,K)=>{Y[Z]=G[K]}),this.rowTransformer?this.rowTransformer(Y):Y})}rowToCursor($){let J={};for(let Q of this.cursorColumns)J[Q.name]=$[Q.name];return J}getCursors($){if($.length===0)return{};return{first:this.rowToCursor($[0]),last:this.rowToCursor($[$.length-1])}}async queryNextPage(){let $=this.buildCursorFilter(this._currentPage?.lastCursor),J=this.combineFilters(this.params.filter,$),Q={Namespace:this.params.namespace,Table:this.params.table,Columns:this.params.columns,Filter:J,Order:this.buildOrderBy(),Limit:this.params.limit},G=await this.client.call("circles_query",[Q]),Y=this.rowsToObjects(G),Z=this.getCursors(Y);return this._currentPage={limit:this.params.limit,size:Y.length,firstCursor:Z.first,lastCursor:Z.last,sortOrder:this.params.sortOrder,hasMore:Y.length===this.params.limit,results:Y},Y.length>0}reset(){this._currentPage=void 0}}class x0{client;constructor($){this.client=$}transformQueryResponse($){let{columns:J,rows:Q}=$;return Q.map((G)=>{let Y={};return J.forEach((Z,K)=>{Y[Z]=G[K]}),Y})}async getCommonTrust($,J){let Q=await this.client.call("circles_getCommonTrust",[P($),P(J)]);return f(Q)}getTrustRelations($,J=100,Q="DESC"){let G=P($),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 $0(this.client,{namespace:"V_Crc",table:"TrustRelations",sortOrder:Q,columns:["blockNumber","timestamp","transactionIndex","logIndex","transactionHash","version","trustee","truster","expiryTime"],filter:Y,limit:J},(Z)=>f(Z))}async getAggregatedTrustRelations($){let J=P($),Q=this.getTrustRelations(J,1000),G=[];while(await Q.queryNextPage())if(G.push(...Q.currentPage.results),!Q.currentPage.hasMore)break;let Y={};G.forEach((K)=>{let X=P(K.truster),q=P(K.trustee),M=X!==J?K.truster:K.trustee;if(!Y[M])Y[M]=[];Y[M].push(K)});let Z=Object.entries(Y).filter(([K])=>P(K)!==J).map(([K,X])=>{let q=Math.max(...X.map((j)=>j.timestamp)),M;if(X.length===2)M="mutuallyTrusts";else if(P(X[0]?.trustee)===J)M="trustedBy";else if(P(X[0]?.truster)===J)M="trusts";else throw Error("Unexpected trust list row. Couldn't determine trust relation.");return{subjectAvatar:J,relation:M,objectAvatar:K,timestamp:q}});return f(Z)}async getTrustedBy($){let J=P($),G=(await this.getAggregatedTrustRelations(J)).filter((Y)=>Y.relation==="trustedBy");return f(G)}async getTrusts($){let J=P($),G=(await this.getAggregatedTrustRelations(J)).filter((Y)=>Y.relation==="trusts");return f(G)}async getMutualTrusts($){let J=P($),G=(await this.getAggregatedTrustRelations(J)).filter((Y)=>Y.relation==="mutuallyTrusts");return f(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){return $*J>>64n}static mulU($,J){return $*J>>64n}static pow64($,J){let Q=$,G=J,Y=this.ONE_64;while(G>0n){if((G&1n)===1n)Y=this.mul64(Y,Q);Q=this.mul64(Q,Q),G>>=1n}return Y}static ONE_36=1000000000000000000000000000000000000000n;static GAMMA_36=999801332008598957430613406568191166n;static BETA_36=1000198707468214629156271489013303962n;static mul36($,J){return $*J/this.ONE_36}static pow36($,J){let Q=this.ONE_36,G=$,Y=J;while(Y>0n){if((Y&1n)===1n)Q=this.mul36(Q,G);G=this.mul36(G,G),Y>>=1n}return Q}static attoCirclesToCircles($){if($===0n)return 0;let J=$/this.ATTO_FACTOR,Q=$%this.ATTO_FACTOR,G=BigInt(Number.MAX_SAFE_INTEGER);if(J>G||J<-G)throw RangeError("Atto value’s integer component exceeds JS double precision.");return Number(J)+Number(Q)/Number(this.ATTO_FACTOR)}static circlesToAttoCircles($){return BigInt(Math.trunc($*Number(this.ATTO_FACTOR)))}static inflationaryToDemurrage($,J){return this.mulU(this.pow64(this.GAMMA_64,J),$)}static demurrageToInflationary($,J){return this.mulU(this.pow64(this.BETA_64,J),$)}static dayFromTimestamp($){return($-this.INFLATION_DAY_ZERO_UNIX)/this.SECONDS_PER_DAY}static attoCirclesToAttoStaticCircles($,J=BigInt(Math.floor(Date.now()/1000))){return this.demurrageToInflationary($,this.dayFromTimestamp(J))}static attoStaticCirclesToAttoCircles($,J=BigInt(Math.floor(Date.now()/1000))){return this.inflationaryToDemurrage($,this.dayFromTimestamp(J))}static inflationaryToDemurrageExact($,J){let Q=this.pow36(this.GAMMA_36,J);return $*Q/this.ONE_36}static demurrageToInflationaryExact($,J){let Q=this.pow36(this.BETA_36,J);return $*Q/this.ONE_36}static attoCirclesToAttoStaticCirclesExact($,J=BigInt(Math.floor(Date.now()/1000))){let Q=this.dayFromTimestamp(J);return this.demurrageToInflationaryExact($,Q)}static attoStaticCirclesToAttoCirclesExact($,J=BigInt(Math.floor(Date.now()/1000))){let Q=this.dayFromTimestamp(J);return this.inflationaryToDemurrageExact($,Q)}static truncateToInt64($){let J=$/this.FACTOR_1E12,Q=9223372036854775807n;return J>Q?Q:J}static blowUpToBigInt($){return $*this.FACTOR_1E12}static truncateToSixDecimals($){return this.blowUpToBigInt(this.truncateToInt64($))}static v1InflateFactor($){if($===0n)return this.V1_ACCURACY;return this.V1_ACCURACY*this.V1_INFLATION_PCT_NUM**$/this.V1_INFLATION_PCT_DEN**$}static attoCrcToAttoCircles($,J){let Q=J-this.INFLATION_DAY_ZERO_UNIX,G=Q/this.PERIOD_SEC,Y=Q%this.PERIOD_SEC,Z=this.v1InflateFactor(G),K=this.v1InflateFactor(G+1n);return this.v1ToDemurrage($,Z,K,Y,this.PERIOD_SEC)}static attoCirclesToAttoCrc($,J){let Q=J-this.INFLATION_DAY_ZERO_UNIX,G=Q/this.PERIOD_SEC,Y=Q%this.PERIOD_SEC,Z=this.v1InflateFactor(G),K=this.v1InflateFactor(G+1n),X=Z*(this.PERIOD_SEC-Y)+K*Y;return $*3n*this.V1_ACCURACY*this.PERIOD_SEC/X}static v1ToDemurrage($,J,Q,G,Y){let Z=J*(Y-G)+Q*G;return $*3n*this.V1_ACCURACY*Y/Z}}class A0{client;constructor($){this.client=$}async getTotalBalance($,J=!0){let Q=await this.client.call("circlesV2_getTotalBalance",[P($),J]);return d.circlesToAttoCircles(Q)}async getTokenBalances($){let Q=(await this.client.call("circles_getTokenBalances",[P($)])).map((G)=>j0(G));return f(Q)}}class Q${client;constructor($){this.client=$}async getAvatarInfo($){let J=await this.getAvatarInfoBatch([$]);return J.length>0?J[0]:void 0}async getAvatarInfoBatch($){if($.length===0)return[];let J=$.map((G)=>P(G)),Q=await this.client.call("circles_getAvatarInfoBatch",[J]);return f(Q)}async getNetworkSnapshot(){let $=await this.client.call("circles_getNetworkSnapshot",[]);return f($)}}class G${client;constructor($){this.client=$}async getProfileByCid($){return this.client.call("circles_getProfileByCid",[$])}async getProfileByCidBatch($){return this.client.call("circles_getProfileByCidBatch",[$])}async getProfileByAddress($){return this.client.call("circles_getProfileByAddress",[P($)])}async getProfileByAddressBatch($){return this.client.call("circles_getProfileByAddressBatch",[$.map((J)=>J===null?null:P(J))])}async searchProfiles($,J=10,Q=0,G){return this.client.call("circles_searchProfiles",[$.toLowerCase(),J,Q,G])}async searchByAddressOrName($,J=10,Q=0,G){let Y=[],Z=/^0x[a-fA-F0-9]{40}$/.test($);if(Z)try{let K=await this.getProfileByAddress($);if(K){let X={...K,address:$};if(!G||!X.avatarType||G.includes(X.avatarType))Y.push(X)}}catch(K){console.warn("Failed to get profile by address:",K)}try{let K=await this.searchProfiles($,J,Q,G);if(Z&&Y.length>0){let X=$.toLowerCase(),q=K.filter((M)=>M.address?.toLowerCase()!==X);Y.push(...q)}else Y.push(...K)}catch(K){console.warn("Failed to search profiles by text:",K)}return Y.slice(0,J)}}class Y${client;constructor($){this.client=$}async getTokenInfo($){let J=await this.getTokenInfoBatch([$]);return J.length>0?J[0]:void 0}async getTokenInfoBatch($){if($.length===0)return[];let J=$.map((Y)=>P(Y)),G=(await this.client.call("circles_getTokenInfoBatch",[J])).map((Y)=>j0(Y));return f(G)}getTokenHolders($,J=100,Q="DESC"){let G=P($);return new $0(this.client,{namespace:"V_CrcV2",table:"BalancesByAccountAndToken",columns:["account","tokenAddress","demurragedTotalBalance"],filter:[{Type:"FilterPredicate",FilterType:"Equals",Column:"tokenAddress",Value:G}],cursorColumns:[{name:"demurragedTotalBalance",sortOrder:Q},{name:"account",sortOrder:"ASC"}],orderColumns:[{Column:"demurragedTotalBalance",SortOrder:Q},{Column:"account",SortOrder:"ASC"}],limit:J,sortOrder:Q},(Y)=>({account:Y.account,tokenAddress:Y.tokenAddress,demurragedTotalBalance:Y.demurragedTotalBalance}))}}class Z${client;constructor($){this.client=$}transformQueryResponse($){let{columns:J,rows:Q}=$;return Q.map((G)=>{let Y={};return J.forEach((Z,K)=>{Y[Z]=G[K]}),Y})}async getInvitedBy($){let J=P($),Q=await this.client.call("circles_query",[{Namespace:"CrcV2",Table:"RegisterHuman",Columns:["inviter"],Filter:[{Type:"FilterPredicate",FilterType:"Equals",Column:"avatar",Value:J}],Order:[{Column:"blockNumber",SortOrder:"DESC"}],Limit:1}]);if(Q.length>0)return f(Q[0].inviter);return}async getInvitations($){let J=P($),Q=96,G=await this.client.call("circles_getAvatarInfoBatch",[[J]]);if((G.length>0?G[0]:void 0)?.version===2)return[];let Z=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:J}]}],Order:[]}]),X=this.transformQueryResponse(Z).map((j)=>j.truster);if(X.length===0)return[];let q=await this.client.call("circles_getAvatarInfoBatch",[X]),M=[];for(let j of q){if(!j?.isHuman)continue;let z=(await this.client.call("circles_getTokenBalances",[j.avatar])).find((D)=>P(D.tokenAddress)===P(j.avatar));if(z&&z.circles>=96)M.push(j)}return f(M)}async getInvitationsFrom($,J=!1){let Q=P($);if(J){let G=await this.client.call("circles_query",[{Namespace:"CrcV2",Table:"RegisterHuman",Columns:["avatar"],Filter:[{Type:"FilterPredicate",FilterType:"Equals",Column:"inviter",Value:Q}],Order:[{Column:"blockNumber",SortOrder:"DESC"}]}]),Z=this.transformQueryResponse(G).map((K)=>K.avatar);return f(Z)}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:Q}]}],Order:[]}]),Z=this.transformQueryResponse(G).map((M)=>M.trustee);if(Z.length===0)return[];let K=await this.client.call("circles_getAvatarInfoBatch",[Z]),X=new Set(K.filter((M)=>M!==null).map((M)=>P(M.avatar))),q=Z.filter((M)=>!X.has(P(M)));return f(q)}}}function QQ($,J){let Q=BigInt($),G=d.attoCirclesToCircles(Q),Y=d.attoCirclesToAttoCrc(Q,BigInt(J)),Z=d.attoCirclesToCircles(Y),K=d.attoCirclesToAttoStaticCircles(Q,BigInt(J)),X=d.attoCirclesToCircles(K);return{attoCircles:Q,circles:G,staticAttoCircles:K,staticCircles:X,attoCrc:Y,crc:Z}}class K${client;constructor($){this.client=$}getTransactionHistory($,J=50,Q="DESC"){let G=P($),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 $0(this.client,{namespace:"V_Crc",table:"TransferSummary",sortOrder:Q,columns:[],filter:Y,limit:J},(Z)=>{let K=QQ(Z.value,Z.timestamp),X={...Z,...K};return f(X)})}}class k0{client;constructor($){this.client=$}async findGroups($=50,J){let Q=this.getGroups($,J,"DESC"),G=[];while(await Q.queryNextPage()){if(G.push(...Q.currentPage.results),G.length>=$)break;if(!Q.currentPage.hasMore)break}return G.slice(0,$)}getGroupMemberships($,J=50,Q="DESC"){let G=P($);return new $0(this.client,{namespace:"V_CrcV2",table:"GroupMemberships",sortOrder:Q,columns:["blockNumber","timestamp","transactionIndex","logIndex","transactionHash","group","member","expiryTime"],filter:[{Type:"FilterPredicate",FilterType:"Equals",Column:"member",Value:G}],limit:J},(Y)=>f(Y))}getGroupHolders($,J=100){let Q=P($);return new $0(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:Q}],limit:J,rowTransformer:(G)=>{let Y={...G,totalBalance:BigInt(G.totalBalance),demurragedTotalBalance:BigInt(G.demurragedTotalBalance)};return f(Y)}})}getGroupMembers($,J=100,Q="DESC"){let G=P($);return new $0(this.client,{namespace:"V_CrcV2",table:"GroupMemberships",sortOrder:Q,columns:["blockNumber","timestamp","transactionIndex","logIndex","transactionHash","group","member","expiryTime"],filter:[{Type:"FilterPredicate",FilterType:"Equals",Column:"group",Value:G}],limit:J},(Y)=>f(Y))}getGroups($=50,J,Q="DESC"){let G=[];if(J){if(J.nameStartsWith)G.push({Type:"FilterPredicate",FilterType:"Like",Column:"name",Value:J.nameStartsWith+"%"});if(J.symbolStartsWith)G.push({Type:"FilterPredicate",FilterType:"Like",Column:"symbol",Value:J.symbolStartsWith+"%"});if(J.groupAddressIn&&J.groupAddressIn.length>0){let Z=J.groupAddressIn.map((K)=>({Type:"FilterPredicate",FilterType:"Equals",Column:"group",Value:P(K)}));if(Z.length===1)G.push(Z[0]);else G.push({Type:"Conjunction",ConjunctionType:"Or",Predicates:Z})}if(J.groupTypeIn&&J.groupTypeIn.length>0){let Z=J.groupTypeIn.map((K)=>({Type:"FilterPredicate",FilterType:"Equals",Column:"type",Value:K}));if(Z.length===1)G.push(Z[0]);else G.push({Type:"Conjunction",ConjunctionType:"Or",Predicates:Z})}if(J.ownerIn&&J.ownerIn.length>0){let Z=J.ownerIn.map((K)=>({Type:"FilterPredicate",FilterType:"Equals",Column:"owner",Value:P(K)}));if(Z.length===1)G.push(Z[0]);else G.push({Type:"Conjunction",ConjunctionType:"Or",Predicates:Z})}if(J.mintHandlerEquals)G.push({Type:"FilterPredicate",FilterType:"Equals",Column:"mintHandler",Value:P(J.mintHandlerEquals)});if(J.treasuryEquals)G.push({Type:"FilterPredicate",FilterType:"Equals",Column:"treasury",Value:P(J.treasuryEquals)})}let Y=G.length>1?[{Type:"Conjunction",ConjunctionType:"And",Predicates:G}]:G;return new $0(this.client,{namespace:"V_CrcV2",table:"Groups",sortOrder:Q,columns:["blockNumber","timestamp","transactionIndex","logIndex","transactionHash","group","type","owner","mintPolicy","mintHandler","treasury","service","feeCollection","memberCount","name","symbol","cidV0Digest","erc20WrapperDemurraged","erc20WrapperStatic"],filter:Y,limit:$},(Z)=>f(Z))}}class I${client;_pathfinder;_query;_trust;_balance;_avatar;_profile;_token;_invitation;_transaction;_group;constructor($="https://rpc.circlesubi.network/"){this.client=new R0($)}get pathfinder(){if(!this._pathfinder)this._pathfinder=new U0(this.client);return this._pathfinder}get query(){if(!this._query)this._query=new J$(this.client);return this._query}get trust(){if(!this._trust)this._trust=new x0(this.client);return this._trust}get balance(){if(!this._balance)this._balance=new A0(this.client);return this._balance}get avatar(){if(!this._avatar)this._avatar=new Q$(this.client);return this._avatar}get profile(){if(!this._profile)this._profile=new G$(this.client);return this._profile}get token(){if(!this._token)this._token=new Y$(this.client);return this._token}get invitation(){if(!this._invitation)this._invitation=new Z$(this.client);return this._invitation}get transaction(){if(!this._transaction)this._transaction=new K$(this.client);return this._transaction}get group(){if(!this._group)this._group=new k0(this.client);return this._group}setRpcUrl($){this.client.setRpcUrl($)}getRpcUrl(){return this.client.getRpcUrl()}}class G0{address;abi;rpcUrl;constructor($){this.address=$.address,this.abi=$.abi,this.rpcUrl=$.rpcUrl}async read($,J,Q){let G=H$({abi:this.abi,functionName:$,args:J}),Y={to:this.address,data:G,...Q?.from&&{from:Q.from}},K=await(await fetch(this.rpcUrl,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",id:1,method:"eth_call",params:[Y,"latest"]})})).json();if(K.error)throw Error(`RPC Error: ${K.error.message}`);if(!K.result)throw Error("No result returned from RPC call");return m$({abi:this.abi,functionName:$,data:K.result})}encodeWrite($,J){return H$({abi:this.abi,functionName:$,args:J})}}var iJ=[{type:"function",name:"operateFlowMatrix",inputs:[{name:"_flowVertices",type:"address[]"},{name:"_flow",type:"tuple[]",components:[{name:"streamSinkId",type:"uint16"},{name:"amount",type:"uint192"}]},{name:"_streams",type:"tuple[]",components:[{name:"sourceCoordinate",type:"uint16"},{name:"flowEdgeIds",type:"uint16[]"},{name:"data",type:"bytes"}]},{name:"_packedCoordinates",type:"bytes"}],outputs:[],stateMutability:"nonpayable"},{type:"function",name:"isApprovedForAll",inputs:[{name:"_account",type:"address"},{name:"_operator",type:"address"}],outputs:[{type:"bool"}],stateMutability:"view"},{type:"function",name:"setApprovalForAll",inputs:[{name:"_operator",type:"address"},{name:"_approved",type:"bool"}],outputs:[],stateMutability:"nonpayable"},{type:"function",name:"wrap",inputs:[{name:"_avatar",type:"address"},{name:"_amount",type:"uint256"},{name:"_type",type:"uint8"}],outputs:[{type:"address"}],stateMutability:"nonpayable"},{type:"function",name:"trust",inputs:[{name:"_trustReceiver",type:"address"},{name:"_expiry",type:"uint96"}],outputs:[],stateMutability:"nonpayable"},{type:"function",name:"isTrusted",inputs:[{name:"_truster",type:"address"},{name:"_trustee",type:"address"}],outputs:[{type:"bool"}],stateMutability:"view"},{type:"function",name:"toTokenId",inputs:[{name:"_avatar",type:"address"}],outputs:[{type:"uint256"}],stateMutability:"pure"},{type:"function",name:"safeTransferFrom",inputs:[{name:"_from",type:"address"},{name:"_to",type:"address"},{name:"_id",type:"uint256"},{name:"_value",type:"uint256"},{name:"_data",type:"bytes"}],outputs:[],stateMutability:"nonpayable"},{type:"function",name:"isHuman",inputs:[{name:"_human",type:"address"}],outputs:[{type:"bool"}],stateMutability:"view"},{type:"function",name:"safeBatchTransferFrom",inputs:[{name:"_from",type:"address"},{name:"_to",type:"address"},{name:"_ids",type:"uint256[]"},{name:"_values",type:"uint256[]"},{name:"_data",type:"bytes"}],outputs:[],stateMutability:"nonpayable"}];class B0 extends G0{constructor($){super({address:$.address,abi:iJ,rpcUrl:$.rpcUrl})}async isTrusted($,J){return this.read("isTrusted",[$,J])}async isApprovedForAll($,J){return this.read("isApprovedForAll",[$,J])}async toTokenId($){return this.read("toTokenId",[$])}trust($,J){return{to:this.address,data:this.encodeWrite("trust",[$,J]),value:0n}}setApprovalForAll($,J){return{to:this.address,data:this.encodeWrite("setApprovalForAll",[$,J]),value:0n}}wrap($,J,Q){return{to:this.address,data:this.encodeWrite("wrap",[$,J,Q]),value:0n}}safeTransferFrom($,J,Q,G,Y="0x"){return{to:this.address,data:this.encodeWrite("safeTransferFrom",[$,J,Q,G,Y]),value:0n}}operateFlowMatrix($,J,Q,G){return{to:this.address,data:this.encodeWrite("operateFlowMatrix",[$,J,Q,G]),value:0n}}async isHuman($){return this.read("isHuman",[$])}safeBatchTransferFrom($,J,Q,G,Y="0x"){return{to:this.address,data:this.encodeWrite("safeBatchTransferFrom",[$,J,Q,G,Y]),value:0n}}}var nJ=[{type:"function",name:"erc20Circles",inputs:[{name:"_circlesType",type:"uint8"},{name:"_avatar",type:"address"}],outputs:[{type:"address"}],stateMutability:"view"}];class T$ extends G0{constructor($){super({address:$.address,abi:nJ,rpcUrl:$.rpcUrl})}async erc20Circles($,J){return this.read("erc20Circles",[$,J])}}var p$=[{type:"function",name:"unwrap",inputs:[{name:"_amount",type:"uint256"}],outputs:[],stateMutability:"nonpayable"}];class c0 extends G0{constructor($){super({address:$.address,abi:p$,rpcUrl:$.rpcUrl})}unwrap($){return{to:this.address,data:this.encodeWrite("unwrap",[$]),value:0n}}}class l0 extends G0{constructor($){super({address:$.address,abi:p$,rpcUrl:$.rpcUrl})}unwrap($){return{to:this.address,data:this.encodeWrite("unwrap",[$]),value:0n}}}var d$=[{type:"function",name:"createAccount",inputs:[{name:"signer",type:"address"}],outputs:[{name:"account",type:"address"}],stateMutability:"nonpayable"},{type:"function",name:"createAccounts",inputs:[{name:"signers",type:"address[]"}],outputs:[{name:"_accounts",type:"address[]"}],stateMutability:"nonpayable"}];var i$=[{type:"function",name:"claimInvite",inputs:[],outputs:[{name:"id",type:"uint256"}],stateMutability:"nonpayable"},{type:"function",name:"claimInvites",inputs:[{name:"numberOfInvites",type:"uint256"}],outputs:[{name:"ids",type:"uint256[]"}],stateMutability:"nonpayable"},{type:"function",name:"inviterQuota",inputs:[{name:"",type:"address"}],outputs:[{type:"uint256"}],stateMutability:"view"},{type:"function",name:"INVITATION_FEE",inputs:[],outputs:[{type:"uint256"}],stateMutability:"view"},{type:"function",name:"invitationModule",inputs:[],outputs:[{type:"address"}],stateMutability:"view"}];class p0 extends G0{constructor($){super({address:$.address,abi:d$,rpcUrl:$.rpcUrl})}createAccount($){return{to:this.address,data:this.encodeWrite("createAccount",[$]),value:0n}}createAccounts($){return{to:this.address,data:this.encodeWrite("createAccounts",[$]),value:0n}}}class _$ extends G0{constructor($){super({address:$.address,abi:i$,rpcUrl:$.rpcUrl})}claimInvite(){return{to:this.address,data:this.encodeWrite("claimInvite",[]),value:0n}}claimInvites($){return{to:this.address,data:this.encodeWrite("claimInvites",[$]),value:0n}}async inviterQuota($){return this.read("inviterQuota",[$])}async invitationFee(){return this.read("INVITATION_FEE")}async invitationModule(){return this.read("invitationModule")}}class E$ extends Error{name;code;source;cause;context;constructor($,J,Q){super(J);if(this.name=$,this.code=Q?.code,this.source=Q?.source??"UNKNOWN",this.cause=Q?.cause,this.context=Q?.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 $=`[${this.source}] ${this.name}: ${this.message}`;if(this.code)$+=` (Code: ${this.code})`;if(this.context)$+=`
3
- Context: ${JSON.stringify(this.context,null,2)}`;return $}}function GQ($,J,Q,G){if(typeof $.setBigUint64==="function")return $.setBigUint64(J,Q,G);let Y=BigInt(32),Z=BigInt(4294967295),K=Number(Q>>Y&Z),X=Number(Q&Z),q=G?4:0,M=G?0:4;$.setUint32(J+q,K,G),$.setUint32(J+M,X,G)}function oJ($,J,Q){return $&J^~$&Q}function tJ($,J,Q){return $&J^$&Q^J&Q}class n$ extends E0{constructor($,J,Q,G){super();this.finished=!1,this.length=0,this.pos=0,this.destroyed=!1,this.blockLen=$,this.outputLen=J,this.padOffset=Q,this.isLE=G,this.buffer=new Uint8Array($),this.view=O$(this.buffer)}update($){M0(this),$=_0($),K0($);let{view:J,buffer:Q,blockLen:G}=this,Y=$.length;for(let Z=0;Z<Y;){let K=Math.min(G-this.pos,Y-Z);if(K===G){let X=O$($);for(;G<=Y-Z;Z+=G)this.process(X,Z);continue}if(Q.set($.subarray(Z,Z+K),this.pos),this.pos+=K,Z+=K,this.pos===G)this.process(J,0),this.pos=0}return this.length+=$.length,this.roundClean(),this}digestInto($){M0(this),V$($,this),this.finished=!0;let{buffer:J,view:Q,blockLen:G,isLE:Y}=this,{pos:Z}=this;if(J[Z++]=128,X0(this.buffer.subarray(Z)),this.padOffset>G-Z)this.process(Q,0),Z=0;for(let j=Z;j<G;j++)J[j]=0;GQ(Q,G-8,BigInt(this.length*8),Y),this.process(Q,0);let K=O$($),X=this.outputLen;if(X%4)throw Error("_sha2: outputLen should be aligned to 32bit");let q=X/4,M=this.get();if(q>M.length)throw Error("_sha2: outputLen bigger than state");for(let j=0;j<q;j++)K.setUint32(4*j,M[j],Y)}digest(){let{buffer:$,outputLen:J}=this;this.digestInto($);let Q=$.slice(0,J);return this.destroy(),Q}_cloneInto($){$||($=new this.constructor),$.set(...this.get());let{blockLen:J,buffer:Q,length:G,finished:Y,destroyed:Z,pos:K}=this;if($.destroyed=Z,$.finished=Y,$.length=G,$.pos=K,G%J)$.buffer.set(Q);return $}clone(){return this._cloneInto()}}var W0=Uint32Array.from([1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225]);var YQ=Uint32Array.from([1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298]),L0=new Uint32Array(64);class aJ extends n${constructor($=32){super(64,$,8,!1);this.A=W0[0]|0,this.B=W0[1]|0,this.C=W0[2]|0,this.D=W0[3]|0,this.E=W0[4]|0,this.F=W0[5]|0,this.G=W0[6]|0,this.H=W0[7]|0}get(){let{A:$,B:J,C:Q,D:G,E:Y,F:Z,G:K,H:X}=this;return[$,J,Q,G,Y,Z,K,X]}set($,J,Q,G,Y,Z,K,X){this.A=$|0,this.B=J|0,this.C=Q|0,this.D=G|0,this.E=Y|0,this.F=Z|0,this.G=K|0,this.H=X|0}process($,J){for(let j=0;j<16;j++,J+=4)L0[j]=$.getUint32(J,!1);for(let j=16;j<64;j++){let N=L0[j-15],z=L0[j-2],D=Y0(N,7)^Y0(N,18)^N>>>3,H=Y0(z,17)^Y0(z,19)^z>>>10;L0[j]=H+L0[j-7]+D+L0[j-16]|0}let{A:Q,B:G,C:Y,D:Z,E:K,F:X,G:q,H:M}=this;for(let j=0;j<64;j++){let N=Y0(K,6)^Y0(K,11)^Y0(K,25),z=M+N+oJ(K,X,q)+YQ[j]+L0[j]|0,H=(Y0(Q,2)^Y0(Q,13)^Y0(Q,22))+tJ(Q,G,Y)|0;M=q,q=X,X=K,K=Z+z|0,Z=Y,Y=G,G=Q,Q=z+H|0}Q=Q+this.A|0,G=G+this.B|0,Y=Y+this.C|0,Z=Z+this.D|0,K=K+this.E|0,X=X+this.F|0,q=q+this.G|0,M=M+this.H|0,this.set(Q,G,Y,Z,K,X,q,M)}roundClean(){X0(L0)}destroy(){this.set(0,0,0,0,0,0,0,0),X0(this.buffer)}}var sJ=R$(()=>new aJ);class o$ extends E0{constructor($,J){super();this.finished=!1,this.destroyed=!1,yJ($);let Q=_0(J);if(this.iHash=$.create(),typeof this.iHash.update!=="function")throw Error("Expected instance of class which extends utils.Hash");this.blockLen=this.iHash.blockLen,this.outputLen=this.iHash.outputLen;let G=this.blockLen,Y=new Uint8Array(G);Y.set(Q.length>G?$.create().update(Q).digest():Q);for(let Z=0;Z<Y.length;Z++)Y[Z]^=54;this.iHash.update(Y),this.oHash=$.create();for(let Z=0;Z<Y.length;Z++)Y[Z]^=106;this.oHash.update(Y),X0(Y)}update($){return M0(this),this.iHash.update($),this}digestInto($){M0(this),K0($,this.outputLen),this.finished=!0,this.iHash.digestInto($),this.oHash.update($),this.oHash.digestInto($),this.destroy()}digest(){let $=new Uint8Array(this.oHash.outputLen);return this.digestInto($),$}_cloneInto($){$||($=Object.create(Object.getPrototypeOf(this),{}));let{oHash:J,iHash:Q,finished:G,destroyed:Y,blockLen:Z,outputLen:K}=this;return $=$,$.finished=G,$.destroyed=Y,$.blockLen=Z,$.outputLen=K,$.oHash=J._cloneInto($.oHash),$.iHash=Q._cloneInto($.iHash),$}clone(){return this._cloneInto()}destroy(){this.destroyed=!0,this.oHash.destroy(),this.iHash.destroy()}}var t$=($,J,Q)=>new o$($,J).update(Q).digest();t$.create=($,J)=>new o$($,J);/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */var e$=BigInt(0),r$=BigInt(1);function d0($){return $ instanceof Uint8Array||ArrayBuffer.isView($)&&$.constructor.name==="Uint8Array"}function $J($){if(!d0($))throw Error("Uint8Array expected")}function i0($,J){if(typeof J!=="boolean")throw Error($+" boolean expected, got "+J)}function X$($){let J=$.toString(16);return J.length&1?"0"+J:J}function $8($){if(typeof $!=="string")throw Error("hex string expected, got "+typeof $);return $===""?e$:BigInt("0x"+$)}var J8=typeof Uint8Array.from([]).toHex==="function"&&typeof Uint8Array.fromHex==="function",ZQ=Array.from({length:256},($,J)=>J.toString(16).padStart(2,"0"));function n0($){if($J($),J8)return $.toHex();let J="";for(let Q=0;Q<$.length;Q++)J+=ZQ[$[Q]];return J}var N0={_0:48,_9:57,A:65,F:70,a:97,f:102};function rJ($){if($>=N0._0&&$<=N0._9)return $-N0._0;if($>=N0.A&&$<=N0.F)return $-(N0.A-10);if($>=N0.a&&$<=N0.f)return $-(N0.a-10);return}function q$($){if(typeof $!=="string")throw Error("hex string expected, got "+typeof $);if(J8)return Uint8Array.fromHex($);let J=$.length,Q=J/2;if(J%2)throw Error("hex string expected, got unpadded hex of length "+J);let G=new Uint8Array(Q);for(let Y=0,Z=0;Y<Q;Y++,Z+=2){let K=rJ($.charCodeAt(Z)),X=rJ($.charCodeAt(Z+1));if(K===void 0||X===void 0){let q=$[Z]+$[Z+1];throw Error('hex string expected, got non-hex character "'+q+'" at index '+Z)}G[Y]=K*16+X}return G}function z0($){return $8(n0($))}function JJ($){return $J($),$8(n0(Uint8Array.from($).reverse()))}function w0($,J){return q$($.toString(16).padStart(J*2,"0"))}function QJ($,J){return w0($,J).reverse()}function e($,J,Q){let G;if(typeof J==="string")try{G=q$(J)}catch(Z){throw Error($+" must be hex string or Uint8Array, cause: "+Z)}else if(d0(J))G=Uint8Array.from(J);else throw Error($+" must be hex string or Uint8Array");let Y=G.length;if(typeof Q==="number"&&Y!==Q)throw Error($+" of length "+Q+" expected, got "+Y);return G}function M$(...$){let J=0;for(let G=0;G<$.length;G++){let Y=$[G];$J(Y),J+=Y.length}let Q=new Uint8Array(J);for(let G=0,Y=0;G<$.length;G++){let Z=$[G];Q.set(Z,Y),Y+=Z.length}return Q}var a$=($)=>typeof $==="bigint"&&e$<=$;function x$($,J,Q){return a$($)&&a$(J)&&a$(Q)&&J<=$&&$<Q}function y0($,J,Q,G){if(!x$(J,Q,G))throw Error("expected valid "+$+": "+Q+" <= n < "+G+", got "+J)}function Q8($){let J;for(J=0;$>e$;$>>=r$,J+=1);return J}var F0=($)=>(r$<<BigInt($))-r$,s$=($)=>new Uint8Array($),eJ=($)=>Uint8Array.from($);function G8($,J,Q){if(typeof $!=="number"||$<2)throw Error("hashLen must be a number");if(typeof J!=="number"||J<2)throw Error("qByteLen must be a number");if(typeof Q!=="function")throw Error("hmacFn must be a function");let G=s$($),Y=s$($),Z=0,K=()=>{G.fill(1),Y.fill(0),Z=0},X=(...N)=>Q(Y,G,...N),q=(N=s$(0))=>{if(Y=X(eJ([0]),N),G=X(),N.length===0)return;Y=X(eJ([1]),N),G=X()},M=()=>{if(Z++>=1000)throw Error("drbg: tried 1000 values");let N=0,z=[];while(N<J){G=X();let D=G.slice();z.push(D),N+=G.length}return M$(...z)};return(N,z)=>{K(),q(N);let D=void 0;while(!(D=z(M())))q();return K(),D}}var KQ={bigint:($)=>typeof $==="bigint",function:($)=>typeof $==="function",boolean:($)=>typeof $==="boolean",string:($)=>typeof $==="string",stringOrUint8Array:($)=>typeof $==="string"||d0($),isSafeInteger:($)=>Number.isSafeInteger($),array:($)=>Array.isArray($),field:($,J)=>J.Fp.isValid($),hash:($)=>typeof $==="function"&&Number.isSafeInteger($.outputLen)};function b0($,J,Q={}){let G=(Y,Z,K)=>{let X=KQ[Z];if(typeof X!=="function")throw Error("invalid validator function");let q=$[Y];if(K&&q===void 0)return;if(!X(q,$))throw Error("param "+String(Y)+" is invalid. Expected "+Z+", got "+q)};for(let[Y,Z]of Object.entries(J))G(Y,Z,!1);for(let[Y,Z]of Object.entries(Q))G(Y,Z,!0);return $}function GJ($){let J=new WeakMap;return(Q,...G)=>{let Y=J.get(Q);if(Y!==void 0)return Y;let Z=$(Q,...G);return J.set(Q,Z),Z}}/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */var a=BigInt(0),n=BigInt(1),g0=BigInt(2),XQ=BigInt(3),Z8=BigInt(4),K8=BigInt(5),X8=BigInt(8);function i($,J){let Q=$%J;return Q>=a?Q:J+Q}function J0($,J,Q){let G=$;while(J-- >a)G*=G,G%=Q;return G}function A$($,J){if($===a)throw Error("invert: expected non-zero number");if(J<=a)throw Error("invert: expected positive modulus, got "+J);let Q=i($,J),G=J,Y=a,Z=n,K=n,X=a;while(Q!==a){let M=G/Q,j=G%Q,N=Y-K*M,z=Z-X*M;G=Q,Q=j,Y=K,Z=X,K=N,X=z}if(G!==n)throw Error("invert: does not exist");return i(Y,J)}function q8($,J){let Q=($.ORDER+n)/Z8,G=$.pow(J,Q);if(!$.eql($.sqr(G),J))throw Error("Cannot find square root");return G}function qQ($,J){let Q=($.ORDER-K8)/X8,G=$.mul(J,g0),Y=$.pow(G,Q),Z=$.mul(J,Y),K=$.mul($.mul(Z,g0),Y),X=$.mul(Z,$.sub(K,$.ONE));if(!$.eql($.sqr(X),J))throw Error("Cannot find square root");return X}function MQ($){if($<BigInt(3))throw Error("sqrt is not defined for small field");let J=$-n,Q=0;while(J%g0===a)J/=g0,Q++;let G=g0,Y=j$($);while(Y8(Y,G)===1)if(G++>1000)throw Error("Cannot find square root: probably non-prime P");if(Q===1)return q8;let Z=Y.pow(G,J),K=(J+n)/g0;return function(q,M){if(q.is0(M))return M;if(Y8(q,M)!==1)throw Error("Cannot find square root");let j=Q,N=q.mul(q.ONE,Z),z=q.pow(M,J),D=q.pow(M,K);while(!q.eql(z,q.ONE)){if(q.is0(z))return q.ZERO;let H=1,V=q.sqr(z);while(!q.eql(V,q.ONE))if(H++,V=q.sqr(V),H===j)throw Error("Cannot find square root");let B=n<<BigInt(j-H-1),S=q.pow(N,B);j=H,N=q.sqr(S),z=q.mul(z,N),D=q.mul(D,S)}return D}}function jQ($){if($%Z8===XQ)return q8;if($%X8===K8)return qQ;return MQ($)}var UQ=["create","isValid","is0","neg","inv","sqrt","sqr","eql","add","sub","mul","pow","div","addN","subN","mulN","sqrN"];function YJ($){let J={ORDER:"bigint",MASK:"bigint",BYTES:"isSafeInteger",BITS:"isSafeInteger"},Q=UQ.reduce((G,Y)=>{return G[Y]="function",G},J);return b0($,Q)}function WQ($,J,Q){if(Q<a)throw Error("invalid exponent, negatives unsupported");if(Q===a)return $.ONE;if(Q===n)return J;let G=$.ONE,Y=J;while(Q>a){if(Q&n)G=$.mul(G,Y);Y=$.sqr(Y),Q>>=n}return G}function ZJ($,J,Q=!1){let G=Array(J.length).fill(Q?$.ZERO:void 0),Y=J.reduce((K,X,q)=>{if($.is0(X))return K;return G[q]=K,$.mul(K,X)},$.ONE),Z=$.inv(Y);return J.reduceRight((K,X,q)=>{if($.is0(X))return K;return G[q]=$.mul(K,G[q]),$.mul(K,X)},Z),G}function Y8($,J){let Q=($.ORDER-n)/g0,G=$.pow(J,Q),Y=$.eql(G,$.ONE),Z=$.eql(G,$.ZERO),K=$.eql(G,$.neg($.ONE));if(!Y&&!Z&&!K)throw Error("invalid Legendre symbol result");return Y?1:Z?0:-1}function KJ($,J){if(J!==void 0)T0(J);let Q=J!==void 0?J:$.toString(2).length,G=Math.ceil(Q/8);return{nBitLength:Q,nByteLength:G}}function j$($,J,Q=!1,G={}){if($<=a)throw Error("invalid field: expected ORDER > 0, got "+$);let{nBitLength:Y,nByteLength:Z}=KJ($,J);if(Z>2048)throw Error("invalid field: expected ORDER of <= 2048 bytes");let K,X=Object.freeze({ORDER:$,isLE:Q,BITS:Y,BYTES:Z,MASK:F0(Y),ZERO:a,ONE:n,create:(q)=>i(q,$),isValid:(q)=>{if(typeof q!=="bigint")throw Error("invalid field element: expected bigint, got "+typeof q);return a<=q&&q<$},is0:(q)=>q===a,isOdd:(q)=>(q&n)===n,neg:(q)=>i(-q,$),eql:(q,M)=>q===M,sqr:(q)=>i(q*q,$),add:(q,M)=>i(q+M,$),sub:(q,M)=>i(q-M,$),mul:(q,M)=>i(q*M,$),pow:(q,M)=>WQ(X,q,M),div:(q,M)=>i(q*A$(M,$),$),sqrN:(q)=>q*q,addN:(q,M)=>q+M,subN:(q,M)=>q-M,mulN:(q,M)=>q*M,inv:(q)=>A$(q,$),sqrt:G.sqrt||((q)=>{if(!K)K=jQ($);return K(X,q)}),toBytes:(q)=>Q?QJ(q,Z):w0(q,Z),fromBytes:(q)=>{if(q.length!==Z)throw Error("Field.fromBytes: expected "+Z+" bytes, got "+q.length);return Q?JJ(q):z0(q)},invertBatch:(q)=>ZJ(X,q),cmov:(q,M,j)=>j?M:q});return Object.freeze(X)}function M8($){if(typeof $!=="bigint")throw Error("field order must be bigint");let J=$.toString(2).length;return Math.ceil(J/8)}function XJ($){let J=M8($);return J+Math.ceil(J/2)}function j8($,J,Q=!1){let G=$.length,Y=M8(J),Z=XJ(J);if(G<16||G<Z||G>1024)throw Error("expected "+Z+"-1024 bytes of input, got "+G);let K=Q?JJ($):z0($),X=i(K,J-n)+n;return Q?QJ(X,Y):w0(X,Y)}/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */var U8=BigInt(0),WJ=BigInt(1);function qJ($,J){let Q=J.negate();return $?Q:J}function N8($,J){if(!Number.isSafeInteger($)||$<=0||$>J)throw Error("invalid window size, expected [1.."+J+"], got W="+$)}function MJ($,J){N8($,J);let Q=Math.ceil(J/$)+1,G=2**($-1),Y=2**$,Z=F0($),K=BigInt($);return{windows:Q,windowSize:G,mask:Z,maxNumber:Y,shiftBy:K}}function W8($,J,Q){let{windowSize:G,mask:Y,maxNumber:Z,shiftBy:K}=Q,X=Number($&Y),q=$>>K;if(X>G)X-=Z,q+=WJ;let M=J*G,j=M+Math.abs(X)-1,N=X===0,z=X<0,D=J%2!==0;return{nextN:q,offset:j,isZero:N,isNeg:z,isNegF:D,offsetF:M}}function NQ($,J){if(!Array.isArray($))throw Error("array expected");$.forEach((Q,G)=>{if(!(Q instanceof J))throw Error("invalid point at index "+G)})}function zQ($,J){if(!Array.isArray($))throw Error("array of scalars expected");$.forEach((Q,G)=>{if(!J.isValid(Q))throw Error("invalid scalar at index "+G)})}var jJ=new WeakMap,z8=new WeakMap;function UJ($){return z8.get($)||1}function D8($,J){return{constTimeNegate:qJ,hasPrecomputes(Q){return UJ(Q)!==1},unsafeLadder(Q,G,Y=$.ZERO){let Z=Q;while(G>U8){if(G&WJ)Y=Y.add(Z);Z=Z.double(),G>>=WJ}return Y},precomputeWindow(Q,G){let{windows:Y,windowSize:Z}=MJ(G,J),K=[],X=Q,q=X;for(let M=0;M<Y;M++){q=X,K.push(q);for(let j=1;j<Z;j++)q=q.add(X),K.push(q);X=q.double()}return K},wNAF(Q,G,Y){let{ZERO:Z,BASE:K}=$,X=MJ(Q,J);for(let q=0;q<X.windows;q++){let{nextN:M,offset:j,isZero:N,isNeg:z,isNegF:D,offsetF:H}=W8(Y,q,X);if(Y=M,N)K=K.add(qJ(D,G[H]));else Z=Z.add(qJ(z,G[j]))}return{p:Z,f:K}},wNAFUnsafe(Q,G,Y,Z=$.ZERO){let K=MJ(Q,J);for(let X=0;X<K.windows;X++){if(Y===U8)break;let{nextN:q,offset:M,isZero:j,isNeg:N}=W8(Y,X,K);if(Y=q,j)continue;else{let z=G[M];Z=Z.add(N?z.negate():z)}}return Z},getPrecomputes(Q,G,Y){let Z=jJ.get(G);if(!Z){if(Z=this.precomputeWindow(G,Q),Q!==1)jJ.set(G,Y(Z))}return Z},wNAFCached(Q,G,Y){let Z=UJ(Q);return this.wNAF(Z,this.getPrecomputes(Z,Q,Y),G)},wNAFCachedUnsafe(Q,G,Y,Z){let K=UJ(Q);if(K===1)return this.unsafeLadder(Q,G,Z);return this.wNAFUnsafe(K,this.getPrecomputes(K,Q,Y),G,Z)},setWindowSize(Q,G){N8(G,J),z8.set(Q,G),jJ.delete(Q)}}}function V8($,J,Q,G){NQ(Q,$),zQ(G,J);let Y=Q.length,Z=G.length;if(Y!==Z)throw Error("arrays of points and scalars must have equal length");let K=$.ZERO,X=Q8(BigInt(Y)),q=1;if(X>12)q=X-3;else if(X>4)q=X-2;else if(X>0)q=2;let M=F0(q),j=Array(Number(M)+1).fill(K),N=Math.floor((J.BITS-1)/q)*q,z=K;for(let D=N;D>=0;D-=q){j.fill(K);for(let V=0;V<Z;V++){let B=G[V],S=Number(B>>BigInt(D)&M);j[S]=j[S].add(Q[V])}let H=K;for(let V=j.length-1,B=K;V>0;V--)B=B.add(j[V]),H=H.add(B);if(z=z.add(H),D!==0)for(let V=0;V<q;V++)z=z.double()}return z}function NJ($){return YJ($.Fp),b0($,{n:"bigint",h:"bigint",Gx:"field",Gy:"field"},{nBitLength:"isSafeInteger",nByteLength:"isSafeInteger"}),Object.freeze({...KJ($.n,$.nBitLength),...$,...{p:$.Fp.ORDER}})}/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */function O8($){if($.lowS!==void 0)i0("lowS",$.lowS);if($.prehash!==void 0)i0("prehash",$.prehash)}function DQ($){let J=NJ($);b0(J,{a:"field",b:"field"},{allowInfinityPoint:"boolean",allowedPrivateKeyLengths:"array",clearCofactor:"function",fromBytes:"function",isTorsionFree:"function",toBytes:"function",wrapPrivateKey:"boolean"});let{endo:Q,Fp:G,a:Y}=J;if(Q){if(!G.eql(Y,G.ZERO))throw Error("invalid endo: CURVE.a must be 0");if(typeof Q!=="object"||typeof Q.beta!=="bigint"||typeof Q.splitScalar!=="function")throw Error('invalid endo: expected "beta": bigint and "splitScalar": function')}return Object.freeze({...J})}class R8 extends Error{constructor($=""){super($)}}var D0={Err:R8,_tlv:{encode:($,J)=>{let{Err:Q}=D0;if($<0||$>256)throw new Q("tlv.encode: wrong tag");if(J.length&1)throw new Q("tlv.encode: unpadded data");let G=J.length/2,Y=X$(G);if(Y.length/2&128)throw new Q("tlv.encode: long form length too big");let Z=G>127?X$(Y.length/2|128):"";return X$($)+Z+Y+J},decode($,J){let{Err:Q}=D0,G=0;if($<0||$>256)throw new Q("tlv.encode: wrong tag");if(J.length<2||J[G++]!==$)throw new Q("tlv.decode: wrong tlv");let Y=J[G++],Z=!!(Y&128),K=0;if(!Z)K=Y;else{let q=Y&127;if(!q)throw new Q("tlv.decode(long): indefinite length not supported");if(q>4)throw new Q("tlv.decode(long): byte length is too big");let M=J.subarray(G,G+q);if(M.length!==q)throw new Q("tlv.decode: length bytes not complete");if(M[0]===0)throw new Q("tlv.decode(long): zero leftmost byte");for(let j of M)K=K<<8|j;if(G+=q,K<128)throw new Q("tlv.decode(long): not minimal encoding")}let X=J.subarray(G,G+K);if(X.length!==K)throw new Q("tlv.decode: wrong value length");return{v:X,l:J.subarray(G+K)}}},_int:{encode($){let{Err:J}=D0;if($<V0)throw new J("integer: negative integers are not allowed");let Q=X$($);if(Number.parseInt(Q[0],16)&8)Q="00"+Q;if(Q.length&1)throw new J("unexpected DER parsing assertion: unpadded hex");return Q},decode($){let{Err:J}=D0;if($[0]&128)throw new J("invalid signature integer: negative");if($[0]===0&&!($[1]&128))throw new J("invalid signature integer: unnecessary leading zero");return z0($)}},toSig($){let{Err:J,_int:Q,_tlv:G}=D0,Y=e("signature",$),{v:Z,l:K}=G.decode(48,Y);if(K.length)throw new J("invalid signature: left bytes after parsing");let{v:X,l:q}=G.decode(2,Z),{v:M,l:j}=G.decode(2,q);if(j.length)throw new J("invalid signature: left bytes after parsing");return{r:Q.decode(X),s:Q.decode(M)}},hexFromSig($){let{_tlv:J,_int:Q}=D0,G=J.encode(2,Q.encode($.r)),Y=J.encode(2,Q.encode($.s)),Z=G+Y;return J.encode(48,Z)}};function zJ($,J){return n0(w0($,J))}var V0=BigInt(0),p=BigInt(1),KY=BigInt(2),DJ=BigInt(3),VQ=BigInt(4);function OQ($){let J=DQ($),{Fp:Q}=J,G=j$(J.n,J.nBitLength),Y=J.toBytes||((U,R,L)=>{let I=R.toAffine();return M$(Uint8Array.from([4]),Q.toBytes(I.x),Q.toBytes(I.y))}),Z=J.fromBytes||((U)=>{let R=U.subarray(1),L=Q.fromBytes(R.subarray(0,Q.BYTES)),I=Q.fromBytes(R.subarray(Q.BYTES,2*Q.BYTES));return{x:L,y:I}});function K(U){let{a:R,b:L}=J,I=Q.sqr(U),w=Q.mul(I,U);return Q.add(Q.add(w,Q.mul(U,R)),L)}function X(U,R){let L=Q.sqr(R),I=K(U);return Q.eql(L,I)}if(!X(J.Gx,J.Gy))throw Error("bad curve params: generator point");let q=Q.mul(Q.pow(J.a,DJ),VQ),M=Q.mul(Q.sqr(J.b),BigInt(27));if(Q.is0(Q.add(q,M)))throw Error("bad curve params: a or b");function j(U){return x$(U,p,J.n)}function N(U){let{allowedPrivateKeyLengths:R,nByteLength:L,wrapPrivateKey:I,n:w}=J;if(R&&typeof U!=="bigint"){if(d0(U))U=n0(U);if(typeof U!=="string"||!R.includes(U.length))throw Error("invalid private key");U=U.padStart(L*2,"0")}let x;try{x=typeof U==="bigint"?U:z0(e("private key",U,L))}catch(y){throw Error("invalid private key, expected hex or "+L+" bytes, got "+typeof U)}if(I)x=i(x,w);return y0("private key",x,p,w),x}function z(U){if(!(U instanceof V))throw Error("ProjectivePoint expected")}let D=GJ((U,R)=>{let{px:L,py:I,pz:w}=U;if(Q.eql(w,Q.ONE))return{x:L,y:I};let x=U.is0();if(R==null)R=x?Q.ONE:Q.inv(w);let y=Q.mul(L,R),E=Q.mul(I,R),k=Q.mul(w,R);if(x)return{x:Q.ZERO,y:Q.ZERO};if(!Q.eql(k,Q.ONE))throw Error("invZ was invalid");return{x:y,y:E}}),H=GJ((U)=>{if(U.is0()){if(J.allowInfinityPoint&&!Q.is0(U.py))return;throw Error("bad point: ZERO")}let{x:R,y:L}=U.toAffine();if(!Q.isValid(R)||!Q.isValid(L))throw Error("bad point: x or y not FE");if(!X(R,L))throw Error("bad point: equation left != right");if(!U.isTorsionFree())throw Error("bad point: not in prime-order subgroup");return!0});class V{constructor(U,R,L){if(U==null||!Q.isValid(U))throw Error("x required");if(R==null||!Q.isValid(R)||Q.is0(R))throw Error("y required");if(L==null||!Q.isValid(L))throw Error("z required");this.px=U,this.py=R,this.pz=L,Object.freeze(this)}static fromAffine(U){let{x:R,y:L}=U||{};if(!U||!Q.isValid(R)||!Q.isValid(L))throw Error("invalid affine point");if(U instanceof V)throw Error("projective point not allowed");let I=(w)=>Q.eql(w,Q.ZERO);if(I(R)&&I(L))return V.ZERO;return new V(R,L,Q.ONE)}get x(){return this.toAffine().x}get y(){return this.toAffine().y}static normalizeZ(U){let R=ZJ(Q,U.map((L)=>L.pz));return U.map((L,I)=>L.toAffine(R[I])).map(V.fromAffine)}static fromHex(U){let R=V.fromAffine(Z(e("pointHex",U)));return R.assertValidity(),R}static fromPrivateKey(U){return V.BASE.multiply(N(U))}static msm(U,R){return V8(V,G,U,R)}_setWindowSize(U){v.setWindowSize(this,U)}assertValidity(){H(this)}hasEvenY(){let{y:U}=this.toAffine();if(Q.isOdd)return!Q.isOdd(U);throw Error("Field doesn't support isOdd")}equals(U){z(U);let{px:R,py:L,pz:I}=this,{px:w,py:x,pz:y}=U,E=Q.eql(Q.mul(R,y),Q.mul(w,I)),k=Q.eql(Q.mul(L,y),Q.mul(x,I));return E&&k}negate(){return new V(this.px,Q.neg(this.py),this.pz)}double(){let{a:U,b:R}=J,L=Q.mul(R,DJ),{px:I,py:w,pz:x}=this,y=Q.ZERO,E=Q.ZERO,k=Q.ZERO,A=Q.mul(I,I),c=Q.mul(w,w),h=Q.mul(x,x),W=Q.mul(I,w);return W=Q.add(W,W),k=Q.mul(I,x),k=Q.add(k,k),y=Q.mul(U,k),E=Q.mul(L,h),E=Q.add(y,E),y=Q.sub(c,E),E=Q.add(c,E),E=Q.mul(y,E),y=Q.mul(W,y),k=Q.mul(L,k),h=Q.mul(U,h),W=Q.sub(A,h),W=Q.mul(U,W),W=Q.add(W,k),k=Q.add(A,A),A=Q.add(k,A),A=Q.add(A,h),A=Q.mul(A,W),E=Q.add(E,A),h=Q.mul(w,x),h=Q.add(h,h),A=Q.mul(h,W),y=Q.sub(y,A),k=Q.mul(h,c),k=Q.add(k,k),k=Q.add(k,k),new V(y,E,k)}add(U){z(U);let{px:R,py:L,pz:I}=this,{px:w,py:x,pz:y}=U,E=Q.ZERO,k=Q.ZERO,A=Q.ZERO,c=J.a,h=Q.mul(J.b,DJ),W=Q.mul(R,w),C=Q.mul(L,x),T=Q.mul(I,y),F=Q.add(R,L),_=Q.add(w,x);F=Q.mul(F,_),_=Q.add(W,C),F=Q.sub(F,_),_=Q.add(R,I);let O=Q.add(w,y);return _=Q.mul(_,O),O=Q.add(W,T),_=Q.sub(_,O),O=Q.add(L,I),E=Q.add(x,y),O=Q.mul(O,E),E=Q.add(C,T),O=Q.sub(O,E),A=Q.mul(c,_),E=Q.mul(h,T),A=Q.add(E,A),E=Q.sub(C,A),A=Q.add(C,A),k=Q.mul(E,A),C=Q.add(W,W),C=Q.add(C,W),T=Q.mul(c,T),_=Q.mul(h,_),C=Q.add(C,T),T=Q.sub(W,T),T=Q.mul(c,T),_=Q.add(_,T),W=Q.mul(C,_),k=Q.add(k,W),W=Q.mul(O,_),E=Q.mul(F,E),E=Q.sub(E,W),W=Q.mul(F,C),A=Q.mul(O,A),A=Q.add(A,W),new V(E,k,A)}subtract(U){return this.add(U.negate())}is0(){return this.equals(V.ZERO)}wNAF(U){return v.wNAFCached(this,U,V.normalizeZ)}multiplyUnsafe(U){let{endo:R,n:L}=J;y0("scalar",U,V0,L);let I=V.ZERO;if(U===V0)return I;if(this.is0()||U===p)return this;if(!R||v.hasPrecomputes(this))return v.wNAFCachedUnsafe(this,U,V.normalizeZ);let{k1neg:w,k1:x,k2neg:y,k2:E}=R.splitScalar(U),k=I,A=I,c=this;while(x>V0||E>V0){if(x&p)k=k.add(c);if(E&p)A=A.add(c);c=c.double(),x>>=p,E>>=p}if(w)k=k.negate();if(y)A=A.negate();return A=new V(Q.mul(A.px,R.beta),A.py,A.pz),k.add(A)}multiply(U){let{endo:R,n:L}=J;y0("scalar",U,p,L);let I,w;if(R){let{k1neg:x,k1:y,k2neg:E,k2:k}=R.splitScalar(U),{p:A,f:c}=this.wNAF(y),{p:h,f:W}=this.wNAF(k);A=v.constTimeNegate(x,A),h=v.constTimeNegate(E,h),h=new V(Q.mul(h.px,R.beta),h.py,h.pz),I=A.add(h),w=c.add(W)}else{let{p:x,f:y}=this.wNAF(U);I=x,w=y}return V.normalizeZ([I,w])[0]}multiplyAndAddUnsafe(U,R,L){let I=V.BASE,w=(y,E)=>E===V0||E===p||!y.equals(I)?y.multiplyUnsafe(E):y.multiply(E),x=w(this,R).add(w(U,L));return x.is0()?void 0:x}toAffine(U){return D(this,U)}isTorsionFree(){let{h:U,isTorsionFree:R}=J;if(U===p)return!0;if(R)return R(V,this);throw Error("isTorsionFree() has not been declared for the elliptic curve")}clearCofactor(){let{h:U,clearCofactor:R}=J;if(U===p)return this;if(R)return R(V,this);return this.multiplyUnsafe(J.h)}toRawBytes(U=!0){return i0("isCompressed",U),this.assertValidity(),Y(V,this,U)}toHex(U=!0){return i0("isCompressed",U),n0(this.toRawBytes(U))}}V.BASE=new V(J.Gx,J.Gy,Q.ONE),V.ZERO=new V(Q.ZERO,Q.ONE,Q.ZERO);let{endo:B,nBitLength:S}=J,v=D8(V,B?Math.ceil(S/2):S);return{CURVE:J,ProjectivePoint:V,normPrivateKeyToScalar:N,weierstrassEquation:K,isWithinCurveOrder:j}}function RQ($){let J=NJ($);return b0(J,{hash:"hash",hmac:"function",randomBytes:"function"},{bits2int:"function",bits2int_modN:"function",lowS:"boolean"}),Object.freeze({lowS:!0,...J})}function C8($){let J=RQ($),{Fp:Q,n:G,nByteLength:Y,nBitLength:Z}=J,K=Q.BYTES+1,X=2*Q.BYTES+1;function q(W){return i(W,G)}function M(W){return A$(W,G)}let{ProjectivePoint:j,normPrivateKeyToScalar:N,weierstrassEquation:z,isWithinCurveOrder:D}=OQ({...J,toBytes(W,C,T){let F=C.toAffine(),_=Q.toBytes(F.x),O=M$;if(i0("isCompressed",T),T)return O(Uint8Array.from([C.hasEvenY()?2:3]),_);else return O(Uint8Array.from([4]),_,Q.toBytes(F.y))},fromBytes(W){let C=W.length,T=W[0],F=W.subarray(1);if(C===K&&(T===2||T===3)){let _=z0(F);if(!x$(_,p,Q.ORDER))throw Error("Point is not on curve");let O=z(_),g;try{g=Q.sqrt(O)}catch(s){let r=s instanceof Error?": "+s.message:"";throw Error("Point is not on curve"+r)}let m=(g&p)===p;if((T&1)===1!==m)g=Q.neg(g);return{x:_,y:g}}else if(C===X&&T===4){let _=Q.fromBytes(F.subarray(0,Q.BYTES)),O=Q.fromBytes(F.subarray(Q.BYTES,2*Q.BYTES));return{x:_,y:O}}else{let _=K,O=X;throw Error("invalid Point, expected length of "+_+", or uncompressed "+O+", got "+C)}}});function H(W){let C=G>>p;return W>C}function V(W){return H(W)?q(-W):W}let B=(W,C,T)=>z0(W.slice(C,T));class S{constructor(W,C,T){if(y0("r",W,p,G),y0("s",C,p,G),this.r=W,this.s=C,T!=null)this.recovery=T;Object.freeze(this)}static fromCompact(W){let C=Y;return W=e("compactSignature",W,C*2),new S(B(W,0,C),B(W,C,2*C))}static fromDER(W){let{r:C,s:T}=D0.toSig(e("DER",W));return new S(C,T)}assertValidity(){}addRecoveryBit(W){return new S(this.r,this.s,W)}recoverPublicKey(W){let{r:C,s:T,recovery:F}=this,_=w(e("msgHash",W));if(F==null||![0,1,2,3].includes(F))throw Error("recovery id invalid");let O=F===2||F===3?C+J.n:C;if(O>=Q.ORDER)throw Error("recovery id 2 or 3 invalid");let g=(F&1)===0?"02":"03",m=j.fromHex(g+zJ(O,Q.BYTES)),l=M(O),s=q(-_*l),r=q(T*l),O0=j.BASE.multiplyAndAddUnsafe(m,s,r);if(!O0)throw Error("point at infinify");return O0.assertValidity(),O0}hasHighS(){return H(this.s)}normalizeS(){return this.hasHighS()?new S(this.r,q(-this.s),this.recovery):this}toDERRawBytes(){return q$(this.toDERHex())}toDERHex(){return D0.hexFromSig(this)}toCompactRawBytes(){return q$(this.toCompactHex())}toCompactHex(){let W=Y;return zJ(this.r,W)+zJ(this.s,W)}}let v={isValidPrivateKey(W){try{return N(W),!0}catch(C){return!1}},normPrivateKeyToScalar:N,randomPrivateKey:()=>{let W=XJ(J.n);return j8(J.randomBytes(W),J.n)},precompute(W=8,C=j.BASE){return C._setWindowSize(W),C.multiply(BigInt(3)),C}};function U(W,C=!0){return j.fromPrivateKey(W).toRawBytes(C)}function R(W){if(typeof W==="bigint")return!1;if(W instanceof j)return!0;let T=e("key",W).length,F=Q.BYTES,_=F+1,O=2*F+1;if(J.allowedPrivateKeyLengths||Y===_)return;else return T===_||T===O}function L(W,C,T=!0){if(R(W)===!0)throw Error("first arg must be private key");if(R(C)===!1)throw Error("second arg must be public key");return j.fromHex(C).multiply(N(W)).toRawBytes(T)}let I=J.bits2int||function(W){if(W.length>8192)throw Error("input is too large");let C=z0(W),T=W.length*8-Z;return T>0?C>>BigInt(T):C},w=J.bits2int_modN||function(W){return q(I(W))},x=F0(Z);function y(W){return y0("num < 2^"+Z,W,V0,x),w0(W,Y)}function E(W,C,T=k){if(["recovered","canonical"].some((H0)=>(H0 in T)))throw Error("sign() legacy options not supported");let{hash:F,randomBytes:_}=J,{lowS:O,prehash:g,extraEntropy:m}=T;if(O==null)O=!0;if(W=e("msgHash",W),O8(T),g)W=e("prehashed msgHash",F(W));let l=w(W),s=N(C),r=[y(s),y(l)];if(m!=null&&m!==!1){let H0=m===!0?_(Q.BYTES):m;r.push(e("extraEntropy",H0))}let O0=M$(...r),N$=l;function F$(H0){let f0=I(H0);if(!D(f0))return;let b$=M(f0),o0=j.BASE.multiply(f0).toAffine(),S0=q(o0.x);if(S0===V0)return;let t0=q(b$*q(N$+S0*s));if(t0===V0)return;let v0=(o0.x===S0?0:2)|Number(o0.y&p),IJ=t0;if(O&&H(t0))IJ=V(t0),v0^=1;return new S(S0,IJ,v0)}return{seed:O0,k2sig:F$}}let k={lowS:J.lowS,prehash:!1},A={lowS:J.lowS,prehash:!1};function c(W,C,T=k){let{seed:F,k2sig:_}=E(W,C,T),O=J;return G8(O.hash.outputLen,O.nByteLength,O.hmac)(F,_)}j.BASE._setWindowSize(8);function h(W,C,T,F=A){let _=W;C=e("msgHash",C),T=e("publicKey",T);let{lowS:O,prehash:g,format:m}=F;if(O8(F),"strict"in F)throw Error("options.strict was renamed to lowS");if(m!==void 0&&m!=="compact"&&m!=="der")throw Error("format must be compact or der");let l=typeof _==="string"||d0(_),s=!l&&!m&&typeof _==="object"&&_!==null&&typeof _.r==="bigint"&&typeof _.s==="bigint";if(!l&&!s)throw Error("invalid signature, expected Uint8Array, hex string or Signature instance");let r=void 0,O0;try{if(s)r=new S(_.r,_.s);if(l){try{if(m!=="compact")r=S.fromDER(_)}catch(v0){if(!(v0 instanceof D0.Err))throw v0}if(!r&&m!=="der")r=S.fromCompact(_)}O0=j.fromHex(T)}catch(v0){return!1}if(!r)return!1;if(O&&r.hasHighS())return!1;if(g)C=J.hash(C);let{r:N$,s:F$}=r,H0=w(C),f0=M(F$),b$=q(H0*f0),o0=q(N$*f0),S0=j.BASE.multiplyAndAddUnsafe(O0,b$,o0)?.toAffine();if(!S0)return!1;return q(S0.x)===N$}return{CURVE:J,getPublicKey:U,getSharedSecret:L,sign:c,verify:h,ProjectivePoint:j,Signature:S,utils:v}}/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */function CQ($){return{hash:$,hmac:(J,...Q)=>t$($,J,bJ(...Q)),randomBytes:gJ}}function P8($,J){let Q=(G)=>C8({...$,...CQ(G)});return{...Q(J),create:Q}}/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */var H8=BigInt("0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f"),B8=BigInt("0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141"),PQ=BigInt(0),BQ=BigInt(1),VJ=BigInt(2),L8=($,J)=>($+J/VJ)/J;function LQ($){let J=H8,Q=BigInt(3),G=BigInt(6),Y=BigInt(11),Z=BigInt(22),K=BigInt(23),X=BigInt(44),q=BigInt(88),M=$*$*$%J,j=M*M*$%J,N=J0(j,Q,J)*j%J,z=J0(N,Q,J)*j%J,D=J0(z,VJ,J)*M%J,H=J0(D,Y,J)*D%J,V=J0(H,Z,J)*H%J,B=J0(V,X,J)*V%J,S=J0(B,q,J)*B%J,v=J0(S,X,J)*V%J,U=J0(v,Q,J)*j%J,R=J0(U,K,J)*H%J,L=J0(R,G,J)*M%J,I=J0(L,VJ,J);if(!OJ.eql(OJ.sqr(I),$))throw Error("Cannot find square root");return I}var OJ=j$(H8,void 0,void 0,{sqrt:LQ}),RJ=P8({a:PQ,b:BigInt(7),Fp:OJ,n:B8,Gx:BigInt("55066263022277343669578718895168534326250603453777594175500187360389116729240"),Gy:BigInt("32670510020758816978083085130507043184471273380659243275938904335757337482424"),h:BigInt(1),lowS:!0,endo:{beta:BigInt("0x7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee"),splitScalar:($)=>{let J=B8,Q=BigInt("0x3086d221a7d46bcde86c90e49284eb15"),G=-BQ*BigInt("0xe4437ed6010e88286f547fa90abfe4c3"),Y=BigInt("0x114ca50f7a8e2f3f657c1108d9d44cfd8"),Z=Q,K=BigInt("0x100000000000000000000000000000000"),X=L8(Z*$,J),q=L8(-G*$,J),M=i($-X*Q-q*Y,J),j=i(-X*G-q*Z,J),N=M>K,z=j>K;if(N)M=J-M;if(z)j=J-j;if(M>K||j>K)throw Error("splitScalar: Endomorphism failed, k="+$);return{k1neg:N,k1:M,k2neg:z,k2:j}}}},sJ);function k$(){let $=RJ.utils.randomPrivateKey();return"0x"+Buffer.from($).toString("hex")}function w$($){let J=$.startsWith("0x")?$.slice(2):$,Q=Buffer.from(J,"hex"),G=RJ.getPublicKey(Q,!1),Z=m0(G.slice(1)).slice(-20),K="0x"+Buffer.from(Z).toString("hex");return P0(K)}function y$($){let J;if(typeof $==="string"){let G=$.startsWith("0x")?$.slice(2):$;J=Buffer.from(G,"hex")}else J=$;let Q=m0(J);return"0x"+Buffer.from(Q).toString("hex")}class b extends E${constructor($,J){super("InvitationError",$,{...J,source:J?.source||"INVITATIONS"})}static noPathFound($,J,Q){return new b(`No valid invitation path found from ${$} to ${J}. ${Q||"The inviter may not have enough balance of the proxy inviter's token or there's no trust connection."}`,{code:"INVITATION_NO_PATH",source:"PATHFINDING",context:{from:$,to:J,reason:Q}})}static noProxyInviters($){return new b(`No proxy inviters found for ${$}. The inviter must have mutual trust connections with users who are also trusted by the invitation module, and these users must have sufficient balance.`,{code:"INVITATION_NO_PROXY_INVITERS",source:"VALIDATION",context:{inviter:$}})}static insufficientBalance($,J,Q,G,Y,Z){let K=Number(Q)/1000000000000000000,X=Number(G)/1000000000000000000;return new b(`Insufficient balance for ${$} invitation(s). Can only afford ${J} invitation(s). Requested: ${K.toFixed(6)} CRC, Available: ${X.toFixed(6)} CRC.`,{code:"INVITATION_INSUFFICIENT_BALANCE",source:"VALIDATION",context:{from:Y,to:Z,requestedInvites:$,availableInvites:J,requested:Q.toString(),available:G.toString(),requestedCrc:K,availableCrc:X}})}static inviteeAlreadyRegistered($,J){return new b(`Invitee ${J} is already registered as a human in Circles Hub. Cannot invite an already registered user.`,{code:"INVITATION_INVITEE_ALREADY_REGISTERED",source:"VALIDATION",context:{inviter:$,invitee:J}})}static noAddressesProvided(){return new b("At least one address must be provided for invitation.",{code:"INVITATION_NO_ADDRESSES_PROVIDED",source:"VALIDATION"})}}var S8=[];for(let $=0;$<256;$++)S8[$]=$.toString(16).padStart(2,"0");function U$($){let J="0x";for(let Q=0;Q<$.length;Q++)J+=S8[$[Q]];return J}function I8($){let J=new Uint8Array($.length*2);return $.forEach((Q,G)=>{let Y=Q>>8,Z=Q&255,K=2*G;J[K]=Y,J[K+1]=Z}),U$(J)}function T8($,J,Q){let G=new Set([J.toLowerCase(),Q.toLowerCase()]);$.forEach((K)=>{G.add(K.from.toLowerCase()),G.add(K.to.toLowerCase()),G.add(K.tokenOwner.toLowerCase())});let Y=[...G].sort((K,X)=>{let q=BigInt(K),M=BigInt(X),j=q<M,N=q>M;return j?-1:N?1:0}),Z={};return Y.forEach((K,X)=>{Z[K]=X}),{sorted:Y,idx:Z}}function HQ($,J){let Q=new Set,G=[],Y=null;if($.forEach((Z,K)=>{let X=Z.from.toLowerCase(),q=Z.to.toLowerCase();if(X===J&&q===J)Y=K;else if(q===J)G.push(K)}),Y!==null)Q.add(Y);else G.forEach((Z)=>Q.add(Z));return Q}function CJ($,J,Q,G){let Y=$.toLowerCase(),Z=J.toLowerCase(),{sorted:K,idx:X}=T8(G,Y,Z),q=HQ(G,Z),M=G.map((S,v)=>{return{streamSinkId:q.has(v)?1:0,amount:S.value}});if(q.size===0)throw Error(`No terminal edges detected. Flow must have at least one edge delivering to receiver ${Z}`);let j=Array.from(q),N=[{sourceCoordinate:X[Y],flowEdgeIds:j,data:new Uint8Array(0)}],z=[];G.forEach((S)=>{z.push(X[S.tokenOwner.toLowerCase()]),z.push(X[S.from.toLowerCase()]),z.push(X[S.to.toLowerCase()])});let D=I8(z),H=BigInt(Q),V=M.filter((S)=>S.streamSinkId===1).reduce((S,v)=>S+BigInt(v.amount.toString()),BigInt(0));if(V!==H)throw Error(`Terminal sum ${V} does not equal expected ${H}`);return{flowVertices:K,flowEdges:M,streams:N,packedCoordinates:D,sourceCoordinate:X[Y]}}function PJ($,J){let Q=$.streams.map((G)=>({sourceCoordinate:G.sourceCoordinate,flowEdgeIds:G.flowEdgeIds,data:G.data instanceof Uint8Array?U$(G.data):G.data}));if(J&&Q.length>0)Q[0].data=J instanceof Uint8Array?U$(J):J;return Q}async function BJ($,J,Q){let G=new Map,Y=new Set;return Q.transfers.forEach((X)=>{if($.toLowerCase()===X.from.toLowerCase())Y.add(X.tokenOwner.toLowerCase())}),(await new I$(J).token.getTokenInfoBatch(Array.from(Y))).forEach((X)=>{if(X.isWrapped&&!X.isInflationary)X.tokenType="CrcV2_ERC20WrapperDeployed_Demurraged";G.set(X.tokenAddress.toLowerCase(),X)}),G}function LJ($,J){let Q={};return $.transfers.forEach((G)=>{let Y=J.get(G.tokenOwner.toLowerCase());if(Y&&Y.tokenType.startsWith("CrcV2_ERC20WrapperDeployed")){if(!Q[G.tokenOwner])Q[G.tokenOwner]=[BigInt(0),Y.tokenType];Q[G.tokenOwner][0]+=BigInt(G.value)}}),Q}function HJ($,J){let Q=$.transfers.map((G)=>{let Y=J.get(G.tokenOwner.toLowerCase());if(Y&&Y.tokenType.startsWith("CrcV2_ERC20WrapperDeployed"))return{...G,tokenOwner:Y.tokenOwner};return G});return{...$,transfers:Q}}class o extends s0{constructor($,J){super("TransferError",$,{...J,source:J?.source||"TRANSFERS"})}static noPathFound($,J,Q){return new o(`No valid transfer path found from ${$} to ${J}. ${Q||"This could mean there's no trust connection, insufficient balance, or the tokens are not transferable."}`,{code:"TRANSFER_NO_PATH",source:"PATHFINDING",context:{from:$,to:J,reason:Q}})}static insufficientBalance($,J,Q,G){let Y=Number($)/1000000000000000000,Z=Number(J)/1000000000000000000;return new o(`Insufficient balance for transfer. Requested: ${Y.toFixed(6)} CRC, Available: ${Z.toFixed(6)} CRC.`,{code:"TRANSFER_INSUFFICIENT_BALANCE",source:"VALIDATION",context:{from:Q,to:G,requested:$.toString(),available:J.toString(),requestedCrc:Y,availableCrc:Z}})}static wrappedTokensRequired(){return new o("Insufficient unwrapped token balance for transfer. Your balance contains wrapped tokens (ERC20 wrappers), but useWrappedBalances option is not enabled. Please enable it by passing { useWrappedBalances: true } in the transfer options.",{code:"TRANSFER_WRAPPED_TOKENS_REQUIRED",source:"VALIDATION"})}static unregisteredAvatars($){return new o(`Flow matrix contains ${$.length} unregistered avatar(s): ${$.join(", ")}. All addresses in the flow must be registered Circles avatars (human or group).`,{code:"TRANSFER_UNREGISTERED_AVATARS",source:"FLOW_MATRIX",context:{unregisteredAddresses:$,count:$.length}})}static flowMatrixMismatch($,J){return new o(`Flow matrix terminal sum (${$}) does not equal expected amount (${J})`,{code:"TRANSFER_FLOW_MATRIX_MISMATCH",source:"FLOW_MATRIX",context:{terminalSum:$.toString(),expected:J.toString()}})}static emptyPath($,J){return new o(`Transfer path is empty for route from ${$} to ${J}`,{code:"TRANSFER_EMPTY_PATH",source:"PATHFINDING",context:{from:$,to:J}})}}class W${config;hubV2;liftERC20;rpcClient;pathfinder;balance;group;constructor($){this.config=$,this.hubV2=new B0({address:$.v2HubAddress,rpcUrl:$.circlesRpcUrl}),this.liftERC20=new T$({address:$.liftERC20Address,rpcUrl:$.circlesRpcUrl}),this.rpcClient=new R0($.circlesRpcUrl),this.pathfinder=new U0(this.rpcClient),this.balance=new A0(this.rpcClient),this.group=new k0(this.rpcClient)}async buildFlowMatrixTx($,J,Q,G,Y=!1){let Z=$.toLowerCase(),K=J.toLowerCase();if(!Q.transfers||Q.transfers.length===0)throw o.noPathFound(Z,K);let X={...Q};if(Y&&G?.toTokens?.length===1){let v=G.toTokens[0].toLowerCase();if(Q.maxFlow>0n)X.transfers.push({from:K,to:K,tokenOwner:v,value:Q.maxFlow})}let q=await BJ(Z,this.config.circlesRpcUrl,X),M=LJ(X,q),j=Object.keys(M).length>0;if(j&&!G?.useWrappedBalances)throw o.wrappedTokensRequired();let N=[],z=[];if(j){let v=await this._getTokenBalanceMap(Z),U=this._createDemurragedUnwrapCalls(M),{unwrapCalls:R,wrapCalls:L}=this._createInflationaryUnwrapAndWrapCalls(M,q,v);N=[...U,...R],z=L,X=HJ(X,q)}let D=CJ(Z,K,X.maxFlow,X.transfers),H=PJ(D,G?.txData),V=this.hubV2.operateFlowMatrix(D.flowVertices,D.flowEdges,H,D.packedCoordinates),B=!1;try{B=await this.hubV2.isApprovedForAll(Z,Z)}catch(v){console.warn("Failed to check approval status, including approval transaction:",v)}return[...B?[]:[this.hubV2.setApprovalForAll(Z,!0)],...N,V,...z]}async constructAdvancedTransfer($,J,Q,G,Y=!1){let Z=$.toLowerCase(),K=J.toLowerCase(),X=BigInt(Q);if(Z===K&&G?.fromTokens?.length===1&&G?.toTokens?.length===1){let D=G.fromTokens[0],H=G.toTokens[0],[V,B]=await Promise.all([this.liftERC20.erc20Circles(0,H),this.liftERC20.erc20Circles(1,H)]);if(D.toLowerCase()===V.toLowerCase()&&V!==S$){let v=new c0({address:D,rpcUrl:this.config.circlesRpcUrl}).unwrap(X);return[{to:v.to,data:v.data,value:v.value??0n}]}if(D.toLowerCase()===B.toLowerCase()&&B!==S$){let S=new l0({address:D,rpcUrl:this.config.circlesRpcUrl}),v=d.attoCirclesToAttoStaticCircles(X),U=S.unwrap(v);return[{to:U.to,data:U.data,value:U.value??0n}]}}let q=this._truncateToSixDecimals(X),M=await this._getDefaultTokenExcludeList(K,G?.excludeFromTokens),{...j}=G||{},N={...j,...M?{excludeFromTokens:M}:{}},z=await this.pathfinder.findPath({from:Z,to:K,targetFlow:q,...N});if(!z.transfers||z.transfers.length===0)throw o.noPathFound(Z,K);if(z.maxFlow<q)throw o.insufficientBalance(q,z.maxFlow,Z,K);return this.buildFlowMatrixTx(Z,K,z,G,Y)}async constructReplenish($,J,Q,G){let Y=$.toLowerCase(),Z=J.toLowerCase(),K=(G||$).toLowerCase(),X=BigInt(Q),M=(await this.balance.getTokenBalances(Y)).filter((O)=>O.tokenOwner.toLowerCase()===Z),j=0n,N=0n,z=0n,D=null,H=null;for(let O of M)if(O.isWrapped)if(O.tokenType.includes("Demurrage"))N=BigInt(O.attoCircles),D=O.tokenAddress;else z=BigInt(O.staticAttoCircles),H=O.tokenAddress;else j=BigInt(O.attoCircles);let V=j+N+d.attoStaticCirclesToAttoCircles(z),B=[];if(j>=X){if(console.log(`✓ Already have ${Number(j)/1000000000000000000} CRC unwrapped (target: ${Number(X)/1000000000000000000} CRC). No replenish needed.`),K!==Y){let O=await this.hubV2.toTokenId(Z),g=this.hubV2.safeTransferFrom(Y,K,O,X);B.push({to:g.to,data:g.data,value:g.value??0n})}return B}let S=X-j;if(console.log(`Current unwrapped: ${Number(j)/1000000000000000000} CRC`),console.log(`Target amount: ${Number(X)/1000000000000000000} CRC`),console.log(`Need to acquire: ${Number(S)/1000000000000000000} CRC`),V>=X){let O=S;if(N>0n&&D&&O>0n){let g=O>N?N:O,l=new c0({address:D,rpcUrl:this.config.circlesRpcUrl}).unwrap(g);B.push({to:l.to,data:l.data,value:l.value??0n}),O-=g}if(z>0n&&H&&O>0n){let g=d.attoCirclesToAttoStaticCircles(O),m=g>z?z:g,s=new l0({address:H,rpcUrl:this.config.circlesRpcUrl}).unwrap(m);B.push({to:s.to,data:s.data,value:s.value??0n})}if(K!==Y){let g=await this.hubV2.toTokenId(Z),m=this.hubV2.safeTransferFrom(Y,K,g,X);B.push({to:m.to,data:m.data,value:m.value??0n})}return B}let U=!await this.hubV2.isTrusted(Y,Z),R=BigInt(Math.floor(Date.now()/1000)+31536000),L=d.truncateToInt64(S),I=S%d.FACTOR_1E12!==0n,w=d.blowUpToBigInt(I?L+1n:L),x;try{x=await this.pathfinder.findPath({from:Y,to:K,targetFlow:w,toTokens:[Z],useWrappedBalances:!0,simulatedTrusts:U?[{truster:Y,trustee:Z}]:void 0})}catch(O){let g=Number(V)/1000000000000000000,m=Number(X)/1000000000000000000,l=Number(S)/1000000000000000000;throw new o(`Insufficient tokens to replenish. Target: ${m.toFixed(6)} CRC, Current unwrapped: ${Number(j)/1000000000000000000} CRC, Need: ${l.toFixed(6)} CRC, Available (including all paths): ${g.toFixed(6)} CRC. Cannot acquire the remaining ${(Number(S-(V-j))/1000000000000000000).toFixed(6)} CRC.`,{code:"REPLENISH_INSUFFICIENT_TOKENS",source:"VALIDATION",context:{from:Y,tokenId:Z,target:X.toString(),unwrapped:j.toString(),deficit:S.toString(),available:V.toString(),targetCrc:m,unwrappedCrc:Number(j)/1000000000000000000,deficitCrc:l,availableCrc:g}})}if(!x.transfers||x.transfers.length===0)throw o.noPathFound(Y,K,`No path to acquire token ${Z}`);if(x.maxFlow<w){let O=Number(x.maxFlow)/1000000000000000000,g=Number(w)/1000000000000000000;throw new o(`Pathfinder can only provide ${O.toFixed(6)} CRC of the ${g.toFixed(6)} CRC deficit needed for token ${Z}.`,{code:"REPLENISH_INSUFFICIENT_PATH_FLOW",source:"PATHFINDING",context:{from:Y,tokenId:Z,deficit:w.toString(),pathFlow:x.maxFlow.toString(),deficitCrc:g,pathFlowCrc:O}})}if(U){let O=this.hubV2.trust(Z,R);B.push({to:O.to,data:O.data,value:O.value??0n})}let y=await BJ(Y,this.config.circlesRpcUrl,x),E=LJ(x,y),k=Object.keys(E).length>0,A=[],c=[];if(k){let O=await this._getTokenBalanceMap(Y),g=this._createDemurragedUnwrapCalls(E),{unwrapCalls:m,wrapCalls:l}=this._createInflationaryUnwrapAndWrapCalls(E,y,O);A=[...g,...m],c=l,x=HJ(x,y)}let h=CJ(Y,K,x.maxFlow,x.transfers),W=PJ(h),C=this.hubV2.operateFlowMatrix(h.flowVertices,h.flowEdges,W,h.packedCoordinates),T={to:C.to,data:C.data,value:C.value??0n},F=!1;try{F=await this.hubV2.isApprovedForAll(Y,Y)}catch(O){console.warn("Failed to check approval status, including approval transaction:",O)}if(U){let O=this.hubV2.trust(Z,0n);c.push({to:O.to,data:O.data,value:O.value??0n})}let _=F?[]:[{to:this.hubV2.setApprovalForAll(Y,!0).to,data:this.hubV2.setApprovalForAll(Y,!0).data,value:0n}];return B.push(..._,...A,T,...c),B}async _getTokenBalanceMap($){let J=await this.balance.getTokenBalances($),Q=new Map;return J.forEach((G)=>{Q.set(G.tokenAddress.toLowerCase(),G.staticAttoCircles)}),Q}_createDemurragedUnwrapCalls($){let J=[];for(let[Q,[G,Y]]of Object.entries($)){if(Y!=="CrcV2_ERC20WrapperDeployed_Demurraged")continue;let K=new c0({address:Q,rpcUrl:this.config.circlesRpcUrl}).unwrap(G);J.push({to:K.to,data:K.data,value:K.value??0n})}return J}_createInflationaryUnwrapAndWrapCalls($,J,Q){let G=[],Y=[];for(let[Z,[K,X]]of Object.entries($)){if(X!=="CrcV2_ERC20WrapperDeployed_Inflationary")continue;let q=J.get(Z.toLowerCase()),M=Q.get(Z.toLowerCase())||0n;if(M===0n)continue;let N=new l0({address:Z,rpcUrl:this.config.circlesRpcUrl}).unwrap(M);G.push({to:N.to,data:N.data,value:N.value??0n});let z=q?.tokenOwner,D=d.attoStaticCirclesToAttoCircles(M)-K;if(D>0n){let H=this.hubV2.wrap(z,D,1);Y.push({to:H.to,data:H.data,value:H.value??0n})}}return{unwrapCalls:G,wrapCalls:Y}}_truncateToSixDecimals($){let J=BigInt(1e6),Q=BigInt(10)**BigInt(18);return $/(Q/J)*(Q/J)}async _getDefaultTokenExcludeList($,J){let Q=await this.group.findGroups(1,{mintHandlerEquals:$}),G=new Set;if(Q.length>0){let Y=Q[0];if(G.add(Y.group.toLowerCase()),Y.erc20WrapperDemurraged)G.add(Y.erc20WrapperDemurraged.toLowerCase());if(Y.erc20WrapperStatic)G.add(Y.erc20WrapperStatic.toLowerCase())}if(J?.forEach((Y)=>G.add(Y.toLowerCase())),G.size===0)return;return Array.from(G)}}class SJ{config;rpcClient;pathfinder;trust;hubV2;referralsModule;constructor($){if(!$.referralsServiceUrl)throw new b("referralsServiceUrl is required in config",{code:"INVITATION_MISSING_CONFIG",source:"INVITATIONS",context:{missingField:"referralsServiceUrl"}});this.config=$,this.rpcClient=new R0($.circlesRpcUrl),this.pathfinder=new U0(this.rpcClient),this.trust=new x0(this.rpcClient),this.hubV2=new B0({address:$.v2HubAddress,rpcUrl:$.circlesRpcUrl}),this.referralsModule=new p0({address:$.referralsModuleAddress,rpcUrl:$.circlesRpcUrl})}async saveReferralData($,J){try{let Q=await fetch(`${this.config.referralsServiceUrl}/store`,{method:"POST",headers:{accept:"application/json","Content-Type":"application/json"},body:JSON.stringify({privateKey:J,inviter:$})});if(!Q.ok)throw new b(`HTTP error! status: ${Q.status}`,{code:"INVITATION_HTTP_ERROR",source:"INVITATIONS",context:{status:Q.status,url:`${this.config.referralsServiceUrl}/store`}})}catch(Q){throw console.error("Failed to save referral data:",Q),new b(`Failed to save referral data: ${Q instanceof Error?Q.message:"Unknown error"}`,{code:"INVITATION_SAVE_REFERRAL_FAILED",source:"INVITATIONS",cause:Q})}}async listReferrals($,J=10,Q=0){try{let G=new URL(`${this.config.referralsServiceUrl}/list/${$}`);G.searchParams.set("limit",String(J)),G.searchParams.set("offset",String(Q));let Y=await fetch(G.toString(),{method:"GET",headers:{accept:"application/json"}});if(!Y.ok)throw new b(`HTTP error! status: ${Y.status}`,{code:"INVITATION_HTTP_ERROR",source:"INVITATIONS",context:{status:Y.status,url:G.toString()}});return await Y.json()}catch(G){if(G instanceof b)throw G;throw new b(`Failed to list referrals: ${G instanceof Error?G.message:"Unknown error"}`,{code:"INVITATION_LIST_REFERRALS_FAILED",source:"INVITATIONS",cause:G})}}orderRealInviters($,J){let Q=J.toLowerCase();return $.sort((G,Y)=>{let Z=G.address.toLowerCase()===Q,K=Y.address.toLowerCase()===Q;if(Z&&!K)return-1;if(!Z&&K)return 1;return 0})}async generateInvite($,J){let Q=$.toLowerCase(),G=J.toLowerCase();if(await this.hubV2.isHuman(G))throw b.inviteeAlreadyRegistered(Q,G);let Z=await this.findInvitePath(Q),K=await this.generateInviteData([G],!1),X=new W$(this.config),q=await this.getRealInviters(Q);if(q.length===0)throw b.noPathFound(Q,this.config.invitationModuleAddress);let M=q[0].address;return await X.buildFlowMatrixTx(Q,this.config.invitationModuleAddress,Z,{toTokens:[M],useWrappedBalances:!0,txData:P$(K)},!0)}async findInvitePath($,J){let Q=$.toLowerCase(),G;if(J)G=J.toLowerCase();else{let Z=await this.getRealInviters(Q);if(Z.length===0)throw b.noPathFound(Q,this.config.invitationModuleAddress);G=Z[0].address}let Y=await this.pathfinder.findPath({from:Q,to:this.config.invitationModuleAddress,targetFlow:Q0,toTokens:[G],useWrappedBalances:!0});if(!Y.transfers||Y.transfers.length===0)throw b.noPathFound(Q,this.config.invitationModuleAddress);if(Y.maxFlow<Q0){let K=Number(Y.maxFlow/Q0);throw b.insufficientBalance(1,K,Q0,Y.maxFlow,Q,this.config.invitationModuleAddress)}return Y}async getRealInviters($){let J=$.toLowerCase(),Q=await this.trust.getTrustedBy(J),G=await this.trust.getMutualTrusts(J),Y=new Set([...Q.map((B)=>B.objectAvatar.toLowerCase()),...G.map((B)=>B.objectAvatar.toLowerCase())]),[Z,K]=await Promise.all([this.trust.getTrusts(this.config.invitationModuleAddress),this.trust.getMutualTrusts(this.config.invitationModuleAddress)]),X=new Set([...Z.map((B)=>B.objectAvatar.toLowerCase()),...K.map((B)=>B.objectAvatar.toLowerCase())]);if(!X.has(J))throw new b("Inviter must enable the invitation module before creating invitations",{code:"INVITATION_MODULE_NOT_ENABLED",source:"INVITATIONS",context:{inviter:J,invitationModule:this.config.invitationModuleAddress}});let M=[];for(let B of Y)if(X.has(B))M.push(B);let j=[...M,J];if(j.length===0)return[];let N=await this.pathfinder.findPath({from:J,to:this.config.invitationModuleAddress,useWrappedBalances:!0,targetFlow:$$,toTokens:j});if(!N.transfers||N.transfers.length===0)return[];let z=new Map,D=this.config.invitationModuleAddress.toLowerCase();for(let B of N.transfers)if(B.to.toLowerCase()===D){let S=B.tokenOwner.toLowerCase(),v=z.get(S)||BigInt(0);z.set(S,v+B.value)}let H=[];for(let[B,S]of z.entries()){let v=Number(S/Q0);if(v>=1)H.push({address:B,possibleInvites:v})}return this.orderRealInviters(H,J)}async generateReferral($){let J=$.toLowerCase(),Q=k$(),G=w$(Q),Y=await this.getRealInviters(J);if(Y.length===0)throw b.noProxyInviters(J);let K=Y[0].address,X=await this.findInvitePath(J,K),q=new W$(this.config),M=await this.generateInviteData([G],!0),j=await q.buildFlowMatrixTx(J,this.config.invitationModuleAddress,X,{toTokens:[K],useWrappedBalances:!0,txData:P$(M)},!0);await this.saveReferralData(J,Q);let N=[];return N.push(...j),{transactions:N,privateKey:Q}}async generateInviteData($,J=!0){if($.length===0)throw b.noAddressesProvided();if(!J)if($.length===1)return Z0(["address"],[$[0]]);else return Z0(["address[]"],[$]);if($.length===1){let G=this.referralsModule.createAccount($[0]).data;return Z0(["address","bytes"],[this.config.referralsModuleAddress,G])}else{let G=this.referralsModule.createAccounts($).data;return Z0(["address","bytes"],[this.config.referralsModuleAddress,G])}}computeAddress($){let Q=$.toLowerCase().replace("0x","").padStart(64,"0"),G=c$.replace("0x","")+Q,Y=y$("0x"+G),Z="ff",K=u$.toLowerCase().replace("0x",""),X=Y.replace("0x",""),q=l$.replace("0x",""),M="ff"+K+X+q,N="0x"+y$("0x"+M).slice(-40);return P0(N)}generateSecrets($){return Array.from({length:$},()=>{let J=k$(),Q=w$(J).toLowerCase();return{secret:J,signer:Q}})}}class IQ{referralsModuleAddress;invitations;invitationFarm;referralsModule;hubV2;constructor($){this.referralsModuleAddress=$.referralsModuleAddress,this.invitations=new SJ($),this.invitationFarm=new _$({address:$.invitationFarmAddress,rpcUrl:$.circlesRpcUrl}),this.referralsModule=new p0({address:$.referralsModuleAddress,rpcUrl:$.circlesRpcUrl}),this.hubV2=new B0({address:$.v2HubAddress,rpcUrl:$.circlesRpcUrl})}async getQuota($){return this.invitationFarm.inviterQuota($)}async getInvitationFee(){return this.invitationFarm.invitationFee()}async getInvitationModule(){return this.invitationFarm.invitationModule()}async generateReferrals($,J){if(J<=0)throw new b("Count must be greater than 0",{code:"INVITATION_INVALID_COUNT",source:"VALIDATION",context:{count:J}});let Q=$.toLowerCase(),G=J===1,Y=await this.simulateClaim(Q,J);if(!Y.length)throw new b("No invitation IDs returned from claim",{code:"INVITATION_NO_IDS",source:"INVITATIONS",context:{inviter:Q,count:J}});let Z=this.invitations.generateSecrets(J),K=Z.map((j)=>j.signer),X=await this.invitationFarm.invitationModule(),q=G?this.invitationFarm.claimInvite():this.invitationFarm.claimInvites(BigInt(J)),M=G?this.buildReferralTransfer(Q,X,Y[0],K[0]):this.buildBatchReferralTransfer(Q,X,Y,K);return await Promise.all(Z.map((j)=>this.invitations.saveReferralData(Q,j.secret))),{referrals:Z,transactions:[q,M]}}async generateInvites($,J){if(J.length===0)throw new b("At least one invitee address must be provided",{code:"INVITATION_INVALID_COUNT",source:"VALIDATION",context:{count:0}});let Q=$.toLowerCase(),G=J.map((j)=>j.toLowerCase()),Y=G.length,Z=Y===1,K=await this.simulateClaim(Q,Y);if(!K.length)throw new b("No invitation IDs returned from claim",{code:"INVITATION_NO_IDS",source:"INVITATIONS",context:{inviter:Q,count:Y}});let X=await this.invitationFarm.invitationModule(),q=Z?this.invitationFarm.claimInvite():this.invitationFarm.claimInvites(BigInt(Y)),M=Z?this.buildInviteTransfer(Q,X,K[0],G[0]):this.buildBatchInviteTransfer(Q,X,K,G);return{invitees:G,transactions:[q,M]}}async listReferrals($,J=10,Q=0){return this.invitations.listReferrals($,J,Q)}async simulateClaim($,J){if(J===1)return[await this.invitationFarm.read("claimInvite",[],{from:$})];return this.invitationFarm.read("claimInvites",[BigInt(J)],{from:$})}buildReferralTransfer($,J,Q,G){let Y=this.referralsModule.createAccount(G).data,Z=Z0(["address","bytes"],[this.referralsModuleAddress,Y]);return this.hubV2.safeTransferFrom($,J,Q,Q0,Z)}buildBatchReferralTransfer($,J,Q,G){let Y=this.referralsModule.createAccounts(G).data,Z=Z0(["address","bytes"],[this.referralsModuleAddress,Y]),K=Q.map(()=>Q0);return this.hubV2.safeBatchTransferFrom($,J,Q,K,Z)}buildInviteTransfer($,J,Q,G){let Y=Z0(["address"],[G]);return this.hubV2.safeTransferFrom($,J,Q,Q0,Y)}buildBatchInviteTransfer($,J,Q,G){let Y=Z0(["address[]"],[G]),Z=Q.map(()=>Q0);return this.hubV2.safeBatchTransferFrom($,J,Q,Z,Y)}}class TQ{baseUrl;getToken;constructor($,J){this.baseUrl=$;this.getToken=J}getBaseUrl(){return this.baseUrl.endsWith("/")?this.baseUrl.slice(0,-1):this.baseUrl}async getAuthHeaders(){if(!this.getToken)return{"Content-Type":"application/json"};return{"Content-Type":"application/json",Authorization:`Bearer ${await this.getToken()}`}}async retrieve($){try{let J=`${this.getBaseUrl()}/retrieve?key=${encodeURIComponent($)}`,Q=await fetch(J);if(!Q.ok){let G=`HTTP error! status: ${Q.status}`;try{G=(await Q.json()).error||G}catch{G=Q.statusText||G}throw new b(G,{code:"INVITATION_RETRIEVE_FAILED",source:"INVITATIONS",context:{status:Q.status,url:J,privateKey:$}})}return Q.json()}catch(J){if(J instanceof b)throw J;throw new b(`Failed to retrieve referral: ${J instanceof Error?J.message:"Unknown error"}`,{code:"INVITATION_RETRIEVE_ERROR",source:"INVITATIONS",cause:J,context:{privateKey:$}})}}async listMine(){if(!this.getToken)throw new b("Authentication required to list referrals",{code:"INVITATION_AUTH_REQUIRED",source:"INVITATIONS"});try{let $=`${this.getBaseUrl()}/my-referrals`,J=await this.getAuthHeaders(),Q=await fetch($,{headers:J});if(!Q.ok){let G=`HTTP error! status: ${Q.status}`;try{G=(await Q.json()).error||G}catch{G=Q.statusText||G}throw new b(G,{code:"INVITATION_LIST_FAILED",source:"INVITATIONS",context:{status:Q.status,url:$}})}return Q.json()}catch($){if($ instanceof b)throw $;throw new b(`Failed to list referrals: ${$ instanceof Error?$.message:"Unknown error"}`,{code:"INVITATION_LIST_ERROR",source:"INVITATIONS",cause:$})}}}export{TQ as Referrals,IQ as InviteFarm,SJ as Invitations,b as InvitationError};
1
+ var xJ=($)=>BigInt($),$$=($)=>parseInt($,16),k8=($)=>{if($.startsWith("0x"))$=$.slice(2);if($.length%2!==0)throw Error("Invalid hex string");let J=new Uint8Array($.length/2);for(let Q=0;Q<$.length;Q+=2)J[Q/2]=parseInt($.substr(Q,2),16);return J};function A8($,J){if(typeof J==="string"&&J.startsWith("0x")){let Q=J.slice(2);if(Q.length===40)return J;if(Q.length===64){if($.toLowerCase().includes("digest")||$.toLowerCase().includes("data")||$.toLowerCase().includes("bytes"))return k8(J);try{return xJ(J)}catch{return J}}try{let Y=$$(J);if(Y<Number.MAX_SAFE_INTEGER)return Y;return xJ(J)}catch{return J}}if(J==="true")return!0;if(J==="false")return!1;return J}function v$($){let{event:J,values:Q}=$,Y={$event:J,blockNumber:Q.blockNumber?$$(Q.blockNumber):0,timestamp:Q.timestamp?$$(Q.timestamp):void 0,transactionIndex:Q.transactionIndex?$$(Q.transactionIndex):0,logIndex:Q.logIndex?$$(Q.logIndex):0,transactionHash:Q.transactionHash};for(let[G,Z]of Object.entries(Q)){if(["blockNumber","timestamp","transactionIndex","logIndex","transactionHash"].includes(G))continue;Y[G]=A8(G,Z)}return Y}function O$($){return $.map(v$)}class u0{_subscribers=[];subscribe($){return this._subscribers.push($),()=>{let J=this._subscribers.indexOf($);if(J>-1)this._subscribers.splice(J,1)}}constructor(){this._subscribers=[]}emit($){this._subscribers.forEach((J)=>J($))}static create(){let $=new u0;return{property:$,emit:(J)=>$.emit(J)}}}class J$ extends Error{name;code;source;cause;context;constructor($,J,Q){super(J);if(this.name=$,this.code=Q?.code,this.source=Q?.source??"UNKNOWN",this.cause=Q?.cause,this.context=Q?.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 $=`[${this.source}] ${this.name}: ${this.message}`;if(this.code)$+=` (Code: ${this.code})`;if(this.context)$+=`
2
+ Context: ${JSON.stringify(this.context,null,2)}`;return $}}class a extends J${constructor($,J){super("RpcError",$,{...J,source:J?.source??"RPC_REQUEST"})}static connectionFailed($,J){return new a("Failed to connect to RPC endpoint",{code:"RPC_CONNECTION_FAILED",source:"RPC_CONNECTION",cause:J,context:{url:$}})}static timeout($,J){return new a("RPC request timed out",{code:"RPC_TIMEOUT",source:"RPC_TIMEOUT",context:{method:$,timeout:J}})}static invalidResponse($,J){return new a("Invalid RPC response",{code:"RPC_INVALID_RESPONSE",source:"RPC_RESPONSE",context:{method:$,response:J}})}static fromJsonRpcError($){return new a($.message,{code:$.code,source:"RPC_RESPONSE",context:{data:$.data}})}static websocketError($,J){return new a($,{code:"RPC_WEBSOCKET_ERROR",source:"RPC_WEBSOCKET",cause:J})}}class R0{rpcUrl;requestId=0;websocket=null;websocketConnected=!1;pendingResponses={};subscriptionListeners={};reconnectAttempt=0;initialBackoff=2000;maxBackoff=120000;constructor($){this.rpcUrl=$}async call($,J){this.requestId++;let Q={jsonrpc:"2.0",id:this.requestId,method:$,params:J};try{let Y=await fetch(this.rpcUrl,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(Q)});if(!Y.ok)throw a.connectionFailed(this.rpcUrl,Error(`HTTP ${Y.status}: ${Y.statusText}`));let G=await Y.json();if(G.error)throw a.fromJsonRpcError(G.error);if(G.result===void 0)throw a.invalidResponse($,G);return G.result}catch(Y){if(Y instanceof a)throw Y;throw a.connectionFailed(this.rpcUrl,Y)}}setRpcUrl($){this.rpcUrl=$}getRpcUrl(){return this.rpcUrl}connect(){return new Promise(($)=>{let J=this.rpcUrl.replace("http","ws");if(J.endsWith("/"))J+="ws";else J+="/ws";this.websocket=new WebSocket(J),this.websocket.onopen=()=>{console.log("WebSocket connected"),this.websocketConnected=!0,this.reconnectAttempt=0,$()},this.websocket.onmessage=(Q)=>{let Y=JSON.parse(Q.data),{id:G,method:Z,params:K}=Y;if(G!==void 0&&this.pendingResponses[G])this.pendingResponses[G].resolve(Y),delete this.pendingResponses[G];if(Z==="eth_subscription"&&K){let{subscription:X,result:q}=K;if(this.subscriptionListeners[X])this.subscriptionListeners[X].forEach((M)=>M(q))}},this.websocket.onclose=()=>{console.warn("WebSocket closed"),this.websocketConnected=!1},this.websocket.onerror=(Q)=>{console.error("WebSocket error:",Q),this.websocketConnected=!1,this.scheduleReconnect()}})}scheduleReconnect(){let $=Math.min(this.initialBackoff*Math.pow(2,this.reconnectAttempt),this.maxBackoff),J=$*(Math.random()*0.5),Q=$+J;console.log(`Reconnecting in ${Math.round(Q)}ms (attempt #${this.reconnectAttempt+1})`),this.reconnectAttempt++,setTimeout(()=>{this.reconnect()},Q)}async reconnect(){if(this.websocketConnected)return;try{await this.connect(),console.log("Reconnection successful")}catch($){console.error("Reconnection attempt failed:",$),this.scheduleReconnect()}}sendMessage($,J,Q=5000){if(!this.websocket||this.websocket.readyState!==WebSocket.OPEN)return Promise.reject(a.connectionFailed(this.rpcUrl));let Y=this.requestId++,G={jsonrpc:"2.0",method:$,params:J,id:Y};return new Promise((Z,K)=>{this.pendingResponses[Y]={resolve:Z,reject:K},this.websocket.send(JSON.stringify(G)),setTimeout(()=>{if(this.pendingResponses[Y])this.pendingResponses[Y].reject(a.timeout($,Q)),delete this.pendingResponses[Y]},Q)})}async subscribe($){let J=$?.toLowerCase();if(!this.websocketConnected)await this.connect();let Q=u0.create(),Y=JSON.stringify(J?{address:J}:{}),Z=(await this.sendMessage("eth_subscribe",["circles",Y])).result;if(!this.subscriptionListeners[Z])this.subscriptionListeners[Z]=[];return this.subscriptionListeners[Z].push((K)=>{O$(K).forEach((X)=>Q.emit(X))}),Q.property}}var R$=BigInt(4294967295),EJ=BigInt(32);function y8($,J=!1){if(J)return{h:Number($&R$),l:Number($>>EJ&R$)};return{h:Number($>>EJ&R$)|0,l:Number($&R$)|0}}function kJ($,J=!1){let Q=$.length,Y=new Uint32Array(Q),G=new Uint32Array(Q);for(let Z=0;Z<Q;Z++){let{h:K,l:X}=y8($[Z],J);[Y[Z],G[Z]]=[K,X]}return[Y,G]}var AJ=($,J,Q)=>$<<Q|J>>>32-Q,wJ=($,J,Q)=>J<<Q|$>>>32-Q,yJ=($,J,Q)=>J<<Q-32|$>>>64-Q,bJ=($,J,Q)=>$<<Q-32|J>>>64-Q;var I0=typeof globalThis==="object"&&"crypto"in globalThis?globalThis.crypto:void 0;/*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) */function b8($){return $ instanceof Uint8Array||ArrayBuffer.isView($)&&$.constructor.name==="Uint8Array"}function T0($){if(!Number.isSafeInteger($)||$<0)throw Error("positive integer expected, got "+$)}function K0($,...J){if(!b8($))throw Error("Uint8Array expected");if(J.length>0&&!J.includes($.length))throw Error("Uint8Array expected of length "+J+", got length="+$.length)}function FJ($){if(typeof $!=="function"||typeof $.create!=="function")throw Error("Hash should be wrapped by utils.createHasher");T0($.outputLen),T0($.blockLen)}function M0($,J=!0){if($.destroyed)throw Error("Hash instance has been destroyed");if(J&&$.finished)throw Error("Hash#digest() has already been called")}function C$($,J){K0($);let Q=J.outputLen;if($.length<Q)throw Error("digestInto() expects output buffer of length at least "+Q)}function gJ($){return new Uint32Array($.buffer,$.byteOffset,Math.floor($.byteLength/4))}function X0(...$){for(let J=0;J<$.length;J++)$[J].fill(0)}function P$($){return new DataView($.buffer,$.byteOffset,$.byteLength)}function Z0($,J){return $<<32-J|$>>>J}var F8=(()=>new Uint8Array(new Uint32Array([287454020]).buffer)[0]===68)();function g8($){return $<<24&4278190080|$<<8&16711680|$>>>8&65280|$>>>24&255}function f8($){for(let J=0;J<$.length;J++)$[J]=g8($[J]);return $}var h$=F8?($)=>$:f8;function v8($){if(typeof $!=="string")throw Error("string expected");return new Uint8Array(new TextEncoder().encode($))}function _0($){if(typeof $==="string")$=v8($);return K0($),$}function fJ(...$){let J=0;for(let Y=0;Y<$.length;Y++){let G=$[Y];K0(G),J+=G.length}let Q=new Uint8Array(J);for(let Y=0,G=0;Y<$.length;Y++){let Z=$[Y];Q.set(Z,G),G+=Z.length}return Q}class x0{}function B$($){let J=(Y)=>$().update(_0(Y)).digest(),Q=$();return J.outputLen=Q.outputLen,J.blockLen=Q.blockLen,J.create=()=>$(),J}function vJ($=32){if(I0&&typeof I0.getRandomValues==="function")return I0.getRandomValues(new Uint8Array($));if(I0&&typeof I0.randomBytes==="function")return Uint8Array.from(I0.randomBytes($));throw Error("crypto.getRandomValues must be defined")}var h8=BigInt(0),Q$=BigInt(1),m8=BigInt(2),u8=BigInt(7),c8=BigInt(256),l8=BigInt(113),uJ=[],cJ=[],lJ=[];for(let $=0,J=Q$,Q=1,Y=0;$<24;$++){[Q,Y]=[Y,(2*Q+3*Y)%5],uJ.push(2*(5*Y+Q)),cJ.push(($+1)*($+2)/2%64);let G=h8;for(let Z=0;Z<7;Z++)if(J=(J<<Q$^(J>>u8)*l8)%c8,J&m8)G^=Q$<<(Q$<<BigInt(Z))-Q$;lJ.push(G)}var pJ=kJ(lJ,!0),p8=pJ[0],d8=pJ[1],hJ=($,J,Q)=>Q>32?yJ($,J,Q):AJ($,J,Q),mJ=($,J,Q)=>Q>32?bJ($,J,Q):wJ($,J,Q);function i8($,J=24){let Q=new Uint32Array(10);for(let Y=24-J;Y<24;Y++){for(let K=0;K<10;K++)Q[K]=$[K]^$[K+10]^$[K+20]^$[K+30]^$[K+40];for(let K=0;K<10;K+=2){let X=(K+8)%10,q=(K+2)%10,M=Q[q],j=Q[q+1],z=hJ(M,j,1)^Q[X],N=mJ(M,j,1)^Q[X+1];for(let D=0;D<50;D+=10)$[K+D]^=z,$[K+D+1]^=N}let G=$[2],Z=$[3];for(let K=0;K<24;K++){let X=cJ[K],q=hJ(G,Z,X),M=mJ(G,Z,X),j=uJ[K];G=$[j],Z=$[j+1],$[j]=q,$[j+1]=M}for(let K=0;K<50;K+=10){for(let X=0;X<10;X++)Q[X]=$[K+X];for(let X=0;X<10;X++)$[K+X]^=~Q[(X+2)%10]&Q[(X+4)%10]}$[0]^=p8[Y],$[1]^=d8[Y]}X0(Q)}class m$ extends x0{constructor($,J,Q,Y=!1,G=24){super();if(this.pos=0,this.posOut=0,this.finished=!1,this.destroyed=!1,this.enableXOF=!1,this.blockLen=$,this.suffix=J,this.outputLen=Q,this.enableXOF=Y,this.rounds=G,T0(Q),!(0<$&&$<200))throw Error("only keccak-f1600 function is supported");this.state=new Uint8Array(200),this.state32=gJ(this.state)}clone(){return this._cloneInto()}keccak(){h$(this.state32),i8(this.state32,this.rounds),h$(this.state32),this.posOut=0,this.pos=0}update($){M0(this),$=_0($),K0($);let{blockLen:J,state:Q}=this,Y=$.length;for(let G=0;G<Y;){let Z=Math.min(J-this.pos,Y-G);for(let K=0;K<Z;K++)Q[this.pos++]^=$[G++];if(this.pos===J)this.keccak()}return this}finish(){if(this.finished)return;this.finished=!0;let{state:$,suffix:J,pos:Q,blockLen:Y}=this;if($[Q]^=J,(J&128)!==0&&Q===Y-1)this.keccak();$[Y-1]^=128,this.keccak()}writeInto($){M0(this,!1),K0($),this.finish();let J=this.state,{blockLen:Q}=this;for(let Y=0,G=$.length;Y<G;){if(this.posOut>=Q)this.keccak();let Z=Math.min(Q-this.posOut,G-Y);$.set(J.subarray(this.posOut,this.posOut+Z),Y),this.posOut+=Z,Y+=Z}return $}xofInto($){if(!this.enableXOF)throw Error("XOF is not possible for this instance");return this.writeInto($)}xof($){return T0($),this.xofInto(new Uint8Array($))}digestInto($){if(C$($,this),this.finished)throw Error("digest() was already called");return this.writeInto($),this.destroy(),$}digest(){return this.digestInto(new Uint8Array(this.outputLen))}destroy(){this.destroyed=!0,X0(this.state)}_cloneInto($){let{blockLen:J,suffix:Q,outputLen:Y,rounds:G,enableXOF:Z}=this;return $||($=new m$(J,Q,Y,Z,G)),$.state32.set(this.state32),$.pos=this.pos,$.posOut=this.posOut,$.finished=this.finished,$.rounds=G,$.suffix=Q,$.outputLen=Y,$.enableXOF=Z,$.destroyed=this.destroyed,$}}var n8=($,J,Q)=>B$(()=>new m$(J,$,Q));var c0=(()=>n8(1,136,32))();var dJ=[];for(let $=0;$<256;$++)dJ[$]=$.toString(16).padStart(2,"0");function L$($){let J="0x";for(let Q=0;Q<$.length;Q++)J+=dJ[$[Q]];return J}function H$($){let J=$.startsWith("0x")?$.slice(2):$,Q=new Uint8Array(J.length/2);for(let Y=0;Y<J.length;Y+=2)Q[Y/2]=parseInt(J.slice(Y,Y+2),16);return Q}var u=64,I$=32,S$=($)=>$.startsWith("0x")?$.slice(2):$;var q0=($)=>$.toString(16).padStart(u,"0");function P0($){let J=$.toLowerCase().replace("0x",""),Q=L$(c0(new TextEncoder().encode(J))).slice(2),Y="0x";for(let G=0;G<J.length;G++)Y+=parseInt(Q[G],16)>=8?J[G].toUpperCase():J[G];return Y}function u$($,J){if($==="tuple"&&J)return`(${J.map((G)=>u$(G.type,G.components)).join(",")})`;let Q=$.match(/^tuple(\[\d*\])$/);if(Q&&J)return`${u$("tuple",J)}${Q[1]}`;return $}function o8($){let Q=($.inputs||[]).map((Y)=>u$(Y.type,Y.components));return`${$.name}(${Q.join(",")})`}function t8($){let J=o8($),Q=c0(new TextEncoder().encode(J));return L$(Q.slice(0,4))}function l0($,J){if($==="string"||$==="bytes")return!0;if($.includes("[")){let Q=$.slice(0,$.indexOf("["));if($.endsWith("[]"))return!0;if(Q==="tuple")return iJ(J);return l0(Q)}if($==="tuple")return iJ(J);return!1}function iJ($){return $?.some((J)=>l0(J.type,J.components))??!1}function C0($,J,Q){if($==="tuple"&&Q)return s8(Q,J);if($.includes("["))return a8($,J,Q);return r8($,J)}function a8($,J,Q){let Y=$.slice(0,$.indexOf("[")),G=$.endsWith("[]"),Z=l0(Y,Q),K;if(Z){let X=J.map((j)=>C0(Y,j,Q)),q=J.length*I$;K=X.map((j)=>{let z=q;return q+=j.length/2,q0(z)}).join("")+X.join("")}else K=J.map((X)=>C0(Y,X,Q)).join("");return G?q0(J.length)+K:K}function s8($,J){let Q=Array.isArray(J),Y=[],G=[],Z=[];for(let K=0;K<$.length;K++){let X=$[K],q=Q?J[K]:J[X.name||""],M=l0(X.type,X.components);if(Z.push(M),M)Y.push(""),G.push(C0(X.type,q,X.components));else Y.push(C0(X.type,q,X.components))}if(G.length>0){let K=Y.reduce((M,j,z)=>M+(Z[z]?I$:j.length/2),0),X="",q=0;for(let M=0;M<$.length;M++)if(Z[M])X+=q0(K),K+=G[q].length/2,q++;else X+=Y[M];return X+G.join("")}return Y.join("")}function r8($,J){if($==="address")return S$(J).toLowerCase().padStart(u,"0");if($==="bool")return q0(J?1:0);if($.startsWith("uint")){let Q=typeof J==="bigint"?J:BigInt(J);return q0(Q)}if($.startsWith("int")){let Q=typeof J==="bigint"?J:BigInt(J);if(Q<0n){let Y=$==="int"?256:parseInt($.slice(3));Q=(1n<<BigInt(Y))+Q}return q0(Q)}if($.startsWith("bytes")&&$!=="bytes")return S$(J).padEnd(u,"0");if($==="bytes"){let Q=S$(J),Y=q0(Q.length/2),G=Q.padEnd(Math.ceil(Q.length/u)*u,"0");return Y+G}if($==="string"){let Q=Array.from(new TextEncoder().encode(J)).map((Z)=>Z.toString(16).padStart(2,"0")).join(""),Y=q0(Q.length/2),G=Q.padEnd(Math.ceil(Q.length/u)*u,"0");return Y+G}throw Error(`Unsupported type: ${$}`)}function Y$($,J,Q=0,Y){if($==="tuple"&&Y)return $Q(Y,J,Q);if($.includes("["))return e8($,J,Q,Y);return JQ($,J,Q)}function e8($,J,Q,Y){let G=$.slice(0,$.indexOf("[")),Z=J.slice(Q,Q+u);if($.endsWith("[]")){let X=parseInt(Z,16)*2,q=parseInt(J.slice(X,X+u),16),M=[],j=X+u;for(let z=0;z<q;z++){let N=Y$(G,J,j,Y);M.push(N.value),j+=N.consumed}return{value:M,consumed:u}}let K=$.match(/\[(\d+)\]$/);if(K){let X=parseInt(K[1]),q=[],M=0;for(let j=0;j<X;j++){let z=Y$(G,J,Q+M,Y);q.push(z.value),M+=z.consumed}return{value:q,consumed:M}}throw Error(`Invalid array type: ${$}`)}function $Q($,J,Q){let Y=[],G=Q;for(let Z of $){let K=Y$(Z.type,J,G,Z.components);Y.push(K.value),G+=K.consumed}return{value:Y,consumed:G-Q}}function JQ($,J,Q){let Y=J.slice(Q,Q+u);if($==="address")return{value:P0("0x"+Y.slice(24)),consumed:u};if($==="bool")return{value:parseInt(Y,16)!==0,consumed:u};if($.startsWith("uint"))return{value:BigInt("0x"+Y),consumed:u};if($.startsWith("int")){let G=BigInt("0x"+Y),Z=$==="int"?256:parseInt($.slice(3)),K=1n<<BigInt(Z-1);return{value:G>=K?G-(1n<<BigInt(Z)):G,consumed:u}}if($.startsWith("bytes")&&$!=="bytes"){let G=parseInt($.match(/^bytes(\d+)$/)[1]);return{value:"0x"+Y.slice(0,G*2),consumed:u}}if($==="bytes"){let G=parseInt(Y,16)*2,Z=parseInt(J.slice(G,G+u),16)*2;return{value:"0x"+J.slice(G+u,G+u+Z),consumed:u}}if($==="string"){let G=parseInt(Y,16)*2,Z=parseInt(J.slice(G,G+u),16)*2,K=J.slice(G+u,G+u+Z),X=new Uint8Array(K.match(/.{2}/g)?.map((q)=>parseInt(q,16))||[]);return{value:new TextDecoder().decode(X),consumed:u}}throw Error(`Unsupported type: ${$}`)}function T$($){let{abi:J,functionName:Q,args:Y=[]}=$,G=J.find((D)=>D.type==="function"&&D.name===Q);if(!G)throw Error(`Function "${Q}" not found in ABI`);let Z=t8(G),K=G.inputs||[];if(K.length===0)return Z;if(Y.length!==K.length)throw Error(`Expected ${K.length} arguments, got ${Y.length}`);let X=[],q=[],M=[];for(let D=0;D<K.length;D++){let P=K[D],V=P.components,y=l0(P.type,V);if(M.push(y),y)X.push(""),q.push(C0(P.type,Y[D],V));else X.push(C0(P.type,Y[D],V))}if(q.length===0)return Z+X.join("");let j=X.reduce((D,P,V)=>D+(M[V]?I$:P.length/2),0),z="",N=0;for(let D=0;D<K.length;D++)if(M[D])z+=q0(j),j+=q[N].length/2,N++;else z+=X[D];return Z+z+q.join("")}function c$($){let{abi:J,functionName:Q,data:Y}=$,G=J.find((M)=>M.type==="function"&&M.name===Q);if(!G)throw Error(`Function "${Q}" not found in ABI`);let Z=G.outputs||[];if(Z.length===0)return;let K=S$(Y);if(Z.length===1)return Y$(Z[0].type,K,0,Z[0].components).value;let X=[],q=0;for(let M of Z){let j=Y$(M.type,K,q,M.components);X.push(j.value),q+=j.consumed}return X}function J0($,J){if($.length!==J.length)throw Error(`Type/value length mismatch: ${$.length} types, ${J.length} values`);let Q=[],Y=[],G=[];for(let q=0;q<$.length;q++){let M=$[q],j=l0(M);if(G.push(j),j)Q.push(""),Y.push(C0(M,J[q]));else Q.push(C0(M,J[q]))}if(Y.length===0)return"0x"+Q.join("");let Z=Q.reduce((q,M,j)=>q+(G[j]?I$:M.length/2),0),K="",X=0;for(let q=0;q<$.length;q++)if(G[q])K+=q0(Z),Z+=Y[X].length/2,X++;else K+=Q[q];return"0x"+K+Y.join("")}function B($){return $.toLowerCase()}function QQ($){return P0($)}function YQ($){if(typeof $!=="string")return!1;let J=$.replace("0x","");return J.length===40&&/^[0-9a-fA-F]{40}$/.test(J)}function v($){if($===null||$===void 0)return $;if(YQ($))return QQ($);if(Array.isArray($))return $.map((J)=>v(J));if(typeof $==="object"&&$!==null){let J={};for(let Q in $)if(Object.prototype.hasOwnProperty.call($,Q))J[Q]=v($[Q]);return J}return $}function nJ($){return{Source:B($.from),Sink:B($.to),TargetFlow:$.targetFlow.toString(),WithWrap:$.useWrappedBalances,FromTokens:$.fromTokens?.map(B),ToTokens:$.toTokens?.map(B),ExcludedFromTokens:$.excludeFromTokens?.map(B),ExcludedToTokens:$.excludeToTokens?.map(B),SimulatedBalances:$.simulatedBalances?.map((J)=>({Holder:B(J.holder),Token:B(J.token),Amount:J.amount.toString(),IsWrapped:J.isWrapped,IsStatic:J.isStatic})),SimulatedTrusts:$.simulatedTrusts?.map((J)=>({Truster:B(J.truster),Trustee:B(J.trustee)})),MaxTransfers:$.maxTransfers}}function j0($){let J={};for(let Q in $){let Y=$[Q];if(Y===null||Y===void 0)J[Q]=Y;else if(typeof Y==="string"&&/^\d+$/.test(Y))J[Q]=BigInt(Y);else if(typeof Y==="object"&&!Array.isArray(Y))J[Q]=j0(Y);else if(Array.isArray(Y))J[Q]=Y.map((G)=>typeof G==="object"&&G!==null?j0(G):G);else J[Q]=Y}return J}var _$="0x0000000000000000000000000000000000000000",p=BigInt(96)*BigInt(1000000000000000000),G$=BigInt("9999999999999999999999999999999999999"),l$="0x4e1DCf7AD4e460CfD30791CCC4F9c8a4f820ec67",p$="0x89867a67674bd4bf33165a653cde826b696ab7d050166b71066dfa0b9b6f90f4",d$="0xe298282cefe913ab5d282047161268a8222e4bd4ed106300c547894bbefd31ee",p0="0xc19bc204eb1c1d5b3fe500e5e5dfabab625f286c",E0="0x9Eb51E6A39B3F17bB1883B80748b56170039ff1d";class W0{client;constructor($){this.client=$}async findPath($){let J=nJ($),Q=await this.client.call("circlesV2_findPath",[J]),Y=j0(Q);return v(Y)}async findMaxFlow($){let J=await this.findPath({...$,targetFlow:G$});return BigInt(J.maxFlow)}}class Z${client;constructor($){this.client=$}async query($){let J=await this.client.call("circles_query",[$]);return v(J)}async tables(){return this.client.call("circles_tables",[])}async events($,J,Q=null,Y=null,G=!1){let Z=await this.client.call("circles_events",[$,J,Q,Y,G]);return v(Z)}}var GQ=[{name:"blockNumber",sortOrder:"DESC"},{name:"transactionIndex",sortOrder:"DESC"},{name:"logIndex",sortOrder:"DESC"}];class Q0{params;client;rowTransformer;cursorColumns;orderColumns;get currentPage(){return this._currentPage}_currentPage;constructor($,J,Q){this.client=$,this.params=J,this.rowTransformer=Q||J.rowTransformer,this.orderColumns=J.orderColumns,this.cursorColumns=J.cursorColumns||this.buildEventCursorColumns()}buildEventCursorColumns(){let $=GQ.map((J)=>({...J,sortOrder:this.params.sortOrder}));if(this.params.table==="TransferBatch")$.push({name:"batchIndex",sortOrder:this.params.sortOrder});return $}transformCursorValue($,J){if(J)return J($);if(typeof $==="bigint")return $.toString();return $}createEqualityPredicate($,J){return{Type:"FilterPredicate",FilterType:"Equals",Column:$.name,Value:this.transformCursorValue(J,$.toValue)}}createComparisonPredicate($,J){return{Type:"FilterPredicate",FilterType:$.sortOrder==="ASC"?"GreaterThan":"LessThan",Column:$.name,Value:this.transformCursorValue(J,$.toValue)}}buildCursorFilter($){if(!$)return[];let J=[];for(let Q=0;Q<this.cursorColumns.length;Q++){let Y=this.cursorColumns[Q],G=$[Y.name];if(G===void 0)continue;if(Q===0)J.push(this.createComparisonPredicate(Y,G));else{let Z=[];for(let K=0;K<Q;K++){let X=this.cursorColumns[K],q=$[X.name];if(q!==void 0)Z.push(this.createEqualityPredicate(X,q))}Z.push(this.createComparisonPredicate(Y,G)),J.push({Type:"Conjunction",ConjunctionType:"And",Predicates:Z})}}if(J.length===0)return[];return[{Type:"Conjunction",ConjunctionType:"Or",Predicates:J}]}buildOrderBy(){if(this.orderColumns&&this.orderColumns.length>0)return this.orderColumns;return this.cursorColumns.map(($)=>({Column:$.name,SortOrder:$.sortOrder}))}combineFilters($,J){if(!$?.length&&!J?.length)return[];if(!$?.length)return J||[];if(!J?.length)return $;return[{Type:"Conjunction",ConjunctionType:"And",Predicates:[...$,...J]}]}rowsToObjects($){let{columns:J,rows:Q}=$;return Q.map((Y)=>{let G={};return J.forEach((Z,K)=>{G[Z]=Y[K]}),this.rowTransformer?this.rowTransformer(G):G})}rowToCursor($){let J={};for(let Q of this.cursorColumns)J[Q.name]=$[Q.name];return J}getCursors($){if($.length===0)return{};return{first:this.rowToCursor($[0]),last:this.rowToCursor($[$.length-1])}}async queryNextPage(){let $=this.buildCursorFilter(this._currentPage?.lastCursor),J=this.combineFilters(this.params.filter,$),Q={Namespace:this.params.namespace,Table:this.params.table,Columns:this.params.columns,Filter:J,Order:this.buildOrderBy(),Limit:this.params.limit},Y=await this.client.call("circles_query",[Q]),G=this.rowsToObjects(Y),Z=this.getCursors(G);return this._currentPage={limit:this.params.limit,size:G.length,firstCursor:Z.first,lastCursor:Z.last,sortOrder:this.params.sortOrder,hasMore:G.length===this.params.limit,results:G},G.length>0}reset(){this._currentPage=void 0}}class k0{client;constructor($){this.client=$}transformQueryResponse($){let{columns:J,rows:Q}=$;return Q.map((Y)=>{let G={};return J.forEach((Z,K)=>{G[Z]=Y[K]}),G})}async getCommonTrust($,J){let Q=await this.client.call("circles_getCommonTrust",[B($),B(J)]);return v(Q)}getTrustRelations($,J=100,Q="DESC"){let Y=B($),G=[{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:Y},{Type:"FilterPredicate",FilterType:"Equals",Column:"truster",Value:Y}]}]}];return new Q0(this.client,{namespace:"V_Crc",table:"TrustRelations",sortOrder:Q,columns:["blockNumber","timestamp","transactionIndex","logIndex","transactionHash","version","trustee","truster","expiryTime"],filter:G,limit:J},(Z)=>v(Z))}async getAggregatedTrustRelations($){let J=B($),Q=this.getTrustRelations(J,1000),Y=[];while(await Q.queryNextPage())if(Y.push(...Q.currentPage.results),!Q.currentPage.hasMore)break;let G={};Y.forEach((K)=>{let X=B(K.truster),q=B(K.trustee),M=X!==J?K.truster:K.trustee;if(!G[M])G[M]=[];G[M].push(K)});let Z=Object.entries(G).filter(([K])=>B(K)!==J).map(([K,X])=>{let q=Math.max(...X.map((j)=>j.timestamp)),M;if(X.length===2)M="mutuallyTrusts";else if(B(X[0]?.trustee)===J)M="trustedBy";else if(B(X[0]?.truster)===J)M="trusts";else throw Error("Unexpected trust list row. Couldn't determine trust relation.");return{subjectAvatar:J,relation:M,objectAvatar:K,timestamp:q}});return v(Z)}async getTrustedBy($){let J=B($),Y=(await this.getAggregatedTrustRelations(J)).filter((G)=>G.relation==="trustedBy");return v(Y)}async getTrusts($){let J=B($),Y=(await this.getAggregatedTrustRelations(J)).filter((G)=>G.relation==="trusts");return v(Y)}async getMutualTrusts($){let J=B($),Y=(await this.getAggregatedTrustRelations(J)).filter((G)=>G.relation==="mutuallyTrusts");return v(Y)}}class i{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){return $*J>>64n}static mulU($,J){return $*J>>64n}static pow64($,J){let Q=$,Y=J,G=this.ONE_64;while(Y>0n){if((Y&1n)===1n)G=this.mul64(G,Q);Q=this.mul64(Q,Q),Y>>=1n}return G}static ONE_36=1000000000000000000000000000000000000000n;static GAMMA_36=999801332008598957430613406568191166n;static BETA_36=1000198707468214629156271489013303962n;static mul36($,J){return $*J/this.ONE_36}static pow36($,J){let Q=this.ONE_36,Y=$,G=J;while(G>0n){if((G&1n)===1n)Q=this.mul36(Q,Y);Y=this.mul36(Y,Y),G>>=1n}return Q}static attoCirclesToCircles($){if($===0n)return 0;let J=$/this.ATTO_FACTOR,Q=$%this.ATTO_FACTOR,Y=BigInt(Number.MAX_SAFE_INTEGER);if(J>Y||J<-Y)throw RangeError("Atto value’s integer component exceeds JS double precision.");return Number(J)+Number(Q)/Number(this.ATTO_FACTOR)}static circlesToAttoCircles($){return BigInt(Math.trunc($*Number(this.ATTO_FACTOR)))}static inflationaryToDemurrage($,J){return this.mulU(this.pow64(this.GAMMA_64,J),$)}static demurrageToInflationary($,J){return this.mulU(this.pow64(this.BETA_64,J),$)}static dayFromTimestamp($){return($-this.INFLATION_DAY_ZERO_UNIX)/this.SECONDS_PER_DAY}static attoCirclesToAttoStaticCircles($,J=BigInt(Math.floor(Date.now()/1000))){return this.demurrageToInflationary($,this.dayFromTimestamp(J))}static attoStaticCirclesToAttoCircles($,J=BigInt(Math.floor(Date.now()/1000))){return this.inflationaryToDemurrage($,this.dayFromTimestamp(J))}static inflationaryToDemurrageExact($,J){let Q=this.pow36(this.GAMMA_36,J);return $*Q/this.ONE_36}static demurrageToInflationaryExact($,J){let Q=this.pow36(this.BETA_36,J);return $*Q/this.ONE_36}static attoCirclesToAttoStaticCirclesExact($,J=BigInt(Math.floor(Date.now()/1000))){let Q=this.dayFromTimestamp(J);return this.demurrageToInflationaryExact($,Q)}static attoStaticCirclesToAttoCirclesExact($,J=BigInt(Math.floor(Date.now()/1000))){let Q=this.dayFromTimestamp(J);return this.inflationaryToDemurrageExact($,Q)}static truncateToInt64($){let J=$/this.FACTOR_1E12,Q=9223372036854775807n;return J>Q?Q:J}static blowUpToBigInt($){return $*this.FACTOR_1E12}static truncateToSixDecimals($){return this.blowUpToBigInt(this.truncateToInt64($))}static v1InflateFactor($){if($===0n)return this.V1_ACCURACY;return this.V1_ACCURACY*this.V1_INFLATION_PCT_NUM**$/this.V1_INFLATION_PCT_DEN**$}static attoCrcToAttoCircles($,J){let Q=J-this.INFLATION_DAY_ZERO_UNIX,Y=Q/this.PERIOD_SEC,G=Q%this.PERIOD_SEC,Z=this.v1InflateFactor(Y),K=this.v1InflateFactor(Y+1n);return this.v1ToDemurrage($,Z,K,G,this.PERIOD_SEC)}static attoCirclesToAttoCrc($,J){let Q=J-this.INFLATION_DAY_ZERO_UNIX,Y=Q/this.PERIOD_SEC,G=Q%this.PERIOD_SEC,Z=this.v1InflateFactor(Y),K=this.v1InflateFactor(Y+1n),X=Z*(this.PERIOD_SEC-G)+K*G;return $*3n*this.V1_ACCURACY*this.PERIOD_SEC/X}static v1ToDemurrage($,J,Q,Y,G){let Z=J*(G-Y)+Q*Y;return $*3n*this.V1_ACCURACY*G/Z}}class A0{client;constructor($){this.client=$}async getTotalBalance($,J=!0){let Q=await this.client.call("circlesV2_getTotalBalance",[B($),J]);return i.circlesToAttoCircles(Q)}async getTokenBalances($){let Q=(await this.client.call("circles_getTokenBalances",[B($)])).map((Y)=>j0(Y));return v(Q)}}class K${client;constructor($){this.client=$}async getAvatarInfo($){let J=await this.getAvatarInfoBatch([$]);return J.length>0?J[0]:void 0}async getAvatarInfoBatch($){if($.length===0)return[];let J=$.map((Y)=>B(Y)),Q=await this.client.call("circles_getAvatarInfoBatch",[J]);return v(Q)}async getNetworkSnapshot(){let $=await this.client.call("circles_getNetworkSnapshot",[]);return v($)}}class X${client;constructor($){this.client=$}async getProfileByCid($){return this.client.call("circles_getProfileByCid",[$])}async getProfileByCidBatch($){return this.client.call("circles_getProfileByCidBatch",[$])}async getProfileByAddress($){return this.client.call("circles_getProfileByAddress",[B($)])}async getProfileByAddressBatch($){return this.client.call("circles_getProfileByAddressBatch",[$.map((J)=>J===null?null:B(J))])}async searchProfiles($,J=10,Q=0,Y){return this.client.call("circles_searchProfiles",[$.toLowerCase(),J,Q,Y])}async searchByAddressOrName($,J=10,Q=0,Y){let G=[],Z=/^0x[a-fA-F0-9]{40}$/.test($);if(Z)try{let K=await this.getProfileByAddress($);if(K){let X={...K,address:$};if(!Y||!X.avatarType||Y.includes(X.avatarType))G.push(X)}}catch(K){console.warn("Failed to get profile by address:",K)}try{let K=await this.searchProfiles($,J,Q,Y);if(Z&&G.length>0){let X=$.toLowerCase(),q=K.filter((M)=>M.address?.toLowerCase()!==X);G.push(...q)}else G.push(...K)}catch(K){console.warn("Failed to search profiles by text:",K)}return G.slice(0,J)}}class q${client;constructor($){this.client=$}async getTokenInfo($){let J=await this.getTokenInfoBatch([$]);return J.length>0?J[0]:void 0}async getTokenInfoBatch($){if($.length===0)return[];let J=$.map((G)=>B(G)),Y=(await this.client.call("circles_getTokenInfoBatch",[J])).map((G)=>j0(G));return v(Y)}getTokenHolders($,J=100,Q="DESC"){let Y=B($);return new Q0(this.client,{namespace:"V_CrcV2",table:"BalancesByAccountAndToken",columns:["account","tokenAddress","demurragedTotalBalance"],filter:[{Type:"FilterPredicate",FilterType:"Equals",Column:"tokenAddress",Value:Y}],cursorColumns:[{name:"demurragedTotalBalance",sortOrder:Q},{name:"account",sortOrder:"ASC"}],orderColumns:[{Column:"demurragedTotalBalance",SortOrder:Q},{Column:"account",SortOrder:"ASC"}],limit:J,sortOrder:Q},(G)=>({account:G.account,tokenAddress:G.tokenAddress,demurragedTotalBalance:G.demurragedTotalBalance}))}}class M${client;constructor($){this.client=$}transformQueryResponse($){let{columns:J,rows:Q}=$;return Q.map((Y)=>{let G={};return J.forEach((Z,K)=>{G[Z]=Y[K]}),G})}async getInvitedBy($){let J=B($),Q=await this.client.call("circles_query",[{Namespace:"CrcV2",Table:"RegisterHuman",Columns:["inviter"],Filter:[{Type:"FilterPredicate",FilterType:"Equals",Column:"avatar",Value:J}],Order:[{Column:"blockNumber",SortOrder:"DESC"}],Limit:1}]);if(Q.length>0)return v(Q[0].inviter);return}async getInvitations($){let J=B($),Q=96,Y=await this.client.call("circles_getAvatarInfoBatch",[[J]]);if((Y.length>0?Y[0]:void 0)?.version===2)return[];let Z=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:J}]}],Order:[]}]),X=this.transformQueryResponse(Z).map((j)=>j.truster);if(X.length===0)return[];let q=await this.client.call("circles_getAvatarInfoBatch",[X]),M=[];for(let j of q){if(!j?.isHuman)continue;let N=(await this.client.call("circles_getTokenBalances",[j.avatar])).find((D)=>B(D.tokenAddress)===B(j.avatar));if(N&&N.circles>=96)M.push(j)}return v(M)}async getInvitationsFrom($,J=!1){let Q=B($);if(J){let Y=await this.client.call("circles_query",[{Namespace:"CrcV2",Table:"RegisterHuman",Columns:["avatar"],Filter:[{Type:"FilterPredicate",FilterType:"Equals",Column:"inviter",Value:Q}],Order:[{Column:"blockNumber",SortOrder:"DESC"}]}]),Z=this.transformQueryResponse(Y).map((K)=>K.avatar);return v(Z)}else{let Y=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:Q}]}],Order:[]}]),Z=this.transformQueryResponse(Y).map((M)=>M.trustee);if(Z.length===0)return[];let K=await this.client.call("circles_getAvatarInfoBatch",[Z]),X=new Set(K.filter((M)=>M!==null).map((M)=>B(M.avatar))),q=Z.filter((M)=>!X.has(B(M)));return v(q)}}}function ZQ($,J){let Q=BigInt($),Y=i.attoCirclesToCircles(Q),G=i.attoCirclesToAttoCrc(Q,BigInt(J)),Z=i.attoCirclesToCircles(G),K=i.attoCirclesToAttoStaticCircles(Q,BigInt(J)),X=i.attoCirclesToCircles(K);return{attoCircles:Q,circles:Y,staticAttoCircles:K,staticCircles:X,attoCrc:G,crc:Z}}class j${client;constructor($){this.client=$}getTransactionHistory($,J=50,Q="DESC"){let Y=B($),G=[{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:Y},{Type:"FilterPredicate",FilterType:"Equals",Column:"to",Value:Y}]}]}];return new Q0(this.client,{namespace:"V_Crc",table:"TransferSummary",sortOrder:Q,columns:[],filter:G,limit:J},(Z)=>{let K=ZQ(Z.value,Z.timestamp),X={...Z,...K};return v(X)})}}class w0{client;constructor($){this.client=$}async findGroups($=50,J){let Q=this.getGroups($,J,"DESC"),Y=[];while(await Q.queryNextPage()){if(Y.push(...Q.currentPage.results),Y.length>=$)break;if(!Q.currentPage.hasMore)break}return Y.slice(0,$)}getGroupMemberships($,J=50,Q="DESC"){let Y=B($);return new Q0(this.client,{namespace:"V_CrcV2",table:"GroupMemberships",sortOrder:Q,columns:["blockNumber","timestamp","transactionIndex","logIndex","transactionHash","group","member","expiryTime"],filter:[{Type:"FilterPredicate",FilterType:"Equals",Column:"member",Value:Y}],limit:J},(G)=>v(G))}getGroupHolders($,J=100){let Q=B($);return new Q0(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:Q}],limit:J,rowTransformer:(Y)=>{let G={...Y,totalBalance:BigInt(Y.totalBalance),demurragedTotalBalance:BigInt(Y.demurragedTotalBalance)};return v(G)}})}getGroupMembers($,J=100,Q="DESC"){let Y=B($);return new Q0(this.client,{namespace:"V_CrcV2",table:"GroupMemberships",sortOrder:Q,columns:["blockNumber","timestamp","transactionIndex","logIndex","transactionHash","group","member","expiryTime"],filter:[{Type:"FilterPredicate",FilterType:"Equals",Column:"group",Value:Y}],limit:J},(G)=>v(G))}getGroups($=50,J,Q="DESC"){let Y=[];if(J){if(J.nameStartsWith)Y.push({Type:"FilterPredicate",FilterType:"Like",Column:"name",Value:J.nameStartsWith+"%"});if(J.symbolStartsWith)Y.push({Type:"FilterPredicate",FilterType:"Like",Column:"symbol",Value:J.symbolStartsWith+"%"});if(J.groupAddressIn&&J.groupAddressIn.length>0){let Z=J.groupAddressIn.map((K)=>({Type:"FilterPredicate",FilterType:"Equals",Column:"group",Value:B(K)}));if(Z.length===1)Y.push(Z[0]);else Y.push({Type:"Conjunction",ConjunctionType:"Or",Predicates:Z})}if(J.groupTypeIn&&J.groupTypeIn.length>0){let Z=J.groupTypeIn.map((K)=>({Type:"FilterPredicate",FilterType:"Equals",Column:"type",Value:K}));if(Z.length===1)Y.push(Z[0]);else Y.push({Type:"Conjunction",ConjunctionType:"Or",Predicates:Z})}if(J.ownerIn&&J.ownerIn.length>0){let Z=J.ownerIn.map((K)=>({Type:"FilterPredicate",FilterType:"Equals",Column:"owner",Value:B(K)}));if(Z.length===1)Y.push(Z[0]);else Y.push({Type:"Conjunction",ConjunctionType:"Or",Predicates:Z})}if(J.mintHandlerEquals)Y.push({Type:"FilterPredicate",FilterType:"Equals",Column:"mintHandler",Value:B(J.mintHandlerEquals)});if(J.treasuryEquals)Y.push({Type:"FilterPredicate",FilterType:"Equals",Column:"treasury",Value:B(J.treasuryEquals)})}let G=Y.length>1?[{Type:"Conjunction",ConjunctionType:"And",Predicates:Y}]:Y;return new Q0(this.client,{namespace:"V_CrcV2",table:"Groups",sortOrder:Q,columns:["blockNumber","timestamp","transactionIndex","logIndex","transactionHash","group","type","owner","mintPolicy","mintHandler","treasury","service","feeCollection","memberCount","name","symbol","cidV0Digest","erc20WrapperDemurraged","erc20WrapperStatic"],filter:G,limit:$},(Z)=>v(Z))}}class x${client;_pathfinder;_query;_trust;_balance;_avatar;_profile;_token;_invitation;_transaction;_group;constructor($="https://rpc.circlesubi.network/"){this.client=new R0($)}get pathfinder(){if(!this._pathfinder)this._pathfinder=new W0(this.client);return this._pathfinder}get query(){if(!this._query)this._query=new Z$(this.client);return this._query}get trust(){if(!this._trust)this._trust=new k0(this.client);return this._trust}get balance(){if(!this._balance)this._balance=new A0(this.client);return this._balance}get avatar(){if(!this._avatar)this._avatar=new K$(this.client);return this._avatar}get profile(){if(!this._profile)this._profile=new X$(this.client);return this._profile}get token(){if(!this._token)this._token=new q$(this.client);return this._token}get invitation(){if(!this._invitation)this._invitation=new M$(this.client);return this._invitation}get transaction(){if(!this._transaction)this._transaction=new j$(this.client);return this._transaction}get group(){if(!this._group)this._group=new w0(this.client);return this._group}setRpcUrl($){this.client.setRpcUrl($)}getRpcUrl(){return this.client.getRpcUrl()}}class G0{address;abi;rpcUrl;constructor($){this.address=$.address,this.abi=$.abi,this.rpcUrl=$.rpcUrl}async read($,J,Q){let Y=T$({abi:this.abi,functionName:$,args:J}),G={to:this.address,data:Y,...Q?.from&&{from:Q.from}},K=await(await fetch(this.rpcUrl,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",id:1,method:"eth_call",params:[G,"latest"]})})).json();if(K.error)throw Error(`RPC Error: ${K.error.message}`);if(!K.result)throw Error("No result returned from RPC call");return c$({abi:this.abi,functionName:$,data:K.result})}encodeWrite($,J){return T$({abi:this.abi,functionName:$,args:J})}}var oJ=[{type:"function",name:"operateFlowMatrix",inputs:[{name:"_flowVertices",type:"address[]"},{name:"_flow",type:"tuple[]",components:[{name:"streamSinkId",type:"uint16"},{name:"amount",type:"uint192"}]},{name:"_streams",type:"tuple[]",components:[{name:"sourceCoordinate",type:"uint16"},{name:"flowEdgeIds",type:"uint16[]"},{name:"data",type:"bytes"}]},{name:"_packedCoordinates",type:"bytes"}],outputs:[],stateMutability:"nonpayable"},{type:"function",name:"isApprovedForAll",inputs:[{name:"_account",type:"address"},{name:"_operator",type:"address"}],outputs:[{type:"bool"}],stateMutability:"view"},{type:"function",name:"setApprovalForAll",inputs:[{name:"_operator",type:"address"},{name:"_approved",type:"bool"}],outputs:[],stateMutability:"nonpayable"},{type:"function",name:"wrap",inputs:[{name:"_avatar",type:"address"},{name:"_amount",type:"uint256"},{name:"_type",type:"uint8"}],outputs:[{type:"address"}],stateMutability:"nonpayable"},{type:"function",name:"trust",inputs:[{name:"_trustReceiver",type:"address"},{name:"_expiry",type:"uint96"}],outputs:[],stateMutability:"nonpayable"},{type:"function",name:"isTrusted",inputs:[{name:"_truster",type:"address"},{name:"_trustee",type:"address"}],outputs:[{type:"bool"}],stateMutability:"view"},{type:"function",name:"toTokenId",inputs:[{name:"_avatar",type:"address"}],outputs:[{type:"uint256"}],stateMutability:"pure"},{type:"function",name:"safeTransferFrom",inputs:[{name:"_from",type:"address"},{name:"_to",type:"address"},{name:"_id",type:"uint256"},{name:"_value",type:"uint256"},{name:"_data",type:"bytes"}],outputs:[],stateMutability:"nonpayable"},{type:"function",name:"isHuman",inputs:[{name:"_human",type:"address"}],outputs:[{type:"bool"}],stateMutability:"view"},{type:"function",name:"safeBatchTransferFrom",inputs:[{name:"_from",type:"address"},{name:"_to",type:"address"},{name:"_ids",type:"uint256[]"},{name:"_values",type:"uint256[]"},{name:"_data",type:"bytes"}],outputs:[],stateMutability:"nonpayable"}];class B0 extends G0{constructor($){super({address:$.address,abi:oJ,rpcUrl:$.rpcUrl})}async isTrusted($,J){return this.read("isTrusted",[$,J])}async isApprovedForAll($,J){return this.read("isApprovedForAll",[$,J])}async toTokenId($){return this.read("toTokenId",[$])}trust($,J){return{to:this.address,data:this.encodeWrite("trust",[$,J]),value:0n}}setApprovalForAll($,J){return{to:this.address,data:this.encodeWrite("setApprovalForAll",[$,J]),value:0n}}wrap($,J,Q){return{to:this.address,data:this.encodeWrite("wrap",[$,J,Q]),value:0n}}safeTransferFrom($,J,Q,Y,G="0x"){return{to:this.address,data:this.encodeWrite("safeTransferFrom",[$,J,Q,Y,G]),value:0n}}operateFlowMatrix($,J,Q,Y){return{to:this.address,data:this.encodeWrite("operateFlowMatrix",[$,J,Q,Y]),value:0n}}async isHuman($){return this.read("isHuman",[$])}safeBatchTransferFrom($,J,Q,Y,G="0x"){return{to:this.address,data:this.encodeWrite("safeBatchTransferFrom",[$,J,Q,Y,G]),value:0n}}}var tJ=[{type:"function",name:"erc20Circles",inputs:[{name:"_circlesType",type:"uint8"},{name:"_avatar",type:"address"}],outputs:[{type:"address"}],stateMutability:"view"}];class E$ extends G0{constructor($){super({address:$.address,abi:tJ,rpcUrl:$.rpcUrl})}async erc20Circles($,J){return this.read("erc20Circles",[$,J])}}var i$=[{type:"function",name:"unwrap",inputs:[{name:"_amount",type:"uint256"}],outputs:[],stateMutability:"nonpayable"}];class d0 extends G0{constructor($){super({address:$.address,abi:i$,rpcUrl:$.rpcUrl})}unwrap($){return{to:this.address,data:this.encodeWrite("unwrap",[$]),value:0n}}}class i0 extends G0{constructor($){super({address:$.address,abi:i$,rpcUrl:$.rpcUrl})}unwrap($){return{to:this.address,data:this.encodeWrite("unwrap",[$]),value:0n}}}var n$=[{type:"function",name:"createAccount",inputs:[{name:"signer",type:"address"}],outputs:[{name:"account",type:"address"}],stateMutability:"nonpayable"},{type:"function",name:"createAccounts",inputs:[{name:"signers",type:"address[]"}],outputs:[{name:"_accounts",type:"address[]"}],stateMutability:"nonpayable"}];var o$=[{type:"function",name:"claimInvite",inputs:[],outputs:[{name:"id",type:"uint256"}],stateMutability:"nonpayable"},{type:"function",name:"claimInvites",inputs:[{name:"numberOfInvites",type:"uint256"}],outputs:[{name:"ids",type:"uint256[]"}],stateMutability:"nonpayable"},{type:"function",name:"inviterQuota",inputs:[{name:"",type:"address"}],outputs:[{type:"uint256"}],stateMutability:"view"},{type:"function",name:"INVITATION_FEE",inputs:[],outputs:[{type:"uint256"}],stateMutability:"view"},{type:"function",name:"invitationModule",inputs:[],outputs:[{type:"address"}],stateMutability:"view"}];class n0 extends G0{constructor($){super({address:$.address,abi:n$,rpcUrl:$.rpcUrl})}createAccount($){return{to:this.address,data:this.encodeWrite("createAccount",[$]),value:0n}}createAccounts($){return{to:this.address,data:this.encodeWrite("createAccounts",[$]),value:0n}}}class o0 extends G0{constructor($){super({address:$.address,abi:o$,rpcUrl:$.rpcUrl})}claimInvite(){return{to:this.address,data:this.encodeWrite("claimInvite",[]),value:0n}}claimInvites($){return{to:this.address,data:this.encodeWrite("claimInvites",[$]),value:0n}}async inviterQuota($){return this.read("inviterQuota",[$])}async invitationFee(){return this.read("INVITATION_FEE")}async invitationModule(){return this.read("invitationModule")}}class k$ extends Error{name;code;source;cause;context;constructor($,J,Q){super(J);if(this.name=$,this.code=Q?.code,this.source=Q?.source??"UNKNOWN",this.cause=Q?.cause,this.context=Q?.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 $=`[${this.source}] ${this.name}: ${this.message}`;if(this.code)$+=` (Code: ${this.code})`;if(this.context)$+=`
3
+ Context: ${JSON.stringify(this.context,null,2)}`;return $}}function KQ($,J,Q,Y){if(typeof $.setBigUint64==="function")return $.setBigUint64(J,Q,Y);let G=BigInt(32),Z=BigInt(4294967295),K=Number(Q>>G&Z),X=Number(Q&Z),q=Y?4:0,M=Y?0:4;$.setUint32(J+q,K,Y),$.setUint32(J+M,X,Y)}function aJ($,J,Q){return $&J^~$&Q}function sJ($,J,Q){return $&J^$&Q^J&Q}class t$ extends x0{constructor($,J,Q,Y){super();this.finished=!1,this.length=0,this.pos=0,this.destroyed=!1,this.blockLen=$,this.outputLen=J,this.padOffset=Q,this.isLE=Y,this.buffer=new Uint8Array($),this.view=P$(this.buffer)}update($){M0(this),$=_0($),K0($);let{view:J,buffer:Q,blockLen:Y}=this,G=$.length;for(let Z=0;Z<G;){let K=Math.min(Y-this.pos,G-Z);if(K===Y){let X=P$($);for(;Y<=G-Z;Z+=Y)this.process(X,Z);continue}if(Q.set($.subarray(Z,Z+K),this.pos),this.pos+=K,Z+=K,this.pos===Y)this.process(J,0),this.pos=0}return this.length+=$.length,this.roundClean(),this}digestInto($){M0(this),C$($,this),this.finished=!0;let{buffer:J,view:Q,blockLen:Y,isLE:G}=this,{pos:Z}=this;if(J[Z++]=128,X0(this.buffer.subarray(Z)),this.padOffset>Y-Z)this.process(Q,0),Z=0;for(let j=Z;j<Y;j++)J[j]=0;KQ(Q,Y-8,BigInt(this.length*8),G),this.process(Q,0);let K=P$($),X=this.outputLen;if(X%4)throw Error("_sha2: outputLen should be aligned to 32bit");let q=X/4,M=this.get();if(q>M.length)throw Error("_sha2: outputLen bigger than state");for(let j=0;j<q;j++)K.setUint32(4*j,M[j],G)}digest(){let{buffer:$,outputLen:J}=this;this.digestInto($);let Q=$.slice(0,J);return this.destroy(),Q}_cloneInto($){$||($=new this.constructor),$.set(...this.get());let{blockLen:J,buffer:Q,length:Y,finished:G,destroyed:Z,pos:K}=this;if($.destroyed=Z,$.finished=G,$.length=Y,$.pos=K,Y%J)$.buffer.set(Q);return $}clone(){return this._cloneInto()}}var U0=Uint32Array.from([1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225]);var XQ=Uint32Array.from([1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298]),L0=new Uint32Array(64);class rJ extends t${constructor($=32){super(64,$,8,!1);this.A=U0[0]|0,this.B=U0[1]|0,this.C=U0[2]|0,this.D=U0[3]|0,this.E=U0[4]|0,this.F=U0[5]|0,this.G=U0[6]|0,this.H=U0[7]|0}get(){let{A:$,B:J,C:Q,D:Y,E:G,F:Z,G:K,H:X}=this;return[$,J,Q,Y,G,Z,K,X]}set($,J,Q,Y,G,Z,K,X){this.A=$|0,this.B=J|0,this.C=Q|0,this.D=Y|0,this.E=G|0,this.F=Z|0,this.G=K|0,this.H=X|0}process($,J){for(let j=0;j<16;j++,J+=4)L0[j]=$.getUint32(J,!1);for(let j=16;j<64;j++){let z=L0[j-15],N=L0[j-2],D=Z0(z,7)^Z0(z,18)^z>>>3,P=Z0(N,17)^Z0(N,19)^N>>>10;L0[j]=P+L0[j-7]+D+L0[j-16]|0}let{A:Q,B:Y,C:G,D:Z,E:K,F:X,G:q,H:M}=this;for(let j=0;j<64;j++){let z=Z0(K,6)^Z0(K,11)^Z0(K,25),N=M+z+aJ(K,X,q)+XQ[j]+L0[j]|0,P=(Z0(Q,2)^Z0(Q,13)^Z0(Q,22))+sJ(Q,Y,G)|0;M=q,q=X,X=K,K=Z+N|0,Z=G,G=Y,Y=Q,Q=N+P|0}Q=Q+this.A|0,Y=Y+this.B|0,G=G+this.C|0,Z=Z+this.D|0,K=K+this.E|0,X=X+this.F|0,q=q+this.G|0,M=M+this.H|0,this.set(Q,Y,G,Z,K,X,q,M)}roundClean(){X0(L0)}destroy(){this.set(0,0,0,0,0,0,0,0),X0(this.buffer)}}var eJ=B$(()=>new rJ);class a$ extends x0{constructor($,J){super();this.finished=!1,this.destroyed=!1,FJ($);let Q=_0(J);if(this.iHash=$.create(),typeof this.iHash.update!=="function")throw Error("Expected instance of class which extends utils.Hash");this.blockLen=this.iHash.blockLen,this.outputLen=this.iHash.outputLen;let Y=this.blockLen,G=new Uint8Array(Y);G.set(Q.length>Y?$.create().update(Q).digest():Q);for(let Z=0;Z<G.length;Z++)G[Z]^=54;this.iHash.update(G),this.oHash=$.create();for(let Z=0;Z<G.length;Z++)G[Z]^=106;this.oHash.update(G),X0(G)}update($){return M0(this),this.iHash.update($),this}digestInto($){M0(this),K0($,this.outputLen),this.finished=!0,this.iHash.digestInto($),this.oHash.update($),this.oHash.digestInto($),this.destroy()}digest(){let $=new Uint8Array(this.oHash.outputLen);return this.digestInto($),$}_cloneInto($){$||($=Object.create(Object.getPrototypeOf(this),{}));let{oHash:J,iHash:Q,finished:Y,destroyed:G,blockLen:Z,outputLen:K}=this;return $=$,$.finished=Y,$.destroyed=G,$.blockLen=Z,$.outputLen=K,$.oHash=J._cloneInto($.oHash),$.iHash=Q._cloneInto($.iHash),$}clone(){return this._cloneInto()}destroy(){this.destroyed=!0,this.oHash.destroy(),this.iHash.destroy()}}var s$=($,J,Q)=>new a$($,J).update(Q).digest();s$.create=($,J)=>new a$($,J);/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */var JJ=BigInt(0),$J=BigInt(1);function t0($){return $ instanceof Uint8Array||ArrayBuffer.isView($)&&$.constructor.name==="Uint8Array"}function QJ($){if(!t0($))throw Error("Uint8Array expected")}function a0($,J){if(typeof J!=="boolean")throw Error($+" boolean expected, got "+J)}function W$($){let J=$.toString(16);return J.length&1?"0"+J:J}function Q8($){if(typeof $!=="string")throw Error("hex string expected, got "+typeof $);return $===""?JJ:BigInt("0x"+$)}var Y8=typeof Uint8Array.from([]).toHex==="function"&&typeof Uint8Array.fromHex==="function",qQ=Array.from({length:256},($,J)=>J.toString(16).padStart(2,"0"));function s0($){if(QJ($),Y8)return $.toHex();let J="";for(let Q=0;Q<$.length;Q++)J+=qQ[$[Q]];return J}var z0={_0:48,_9:57,A:65,F:70,a:97,f:102};function $8($){if($>=z0._0&&$<=z0._9)return $-z0._0;if($>=z0.A&&$<=z0.F)return $-(z0.A-10);if($>=z0.a&&$<=z0.f)return $-(z0.a-10);return}function U$($){if(typeof $!=="string")throw Error("hex string expected, got "+typeof $);if(Y8)return Uint8Array.fromHex($);let J=$.length,Q=J/2;if(J%2)throw Error("hex string expected, got unpadded hex of length "+J);let Y=new Uint8Array(Q);for(let G=0,Z=0;G<Q;G++,Z+=2){let K=$8($.charCodeAt(Z)),X=$8($.charCodeAt(Z+1));if(K===void 0||X===void 0){let q=$[Z]+$[Z+1];throw Error('hex string expected, got non-hex character "'+q+'" at index '+Z)}Y[G]=K*16+X}return Y}function N0($){return Q8(s0($))}function YJ($){return QJ($),Q8(s0(Uint8Array.from($).reverse()))}function y0($,J){return U$($.toString(16).padStart(J*2,"0"))}function GJ($,J){return y0($,J).reverse()}function $0($,J,Q){let Y;if(typeof J==="string")try{Y=U$(J)}catch(Z){throw Error($+" must be hex string or Uint8Array, cause: "+Z)}else if(t0(J))Y=Uint8Array.from(J);else throw Error($+" must be hex string or Uint8Array");let G=Y.length;if(typeof Q==="number"&&G!==Q)throw Error($+" of length "+Q+" expected, got "+G);return Y}function z$(...$){let J=0;for(let Y=0;Y<$.length;Y++){let G=$[Y];QJ(G),J+=G.length}let Q=new Uint8Array(J);for(let Y=0,G=0;Y<$.length;Y++){let Z=$[Y];Q.set(Z,G),G+=Z.length}return Q}var r$=($)=>typeof $==="bigint"&&JJ<=$;function A$($,J,Q){return r$($)&&r$(J)&&r$(Q)&&J<=$&&$<Q}function b0($,J,Q,Y){if(!A$(J,Q,Y))throw Error("expected valid "+$+": "+Q+" <= n < "+Y+", got "+J)}function G8($){let J;for(J=0;$>JJ;$>>=$J,J+=1);return J}var F0=($)=>($J<<BigInt($))-$J,e$=($)=>new Uint8Array($),J8=($)=>Uint8Array.from($);function Z8($,J,Q){if(typeof $!=="number"||$<2)throw Error("hashLen must be a number");if(typeof J!=="number"||J<2)throw Error("qByteLen must be a number");if(typeof Q!=="function")throw Error("hmacFn must be a function");let Y=e$($),G=e$($),Z=0,K=()=>{Y.fill(1),G.fill(0),Z=0},X=(...z)=>Q(G,Y,...z),q=(z=e$(0))=>{if(G=X(J8([0]),z),Y=X(),z.length===0)return;G=X(J8([1]),z),Y=X()},M=()=>{if(Z++>=1000)throw Error("drbg: tried 1000 values");let z=0,N=[];while(z<J){Y=X();let D=Y.slice();N.push(D),z+=Y.length}return z$(...N)};return(z,N)=>{K(),q(z);let D=void 0;while(!(D=N(M())))q();return K(),D}}var MQ={bigint:($)=>typeof $==="bigint",function:($)=>typeof $==="function",boolean:($)=>typeof $==="boolean",string:($)=>typeof $==="string",stringOrUint8Array:($)=>typeof $==="string"||t0($),isSafeInteger:($)=>Number.isSafeInteger($),array:($)=>Array.isArray($),field:($,J)=>J.Fp.isValid($),hash:($)=>typeof $==="function"&&Number.isSafeInteger($.outputLen)};function g0($,J,Q={}){let Y=(G,Z,K)=>{let X=MQ[Z];if(typeof X!=="function")throw Error("invalid validator function");let q=$[G];if(K&&q===void 0)return;if(!X(q,$))throw Error("param "+String(G)+" is invalid. Expected "+Z+", got "+q)};for(let[G,Z]of Object.entries(J))Y(G,Z,!1);for(let[G,Z]of Object.entries(Q))Y(G,Z,!0);return $}function ZJ($){let J=new WeakMap;return(Q,...Y)=>{let G=J.get(Q);if(G!==void 0)return G;let Z=$(Q,...Y);return J.set(Q,Z),Z}}/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */var s=BigInt(0),o=BigInt(1),f0=BigInt(2),jQ=BigInt(3),X8=BigInt(4),q8=BigInt(5),M8=BigInt(8);function n($,J){let Q=$%J;return Q>=s?Q:J+Q}function Y0($,J,Q){let Y=$;while(J-- >s)Y*=Y,Y%=Q;return Y}function w$($,J){if($===s)throw Error("invert: expected non-zero number");if(J<=s)throw Error("invert: expected positive modulus, got "+J);let Q=n($,J),Y=J,G=s,Z=o,K=o,X=s;while(Q!==s){let M=Y/Q,j=Y%Q,z=G-K*M,N=Z-X*M;Y=Q,Q=j,G=K,Z=X,K=z,X=N}if(Y!==o)throw Error("invert: does not exist");return n(G,J)}function j8($,J){let Q=($.ORDER+o)/X8,Y=$.pow(J,Q);if(!$.eql($.sqr(Y),J))throw Error("Cannot find square root");return Y}function WQ($,J){let Q=($.ORDER-q8)/M8,Y=$.mul(J,f0),G=$.pow(Y,Q),Z=$.mul(J,G),K=$.mul($.mul(Z,f0),G),X=$.mul(Z,$.sub(K,$.ONE));if(!$.eql($.sqr(X),J))throw Error("Cannot find square root");return X}function UQ($){if($<BigInt(3))throw Error("sqrt is not defined for small field");let J=$-o,Q=0;while(J%f0===s)J/=f0,Q++;let Y=f0,G=N$($);while(K8(G,Y)===1)if(Y++>1000)throw Error("Cannot find square root: probably non-prime P");if(Q===1)return j8;let Z=G.pow(Y,J),K=(J+o)/f0;return function(q,M){if(q.is0(M))return M;if(K8(q,M)!==1)throw Error("Cannot find square root");let j=Q,z=q.mul(q.ONE,Z),N=q.pow(M,J),D=q.pow(M,K);while(!q.eql(N,q.ONE)){if(q.is0(N))return q.ZERO;let P=1,V=q.sqr(N);while(!q.eql(V,q.ONE))if(P++,V=q.sqr(V),P===j)throw Error("Cannot find square root");let y=o<<BigInt(j-P-1),_=q.pow(z,y);j=P,z=q.sqr(_),N=q.mul(N,z),D=q.mul(D,_)}return D}}function zQ($){if($%X8===jQ)return j8;if($%M8===q8)return WQ;return UQ($)}var NQ=["create","isValid","is0","neg","inv","sqrt","sqr","eql","add","sub","mul","pow","div","addN","subN","mulN","sqrN"];function KJ($){let J={ORDER:"bigint",MASK:"bigint",BYTES:"isSafeInteger",BITS:"isSafeInteger"},Q=NQ.reduce((Y,G)=>{return Y[G]="function",Y},J);return g0($,Q)}function DQ($,J,Q){if(Q<s)throw Error("invalid exponent, negatives unsupported");if(Q===s)return $.ONE;if(Q===o)return J;let Y=$.ONE,G=J;while(Q>s){if(Q&o)Y=$.mul(Y,G);G=$.sqr(G),Q>>=o}return Y}function XJ($,J,Q=!1){let Y=Array(J.length).fill(Q?$.ZERO:void 0),G=J.reduce((K,X,q)=>{if($.is0(X))return K;return Y[q]=K,$.mul(K,X)},$.ONE),Z=$.inv(G);return J.reduceRight((K,X,q)=>{if($.is0(X))return K;return Y[q]=$.mul(K,Y[q]),$.mul(K,X)},Z),Y}function K8($,J){let Q=($.ORDER-o)/f0,Y=$.pow(J,Q),G=$.eql(Y,$.ONE),Z=$.eql(Y,$.ZERO),K=$.eql(Y,$.neg($.ONE));if(!G&&!Z&&!K)throw Error("invalid Legendre symbol result");return G?1:Z?0:-1}function qJ($,J){if(J!==void 0)T0(J);let Q=J!==void 0?J:$.toString(2).length,Y=Math.ceil(Q/8);return{nBitLength:Q,nByteLength:Y}}function N$($,J,Q=!1,Y={}){if($<=s)throw Error("invalid field: expected ORDER > 0, got "+$);let{nBitLength:G,nByteLength:Z}=qJ($,J);if(Z>2048)throw Error("invalid field: expected ORDER of <= 2048 bytes");let K,X=Object.freeze({ORDER:$,isLE:Q,BITS:G,BYTES:Z,MASK:F0(G),ZERO:s,ONE:o,create:(q)=>n(q,$),isValid:(q)=>{if(typeof q!=="bigint")throw Error("invalid field element: expected bigint, got "+typeof q);return s<=q&&q<$},is0:(q)=>q===s,isOdd:(q)=>(q&o)===o,neg:(q)=>n(-q,$),eql:(q,M)=>q===M,sqr:(q)=>n(q*q,$),add:(q,M)=>n(q+M,$),sub:(q,M)=>n(q-M,$),mul:(q,M)=>n(q*M,$),pow:(q,M)=>DQ(X,q,M),div:(q,M)=>n(q*w$(M,$),$),sqrN:(q)=>q*q,addN:(q,M)=>q+M,subN:(q,M)=>q-M,mulN:(q,M)=>q*M,inv:(q)=>w$(q,$),sqrt:Y.sqrt||((q)=>{if(!K)K=zQ($);return K(X,q)}),toBytes:(q)=>Q?GJ(q,Z):y0(q,Z),fromBytes:(q)=>{if(q.length!==Z)throw Error("Field.fromBytes: expected "+Z+" bytes, got "+q.length);return Q?YJ(q):N0(q)},invertBatch:(q)=>XJ(X,q),cmov:(q,M,j)=>j?M:q});return Object.freeze(X)}function W8($){if(typeof $!=="bigint")throw Error("field order must be bigint");let J=$.toString(2).length;return Math.ceil(J/8)}function MJ($){let J=W8($);return J+Math.ceil(J/2)}function U8($,J,Q=!1){let Y=$.length,G=W8(J),Z=MJ(J);if(Y<16||Y<Z||Y>1024)throw Error("expected "+Z+"-1024 bytes of input, got "+Y);let K=Q?YJ($):N0($),X=n(K,J-o)+o;return Q?GJ(X,G):y0(X,G)}/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */var z8=BigInt(0),NJ=BigInt(1);function jJ($,J){let Q=J.negate();return $?Q:J}function D8($,J){if(!Number.isSafeInteger($)||$<=0||$>J)throw Error("invalid window size, expected [1.."+J+"], got W="+$)}function WJ($,J){D8($,J);let Q=Math.ceil(J/$)+1,Y=2**($-1),G=2**$,Z=F0($),K=BigInt($);return{windows:Q,windowSize:Y,mask:Z,maxNumber:G,shiftBy:K}}function N8($,J,Q){let{windowSize:Y,mask:G,maxNumber:Z,shiftBy:K}=Q,X=Number($&G),q=$>>K;if(X>Y)X-=Z,q+=NJ;let M=J*Y,j=M+Math.abs(X)-1,z=X===0,N=X<0,D=J%2!==0;return{nextN:q,offset:j,isZero:z,isNeg:N,isNegF:D,offsetF:M}}function VQ($,J){if(!Array.isArray($))throw Error("array expected");$.forEach((Q,Y)=>{if(!(Q instanceof J))throw Error("invalid point at index "+Y)})}function OQ($,J){if(!Array.isArray($))throw Error("array of scalars expected");$.forEach((Q,Y)=>{if(!J.isValid(Q))throw Error("invalid scalar at index "+Y)})}var UJ=new WeakMap,V8=new WeakMap;function zJ($){return V8.get($)||1}function O8($,J){return{constTimeNegate:jJ,hasPrecomputes(Q){return zJ(Q)!==1},unsafeLadder(Q,Y,G=$.ZERO){let Z=Q;while(Y>z8){if(Y&NJ)G=G.add(Z);Z=Z.double(),Y>>=NJ}return G},precomputeWindow(Q,Y){let{windows:G,windowSize:Z}=WJ(Y,J),K=[],X=Q,q=X;for(let M=0;M<G;M++){q=X,K.push(q);for(let j=1;j<Z;j++)q=q.add(X),K.push(q);X=q.double()}return K},wNAF(Q,Y,G){let{ZERO:Z,BASE:K}=$,X=WJ(Q,J);for(let q=0;q<X.windows;q++){let{nextN:M,offset:j,isZero:z,isNeg:N,isNegF:D,offsetF:P}=N8(G,q,X);if(G=M,z)K=K.add(jJ(D,Y[P]));else Z=Z.add(jJ(N,Y[j]))}return{p:Z,f:K}},wNAFUnsafe(Q,Y,G,Z=$.ZERO){let K=WJ(Q,J);for(let X=0;X<K.windows;X++){if(G===z8)break;let{nextN:q,offset:M,isZero:j,isNeg:z}=N8(G,X,K);if(G=q,j)continue;else{let N=Y[M];Z=Z.add(z?N.negate():N)}}return Z},getPrecomputes(Q,Y,G){let Z=UJ.get(Y);if(!Z){if(Z=this.precomputeWindow(Y,Q),Q!==1)UJ.set(Y,G(Z))}return Z},wNAFCached(Q,Y,G){let Z=zJ(Q);return this.wNAF(Z,this.getPrecomputes(Z,Q,G),Y)},wNAFCachedUnsafe(Q,Y,G,Z){let K=zJ(Q);if(K===1)return this.unsafeLadder(Q,Y,Z);return this.wNAFUnsafe(K,this.getPrecomputes(K,Q,G),Y,Z)},setWindowSize(Q,Y){D8(Y,J),V8.set(Q,Y),UJ.delete(Q)}}}function R8($,J,Q,Y){VQ(Q,$),OQ(Y,J);let G=Q.length,Z=Y.length;if(G!==Z)throw Error("arrays of points and scalars must have equal length");let K=$.ZERO,X=G8(BigInt(G)),q=1;if(X>12)q=X-3;else if(X>4)q=X-2;else if(X>0)q=2;let M=F0(q),j=Array(Number(M)+1).fill(K),z=Math.floor((J.BITS-1)/q)*q,N=K;for(let D=z;D>=0;D-=q){j.fill(K);for(let V=0;V<Z;V++){let y=Y[V],_=Number(y>>BigInt(D)&M);j[_]=j[_].add(Q[V])}let P=K;for(let V=j.length-1,y=K;V>0;V--)y=y.add(j[V]),P=P.add(y);if(N=N.add(P),D!==0)for(let V=0;V<q;V++)N=N.double()}return N}function DJ($){return KJ($.Fp),g0($,{n:"bigint",h:"bigint",Gx:"field",Gy:"field"},{nBitLength:"isSafeInteger",nByteLength:"isSafeInteger"}),Object.freeze({...qJ($.n,$.nBitLength),...$,...{p:$.Fp.ORDER}})}/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */function C8($){if($.lowS!==void 0)a0("lowS",$.lowS);if($.prehash!==void 0)a0("prehash",$.prehash)}function RQ($){let J=DJ($);g0(J,{a:"field",b:"field"},{allowInfinityPoint:"boolean",allowedPrivateKeyLengths:"array",clearCofactor:"function",fromBytes:"function",isTorsionFree:"function",toBytes:"function",wrapPrivateKey:"boolean"});let{endo:Q,Fp:Y,a:G}=J;if(Q){if(!Y.eql(G,Y.ZERO))throw Error("invalid endo: CURVE.a must be 0");if(typeof Q!=="object"||typeof Q.beta!=="bigint"||typeof Q.splitScalar!=="function")throw Error('invalid endo: expected "beta": bigint and "splitScalar": function')}return Object.freeze({...J})}class P8 extends Error{constructor($=""){super($)}}var D0={Err:P8,_tlv:{encode:($,J)=>{let{Err:Q}=D0;if($<0||$>256)throw new Q("tlv.encode: wrong tag");if(J.length&1)throw new Q("tlv.encode: unpadded data");let Y=J.length/2,G=W$(Y);if(G.length/2&128)throw new Q("tlv.encode: long form length too big");let Z=Y>127?W$(G.length/2|128):"";return W$($)+Z+G+J},decode($,J){let{Err:Q}=D0,Y=0;if($<0||$>256)throw new Q("tlv.encode: wrong tag");if(J.length<2||J[Y++]!==$)throw new Q("tlv.decode: wrong tlv");let G=J[Y++],Z=!!(G&128),K=0;if(!Z)K=G;else{let q=G&127;if(!q)throw new Q("tlv.decode(long): indefinite length not supported");if(q>4)throw new Q("tlv.decode(long): byte length is too big");let M=J.subarray(Y,Y+q);if(M.length!==q)throw new Q("tlv.decode: length bytes not complete");if(M[0]===0)throw new Q("tlv.decode(long): zero leftmost byte");for(let j of M)K=K<<8|j;if(Y+=q,K<128)throw new Q("tlv.decode(long): not minimal encoding")}let X=J.subarray(Y,Y+K);if(X.length!==K)throw new Q("tlv.decode: wrong value length");return{v:X,l:J.subarray(Y+K)}}},_int:{encode($){let{Err:J}=D0;if($<V0)throw new J("integer: negative integers are not allowed");let Q=W$($);if(Number.parseInt(Q[0],16)&8)Q="00"+Q;if(Q.length&1)throw new J("unexpected DER parsing assertion: unpadded hex");return Q},decode($){let{Err:J}=D0;if($[0]&128)throw new J("invalid signature integer: negative");if($[0]===0&&!($[1]&128))throw new J("invalid signature integer: unnecessary leading zero");return N0($)}},toSig($){let{Err:J,_int:Q,_tlv:Y}=D0,G=$0("signature",$),{v:Z,l:K}=Y.decode(48,G);if(K.length)throw new J("invalid signature: left bytes after parsing");let{v:X,l:q}=Y.decode(2,Z),{v:M,l:j}=Y.decode(2,q);if(j.length)throw new J("invalid signature: left bytes after parsing");return{r:Q.decode(X),s:Q.decode(M)}},hexFromSig($){let{_tlv:J,_int:Q}=D0,Y=J.encode(2,Q.encode($.r)),G=J.encode(2,Q.encode($.s)),Z=Y+G;return J.encode(48,Z)}};function VJ($,J){return s0(y0($,J))}var V0=BigInt(0),d=BigInt(1),MG=BigInt(2),OJ=BigInt(3),CQ=BigInt(4);function PQ($){let J=RQ($),{Fp:Q}=J,Y=N$(J.n,J.nBitLength),G=J.toBytes||((W,O,L)=>{let S=O.toAffine();return z$(Uint8Array.from([4]),Q.toBytes(S.x),Q.toBytes(S.y))}),Z=J.fromBytes||((W)=>{let O=W.subarray(1),L=Q.fromBytes(O.subarray(0,Q.BYTES)),S=Q.fromBytes(O.subarray(Q.BYTES,2*Q.BYTES));return{x:L,y:S}});function K(W){let{a:O,b:L}=J,S=Q.sqr(W),w=Q.mul(S,W);return Q.add(Q.add(w,Q.mul(W,O)),L)}function X(W,O){let L=Q.sqr(O),S=K(W);return Q.eql(L,S)}if(!X(J.Gx,J.Gy))throw Error("bad curve params: generator point");let q=Q.mul(Q.pow(J.a,OJ),CQ),M=Q.mul(Q.sqr(J.b),BigInt(27));if(Q.is0(Q.add(q,M)))throw Error("bad curve params: a or b");function j(W){return A$(W,d,J.n)}function z(W){let{allowedPrivateKeyLengths:O,nByteLength:L,wrapPrivateKey:S,n:w}=J;if(O&&typeof W!=="bigint"){if(t0(W))W=s0(W);if(typeof W!=="string"||!O.includes(W.length))throw Error("invalid private key");W=W.padStart(L*2,"0")}let E;try{E=typeof W==="bigint"?W:N0($0("private key",W,L))}catch(b){throw Error("invalid private key, expected hex or "+L+" bytes, got "+typeof W)}if(S)E=n(E,w);return b0("private key",E,d,w),E}function N(W){if(!(W instanceof V))throw Error("ProjectivePoint expected")}let D=ZJ((W,O)=>{let{px:L,py:S,pz:w}=W;if(Q.eql(w,Q.ONE))return{x:L,y:S};let E=W.is0();if(O==null)O=E?Q.ONE:Q.inv(w);let b=Q.mul(L,O),x=Q.mul(S,O),A=Q.mul(w,O);if(E)return{x:Q.ZERO,y:Q.ZERO};if(!Q.eql(A,Q.ONE))throw Error("invZ was invalid");return{x:b,y:x}}),P=ZJ((W)=>{if(W.is0()){if(J.allowInfinityPoint&&!Q.is0(W.py))return;throw Error("bad point: ZERO")}let{x:O,y:L}=W.toAffine();if(!Q.isValid(O)||!Q.isValid(L))throw Error("bad point: x or y not FE");if(!X(O,L))throw Error("bad point: equation left != right");if(!W.isTorsionFree())throw Error("bad point: not in prime-order subgroup");return!0});class V{constructor(W,O,L){if(W==null||!Q.isValid(W))throw Error("x required");if(O==null||!Q.isValid(O)||Q.is0(O))throw Error("y required");if(L==null||!Q.isValid(L))throw Error("z required");this.px=W,this.py=O,this.pz=L,Object.freeze(this)}static fromAffine(W){let{x:O,y:L}=W||{};if(!W||!Q.isValid(O)||!Q.isValid(L))throw Error("invalid affine point");if(W instanceof V)throw Error("projective point not allowed");let S=(w)=>Q.eql(w,Q.ZERO);if(S(O)&&S(L))return V.ZERO;return new V(O,L,Q.ONE)}get x(){return this.toAffine().x}get y(){return this.toAffine().y}static normalizeZ(W){let O=XJ(Q,W.map((L)=>L.pz));return W.map((L,S)=>L.toAffine(O[S])).map(V.fromAffine)}static fromHex(W){let O=V.fromAffine(Z($0("pointHex",W)));return O.assertValidity(),O}static fromPrivateKey(W){return V.BASE.multiply(z(W))}static msm(W,O){return R8(V,Y,W,O)}_setWindowSize(W){H.setWindowSize(this,W)}assertValidity(){P(this)}hasEvenY(){let{y:W}=this.toAffine();if(Q.isOdd)return!Q.isOdd(W);throw Error("Field doesn't support isOdd")}equals(W){N(W);let{px:O,py:L,pz:S}=this,{px:w,py:E,pz:b}=W,x=Q.eql(Q.mul(O,b),Q.mul(w,S)),A=Q.eql(Q.mul(L,b),Q.mul(E,S));return x&&A}negate(){return new V(this.px,Q.neg(this.py),this.pz)}double(){let{a:W,b:O}=J,L=Q.mul(O,OJ),{px:S,py:w,pz:E}=this,b=Q.ZERO,x=Q.ZERO,A=Q.ZERO,k=Q.mul(S,S),c=Q.mul(w,w),h=Q.mul(E,E),U=Q.mul(S,w);return U=Q.add(U,U),A=Q.mul(S,E),A=Q.add(A,A),b=Q.mul(W,A),x=Q.mul(L,h),x=Q.add(b,x),b=Q.sub(c,x),x=Q.add(c,x),x=Q.mul(b,x),b=Q.mul(U,b),A=Q.mul(L,A),h=Q.mul(W,h),U=Q.sub(k,h),U=Q.mul(W,U),U=Q.add(U,A),A=Q.add(k,k),k=Q.add(A,k),k=Q.add(k,h),k=Q.mul(k,U),x=Q.add(x,k),h=Q.mul(w,E),h=Q.add(h,h),k=Q.mul(h,U),b=Q.sub(b,k),A=Q.mul(h,c),A=Q.add(A,A),A=Q.add(A,A),new V(b,x,A)}add(W){N(W);let{px:O,py:L,pz:S}=this,{px:w,py:E,pz:b}=W,x=Q.ZERO,A=Q.ZERO,k=Q.ZERO,c=J.a,h=Q.mul(J.b,OJ),U=Q.mul(O,w),C=Q.mul(L,E),I=Q.mul(S,b),F=Q.add(O,L),T=Q.add(w,E);F=Q.mul(F,T),T=Q.add(U,C),F=Q.sub(F,T),T=Q.add(O,S);let R=Q.add(w,b);return T=Q.mul(T,R),R=Q.add(U,I),T=Q.sub(T,R),R=Q.add(L,S),x=Q.add(E,b),R=Q.mul(R,x),x=Q.add(C,I),R=Q.sub(R,x),k=Q.mul(c,T),x=Q.mul(h,I),k=Q.add(x,k),x=Q.sub(C,k),k=Q.add(C,k),A=Q.mul(x,k),C=Q.add(U,U),C=Q.add(C,U),I=Q.mul(c,I),T=Q.mul(h,T),C=Q.add(C,I),I=Q.sub(U,I),I=Q.mul(c,I),T=Q.add(T,I),U=Q.mul(C,T),A=Q.add(A,U),U=Q.mul(R,T),x=Q.mul(F,x),x=Q.sub(x,U),U=Q.mul(F,C),k=Q.mul(R,k),k=Q.add(k,U),new V(x,A,k)}subtract(W){return this.add(W.negate())}is0(){return this.equals(V.ZERO)}wNAF(W){return H.wNAFCached(this,W,V.normalizeZ)}multiplyUnsafe(W){let{endo:O,n:L}=J;b0("scalar",W,V0,L);let S=V.ZERO;if(W===V0)return S;if(this.is0()||W===d)return this;if(!O||H.hasPrecomputes(this))return H.wNAFCachedUnsafe(this,W,V.normalizeZ);let{k1neg:w,k1:E,k2neg:b,k2:x}=O.splitScalar(W),A=S,k=S,c=this;while(E>V0||x>V0){if(E&d)A=A.add(c);if(x&d)k=k.add(c);c=c.double(),E>>=d,x>>=d}if(w)A=A.negate();if(b)k=k.negate();return k=new V(Q.mul(k.px,O.beta),k.py,k.pz),A.add(k)}multiply(W){let{endo:O,n:L}=J;b0("scalar",W,d,L);let S,w;if(O){let{k1neg:E,k1:b,k2neg:x,k2:A}=O.splitScalar(W),{p:k,f:c}=this.wNAF(b),{p:h,f:U}=this.wNAF(A);k=H.constTimeNegate(E,k),h=H.constTimeNegate(x,h),h=new V(Q.mul(h.px,O.beta),h.py,h.pz),S=k.add(h),w=c.add(U)}else{let{p:E,f:b}=this.wNAF(W);S=E,w=b}return V.normalizeZ([S,w])[0]}multiplyAndAddUnsafe(W,O,L){let S=V.BASE,w=(b,x)=>x===V0||x===d||!b.equals(S)?b.multiplyUnsafe(x):b.multiply(x),E=w(this,O).add(w(W,L));return E.is0()?void 0:E}toAffine(W){return D(this,W)}isTorsionFree(){let{h:W,isTorsionFree:O}=J;if(W===d)return!0;if(O)return O(V,this);throw Error("isTorsionFree() has not been declared for the elliptic curve")}clearCofactor(){let{h:W,clearCofactor:O}=J;if(W===d)return this;if(O)return O(V,this);return this.multiplyUnsafe(J.h)}toRawBytes(W=!0){return a0("isCompressed",W),this.assertValidity(),G(V,this,W)}toHex(W=!0){return a0("isCompressed",W),s0(this.toRawBytes(W))}}V.BASE=new V(J.Gx,J.Gy,Q.ONE),V.ZERO=new V(Q.ZERO,Q.ONE,Q.ZERO);let{endo:y,nBitLength:_}=J,H=O8(V,y?Math.ceil(_/2):_);return{CURVE:J,ProjectivePoint:V,normPrivateKeyToScalar:z,weierstrassEquation:K,isWithinCurveOrder:j}}function BQ($){let J=DJ($);return g0(J,{hash:"hash",hmac:"function",randomBytes:"function"},{bits2int:"function",bits2int_modN:"function",lowS:"boolean"}),Object.freeze({lowS:!0,...J})}function B8($){let J=BQ($),{Fp:Q,n:Y,nByteLength:G,nBitLength:Z}=J,K=Q.BYTES+1,X=2*Q.BYTES+1;function q(U){return n(U,Y)}function M(U){return w$(U,Y)}let{ProjectivePoint:j,normPrivateKeyToScalar:z,weierstrassEquation:N,isWithinCurveOrder:D}=PQ({...J,toBytes(U,C,I){let F=C.toAffine(),T=Q.toBytes(F.x),R=z$;if(a0("isCompressed",I),I)return R(Uint8Array.from([C.hasEvenY()?2:3]),T);else return R(Uint8Array.from([4]),T,Q.toBytes(F.y))},fromBytes(U){let C=U.length,I=U[0],F=U.subarray(1);if(C===K&&(I===2||I===3)){let T=N0(F);if(!A$(T,d,Q.ORDER))throw Error("Point is not on curve");let R=N(T),f;try{f=Q.sqrt(R)}catch(r){let e=r instanceof Error?": "+r.message:"";throw Error("Point is not on curve"+e)}let m=(f&d)===d;if((I&1)===1!==m)f=Q.neg(f);return{x:T,y:f}}else if(C===X&&I===4){let T=Q.fromBytes(F.subarray(0,Q.BYTES)),R=Q.fromBytes(F.subarray(Q.BYTES,2*Q.BYTES));return{x:T,y:R}}else{let T=K,R=X;throw Error("invalid Point, expected length of "+T+", or uncompressed "+R+", got "+C)}}});function P(U){let C=Y>>d;return U>C}function V(U){return P(U)?q(-U):U}let y=(U,C,I)=>N0(U.slice(C,I));class _{constructor(U,C,I){if(b0("r",U,d,Y),b0("s",C,d,Y),this.r=U,this.s=C,I!=null)this.recovery=I;Object.freeze(this)}static fromCompact(U){let C=G;return U=$0("compactSignature",U,C*2),new _(y(U,0,C),y(U,C,2*C))}static fromDER(U){let{r:C,s:I}=D0.toSig($0("DER",U));return new _(C,I)}assertValidity(){}addRecoveryBit(U){return new _(this.r,this.s,U)}recoverPublicKey(U){let{r:C,s:I,recovery:F}=this,T=w($0("msgHash",U));if(F==null||![0,1,2,3].includes(F))throw Error("recovery id invalid");let R=F===2||F===3?C+J.n:C;if(R>=Q.ORDER)throw Error("recovery id 2 or 3 invalid");let f=(F&1)===0?"02":"03",m=j.fromHex(f+VJ(R,Q.BYTES)),l=M(R),r=q(-T*l),e=q(I*l),O0=j.BASE.multiplyAndAddUnsafe(m,r,e);if(!O0)throw Error("point at infinify");return O0.assertValidity(),O0}hasHighS(){return P(this.s)}normalizeS(){return this.hasHighS()?new _(this.r,q(-this.s),this.recovery):this}toDERRawBytes(){return U$(this.toDERHex())}toDERHex(){return D0.hexFromSig(this)}toCompactRawBytes(){return U$(this.toCompactHex())}toCompactHex(){let U=G;return VJ(this.r,U)+VJ(this.s,U)}}let H={isValidPrivateKey(U){try{return z(U),!0}catch(C){return!1}},normPrivateKeyToScalar:z,randomPrivateKey:()=>{let U=MJ(J.n);return U8(J.randomBytes(U),J.n)},precompute(U=8,C=j.BASE){return C._setWindowSize(U),C.multiply(BigInt(3)),C}};function W(U,C=!0){return j.fromPrivateKey(U).toRawBytes(C)}function O(U){if(typeof U==="bigint")return!1;if(U instanceof j)return!0;let I=$0("key",U).length,F=Q.BYTES,T=F+1,R=2*F+1;if(J.allowedPrivateKeyLengths||G===T)return;else return I===T||I===R}function L(U,C,I=!0){if(O(U)===!0)throw Error("first arg must be private key");if(O(C)===!1)throw Error("second arg must be public key");return j.fromHex(C).multiply(z(U)).toRawBytes(I)}let S=J.bits2int||function(U){if(U.length>8192)throw Error("input is too large");let C=N0(U),I=U.length*8-Z;return I>0?C>>BigInt(I):C},w=J.bits2int_modN||function(U){return q(S(U))},E=F0(Z);function b(U){return b0("num < 2^"+Z,U,V0,E),y0(U,G)}function x(U,C,I=A){if(["recovered","canonical"].some((H0)=>(H0 in I)))throw Error("sign() legacy options not supported");let{hash:F,randomBytes:T}=J,{lowS:R,prehash:f,extraEntropy:m}=I;if(R==null)R=!0;if(U=$0("msgHash",U),C8(I),f)U=$0("prehashed msgHash",F(U));let l=w(U),r=z(C),e=[b(r),b(l)];if(m!=null&&m!==!1){let H0=m===!0?T(Q.BYTES):m;e.push($0("extraEntropy",H0))}let O0=z$(...e),V$=l;function g$(H0){let h0=S(H0);if(!D(h0))return;let f$=M(h0),r0=j.BASE.multiply(h0).toAffine(),S0=q(r0.x);if(S0===V0)return;let e0=q(f$*q(V$+S0*r));if(e0===V0)return;let m0=(r0.x===S0?0:2)|Number(r0.y&d),_J=e0;if(R&&P(e0))_J=V(e0),m0^=1;return new _(S0,_J,m0)}return{seed:O0,k2sig:g$}}let A={lowS:J.lowS,prehash:!1},k={lowS:J.lowS,prehash:!1};function c(U,C,I=A){let{seed:F,k2sig:T}=x(U,C,I),R=J;return Z8(R.hash.outputLen,R.nByteLength,R.hmac)(F,T)}j.BASE._setWindowSize(8);function h(U,C,I,F=k){let T=U;C=$0("msgHash",C),I=$0("publicKey",I);let{lowS:R,prehash:f,format:m}=F;if(C8(F),"strict"in F)throw Error("options.strict was renamed to lowS");if(m!==void 0&&m!=="compact"&&m!=="der")throw Error("format must be compact or der");let l=typeof T==="string"||t0(T),r=!l&&!m&&typeof T==="object"&&T!==null&&typeof T.r==="bigint"&&typeof T.s==="bigint";if(!l&&!r)throw Error("invalid signature, expected Uint8Array, hex string or Signature instance");let e=void 0,O0;try{if(r)e=new _(T.r,T.s);if(l){try{if(m!=="compact")e=_.fromDER(T)}catch(m0){if(!(m0 instanceof D0.Err))throw m0}if(!e&&m!=="der")e=_.fromCompact(T)}O0=j.fromHex(I)}catch(m0){return!1}if(!e)return!1;if(R&&e.hasHighS())return!1;if(f)C=J.hash(C);let{r:V$,s:g$}=e,H0=w(C),h0=M(g$),f$=q(H0*h0),r0=q(V$*h0),S0=j.BASE.multiplyAndAddUnsafe(O0,f$,r0)?.toAffine();if(!S0)return!1;return q(S0.x)===V$}return{CURVE:J,getPublicKey:W,getSharedSecret:L,sign:c,verify:h,ProjectivePoint:j,Signature:_,utils:H}}/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */function LQ($){return{hash:$,hmac:(J,...Q)=>s$($,J,fJ(...Q)),randomBytes:vJ}}function L8($,J){let Q=(Y)=>B8({...$,...LQ(Y)});return{...Q(J),create:Q}}/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */var I8=BigInt("0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f"),H8=BigInt("0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141"),HQ=BigInt(0),SQ=BigInt(1),RJ=BigInt(2),S8=($,J)=>($+J/RJ)/J;function IQ($){let J=I8,Q=BigInt(3),Y=BigInt(6),G=BigInt(11),Z=BigInt(22),K=BigInt(23),X=BigInt(44),q=BigInt(88),M=$*$*$%J,j=M*M*$%J,z=Y0(j,Q,J)*j%J,N=Y0(z,Q,J)*j%J,D=Y0(N,RJ,J)*M%J,P=Y0(D,G,J)*D%J,V=Y0(P,Z,J)*P%J,y=Y0(V,X,J)*V%J,_=Y0(y,q,J)*y%J,H=Y0(_,X,J)*V%J,W=Y0(H,Q,J)*j%J,O=Y0(W,K,J)*P%J,L=Y0(O,Y,J)*M%J,S=Y0(L,RJ,J);if(!CJ.eql(CJ.sqr(S),$))throw Error("Cannot find square root");return S}var CJ=N$(I8,void 0,void 0,{sqrt:IQ}),PJ=L8({a:HQ,b:BigInt(7),Fp:CJ,n:H8,Gx:BigInt("55066263022277343669578718895168534326250603453777594175500187360389116729240"),Gy:BigInt("32670510020758816978083085130507043184471273380659243275938904335757337482424"),h:BigInt(1),lowS:!0,endo:{beta:BigInt("0x7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee"),splitScalar:($)=>{let J=H8,Q=BigInt("0x3086d221a7d46bcde86c90e49284eb15"),Y=-SQ*BigInt("0xe4437ed6010e88286f547fa90abfe4c3"),G=BigInt("0x114ca50f7a8e2f3f657c1108d9d44cfd8"),Z=Q,K=BigInt("0x100000000000000000000000000000000"),X=S8(Z*$,J),q=S8(-Y*$,J),M=n($-X*Q-q*G,J),j=n(-X*Y-q*Z,J),z=M>K,N=j>K;if(z)M=J-M;if(N)j=J-j;if(M>K||j>K)throw Error("splitScalar: Endomorphism failed, k="+$);return{k1neg:z,k1:M,k2neg:N,k2:j}}}},eJ);function y$(){let $=PJ.utils.randomPrivateKey();return"0x"+Buffer.from($).toString("hex")}function b$($){let J=$.startsWith("0x")?$.slice(2):$,Q=Buffer.from(J,"hex"),Y=PJ.getPublicKey(Q,!1),Z=c0(Y.slice(1)).slice(-20),K="0x"+Buffer.from(Z).toString("hex");return P0(K)}function F$($){let J;if(typeof $==="string"){let Y=$.startsWith("0x")?$.slice(2):$;J=Buffer.from(Y,"hex")}else J=$;let Q=c0(J);return"0x"+Buffer.from(Q).toString("hex")}class g extends k${constructor($,J){super("InvitationError",$,{...J,source:J?.source||"INVITATIONS"})}static noPathFound($,J,Q){return new g(`No valid invitation path found from ${$} to ${J}. ${Q||"The inviter may not have enough balance of the proxy inviter's token or there's no trust connection."}`,{code:"INVITATION_NO_PATH",source:"PATHFINDING",context:{from:$,to:J,reason:Q}})}static noProxyInviters($){return new g(`No proxy inviters found for ${$}. The inviter must have mutual trust connections with users who are also trusted by the invitation module, and these users must have sufficient balance.`,{code:"INVITATION_NO_PROXY_INVITERS",source:"VALIDATION",context:{inviter:$}})}static insufficientBalance($,J,Q,Y,G,Z){let K=Number(Q)/1000000000000000000,X=Number(Y)/1000000000000000000;return new g(`Insufficient balance for ${$} invitation(s). Can only afford ${J} invitation(s). Requested: ${K.toFixed(6)} CRC, Available: ${X.toFixed(6)} CRC.`,{code:"INVITATION_INSUFFICIENT_BALANCE",source:"VALIDATION",context:{from:G,to:Z,requestedInvites:$,availableInvites:J,requested:Q.toString(),available:Y.toString(),requestedCrc:K,availableCrc:X}})}static inviteeAlreadyRegistered($,J){return new g(`Invitee ${J} is already registered as a human in Circles Hub. Cannot invite an already registered user.`,{code:"INVITATION_INVITEE_ALREADY_REGISTERED",source:"VALIDATION",context:{inviter:$,invitee:J}})}static noAddressesProvided(){return new g("At least one address must be provided for invitation.",{code:"INVITATION_NO_ADDRESSES_PROVIDED",source:"VALIDATION"})}}var T8=[];for(let $=0;$<256;$++)T8[$]=$.toString(16).padStart(2,"0");function D$($){let J="0x";for(let Q=0;Q<$.length;Q++)J+=T8[$[Q]];return J}function _8($){let J=new Uint8Array($.length*2);return $.forEach((Q,Y)=>{let G=Q>>8,Z=Q&255,K=2*Y;J[K]=G,J[K+1]=Z}),D$(J)}function x8($,J,Q){let Y=new Set([J.toLowerCase(),Q.toLowerCase()]);$.forEach((K)=>{Y.add(K.from.toLowerCase()),Y.add(K.to.toLowerCase()),Y.add(K.tokenOwner.toLowerCase())});let G=[...Y].sort((K,X)=>{let q=BigInt(K),M=BigInt(X),j=q<M,z=q>M;return j?-1:z?1:0}),Z={};return G.forEach((K,X)=>{Z[K]=X}),{sorted:G,idx:Z}}function TQ($,J){let Q=new Set,Y=[],G=null;if($.forEach((Z,K)=>{let X=Z.from.toLowerCase(),q=Z.to.toLowerCase();if(X===J&&q===J)G=K;else if(q===J)Y.push(K)}),G!==null)Q.add(G);else Y.forEach((Z)=>Q.add(Z));return Q}function BJ($,J,Q,Y){let G=$.toLowerCase(),Z=J.toLowerCase(),{sorted:K,idx:X}=x8(Y,G,Z),q=TQ(Y,Z),M=Y.map((_,H)=>{return{streamSinkId:q.has(H)?1:0,amount:_.value}});if(q.size===0)throw Error(`No terminal edges detected. Flow must have at least one edge delivering to receiver ${Z}`);let j=Array.from(q),z=[{sourceCoordinate:X[G],flowEdgeIds:j,data:new Uint8Array(0)}],N=[];Y.forEach((_)=>{N.push(X[_.tokenOwner.toLowerCase()]),N.push(X[_.from.toLowerCase()]),N.push(X[_.to.toLowerCase()])});let D=_8(N),P=BigInt(Q),V=M.filter((_)=>_.streamSinkId===1).reduce((_,H)=>_+BigInt(H.amount.toString()),BigInt(0));if(V!==P)throw Error(`Terminal sum ${V} does not equal expected ${P}`);return{flowVertices:K,flowEdges:M,streams:z,packedCoordinates:D,sourceCoordinate:X[G]}}function LJ($,J){let Q=$.streams.map((Y)=>({sourceCoordinate:Y.sourceCoordinate,flowEdgeIds:Y.flowEdgeIds,data:Y.data instanceof Uint8Array?D$(Y.data):Y.data}));if(J&&Q.length>0)Q[0].data=J instanceof Uint8Array?D$(J):J;return Q}async function HJ($,J,Q){let Y=new Map,G=new Set;return Q.transfers.forEach((X)=>{if($.toLowerCase()===X.from.toLowerCase())G.add(X.tokenOwner.toLowerCase())}),(await new x$(J).token.getTokenInfoBatch(Array.from(G))).forEach((X)=>{if(X.isWrapped&&!X.isInflationary)X.tokenType="CrcV2_ERC20WrapperDeployed_Demurraged";Y.set(X.tokenAddress.toLowerCase(),X)}),Y}function SJ($,J){let Q={};return $.transfers.forEach((Y)=>{let G=J.get(Y.tokenOwner.toLowerCase());if(G&&G.tokenType.startsWith("CrcV2_ERC20WrapperDeployed")){if(!Q[Y.tokenOwner])Q[Y.tokenOwner]=[BigInt(0),G.tokenType];Q[Y.tokenOwner][0]+=BigInt(Y.value)}}),Q}function IJ($,J){let Q=$.transfers.map((Y)=>{let G=J.get(Y.tokenOwner.toLowerCase());if(G&&G.tokenType.startsWith("CrcV2_ERC20WrapperDeployed"))return{...Y,tokenOwner:G.tokenOwner};return Y});return{...$,transfers:Q}}class t extends J${constructor($,J){super("TransferError",$,{...J,source:J?.source||"TRANSFERS"})}static noPathFound($,J,Q){return new t(`No valid transfer path found from ${$} to ${J}. ${Q||"This could mean there's no trust connection, insufficient balance, or the tokens are not transferable."}`,{code:"TRANSFER_NO_PATH",source:"PATHFINDING",context:{from:$,to:J,reason:Q}})}static insufficientBalance($,J,Q,Y){let G=Number($)/1000000000000000000,Z=Number(J)/1000000000000000000;return new t(`Insufficient balance for transfer. Requested: ${G.toFixed(6)} CRC, Available: ${Z.toFixed(6)} CRC.`,{code:"TRANSFER_INSUFFICIENT_BALANCE",source:"VALIDATION",context:{from:Q,to:Y,requested:$.toString(),available:J.toString(),requestedCrc:G,availableCrc:Z}})}static wrappedTokensRequired(){return new t("Insufficient unwrapped token balance for transfer. Your balance contains wrapped tokens (ERC20 wrappers), but useWrappedBalances option is not enabled. Please enable it by passing { useWrappedBalances: true } in the transfer options.",{code:"TRANSFER_WRAPPED_TOKENS_REQUIRED",source:"VALIDATION"})}static unregisteredAvatars($){return new t(`Flow matrix contains ${$.length} unregistered avatar(s): ${$.join(", ")}. All addresses in the flow must be registered Circles avatars (human or group).`,{code:"TRANSFER_UNREGISTERED_AVATARS",source:"FLOW_MATRIX",context:{unregisteredAddresses:$,count:$.length}})}static flowMatrixMismatch($,J){return new t(`Flow matrix terminal sum (${$}) does not equal expected amount (${J})`,{code:"TRANSFER_FLOW_MATRIX_MISMATCH",source:"FLOW_MATRIX",context:{terminalSum:$.toString(),expected:J.toString()}})}static emptyPath($,J){return new t(`Transfer path is empty for route from ${$} to ${J}`,{code:"TRANSFER_EMPTY_PATH",source:"PATHFINDING",context:{from:$,to:J}})}}class v0{config;hubV2;liftERC20;rpcClient;pathfinder;balance;group;constructor($){this.config=$,this.hubV2=new B0({address:$.v2HubAddress,rpcUrl:$.circlesRpcUrl}),this.liftERC20=new E$({address:$.liftERC20Address,rpcUrl:$.circlesRpcUrl}),this.rpcClient=new R0($.circlesRpcUrl),this.pathfinder=new W0(this.rpcClient),this.balance=new A0(this.rpcClient),this.group=new w0(this.rpcClient)}async buildFlowMatrixTx($,J,Q,Y,G=!1){let Z=$.toLowerCase(),K=J.toLowerCase();if(!Q.transfers||Q.transfers.length===0)throw t.noPathFound(Z,K);let X={...Q};if(G&&Y?.toTokens?.length===1){let H=Y.toTokens[0].toLowerCase();if(Q.maxFlow>0n)X.transfers.push({from:K,to:K,tokenOwner:H,value:Q.maxFlow})}let q=await HJ(Z,this.config.circlesRpcUrl,X),M=SJ(X,q),j=Object.keys(M).length>0;if(j&&!Y?.useWrappedBalances)throw t.wrappedTokensRequired();let z=[],N=[];if(j){let H=await this._getTokenBalanceMap(Z),W=this._createDemurragedUnwrapCalls(M),{unwrapCalls:O,wrapCalls:L}=this._createInflationaryUnwrapAndWrapCalls(M,q,H);z=[...W,...O],N=L,X=IJ(X,q)}let D=BJ(Z,K,X.maxFlow,X.transfers),P=LJ(D,Y?.txData),V=this.hubV2.operateFlowMatrix(D.flowVertices,D.flowEdges,P,D.packedCoordinates),y=!1;try{y=await this.hubV2.isApprovedForAll(Z,Z)}catch(H){console.warn("Failed to check approval status, including approval transaction:",H)}return[...y?[]:[this.hubV2.setApprovalForAll(Z,!0)],...z,V,...N]}async constructAdvancedTransfer($,J,Q,Y,G=!1){let Z=$.toLowerCase(),K=J.toLowerCase(),X=BigInt(Q);if(Z===K&&Y?.fromTokens?.length===1&&Y?.toTokens?.length===1){let D=Y.fromTokens[0],P=Y.toTokens[0],[V,y]=await Promise.all([this.liftERC20.erc20Circles(0,P),this.liftERC20.erc20Circles(1,P)]);if(D.toLowerCase()===V.toLowerCase()&&V!==_$){let H=new d0({address:D,rpcUrl:this.config.circlesRpcUrl}).unwrap(X);return[{to:H.to,data:H.data,value:H.value??0n}]}if(D.toLowerCase()===y.toLowerCase()&&y!==_$){let _=new i0({address:D,rpcUrl:this.config.circlesRpcUrl}),H=i.attoCirclesToAttoStaticCircles(X),W=_.unwrap(H);return[{to:W.to,data:W.data,value:W.value??0n}]}}let q=this._truncateToSixDecimals(X),M=await this._getDefaultTokenExcludeList(K,Y?.excludeFromTokens),{...j}=Y||{},z={...j,...M?{excludeFromTokens:M}:{}},N=await this.pathfinder.findPath({from:Z,to:K,targetFlow:q,...z});if(!N.transfers||N.transfers.length===0)throw t.noPathFound(Z,K);if(N.maxFlow<q)throw t.insufficientBalance(q,N.maxFlow,Z,K);return this.buildFlowMatrixTx(Z,K,N,Y,G)}async constructReplenish($,J,Q,Y){let G=$.toLowerCase(),Z=J.toLowerCase(),K=(Y||$).toLowerCase(),X=BigInt(Q),M=(await this.balance.getTokenBalances(G)).filter((R)=>R.tokenOwner.toLowerCase()===Z),j=0n,z=0n,N=0n,D=null,P=null;for(let R of M)if(R.isWrapped)if(R.tokenType.includes("Demurrage"))z=BigInt(R.attoCircles),D=R.tokenAddress;else N=BigInt(R.staticAttoCircles),P=R.tokenAddress;else j=BigInt(R.attoCircles);let V=j+z+i.attoStaticCirclesToAttoCircles(N),y=[];if(j>=X){if(console.log(`✓ Already have ${Number(j)/1000000000000000000} CRC unwrapped (target: ${Number(X)/1000000000000000000} CRC). No replenish needed.`),K!==G){let R=await this.hubV2.toTokenId(Z),f=this.hubV2.safeTransferFrom(G,K,R,X);y.push({to:f.to,data:f.data,value:f.value??0n})}return y}let _=X-j;if(console.log(`Current unwrapped: ${Number(j)/1000000000000000000} CRC`),console.log(`Target amount: ${Number(X)/1000000000000000000} CRC`),console.log(`Need to acquire: ${Number(_)/1000000000000000000} CRC`),V>=X){let R=_;if(z>0n&&D&&R>0n){let f=R>z?z:R,l=new d0({address:D,rpcUrl:this.config.circlesRpcUrl}).unwrap(f);y.push({to:l.to,data:l.data,value:l.value??0n}),R-=f}if(N>0n&&P&&R>0n){let f=i.attoCirclesToAttoStaticCircles(R),m=f>N?N:f,r=new i0({address:P,rpcUrl:this.config.circlesRpcUrl}).unwrap(m);y.push({to:r.to,data:r.data,value:r.value??0n})}if(K!==G){let f=await this.hubV2.toTokenId(Z),m=this.hubV2.safeTransferFrom(G,K,f,X);y.push({to:m.to,data:m.data,value:m.value??0n})}return y}let W=!await this.hubV2.isTrusted(G,Z),O=BigInt(Math.floor(Date.now()/1000)+31536000),L=i.truncateToInt64(_),S=_%i.FACTOR_1E12!==0n,w=i.blowUpToBigInt(S?L+1n:L),E;try{E=await this.pathfinder.findPath({from:G,to:K,targetFlow:w,toTokens:[Z],useWrappedBalances:!0,simulatedTrusts:W?[{truster:G,trustee:Z}]:void 0})}catch(R){let f=Number(V)/1000000000000000000,m=Number(X)/1000000000000000000,l=Number(_)/1000000000000000000;throw new t(`Insufficient tokens to replenish. Target: ${m.toFixed(6)} CRC, Current unwrapped: ${Number(j)/1000000000000000000} CRC, Need: ${l.toFixed(6)} CRC, Available (including all paths): ${f.toFixed(6)} CRC. Cannot acquire the remaining ${(Number(_-(V-j))/1000000000000000000).toFixed(6)} CRC.`,{code:"REPLENISH_INSUFFICIENT_TOKENS",source:"VALIDATION",context:{from:G,tokenId:Z,target:X.toString(),unwrapped:j.toString(),deficit:_.toString(),available:V.toString(),targetCrc:m,unwrappedCrc:Number(j)/1000000000000000000,deficitCrc:l,availableCrc:f}})}if(!E.transfers||E.transfers.length===0)throw t.noPathFound(G,K,`No path to acquire token ${Z}`);if(E.maxFlow<w){let R=Number(E.maxFlow)/1000000000000000000,f=Number(w)/1000000000000000000;throw new t(`Pathfinder can only provide ${R.toFixed(6)} CRC of the ${f.toFixed(6)} CRC deficit needed for token ${Z}.`,{code:"REPLENISH_INSUFFICIENT_PATH_FLOW",source:"PATHFINDING",context:{from:G,tokenId:Z,deficit:w.toString(),pathFlow:E.maxFlow.toString(),deficitCrc:f,pathFlowCrc:R}})}if(W){let R=this.hubV2.trust(Z,O);y.push({to:R.to,data:R.data,value:R.value??0n})}let b=await HJ(G,this.config.circlesRpcUrl,E),x=SJ(E,b),A=Object.keys(x).length>0,k=[],c=[];if(A){let R=await this._getTokenBalanceMap(G),f=this._createDemurragedUnwrapCalls(x),{unwrapCalls:m,wrapCalls:l}=this._createInflationaryUnwrapAndWrapCalls(x,b,R);k=[...f,...m],c=l,E=IJ(E,b)}let h=BJ(G,K,E.maxFlow,E.transfers),U=LJ(h),C=this.hubV2.operateFlowMatrix(h.flowVertices,h.flowEdges,U,h.packedCoordinates),I={to:C.to,data:C.data,value:C.value??0n},F=!1;try{F=await this.hubV2.isApprovedForAll(G,G)}catch(R){console.warn("Failed to check approval status, including approval transaction:",R)}if(W){let R=this.hubV2.trust(Z,0n);c.push({to:R.to,data:R.data,value:R.value??0n})}let T=F?[]:[{to:this.hubV2.setApprovalForAll(G,!0).to,data:this.hubV2.setApprovalForAll(G,!0).data,value:0n}];return y.push(...T,...k,I,...c),y}async _getTokenBalanceMap($){let J=await this.balance.getTokenBalances($),Q=new Map;return J.forEach((Y)=>{Q.set(Y.tokenAddress.toLowerCase(),Y.staticAttoCircles)}),Q}_createDemurragedUnwrapCalls($){let J=[];for(let[Q,[Y,G]]of Object.entries($)){if(G!=="CrcV2_ERC20WrapperDeployed_Demurraged")continue;let K=new d0({address:Q,rpcUrl:this.config.circlesRpcUrl}).unwrap(Y);J.push({to:K.to,data:K.data,value:K.value??0n})}return J}_createInflationaryUnwrapAndWrapCalls($,J,Q){let Y=[],G=[];for(let[Z,[K,X]]of Object.entries($)){if(X!=="CrcV2_ERC20WrapperDeployed_Inflationary")continue;let q=J.get(Z.toLowerCase()),M=Q.get(Z.toLowerCase())||0n;if(M===0n)continue;let z=new i0({address:Z,rpcUrl:this.config.circlesRpcUrl}).unwrap(M);Y.push({to:z.to,data:z.data,value:z.value??0n});let N=q?.tokenOwner,D=i.attoStaticCirclesToAttoCircles(M)-K;if(D>0n){let P=this.hubV2.wrap(N,D,1);G.push({to:P.to,data:P.data,value:P.value??0n})}}return{unwrapCalls:Y,wrapCalls:G}}_truncateToSixDecimals($){let J=BigInt(1e6),Q=BigInt(10)**BigInt(18);return $/(Q/J)*(Q/J)}async _getDefaultTokenExcludeList($,J){let Q=await this.group.findGroups(1,{mintHandlerEquals:$}),Y=new Set;if(Q.length>0){let G=Q[0];if(Y.add(G.group.toLowerCase()),G.erc20WrapperDemurraged)Y.add(G.erc20WrapperDemurraged.toLowerCase());if(G.erc20WrapperStatic)Y.add(G.erc20WrapperStatic.toLowerCase())}if(J?.forEach((G)=>Y.add(G.toLowerCase())),Y.size===0)return;return Array.from(Y)}}var E8=p0;class TJ{config;rpcClient;pathfinder;trust;hubV2;referralsModule;invitationFarm;constructor($){if(!$.referralsServiceUrl)throw new g("referralsServiceUrl is required in config",{code:"INVITATION_MISSING_CONFIG",source:"INVITATIONS",context:{missingField:"referralsServiceUrl"}});this.config=$,this.rpcClient=new R0($.circlesRpcUrl),this.pathfinder=new W0(this.rpcClient),this.trust=new k0(this.rpcClient),this.hubV2=new B0({address:$.v2HubAddress,rpcUrl:$.circlesRpcUrl}),this.referralsModule=new n0({address:$.referralsModuleAddress,rpcUrl:$.circlesRpcUrl}),this.invitationFarm=new o0({address:$.invitationFarmAddress,rpcUrl:$.circlesRpcUrl})}async saveReferralData($,J){try{let Q=await fetch(`${this.config.referralsServiceUrl}/store`,{method:"POST",headers:{accept:"application/json","Content-Type":"application/json"},body:JSON.stringify({privateKey:J,inviter:$})});if(!Q.ok)throw new g(`HTTP error! status: ${Q.status}`,{code:"INVITATION_HTTP_ERROR",source:"INVITATIONS",context:{status:Q.status,url:`${this.config.referralsServiceUrl}/store`}})}catch(Q){throw new g(`Failed to save referral data: ${Q instanceof Error?Q.message:"Unknown error"}`,{code:"INVITATION_SAVE_REFERRAL_FAILED",source:"INVITATIONS",cause:Q})}}async listReferrals($,J=10,Q=0){try{let Y=new URL(`${this.config.referralsServiceUrl}/list/${$}`);Y.searchParams.set("limit",String(J)),Y.searchParams.set("offset",String(Q));let G=await fetch(Y.toString(),{method:"GET",headers:{accept:"application/json"}});if(!G.ok)throw new g(`HTTP error! status: ${G.status}`,{code:"INVITATION_HTTP_ERROR",source:"INVITATIONS",context:{status:G.status,url:Y.toString()}});return await G.json()}catch(Y){if(Y instanceof g)throw Y;throw new g(`Failed to list referrals: ${Y instanceof Error?Y.message:"Unknown error"}`,{code:"INVITATION_LIST_REFERRALS_FAILED",source:"INVITATIONS",cause:Y})}}orderRealInviters($,J){let Q=J.toLowerCase();return $.sort((Y,G)=>{let Z=Y.address.toLowerCase()===Q,K=G.address.toLowerCase()===Q;if(Z&&!K)return-1;if(!Z&&K)return 1;return 0})}async generateInvite($,J){let Q=$.toLowerCase(),Y=J.toLowerCase();if(await this.hubV2.isHuman(Y))throw g.inviteeAlreadyRegistered(Q,Y);let Z=await this.getRealInviters(Q),K=[];if(Z.length>0){console.log("[generateInvite] Using STANDARD PATH (proxy inviters available)");let X=Z[0].address,q=await this.findInvitePath(Q,X),M=await this.generateInviteData([Y],!1),z=await new v0(this.config).buildFlowMatrixTx(Q,this.config.invitationModuleAddress,q,{toTokens:[X],useWrappedBalances:!0,txData:H$(M)},!0);K.push(...z)}else{console.log("[generateInvite] Using FARM FALLBACK PATH (no proxy inviters available)");let X=new v0(this.config),q=await this.findFarmInvitePath(Q),M=await X.buildFlowMatrixTx(Q,E0,q,{toTokens:[p0],useWrappedBalances:!0},!0);K.push(...M);let j="0x20EcD8bDeb2F48d8a7c94E542aA4feC5790D9676",z=await this.invitationFarm.read("claimInvite",[],{from:j}),N=this.invitationFarm.claimInvite();K.push(N);let D=await this.invitationFarm.invitationModule(),P=J0(["address"],[Y]),V=this.hubV2.safeTransferFrom(Q,D,z,p,P);K.push(V)}return K}async findInvitePath($,J){let Q=$.toLowerCase(),Y;if(J)Y=J.toLowerCase();else{let Z=await this.getRealInviters(Q);if(Z.length===0)throw g.noPathFound(Q,this.config.invitationModuleAddress);Y=Z[0].address}let G=await this.pathfinder.findPath({from:Q,to:this.config.invitationModuleAddress,targetFlow:p,toTokens:[Y],useWrappedBalances:!0});if(!G.transfers||G.transfers.length===0)throw g.noPathFound(Q,this.config.invitationModuleAddress);if(G.maxFlow<p){let K=Number(G.maxFlow/p);throw g.insufficientBalance(1,K,p,G.maxFlow,Q,this.config.invitationModuleAddress)}return G}async findFarmInvitePath($){let J=$.toLowerCase(),Q=await this.pathfinder.findPath({from:J,to:E0,targetFlow:p,toTokens:[E8],useWrappedBalances:!0});if(!Q.transfers||Q.transfers.length===0)throw g.noPathFound(J,E0);if(Q.maxFlow<p){let G=Number(Q.maxFlow/p);throw g.insufficientBalance(1,G,p,Q.maxFlow,J,E0)}return Q}async getRealInviters($){console.log("[getRealInviters] Finding valid proxy inviters for:",$);let J=$.toLowerCase(),Q=await this.trust.getTrustedBy(J),Y=await this.trust.getMutualTrusts(J),G=new Set([...Q.map((H)=>H.objectAvatar.toLowerCase()),...Y.map((H)=>H.objectAvatar.toLowerCase())]),[Z,K]=await Promise.all([this.trust.getTrusts(this.config.invitationModuleAddress),this.trust.getMutualTrusts(this.config.invitationModuleAddress)]),X=new Set([...Z.map((H)=>H.objectAvatar.toLowerCase()),...K.map((H)=>H.objectAvatar.toLowerCase())]),q=new Set;if(p0!=="0x0000000000000000000000000000000000000000"){let H=await this.trust.getTrusts(p0);q=new Set([...H.map((W)=>W.objectAvatar.toLowerCase())])}if(!X.has(J))throw new g("Inviter must enable the invitation module before creating invitations",{code:"INVITATION_MODULE_NOT_ENABLED",source:"INVITATIONS",context:{inviter:J,invitationModule:this.config.invitationModuleAddress}});let j=[];for(let H of G)if(X.has(H)&&!q.has(H))j.push(H);let z=[...j];if(!q.has(J))z.push(J);if(z.length===0)return[];let D=await this.pathfinder.findPath({from:J,to:this.config.invitationModuleAddress,useWrappedBalances:!0,targetFlow:G$,toTokens:z});if(!D.transfers||D.transfers.length===0)return[];let P=new Map,V=this.config.invitationModuleAddress.toLowerCase();for(let H of D.transfers)if(H.to.toLowerCase()===V){let W=H.tokenOwner.toLowerCase(),O=P.get(W)||BigInt(0);P.set(W,O+H.value)}let y=[];for(let[H,W]of P.entries()){let O=Number(W/p);if(O>=1)y.push({address:H,possibleInvites:O})}let _=this.orderRealInviters(y,J);console.log("[getRealInviters] Final result:",_.length,"valid proxy inviters");for(let H of _);return _}async generateReferral($){let J=$.toLowerCase(),Q=y$(),Y=b$(Q),G=await this.getRealInviters(J),Z=[];if(G.length>0){console.log("[generateReferral] Using STANDARD PATH (proxy inviters available)");let K=new v0(this.config),X=await this.generateInviteData([Y],!0),q=G[0].address,M=await this.findInvitePath(J,q),j=await K.buildFlowMatrixTx(J,this.config.invitationModuleAddress,M,{toTokens:[q],useWrappedBalances:!0,txData:H$(X)},!0);Z.push(...j)}else{console.log("[generateReferral] Using FARM FALLBACK PATH (no proxy inviters available)");let K=new v0(this.config),X=await this.findFarmInvitePath(J),q=await K.buildFlowMatrixTx(J,E0,X,{toTokens:[E8],useWrappedBalances:!0},!0);Z.push(...q);let M="0x20EcD8bDeb2F48d8a7c94E542aA4feC5790D9676",j=await this.invitationFarm.read("claimInvite",[],{from:M}),z=this.invitationFarm.claimInvite();Z.push(z);let N=await this.invitationFarm.invitationModule(),D=this.referralsModule.createAccount(Y).data,P=J0(["address","bytes"],[this.config.referralsModuleAddress,D]),V=this.hubV2.safeTransferFrom(J,N,j,p,P);Z.push(V)}return{transactions:Z,privateKey:Q}}async generateInviteData($,J=!0){if($.length===0)throw g.noAddressesProvided();if(!J)if($.length===1)return J0(["address"],[$[0]]);else return J0(["address[]"],[$]);if($.length===1){let Y=this.referralsModule.createAccount($[0]).data;return J0(["address","bytes"],[this.config.referralsModuleAddress,Y])}else{let Y=this.referralsModule.createAccounts($).data;return J0(["address","bytes"],[this.config.referralsModuleAddress,Y])}}computeAddress($){let Q=$.toLowerCase().replace("0x","").padStart(64,"0"),Y=p$.replace("0x","")+Q,G=F$("0x"+Y),Z="ff",K=l$.toLowerCase().replace("0x",""),X=G.replace("0x",""),q=d$.replace("0x",""),M="ff"+K+X+q,z="0x"+F$("0x"+M).slice(-40);return P0(z)}generateSecrets($){return Array.from({length:$},()=>{let J=y$(),Q=b$(J).toLowerCase();return{secret:J,signer:Q}})}}class xQ{referralsModuleAddress;invitations;invitationFarm;referralsModule;hubV2;constructor($){this.referralsModuleAddress=$.referralsModuleAddress,this.invitations=new TJ($),this.invitationFarm=new o0({address:$.invitationFarmAddress,rpcUrl:$.circlesRpcUrl}),this.referralsModule=new n0({address:$.referralsModuleAddress,rpcUrl:$.circlesRpcUrl}),this.hubV2=new B0({address:$.v2HubAddress,rpcUrl:$.circlesRpcUrl})}async getQuota($){return this.invitationFarm.inviterQuota($)}async getInvitationFee(){return this.invitationFarm.invitationFee()}async getInvitationModule(){return this.invitationFarm.invitationModule()}async generateReferrals($,J){if(J<=0)throw new g("Count must be greater than 0",{code:"INVITATION_INVALID_COUNT",source:"VALIDATION",context:{count:J}});let Q=$.toLowerCase(),Y=J===1,G=await this.simulateClaim(Q,J);if(!G.length)throw new g("No invitation IDs returned from claim",{code:"INVITATION_NO_IDS",source:"INVITATIONS",context:{inviter:Q,count:J}});let Z=this.invitations.generateSecrets(J),K=Z.map((j)=>j.signer),X=await this.invitationFarm.invitationModule(),q=Y?this.invitationFarm.claimInvite():this.invitationFarm.claimInvites(BigInt(J)),M=Y?this.buildReferralTransfer(Q,X,G[0],K[0]):this.buildBatchReferralTransfer(Q,X,G,K);return{referrals:Z,transactions:[q,M]}}async generateInvites($,J){if(J.length===0)throw new g("At least one invitee address must be provided",{code:"INVITATION_INVALID_COUNT",source:"VALIDATION",context:{count:0}});let Q=$.toLowerCase(),Y=J.map((j)=>j.toLowerCase()),G=Y.length,Z=G===1,K=await this.simulateClaim(Q,G);if(!K.length)throw new g("No invitation IDs returned from claim",{code:"INVITATION_NO_IDS",source:"INVITATIONS",context:{inviter:Q,count:G}});let X=await this.invitationFarm.invitationModule(),q=Z?this.invitationFarm.claimInvite():this.invitationFarm.claimInvites(BigInt(G)),M=Z?this.buildInviteTransfer(Q,X,K[0],Y[0]):this.buildBatchInviteTransfer(Q,X,K,Y);return{invitees:Y,transactions:[q,M]}}async listReferrals($,J=10,Q=0){return this.invitations.listReferrals($,J,Q)}async simulateClaim($,J){if(J===1)return[await this.invitationFarm.read("claimInvite",[],{from:$})];return this.invitationFarm.read("claimInvites",[BigInt(J)],{from:$})}buildReferralTransfer($,J,Q,Y){let G=this.referralsModule.createAccount(Y).data,Z=J0(["address","bytes"],[this.referralsModuleAddress,G]);return this.hubV2.safeTransferFrom($,J,Q,p,Z)}buildBatchReferralTransfer($,J,Q,Y){let G=this.referralsModule.createAccounts(Y).data,Z=J0(["address","bytes"],[this.referralsModuleAddress,G]),K=Q.map(()=>p);return this.hubV2.safeBatchTransferFrom($,J,Q,K,Z)}buildInviteTransfer($,J,Q,Y){let G=J0(["address"],[Y]);return this.hubV2.safeTransferFrom($,J,Q,p,G)}buildBatchInviteTransfer($,J,Q,Y){let G=J0(["address[]"],[Y]),Z=Q.map(()=>p);return this.hubV2.safeBatchTransferFrom($,J,Q,Z,G)}}class EQ{baseUrl;getToken;constructor($,J){this.baseUrl=$;this.getToken=J}getBaseUrl(){return this.baseUrl.endsWith("/")?this.baseUrl.slice(0,-1):this.baseUrl}async getAuthHeaders(){if(!this.getToken)return{"Content-Type":"application/json"};return{"Content-Type":"application/json",Authorization:`Bearer ${await this.getToken()}`}}async retrieve($){try{let J=`${this.getBaseUrl()}/retrieve?key=${encodeURIComponent($)}`,Q=await fetch(J);if(!Q.ok){let Y=`HTTP error! status: ${Q.status}`;try{Y=(await Q.json()).error||Y}catch{Y=Q.statusText||Y}throw new g(Y,{code:"INVITATION_RETRIEVE_FAILED",source:"INVITATIONS",context:{status:Q.status,url:J,privateKey:$}})}return Q.json()}catch(J){if(J instanceof g)throw J;throw new g(`Failed to retrieve referral: ${J instanceof Error?J.message:"Unknown error"}`,{code:"INVITATION_RETRIEVE_ERROR",source:"INVITATIONS",cause:J,context:{privateKey:$}})}}async listMine(){if(!this.getToken)throw new g("Authentication required to list referrals",{code:"INVITATION_AUTH_REQUIRED",source:"INVITATIONS"});try{let $=`${this.getBaseUrl()}/my-referrals`,J=await this.getAuthHeaders(),Q=await fetch($,{headers:J});if(!Q.ok){let Y=`HTTP error! status: ${Q.status}`;try{Y=(await Q.json()).error||Y}catch{Y=Q.statusText||Y}throw new g(Y,{code:"INVITATION_LIST_FAILED",source:"INVITATIONS",context:{status:Q.status,url:$}})}return Q.json()}catch($){if($ instanceof g)throw $;throw new g(`Failed to list referrals: ${$ instanceof Error?$.message:"Unknown error"}`,{code:"INVITATION_LIST_ERROR",source:"INVITATIONS",cause:$})}}}export{EQ as Referrals,xQ as InviteFarm,TJ as Invitations,g as InvitationError};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aboutcircles/sdk-invitations",
3
- "version": "0.1.16",
3
+ "version": "0.1.18",
4
4
  "description": "Circles Invitations Module SDK",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",