diff --git a/packages/core/src/types/wallet.ts b/packages/core/src/types/wallet.ts index a8cee4bcf..cb6751881 100644 --- a/packages/core/src/types/wallet.ts +++ b/packages/core/src/types/wallet.ts @@ -124,6 +124,15 @@ export interface SignOptions { readonly disableBalanceCheck?: boolean; } +export interface WCWalletOptions { + /** + * Expiry for WalletConnect signing requests, in seconds. + * Must be between 300 (5 minutes) and 604800 (7 days). + * @see https://specs.walletconnect.com/2.0/specs/clients/sign/rpc-methods#expiry-validation + */ + signingRequestExpiry?: number; +} + export type Algo = 'secp256k1' | 'eth_secp256k1'; export interface AccountData { /** A printable address (typically bech32 encoded) */ diff --git a/packages/core/src/wallets/wc-wallets/wc-cosmos-wallet.ts b/packages/core/src/wallets/wc-wallets/wc-cosmos-wallet.ts index accd5a572..a4d1de20d 100644 --- a/packages/core/src/wallets/wc-wallets/wc-cosmos-wallet.ts +++ b/packages/core/src/wallets/wc-wallets/wc-cosmos-wallet.ts @@ -119,7 +119,7 @@ export class WCCosmosWallet extends CosmosWallet implements IWCCommon { signerAddress: signer, signDoc, }, - }, `cosmos:${chainId}`); + }, `cosmos:${chainId}`, this.wcWallet?.options?.signingRequestExpiry); return result as AminoSignResponse; } catch (error) { @@ -152,7 +152,7 @@ export class WCCosmosWallet extends CosmosWallet implements IWCCommon { const result = await (this.provider.request({ method: 'cosmos_signDirect', params: signDocValue, - }, `cosmos:${chainId}`) as Promise); + }, `cosmos:${chainId}`, this.wcWallet?.options?.signingRequestExpiry) as Promise); return { signed: { diff --git a/packages/core/src/wallets/wc-wallets/wc-ethereum-wallet.ts b/packages/core/src/wallets/wc-wallets/wc-ethereum-wallet.ts index c69ed52b2..7890ac87a 100644 --- a/packages/core/src/wallets/wc-wallets/wc-ethereum-wallet.ts +++ b/packages/core/src/wallets/wc-wallets/wc-ethereum-wallet.ts @@ -109,7 +109,7 @@ export class WCEthereumWallet extends EthereumWallet implements IWCCommon { const result = await this.provider.request({ method: 'eth_sendTransaction', params: [transactionParameters] - }) as string; + }, undefined, this.wcWallet?.options?.signingRequestExpiry) as string; return result; } catch (error) { console.log('send transaction error:', error); @@ -126,7 +126,7 @@ export class WCEthereumWallet extends EthereumWallet implements IWCCommon { const result = await this.provider.request({ method: 'personal_sign', params: [message] - }) as string; + }, undefined, this.wcWallet?.options?.signingRequestExpiry) as string; return result; } catch (error) { console.log('sign message error:', error); diff --git a/packages/core/src/wallets/wc-wallets/wc-solana-wallet.ts b/packages/core/src/wallets/wc-wallets/wc-solana-wallet.ts index 62b8adc5d..5f6f46937 100644 --- a/packages/core/src/wallets/wc-wallets/wc-solana-wallet.ts +++ b/packages/core/src/wallets/wc-wallets/wc-solana-wallet.ts @@ -118,7 +118,7 @@ export class WCSolanaWallet extends SolanaWallet implements IWCCommon { const result = await this.provider.request({ method: 'solana_signAllTransactions', params: { transactions } - }) as any[]; + }, undefined, this.wcWallet?.options?.signingRequestExpiry) as any[]; return result; } catch (error) { console.log('sign all transactions error:', error); @@ -135,7 +135,7 @@ export class WCSolanaWallet extends SolanaWallet implements IWCCommon { const result = await this.provider.request({ method: 'solana_signAndSendAllTransactions', params: { transactions } - }); + }, undefined, this.wcWallet?.options?.signingRequestExpiry); return result; } catch (error) { console.log('sign and send all transactions error:', error); @@ -154,7 +154,7 @@ export class WCSolanaWallet extends SolanaWallet implements IWCCommon { params: { transaction: transaction.serialize({ verifySignatures: false }).toString('base64') } - }) as string; + }, undefined, this.wcWallet?.options?.signingRequestExpiry) as string; return result; } catch (error) { console.log('sign and send transaction error:', error); @@ -190,7 +190,7 @@ export class WCSolanaWallet extends SolanaWallet implements IWCCommon { const result = await this.provider.request({ method: 'solana_signMessage', params: { message: base58.encode(message), pubkey: address } - }) as Uint8Array; + }, undefined, this.wcWallet?.options?.signingRequestExpiry) as Uint8Array; return result; } catch (error) { console.log('sign message error:', error); @@ -217,7 +217,8 @@ export class WCSolanaWallet extends SolanaWallet implements IWCCommon { ...transaction, transaction: transaction.serialize({ verifySignatures: false }).toString('base64') } - } + }, + expiry: this.wcWallet?.options?.signingRequestExpiry, }); const account = await this.getAccount('solana'); diff --git a/packages/core/src/wallets/wc-wallets/wc-wallet.ts b/packages/core/src/wallets/wc-wallets/wc-wallet.ts index c978a92c5..bd50abb3c 100644 --- a/packages/core/src/wallets/wc-wallets/wc-wallet.ts +++ b/packages/core/src/wallets/wc-wallets/wc-wallet.ts @@ -8,7 +8,7 @@ import { fromByteArray, toByteArray } from 'base64-js'; import { BroadcastMode } from 'interchainjs'; import { WalletConnectIcon } from '../../constant'; -import { DirectSignDoc, SignType, Wallet, WalletAccount, WCDirectSignResponse, WcEventTypes, WcProviderEventType } from '../../types'; +import { DirectSignDoc, SignType, Wallet, WalletAccount, WCDirectSignResponse, WcEventTypes, WcProviderEventType, WCWalletOptions } from '../../types'; import { MultiChainWallet } from '../multichain-wallet'; import { isWCCommon } from './wc-common'; @@ -35,11 +35,13 @@ export class WCWallet extends MultiChainWallet { accountToRestore: WalletAccount | null = null; + options?: WCWalletOptions; + setAccountToRestore(account: WalletAccount) { this.accountToRestore = account; } - constructor(option?: Wallet, walletConnectOption?: SignClientTypes.Options) { + constructor(option?: Wallet, walletConnectOption?: SignClientTypes.Options, wcWalletOptions?: WCWalletOptions) { const defaultWalletConnectOption: Wallet = { name: 'WalletConnect', prettyName: 'Wallet Connect', @@ -50,6 +52,7 @@ export class WCWallet extends MultiChainWallet { super({ ...defaultWalletConnectOption, ...option }); this.walletConnectOption = walletConnectOption; + this.options = wcWalletOptions; } async init(): Promise { @@ -266,7 +269,7 @@ export class WCWallet extends MultiChainWallet { signerAddress: signer, signDoc, }, - }, `cosmos:${chainId}`); + }, `cosmos:${chainId}`, this.options?.signingRequestExpiry); return result as AminoSignResponse; } catch (error) { @@ -304,7 +307,7 @@ export class WCWallet extends MultiChainWallet { const result = await (this.provider.request({ method: 'cosmos_signDirect', params: signDocValue, - }, `cosmos:${chainId}`) as Promise); + }, `cosmos:${chainId}`, this.options?.signingRequestExpiry) as Promise); return { signed: {