@rango-dev/provider-walletconnect-2 0.57.0 → 0.57.1-next.0

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.
Files changed (122) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/dist/adapter/adapter.d.ts +39 -0
  3. package/dist/adapter/adapter.d.ts.map +1 -0
  4. package/dist/adapter/index.d.ts +3 -0
  5. package/dist/adapter/index.d.ts.map +1 -0
  6. package/dist/adapter/modal-cache.d.ts +14 -0
  7. package/dist/adapter/modal-cache.d.ts.map +1 -0
  8. package/dist/adapter/modal.d.ts +25 -0
  9. package/dist/adapter/modal.d.ts.map +1 -0
  10. package/dist/adapter/networks.d.ts +60 -0
  11. package/dist/adapter/networks.d.ts.map +1 -0
  12. package/dist/adapter/provider-client.d.ts +3 -0
  13. package/dist/adapter/provider-client.d.ts.map +1 -0
  14. package/dist/adapter/registry.d.ts +4 -0
  15. package/dist/adapter/registry.d.ts.map +1 -0
  16. package/dist/adapter/session-cache.d.ts +17 -0
  17. package/dist/adapter/session-cache.d.ts.map +1 -0
  18. package/dist/adapter/task-queue.d.ts +11 -0
  19. package/dist/adapter/task-queue.d.ts.map +1 -0
  20. package/dist/chunk-GEAT645O.js +2 -0
  21. package/dist/chunk-GEAT645O.js.map +7 -0
  22. package/dist/constants.d.ts +4 -48
  23. package/dist/constants.d.ts.map +1 -0
  24. package/dist/evm-3KFL5N77.js +2 -0
  25. package/dist/evm-3KFL5N77.js.map +7 -0
  26. package/dist/mod.d.ts +4 -0
  27. package/dist/mod.d.ts.map +1 -0
  28. package/dist/mod.js +2 -0
  29. package/dist/mod.js.map +7 -0
  30. package/dist/namespaces/evm/hooks.d.ts +18 -0
  31. package/dist/namespaces/evm/hooks.d.ts.map +1 -0
  32. package/dist/namespaces/evm/namespace.d.ts +4 -0
  33. package/dist/namespaces/evm/namespace.d.ts.map +1 -0
  34. package/dist/namespaces/subscriber.d.ts +24 -0
  35. package/dist/namespaces/subscriber.d.ts.map +1 -0
  36. package/dist/provider.d.ts +3 -0
  37. package/dist/provider.d.ts.map +1 -0
  38. package/dist/session/accounts.d.ts +17 -0
  39. package/dist/session/accounts.d.ts.map +1 -0
  40. package/dist/session/bip122.d.ts +23 -0
  41. package/dist/session/bip122.d.ts.map +1 -0
  42. package/dist/session/chain-state.d.ts +6 -0
  43. package/dist/session/chain-state.d.ts.map +1 -0
  44. package/dist/session/evm-chain.d.ts +29 -0
  45. package/dist/session/evm-chain.d.ts.map +1 -0
  46. package/dist/session/evm.d.ts +25 -0
  47. package/dist/session/evm.d.ts.map +1 -0
  48. package/dist/session/lifecycle.d.ts +30 -0
  49. package/dist/session/lifecycle.d.ts.map +1 -0
  50. package/dist/session/lookup.d.ts +6 -0
  51. package/dist/session/lookup.d.ts.map +1 -0
  52. package/dist/session/proposals.d.ts +27 -0
  53. package/dist/session/proposals.d.ts.map +1 -0
  54. package/dist/session/restore-cache.d.ts +6 -0
  55. package/dist/session/restore-cache.d.ts.map +1 -0
  56. package/dist/session/teardown.d.ts +24 -0
  57. package/dist/session/teardown.d.ts.map +1 -0
  58. package/dist/signer.d.ts +2 -2
  59. package/dist/signer.d.ts.map +1 -0
  60. package/dist/signers/evm.d.ts +6 -4
  61. package/dist/signers/evm.d.ts.map +1 -0
  62. package/dist/types.d.ts +28 -11
  63. package/dist/types.d.ts.map +1 -0
  64. package/dist/utils.d.ts +17 -0
  65. package/dist/utils.d.ts.map +1 -0
  66. package/dist/wcConstants.d.ts +61 -0
  67. package/dist/wcConstants.d.ts.map +1 -0
  68. package/package.json +18 -13
  69. package/readme.md +14 -2
  70. package/src/adapter/adapter.ts +289 -0
  71. package/src/adapter/index.ts +2 -0
  72. package/src/adapter/modal-cache.ts +23 -0
  73. package/src/adapter/modal.ts +121 -0
  74. package/src/adapter/networks.ts +85 -0
  75. package/src/adapter/provider-client.ts +13 -0
  76. package/src/adapter/registry.ts +17 -0
  77. package/src/adapter/session-cache.ts +38 -0
  78. package/src/adapter/task-queue.ts +32 -0
  79. package/src/constants.ts +41 -76
  80. package/src/mod.ts +10 -0
  81. package/src/namespaces/evm/hooks.ts +148 -0
  82. package/src/namespaces/evm/namespace.ts +102 -0
  83. package/src/namespaces/subscriber.ts +106 -0
  84. package/src/provider.ts +35 -0
  85. package/src/session/accounts.ts +44 -0
  86. package/src/session/bip122.ts +225 -0
  87. package/src/session/chain-state.ts +38 -0
  88. package/src/session/evm-chain.ts +185 -0
  89. package/src/session/evm.ts +198 -0
  90. package/src/session/lifecycle.ts +241 -0
  91. package/src/session/lookup.ts +54 -0
  92. package/src/session/proposals.ts +96 -0
  93. package/src/session/restore-cache.ts +38 -0
  94. package/src/session/teardown.ts +181 -0
  95. package/src/signer.ts +9 -17
  96. package/src/signers/evm.ts +19 -17
  97. package/src/types.ts +31 -12
  98. package/src/utils.ts +68 -0
  99. package/src/wcConstants.ts +94 -0
  100. package/dist/chunk-6V3WUFOU.js +0 -2
  101. package/dist/chunk-6V3WUFOU.js.map +0 -7
  102. package/dist/chunk-BPSEZJUF.js +0 -2
  103. package/dist/chunk-BPSEZJUF.js.map +0 -7
  104. package/dist/chunk-DXVBX5XQ.js +0 -2
  105. package/dist/chunk-DXVBX5XQ.js.map +0 -7
  106. package/dist/dist-6GI3ECE5.js +0 -139
  107. package/dist/dist-6GI3ECE5.js.map +0 -7
  108. package/dist/evm-3ID4XY4Y.js +0 -2
  109. package/dist/evm-3ID4XY4Y.js.map +0 -7
  110. package/dist/helpers.d.ts +0 -31
  111. package/dist/index.d.ts +0 -21
  112. package/dist/index.js +0 -2
  113. package/dist/index.js.map +0 -7
  114. package/dist/session.d.ts +0 -63
  115. package/dist/signers/solana.d.ts +0 -14
  116. package/dist/solana-MFA7C5XI.js +0 -2
  117. package/dist/solana-MFA7C5XI.js.map +0 -7
  118. package/src/helpers.ts +0 -238
  119. package/src/index.ts +0 -234
  120. package/src/session.ts +0 -376
  121. package/src/signers/solana.ts +0 -160
  122. package/src/wc-types.d.ts +0 -31
@@ -1,2 +0,0 @@
1
- import"./chunk-6V3WUFOU.js";import{a as l}from"./chunk-DXVBX5XQ.js";import{cleanEvmError as h,toHexQuantity as o}from"@rango-dev/signer-evm";import*as m from"@walletconnect/encoding";import{AccountId as E,ChainId as p}from"caip";import"rango-types";var d="eip155",g=class u{static{l(this,"EVMSigner")}client;session;constructor(t,e){this.client=t,this.session=e}static buildTx(t){let e={data:t.data||"0x",value:t.value?o(t.value):"0x0"};return t.from&&(e.from=t.from),t.to&&(e.to=t.to),t.nonce&&(e.nonce=o(t.nonce)),t.gasLimit&&(e.gas=o(t.gasLimit)),t.maxFeePerGas&&t.maxPriorityFeePerGas?(e.maxFeePerGas=o(t.maxFeePerGas),e.maxPriorityFeePerGas=o(t.maxPriorityFeePerGas)):t.gasPrice&&(e.gasPrice=o(t.gasPrice)),e}async signMessage(t,e,i){let n=this.isNetworkAndAccountExistInSession({address:e,chainId:i}),r=new p({namespace:d,reference:n.chainId}),a=[m.utf8ToHex(t,!0),e],c;try{c=await this.client.request({topic:this.session.topic,chainId:r.toString(),request:{method:"personal_sign",params:a}})}catch(f){throw h(f)}return c}async signAndSendTx(t,e,i){try{let n=this.isNetworkAndAccountExistInSession({address:e,chainId:i}),r=u.buildTx(t),s=await this.client.request({topic:this.session.topic,chainId:n.caipChainId,request:{method:"eth_sendTransaction",params:[r]}});if(!s?.startsWith("0x"))throw new Error(`Received an invalid hash on signing the transaction. (hash=${s})`);return{hash:s}}catch(n){let r=h(n),s=this.session,a={namspaces:s?.namespaces,peering:s?.peer?.metadata,code:n?.code};throw r.context=a,r}}isNetworkAndAccountExistInSession(t){let{address:e,chainId:i}=t;if(!i)throw console.log("isNetworkAndAccountExistInSession",t),new Error("You need to set your chain for signing message/transaction.");let n=i.startsWith("0x")?String(parseInt(i)):i,r=new E({chainId:{namespace:d,reference:n},address:e}),s=this.session.namespaces[d]?.accounts.map(c=>c.toLowerCase());if(!s||!s.includes(r.toString()))throw console.warn("Available adresses and requested address:",s,r.toString(),i,e),new Error("Your requested address doesn't exist on your wallect connect session. Please reconnect your wallet.");let a=new p({namespace:d,reference:n});return{chainId:n,address:e,caipChainId:a.toString()}}},C=g;export{C as default};
2
- //# sourceMappingURL=evm-3ID4XY4Y.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/signers/evm.ts"],
4
- "sourcesContent": ["import type { SignClient } from '@walletconnect/sign-client/dist/types/client';\nimport type { SessionTypes } from '@walletconnect/types';\nimport type { EvmTransaction } from 'rango-types/mainApi';\n\nimport { cleanEvmError, toHexQuantity } from '@rango-dev/signer-evm';\nimport * as encoding from '@walletconnect/encoding';\nimport { AccountId, ChainId } from 'caip';\nimport { type GenericSigner } from 'rango-types';\n\nimport { EthereumRPCMethods, NAMESPACES } from '../constants.js';\n\nconst NAMESPACE_NAME = NAMESPACES.ETHEREUM;\n\ntype WalletConnectEvmTx = {\n from?: string;\n to?: string;\n data: string;\n value: string;\n gas?: string;\n gasPrice?: string;\n maxFeePerGas?: string;\n maxPriorityFeePerGas?: string;\n nonce?: string;\n};\n\nclass EVMSigner implements GenericSigner<EvmTransaction> {\n private client: SignClient;\n private session: SessionTypes.Struct;\n\n constructor(client: SignClient, session: SessionTypes.Struct) {\n this.client = client;\n this.session = session;\n }\n\n /**\n * Map Rango's EvmTransaction to WalletConnect eth_sendTransaction params.\n *\n * Unlike DefaultEvmSigner.buildTx (ethers TransactionRequest with gasLimit +\n * decimal fee strings), WC sends params raw over the relay. Wallets like\n * Ledger Live parse QUANTITY as hex, so decimal fees get inflated (~40x+).\n *\n * This builder:\n * - uses `gas` (JSON-RPC), not ethers' `gasLimit`\n * - hex-encodes gas, fees, value, and nonce\n */\n static buildTx(evmTx: EvmTransaction): WalletConnectEvmTx {\n const tx: WalletConnectEvmTx = {\n data: evmTx.data || '0x',\n /*\n * Approvals and many contract calls have value=null from the API.\n * Some WC wallets reject missing value; send 0x0 explicitly.\n */\n value: evmTx.value ? toHexQuantity(evmTx.value) : '0x0',\n };\n\n if (evmTx.from) {\n tx.from = evmTx.from;\n }\n if (evmTx.to) {\n tx.to = evmTx.to;\n }\n if (evmTx.nonce) {\n tx.nonce = toHexQuantity(evmTx.nonce);\n }\n if (evmTx.gasLimit) {\n tx.gas = toHexQuantity(evmTx.gasLimit);\n }\n if (evmTx.maxFeePerGas && evmTx.maxPriorityFeePerGas) {\n tx.maxFeePerGas = toHexQuantity(evmTx.maxFeePerGas);\n tx.maxPriorityFeePerGas = toHexQuantity(evmTx.maxPriorityFeePerGas);\n } else if (evmTx.gasPrice) {\n tx.gasPrice = toHexQuantity(evmTx.gasPrice);\n }\n\n return tx;\n }\n\n public async signMessage(\n msg: string,\n address: string,\n chainId: string | null\n ): Promise<string> {\n const requestedFor = this.isNetworkAndAccountExistInSession({\n address,\n chainId,\n });\n\n const caipChainId = new ChainId({\n namespace: NAMESPACE_NAME,\n reference: requestedFor.chainId,\n });\n const hexMsg = encoding.utf8ToHex(msg, true);\n\n const params = [hexMsg, address];\n\n let signature: string;\n try {\n // Send message to wallet (using relayer)\n signature = await this.client.request({\n topic: this.session.topic,\n chainId: caipChainId.toString(),\n request: {\n method: EthereumRPCMethods.PERSONAL_SIGN,\n params,\n },\n });\n } catch (error) {\n throw cleanEvmError(error);\n }\n\n /*\n * TODO: We can also verify the signature here\n * Check web-examples: dapps/react-dapp-v2/src/contexts/JsonRpcContext.tsx\n */\n\n return signature;\n }\n\n async signAndSendTx(\n tx: EvmTransaction,\n address: string,\n chainId: string | null\n ): Promise<{ hash: string }> {\n try {\n const requestedFor = this.isNetworkAndAccountExistInSession({\n address,\n chainId,\n });\n const transaction = EVMSigner.buildTx(tx);\n const hash: string = await this.client.request({\n topic: this.session.topic,\n chainId: requestedFor.caipChainId,\n request: {\n method: EthereumRPCMethods.SEND_TRANSACTION,\n params: [transaction],\n },\n });\n // Some wallets e.g. Rainbow wallet are returning invalid hash (e.g. 'null') in case of the rejection\n if (!hash?.startsWith('0x')) {\n throw new Error(\n `Received an invalid hash on signing the transaction. (hash=${hash})`\n );\n }\n return {\n hash,\n };\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (error: any) {\n const modifiedError = cleanEvmError(error);\n const session = this.session;\n const context = {\n namspaces: session?.namespaces,\n peering: session?.peer?.metadata,\n code: error?.code,\n };\n modifiedError.context = context;\n throw modifiedError;\n }\n }\n\n private isNetworkAndAccountExistInSession(requestedFor: {\n address: string;\n chainId: string | null;\n }) {\n const { address, chainId } = requestedFor;\n\n if (!chainId) {\n console.log('isNetworkAndAccountExistInSession', requestedFor);\n throw new Error(\n 'You need to set your chain for signing message/transaction.'\n );\n }\n\n /*\n * TODO: We need to make sure we are using a single format for chain ids, it should be hex or number.\n * This is a quick fix for evm.\n */\n const chainIdNumber = chainId.startsWith('0x')\n ? String(parseInt(chainId))\n : chainId;\n\n const caipAddress = new AccountId({\n chainId: {\n namespace: NAMESPACE_NAME,\n reference: chainIdNumber,\n },\n address,\n });\n const addresses = this.session.namespaces[NAMESPACE_NAME]?.accounts.map(\n (address) => address.toLowerCase()\n );\n\n if (!addresses || !addresses.includes(caipAddress.toString())) {\n console.warn(\n 'Available adresses and requested address:',\n addresses,\n caipAddress.toString(),\n chainId,\n address\n );\n throw new Error(\n `Your requested address doesn't exist on your wallect connect session. Please reconnect your wallet.`\n );\n }\n\n const caipChainId = new ChainId({\n namespace: NAMESPACE_NAME,\n reference: chainIdNumber,\n });\n\n return {\n chainId: chainIdNumber,\n address,\n caipChainId: caipChainId.toString(),\n };\n }\n}\n\nexport default EVMSigner;\n"],
5
- "mappings": "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",
6
- "names": ["cleanEvmError", "toHexQuantity", "encoding", "AccountId", "ChainId", "NAMESPACE_NAME", "EVMSigner", "_EVMSigner", "__name", "client", "session", "evmTx", "tx", "toHexQuantity", "msg", "address", "chainId", "requestedFor", "caipChainId", "ChainId", "params", "signature", "error", "cleanEvmError", "transaction", "hash", "modifiedError", "context", "chainIdNumber", "caipAddress", "AccountId", "addresses", "evm_default"]
7
- }
package/dist/helpers.d.ts DELETED
@@ -1,31 +0,0 @@
1
- import type { WalletConnectModal as WalletConnectModalType } from './wc-types.js';
2
- import type { WalletState } from '@rango-dev/wallets-shared';
3
- import type { ProposalTypes } from '@walletconnect/types';
4
- import type { BlockchainMeta } from 'rango-types';
5
- import { NAMESPACES } from './constants.js';
6
- export declare function createModalInstance(projectId: string): void;
7
- export declare function getModal(): WalletConnectModalType;
8
- type FinalNamespaces = {
9
- [key in NAMESPACES]?: ProposalTypes.BaseRequiredNamespace;
10
- };
11
- export declare function generateOptionalNamespace(meta: BlockchainMeta[]): FinalNamespaces | undefined;
12
- export declare function solanaChainIdToNetworkName(chainId: string): string;
13
- /**
14
- *
15
- * In `rango-preset` we are working with `window.ethereum.request()`,
16
- * this is an interceptor for some RPC methods (e.g. eth_chainId).
17
- *
18
- */
19
- export declare function simulateRequest(params: any, provider: any, meta: BlockchainMeta[], getState: () => WalletState): Promise<string>;
20
- export declare function getChainIdByNetworkName(network: string, meta: BlockchainMeta[]): string | undefined;
21
- export declare function switchOrAddEvmChain(meta: BlockchainMeta[], requestedNetwork: string, currentNetwork: string, instance: any): Promise<void>;
22
- export declare function getCurrentEvmAccountAddress(instance: any): any;
23
- export declare function getEvmAccount(network: string, address: string, meta: BlockchainMeta[]): string;
24
- export declare function filterEvmAccounts(accounts: {
25
- address: string;
26
- chainId: string;
27
- }[], currentChainId?: string): {
28
- accounts: string[];
29
- chainId: string;
30
- }[];
31
- export {};
package/dist/index.d.ts DELETED
@@ -1,21 +0,0 @@
1
- import type { Environments, WCInstance } from './types.js';
2
- import type { CanSwitchNetwork, Connect, Disconnect, GetInstance, Subscribe, SwitchNetwork, WalletConfig, WalletInfo } from '@rango-dev/wallets-shared';
3
- import type { BlockchainMeta, SignerFactory } from 'rango-types';
4
- export type { Environments };
5
- export declare const init: (environments: Environments) => void;
6
- export declare const config: WalletConfig;
7
- export declare const getInstance: GetInstance;
8
- export declare const connect: Connect;
9
- export declare const subscribe: Subscribe;
10
- export declare const switchNetwork: SwitchNetwork;
11
- /**
12
- *
13
- * Note:
14
- * There is no straight-forward way to detect the wallet supports which blockchain,
15
- * So we send request to wallet and expect to be rejected on the wallet if it's not supported.
16
- *
17
- */
18
- export declare const canSwitchNetworkTo: CanSwitchNetwork;
19
- export declare const disconnect: Disconnect;
20
- export declare const getSigners: (provider: WCInstance) => Promise<SignerFactory>;
21
- export declare const getWalletInfo: (allBlockChains: BlockchainMeta[]) => WalletInfo;
package/dist/index.js DELETED
@@ -1,2 +0,0 @@
1
- import{d as R,e as B,g as h,h as S}from"./chunk-BPSEZJUF.js";import{a as x,b as P,c as E,d as W,e as D,f as O,g as L,h as b}from"./chunk-6V3WUFOU.js";import{a as r}from"./chunk-DXVBX5XQ.js";import{debug as we,error as re}from"@rango-dev/logging-core";import{Networks as Ae,WalletTypes as Te}from"@rango-dev/wallets-shared";import ve from"@walletconnect/sign-client";import{AccountId as Ne,ChainId as ie}from"caip";import{evmBlockchains as ae}from"rango-types";import{convertEvmBlockchainMetaToEvmChainInfo as Ce,isEvmAddress as Q,Networks as Ee}from"@rango-dev/wallets-shared";var g=class{static{r(this,"d")}constructor(n){this.openModal=h.open,this.closeModal=h.close,this.subscribeModal=h.subscribe,this.setTheme=S.setThemeConfig,S.setThemeConfig(n),B.setConfig(n),this.initUi()}async initUi(){if(typeof window<"u"){await import("./dist-6GI3ECE5.js");let n=document.createElement("wcm-modal");document.body.insertAdjacentElement("beforeend",n),R.setIsUiLoaded(!0)}}};import{AccountId as X,ChainId as N}from"caip";import{evmBlockchains as Se,isEvmBlockchain as ye}from"rango-types";import{Networks as le,timeout as me}from"@rango-dev/wallets-shared";import{getSdkError as U}from"@walletconnect/utils";import{AccountId as H}from"caip";function w(e){return e.session.values[e.session.values.length-1]}r(w,"getLastSession");async function de(e,n){return await me(e.ping({topic:n}),P),w(e)}r(de,"restoreSession");async function ue(e,n,s){let{requiredNamespaces:o,optionalNamespaces:t,pairingTopic:i}=n;try{let{uri:a,approval:c}=await e.connect({requiredNamespaces:o,optionalNamespaces:t,pairingTopic:i}),l;if(a){let d=s.envs.DISABLE_MODAL_AND_OPEN_LINK;if(d){let u=`${d}/wc?uri=${encodeURIComponent(a)}`;window.open(u,"_blank","noreferrer noopener")}else{let u={...o||{},...t||{}},p=Object.values(u).map(k=>k.chains).flat(),C=y();C.openModal({uri:a,chains:p}),l=new Promise((k,ce)=>{C.subscribeModal(pe=>{pe.open||ce(new Error("Modal has been closed."))})})}}let m=c();return l?await Promise.race([m,l]):await m}finally{y().closeModal()}}r(ue,"createSession");function fe(e){let n=e.pairing.getAll({active:!0});return n.length>0?n[n.length-1]:void 0}r(fe,"tryGetPairing");async function F(e,n){let{meta:s}=n,o=$(s),t,i=fe(e);if(i)try{t=await de(e,i.topic)}catch{await A(e)}return t||(t=await ue(e,{requiredNamespaces:{},optionalNamespaces:o},{envs:n.envs})),t}r(F,"tryConnect");async function q(e,n){let s=e.session.getAll(),o=e.pairing.getAll();s.forEach(t=>{if(t.topic===n||t.pairingTopic===n){let i=t.pairingTopic===n?t.pairingTopic:t.topic;e.core.expirer.set(i,0)}}),o.forEach(t=>{t.topic===n&&e.core.expirer.set(n,0)})}r(q,"cleanupSingleSession");async function A(e){let n=[],s=e.session.getAll();for(let t of s)n.push(e.disconnect({topic:t.topic,reason:U("USER_DISCONNECTED")}));let o=e.pairing.getAll();for(let t of o)n.push(e.disconnect({topic:t.topic,reason:U("USER_DISCONNECTED")}));return T(e,void 0),await Promise.all(n)}r(A,"disconnectSessions");function j(e){return Object.values(e.namespaces).map(s=>s.accounts).flat().map(s=>{let{address:o,chainId:t}=new H(s),i=K(t.reference);return{address:o,chainId:i}})}r(j,"getAccountsFromSession");function G(e){return Object.values(e.params.namespaces).map(s=>s.accounts).flat().map(s=>{let{address:o,chainId:t}=new H(s);return{accounts:[o],chainId:t.namespace==="solana"?le.SOLANA:t.reference}})}r(G,"getAccountsFromEvent");async function J(e,n,s,o){let t=e.session,i=t.namespaces,a=!1,c=i.eip155.accounts,l=Y(e),m=I(n,l,o);c.includes(m)||(c.push(m),a=!0);let d=I(s,l,o);if(c.includes(d)||(c.push(d),a=!0),a){let u={...i,eip155:{...i.eip155,accounts:c}};await e.client.session.update({topic:t.topic,namespaces:u}).catch(p=>{console.log(p)})}}r(J,"updateSessionAccounts");function z(e){let n=["trust","1inch"],s=e?.session?.peer?.metadata?.name;return n.some(o=>s?.toLowerCase()?.includes(o))}r(z,"ignoreNamespaceMethods");async function T(e,n){return e.core.storage.setItem(E,{defaultChainId:n?parseInt(n):""})}r(T,"persistCurrentChainId");async function V(e){try{let n=(await e.core.storage.getItem(E))?.defaultChainId;return n?String(n):void 0}catch{return}}r(V,"getPersistedChainId");var v;function Z(e){v||(v=new g({projectId:e,themeMode:"light",themeVariables:{"--wcm-z-index":"999999999"}}))}r(Z,"createModalInstance");function y(){return v}r(y,"getModal");function $(e){let s=Se(e).map(t=>new N({namespace:"eip155",reference:String(parseInt(t.chainId))}).toString());return{eip155:{methods:D,events:W,chains:s}}}r($,"generateOptionalNamespace");function K(e){return e===O?Ee.SOLANA:e}r(K,"solanaChainIdToNetworkName");async function ee(e,n,s,o){if(e.method==="eth_chainId"){let t=w(n),i=Object.values(t.namespaces).map(c=>c.chains).flat(),a=o().network;if(i.length>0){let c=a?M(a,s):void 0;if(c)return c;let m=i[0];return new N(m).reference}throw new Error("Couldn't find any chain on namespace")}throw new Error("Dissallowed method:",e)}r(ee,"simulateRequest");function M(e,n){let o=n.find(i=>i.name===e)?.chainId;return o?String(parseInt(o)):void 0}r(M,"getChainIdByNetworkName");async function ne(e,n,s,o){let t=e.filter(ye),a=Ce(t)[n],l=e.find(p=>p.name===n)?.chainId,m=M(s,e),d=N.format({namespace:"eip155",reference:String(m)}),u=o.session;try{await o.client.request({topic:u.topic,request:{method:"wallet_switchEthereumChain",params:[{chainId:l}]},chainId:d})}catch(p){if(p?.code===4902||p?.message?.includes(String(4902)))await o.client.request({topic:u.topic,request:{method:"wallet_addEthereumChain",params:[a]},chainId:d});else throw p}}r(ne,"switchOrAddEvmChain");function Y(e){return e.session.namespaces.eip155.accounts?.map(n=>new X(n).address)?.filter(n=>Q(n))?.[0]}r(Y,"getCurrentEvmAccountAddress");function I(e,n,s){let o=M(e,s);return X.format({chainId:{namespace:"eip155",reference:String(o)},address:n})}r(I,"getEvmAccount");function te(e,n){let s=!1;return e.filter(({address:o,chainId:t})=>{if(Q(o)){if(n&&t!==n)return!1;if(!n){if(s)return!1;s=!0}}return!0}).map(({address:o,chainId:t})=>({accounts:[o],chainId:t}))}r(te,"filterEvmAccounts");import{dynamicImportWithRefinedError as se}from"@rango-dev/wallets-shared";import{DefaultSignerFactory as Ie,TransactionType as oe}from"rango-types";async function _(e){if(!e.session)throw new Error("Session is required for wallet connect signers.");let n=new Ie,s=(await se(async()=>await import("./evm-3ID4XY4Y.js"))).default,o=(await se(async()=>await import("./solana-MFA7C5XI.js"))).default;return n.registerSigner(oe.EVM,new s(e.client,e.session)),n.registerSigner(oe.SOLANA,new o(e.client,e.session)),n}r(_,"getSigners");var Me=Te.WALLET_CONNECT_2,f={WC_PROJECT_ID:"",DISABLE_MODAL_AND_OPEN_LINK:void 0},an=r(e=>{f=e,Z(f.WC_PROJECT_ID)},"init"),cn={type:Me,checkInstallation:!1,isAsyncInstance:!0,defaultNetwork:x,isAsyncSwitchNetwork:!0},pn=r(async e=>{let{currentProvider:n,getState:s,meta:o}=e,t;if(n)t=n;else{if(!f.WC_PROJECT_ID)throw new Error("You need to set `WC_PROJECT_ID` in Wallet Connect provider.");t=await ve.init({relayUrl:b,projectId:f.WC_PROJECT_ID,metadata:L})}return{client:t,session:null,request:async i=>ee(i,t,o,s)}},"getInstance"),ln=r(async({instance:e,meta:n})=>{let{client:s}=e,o=await F(s,{meta:n,envs:f});e.session=o;let t=await V(s),i=j(o);return te(i,t)},"connect"),mn=r(({instance:e,updateChainId:n,updateAccounts:s,disconnect:o})=>{let{client:t}=e;t.on("session_update",i=>{G(i).forEach(c=>{s(c.accounts,c.chainId)})}),t.on("session_event",i=>{if(i.params.event.name==="accountsChanged"){let a=i.params.event.data.map(l=>new Ne(l).address),c=ie.parse(i.params.chainId).reference;s(a),n(c)}else if(i.params.event.name==="chainChanged"){let a=i.params.event.data;n(a),T(e.client,a)}else console.log("[WC2] session_event not supported",i.params.event)}),t.on("session_delete",async i=>{console.log("[WC2] your wallet has requested to delete session.",i),q(t,i.topic),o()})},"subscribe"),dn=r(async({network:e,instance:n,meta:s,getState:o,updateChainId:t})=>{let a=ae(s).find(p=>p.name===e)?.chainId;if(!a){let p=new Error(`There is no match for ${a}`);throw re(p),p}let c=new ie({namespace:"eip155",reference:String(parseInt(a))}).toString(),m=n.session.namespaces.eip155,d=m?.chains||[];if((m?.methods||[]).includes("wallet_switchEthereumChain")&&!z(n)){let p=o?.().network||Ae.ETHEREUM;await J(n,e,p,s),await ne(s,e,p,n)}else if(d.includes(c)){t(a);return}else{let p=new Error(`Chain ${a} is not configured.`);throw re(p),p}},"switchNetwork"),un=r(()=>!0,"canSwitchNetworkTo"),fn=r(async({instance:e})=>{let{client:n}=e;n&&A(n).catch(s=>we(s))},"disconnect"),hn=_,gn=r(e=>({name:"WalletConnect",img:"https://raw.githubusercontent.com/rango-exchange/assets/main/wallets/walletconnect/icon.svg",installLink:"",color:"#b2dbff",supportedChains:ae(e),showOnMobile:!0,mobileWallet:!0}),"getWalletInfo");export{un as canSwitchNetworkTo,cn as config,ln as connect,fn as disconnect,pn as getInstance,hn as getSigners,gn as getWalletInfo,an as init,mn as subscribe,dn as switchNetwork};
2
- //# sourceMappingURL=index.js.map
package/dist/index.js.map DELETED
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/index.ts", "../src/helpers.ts", "../../../node_modules/@walletconnect/modal/src/client.ts", "../src/session.ts", "../src/signer.ts"],
4
- "sourcesContent": ["import type { Environments, WCInstance } from './types.js';\nimport type {\n CanSwitchNetwork,\n Connect,\n Disconnect,\n GetInstance,\n Subscribe,\n SwitchNetwork,\n WalletConfig,\n WalletInfo,\n} from '@rango-dev/wallets-shared';\nimport type { ISignClient } from '@walletconnect/types';\nimport type { BlockchainMeta, SignerFactory } from 'rango-types';\n\nimport { debug, error as logError } from '@rango-dev/logging-core';\nimport { Networks, WalletTypes } from '@rango-dev/wallets-shared';\nimport Client from '@walletconnect/sign-client';\nimport { AccountId, ChainId } from 'caip';\nimport { evmBlockchains } from 'rango-types';\n\nimport {\n DEFAULT_APP_METADATA,\n DEFAULT_NETWORK,\n EthereumEvents,\n EthereumRPCMethods,\n NAMESPACES,\n RELAY_URL,\n} from './constants.js';\nimport {\n createModalInstance,\n filterEvmAccounts,\n simulateRequest,\n switchOrAddEvmChain,\n} from './helpers.js';\nimport {\n cleanupSingleSession,\n disconnectSessions,\n getAccountsFromEvent,\n getAccountsFromSession,\n getPersistedChainId,\n ignoreNamespaceMethods,\n persistCurrentChainId,\n tryConnect,\n updateSessionAccounts,\n} from './session.js';\nimport signer from './signer.js';\n\nconst WALLET = WalletTypes.WALLET_CONNECT_2;\n\nlet envs: Environments = {\n WC_PROJECT_ID: '',\n DISABLE_MODAL_AND_OPEN_LINK: undefined,\n};\n\nexport type { Environments };\n\nexport const init = (environments: Environments) => {\n envs = environments;\n\n createModalInstance(envs.WC_PROJECT_ID);\n};\n\nexport const config: WalletConfig = {\n type: WALLET,\n checkInstallation: false,\n isAsyncInstance: true,\n defaultNetwork: DEFAULT_NETWORK,\n isAsyncSwitchNetwork: true,\n};\n\nexport const getInstance: GetInstance = async (options) => {\n const { currentProvider, getState, meta } = options;\n\n /*\n * Create a new pair, if exists use the pair,\n * Or use the already created one.\n */\n let provider: ISignClient;\n if (!currentProvider) {\n if (!envs.WC_PROJECT_ID) {\n throw new Error(\n 'You need to set `WC_PROJECT_ID` in Wallet Connect provider.'\n );\n }\n provider = await Client.init({\n relayUrl: RELAY_URL,\n projectId: envs.WC_PROJECT_ID,\n metadata: DEFAULT_APP_METADATA,\n });\n } else {\n provider = currentProvider;\n }\n\n return {\n client: provider,\n session: null,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n request: async (params: any) =>\n simulateRequest(params, provider, meta, getState),\n };\n};\n\nexport const connect: Connect = async ({ instance, meta }) => {\n const { client } = instance as WCInstance;\n // Try to restore the session first, if couldn't, create a new session by showing a modal.\n const session = await tryConnect(client, { meta, envs });\n // Override the value (session).\n instance.session = session;\n const currentChainId = await getPersistedChainId(client);\n const accounts = getAccountsFromSession(session);\n return filterEvmAccounts(accounts, currentChainId);\n};\n\nexport const subscribe: Subscribe = ({\n instance,\n updateChainId,\n updateAccounts,\n disconnect,\n}) => {\n const { client } = instance as WCInstance;\n\n /**\n * Session events refrence:\n * https://docs.walletconnect.com/2.0/specs/clients/sign/session-events\n */\n\n // Listen to updating the session by adding a new chain, method, or event\n client.on('session_update', (args) => {\n const allAccounts = getAccountsFromEvent(args);\n allAccounts.forEach((accountsWithChain) => {\n updateAccounts(accountsWithChain.accounts, accountsWithChain.chainId);\n });\n });\n\n // Listen to events triggred by wallet. (e.g. accountsChanged and chainChanged)\n client.on('session_event', (args) => {\n if (args.params.event.name === EthereumEvents.ACCOUNTS_CHANGED) {\n const accounts = args.params.event.data.map((account: string) => {\n return new AccountId(account).address;\n });\n const chainId = ChainId.parse(args.params.chainId).reference;\n updateAccounts(accounts);\n updateChainId(chainId);\n } else if (args.params.event.name === EthereumEvents.CHAIN_CHANGED) {\n const chainId = args.params.event.data;\n updateChainId(chainId);\n void persistCurrentChainId(instance.client, chainId);\n } else {\n console.log('[WC2] session_event not supported', args.params.event);\n }\n });\n\n client.on('session_delete', async (event) => {\n console.log('[WC2] your wallet has requested to delete session.', event);\n void cleanupSingleSession(client, event.topic);\n disconnect();\n });\n};\n\nexport const switchNetwork: SwitchNetwork = async ({\n network,\n instance,\n meta,\n getState,\n updateChainId,\n}) => {\n const evm = evmBlockchains(meta);\n const chainId = evm.find((chain) => chain.name === network)?.chainId;\n if (!chainId) {\n const error = new Error(`There is no match for ${chainId}`);\n logError(error);\n throw error;\n }\n const chaindIdStr = new ChainId({\n namespace: NAMESPACES.ETHEREUM,\n reference: String(parseInt(chainId)),\n }).toString();\n\n const session = instance.session;\n const evmNamespace = session.namespaces[NAMESPACES.ETHEREUM];\n const authorizedChains = evmNamespace?.chains || [];\n const authorizedMethods = evmNamespace?.methods || [];\n\n if (\n authorizedMethods.includes(EthereumRPCMethods.SWITCH_CHAIN) &&\n !ignoreNamespaceMethods(instance)\n ) {\n const currentNetwork = getState?.().network || Networks.ETHEREUM;\n await updateSessionAccounts(instance, network, currentNetwork, meta);\n await switchOrAddEvmChain(meta, network, currentNetwork, instance);\n } else if (authorizedChains.includes(chaindIdStr)) {\n updateChainId(chainId);\n return;\n } else {\n const error = new Error(`Chain ${chainId} is not configured.`);\n logError(error);\n throw error;\n }\n};\n\n/**\n *\n * Note:\n * There is no straight-forward way to detect the wallet supports which blockchain,\n * So we send request to wallet and expect to be rejected on the wallet if it's not supported.\n *\n */\nexport const canSwitchNetworkTo: CanSwitchNetwork = () => true;\n\nexport const disconnect: Disconnect = async ({ instance }) => {\n const { client } = instance as WCInstance;\n\n if (client) {\n void disconnectSessions(client).catch((error) => debug(error));\n }\n};\n\nexport const getSigners: (provider: WCInstance) => Promise<SignerFactory> =\n signer;\n\nexport const getWalletInfo: (allBlockChains: BlockchainMeta[]) => WalletInfo = (\n allBlockChains\n) => {\n const evms = evmBlockchains(allBlockChains);\n return {\n name: 'WalletConnect',\n img: 'https://raw.githubusercontent.com/rango-exchange/assets/main/wallets/walletconnect/icon.svg',\n installLink: '',\n color: '#b2dbff',\n supportedChains: evms,\n showOnMobile: true,\n mobileWallet: true,\n };\n};\n", "/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { WalletConnectModal as WalletConnectModalType } from './wc-types.js';\nimport type { WalletState } from '@rango-dev/wallets-shared';\nimport type { ProposalTypes } from '@walletconnect/types';\nimport type { BlockchainMeta } from 'rango-types';\n\nimport {\n convertEvmBlockchainMetaToEvmChainInfo,\n isEvmAddress,\n Networks,\n} from '@rango-dev/wallets-shared';\nimport { WalletConnectModal } from '@walletconnect/modal';\nimport { AccountId, ChainId } from 'caip';\nimport { evmBlockchains, isEvmBlockchain } from 'rango-types';\n\nimport {\n DEFAULT_ETHEREUM_EVENTS,\n DEFAULT_ETHEREUM_METHODS,\n DEFAULT_SOLANA_CHAIN_ID,\n EthereumRPCMethods,\n NAMESPACES,\n} from './constants.js';\nimport { getLastSession } from './session.js';\n\nlet web3Modal: WalletConnectModalType;\nexport function createModalInstance(projectId: string) {\n if (!web3Modal) {\n web3Modal = new WalletConnectModal({\n projectId,\n themeMode: 'light',\n themeVariables: {\n '--wcm-z-index': '999999999',\n },\n }) as unknown as WalletConnectModalType;\n }\n}\n\nexport function getModal(): WalletConnectModalType {\n return web3Modal;\n}\n\ntype FinalNamespaces = {\n [key in NAMESPACES]?: ProposalTypes.BaseRequiredNamespace;\n};\n\nexport function generateOptionalNamespace(\n meta: BlockchainMeta[]\n): FinalNamespaces | undefined {\n const evm = evmBlockchains(meta);\n const evmChains = evm.map((chain) => {\n return new ChainId({\n namespace: NAMESPACES.ETHEREUM,\n reference: String(parseInt(chain.chainId)),\n }).toString();\n });\n\n const namespaces: FinalNamespaces = {\n [NAMESPACES.ETHEREUM]: {\n methods: DEFAULT_ETHEREUM_METHODS,\n events: DEFAULT_ETHEREUM_EVENTS,\n chains: evmChains,\n },\n };\n return namespaces;\n}\n\nexport function solanaChainIdToNetworkName(chainId: string): string {\n return chainId === DEFAULT_SOLANA_CHAIN_ID ? Networks.SOLANA : chainId;\n}\n\n/**\n *\n * In `rango-preset` we are working with `window.ethereum.request()`,\n * this is an interceptor for some RPC methods (e.g. eth_chainId).\n *\n */\nexport async function simulateRequest(\n params: any,\n provider: any,\n meta: BlockchainMeta[],\n getState: () => WalletState\n) {\n if (params.method === 'eth_chainId') {\n const currentSession = getLastSession(provider);\n const standaloneChains = Object.values(currentSession.namespaces)\n .map((namespace) => namespace.chains)\n .flat() as string[];\n\n const network = getState().network;\n\n if (standaloneChains.length > 0) {\n const chainId = network\n ? getChainIdByNetworkName(network, meta)\n : undefined;\n\n if (chainId) {\n return chainId;\n }\n\n const firstIndex = 0;\n const firstChain = standaloneChains[firstIndex];\n const firstChainId = new ChainId(firstChain);\n return firstChainId.reference;\n }\n\n throw new Error(`Couldn't find any chain on namespace`);\n }\n throw new Error('Dissallowed method:', params);\n}\n\nexport function getChainIdByNetworkName(\n network: string,\n meta: BlockchainMeta[]\n): string | undefined {\n const targetBlockchain = meta.find(\n (blockchain) => blockchain.name === network\n );\n const chainIdInHex = targetBlockchain?.chainId;\n if (!chainIdInHex) {\n return undefined;\n }\n\n const chainId = String(parseInt(chainIdInHex));\n\n return chainId;\n}\n\nexport async function switchOrAddEvmChain(\n meta: BlockchainMeta[],\n requestedNetwork: string,\n currentNetwork: string,\n instance: any\n) {\n const evmBlockchains = meta.filter(isEvmBlockchain);\n const evmNetworksChainInfo =\n convertEvmBlockchainMetaToEvmChainInfo(evmBlockchains);\n const targetChain = evmNetworksChainInfo[requestedNetwork];\n const targetBlockchain = meta.find(\n (blockchain: BlockchainMeta) => blockchain.name === requestedNetwork\n );\n const chainIdInHex = targetBlockchain?.chainId;\n\n const currentChainId = getChainIdByNetworkName(currentNetwork, meta);\n const currentChainEip = ChainId.format({\n namespace: NAMESPACES.ETHEREUM,\n reference: String(currentChainId),\n });\n\n const session = instance.session;\n\n try {\n await instance.client.request({\n topic: session.topic,\n request: {\n method: EthereumRPCMethods.SWITCH_CHAIN,\n params: [\n {\n chainId: chainIdInHex,\n },\n ],\n },\n // It's required to pass current chain, otherwise it won't work\n chainId: currentChainEip,\n });\n } catch (err: any) {\n const addChainError = 4902;\n if (\n err?.code === addChainError ||\n err?.message?.includes(String(addChainError))\n ) {\n await instance.client.request({\n topic: session.topic,\n request: {\n method: EthereumRPCMethods.ADD_CHAIN,\n params: [targetChain],\n },\n // It's required to pass current chain, otherwise it won't work\n chainId: currentChainEip,\n });\n } else {\n throw err;\n }\n }\n}\n\nexport function getCurrentEvmAccountAddress(instance: any) {\n return instance.session.namespaces.eip155.accounts\n ?.map((account: string) => {\n return new AccountId(account).address;\n })\n ?.filter((address: string) => isEvmAddress(address))?.[0];\n}\n\nexport function getEvmAccount(\n network: string,\n address: string,\n meta: BlockchainMeta[]\n) {\n const currentChainId = getChainIdByNetworkName(network, meta);\n return AccountId.format({\n chainId: {\n namespace: NAMESPACES.ETHEREUM,\n reference: String(currentChainId),\n },\n address,\n });\n}\n\n// It's enough to return only connected network for the EVM networks and ignore others\nexport function filterEvmAccounts(\n accounts: {\n address: string;\n chainId: string;\n }[],\n currentChainId?: string\n) {\n let firstEvmAddress = false;\n return accounts\n .filter(({ address, chainId }) => {\n const isEvm = isEvmAddress(address);\n if (isEvm) {\n if (currentChainId && chainId !== currentChainId) {\n return false;\n }\n if (!currentChainId) {\n if (firstEvmAddress) {\n return false;\n }\n firstEvmAddress = true;\n }\n }\n return true;\n })\n .map(({ address, chainId }) => ({\n accounts: [address],\n chainId: chainId,\n }));\n}\n", "import type { ConfigCtrlState, ThemeCtrlState } from '@walletconnect/modal-core'\nimport { ConfigCtrl, ModalCtrl, OptionsCtrl, ThemeCtrl } from '@walletconnect/modal-core'\n\n/**\n * Types\n */\nexport type WalletConnectModalConfig = ConfigCtrlState & ThemeCtrlState\n\n/**\n * Client\n */\nexport class WalletConnectModal {\n public constructor(config: WalletConnectModalConfig) {\n ThemeCtrl.setThemeConfig(config)\n ConfigCtrl.setConfig(config)\n this.initUi()\n }\n\n private async initUi() {\n if (typeof window !== 'undefined') {\n await import('@walletconnect/modal-ui')\n const modal = document.createElement('wcm-modal')\n document.body.insertAdjacentElement('beforeend', modal)\n OptionsCtrl.setIsUiLoaded(true)\n }\n }\n\n public openModal = ModalCtrl.open\n\n public closeModal = ModalCtrl.close\n\n public subscribeModal = ModalCtrl.subscribe\n\n public setTheme = ThemeCtrl.setThemeConfig\n}\n", "import type {\n ConnectParams,\n CreateSessionParams,\n Environments,\n} from './types.js';\nimport type { SignClient } from '@walletconnect/sign-client/dist/types/client';\nimport type {\n PairingTypes,\n SessionTypes,\n SignClientTypes,\n} from '@walletconnect/types';\nimport type { BlockchainMeta } from 'rango-types';\n\nimport { Networks, timeout } from '@rango-dev/wallets-shared';\nimport { getSdkError } from '@walletconnect/utils';\nimport { AccountId } from 'caip';\n\nimport { CHAIN_ID_STORAGE, PING_TIMEOUT } from './constants.js';\nimport {\n generateOptionalNamespace,\n getCurrentEvmAccountAddress,\n getEvmAccount,\n getModal,\n solanaChainIdToNetworkName,\n} from './helpers.js';\n\nexport function getLastSession(client: SignClient) {\n return client.session.values[client.session.values.length - 1];\n}\n\n/**\n *\n * Try to ping the wallet, if wallet responded with `pong`, session is a valid and we will use the session.\n * If the wallet didn't respond during 10 seconds (PING_TIME), we assume the wallet isn't available and we need to create a new session.\n *\n */\nexport async function restoreSession(\n client: SignClient,\n pairingTopic: PairingTypes.Struct['topic']\n): Promise<SessionTypes.Struct | undefined> {\n await timeout(\n client.ping({\n topic: pairingTopic,\n }),\n PING_TIMEOUT\n );\n\n // We assume last session is the correct session, beacuse we are doing clean up and keeps only one pairing/session.\n const session = getLastSession(client);\n return session;\n}\n\n/**\n *\n * Getting a pair of required and optional namespaces then tries to show a modal and connect (pair)\n * To the wallet.\n * @param client\n * @param options\n * @returns\n */\nexport async function createSession(\n client: SignClient,\n options: CreateSessionParams,\n configs: {\n envs: Environments;\n }\n): Promise<SessionTypes.Struct> {\n const { requiredNamespaces, optionalNamespaces, pairingTopic } = options;\n\n try {\n const { uri, approval } = await client.connect({\n requiredNamespaces,\n optionalNamespaces,\n pairingTopic,\n });\n\n // Open QRCode modal if a URI was returned (i.e. we're not connecting an existing pairing).\n let onCloseModal;\n if (uri) {\n /*\n * There are some wallets have been listed in WC itself (https://docs.walletconnect.com/cloud/explorer-submission),\n * Using `DISABLE_MODAL_AND_OPEN_LINK` option, we can directly open a specific desktop wallet.\n */\n const redirectLink = configs.envs.DISABLE_MODAL_AND_OPEN_LINK;\n if (redirectLink) {\n const url = `${redirectLink}/wc?uri=${encodeURIComponent(uri)}`;\n window.open(url, '_blank', 'noreferrer noopener');\n } else {\n // Create a flat array of all requested chains across namespaces.\n const allNamespaces = {\n ...(requiredNamespaces || {}),\n ...(optionalNamespaces || {}),\n };\n\n const standaloneChains = Object.values(allNamespaces)\n .map((namespace) => namespace.chains)\n .flat() as string[];\n\n const modal = getModal();\n void modal.openModal({ uri, chains: standaloneChains });\n\n onCloseModal = new Promise((_, reject) => {\n modal.subscribeModal((state) => {\n // the modal was closed so reject the promise\n if (!state.open) {\n reject(new Error('Modal has been closed.'));\n }\n });\n });\n }\n }\n\n const session = approval();\n\n if (onCloseModal) {\n const result = await Promise.race([session, onCloseModal]);\n // We know onClose only reject a modal and never returns a value.\n return result as SessionTypes.Struct;\n }\n return await session;\n } finally {\n getModal().closeModal();\n }\n}\n\n/**\n *\n * A user (client) can have multiple pairings (to different wallets), we are assuming\n * the last pairing is the active pairing for now. A better UX can be showing a list of pairings\n * and let the user to choose the right pairing manually. Because we don't have that yet, we will pick up the last one.\n *\n */\nexport function tryGetPairing(\n client: SignClient\n): PairingTypes.Struct | undefined {\n const pairings = client.pairing.getAll({ active: true });\n const lastPairing =\n pairings.length > 0 ? pairings[pairings.length - 1] : undefined;\n\n return lastPairing;\n}\n\n/**\n *\n * Try to restore the session first, if couldn't, create a new session by showing a modal.\n *\n */\nexport async function tryConnect(\n client: SignClient,\n params: ConnectParams\n): Promise<SessionTypes.Struct> {\n const { meta } = params;\n\n // We try to get all of our supported chains as optional.\n const optionalNamespaces = generateOptionalNamespace(meta);\n\n // Check if the user has a session, if yes, restore the session and use it.\n let session: SessionTypes.Struct | undefined;\n const pairing = tryGetPairing(client);\n if (pairing) {\n try {\n session = await restoreSession(client, pairing.topic);\n } catch {\n await disconnectSessions(client);\n }\n }\n\n // In case of connecting for the first time or session couldn't be restored, we will create a new session.\n if (!session) {\n session = await createSession(\n client,\n {\n requiredNamespaces: {},\n optionalNamespaces,\n },\n {\n envs: params.envs,\n }\n );\n }\n\n return session;\n}\n\n/**\n *\n * Try to find sessions with a topic id and expire them.\n *\n */\nexport async function cleanupSingleSession(client: SignClient, topic: string) {\n const sessions = client.session.getAll();\n const pairings = client.pairing.getAll();\n\n sessions.forEach((session) => {\n if (session.topic === topic || session.pairingTopic === topic) {\n const requestForDeleteTopic =\n session.pairingTopic === topic ? session.pairingTopic : session.topic;\n client.core.expirer.set(requestForDeleteTopic, 0);\n }\n });\n\n pairings.forEach((pairing) => {\n if (pairing.topic === topic) {\n client.core.expirer.set(topic, 0);\n }\n });\n}\n\n/**\n *\n * Disconnect means to delete the session on both parties (dApp & wallet) at the same time.\n *\n */\nexport async function disconnectSessions(client: SignClient) {\n const allPromises = [];\n\n const sessions = client.session.getAll();\n for (const session of sessions) {\n allPromises.push(\n client.disconnect({\n topic: session.topic,\n reason: getSdkError('USER_DISCONNECTED'),\n })\n );\n }\n\n const pairings = client.pairing.getAll();\n for (const pairing of pairings) {\n allPromises.push(\n client.disconnect({\n topic: pairing.topic,\n reason: getSdkError('USER_DISCONNECTED'),\n })\n );\n }\n\n // reset the current chain id\n void persistCurrentChainId(client, undefined);\n\n return await Promise.all(allPromises);\n}\n\nexport function getAccountsFromSession(session: SessionTypes.Struct) {\n const accounts = Object.values(session.namespaces)\n .map((namespace) => namespace.accounts)\n .flat()\n .map((account) => {\n const { address, chainId } = new AccountId(account);\n /*\n * Note: Solana has a specific ID, we need to convert it back to network name.\n * It will return the chain id itslef if it's not that specific ID.\n */\n const chain = solanaChainIdToNetworkName(chainId.reference);\n return {\n address,\n chainId: chain,\n };\n });\n return accounts;\n}\n\nexport function getAccountsFromEvent(\n event: SignClientTypes.BaseEventArgs<{\n namespaces: SessionTypes.Namespaces;\n }>\n) {\n const accounts = Object.values(event.params.namespaces)\n .map((namespace) => namespace.accounts)\n .flat()\n .map((account) => {\n const { address, chainId } = new AccountId(account);\n return {\n accounts: [address],\n chainId:\n chainId.namespace === 'solana' ? Networks.SOLANA : chainId.reference,\n };\n });\n\n return accounts;\n}\n\n/*\n * Before switch network, we need to update session namespace accounts\n * to contain both current chain and target chain accoutns.\n */\nexport async function updateSessionAccounts(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n instance: any,\n requestedNetwork: string,\n currentNetwork: string,\n meta: BlockchainMeta[]\n) {\n const session = instance.session;\n\n const namespaces = session.namespaces;\n let needUpdateNamepspace = false;\n const accounts = namespaces.eip155.accounts;\n\n const currentAccountAddress = getCurrentEvmAccountAddress(instance);\n const requestedAccount = getEvmAccount(\n requestedNetwork,\n currentAccountAddress,\n meta\n );\n if (!accounts.includes(requestedAccount)) {\n accounts.push(requestedAccount);\n needUpdateNamepspace = true;\n }\n\n const currentAccount = getEvmAccount(\n currentNetwork,\n currentAccountAddress,\n meta\n );\n if (!accounts.includes(currentAccount)) {\n accounts.push(currentAccount);\n needUpdateNamepspace = true;\n }\n\n if (needUpdateNamepspace) {\n const updatedNamespaces = {\n ...namespaces,\n eip155: {\n ...namespaces.eip155,\n accounts,\n },\n };\n await instance.client.session\n .update({\n topic: session.topic,\n namespaces: updatedNamespaces,\n })\n .catch((err: unknown) => {\n console.log(err);\n });\n }\n}\n\n/*\n * Certain wallets, such as Trust Wallet and 1inch, are providing incorrect methods in\n * response to session proposal requests. These wallets do not support certain optional\n * RPC methods like \"wallet_xyz,\" but they include them in the response under the session namespace.\n * For the time being, we should avoid their session namespace response.\n * see also: https://github.com/trustwallet/wallet-core/issues/3588\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function ignoreNamespaceMethods(instance: any): boolean {\n const WALLETS_WITH_WRONG_NAMESPACE_METHODS = ['trust', '1inch'];\n const peerName = instance?.session?.peer?.metadata?.name;\n return WALLETS_WITH_WRONG_NAMESPACE_METHODS.some((name) =>\n peerName?.toLowerCase()?.includes(name)\n );\n}\n\nexport async function persistCurrentChainId(\n client: SignClient,\n chainId?: string\n) {\n return client.core.storage.setItem(CHAIN_ID_STORAGE, {\n defaultChainId: chainId ? parseInt(chainId) : '',\n });\n}\n\n/*\n * get the latest chain id from the storage,\n * used for setting current chain id in session reconnect.\n */\nexport async function getPersistedChainId(client: SignClient) {\n try {\n const chainId = (await client.core.storage.getItem(CHAIN_ID_STORAGE))\n ?.defaultChainId;\n return !!chainId ? String(chainId) : undefined;\n } catch {\n return undefined;\n }\n}\n", "import type { WCInstance } from './types.js';\nimport type { SignerFactory } from 'rango-types';\n\nimport { dynamicImportWithRefinedError } from '@rango-dev/wallets-shared';\nimport { DefaultSignerFactory, TransactionType as TxType } from 'rango-types';\n\nexport default async function getSigners(\n instance: WCInstance\n): Promise<SignerFactory> {\n if (!instance.session) {\n throw new Error('Session is required for wallet connect signers.');\n }\n\n const signers = new DefaultSignerFactory();\n const EVMSigner = (\n await dynamicImportWithRefinedError(\n async () => await import('./signers/evm.js')\n )\n ).default;\n const SOLANASigner = (\n await dynamicImportWithRefinedError(\n async () => await import('./signers/solana.js')\n )\n ).default;\n\n signers.registerSigner(\n TxType.EVM,\n new EVMSigner(instance.client, instance.session)\n );\n signers.registerSigner(\n TxType.SOLANA,\n new SOLANASigner(instance.client, instance.session)\n );\n\n return signers;\n}\n"],
5
- "mappings": "8LAcA,OAAS,SAAAA,GAAO,SAASC,OAAgB,0BACzC,OAAS,YAAAC,GAAU,eAAAC,OAAmB,4BACtC,OAAOC,OAAY,6BACnB,OAAS,aAAAC,GAAW,WAAAC,OAAe,OACnC,OAAS,kBAAAC,OAAsB,cCZ/B,OACE,0CAAAC,GACA,gBAAAC,EACA,YAAAC,OACK,4BCCM,IAAAC,EAAA,KAAmB,OAAA,CAAAC,EAAA,UACvB,YAAYC,EAAkC,CAerD,KAAO,UAAYC,EAAU,KAE7B,KAAO,WAAaA,EAAU,MAE9B,KAAO,eAAiBA,EAAU,UAElC,KAAO,SAAWC,EAAU,eApB1BA,EAAU,eAAeF,CAAM,EAC/BG,EAAW,UAAUH,CAAM,EAC3B,KAAK,OAAA,CACP,CAEA,MAAc,QAAS,CACrB,GAAI,OAAO,OAAW,IAAa,CACjC,KAAa,QAAA,oBAAyB,EACtC,IAAMI,EAAQ,SAAS,cAAc,WAAW,EAChD,SAAS,KAAK,sBAAsB,YAAaA,CAAK,EACtDC,EAAY,cAAc,EAAI,CAAA,CAElC,CASF,EDtBA,OAAS,aAAAC,EAAW,WAAAC,MAAe,OACnC,OAAS,kBAAAC,GAAgB,mBAAAC,OAAuB,cEAhD,OAAS,YAAAC,GAAU,WAAAC,OAAe,4BAClC,OAAS,eAAAC,MAAmB,uBAC5B,OAAS,aAAAC,MAAiB,OAWnB,SAASC,EAAeC,EAAoB,CACjD,OAAOA,EAAO,QAAQ,OAAOA,EAAO,QAAQ,OAAO,OAAS,CAAC,CAC/D,CAFgBC,EAAAF,EAAA,kBAUhB,eAAsBG,GACpBF,EACAG,EAC0C,CAC1C,aAAMC,GACJJ,EAAO,KAAK,CACV,MAAOG,CACT,CAAC,EACDE,CACF,EAGgBN,EAAeC,CAAM,CAEvC,CAdsBC,EAAAC,GAAA,kBAwBtB,eAAsBI,GACpBN,EACAO,EACAC,EAG8B,CAC9B,GAAM,CAAE,mBAAAC,EAAoB,mBAAAC,EAAoB,aAAAP,CAAa,EAAII,EAEjE,GAAI,CACF,GAAM,CAAE,IAAAI,EAAK,SAAAC,CAAS,EAAI,MAAMZ,EAAO,QAAQ,CAC7C,mBAAAS,EACA,mBAAAC,EACA,aAAAP,CACF,CAAC,EAGGU,EACJ,GAAIF,EAAK,CAKP,IAAMG,EAAeN,EAAQ,KAAK,4BAClC,GAAIM,EAAc,CAChB,IAAMC,EAAM,GAAGD,CAAY,WAAW,mBAAmBH,CAAG,CAAC,GAC7D,OAAO,KAAKI,EAAK,SAAU,qBAAqB,CAClD,KAAO,CAEL,IAAMC,EAAgB,CACpB,GAAIP,GAAsB,CAAC,EAC3B,GAAIC,GAAsB,CAAC,CAC7B,EAEMO,EAAmB,OAAO,OAAOD,CAAa,EACjD,IAAKE,GAAcA,EAAU,MAAM,EACnC,KAAK,EAEFC,EAAQC,EAAS,EAClBD,EAAM,UAAU,CAAE,IAAAR,EAAK,OAAQM,CAAiB,CAAC,EAEtDJ,EAAe,IAAI,QAAQ,CAACQ,EAAGC,KAAW,CACxCH,EAAM,eAAgBI,IAAU,CAEzBA,GAAM,MACTD,GAAO,IAAI,MAAM,wBAAwB,CAAC,CAE9C,CAAC,CACH,CAAC,CACH,CACF,CAEA,IAAME,EAAUZ,EAAS,EAEzB,OAAIC,EACa,MAAM,QAAQ,KAAK,CAACW,EAASX,CAAY,CAAC,EAIpD,MAAMW,CACf,QAAE,CACAJ,EAAS,EAAE,WAAW,CACxB,CACF,CA/DsBnB,EAAAK,GAAA,iBAwEf,SAASmB,GACdzB,EACiC,CACjC,IAAM0B,EAAW1B,EAAO,QAAQ,OAAO,CAAE,OAAQ,EAAK,CAAC,EAIvD,OAFE0B,EAAS,OAAS,EAAIA,EAASA,EAAS,OAAS,CAAC,EAAI,MAG1D,CARgBzB,EAAAwB,GAAA,iBAehB,eAAsBE,EACpB3B,EACA4B,EAC8B,CAC9B,GAAM,CAAE,KAAAC,CAAK,EAAID,EAGXlB,EAAqBoB,EAA0BD,CAAI,EAGrDL,EACEO,EAAUN,GAAczB,CAAM,EACpC,GAAI+B,EACF,GAAI,CACFP,EAAU,MAAMtB,GAAeF,EAAQ+B,EAAQ,KAAK,CACtD,MAAQ,CACN,MAAMC,EAAmBhC,CAAM,CACjC,CAIF,OAAKwB,IACHA,EAAU,MAAMlB,GACdN,EACA,CACE,mBAAoB,CAAC,EACrB,mBAAAU,CACF,EACA,CACE,KAAMkB,EAAO,IACf,CACF,GAGKJ,CACT,CAnCsBvB,EAAA0B,EAAA,cA0CtB,eAAsBM,EAAqBjC,EAAoBkC,EAAe,CAC5E,IAAMC,EAAWnC,EAAO,QAAQ,OAAO,EACjC0B,EAAW1B,EAAO,QAAQ,OAAO,EAEvCmC,EAAS,QAASX,GAAY,CAC5B,GAAIA,EAAQ,QAAUU,GAASV,EAAQ,eAAiBU,EAAO,CAC7D,IAAME,EACJZ,EAAQ,eAAiBU,EAAQV,EAAQ,aAAeA,EAAQ,MAClExB,EAAO,KAAK,QAAQ,IAAIoC,EAAuB,CAAC,CAClD,CACF,CAAC,EAEDV,EAAS,QAASK,GAAY,CACxBA,EAAQ,QAAUG,GACpBlC,EAAO,KAAK,QAAQ,IAAIkC,EAAO,CAAC,CAEpC,CAAC,CACH,CAjBsBjC,EAAAgC,EAAA,wBAwBtB,eAAsBD,EAAmBhC,EAAoB,CAC3D,IAAMqC,EAAc,CAAC,EAEfF,EAAWnC,EAAO,QAAQ,OAAO,EACvC,QAAWwB,KAAWW,EACpBE,EAAY,KACVrC,EAAO,WAAW,CAChB,MAAOwB,EAAQ,MACf,OAAQc,EAAY,mBAAmB,CACzC,CAAC,CACH,EAGF,IAAMZ,EAAW1B,EAAO,QAAQ,OAAO,EACvC,QAAW+B,KAAWL,EACpBW,EAAY,KACVrC,EAAO,WAAW,CAChB,MAAO+B,EAAQ,MACf,OAAQO,EAAY,mBAAmB,CACzC,CAAC,CACH,EAIF,OAAKC,EAAsBvC,EAAQ,MAAS,EAErC,MAAM,QAAQ,IAAIqC,CAAW,CACtC,CA3BsBpC,EAAA+B,EAAA,sBA6Bf,SAASQ,EAAuBhB,EAA8B,CAgBnE,OAfiB,OAAO,OAAOA,EAAQ,UAAU,EAC9C,IAAKN,GAAcA,EAAU,QAAQ,EACrC,KAAK,EACL,IAAKuB,GAAY,CAChB,GAAM,CAAE,QAAAC,EAAS,QAAAC,CAAQ,EAAI,IAAIC,EAAUH,CAAO,EAK5CI,EAAQC,EAA2BH,EAAQ,SAAS,EAC1D,MAAO,CACL,QAAAD,EACA,QAASG,CACX,CACF,CAAC,CAEL,CAjBgB5C,EAAAuC,EAAA,0BAmBT,SAASO,EACdC,EAGA,CAaA,OAZiB,OAAO,OAAOA,EAAM,OAAO,UAAU,EACnD,IAAK9B,GAAcA,EAAU,QAAQ,EACrC,KAAK,EACL,IAAKuB,GAAY,CAChB,GAAM,CAAE,QAAAC,EAAS,QAAAC,CAAQ,EAAI,IAAIC,EAAUH,CAAO,EAClD,MAAO,CACL,SAAU,CAACC,CAAO,EAClB,QACEC,EAAQ,YAAc,SAAWM,GAAS,OAASN,EAAQ,SAC/D,CACF,CAAC,CAGL,CAlBgB1C,EAAA8C,EAAA,wBAwBhB,eAAsBG,EAEpBC,EACAC,EACAC,EACAxB,EACA,CACA,IAAML,EAAU2B,EAAS,QAEnBG,EAAa9B,EAAQ,WACvB+B,EAAuB,GACrBC,EAAWF,EAAW,OAAO,SAE7BG,EAAwBC,EAA4BP,CAAQ,EAC5DQ,EAAmBC,EACvBR,EACAK,EACA5B,CACF,EACK2B,EAAS,SAASG,CAAgB,IACrCH,EAAS,KAAKG,CAAgB,EAC9BJ,EAAuB,IAGzB,IAAMM,EAAiBD,EACrBP,EACAI,EACA5B,CACF,EAMA,GALK2B,EAAS,SAASK,CAAc,IACnCL,EAAS,KAAKK,CAAc,EAC5BN,EAAuB,IAGrBA,EAAsB,CACxB,IAAMO,EAAoB,CACxB,GAAGR,EACH,OAAQ,CACN,GAAGA,EAAW,OACd,SAAAE,CACF,CACF,EACA,MAAML,EAAS,OAAO,QACnB,OAAO,CACN,MAAO3B,EAAQ,MACf,WAAYsC,CACd,CAAC,EACA,MAAOC,GAAiB,CACvB,QAAQ,IAAIA,CAAG,CACjB,CAAC,CACL,CACF,CAnDsB9D,EAAAiD,EAAA,yBA6Df,SAASc,EAAuBb,EAAwB,CAC7D,IAAMc,EAAuC,CAAC,QAAS,OAAO,EACxDC,EAAWf,GAAU,SAAS,MAAM,UAAU,KACpD,OAAOc,EAAqC,KAAME,GAChDD,GAAU,YAAY,GAAG,SAASC,CAAI,CACxC,CACF,CANgBlE,EAAA+D,EAAA,0BAQhB,eAAsBzB,EACpBvC,EACA2C,EACA,CACA,OAAO3C,EAAO,KAAK,QAAQ,QAAQoE,EAAkB,CACnD,eAAgBzB,EAAU,SAASA,CAAO,EAAI,EAChD,CAAC,CACH,CAPsB1C,EAAAsC,EAAA,yBAatB,eAAsB8B,EAAoBrE,EAAoB,CAC5D,GAAI,CACF,IAAM2C,GAAW,MAAM3C,EAAO,KAAK,QAAQ,QAAQoE,CAAgB,IAC/D,eACJ,OAASzB,EAAU,OAAOA,CAAO,EAAI,MACvC,MAAQ,CACN,MACF,CACF,CARsB1C,EAAAoE,EAAA,uBFvVtB,IAAIC,EACG,SAASC,EAAoBC,EAAmB,CAChDF,IACHA,EAAY,IAAIG,EAAmB,CACjC,UAAAD,EACA,UAAW,QACX,eAAgB,CACd,gBAAiB,WACnB,CACF,CAAC,EAEL,CAVgBE,EAAAH,EAAA,uBAYT,SAASI,GAAmC,CACjD,OAAOL,CACT,CAFgBI,EAAAC,EAAA,YAQT,SAASC,EACdC,EAC6B,CAE7B,IAAMC,EADMC,GAAeF,CAAI,EACT,IAAKG,GAClB,IAAIC,EAAQ,CACjB,mBACA,UAAW,OAAO,SAASD,EAAM,OAAO,CAAC,CAC3C,CAAC,EAAE,SAAS,CACb,EASD,MAPoC,CACjC,OAAsB,CACrB,QAASE,EACT,OAAQC,EACR,OAAQL,CACV,CACF,CAEF,CAnBgBJ,EAAAE,EAAA,6BAqBT,SAASQ,EAA2BC,EAAyB,CAClE,OAAOA,IAAYC,EAA0BC,GAAS,OAASF,CACjE,CAFgBX,EAAAU,EAAA,8BAUhB,eAAsBI,GACpBC,EACAC,EACAb,EACAc,EACA,CACA,GAAIF,EAAO,SAAW,cAAe,CACnC,IAAMG,EAAiBC,EAAeH,CAAQ,EACxCI,EAAmB,OAAO,OAAOF,EAAe,UAAU,EAC7D,IAAKG,GAAcA,EAAU,MAAM,EACnC,KAAK,EAEFC,EAAUL,EAAS,EAAE,QAE3B,GAAIG,EAAiB,OAAS,EAAG,CAC/B,IAAMT,EAAUW,EACZC,EAAwBD,EAASnB,CAAI,EACrC,OAEJ,GAAIQ,EACF,OAAOA,EAIT,IAAMa,EAAaJ,EADA,CAC2B,EAE9C,OADqB,IAAIb,EAAQiB,CAAU,EACvB,SACtB,CAEA,MAAM,IAAI,MAAM,sCAAsC,CACxD,CACA,MAAM,IAAI,MAAM,sBAAuBT,CAAM,CAC/C,CAhCsBf,EAAAc,GAAA,mBAkCf,SAASS,EACdD,EACAnB,EACoB,CAIpB,IAAMsB,EAHmBtB,EAAK,KAC3BuB,GAAeA,EAAW,OAASJ,CACtC,GACuC,QACvC,OAAKG,EAIW,OAAO,SAASA,CAAY,CAAC,EAH3C,MAMJ,CAfgBzB,EAAAuB,EAAA,2BAiBhB,eAAsBI,GACpBxB,EACAyB,EACAC,EACAC,EACA,CACA,IAAMzB,EAAiBF,EAAK,OAAO4B,EAAe,EAG5CC,EADJC,GAAuC5B,CAAc,EACduB,CAAgB,EAInDH,EAHmBtB,EAAK,KAC3BuB,GAA+BA,EAAW,OAASE,CACtD,GACuC,QAEjCM,EAAiBX,EAAwBM,EAAgB1B,CAAI,EAC7DgC,EAAkB5B,EAAQ,OAAO,CACrC,mBACA,UAAW,OAAO2B,CAAc,CAClC,CAAC,EAEKE,EAAUN,EAAS,QAEzB,GAAI,CACF,MAAMA,EAAS,OAAO,QAAQ,CAC5B,MAAOM,EAAQ,MACf,QAAS,CACP,oCACA,OAAQ,CACN,CACE,QAASX,CACX,CACF,CACF,EAEA,QAASU,CACX,CAAC,CACH,OAASE,EAAU,CAEjB,GACEA,GAAK,OAAS,MACdA,GAAK,SAAS,SAAS,OAAO,IAAa,CAAC,EAE5C,MAAMP,EAAS,OAAO,QAAQ,CAC5B,MAAOM,EAAQ,MACf,QAAS,CACP,iCACA,OAAQ,CAACJ,CAAW,CACtB,EAEA,QAASG,CACX,CAAC,MAED,OAAME,CAEV,CACF,CAxDsBrC,EAAA2B,GAAA,uBA0Df,SAASW,EAA4BR,EAAe,CACzD,OAAOA,EAAS,QAAQ,WAAW,OAAO,UACtC,IAAKS,GACE,IAAIC,EAAUD,CAAO,EAAE,OAC/B,GACC,OAAQE,GAAoBC,EAAaD,CAAO,CAAC,IAAI,CAAC,CAC5D,CANgBzC,EAAAsC,EAAA,+BAQT,SAASK,EACdrB,EACAmB,EACAtC,EACA,CACA,IAAM+B,EAAiBX,EAAwBD,EAASnB,CAAI,EAC5D,OAAOqC,EAAU,OAAO,CACtB,QAAS,CACP,mBACA,UAAW,OAAON,CAAc,CAClC,EACA,QAAAO,CACF,CAAC,CACH,CAbgBzC,EAAA2C,EAAA,iBAgBT,SAASC,GACdC,EAIAX,EACA,CACA,IAAIY,EAAkB,GACtB,OAAOD,EACJ,OAAO,CAAC,CAAE,QAAAJ,EAAS,QAAA9B,CAAQ,IAAM,CAEhC,GADc+B,EAAaD,CAAO,EACvB,CACT,GAAIP,GAAkBvB,IAAYuB,EAChC,MAAO,GAET,GAAI,CAACA,EAAgB,CACnB,GAAIY,EACF,MAAO,GAETA,EAAkB,EACpB,CACF,CACA,MAAO,EACT,CAAC,EACA,IAAI,CAAC,CAAE,QAAAL,EAAS,QAAA9B,CAAQ,KAAO,CAC9B,SAAU,CAAC8B,CAAO,EAClB,QAAS9B,CACX,EAAE,CACN,CA5BgBX,EAAA4C,GAAA,qBG9MhB,OAAS,iCAAAG,OAAqC,4BAC9C,OAAS,wBAAAC,GAAsB,mBAAmBC,OAAc,cAEhE,eAAOC,EACLC,EACwB,CACxB,GAAI,CAACA,EAAS,QACZ,MAAM,IAAI,MAAM,iDAAiD,EAGnE,IAAMC,EAAU,IAAIC,GACdC,GACJ,MAAMC,GACJ,SAAY,KAAM,QAAO,mBAAkB,CAC7C,GACA,QACIC,GACJ,MAAMD,GACJ,SAAY,KAAM,QAAO,sBAAqB,CAChD,GACA,QAEF,OAAAH,EAAQ,eACNK,GAAO,IACP,IAAIH,EAAUH,EAAS,OAAQA,EAAS,OAAO,CACjD,EACAC,EAAQ,eACNK,GAAO,OACP,IAAID,EAAaL,EAAS,OAAQA,EAAS,OAAO,CACpD,EAEOC,CACT,CA7B8BM,EAAAR,EAAA,cJyC9B,IAAMS,GAASC,GAAY,iBAEvBC,EAAqB,CACvB,cAAe,GACf,4BAA6B,MAC/B,EAIaC,GAAOC,EAACC,GAA+B,CAClDH,EAAOG,EAEPC,EAAoBJ,EAAK,aAAa,CACxC,EAJoB,QAMPK,GAAuB,CAClC,KAAMP,GACN,kBAAmB,GACnB,gBAAiB,GACjB,eAAgBQ,EAChB,qBAAsB,EACxB,EAEaC,GAA2BL,EAAA,MAAOM,GAAY,CACzD,GAAM,CAAE,gBAAAC,EAAiB,SAAAC,EAAU,KAAAC,CAAK,EAAIH,EAMxCI,EACJ,GAAKH,EAYHG,EAAWH,MAZS,CACpB,GAAI,CAACT,EAAK,cACR,MAAM,IAAI,MACR,6DACF,EAEFY,EAAW,MAAMC,GAAO,KAAK,CAC3B,SAAUC,EACV,UAAWd,EAAK,cAChB,SAAUe,CACZ,CAAC,CACH,CAIA,MAAO,CACL,OAAQH,EACR,QAAS,KAET,QAAS,MAAOI,GACdC,GAAgBD,EAAQJ,EAAUD,EAAMD,CAAQ,CACpD,CACF,EA9BwC,eAgC3BQ,GAAmBhB,EAAA,MAAO,CAAE,SAAAiB,EAAU,KAAAR,CAAK,IAAM,CAC5D,GAAM,CAAE,OAAAS,CAAO,EAAID,EAEbE,EAAU,MAAMC,EAAWF,EAAQ,CAAE,KAAAT,EAAM,KAAAX,CAAK,CAAC,EAEvDmB,EAAS,QAAUE,EACnB,IAAME,EAAiB,MAAMC,EAAoBJ,CAAM,EACjDK,EAAWC,EAAuBL,CAAO,EAC/C,OAAOM,GAAkBF,EAAUF,CAAc,CACnD,EATgC,WAWnBK,GAAuB1B,EAAA,CAAC,CACnC,SAAAiB,EACA,cAAAU,EACA,eAAAC,EACA,WAAAC,CACF,IAAM,CACJ,GAAM,CAAE,OAAAX,CAAO,EAAID,EAQnBC,EAAO,GAAG,iBAAmBY,GAAS,CAChBC,EAAqBD,CAAI,EACjC,QAASE,GAAsB,CACzCJ,EAAeI,EAAkB,SAAUA,EAAkB,OAAO,CACtE,CAAC,CACH,CAAC,EAGDd,EAAO,GAAG,gBAAkBY,GAAS,CACnC,GAAIA,EAAK,OAAO,MAAM,yBAA0C,CAC9D,IAAMP,EAAWO,EAAK,OAAO,MAAM,KAAK,IAAKG,GACpC,IAAIC,GAAUD,CAAO,EAAE,OAC/B,EACKE,EAAUC,GAAQ,MAAMN,EAAK,OAAO,OAAO,EAAE,UACnDF,EAAeL,CAAQ,EACvBI,EAAcQ,CAAO,CACvB,SAAWL,EAAK,OAAO,MAAM,sBAAuC,CAClE,IAAMK,EAAUL,EAAK,OAAO,MAAM,KAClCH,EAAcQ,CAAO,EAChBE,EAAsBpB,EAAS,OAAQkB,CAAO,CACrD,MACE,QAAQ,IAAI,oCAAqCL,EAAK,OAAO,KAAK,CAEtE,CAAC,EAEDZ,EAAO,GAAG,iBAAkB,MAAOoB,GAAU,CAC3C,QAAQ,IAAI,qDAAsDA,CAAK,EAClEC,EAAqBrB,EAAQoB,EAAM,KAAK,EAC7CT,EAAW,CACb,CAAC,CACH,EA5CoC,aA8CvBW,GAA+BxC,EAAA,MAAO,CACjD,QAAAyC,EACA,SAAAxB,EACA,KAAAR,EACA,SAAAD,EACA,cAAAmB,CACF,IAAM,CAEJ,IAAMQ,EADMO,GAAejC,CAAI,EACX,KAAMkC,GAAUA,EAAM,OAASF,CAAO,GAAG,QAC7D,GAAI,CAACN,EAAS,CACZ,IAAMS,EAAQ,IAAI,MAAM,yBAAyBT,CAAO,EAAE,EAC1D,MAAAU,GAASD,CAAK,EACRA,CACR,CACA,IAAME,EAAc,IAAIV,GAAQ,CAC9B,mBACA,UAAW,OAAO,SAASD,CAAO,CAAC,CACrC,CAAC,EAAE,SAAS,EAGNY,EADU9B,EAAS,QACI,WAAW,OAClC+B,EAAmBD,GAAc,QAAU,CAAC,EAGlD,IAF0BA,GAAc,SAAW,CAAC,GAGhC,qCAAwC,GAC1D,CAACE,EAAuBhC,CAAQ,EAChC,CACA,IAAMiC,EAAiB1C,IAAW,EAAE,SAAW2C,GAAS,SACxD,MAAMC,EAAsBnC,EAAUwB,EAASS,EAAgBzC,CAAI,EACnE,MAAM4C,GAAoB5C,EAAMgC,EAASS,EAAgBjC,CAAQ,CACnE,SAAW+B,EAAiB,SAASF,CAAW,EAAG,CACjDnB,EAAcQ,CAAO,EACrB,MACF,KAAO,CACL,IAAMS,EAAQ,IAAI,MAAM,SAAST,CAAO,qBAAqB,EAC7D,MAAAU,GAASD,CAAK,EACRA,CACR,CACF,EAvC4C,iBAgD/BU,GAAuCtD,EAAA,IAAM,GAAN,sBAEvC6B,GAAyB7B,EAAA,MAAO,CAAE,SAAAiB,CAAS,IAAM,CAC5D,GAAM,CAAE,OAAAC,CAAO,EAAID,EAEfC,GACGqC,EAAmBrC,CAAM,EAAE,MAAO0B,GAAUY,GAAMZ,CAAK,CAAC,CAEjE,EANsC,cAQzBa,GACXA,EAEWC,GAAkE1D,EAC7E2D,IAGO,CACL,KAAM,gBACN,IAAK,8FACL,YAAa,GACb,MAAO,UACP,gBANWjB,GAAeiB,CAAc,EAOxC,aAAc,GACd,aAAc,EAChB,GAZ6E",
6
- "names": ["debug", "logError", "Networks", "WalletTypes", "Client", "AccountId", "ChainId", "evmBlockchains", "convertEvmBlockchainMetaToEvmChainInfo", "isEvmAddress", "Networks", "WalletConnectModal", "__name", "config", "ModalCtrl", "ThemeCtrl", "ConfigCtrl", "modal", "OptionsCtrl", "AccountId", "ChainId", "evmBlockchains", "isEvmBlockchain", "Networks", "timeout", "getSdkError", "AccountId", "getLastSession", "client", "__name", "restoreSession", "pairingTopic", "timeout", "PING_TIMEOUT", "createSession", "options", "configs", "requiredNamespaces", "optionalNamespaces", "uri", "approval", "onCloseModal", "redirectLink", "url", "allNamespaces", "standaloneChains", "namespace", "modal", "getModal", "_", "reject", "state", "session", "tryGetPairing", "pairings", "tryConnect", "params", "meta", "generateOptionalNamespace", "pairing", "disconnectSessions", "cleanupSingleSession", "topic", "sessions", "requestForDeleteTopic", "allPromises", "getSdkError", "persistCurrentChainId", "getAccountsFromSession", "account", "address", "chainId", "AccountId", "chain", "solanaChainIdToNetworkName", "getAccountsFromEvent", "event", "Networks", "updateSessionAccounts", "instance", "requestedNetwork", "currentNetwork", "namespaces", "needUpdateNamepspace", "accounts", "currentAccountAddress", "getCurrentEvmAccountAddress", "requestedAccount", "getEvmAccount", "currentAccount", "updatedNamespaces", "err", "ignoreNamespaceMethods", "WALLETS_WITH_WRONG_NAMESPACE_METHODS", "peerName", "name", "CHAIN_ID_STORAGE", "getPersistedChainId", "web3Modal", "createModalInstance", "projectId", "d", "__name", "getModal", "generateOptionalNamespace", "meta", "evmChains", "evmBlockchains", "chain", "ChainId", "DEFAULT_ETHEREUM_METHODS", "DEFAULT_ETHEREUM_EVENTS", "solanaChainIdToNetworkName", "chainId", "DEFAULT_SOLANA_CHAIN_ID", "Networks", "simulateRequest", "params", "provider", "getState", "currentSession", "getLastSession", "standaloneChains", "namespace", "network", "getChainIdByNetworkName", "firstChain", "chainIdInHex", "blockchain", "switchOrAddEvmChain", "requestedNetwork", "currentNetwork", "instance", "isEvmBlockchain", "targetChain", "convertEvmBlockchainMetaToEvmChainInfo", "currentChainId", "currentChainEip", "session", "err", "getCurrentEvmAccountAddress", "account", "AccountId", "address", "isEvmAddress", "getEvmAccount", "filterEvmAccounts", "accounts", "firstEvmAddress", "dynamicImportWithRefinedError", "DefaultSignerFactory", "TxType", "getSigners", "instance", "signers", "DefaultSignerFactory", "EVMSigner", "dynamicImportWithRefinedError", "SOLANASigner", "TxType", "__name", "WALLET", "WalletTypes", "envs", "init", "__name", "environments", "createModalInstance", "config", "DEFAULT_NETWORK", "getInstance", "options", "currentProvider", "getState", "meta", "provider", "Client", "RELAY_URL", "DEFAULT_APP_METADATA", "params", "simulateRequest", "connect", "instance", "client", "session", "tryConnect", "currentChainId", "getPersistedChainId", "accounts", "getAccountsFromSession", "filterEvmAccounts", "subscribe", "updateChainId", "updateAccounts", "disconnect", "args", "getAccountsFromEvent", "accountsWithChain", "account", "AccountId", "chainId", "ChainId", "persistCurrentChainId", "event", "cleanupSingleSession", "switchNetwork", "network", "evmBlockchains", "chain", "error", "logError", "chaindIdStr", "evmNamespace", "authorizedChains", "ignoreNamespaceMethods", "currentNetwork", "Networks", "updateSessionAccounts", "switchOrAddEvmChain", "canSwitchNetworkTo", "disconnectSessions", "debug", "getSigners", "getWalletInfo", "allBlockChains"]
7
- }
package/dist/session.d.ts DELETED
@@ -1,63 +0,0 @@
1
- import type { ConnectParams, CreateSessionParams, Environments } from './types.js';
2
- import type { SignClient } from '@walletconnect/sign-client/dist/types/client';
3
- import type { PairingTypes, SessionTypes, SignClientTypes } from '@walletconnect/types';
4
- import type { BlockchainMeta } from 'rango-types';
5
- export declare function getLastSession(client: SignClient): SessionTypes.Struct;
6
- /**
7
- *
8
- * Try to ping the wallet, if wallet responded with `pong`, session is a valid and we will use the session.
9
- * If the wallet didn't respond during 10 seconds (PING_TIME), we assume the wallet isn't available and we need to create a new session.
10
- *
11
- */
12
- export declare function restoreSession(client: SignClient, pairingTopic: PairingTypes.Struct['topic']): Promise<SessionTypes.Struct | undefined>;
13
- /**
14
- *
15
- * Getting a pair of required and optional namespaces then tries to show a modal and connect (pair)
16
- * To the wallet.
17
- * @param client
18
- * @param options
19
- * @returns
20
- */
21
- export declare function createSession(client: SignClient, options: CreateSessionParams, configs: {
22
- envs: Environments;
23
- }): Promise<SessionTypes.Struct>;
24
- /**
25
- *
26
- * A user (client) can have multiple pairings (to different wallets), we are assuming
27
- * the last pairing is the active pairing for now. A better UX can be showing a list of pairings
28
- * and let the user to choose the right pairing manually. Because we don't have that yet, we will pick up the last one.
29
- *
30
- */
31
- export declare function tryGetPairing(client: SignClient): PairingTypes.Struct | undefined;
32
- /**
33
- *
34
- * Try to restore the session first, if couldn't, create a new session by showing a modal.
35
- *
36
- */
37
- export declare function tryConnect(client: SignClient, params: ConnectParams): Promise<SessionTypes.Struct>;
38
- /**
39
- *
40
- * Try to find sessions with a topic id and expire them.
41
- *
42
- */
43
- export declare function cleanupSingleSession(client: SignClient, topic: string): Promise<void>;
44
- /**
45
- *
46
- * Disconnect means to delete the session on both parties (dApp & wallet) at the same time.
47
- *
48
- */
49
- export declare function disconnectSessions(client: SignClient): Promise<void[]>;
50
- export declare function getAccountsFromSession(session: SessionTypes.Struct): {
51
- address: string;
52
- chainId: string;
53
- }[];
54
- export declare function getAccountsFromEvent(event: SignClientTypes.BaseEventArgs<{
55
- namespaces: SessionTypes.Namespaces;
56
- }>): {
57
- accounts: string[];
58
- chainId: string;
59
- }[];
60
- export declare function updateSessionAccounts(instance: any, requestedNetwork: string, currentNetwork: string, meta: BlockchainMeta[]): Promise<void>;
61
- export declare function ignoreNamespaceMethods(instance: any): boolean;
62
- export declare function persistCurrentChainId(client: SignClient, chainId?: string): Promise<void>;
63
- export declare function getPersistedChainId(client: SignClient): Promise<string | undefined>;
@@ -1,14 +0,0 @@
1
- import type { SignClient } from '@walletconnect/sign-client/dist/types/client';
2
- import type { SessionTypes } from '@walletconnect/types';
3
- import type { GenericSigner, SolanaTransaction } from 'rango-types';
4
- declare class SOLANASigner implements GenericSigner<SolanaTransaction> {
5
- private client;
6
- private session;
7
- constructor(client: SignClient, session: SessionTypes.Struct);
8
- signMessage(msg: string, address: string, chainId: string | null): Promise<string>;
9
- signAndSendTx(tx: SolanaTransaction, address: string, chainId: string | null): Promise<{
10
- hash: string;
11
- }>;
12
- private isNetworkAndAccountExistInSession;
13
- }
14
- export default SOLANASigner;
@@ -1,2 +0,0 @@
1
- import"./chunk-6V3WUFOU.js";import{a as l}from"./chunk-DXVBX5XQ.js";import{generalSolanaTransactionExecutor as h}from"@rango-dev/signer-solana";import{PublicKey as u}from"@solana/web3.js";import g from"bs58";import{AccountId as f,ChainId as S}from"caip";import{SignerError as w,SignerErrorCode as y}from"rango-types";var c="solana",p=class{static{l(this,"SOLANASigner")}client;session;constructor(s,e){this.client=s,this.session=e}async signMessage(s,e,o){let n=this.isNetworkAndAccountExistInSession({address:e,chainId:o}),a=new S({namespace:c,reference:n.chainId});try{let t=g.encode(new TextEncoder().encode(s)),i=new u(e),{signature:r}=await this.client.request({topic:this.session.topic,chainId:a.toString(),request:{method:"solana_signMessage",params:{message:t,pubkey:i}}});return r}catch(t){throw new w(y.SIGN_TX_ERROR,void 0,t)}}async signAndSendTx(s,e,o){let n=this.isNetworkAndAccountExistInSession({address:e,chainId:o});return{hash:await h(s,l(async i=>{let r=await this.client.request({topic:this.session.topic,chainId:n.caipChainId,request:{method:"solana_signTransaction",params:i}}),d=new u(s.from),m=g.decode(r.signature);return i.addSignature(d,Buffer.from(m)),i.serialize()},"DefaultSolanaSigner"))}}isNetworkAndAccountExistInSession(s){let{address:e,chainId:o}=s,n=o;if(this.session.namespaces[c]?.accounts.map(r=>{let d=r.split(":");d[2]===e&&(n=d[1])}),!n)throw new Error("You need to set your chain for signing message/transaction.");let a=new f({chainId:{namespace:c,reference:n},address:e}),t=this.session.namespaces[c]?.accounts.map(r=>r);if(!t||!t.includes(a.toString()))throw console.warn("Available adresses and requested address:",t,a.toString()),new Error("Your requested address doesn't exist on your wallect connect session. Please reconnect your wallet.");let i=new S({namespace:c,reference:n});return{chainId:n,address:e,caipChainId:i.toString()}}},P=p;export{P as default};
2
- //# sourceMappingURL=solana-MFA7C5XI.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/signers/solana.ts"],
4
- "sourcesContent": ["import type { SolanaWeb3Signer } from '@rango-dev/signer-solana';\nimport type { Transaction, VersionedTransaction } from '@solana/web3.js';\nimport type { SignClient } from '@walletconnect/sign-client/dist/types/client';\nimport type { SessionTypes } from '@walletconnect/types';\nimport type { GenericSigner, SolanaTransaction } from 'rango-types';\n\nimport { generalSolanaTransactionExecutor } from '@rango-dev/signer-solana';\nimport { PublicKey } from '@solana/web3.js';\nimport base58 from 'bs58';\nimport { AccountId, ChainId } from 'caip';\nimport { SignerError, SignerErrorCode } from 'rango-types';\n\nimport { NAMESPACES, SolanaRPCMethods } from '../constants.js';\n\nconst NAMESPACE_NAME = NAMESPACES.SOLANA;\nclass SOLANASigner implements GenericSigner<SolanaTransaction> {\n private client: SignClient;\n private session: SessionTypes.Struct;\n\n constructor(client: SignClient, session: SessionTypes.Struct) {\n this.client = client;\n this.session = session;\n }\n\n public async signMessage(\n msg: string,\n address: string,\n chainId: string | null\n ): Promise<string> {\n const requestedFor = this.isNetworkAndAccountExistInSession({\n address,\n chainId,\n });\n\n const caipChainId = new ChainId({\n namespace: NAMESPACE_NAME,\n reference: requestedFor.chainId,\n });\n\n try {\n const message = base58.encode(new TextEncoder().encode(msg));\n const pubkey = new PublicKey(address);\n const { signature } = await this.client.request<{\n signature: string;\n }>({\n topic: this.session.topic,\n chainId: caipChainId.toString(),\n request: {\n method: SolanaRPCMethods.SIGN_MESSAGE,\n params: {\n message,\n pubkey,\n },\n },\n });\n\n return signature;\n } catch (error) {\n throw new SignerError(SignerErrorCode.SIGN_TX_ERROR, undefined, error);\n }\n }\n\n async signAndSendTx(\n tx: SolanaTransaction,\n address: string,\n chainId: string | null\n ): Promise<{ hash: string }> {\n const requestedFor = this.isNetworkAndAccountExistInSession({\n address,\n chainId,\n });\n const DefaultSolanaSigner: SolanaWeb3Signer = async (\n solanaWeb3Transaction: Transaction | VersionedTransaction\n ) => {\n const response: { signature: string } = await this.client.request({\n topic: this.session.topic,\n chainId: requestedFor.caipChainId,\n request: {\n method: SolanaRPCMethods.SIGN_TRANSACTION,\n params: solanaWeb3Transaction,\n },\n });\n\n const publicKey = new PublicKey(tx.from);\n const sign = base58.decode(response.signature);\n\n solanaWeb3Transaction.addSignature(publicKey, Buffer.from(sign));\n const raw = solanaWeb3Transaction.serialize();\n return raw;\n };\n\n const hash = await generalSolanaTransactionExecutor(\n tx,\n DefaultSolanaSigner\n );\n return { hash };\n }\n\n private isNetworkAndAccountExistInSession(requestedFor: {\n address: string;\n chainId: string | null;\n }) {\n const { address, chainId } = requestedFor;\n\n /*\n * TODO: solana chain id in supported blockchains(\"mainnet-beta\") is different from solana chain id is here (\"5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp\")\n * # Solana Mainnet\n * solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvd\n * refrence: https://github.com/ChainAgnostic/namespaces/blob/main/solana/caip2.md\n */\n\n let solana_chain_id = chainId;\n this.session.namespaces[NAMESPACE_NAME]?.accounts.map((account) => {\n const sol_account = account.split(':');\n if (sol_account[2] === address) {\n solana_chain_id = sol_account[1];\n }\n });\n\n if (!solana_chain_id) {\n throw new Error(\n 'You need to set your chain for signing message/transaction.'\n );\n }\n const caipAddress = new AccountId({\n chainId: {\n namespace: NAMESPACE_NAME,\n reference: solana_chain_id,\n },\n address,\n });\n\n const addresses = this.session.namespaces[NAMESPACE_NAME]?.accounts.map(\n (address) => address\n );\n if (!addresses || !addresses.includes(caipAddress.toString())) {\n console.warn(\n 'Available adresses and requested address:',\n addresses,\n caipAddress.toString()\n );\n throw new Error(\n `Your requested address doesn't exist on your wallect connect session. Please reconnect your wallet.`\n );\n }\n\n const caipChainId = new ChainId({\n namespace: NAMESPACE_NAME,\n reference: solana_chain_id,\n });\n\n return {\n chainId: solana_chain_id,\n address,\n caipChainId: caipChainId.toString(),\n };\n }\n}\n\nexport default SOLANASigner;\n"],
5
- "mappings": "oEAMA,OAAS,oCAAAA,MAAwC,2BACjD,OAAS,aAAAC,MAAiB,kBAC1B,OAAOC,MAAY,OACnB,OAAS,aAAAC,EAAW,WAAAC,MAAe,OACnC,OAAS,eAAAC,EAAa,mBAAAC,MAAuB,cAI7C,IAAMC,WACAC,EAAN,KAA+D,CAf/D,MAe+D,CAAAC,EAAA,qBACrD,OACA,QAER,YAAYC,EAAoBC,EAA8B,CAC5D,KAAK,OAASD,EACd,KAAK,QAAUC,CACjB,CAEA,MAAa,YACXC,EACAC,EACAC,EACiB,CACjB,IAAMC,EAAe,KAAK,kCAAkC,CAC1D,QAAAF,EACA,QAAAC,CACF,CAAC,EAEKE,EAAc,IAAIC,EAAQ,CAC9B,UAAWV,EACX,UAAWQ,EAAa,OAC1B,CAAC,EAED,GAAI,CACF,IAAMG,EAAUC,EAAO,OAAO,IAAI,YAAY,EAAE,OAAOP,CAAG,CAAC,EACrDQ,EAAS,IAAIC,EAAUR,CAAO,EAC9B,CAAE,UAAAS,CAAU,EAAI,MAAM,KAAK,OAAO,QAErC,CACD,MAAO,KAAK,QAAQ,MACpB,QAASN,EAAY,SAAS,EAC9B,QAAS,CACP,4BACA,OAAQ,CACN,QAAAE,EACA,OAAAE,CACF,CACF,CACF,CAAC,EAED,OAAOE,CACT,OAASC,EAAO,CACd,MAAM,IAAIC,EAAYC,EAAgB,cAAe,OAAWF,CAAK,CACvE,CACF,CAEA,MAAM,cACJG,EACAb,EACAC,EAC2B,CAC3B,IAAMC,EAAe,KAAK,kCAAkC,CAC1D,QAAAF,EACA,QAAAC,CACF,CAAC,EAyBD,MAAO,CAAE,KAJI,MAAMa,EACjBD,EArB4CjB,EAAA,MAC5CmB,GACG,CACH,IAAMC,EAAkC,MAAM,KAAK,OAAO,QAAQ,CAChE,MAAO,KAAK,QAAQ,MACpB,QAASd,EAAa,YACtB,QAAS,CACP,gCACA,OAAQa,CACV,CACF,CAAC,EAEKE,EAAY,IAAIT,EAAUK,EAAG,IAAI,EACjCK,EAAOZ,EAAO,OAAOU,EAAS,SAAS,EAE7C,OAAAD,EAAsB,aAAaE,EAAW,OAAO,KAAKC,CAAI,CAAC,EACnDH,EAAsB,UAAU,CAE9C,EAlB8C,sBAuB9C,CACc,CAChB,CAEQ,kCAAkCb,EAGvC,CACD,GAAM,CAAE,QAAAF,EAAS,QAAAC,CAAQ,EAAIC,EASzBiB,EAAkBlB,EAQtB,GAPA,KAAK,QAAQ,WAAWP,CAAc,GAAG,SAAS,IAAK0B,GAAY,CACjE,IAAMC,EAAcD,EAAQ,MAAM,GAAG,EACjCC,EAAY,CAAC,IAAMrB,IACrBmB,EAAkBE,EAAY,CAAC,EAEnC,CAAC,EAEG,CAACF,EACH,MAAM,IAAI,MACR,6DACF,EAEF,IAAMG,EAAc,IAAIC,EAAU,CAChC,QAAS,CACP,UAAW7B,EACX,UAAWyB,CACb,EACA,QAAAnB,CACF,CAAC,EAEKwB,EAAY,KAAK,QAAQ,WAAW9B,CAAc,GAAG,SAAS,IACjEM,GAAYA,CACf,EACA,GAAI,CAACwB,GAAa,CAACA,EAAU,SAASF,EAAY,SAAS,CAAC,EAC1D,cAAQ,KACN,4CACAE,EACAF,EAAY,SAAS,CACvB,EACM,IAAI,MACR,qGACF,EAGF,IAAMnB,EAAc,IAAIC,EAAQ,CAC9B,UAAWV,EACX,UAAWyB,CACb,CAAC,EAED,MAAO,CACL,QAASA,EACT,QAAAnB,EACA,YAAaG,EAAY,SAAS,CACpC,CACF,CACF,EAEOsB,EAAQ9B",
6
- "names": ["generalSolanaTransactionExecutor", "PublicKey", "base58", "AccountId", "ChainId", "SignerError", "SignerErrorCode", "NAMESPACE_NAME", "SOLANASigner", "__name", "client", "session", "msg", "address", "chainId", "requestedFor", "caipChainId", "ChainId", "message", "base58", "pubkey", "PublicKey", "signature", "error", "SignerError", "SignerErrorCode", "tx", "generalSolanaTransactionExecutor", "solanaWeb3Transaction", "response", "publicKey", "sign", "solana_chain_id", "account", "sol_account", "caipAddress", "AccountId", "addresses", "solana_default"]
7
- }
package/src/helpers.ts DELETED
@@ -1,238 +0,0 @@
1
- /* eslint-disable @typescript-eslint/no-explicit-any */
2
- import type { WalletConnectModal as WalletConnectModalType } from './wc-types.js';
3
- import type { WalletState } from '@rango-dev/wallets-shared';
4
- import type { ProposalTypes } from '@walletconnect/types';
5
- import type { BlockchainMeta } from 'rango-types';
6
-
7
- import {
8
- convertEvmBlockchainMetaToEvmChainInfo,
9
- isEvmAddress,
10
- Networks,
11
- } from '@rango-dev/wallets-shared';
12
- import { WalletConnectModal } from '@walletconnect/modal';
13
- import { AccountId, ChainId } from 'caip';
14
- import { evmBlockchains, isEvmBlockchain } from 'rango-types';
15
-
16
- import {
17
- DEFAULT_ETHEREUM_EVENTS,
18
- DEFAULT_ETHEREUM_METHODS,
19
- DEFAULT_SOLANA_CHAIN_ID,
20
- EthereumRPCMethods,
21
- NAMESPACES,
22
- } from './constants.js';
23
- import { getLastSession } from './session.js';
24
-
25
- let web3Modal: WalletConnectModalType;
26
- export function createModalInstance(projectId: string) {
27
- if (!web3Modal) {
28
- web3Modal = new WalletConnectModal({
29
- projectId,
30
- themeMode: 'light',
31
- themeVariables: {
32
- '--wcm-z-index': '999999999',
33
- },
34
- }) as unknown as WalletConnectModalType;
35
- }
36
- }
37
-
38
- export function getModal(): WalletConnectModalType {
39
- return web3Modal;
40
- }
41
-
42
- type FinalNamespaces = {
43
- [key in NAMESPACES]?: ProposalTypes.BaseRequiredNamespace;
44
- };
45
-
46
- export function generateOptionalNamespace(
47
- meta: BlockchainMeta[]
48
- ): FinalNamespaces | undefined {
49
- const evm = evmBlockchains(meta);
50
- const evmChains = evm.map((chain) => {
51
- return new ChainId({
52
- namespace: NAMESPACES.ETHEREUM,
53
- reference: String(parseInt(chain.chainId)),
54
- }).toString();
55
- });
56
-
57
- const namespaces: FinalNamespaces = {
58
- [NAMESPACES.ETHEREUM]: {
59
- methods: DEFAULT_ETHEREUM_METHODS,
60
- events: DEFAULT_ETHEREUM_EVENTS,
61
- chains: evmChains,
62
- },
63
- };
64
- return namespaces;
65
- }
66
-
67
- export function solanaChainIdToNetworkName(chainId: string): string {
68
- return chainId === DEFAULT_SOLANA_CHAIN_ID ? Networks.SOLANA : chainId;
69
- }
70
-
71
- /**
72
- *
73
- * In `rango-preset` we are working with `window.ethereum.request()`,
74
- * this is an interceptor for some RPC methods (e.g. eth_chainId).
75
- *
76
- */
77
- export async function simulateRequest(
78
- params: any,
79
- provider: any,
80
- meta: BlockchainMeta[],
81
- getState: () => WalletState
82
- ) {
83
- if (params.method === 'eth_chainId') {
84
- const currentSession = getLastSession(provider);
85
- const standaloneChains = Object.values(currentSession.namespaces)
86
- .map((namespace) => namespace.chains)
87
- .flat() as string[];
88
-
89
- const network = getState().network;
90
-
91
- if (standaloneChains.length > 0) {
92
- const chainId = network
93
- ? getChainIdByNetworkName(network, meta)
94
- : undefined;
95
-
96
- if (chainId) {
97
- return chainId;
98
- }
99
-
100
- const firstIndex = 0;
101
- const firstChain = standaloneChains[firstIndex];
102
- const firstChainId = new ChainId(firstChain);
103
- return firstChainId.reference;
104
- }
105
-
106
- throw new Error(`Couldn't find any chain on namespace`);
107
- }
108
- throw new Error('Dissallowed method:', params);
109
- }
110
-
111
- export function getChainIdByNetworkName(
112
- network: string,
113
- meta: BlockchainMeta[]
114
- ): string | undefined {
115
- const targetBlockchain = meta.find(
116
- (blockchain) => blockchain.name === network
117
- );
118
- const chainIdInHex = targetBlockchain?.chainId;
119
- if (!chainIdInHex) {
120
- return undefined;
121
- }
122
-
123
- const chainId = String(parseInt(chainIdInHex));
124
-
125
- return chainId;
126
- }
127
-
128
- export async function switchOrAddEvmChain(
129
- meta: BlockchainMeta[],
130
- requestedNetwork: string,
131
- currentNetwork: string,
132
- instance: any
133
- ) {
134
- const evmBlockchains = meta.filter(isEvmBlockchain);
135
- const evmNetworksChainInfo =
136
- convertEvmBlockchainMetaToEvmChainInfo(evmBlockchains);
137
- const targetChain = evmNetworksChainInfo[requestedNetwork];
138
- const targetBlockchain = meta.find(
139
- (blockchain: BlockchainMeta) => blockchain.name === requestedNetwork
140
- );
141
- const chainIdInHex = targetBlockchain?.chainId;
142
-
143
- const currentChainId = getChainIdByNetworkName(currentNetwork, meta);
144
- const currentChainEip = ChainId.format({
145
- namespace: NAMESPACES.ETHEREUM,
146
- reference: String(currentChainId),
147
- });
148
-
149
- const session = instance.session;
150
-
151
- try {
152
- await instance.client.request({
153
- topic: session.topic,
154
- request: {
155
- method: EthereumRPCMethods.SWITCH_CHAIN,
156
- params: [
157
- {
158
- chainId: chainIdInHex,
159
- },
160
- ],
161
- },
162
- // It's required to pass current chain, otherwise it won't work
163
- chainId: currentChainEip,
164
- });
165
- } catch (err: any) {
166
- const addChainError = 4902;
167
- if (
168
- err?.code === addChainError ||
169
- err?.message?.includes(String(addChainError))
170
- ) {
171
- await instance.client.request({
172
- topic: session.topic,
173
- request: {
174
- method: EthereumRPCMethods.ADD_CHAIN,
175
- params: [targetChain],
176
- },
177
- // It's required to pass current chain, otherwise it won't work
178
- chainId: currentChainEip,
179
- });
180
- } else {
181
- throw err;
182
- }
183
- }
184
- }
185
-
186
- export function getCurrentEvmAccountAddress(instance: any) {
187
- return instance.session.namespaces.eip155.accounts
188
- ?.map((account: string) => {
189
- return new AccountId(account).address;
190
- })
191
- ?.filter((address: string) => isEvmAddress(address))?.[0];
192
- }
193
-
194
- export function getEvmAccount(
195
- network: string,
196
- address: string,
197
- meta: BlockchainMeta[]
198
- ) {
199
- const currentChainId = getChainIdByNetworkName(network, meta);
200
- return AccountId.format({
201
- chainId: {
202
- namespace: NAMESPACES.ETHEREUM,
203
- reference: String(currentChainId),
204
- },
205
- address,
206
- });
207
- }
208
-
209
- // It's enough to return only connected network for the EVM networks and ignore others
210
- export function filterEvmAccounts(
211
- accounts: {
212
- address: string;
213
- chainId: string;
214
- }[],
215
- currentChainId?: string
216
- ) {
217
- let firstEvmAddress = false;
218
- return accounts
219
- .filter(({ address, chainId }) => {
220
- const isEvm = isEvmAddress(address);
221
- if (isEvm) {
222
- if (currentChainId && chainId !== currentChainId) {
223
- return false;
224
- }
225
- if (!currentChainId) {
226
- if (firstEvmAddress) {
227
- return false;
228
- }
229
- firstEvmAddress = true;
230
- }
231
- }
232
- return true;
233
- })
234
- .map(({ address, chainId }) => ({
235
- accounts: [address],
236
- chainId: chainId,
237
- }));
238
- }