@0xsequence/dapp-client 3.0.0-beta.10 → 3.0.0-beta.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +2 -2
- package/CHANGELOG.md +22 -0
- package/dist/ChainSessionManager.d.ts +3 -0
- package/dist/ChainSessionManager.d.ts.map +1 -1
- package/dist/ChainSessionManager.js +45 -15
- package/dist/DappTransport.d.ts.map +1 -1
- package/dist/DappTransport.js +1 -2
- package/package.json +5 -5
- package/src/ChainSessionManager.ts +52 -14
- package/src/DappTransport.ts +1 -4
package/.turbo/turbo-build.log
CHANGED
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,27 @@
|
|
|
1
1
|
# @0xsequence/dapp-client
|
|
2
2
|
|
|
3
|
+
## 3.0.0-beta.12
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Beta release with dapp connector fixes
|
|
8
|
+
- Updated dependencies
|
|
9
|
+
- @0xsequence/guard@3.0.0-beta.12
|
|
10
|
+
- @0xsequence/relayer@3.0.0-beta.12
|
|
11
|
+
- @0xsequence/wallet-core@3.0.0-beta.12
|
|
12
|
+
- @0xsequence/wallet-primitives@3.0.0-beta.12
|
|
13
|
+
|
|
14
|
+
## 3.0.0-beta.11
|
|
15
|
+
|
|
16
|
+
### Patch Changes
|
|
17
|
+
|
|
18
|
+
- 3.0.0 beta
|
|
19
|
+
- Updated dependencies
|
|
20
|
+
- @0xsequence/guard@3.0.0-beta.11
|
|
21
|
+
- @0xsequence/relayer@3.0.0-beta.11
|
|
22
|
+
- @0xsequence/wallet-core@3.0.0-beta.11
|
|
23
|
+
- @0xsequence/wallet-primitives@3.0.0-beta.11
|
|
24
|
+
|
|
3
25
|
## 3.0.0-beta.10
|
|
4
26
|
|
|
5
27
|
### Patch Changes
|
|
@@ -31,6 +31,7 @@ export declare class ChainSessionManager {
|
|
|
31
31
|
loginMethod: LoginMethod | null;
|
|
32
32
|
userEmail: string | null;
|
|
33
33
|
private guard?;
|
|
34
|
+
private lastSignedCallCache?;
|
|
34
35
|
/**
|
|
35
36
|
* @param chainId The ID of the chain this manager is responsible for.
|
|
36
37
|
* @param keyMachineUrl The URL of the key management service.
|
|
@@ -206,6 +207,8 @@ export declare class ChainSessionManager {
|
|
|
206
207
|
* @private Resets the internal state and clears all persisted session data from storage.
|
|
207
208
|
*/
|
|
208
209
|
private _resetStateAndClearCredentials;
|
|
210
|
+
private _getCachedSignedCall;
|
|
211
|
+
private _fingerprintCalls;
|
|
209
212
|
}
|
|
210
213
|
export {};
|
|
211
214
|
//# sourceMappingURL=ChainSessionManager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChainSessionManager.d.ts","sourceRoot":"","sources":["../src/ChainSessionManager.ts"],"names":[],"mappings":"AACA,OAAO,EAAe,OAAO,EAAE,GAAG,EAAqC,MAAM,IAAI,CAAA;AAcjF,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAWlD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAGpD,OAAO,EAEL,4BAA4B,EAC5B,WAAW,EACX,kBAAkB,EAElB,WAAW,EAEX,WAAW,EAKX,SAAS,EAGV,MAAM,kBAAkB,CAAA;AAEzB,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAA;AAGpF,UAAU,2BAA2B;IACnC,uBAAuB,EAAE,4BAA4B,CAAA;CACtD;AAED;;;GAGG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAQ;IAEnC,OAAO,CAAC,aAAa,CAAgB;IAErC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAQ;IACpC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAoB;IAEvD,OAAO,CAAC,cAAc,CAEhB;IAEN,OAAO,CAAC,gBAAgB,CAAwB;IAChD,OAAO,CAAC,eAAe,CAA+B;IAEtD,OAAO,CAAC,aAAa,CAA+B;IACpD,OAAO,CAAC,cAAc,CAAsC;IAC5D,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,QAAQ,CAAiC;IACjD,OAAO,CAAC,OAAO,CAAoB;IACnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAQ;IACzB,SAAS,EAAE,aAAa,GAAG,IAAI,CAAO;IAC7C,OAAO,CAAC,eAAe,CAAiB;IACjC,aAAa,EAAE,OAAO,CAAQ;IACrC,OAAO,CAAC,cAAc,CAAiB;IAChC,WAAW,EAAE,WAAW,GAAG,IAAI,CAAO;IACtC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAO;IACtC,OAAO,CAAC,KAAK,CAAC,CAAa;
|
|
1
|
+
{"version":3,"file":"ChainSessionManager.d.ts","sourceRoot":"","sources":["../src/ChainSessionManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -31,6 +31,7 @@ export class ChainSessionManager {
|
|
|
31
31
|
loginMethod = null;
|
|
32
32
|
userEmail = null;
|
|
33
33
|
guard;
|
|
34
|
+
lastSignedCallCache;
|
|
34
35
|
/**
|
|
35
36
|
* @param chainId The ID of the chain this manager is responsible for.
|
|
36
37
|
* @param keyMachineUrl The URL of the key management service.
|
|
@@ -575,20 +576,6 @@ export class ChainSessionManager {
|
|
|
575
576
|
return true;
|
|
576
577
|
}
|
|
577
578
|
catch (error) {
|
|
578
|
-
if (error instanceof Error && error.message.includes('Signer supporting call is expired')) {
|
|
579
|
-
// Extract the expired signer address from the message with address regex
|
|
580
|
-
const expiredSignerAddress = error.message.match(/(0x[0-9a-fA-F]{40})/)?.[1];
|
|
581
|
-
if (expiredSignerAddress) {
|
|
582
|
-
// Refresh the session
|
|
583
|
-
await this._refreshExplicitSession(Address.from(expiredSignerAddress));
|
|
584
|
-
// Retry the permission check
|
|
585
|
-
return this.hasPermission(transactions);
|
|
586
|
-
}
|
|
587
|
-
else {
|
|
588
|
-
// Could not parse error message. Rethrow as this shouldn't happen.
|
|
589
|
-
throw error;
|
|
590
|
-
}
|
|
591
|
-
}
|
|
592
579
|
// An error from findSignersForCalls indicates a permission failure.
|
|
593
580
|
console.warn(`Permission check failed for chain ${this.chainId}:`, error instanceof Error ? error.message : String(error));
|
|
594
581
|
return false;
|
|
@@ -612,6 +599,14 @@ export class ChainSessionManager {
|
|
|
612
599
|
}));
|
|
613
600
|
try {
|
|
614
601
|
const signedCall = await this._buildAndSignCalls(callsToSend);
|
|
602
|
+
const fingerprint = this._fingerprintCalls(callsToSend);
|
|
603
|
+
if (fingerprint) {
|
|
604
|
+
this.lastSignedCallCache = {
|
|
605
|
+
fingerprint,
|
|
606
|
+
signedCall,
|
|
607
|
+
createdAtMs: Date.now(),
|
|
608
|
+
};
|
|
609
|
+
}
|
|
615
610
|
const feeOptions = await this.relayer.feeOptions(signedCall.to, this.chainId, callsToSend);
|
|
616
611
|
return feeOptions.options;
|
|
617
612
|
}
|
|
@@ -668,7 +663,7 @@ export class ChainSessionManager {
|
|
|
668
663
|
callsToSend.unshift(transferCall);
|
|
669
664
|
}
|
|
670
665
|
}
|
|
671
|
-
const signedCalls = await this._buildAndSignCalls(callsToSend);
|
|
666
|
+
const signedCalls = this._getCachedSignedCall(callsToSend) ?? (await this._buildAndSignCalls(callsToSend));
|
|
672
667
|
const hash = await this.relayer.relay(signedCalls.to, signedCalls.data, this.chainId);
|
|
673
668
|
const status = await this._waitForTransactionReceipt(hash.opHash, this.chainId);
|
|
674
669
|
if (status.status === 'confirmed') {
|
|
@@ -838,4 +833,39 @@ export class ChainSessionManager {
|
|
|
838
833
|
await this.sequenceStorage.clearExplicitSessions();
|
|
839
834
|
await this.sequenceStorage.clearSessionlessConnection();
|
|
840
835
|
}
|
|
836
|
+
_getCachedSignedCall(calls) {
|
|
837
|
+
if (!this.lastSignedCallCache) {
|
|
838
|
+
return null;
|
|
839
|
+
}
|
|
840
|
+
const ttlMs = 30_000;
|
|
841
|
+
if (Date.now() - this.lastSignedCallCache.createdAtMs > ttlMs) {
|
|
842
|
+
this.lastSignedCallCache = undefined;
|
|
843
|
+
return null;
|
|
844
|
+
}
|
|
845
|
+
const fingerprint = this._fingerprintCalls(calls);
|
|
846
|
+
if (!fingerprint) {
|
|
847
|
+
return null;
|
|
848
|
+
}
|
|
849
|
+
if (fingerprint !== this.lastSignedCallCache.fingerprint) {
|
|
850
|
+
return null;
|
|
851
|
+
}
|
|
852
|
+
return this.lastSignedCallCache.signedCall;
|
|
853
|
+
}
|
|
854
|
+
_fingerprintCalls(calls) {
|
|
855
|
+
try {
|
|
856
|
+
return JSON.stringify(calls.map((call) => ({
|
|
857
|
+
to: call.to,
|
|
858
|
+
value: call.value?.toString() ?? '0',
|
|
859
|
+
data: call.data ?? '0x',
|
|
860
|
+
gasLimit: call.gasLimit?.toString() ?? '0',
|
|
861
|
+
delegateCall: call.delegateCall ?? false,
|
|
862
|
+
onlyFallback: call.onlyFallback ?? false,
|
|
863
|
+
behaviorOnError: call.behaviorOnError ?? 'revert',
|
|
864
|
+
})));
|
|
865
|
+
}
|
|
866
|
+
catch (error) {
|
|
867
|
+
console.warn('ChainSessionManager._fingerprintCalls failed:', error);
|
|
868
|
+
return null;
|
|
869
|
+
}
|
|
870
|
+
}
|
|
841
871
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DappTransport.d.ts","sourceRoot":"","sources":["../src/DappTransport.ts"],"names":[],"mappings":"AAGA,OAAO,EAGL,gBAAgB,EAChB,kBAAkB,EAClB,sBAAsB,EAEtB,aAAa,EAEd,MAAM,kBAAkB,CAAA;AAgCzB,qBAAa,aAAa;aAqBN,SAAS,EAAE,MAAM;IACjC,QAAQ,CAAC,IAAI,EAAE,aAAa;IArB9B,OAAO,CAAC,YAAY,CAAgC;IACpD,OAAO,CAAC,eAAe,CAAgD;IACvE,OAAO,CAAC,YAAY,CAAuC;IAC3D,OAAO,CAAC,mBAAmB,CAAsC;IACjE,OAAO,CAAC,kBAAkB,CAAkD;IAC5E,OAAO,CAAC,MAAM,CAAgC;IAC9C,OAAO,CAAC,kBAAkB,CAAgC;IAC1D,OAAO,CAAC,oBAAoB,CAAgC;IAC5D,OAAO,CAAC,SAAS,CAAgC;IACjD,OAAO,CAAC,eAAe,CAAoC;IAC3D,OAAO,CAAC,YAAY,CAAyB;IAC7C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAQ;IACzC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAQ;IAC3C,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAwB;IAC/D,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAuB;IAC9D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IAEnC,SAAgB,YAAY,EAAE,MAAM,CAAA;gBAGlB,SAAS,EAAE,MAAM,EACxB,IAAI,GAAE,aAAmC,EAClD,gBAAgB,GAAE,gBAAqB,EACvC,sBAAsB,CAAC,EAAE,sBAAsB,EAC/C,qBAAqB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI;IAwC/C,IAAI,YAAY,IAAI,OAAO,CAG1B;IAED,IAAI,OAAO,IAAI,OAAO,CAGrB;IAEK,WAAW,CAAC,SAAS,GAAG,GAAG,EAAE,QAAQ,GAAG,GAAG,EAC/C,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,QAAQ,EAClB,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,SAAS,CAAC;IAoDR,qBAAqB,CAChC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,GAAG,EACZ,WAAW,EAAE,MAAM,EACnB,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,MAAM,CAAC;IAuBL,mBAAmB,CAAC,SAAS,GAAG,GAAG,EAC9C,UAAU,GAAE,OAAc,EAC1B,GAAG,CAAC,EAAE,MAAM,GACX,OAAO,CAAC;QAAE,OAAO,EAAE,SAAS,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,KAAK,EAAE,GAAG,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IA4EnF,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgExC,WAAW,IAAI,IAAI;IAgB1B,OAAO,IAAI,IAAI;IAYf,OAAO,CAAC,aAAa,
|
|
1
|
+
{"version":3,"file":"DappTransport.d.ts","sourceRoot":"","sources":["../src/DappTransport.ts"],"names":[],"mappings":"AAGA,OAAO,EAGL,gBAAgB,EAChB,kBAAkB,EAClB,sBAAsB,EAEtB,aAAa,EAEd,MAAM,kBAAkB,CAAA;AAgCzB,qBAAa,aAAa;aAqBN,SAAS,EAAE,MAAM;IACjC,QAAQ,CAAC,IAAI,EAAE,aAAa;IArB9B,OAAO,CAAC,YAAY,CAAgC;IACpD,OAAO,CAAC,eAAe,CAAgD;IACvE,OAAO,CAAC,YAAY,CAAuC;IAC3D,OAAO,CAAC,mBAAmB,CAAsC;IACjE,OAAO,CAAC,kBAAkB,CAAkD;IAC5E,OAAO,CAAC,MAAM,CAAgC;IAC9C,OAAO,CAAC,kBAAkB,CAAgC;IAC1D,OAAO,CAAC,oBAAoB,CAAgC;IAC5D,OAAO,CAAC,SAAS,CAAgC;IACjD,OAAO,CAAC,eAAe,CAAoC;IAC3D,OAAO,CAAC,YAAY,CAAyB;IAC7C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAQ;IACzC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAQ;IAC3C,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAwB;IAC/D,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAuB;IAC9D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IAEnC,SAAgB,YAAY,EAAE,MAAM,CAAA;gBAGlB,SAAS,EAAE,MAAM,EACxB,IAAI,GAAE,aAAmC,EAClD,gBAAgB,GAAE,gBAAqB,EACvC,sBAAsB,CAAC,EAAE,sBAAsB,EAC/C,qBAAqB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI;IAwC/C,IAAI,YAAY,IAAI,OAAO,CAG1B;IAED,IAAI,OAAO,IAAI,OAAO,CAGrB;IAEK,WAAW,CAAC,SAAS,GAAG,GAAG,EAAE,QAAQ,GAAG,GAAG,EAC/C,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,QAAQ,EAClB,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,SAAS,CAAC;IAoDR,qBAAqB,CAChC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,GAAG,EACZ,WAAW,EAAE,MAAM,EACnB,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,MAAM,CAAC;IAuBL,mBAAmB,CAAC,SAAS,GAAG,GAAG,EAC9C,UAAU,GAAE,OAAc,EAC1B,GAAG,CAAC,EAAE,MAAM,GACX,OAAO,CAAC;QAAE,OAAO,EAAE,SAAS,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,KAAK,EAAE,GAAG,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IA4EnF,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgExC,WAAW,IAAI,IAAI;IAgB1B,OAAO,IAAI,IAAI;IAYf,OAAO,CAAC,aAAa,CAoCpB;IAED,OAAO,CAAC,wBAAwB;IAiChC,OAAO,CAAC,qBAAqB;IAc7B,OAAO,CAAC,mBAAmB;IAkD3B,OAAO,CAAC,gBAAgB;IAiBxB,OAAO,CAAC,2BAA2B;IAInC,OAAO,CAAC,sBAAsB;IAO9B,OAAO,CAAC,oBAAoB;IAY5B,OAAO,CAAC,aAAa;IAWrB,OAAO,CAAC,UAAU;CAGnB"}
|
package/dist/DappTransport.js
CHANGED
|
@@ -318,8 +318,7 @@ export class DappTransport {
|
|
|
318
318
|
if (event.origin !== this.walletOrigin) {
|
|
319
319
|
return;
|
|
320
320
|
}
|
|
321
|
-
|
|
322
|
-
if (!isPotentiallyValidSource && event.data?.type !== MessageType.WALLET_OPENED) {
|
|
321
|
+
if (!this.walletWindow || event.source !== this.walletWindow) {
|
|
323
322
|
return;
|
|
324
323
|
}
|
|
325
324
|
const message = event.data;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@0xsequence/dapp-client",
|
|
3
|
-
"version": "3.0.0-beta.
|
|
3
|
+
"version": "3.0.0-beta.12",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"publishConfig": {
|
|
@@ -25,10 +25,10 @@
|
|
|
25
25
|
},
|
|
26
26
|
"dependencies": {
|
|
27
27
|
"ox": "^0.9.17",
|
|
28
|
-
"@0xsequence/guard": "^3.0.0-beta.
|
|
29
|
-
"@0xsequence/relayer": "^3.0.0-beta.
|
|
30
|
-
"@0xsequence/wallet-primitives": "^3.0.0-beta.
|
|
31
|
-
"@0xsequence/wallet-core": "^3.0.0-beta.
|
|
28
|
+
"@0xsequence/guard": "^3.0.0-beta.12",
|
|
29
|
+
"@0xsequence/relayer": "^3.0.0-beta.12",
|
|
30
|
+
"@0xsequence/wallet-primitives": "^3.0.0-beta.12",
|
|
31
|
+
"@0xsequence/wallet-core": "^3.0.0-beta.12"
|
|
32
32
|
},
|
|
33
33
|
"scripts": {
|
|
34
34
|
"build": "tsc",
|
|
@@ -84,6 +84,11 @@ export class ChainSessionManager {
|
|
|
84
84
|
public loginMethod: LoginMethod | null = null
|
|
85
85
|
public userEmail: string | null = null
|
|
86
86
|
private guard?: GuardConfig
|
|
87
|
+
private lastSignedCallCache?: {
|
|
88
|
+
fingerprint: string
|
|
89
|
+
signedCall: { to: Address.Address; data: Hex.Hex }
|
|
90
|
+
createdAtMs: number
|
|
91
|
+
}
|
|
87
92
|
|
|
88
93
|
/**
|
|
89
94
|
* @param chainId The ID of the chain this manager is responsible for.
|
|
@@ -811,19 +816,6 @@ export class ChainSessionManager {
|
|
|
811
816
|
await this.sessionManager.findSignersForCalls(this.wallet.address, this.chainId, calls)
|
|
812
817
|
return true
|
|
813
818
|
} catch (error) {
|
|
814
|
-
if (error instanceof Error && error.message.includes('Signer supporting call is expired')) {
|
|
815
|
-
// Extract the expired signer address from the message with address regex
|
|
816
|
-
const expiredSignerAddress = error.message.match(/(0x[0-9a-fA-F]{40})/)?.[1]
|
|
817
|
-
if (expiredSignerAddress) {
|
|
818
|
-
// Refresh the session
|
|
819
|
-
await this._refreshExplicitSession(Address.from(expiredSignerAddress))
|
|
820
|
-
// Retry the permission check
|
|
821
|
-
return this.hasPermission(transactions)
|
|
822
|
-
} else {
|
|
823
|
-
// Could not parse error message. Rethrow as this shouldn't happen.
|
|
824
|
-
throw error
|
|
825
|
-
}
|
|
826
|
-
}
|
|
827
819
|
// An error from findSignersForCalls indicates a permission failure.
|
|
828
820
|
console.warn(
|
|
829
821
|
`Permission check failed for chain ${this.chainId}:`,
|
|
@@ -851,6 +843,14 @@ export class ChainSessionManager {
|
|
|
851
843
|
}))
|
|
852
844
|
try {
|
|
853
845
|
const signedCall = await this._buildAndSignCalls(callsToSend)
|
|
846
|
+
const fingerprint = this._fingerprintCalls(callsToSend)
|
|
847
|
+
if (fingerprint) {
|
|
848
|
+
this.lastSignedCallCache = {
|
|
849
|
+
fingerprint,
|
|
850
|
+
signedCall,
|
|
851
|
+
createdAtMs: Date.now(),
|
|
852
|
+
}
|
|
853
|
+
}
|
|
854
854
|
const feeOptions = await this.relayer.feeOptions(signedCall.to, this.chainId, callsToSend)
|
|
855
855
|
return feeOptions.options
|
|
856
856
|
} catch (err) {
|
|
@@ -907,7 +907,7 @@ export class ChainSessionManager {
|
|
|
907
907
|
callsToSend.unshift(transferCall)
|
|
908
908
|
}
|
|
909
909
|
}
|
|
910
|
-
const signedCalls = await this._buildAndSignCalls(callsToSend)
|
|
910
|
+
const signedCalls = this._getCachedSignedCall(callsToSend) ?? (await this._buildAndSignCalls(callsToSend))
|
|
911
911
|
const hash = await this.relayer.relay(signedCalls.to, signedCalls.data, this.chainId)
|
|
912
912
|
const status = await this._waitForTransactionReceipt(hash.opHash, this.chainId)
|
|
913
913
|
if (status.status === 'confirmed') {
|
|
@@ -1101,4 +1101,42 @@ export class ChainSessionManager {
|
|
|
1101
1101
|
await this.sequenceStorage.clearExplicitSessions()
|
|
1102
1102
|
await this.sequenceStorage.clearSessionlessConnection()
|
|
1103
1103
|
}
|
|
1104
|
+
|
|
1105
|
+
private _getCachedSignedCall(calls: Payload.Call[]): { to: Address.Address; data: Hex.Hex } | null {
|
|
1106
|
+
if (!this.lastSignedCallCache) {
|
|
1107
|
+
return null
|
|
1108
|
+
}
|
|
1109
|
+
const ttlMs = 30_000
|
|
1110
|
+
if (Date.now() - this.lastSignedCallCache.createdAtMs > ttlMs) {
|
|
1111
|
+
this.lastSignedCallCache = undefined
|
|
1112
|
+
return null
|
|
1113
|
+
}
|
|
1114
|
+
const fingerprint = this._fingerprintCalls(calls)
|
|
1115
|
+
if (!fingerprint) {
|
|
1116
|
+
return null
|
|
1117
|
+
}
|
|
1118
|
+
if (fingerprint !== this.lastSignedCallCache.fingerprint) {
|
|
1119
|
+
return null
|
|
1120
|
+
}
|
|
1121
|
+
return this.lastSignedCallCache.signedCall
|
|
1122
|
+
}
|
|
1123
|
+
|
|
1124
|
+
private _fingerprintCalls(calls: Payload.Call[]): string | null {
|
|
1125
|
+
try {
|
|
1126
|
+
return JSON.stringify(
|
|
1127
|
+
calls.map((call) => ({
|
|
1128
|
+
to: call.to,
|
|
1129
|
+
value: call.value?.toString() ?? '0',
|
|
1130
|
+
data: call.data ?? '0x',
|
|
1131
|
+
gasLimit: call.gasLimit?.toString() ?? '0',
|
|
1132
|
+
delegateCall: call.delegateCall ?? false,
|
|
1133
|
+
onlyFallback: call.onlyFallback ?? false,
|
|
1134
|
+
behaviorOnError: call.behaviorOnError ?? 'revert',
|
|
1135
|
+
})),
|
|
1136
|
+
)
|
|
1137
|
+
} catch (error) {
|
|
1138
|
+
console.warn('ChainSessionManager._fingerprintCalls failed:', error)
|
|
1139
|
+
return null
|
|
1140
|
+
}
|
|
1141
|
+
}
|
|
1104
1142
|
}
|
package/src/DappTransport.ts
CHANGED
|
@@ -378,10 +378,7 @@ export class DappTransport {
|
|
|
378
378
|
return
|
|
379
379
|
}
|
|
380
380
|
|
|
381
|
-
|
|
382
|
-
this.walletWindow && (event.source === this.walletWindow || !this.walletWindow.closed)
|
|
383
|
-
|
|
384
|
-
if (!isPotentiallyValidSource && event.data?.type !== MessageType.WALLET_OPENED) {
|
|
381
|
+
if (!this.walletWindow || event.source !== this.walletWindow) {
|
|
385
382
|
return
|
|
386
383
|
}
|
|
387
384
|
|