@appliedblockchain/silentdatarollup-core 1.0.4 → 1.0.5

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.
@@ -143,28 +143,11 @@ async function signAuthHeaderRawMessage(signer, payload, timestamp, chainId) {
143
143
  log("Raw signature generated:", signature);
144
144
  return signature;
145
145
  }
146
- async function signTypedDelegateHeader(signer, chainId, message) {
147
- log("Signing typed delegate header", { chainId, message });
148
- const signature = await signer.signTypedData(
149
- { ...eip721Domain, chainId },
150
- delegateEIP721Types,
151
- message
152
- );
153
- log("Signature generated:", signature);
154
- return signature;
155
- }
156
- async function signRawDelegateHeader(signer, message) {
157
- log("Signing raw delegate header", message);
158
- const signature = await signer.signMessage(message);
159
- log("Raw signature generated:", signature);
160
- return signature;
161
- }
162
- async function getAuthHeaders(signer, payload, signatureType) {
146
+ async function getAuthHeaders(signer, payload, chainId, signatureType) {
163
147
  const xTimestamp = (/* @__PURE__ */ new Date()).toISOString();
164
148
  const headers = {
165
149
  [HEADER_TIMESTAMP]: xTimestamp
166
150
  };
167
- const chainId = (await signer.provider.getNetwork()).chainId.toString();
168
151
  switch (signatureType) {
169
152
  case "RAW" /* Raw */:
170
153
  log("Generating raw signature");
@@ -189,12 +172,11 @@ async function getAuthHeaders(signer, payload, signatureType) {
189
172
  }
190
173
  return headers;
191
174
  }
192
- function isSignableContractCall(payload, contractMethodsToSign, contract) {
193
- if (!contractMethodsToSign || !contract) {
175
+ function isSignableContractCall(payload, contracts) {
176
+ if (!contracts || contracts.length === 0) {
194
177
  return false;
195
178
  }
196
179
  log("Checking if contract call is signable");
197
- log("Contract methods to sign:", contractMethodsToSign);
198
180
  if (payload.method !== "eth_call") {
199
181
  log("Payload method is not eth_call, returning false");
200
182
  return false;
@@ -204,8 +186,31 @@ function isSignableContractCall(payload, contractMethodsToSign, contract) {
204
186
  log("Invalid params, returning false");
205
187
  return false;
206
188
  }
207
- const methodSignature = params[0].data.slice(2, 10);
208
- log("Method signature:", methodSignature);
189
+ const callTarget = params[0].to;
190
+ if (!callTarget) {
191
+ log("Missing call target, returning false");
192
+ return false;
193
+ }
194
+ log(`Call target: ${callTarget}`);
195
+ const contractIndex = contracts.findIndex(
196
+ (c) => c.contract.target.toString().toLowerCase() === callTarget.toLowerCase()
197
+ );
198
+ if (contractIndex < 0) {
199
+ log("Contract not found, returning false");
200
+ return false;
201
+ }
202
+ const callData = params[0].data;
203
+ if (!callData) {
204
+ log("Missing call data, returning false");
205
+ return false;
206
+ }
207
+ const methodSignature = callData.slice(2, 10);
208
+ if (!methodSignature) {
209
+ log("Missing method signature, returning false");
210
+ return false;
211
+ }
212
+ log(`Method signature: ${methodSignature}`);
213
+ const { contract, contractMethodsToSign } = contracts[contractIndex];
209
214
  const isSignable = contractMethodsToSign.some((methodName) => {
210
215
  const fragment = contract.interface.getFunction(methodName);
211
216
  return !!fragment && methodSignature.startsWith(fragment.selector.slice(2));
@@ -229,8 +234,8 @@ var SilentDataRollupBase = class {
229
234
  this.delegateSignerExpires = 0;
230
235
  this.cachedDelegateHeaders = null;
231
236
  this.cachedHeadersExpiry = 0;
232
- this.contract = null;
233
- this.contractMethodsToSign = [];
237
+ this.delegateHeadersPromise = null;
238
+ this.contracts = [];
234
239
  this._cachedNetwork = null;
235
240
  this.config = {
236
241
  ...config,
@@ -352,6 +357,22 @@ var SilentDataRollupBase = class {
352
357
  }
353
358
  async getDelegateHeaders(provider) {
354
359
  log2("Getting delegate headers");
360
+ if (!this.delegateHeadersPromise) {
361
+ this.delegateHeadersPromise = this.generateDelegateHeaders(provider);
362
+ }
363
+ const currentPromise = this.delegateHeadersPromise;
364
+ try {
365
+ return await currentPromise;
366
+ } catch (error) {
367
+ log2("Error getting delegate headers:", error);
368
+ throw new Error("Failed to get delegate headers");
369
+ } finally {
370
+ if (this.delegateHeadersPromise === currentPromise) {
371
+ this.delegateHeadersPromise = null;
372
+ }
373
+ }
374
+ }
375
+ async generateDelegateHeaders(provider) {
355
376
  const now = Math.floor(Date.now() / 1e3);
356
377
  const signatureType = this.config.authSignatureType;
357
378
  const isCachedHeadersValid = this.cachedDelegateHeaders && this.cachedHeadersExpiry - DELEGATE_EXPIRATION_THRESHOLD_BUFFER > now;
@@ -480,8 +501,10 @@ var SilentDataRollupBase = class {
480
501
  }
481
502
  setContract(contract, contractMethodsToSign) {
482
503
  log2("Setting contract and methods to sign: ", contractMethodsToSign);
483
- this.contract = contract;
484
- this.contractMethodsToSign = contractMethodsToSign;
504
+ this.contracts.push({
505
+ contract,
506
+ contractMethodsToSign
507
+ });
485
508
  }
486
509
  /**
487
510
  * Prepares the message to be signed for the x-signature header.
@@ -513,7 +536,7 @@ var SilentDataRollupBase = class {
513
536
 
514
537
  // src/contract.ts
515
538
  import {
516
- Contract as Contract2,
539
+ Contract,
517
540
  Interface,
518
541
  assertArgument
519
542
  } from "ethers";
@@ -547,7 +570,7 @@ function getContractRunner(runner, provider) {
547
570
  }
548
571
  return new CustomContractRunner(runner.provider, runner);
549
572
  }
550
- var SilentDataRollupContract = class extends Contract2 {
573
+ var SilentDataRollupContract = class extends Contract {
551
574
  constructor(config) {
552
575
  const { address, abi, runner, contractMethodsToSign, provider } = config;
553
576
  const contractInterface = new Interface(abi);
@@ -596,10 +619,6 @@ export {
596
619
  NetworkName,
597
620
  SignatureType,
598
621
  getAuthEIP721Types,
599
- signAuthHeaderTypedData,
600
- signAuthHeaderRawMessage,
601
- signTypedDelegateHeader,
602
- signRawDelegateHeader,
603
622
  getAuthHeaders,
604
623
  isSignableContractCall,
605
624
  defaultGetDelegate,
package/dist/index.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { Signer, JsonRpcPayload, InterfaceAbi, ContractRunner, Provider, Contract, TypedDataDomain, TypedDataField } from 'ethers';
1
+ import { Signer, Contract, JsonRpcPayload, InterfaceAbi, ContractRunner, Provider, TypedDataDomain, TypedDataField } from 'ethers';
2
2
 
3
3
  declare const SIGN_RPC_METHODS: string[];
4
4
  declare const eip721Domain: {
@@ -101,6 +101,10 @@ type SilentDataRollupContractConfig = {
101
101
  contractMethodsToSign: string[];
102
102
  provider?: Provider;
103
103
  };
104
+ type ContractInfo = {
105
+ contract: Contract;
106
+ contractMethodsToSign: string[];
107
+ };
104
108
 
105
109
  declare class SilentDataRollupBase {
106
110
  config: BaseConfig;
@@ -109,8 +113,8 @@ declare class SilentDataRollupBase {
109
113
  private delegateSignerExpires;
110
114
  private cachedDelegateHeaders;
111
115
  private cachedHeadersExpiry;
112
- contract: Contract | null;
113
- contractMethodsToSign: string[];
116
+ private delegateHeadersPromise;
117
+ contracts: ContractInfo[];
114
118
  private _cachedNetwork;
115
119
  constructor(config: BaseConfig);
116
120
  private resolveDelegateConfig;
@@ -139,6 +143,7 @@ declare class SilentDataRollupBase {
139
143
  */
140
144
  protected signTypedDelegateHeader(provider: any, chainId: string, message: DelegateSignerMessage): Promise<string>;
141
145
  getDelegateHeaders(provider: any): Promise<DelegateHeaders>;
146
+ generateDelegateHeaders(provider: any): Promise<DelegateHeaders>;
142
147
  getAuthHeaders(provider: any, payload: JsonRpcPayload | JsonRpcPayload[]): Promise<AuthHeaders>;
143
148
  signAuthHeaderRawMessage(provider: any, payload: JsonRpcPayload | JsonRpcPayload[], timestamp: string, chainId: string): Promise<string>;
144
149
  signAuthHeaderTypedData(provider: any, payload: JsonRpcPayload | JsonRpcPayload[], timestamp: string, chainId: string): Promise<string>;
@@ -185,11 +190,7 @@ declare function getAuthEIP721Types(payload: JsonRpcPayload | JsonRpcPayload[]):
185
190
  type: string;
186
191
  }[];
187
192
  };
188
- declare function signAuthHeaderTypedData(signer: any, payload: JsonRpcPayload | JsonRpcPayload[], timestamp: string, chainId: string): Promise<string>;
189
- declare function signAuthHeaderRawMessage(signer: any, payload: JsonRpcPayload | JsonRpcPayload[], timestamp: string, chainId: string): Promise<string>;
190
- declare function signTypedDelegateHeader(signer: any, chainId: string, message: DelegateSignerMessage): Promise<any>;
191
- declare function signRawDelegateHeader(signer: any, message: string): Promise<string>;
192
- declare function getAuthHeaders(signer: Signer, payload: JsonRpcPayload | JsonRpcPayload[], signatureType: SignatureType): Promise<AuthHeaders>;
193
+ declare function getAuthHeaders(signer: Signer, payload: JsonRpcPayload | JsonRpcPayload[], chainId: string, signatureType: SignatureType): Promise<AuthHeaders>;
193
194
  /**
194
195
  * Determines if a given JSON-RPC payload represents a call to a contract method that requires signing.
195
196
  *
@@ -200,19 +201,17 @@ declare function getAuthHeaders(signer: Signer, payload: JsonRpcPayload | JsonRp
200
201
  * The function performs the following checks:
201
202
  * 1. Verifies if the payload is an `eth_call`.
202
203
  * 2. Extracts the method signature from the call data.
203
- * 3. Compares the signature against a provided list of methods requiring signing.
204
- * 4. Uses the contract's ABI to match the method signature with known methods.
204
+ * 3. Compares the signature against the list of contracts and their methods requiring signing.
205
+ * 4. Uses each contract's ABI to match the method signature with known methods.
205
206
  *
206
207
  * By accurately identifying these calls, we can add appropriate authentication headers
207
208
  * to the request, enabling the smart contract to verify the caller's identity.
208
209
  *
209
210
  * @param payload - The JSON-RPC payload to analyze.
210
- * @param contractMethodsToSign - An array of method names that require signing.
211
- * @param contract - The contract instance containing the ABI information.
211
+ * @param contracts - An array of contract information containing contracts and their methods to sign.
212
212
  * @returns {boolean} True if the call is to a method that requires signing, false otherwise.
213
- * @throws {Error} If contractMethodsToSign or contract is not provided.
214
213
  */
215
- declare function isSignableContractCall(payload: JsonRpcPayload, contractMethodsToSign?: string[], contract?: Contract | null): boolean;
214
+ declare function isSignableContractCall(payload: JsonRpcPayload, contracts: ContractInfo[]): boolean;
216
215
  declare const defaultGetDelegate: (provider: any) => Promise<Signer>;
217
216
  declare const prepareTypedDataPayload: (p: JsonRpcPayload) => AuthSignatureMessageRequest;
218
217
 
@@ -242,4 +241,4 @@ interface PrivateEvent {
242
241
  */
243
242
  declare function calculateEventTypeHash(eventSignature: string): string;
244
243
 
245
- export { type AuthHeaders, type AuthSignatureMessage, type AuthSignatureMessageRequest, type BaseConfig, ChainId, DEBUG_NAMESPACE, DEBUG_NAMESPACE_SILENTDATA_INTERCEPTOR, DEFAULT_DELEGATE_EXPIRES, DELEGATE_EXPIRATION_THRESHOLD_BUFFER, type DelegateConfig, type DelegateHeaders, type DelegateSignerMessage, HEADER_DELEGATE, HEADER_DELEGATE_SIGNATURE, HEADER_EIP712_DELEGATE_SIGNATURE, HEADER_EIP712_SIGNATURE, HEADER_SIGNATURE, HEADER_TIMESTAMP, NetworkName, PRIVATE_EVENT_SIGNATURE, PRIVATE_EVENT_SIGNATURE_HASH, type PrivateEvent, SIGN_RPC_METHODS, SignatureType, type SilentDataProviderOptions, SilentDataRollupBase, SilentDataRollupContract, type SilentDataRollupContractConfig, type SilentdataNetworkConfig, WHITELISTED_METHODS, calculateEventTypeHash, defaultGetDelegate, delegateEIP721Types, eip721Domain, getAuthEIP721Types, getAuthHeaders, isSignableContractCall, prepareTypedDataPayload, signAuthHeaderRawMessage, signAuthHeaderTypedData, signRawDelegateHeader, signTypedDelegateHeader };
244
+ export { type AuthHeaders, type AuthSignatureMessage, type AuthSignatureMessageRequest, type BaseConfig, ChainId, type ContractInfo, DEBUG_NAMESPACE, DEBUG_NAMESPACE_SILENTDATA_INTERCEPTOR, DEFAULT_DELEGATE_EXPIRES, DELEGATE_EXPIRATION_THRESHOLD_BUFFER, type DelegateConfig, type DelegateHeaders, type DelegateSignerMessage, HEADER_DELEGATE, HEADER_DELEGATE_SIGNATURE, HEADER_EIP712_DELEGATE_SIGNATURE, HEADER_EIP712_SIGNATURE, HEADER_SIGNATURE, HEADER_TIMESTAMP, NetworkName, PRIVATE_EVENT_SIGNATURE, PRIVATE_EVENT_SIGNATURE_HASH, type PrivateEvent, SIGN_RPC_METHODS, SignatureType, type SilentDataProviderOptions, SilentDataRollupBase, SilentDataRollupContract, type SilentDataRollupContractConfig, type SilentdataNetworkConfig, WHITELISTED_METHODS, calculateEventTypeHash, defaultGetDelegate, delegateEIP721Types, eip721Domain, getAuthEIP721Types, getAuthHeaders, isSignableContractCall, prepareTypedDataPayload };
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { Signer, JsonRpcPayload, InterfaceAbi, ContractRunner, Provider, Contract, TypedDataDomain, TypedDataField } from 'ethers';
1
+ import { Signer, Contract, JsonRpcPayload, InterfaceAbi, ContractRunner, Provider, TypedDataDomain, TypedDataField } from 'ethers';
2
2
 
3
3
  declare const SIGN_RPC_METHODS: string[];
4
4
  declare const eip721Domain: {
@@ -101,6 +101,10 @@ type SilentDataRollupContractConfig = {
101
101
  contractMethodsToSign: string[];
102
102
  provider?: Provider;
103
103
  };
104
+ type ContractInfo = {
105
+ contract: Contract;
106
+ contractMethodsToSign: string[];
107
+ };
104
108
 
105
109
  declare class SilentDataRollupBase {
106
110
  config: BaseConfig;
@@ -109,8 +113,8 @@ declare class SilentDataRollupBase {
109
113
  private delegateSignerExpires;
110
114
  private cachedDelegateHeaders;
111
115
  private cachedHeadersExpiry;
112
- contract: Contract | null;
113
- contractMethodsToSign: string[];
116
+ private delegateHeadersPromise;
117
+ contracts: ContractInfo[];
114
118
  private _cachedNetwork;
115
119
  constructor(config: BaseConfig);
116
120
  private resolveDelegateConfig;
@@ -139,6 +143,7 @@ declare class SilentDataRollupBase {
139
143
  */
140
144
  protected signTypedDelegateHeader(provider: any, chainId: string, message: DelegateSignerMessage): Promise<string>;
141
145
  getDelegateHeaders(provider: any): Promise<DelegateHeaders>;
146
+ generateDelegateHeaders(provider: any): Promise<DelegateHeaders>;
142
147
  getAuthHeaders(provider: any, payload: JsonRpcPayload | JsonRpcPayload[]): Promise<AuthHeaders>;
143
148
  signAuthHeaderRawMessage(provider: any, payload: JsonRpcPayload | JsonRpcPayload[], timestamp: string, chainId: string): Promise<string>;
144
149
  signAuthHeaderTypedData(provider: any, payload: JsonRpcPayload | JsonRpcPayload[], timestamp: string, chainId: string): Promise<string>;
@@ -185,11 +190,7 @@ declare function getAuthEIP721Types(payload: JsonRpcPayload | JsonRpcPayload[]):
185
190
  type: string;
186
191
  }[];
187
192
  };
188
- declare function signAuthHeaderTypedData(signer: any, payload: JsonRpcPayload | JsonRpcPayload[], timestamp: string, chainId: string): Promise<string>;
189
- declare function signAuthHeaderRawMessage(signer: any, payload: JsonRpcPayload | JsonRpcPayload[], timestamp: string, chainId: string): Promise<string>;
190
- declare function signTypedDelegateHeader(signer: any, chainId: string, message: DelegateSignerMessage): Promise<any>;
191
- declare function signRawDelegateHeader(signer: any, message: string): Promise<string>;
192
- declare function getAuthHeaders(signer: Signer, payload: JsonRpcPayload | JsonRpcPayload[], signatureType: SignatureType): Promise<AuthHeaders>;
193
+ declare function getAuthHeaders(signer: Signer, payload: JsonRpcPayload | JsonRpcPayload[], chainId: string, signatureType: SignatureType): Promise<AuthHeaders>;
193
194
  /**
194
195
  * Determines if a given JSON-RPC payload represents a call to a contract method that requires signing.
195
196
  *
@@ -200,19 +201,17 @@ declare function getAuthHeaders(signer: Signer, payload: JsonRpcPayload | JsonRp
200
201
  * The function performs the following checks:
201
202
  * 1. Verifies if the payload is an `eth_call`.
202
203
  * 2. Extracts the method signature from the call data.
203
- * 3. Compares the signature against a provided list of methods requiring signing.
204
- * 4. Uses the contract's ABI to match the method signature with known methods.
204
+ * 3. Compares the signature against the list of contracts and their methods requiring signing.
205
+ * 4. Uses each contract's ABI to match the method signature with known methods.
205
206
  *
206
207
  * By accurately identifying these calls, we can add appropriate authentication headers
207
208
  * to the request, enabling the smart contract to verify the caller's identity.
208
209
  *
209
210
  * @param payload - The JSON-RPC payload to analyze.
210
- * @param contractMethodsToSign - An array of method names that require signing.
211
- * @param contract - The contract instance containing the ABI information.
211
+ * @param contracts - An array of contract information containing contracts and their methods to sign.
212
212
  * @returns {boolean} True if the call is to a method that requires signing, false otherwise.
213
- * @throws {Error} If contractMethodsToSign or contract is not provided.
214
213
  */
215
- declare function isSignableContractCall(payload: JsonRpcPayload, contractMethodsToSign?: string[], contract?: Contract | null): boolean;
214
+ declare function isSignableContractCall(payload: JsonRpcPayload, contracts: ContractInfo[]): boolean;
216
215
  declare const defaultGetDelegate: (provider: any) => Promise<Signer>;
217
216
  declare const prepareTypedDataPayload: (p: JsonRpcPayload) => AuthSignatureMessageRequest;
218
217
 
@@ -242,4 +241,4 @@ interface PrivateEvent {
242
241
  */
243
242
  declare function calculateEventTypeHash(eventSignature: string): string;
244
243
 
245
- export { type AuthHeaders, type AuthSignatureMessage, type AuthSignatureMessageRequest, type BaseConfig, ChainId, DEBUG_NAMESPACE, DEBUG_NAMESPACE_SILENTDATA_INTERCEPTOR, DEFAULT_DELEGATE_EXPIRES, DELEGATE_EXPIRATION_THRESHOLD_BUFFER, type DelegateConfig, type DelegateHeaders, type DelegateSignerMessage, HEADER_DELEGATE, HEADER_DELEGATE_SIGNATURE, HEADER_EIP712_DELEGATE_SIGNATURE, HEADER_EIP712_SIGNATURE, HEADER_SIGNATURE, HEADER_TIMESTAMP, NetworkName, PRIVATE_EVENT_SIGNATURE, PRIVATE_EVENT_SIGNATURE_HASH, type PrivateEvent, SIGN_RPC_METHODS, SignatureType, type SilentDataProviderOptions, SilentDataRollupBase, SilentDataRollupContract, type SilentDataRollupContractConfig, type SilentdataNetworkConfig, WHITELISTED_METHODS, calculateEventTypeHash, defaultGetDelegate, delegateEIP721Types, eip721Domain, getAuthEIP721Types, getAuthHeaders, isSignableContractCall, prepareTypedDataPayload, signAuthHeaderRawMessage, signAuthHeaderTypedData, signRawDelegateHeader, signTypedDelegateHeader };
244
+ export { type AuthHeaders, type AuthSignatureMessage, type AuthSignatureMessageRequest, type BaseConfig, ChainId, type ContractInfo, DEBUG_NAMESPACE, DEBUG_NAMESPACE_SILENTDATA_INTERCEPTOR, DEFAULT_DELEGATE_EXPIRES, DELEGATE_EXPIRATION_THRESHOLD_BUFFER, type DelegateConfig, type DelegateHeaders, type DelegateSignerMessage, HEADER_DELEGATE, HEADER_DELEGATE_SIGNATURE, HEADER_EIP712_DELEGATE_SIGNATURE, HEADER_EIP712_SIGNATURE, HEADER_SIGNATURE, HEADER_TIMESTAMP, NetworkName, PRIVATE_EVENT_SIGNATURE, PRIVATE_EVENT_SIGNATURE_HASH, type PrivateEvent, SIGN_RPC_METHODS, SignatureType, type SilentDataProviderOptions, SilentDataRollupBase, SilentDataRollupContract, type SilentDataRollupContractConfig, type SilentdataNetworkConfig, WHITELISTED_METHODS, calculateEventTypeHash, defaultGetDelegate, delegateEIP721Types, eip721Domain, getAuthEIP721Types, getAuthHeaders, isSignableContractCall, prepareTypedDataPayload };
package/dist/index.js CHANGED
@@ -56,11 +56,7 @@ __export(index_exports, {
56
56
  getAuthEIP721Types: () => getAuthEIP721Types,
57
57
  getAuthHeaders: () => getAuthHeaders,
58
58
  isSignableContractCall: () => isSignableContractCall,
59
- prepareTypedDataPayload: () => prepareTypedDataPayload,
60
- signAuthHeaderRawMessage: () => signAuthHeaderRawMessage,
61
- signAuthHeaderTypedData: () => signAuthHeaderTypedData,
62
- signRawDelegateHeader: () => signRawDelegateHeader,
63
- signTypedDelegateHeader: () => signTypedDelegateHeader
59
+ prepareTypedDataPayload: () => prepareTypedDataPayload
64
60
  });
65
61
  module.exports = __toCommonJS(index_exports);
66
62
 
@@ -209,28 +205,11 @@ async function signAuthHeaderRawMessage(signer, payload, timestamp, chainId) {
209
205
  log("Raw signature generated:", signature);
210
206
  return signature;
211
207
  }
212
- async function signTypedDelegateHeader(signer, chainId, message) {
213
- log("Signing typed delegate header", { chainId, message });
214
- const signature = await signer.signTypedData(
215
- { ...eip721Domain, chainId },
216
- delegateEIP721Types,
217
- message
218
- );
219
- log("Signature generated:", signature);
220
- return signature;
221
- }
222
- async function signRawDelegateHeader(signer, message) {
223
- log("Signing raw delegate header", message);
224
- const signature = await signer.signMessage(message);
225
- log("Raw signature generated:", signature);
226
- return signature;
227
- }
228
- async function getAuthHeaders(signer, payload, signatureType) {
208
+ async function getAuthHeaders(signer, payload, chainId, signatureType) {
229
209
  const xTimestamp = (/* @__PURE__ */ new Date()).toISOString();
230
210
  const headers = {
231
211
  [HEADER_TIMESTAMP]: xTimestamp
232
212
  };
233
- const chainId = (await signer.provider.getNetwork()).chainId.toString();
234
213
  switch (signatureType) {
235
214
  case "RAW" /* Raw */:
236
215
  log("Generating raw signature");
@@ -255,12 +234,11 @@ async function getAuthHeaders(signer, payload, signatureType) {
255
234
  }
256
235
  return headers;
257
236
  }
258
- function isSignableContractCall(payload, contractMethodsToSign, contract) {
259
- if (!contractMethodsToSign || !contract) {
237
+ function isSignableContractCall(payload, contracts) {
238
+ if (!contracts || contracts.length === 0) {
260
239
  return false;
261
240
  }
262
241
  log("Checking if contract call is signable");
263
- log("Contract methods to sign:", contractMethodsToSign);
264
242
  if (payload.method !== "eth_call") {
265
243
  log("Payload method is not eth_call, returning false");
266
244
  return false;
@@ -270,8 +248,31 @@ function isSignableContractCall(payload, contractMethodsToSign, contract) {
270
248
  log("Invalid params, returning false");
271
249
  return false;
272
250
  }
273
- const methodSignature = params[0].data.slice(2, 10);
274
- log("Method signature:", methodSignature);
251
+ const callTarget = params[0].to;
252
+ if (!callTarget) {
253
+ log("Missing call target, returning false");
254
+ return false;
255
+ }
256
+ log(`Call target: ${callTarget}`);
257
+ const contractIndex = contracts.findIndex(
258
+ (c) => c.contract.target.toString().toLowerCase() === callTarget.toLowerCase()
259
+ );
260
+ if (contractIndex < 0) {
261
+ log("Contract not found, returning false");
262
+ return false;
263
+ }
264
+ const callData = params[0].data;
265
+ if (!callData) {
266
+ log("Missing call data, returning false");
267
+ return false;
268
+ }
269
+ const methodSignature = callData.slice(2, 10);
270
+ if (!methodSignature) {
271
+ log("Missing method signature, returning false");
272
+ return false;
273
+ }
274
+ log(`Method signature: ${methodSignature}`);
275
+ const { contract, contractMethodsToSign } = contracts[contractIndex];
275
276
  const isSignable = contractMethodsToSign.some((methodName) => {
276
277
  const fragment = contract.interface.getFunction(methodName);
277
278
  return !!fragment && methodSignature.startsWith(fragment.selector.slice(2));
@@ -295,8 +296,8 @@ var SilentDataRollupBase = class {
295
296
  this.delegateSignerExpires = 0;
296
297
  this.cachedDelegateHeaders = null;
297
298
  this.cachedHeadersExpiry = 0;
298
- this.contract = null;
299
- this.contractMethodsToSign = [];
299
+ this.delegateHeadersPromise = null;
300
+ this.contracts = [];
300
301
  this._cachedNetwork = null;
301
302
  this.config = {
302
303
  ...config,
@@ -418,6 +419,22 @@ var SilentDataRollupBase = class {
418
419
  }
419
420
  async getDelegateHeaders(provider) {
420
421
  log2("Getting delegate headers");
422
+ if (!this.delegateHeadersPromise) {
423
+ this.delegateHeadersPromise = this.generateDelegateHeaders(provider);
424
+ }
425
+ const currentPromise = this.delegateHeadersPromise;
426
+ try {
427
+ return await currentPromise;
428
+ } catch (error) {
429
+ log2("Error getting delegate headers:", error);
430
+ throw new Error("Failed to get delegate headers");
431
+ } finally {
432
+ if (this.delegateHeadersPromise === currentPromise) {
433
+ this.delegateHeadersPromise = null;
434
+ }
435
+ }
436
+ }
437
+ async generateDelegateHeaders(provider) {
421
438
  const now = Math.floor(Date.now() / 1e3);
422
439
  const signatureType = this.config.authSignatureType;
423
440
  const isCachedHeadersValid = this.cachedDelegateHeaders && this.cachedHeadersExpiry - DELEGATE_EXPIRATION_THRESHOLD_BUFFER > now;
@@ -546,8 +563,10 @@ var SilentDataRollupBase = class {
546
563
  }
547
564
  setContract(contract, contractMethodsToSign) {
548
565
  log2("Setting contract and methods to sign: ", contractMethodsToSign);
549
- this.contract = contract;
550
- this.contractMethodsToSign = contractMethodsToSign;
566
+ this.contracts.push({
567
+ contract,
568
+ contractMethodsToSign
569
+ });
551
570
  }
552
571
  /**
553
572
  * Prepares the message to be signed for the x-signature header.
@@ -666,9 +685,5 @@ function calculateEventTypeHash(eventSignature) {
666
685
  getAuthEIP721Types,
667
686
  getAuthHeaders,
668
687
  isSignableContractCall,
669
- prepareTypedDataPayload,
670
- signAuthHeaderRawMessage,
671
- signAuthHeaderTypedData,
672
- signRawDelegateHeader,
673
- signTypedDelegateHeader
688
+ prepareTypedDataPayload
674
689
  });
package/dist/index.mjs CHANGED
@@ -25,12 +25,8 @@ import {
25
25
  getAuthEIP721Types,
26
26
  getAuthHeaders,
27
27
  isSignableContractCall,
28
- prepareTypedDataPayload,
29
- signAuthHeaderRawMessage,
30
- signAuthHeaderTypedData,
31
- signRawDelegateHeader,
32
- signTypedDelegateHeader
33
- } from "./chunk-CH35C5Q7.mjs";
28
+ prepareTypedDataPayload
29
+ } from "./chunk-PTTWND7Y.mjs";
34
30
  export {
35
31
  ChainId,
36
32
  DEBUG_NAMESPACE,
@@ -58,9 +54,5 @@ export {
58
54
  getAuthEIP721Types,
59
55
  getAuthHeaders,
60
56
  isSignableContractCall,
61
- prepareTypedDataPayload,
62
- signAuthHeaderRawMessage,
63
- signAuthHeaderTypedData,
64
- signRawDelegateHeader,
65
- signTypedDelegateHeader
57
+ prepareTypedDataPayload
66
58
  };
package/dist/tests.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import "./chunk-CH35C5Q7.mjs";
1
+ import "./chunk-PTTWND7Y.mjs";
2
2
 
3
3
  // tests/utils/mocked-custom-grpc.ts
4
4
  import http from "http";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@appliedblockchain/silentdatarollup-core",
3
- "version": "1.0.4",
3
+ "version": "1.0.5",
4
4
  "description": "Core library for Silent Data [Rollup]",
5
5
  "author": "Applied Blockchain",
6
6
  "homepage": "https://github.com/appliedblockchain/silent-data-rollup-providers#readme",