@rango-dev/wallets-core 0.5.1-next.4 → 0.5.1-next.6

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.
@@ -0,0 +1,4 @@
1
+ /// <reference types="react" />
2
+ import { ProviderContext } from './types';
3
+ export declare const WalletContext: import("react").Context<ProviderContext>;
4
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AA8B1C,eAAO,MAAM,aAAa,0CAAiD,CAAC"}
package/dist/helpers.d.ts CHANGED
@@ -1,7 +1,8 @@
1
1
  import { Network, WalletConfig, WalletType } from '@rango-dev/wallets-shared';
2
- import { State, WalletActions, WalletProvider, WalletProviders } from './types';
2
+ import { State, WalletActions, ProviderInterface, WalletProviders } from './types';
3
3
  import Wallet, { Options, State as WalletState } from './wallet';
4
4
  import type { BlockchainMeta } from 'rango-types';
5
+ import type { EventHandler as WalletEventHandler } from './wallet';
5
6
  export declare function choose(wallets: any[], type: WalletType): any | null;
6
7
  export declare const defaultWalletState: WalletState;
7
8
  export declare function state_reducer(state: State, action: any): State;
@@ -13,7 +14,7 @@ export declare function readAccountAddress(addressWithNetwork: string): {
13
14
  };
14
15
  export declare function connectedWallets(providersState: State): WalletType[];
15
16
  export declare function availableWallets(providersState: State): WalletType[];
16
- export declare function checkWalletProviders(list: WalletProvider[]): WalletProviders;
17
+ export declare function checkWalletProviders(list: ProviderInterface[]): WalletProviders;
17
18
  export declare function isAsync(fn: Function): boolean;
18
19
  export declare function needsCheckInstallation(options: Options): boolean;
19
20
  export declare function isWalletDerivedFromWalletConnect(wallet_type: WalletType): boolean;
@@ -25,4 +26,5 @@ export declare function autoConnect(wallets: WalletProviders, addWalletRef: (wal
25
26
  actions: WalletActions;
26
27
  config: WalletConfig;
27
28
  }) => Wallet<any>): Promise<void>;
29
+ export declare function makeEventHandler(dispatcher: any, onUpdateState?: WalletEventHandler): WalletEventHandler;
28
30
  //# sourceMappingURL=helpers.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,OAAO,EACP,YAAY,EACZ,UAAU,EAEX,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAChF,OAAO,MAAM,EAAE,EAAE,OAAO,EAAE,KAAK,IAAI,WAAW,EAAE,MAAM,UAAU,CAAC;AACjE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAKlD,wBAAgB,MAAM,CAAC,OAAO,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,UAAU,GAAG,GAAG,GAAG,IAAI,CAEnE;AAED,eAAO,MAAM,kBAAkB,EAAE,WAOhC,CAAC;AAEF,wBAAgB,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,SA0BtD;AAED,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI,UAGzB;AAED,wBAAgB,2BAA2B,CACzC,SAAS,EAAE,MAAM,EAAE,GAAG,IAAI,EAC1B,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI,YAOzB;AAED,wBAAgB,kBAAkB,CAAC,kBAAkB,EAAE,MAAM,GAAG;IAC9D,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;CAClB,CAOA;AAED,wBAAgB,gBAAgB,CAAC,cAAc,EAAE,KAAK,GAAG,UAAU,EAAE,CAQpE;AAED,wBAAgB,gBAAgB,CAAC,cAAc,EAAE,KAAK,GAAG,UAAU,EAAE,CAIpE;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,cAAc,EAAE,GAAG,eAAe,CAY5E;AAGD,wBAAgB,OAAO,CAAC,EAAE,EAAE,QAAQ,WAEnC;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,WAGtD;AAOD,wBAAgB,gCAAgC,CAAC,WAAW,EAAE,UAAU,WAEvE;AAED,wBAAgB,qBAAqB,CACnC,eAAe,EAAE,cAAc,EAAE,EACjC,QAAQ,EAAE,GAAG,EACb,IAAI,EAAE,UAAU,OAejB;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,UAAU,iBAOnD;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,UAAU,QAQvD;AAED,wBAAgB,mBAAmB,SAIlC;AAED,wBAAsB,WAAW,CAC/B,OAAO,EAAE,eAAe,EACxB,YAAY,EAAE,CAAC,MAAM,EAAE;IACrB,OAAO,EAAE,aAAa,CAAC;IACvB,MAAM,EAAE,YAAY,CAAC;CACtB,KAAK,MAAM,CAAC,GAAG,CAAC,iBA0BlB"}
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,OAAO,EACP,YAAY,EACZ,UAAU,EAEX,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,KAAK,EACL,aAAa,EACb,iBAAiB,EACjB,eAAe,EAChB,MAAM,SAAS,CAAC;AACjB,OAAO,MAAM,EAAE,EAAE,OAAO,EAAE,KAAK,IAAI,WAAW,EAAE,MAAM,UAAU,CAAC;AACjE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAIlD,OAAO,KAAK,EAAE,YAAY,IAAI,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAEnE,wBAAgB,MAAM,CAAC,OAAO,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,UAAU,GAAG,GAAG,GAAG,IAAI,CAEnE;AAED,eAAO,MAAM,kBAAkB,EAAE,WAOhC,CAAC;AAEF,wBAAgB,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,SA0BtD;AAED,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI,UAGzB;AAED,wBAAgB,2BAA2B,CACzC,SAAS,EAAE,MAAM,EAAE,GAAG,IAAI,EAC1B,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI,YAOzB;AAED,wBAAgB,kBAAkB,CAAC,kBAAkB,EAAE,MAAM,GAAG;IAC9D,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;CAClB,CAOA;AAED,wBAAgB,gBAAgB,CAAC,cAAc,EAAE,KAAK,GAAG,UAAU,EAAE,CAQpE;AAED,wBAAgB,gBAAgB,CAAC,cAAc,EAAE,KAAK,GAAG,UAAU,EAAE,CAIpE;AAED,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,iBAAiB,EAAE,GACxB,eAAe,CAYjB;AAGD,wBAAgB,OAAO,CAAC,EAAE,EAAE,QAAQ,WAEnC;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,WAGtD;AAOD,wBAAgB,gCAAgC,CAAC,WAAW,EAAE,UAAU,WAEvE;AAED,wBAAgB,qBAAqB,CACnC,eAAe,EAAE,cAAc,EAAE,EACjC,QAAQ,EAAE,GAAG,EACb,IAAI,EAAE,UAAU,OAejB;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,UAAU,iBAOnD;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,UAAU,QAQvD;AAED,wBAAgB,mBAAmB,SAIlC;AAED,wBAAsB,WAAW,CAC/B,OAAO,EAAE,eAAe,EACxB,YAAY,EAAE,CAAC,MAAM,EAAE;IACrB,OAAO,EAAE,aAAa,CAAC;IACvB,MAAM,EAAE,YAAY,CAAC;CACtB,KAAK,MAAM,CAAC,GAAG,CAAC,iBA0BlB;AAOD,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,GAAG,EACf,aAAa,CAAC,EAAE,kBAAkB,sBAoBnC"}
@@ -0,0 +1,12 @@
1
+ import { ProviderContext, WalletActions, WalletConfig } from './types';
2
+ import Wallet, { EventHandler as WalletEventHandler } from './wallet';
3
+ /**
4
+ *
5
+ *
6
+ */
7
+ export declare function useInitializers(onChangeState: WalletEventHandler): (wallet: {
8
+ actions: WalletActions;
9
+ config: WalletConfig;
10
+ }) => Wallet;
11
+ export declare function useWallets(): ProviderContext;
12
+ //# sourceMappingURL=hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvE,OAAO,MAAM,EAAE,EAAE,YAAY,IAAI,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAEtE;;;GAGG;AACH,wBAAgB,eAAe,CAAC,aAAa,EAAE,kBAAkB,YAQtC;IACvB,OAAO,EAAE,aAAa,CAAC;IACvB,MAAM,EAAE,YAAY,CAAC;CACtB,KAAG,MAAM,CAiBX;AAED,wBAAgB,UAAU,IAAI,eAAe,CAK5C"}
package/dist/index.d.ts CHANGED
@@ -1,4 +1,6 @@
1
1
  export * from './helpers';
2
- export { default as Provider, useWallets } from './provider';
2
+ export { default as Provider } from './provider';
3
+ export { useWallets } from './hooks';
4
+ export type { EventHandler } from './wallet';
3
5
  export * from './types';
4
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7D,cAAc,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,YAAY,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAC7C,cAAc,SAAS,CAAC"}
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- var L=Object.defineProperty;var i=(e,t)=>L(e,"name",{value:t,configurable:!0});import G from"@walletconnect/ethereum-provider";import{convertEvmBlockchainMetaToEvmChainInfo as U,evmChainsToRpcMap as _,WalletTypes as R}from"@rango-dev/wallets-shared";import{isEvmBlockchain as D}from"rango-types";var h=class{getItem(t){let n=localStorage.getItem(t);return n?JSON.parse(n):null}setItem(t,n){localStorage.setItem(t,JSON.stringify(n))}removeItem(t){localStorage.removeItem(t)}};i(h,"Persistor");var p="last-connected-wallets";function ut(e,t){return e.find(n=>n.type===t)||null}i(ut,"choose");var v={connected:!1,connecting:!1,reachable:!1,installed:!1,accounts:null,network:null};function S(e,t){if(t.type==="new_state"){let n=e[t.wallet];return n?{...e,[t.wallet]:{...n,[t.name]:t.value}}:{...e,[t.wallet]:{...v,[t.name]:t.value}}}return e}i(S,"state_reducer");function F(e,t){return`${t||""}:${e}`}i(F,"formatAddressWithNetwork");function g(e,t){return e?e.map(n=>F(n,t)):[]}i(g,"accountAddressesWithNetwork");function pt(e){let[t,n]=e.split(":");return{network:t,address:n}}i(pt,"readAccountAddress");function N(e){return Object.entries(e).filter(([,t])=>t?.connected).map(([t])=>t)}i(N,"connectedWallets");function T(e){return Object.entries(e).map(([t])=>t)}i(T,"availableWallets");function P(e){let t=new Map;return e.forEach(n=>{let{config:o,...a}=n;t.set(o.type,{actions:a,config:o})}),t}i(P,"checkWalletProviders");function ft(e){return e?.constructor?.name==="AsyncFunction"}i(ft,"isAsync");function W(e){let{checkInstallation:t=!0}=e.config;return t}i(W,"needsCheckInstallation");function $(e){return e===R.WALLET_CONNECT}i($,"isWalletDerivedFromWalletConnect");function x(e,t,n){if($(n)){let o=e.filter(D),a=_(U(o));return new G({qrcode:!1,rpc:a,connector:t,chainId:t.chainId})}return t}i(x,"getComptaibleProvider");async function E(e){let t=new h,n=t.getItem(p),o=!!n?.find(a=>a===e);n&&!o?t.setItem(p,n.concat(e)):t.setItem(p,[e])}i(E,"persistWallet");function C(e){let t=new h,n=t.getItem(p);n&&t.setItem(p,n.filter(o=>o!==e))}i(C,"removeWalletFromPersist");function A(){let e=new h;e.getItem(p)&&e.removeItem(p)}i(A,"clearPersistStorage");async function b(e,t){let o=new h().getItem(p);if(o&&o.length){let a=[];o.forEach(s=>{let d=e.get(s);if(d){let r=t(d);a.push({walletType:s,connect:r.connect.bind(r)})}});for(let{connect:s,walletType:d}of a)try{await s()}catch{C(d)}}}i(b,"autoConnect");import Y,{createContext as j,useContext as q,useEffect as k,useReducer as J,useRef as K}from"react";import{getBlockChainNameFromId as m,Networks as w}from"@rango-dev/wallets-shared";var B=(d=>(d.CONNECTED="connected",d.CONNECTING="connecting",d.REACHABLE="reachable",d.INSTALLED="installed",d.ACCOUNTS="accounts",d.NETWORK="network",d))(B||{});var y=class{constructor(t,n){this.actions=n,this.options=t,this.provider=null,this.meta=[],this.state={connected:!1,connecting:!1,reachable:!1,installed:!1,accounts:null,network:null},W(t)||this.setInstalledAs(!0)}async eagerConnection(){return this.state.connected&&this.provider?{accounts:this.state.accounts,network:this.state.network,provider:this.provider}:null}async connect(t){if(this.state.connecting)throw new Error("Connecting...");let n=await this.eagerConnection(),o=this.state.network,a=t||o||this.options.config.defaultNetwork;if(n){let c=o!==a&&!!a;if(o===a)return n;if(c&&this.actions.switchNetwork)return await this.actions.switchNetwork({instance:this.provider,meta:this.meta,network:a,newInstance:this.tryGetInstance.bind(this)}),{accounts:n.accounts,network:a,provider:this.provider}}let s=await this.tryGetInstance({network:t});this.updateState({connecting:!0}),this.setInstalledAs(!0);try{var d=await this.actions.connect({instance:s,network:a||void 0,meta:this.meta||[]})}catch(c){throw this.resetState(),c}this.updateState({connected:!0,reachable:!0,connecting:!1});let r=[],l=null;if(Array.isArray(d))r=d.flatMap(u=>{let f=u.chainId||w.Unknown,I=m(f,this.meta)||w.Unknown;return g(u.accounts,I)}).filter(Boolean),l=a||this.options.config.defaultNetwork;else{let c=d.chainId||w.Unknown,u=m(c,this.meta)||w.Unknown;r=g(d.accounts,u),l=u}return r.length>0&&this.updateState({accounts:r,network:l}),{accounts:this.state.accounts,network:this.state.network,provider:this.provider}}async disconnect(){this.resetState(),this.actions.disconnect&&this.actions.disconnect({instance:this.provider,destroyInstance:()=>{this.setProvider(null)}})}getSigners(t){return this.actions.getSigners(t)}getWalletInfo(t){return this.actions.getWalletInfo(t)}canSwitchNetworkTo(t,n){let o=this.actions.canSwitchNetworkTo;return o?o({network:t,meta:this.meta,provider:n}):!1}onInit(){this.options.config.isAsyncInstance||this.actions.getInstance()&&!this.state.installed&&this.setInstalledAs(!0)}setProvider(t){this.provider=t,t&&this.actions.subscribe&&this.actions.subscribe({instance:t,state:this.state,meta:this.meta,connect:this.connect.bind(this),disconnect:this.disconnect.bind(this),updateAccounts:(n,o)=>{let a=this.state.network;o&&(a=m(o,this.meta)||w.Unknown);let s=g(n,a);s.length>0&&this.updateState({accounts:s})},updateChainId:n=>{let o=n?m(n,this.meta):w.Unknown;this.updateState({network:o})}})}setMeta(t){this.meta=t}setHandler(t){this.options.handler=t}getState(){return this.state}updateState(t){let n=[];typeof t.connected<"u"&&(this.state.connected=t.connected,n.push(["connected",t.connected])),typeof t.connecting<"u"&&(this.state.connecting=t.connecting,n.push(["connecting",t.connecting])),typeof t.reachable<"u"&&(this.state.reachable=t.reachable,n.push(["reachable",t.reachable])),typeof t.installed<"u"&&(this.state.installed=t.installed,n.push(["installed",t.installed])),typeof t.accounts<"u"&&(this.state.accounts=t.accounts,n.push(["accounts",t.accounts])),typeof t.network<"u"&&(this.state.network=t.network,n.push(["network",t.network]));let o=this.getState();n.forEach(([a,s])=>{this.options.handler(this.options.config.type,a,s,o,this.meta)})}resetState(){this.updateState({connected:!1,connecting:!1,reachable:!1,accounts:null,network:null})}setInstalledAs(t){!W(this.options)&&t===!1||this.updateState({installed:t})}async tryGetInstance({network:t,force:n}){let o=null;if(this.setProvider(null),this.options.config.isAsyncInstance){let a={currentProvider:this.provider,meta:this.meta,force:n||!1,updateChainId:s=>{let d=s?m(s,this.meta):w.Unknown;this.updateState({network:d})}};t&&(a.network=t),o=await this.actions.getInstance(a)}else o=this.actions.getInstance();if(!o){this.setInstalledAs(!1),this.resetState();let a=`It seems your selected wallet (${this.options.config.type}) isn't installed.`;throw new Error(a)}return this.setProvider(o),o}};i(y,"Wallet");var O=y;var H=j({});function M(e,t){return i((o,a,s,d,r)=>{e({type:"new_state",wallet:o,name:a,value:s}),t&&t(o,a,s,d,r)},"handler")}i(M,"makeEventHandler");function z(e){let t=K({});function n(o){let a=o.config.type;return typeof t.current[a]>"u"&&(t.current[a]=new O({config:o.config,handler:e},o.actions)),t.current[a]}return i(n,"updater"),n}i(z,"useInitializers");function Q(e){let[t,n]=J(S,{}),o=z(M(n,e.onUpdateState)),a=e.providers,s=P(a),d={async connect(r,l){let c=s.get(r);if(!c)throw new Error(`You should add ${r} to provider first.`);let f=await o(c).connect(l);return e.autoConnect&&E(r),f},async disconnect(r){let l=s.get(r);if(!l)throw new Error(`You should add ${r} to provider first.`);await o(l).disconnect(),e.autoConnect&&C(r)},async disconnectAll(){let r=[];return N(t).forEach(l=>{let c=s.get(l);if(c){let u=o(c);r.push(u.disconnect())}}),e.autoConnect&&A(),await Promise.allSettled(r)},state(r){return t[r]||v},canSwitchNetworkTo(r,l){let c=s.get(r);if(!c)return!1;let u=o(c);return u.canSwitchNetworkTo?u.canSwitchNetworkTo(l,u.provider):!1},providers(){let r={};return T(t).forEach(l=>{let c=s.get(l);if(c){let u=o(c);r[l]=u.provider}}),r},getWalletInfo(r){let l=s.get(r);if(!l)throw new Error(`You should add ${r} to provider first.`);return l.actions.getWalletInfo(e.allBlockChains||[])},getSigners(r){let l=s.get(r);if(!l)throw new Error(`You should add ${r} to provider first.`);let c=o(l),u=c.getWalletInfo(e.allBlockChains||[]).supportedChains,f=x(u,c.provider,r);return c.getSigners(f)}};return k(()=>{s.forEach(r=>{let l=o(r),c=i(()=>{l.onInit&&l.onInit()},"runOnInit"),u=i(f=>{f.target&&f.target.readyState==="complete"&&(c(),document.removeEventListener("readystatechange",u))},"initWhenPageIsReady");c(),document.addEventListener("readystatechange",u)})},[]),k(()=>{e.allBlockChains&&s.forEach(l=>{let c=o(l),u=c.getWalletInfo(e.allBlockChains||[]).supportedChains;c.setMeta(u)})},[e.allBlockChains]),k(()=>{s.forEach(r=>{o(r).setHandler(M(n,e.onUpdateState))})},[e.onUpdateState]),k(()=>{e.allBlockChains&&e.allBlockChains.length&&e.autoConnect&&(async()=>await b(s,o))()},[e.autoConnect,e.allBlockChains]),Y.createElement(H.Provider,{value:d},e.children)}i(Q,"Provider");function V(){let e=q(H);if(!e)throw Error("useWallet can only be used within the Provider component");return e}i(V,"useWallets");var X=Q;export{B as Events,X as Provider,g as accountAddressesWithNetwork,b as autoConnect,T as availableWallets,P as checkWalletProviders,ut as choose,A as clearPersistStorage,N as connectedWallets,v as defaultWalletState,F as formatAddressWithNetwork,x as getComptaibleProvider,ft as isAsync,$ as isWalletDerivedFromWalletConnect,W as needsCheckInstallation,E as persistWallet,pt as readAccountAddress,C as removeWalletFromPersist,S as state_reducer,V as useWallets};
1
+ var U=Object.defineProperty;var i=(e,t)=>U(e,"name",{value:t,configurable:!0});import _ from"@walletconnect/ethereum-provider";import{convertEvmBlockchainMetaToEvmChainInfo as R,evmChainsToRpcMap as D,WalletTypes as F}from"@rango-dev/wallets-shared";import{isEvmBlockchain as $}from"rango-types";var f=class{getItem(t){let n=localStorage.getItem(t);return n?JSON.parse(n):null}setItem(t,n){localStorage.setItem(t,JSON.stringify(n))}removeItem(t){localStorage.removeItem(t)}};i(f,"Persistor");var u="last-connected-wallets";function ht(e,t){return e.find(n=>n.type===t)||null}i(ht,"choose");var I={connected:!1,connecting:!1,reachable:!1,installed:!1,accounts:null,network:null};function E(e,t){if(t.type==="new_state"){let n=e[t.wallet];return n?{...e,[t.wallet]:{...n,[t.name]:t.value}}:{...e,[t.wallet]:{...I,[t.name]:t.value}}}return e}i(E,"state_reducer");function Y(e,t){return`${t||""}:${e}`}i(Y,"formatAddressWithNetwork");function y(e,t){return e?e.map(n=>Y(n,t)):[]}i(y,"accountAddressesWithNetwork");function ft(e){let[t,n]=e.split(":");return{network:t,address:n}}i(ft,"readAccountAddress");function P(e){return Object.entries(e).filter(([,t])=>t?.connected).map(([t])=>t)}i(P,"connectedWallets");function T(e){return Object.entries(e).map(([t])=>t)}i(T,"availableWallets");function A(e){let t=new Map;return e.forEach(n=>{let{config:o,...a}=n;t.set(o.type,{actions:a,config:o})}),t}i(A,"checkWalletProviders");function wt(e){return e?.constructor?.name==="AsyncFunction"}i(wt,"isAsync");function C(e){let{checkInstallation:t=!0}=e.config;return t}i(C,"needsCheckInstallation");function z(e){return e===F.WALLET_CONNECT}i(z,"isWalletDerivedFromWalletConnect");function b(e,t,n){if(z(n)){let o=e.filter($),a=D(R(o));return new _({qrcode:!1,rpc:a,connector:t,chainId:t.chainId})}return t}i(b,"getComptaibleProvider");async function B(e){let t=new f,n=t.getItem(u),o=!!n?.find(a=>a===e);n&&!o?t.setItem(u,n.concat(e)):t.setItem(u,[e])}i(B,"persistWallet");function S(e){let t=new f,n=t.getItem(u);n&&t.setItem(u,n.filter(o=>o!==e))}i(S,"removeWalletFromPersist");function O(){let e=new f;e.getItem(u)&&e.removeItem(u)}i(O,"clearPersistStorage");async function M(e,t){let o=new f().getItem(u);if(o&&o.length){let a=[];o.forEach(s=>{let d=e.get(s);if(d){let r=t(d);a.push({walletType:s,connect:r.connect.bind(r)})}});for(let{connect:s,walletType:d}of a)try{await s()}catch{S(d)}}}i(M,"autoConnect");function x(e,t){return i((o,a,s,d,r)=>{e({type:"new_state",wallet:o,name:a,value:s}),t&&t(o,a,s,d,r)},"handler")}i(x,"makeEventHandler");import V,{useEffect as W,useReducer as X}from"react";import{useContext as J,useRef as K}from"react";import{createContext as j}from"react";var w="Context hasn't been initialized yet.",q={async connect(){throw new Error(w)},async disconnect(){throw new Error(w)},async disconnectAll(){throw new Error(w)},state(){throw new Error(w)},canSwitchNetworkTo(){throw new Error(w)},providers(){throw new Error(w)},getWalletInfo(){throw new Error(w)},getSigners(){throw new Error(w)}},k=j(q);import{getBlockChainNameFromId as g,Networks as m}from"@rango-dev/wallets-shared";var H=(d=>(d.CONNECTED="connected",d.CONNECTING="connecting",d.REACHABLE="reachable",d.INSTALLED="installed",d.ACCOUNTS="accounts",d.NETWORK="network",d))(H||{});var v=class{constructor(t,n){this.actions=n,this.options=t,this.provider=null,this.meta=[],this.state={connected:!1,connecting:!1,reachable:!1,installed:!1,accounts:null,network:null},C(t)||this.setInstalledAs(!0)}async eagerConnection(){return this.state.connected&&this.provider?{accounts:this.state.accounts,network:this.state.network,provider:this.provider}:null}async connect(t){if(this.state.connecting)throw new Error("Connecting...");let n=await this.eagerConnection(),o=this.state.network,a=t||o||this.options.config.defaultNetwork;if(n){let c=o!==a&&!!a;if(o===a)return n;if(c&&this.actions.switchNetwork)return await this.actions.switchNetwork({instance:this.provider,meta:this.meta,network:a,newInstance:this.tryGetInstance.bind(this)}),{accounts:n.accounts,network:a,provider:this.provider}}let s=await this.tryGetInstance({network:t});this.updateState({connecting:!0}),this.setInstalledAs(!0);try{var d=await this.actions.connect({instance:s,network:a||void 0,meta:this.meta||[]})}catch(c){throw this.resetState(),c}this.updateState({connected:!0,reachable:!0,connecting:!1});let r=[],l=null;if(Array.isArray(d))r=d.flatMap(p=>{let h=p.chainId||m.Unknown,N=g(h,this.meta)||m.Unknown;return y(p.accounts,N)}).filter(Boolean),l=a||this.options.config.defaultNetwork;else{let c=d.chainId||m.Unknown,p=g(c,this.meta)||m.Unknown;r=y(d.accounts,p),l=p}return r.length>0&&this.updateState({accounts:r,network:l}),{accounts:this.state.accounts,network:this.state.network,provider:this.provider}}async disconnect(){this.resetState(),this.actions.disconnect&&this.actions.disconnect({instance:this.provider,destroyInstance:()=>{this.setProvider(null)}})}getSigners(t){return this.actions.getSigners(t)}getWalletInfo(t){return this.actions.getWalletInfo(t)}canSwitchNetworkTo(t,n){let o=this.actions.canSwitchNetworkTo;return o?o({network:t,meta:this.meta,provider:n}):!1}onInit(){this.options.config.isAsyncInstance||this.actions.getInstance()&&!this.state.installed&&this.setInstalledAs(!0)}setProvider(t){this.provider=t,t&&this.actions.subscribe&&this.actions.subscribe({instance:t,state:this.state,meta:this.meta,connect:this.connect.bind(this),disconnect:this.disconnect.bind(this),updateAccounts:(n,o)=>{let a=this.state.network;o&&(a=g(o,this.meta)||m.Unknown);let s=y(n,a);s.length>0&&this.updateState({accounts:s})},updateChainId:n=>{let o=n?g(n,this.meta):m.Unknown;this.updateState({network:o})}})}setMeta(t){this.meta=t}setHandler(t){this.options.handler=t}getState(){return this.state}updateState(t){let n=[];typeof t.connected<"u"&&(this.state.connected=t.connected,n.push(["connected",t.connected])),typeof t.connecting<"u"&&(this.state.connecting=t.connecting,n.push(["connecting",t.connecting])),typeof t.reachable<"u"&&(this.state.reachable=t.reachable,n.push(["reachable",t.reachable])),typeof t.installed<"u"&&(this.state.installed=t.installed,n.push(["installed",t.installed])),typeof t.accounts<"u"&&(this.state.accounts=t.accounts,n.push(["accounts",t.accounts])),typeof t.network<"u"&&(this.state.network=t.network,n.push(["network",t.network]));let o=this.getState();n.forEach(([a,s])=>{this.options.handler(this.options.config.type,a,s,o,this.meta)})}resetState(){this.updateState({connected:!1,connecting:!1,reachable:!1,accounts:null,network:null})}setInstalledAs(t){!C(this.options)&&t===!1||this.updateState({installed:t})}async tryGetInstance({network:t,force:n}){let o=null;if(this.setProvider(null),this.options.config.isAsyncInstance){let a={currentProvider:this.provider,meta:this.meta,force:n||!1,updateChainId:s=>{let d=s?g(s,this.meta):m.Unknown;this.updateState({network:d})}};t&&(a.network=t),o=await this.actions.getInstance(a)}else o=this.actions.getInstance();if(!o){this.setInstalledAs(!1),this.resetState();let a=`It seems your selected wallet (${this.options.config.type}) isn't installed.`;throw new Error(a)}return this.setProvider(o),o}};i(v,"Wallet");var L=v;function G(e){let t=K({});function n(o){let a=o.config.type;return typeof t.current[a]>"u"&&(t.current[a]=new L({config:o.config,handler:e},o.actions)),t.current[a]}return i(n,"updater"),n}i(G,"useInitializers");function Q(){let e=J(k);if(!e)throw Error("useWallet can only be used within the Provider component");return e}i(Q,"useWallets");function Z(e){let[t,n]=X(E,{}),o=G(x(n,e.onUpdateState)),a=e.providers,s=A(a),d={async connect(r,l){let c=s.get(r);if(!c)throw new Error(`You should add ${r} to provider first.`);let h=await o(c).connect(l);return e.autoConnect&&B(r),h},async disconnect(r){let l=s.get(r);if(!l)throw new Error(`You should add ${r} to provider first.`);await o(l).disconnect(),e.autoConnect&&S(r)},async disconnectAll(){let r=[];return P(t).forEach(l=>{let c=s.get(l);if(c){let p=o(c);r.push(p.disconnect())}}),e.autoConnect&&O(),await Promise.allSettled(r)},state(r){return t[r]||I},canSwitchNetworkTo(r,l){let c=s.get(r);if(!c)return!1;let p=o(c);return p.canSwitchNetworkTo?p.canSwitchNetworkTo(l,p.provider):!1},providers(){let r={};return T(t).forEach(l=>{let c=s.get(l);if(c){let p=o(c);r[l]=p.provider}}),r},getWalletInfo(r){let l=s.get(r);if(!l)throw new Error(`You should add ${r} to provider first.`);return l.actions.getWalletInfo(e.allBlockChains||[])},getSigners(r){let l=s.get(r);if(!l)throw new Error(`You should add ${r} to provider first.`);let c=o(l),p=c.getWalletInfo(e.allBlockChains||[]).supportedChains,h=b(p,c.provider,r);return c.getSigners(h)}};return W(()=>{s.forEach(r=>{let l=o(r),c=i(()=>{l.onInit&&l.onInit()},"runOnInit"),p=i(h=>{h.target&&h.target.readyState==="complete"&&(c(),document.removeEventListener("readystatechange",p))},"initWhenPageIsReady");c(),document.addEventListener("readystatechange",p)})},[]),W(()=>{e.allBlockChains&&s.forEach(l=>{let c=o(l),p=c.getWalletInfo(e.allBlockChains||[]).supportedChains;c.setMeta(p)})},[e.allBlockChains]),W(()=>{s.forEach(r=>{o(r).setHandler(x(n,e.onUpdateState))})},[e.onUpdateState]),W(()=>{e.allBlockChains&&e.allBlockChains.length&&e.autoConnect&&(async()=>await M(s,o))()},[e.autoConnect,e.allBlockChains]),V.createElement(k.Provider,{value:d},e.children)}i(Z,"Provider");var tt=Z;export{H as Events,tt as Provider,y as accountAddressesWithNetwork,M as autoConnect,T as availableWallets,A as checkWalletProviders,ht as choose,O as clearPersistStorage,P as connectedWallets,I as defaultWalletState,Y as formatAddressWithNetwork,b as getComptaibleProvider,wt as isAsync,z as isWalletDerivedFromWalletConnect,x as makeEventHandler,C as needsCheckInstallation,B as persistWallet,ft as readAccountAddress,S as removeWalletFromPersist,E as state_reducer,Q as useWallets};
2
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/helpers.ts", "../src/persistor.ts", "../src/constants.ts", "../src/provider.tsx", "../src/wallet.ts", "../src/types.ts"],
4
- "sourcesContent": ["import WalletConnectProvider from '@walletconnect/ethereum-provider';\nimport {\n convertEvmBlockchainMetaToEvmChainInfo,\n evmChainsToRpcMap,\n Network,\n WalletConfig,\n WalletType,\n WalletTypes,\n} from '@rango-dev/wallets-shared';\nimport { State, WalletActions, WalletProvider, WalletProviders } from './types';\nimport Wallet, { Options, State as WalletState } from './wallet';\nimport type { BlockchainMeta } from 'rango-types';\nimport { isEvmBlockchain } from 'rango-types';\nimport { Persistor } from './persistor';\nimport { LASTE_CONNECTED_WALLETS } from './constants';\n\nexport function choose(wallets: any[], type: WalletType): any | null {\n return wallets.find((wallet) => wallet.type === type) || null;\n}\n\nexport const defaultWalletState: WalletState = {\n connected: false,\n connecting: false,\n reachable: false,\n installed: false,\n accounts: null,\n network: null,\n};\n\nexport function state_reducer(state: State, action: any) {\n if (action.type === 'new_state') {\n // TODO fix problem and remove ts-ignore\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const target_wallet = state[action.wallet];\n if (!target_wallet) {\n return {\n ...state,\n [action.wallet]: {\n ...defaultWalletState,\n [action.name]: action.value,\n },\n };\n }\n\n return {\n ...state,\n [action.wallet]: {\n ...target_wallet,\n [action.name]: action.value,\n },\n };\n }\n\n return state;\n}\n\nexport function formatAddressWithNetwork(\n address: string,\n network?: Network | null\n) {\n return `${network || ''}:${address}`;\n}\n\nexport function accountAddressesWithNetwork(\n addresses: string[] | null,\n network?: Network | null\n) {\n if (!addresses) return [];\n\n return addresses.map((address) => {\n return formatAddressWithNetwork(address, network);\n });\n}\n\nexport function readAccountAddress(addressWithNetwork: string): {\n address: string;\n network: Network;\n} {\n const [network, address] = addressWithNetwork.split(':');\n\n return {\n network: network,\n address,\n };\n}\n\nexport function connectedWallets(providersState: State): WalletType[] {\n return Object.entries(providersState)\n .filter(([, wallet_state]) => {\n return wallet_state?.connected;\n })\n .map(([type]) => {\n return type;\n });\n}\n\nexport function availableWallets(providersState: State): WalletType[] {\n return Object.entries(providersState).map(([type]) => {\n return type;\n });\n}\n\nexport function checkWalletProviders(list: WalletProvider[]): WalletProviders {\n const wallets: WalletProviders = new Map();\n\n list.forEach((provider) => {\n const { config, ...actions } = provider;\n wallets.set(config.type, {\n actions,\n config,\n });\n });\n\n return wallets;\n}\n\n/* eslint-disable @typescript-eslint/ban-types */\nexport function isAsync(fn: Function) {\n return fn?.constructor?.name === 'AsyncFunction';\n}\n\nexport function needsCheckInstallation(options: Options) {\n const { checkInstallation = true } = options.config;\n return checkInstallation;\n}\n\n/*\n WalletConnect instance is not compatible with ethers.providers.Web3Provider,\n Here we are returning a comptable instance, instead of the original one. \n*/\n\nexport function isWalletDerivedFromWalletConnect(wallet_type: WalletType) {\n return wallet_type === WalletTypes.WALLET_CONNECT;\n}\n\nexport function getComptaibleProvider(\n supportedChains: BlockchainMeta[],\n provider: any,\n type: WalletType\n) {\n if (isWalletDerivedFromWalletConnect(type)) {\n const evmBlockchains = supportedChains.filter(isEvmBlockchain);\n const rpcUrls = evmChainsToRpcMap(\n convertEvmBlockchainMetaToEvmChainInfo(evmBlockchains)\n );\n return new WalletConnectProvider({\n qrcode: false,\n rpc: rpcUrls,\n connector: provider,\n chainId: provider.chainId,\n });\n }\n return provider;\n}\n\nexport async function persistWallet(type: WalletType) {\n const persistor = new Persistor<string[]>();\n const wallets = persistor.getItem(LASTE_CONNECTED_WALLETS);\n const walletAlreadyPersisted = !!wallets?.find((wallet) => wallet === type);\n if (wallets && !walletAlreadyPersisted)\n persistor.setItem(LASTE_CONNECTED_WALLETS, wallets.concat(type));\n else persistor.setItem(LASTE_CONNECTED_WALLETS, [type]);\n}\n\nexport function removeWalletFromPersist(type: WalletType) {\n const persistor = new Persistor<string[]>();\n const wallets = persistor.getItem(LASTE_CONNECTED_WALLETS);\n if (wallets)\n persistor.setItem(\n LASTE_CONNECTED_WALLETS,\n wallets.filter((wallet) => wallet !== type)\n );\n}\n\nexport function clearPersistStorage() {\n const persistor = new Persistor<string[]>();\n const wallets = persistor.getItem(LASTE_CONNECTED_WALLETS);\n if (wallets) persistor.removeItem(LASTE_CONNECTED_WALLETS);\n}\n\nexport async function autoConnect(\n wallets: WalletProviders,\n addWalletRef: (wallet: {\n actions: WalletActions;\n config: WalletConfig;\n }) => Wallet<any>\n) {\n const persistor = new Persistor<string[]>();\n const lastConnectedWallets = persistor.getItem(LASTE_CONNECTED_WALLETS);\n if (lastConnectedWallets && lastConnectedWallets.length) {\n const connect_promises: {\n walletType: WalletType;\n connect: () => Promise<any>;\n }[] = [];\n lastConnectedWallets.forEach((walletType) => {\n const wallet = wallets.get(walletType);\n\n if (!!wallet) {\n const ref = addWalletRef(wallet);\n connect_promises.push({ walletType, connect: ref.connect.bind(ref) });\n }\n });\n\n for (const { connect, walletType } of connect_promises) {\n try {\n await connect();\n } catch (error) {\n removeWalletFromPersist(walletType);\n }\n }\n }\n}\n", "export interface PersistStorage<T> {\n getItem: (name: string) => T | null;\n setItem: (name: string, value: T) => void;\n removeItem: (name: string) => void;\n}\n\nexport class Persistor<T> implements PersistStorage<T> {\n getItem(name: string) {\n const item = localStorage.getItem(name);\n const parsedItem = item ? (JSON.parse(item) as T) : null;\n return parsedItem;\n }\n setItem(name: string, value: T) {\n localStorage.setItem(name, JSON.stringify(value));\n }\n removeItem(name: string) {\n localStorage.removeItem(name);\n }\n}\n", "export const LASTE_CONNECTED_WALLETS = 'last-connected-wallets';\n", "import React, {\n createContext,\n useContext,\n useEffect,\n useReducer,\n useRef,\n} from 'react';\n\nimport {\n autoConnect,\n availableWallets,\n checkWalletProviders,\n clearPersistStorage,\n connectedWallets,\n defaultWalletState,\n getComptaibleProvider,\n persistWallet,\n removeWalletFromPersist,\n state_reducer,\n} from './helpers';\nimport {\n ProviderProps,\n ProviderContext,\n WalletActions,\n WalletConfig,\n} from './types';\nimport { WalletType } from '@rango-dev/wallets-shared';\n\nimport Wallet, { EventHandler as WalletEventHandler } from './wallet';\n\n// TODO fix lint problem\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nconst WalletContext = createContext<ProviderContext>({});\n\n/*\n Our event handler includes an internal state updater, and a notifier\n for the outside listener.\n On creating first wallet refrence, and on chaning `props.onUpdateState`\n we are using this function.\n*/\nfunction makeEventHandler(dispatcher: any, onUpdateState?: WalletEventHandler) {\n const handler: WalletEventHandler = (\n type,\n name,\n value,\n coreState,\n supportedChains\n ) => {\n const action = { type: 'new_state', wallet: type, name, value };\n // Update state\n dispatcher(action);\n\n // Giving the event to the outside listener\n if (onUpdateState) {\n onUpdateState(type, name, value, coreState, supportedChains);\n }\n };\n\n return handler;\n}\n\nfunction useInitializers(onChangeState: WalletEventHandler) {\n const availableWallets = useRef<{\n [key: string]: Wallet | undefined;\n }>({});\n\n function updater(wallet: {\n actions: WalletActions;\n config: WalletConfig;\n }): Wallet {\n const type = wallet.config.type;\n // We only update, if there is no instance available.\n if (typeof availableWallets.current[type] === 'undefined') {\n availableWallets.current[type] = new Wallet(\n {\n config: wallet.config,\n handler: onChangeState,\n },\n wallet.actions\n );\n }\n\n return availableWallets.current[type]!;\n }\n\n return updater;\n}\n\nfunction Provider(props: ProviderProps) {\n const [providersState, dispatch] = useReducer(state_reducer, {});\n\n const addWalletRef = useInitializers(\n makeEventHandler(dispatch, props.onUpdateState)\n );\n // const providersRef = useRef<{ [type in WalletType]?: any }>({});\n\n const listOfProviders = props.providers;\n const wallets = checkWalletProviders(listOfProviders);\n const api: ProviderContext = {\n // TODO: Fix type error\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n async connect(type, network) {\n const wallet = wallets.get(type);\n if (!wallet) {\n throw new Error(`You should add ${type} to provider first.`);\n }\n\n const ref = addWalletRef(wallet);\n const result = await ref.connect(network);\n if (props.autoConnect) persistWallet(type);\n\n return result;\n },\n async disconnect(type) {\n const wallet = wallets.get(type);\n if (!wallet) {\n throw new Error(`You should add ${type} to provider first.`);\n }\n\n const ref = addWalletRef(wallet);\n await ref.disconnect();\n if (props.autoConnect) removeWalletFromPersist(type);\n },\n async disconnectAll() {\n const disconnect_promises: Promise<any>[] = [];\n\n // When a wallet is initializing, a record will be added to `providersState`\n // So we use them to know what wallet has been initialized then we need to\n // filter connected wallets only.\n connectedWallets(providersState).forEach((type) => {\n const wallet = wallets.get(type);\n\n if (wallet) {\n const ref = addWalletRef(wallet);\n disconnect_promises.push(ref.disconnect());\n }\n });\n\n if (props.autoConnect) clearPersistStorage();\n return await Promise.allSettled(disconnect_promises);\n },\n state(type) {\n return providersState[type] || defaultWalletState;\n },\n canSwitchNetworkTo(type, network) {\n const wallet = wallets.get(type);\n if (!wallet) {\n return false;\n }\n\n const ref = addWalletRef(wallet);\n return ref.canSwitchNetworkTo\n ? ref.canSwitchNetworkTo(network, ref.provider)\n : false;\n },\n providers() {\n const providers: { [type in WalletType]?: any } = {};\n availableWallets(providersState).forEach((type) => {\n const wallet = wallets.get(type);\n if (wallet) {\n const ref = addWalletRef(wallet);\n providers[type] = ref.provider;\n }\n });\n\n return providers;\n },\n getWalletInfo(type) {\n const wallet = wallets.get(type);\n if (!wallet) {\n throw new Error(`You should add ${type} to provider first.`);\n }\n\n // Get wallet info could be used in render methods to show wallets data\n // So, addWalletRef method shouldn't be called in this method\n\n return wallet.actions.getWalletInfo(props.allBlockChains || []);\n },\n getSigners(type) {\n const wallet = wallets.get(type);\n\n if (!wallet) {\n throw new Error(`You should add ${type} to provider first.`);\n }\n const ref = addWalletRef(wallet);\n const supportedChains = ref.getWalletInfo(\n props.allBlockChains || []\n ).supportedChains;\n const provider = getComptaibleProvider(\n supportedChains,\n ref.provider,\n type\n );\n const result = ref.getSigners(provider);\n\n return result;\n },\n };\n\n useEffect(() => {\n wallets.forEach((wallet) => {\n const ref = addWalletRef(wallet);\n const runOnInit = () => {\n if (ref.onInit) {\n ref.onInit();\n }\n };\n\n const initWhenPageIsReady = (event: Event) => {\n if (\n event.target &&\n (event.target as Document).readyState === 'complete'\n ) {\n runOnInit();\n\n document.removeEventListener('readystatechange', initWhenPageIsReady);\n }\n };\n\n // Try to run, maybe it's ready.\n runOnInit();\n\n // Try again when the page has been completely loaded.\n // Some of wallets, take some time to be fully injected and loaded.\n document.addEventListener('readystatechange', initWhenPageIsReady);\n });\n }, []);\n\n useEffect(() => {\n const allBlockChains = props.allBlockChains;\n if (allBlockChains) {\n wallets.forEach((wallet) => {\n const ref = addWalletRef(wallet);\n const supportedChains = ref.getWalletInfo(\n props.allBlockChains || []\n ).supportedChains;\n ref.setMeta(supportedChains);\n });\n }\n }, [props.allBlockChains]);\n\n useEffect(() => {\n wallets.forEach((wallet) => {\n const ref = addWalletRef(wallet);\n ref.setHandler(makeEventHandler(dispatch, props.onUpdateState));\n });\n }, [props.onUpdateState]);\n\n useEffect(() => {\n const shouldTryAutoConnect =\n props.allBlockChains && props.allBlockChains.length && props.autoConnect;\n if (shouldTryAutoConnect) {\n (async () => {\n await autoConnect(wallets, addWalletRef);\n })();\n }\n }, [props.autoConnect, props.allBlockChains]);\n\n return (\n <WalletContext.Provider value={api}>\n {props.children}\n </WalletContext.Provider>\n );\n}\n\nexport function useWallets(): ProviderContext {\n const context = useContext(WalletContext);\n if (!context)\n throw Error('useWallet can only be used within the Provider component');\n return context;\n}\n\nexport default Provider;\n", "import {\n getBlockChainNameFromId,\n Network,\n Networks,\n WalletType,\n} from '@rango-dev/wallets-shared';\nimport { accountAddressesWithNetwork, needsCheckInstallation } from './helpers';\nimport {\n Events,\n GetInstanceOptions,\n WalletActions,\n WalletConfig,\n} from './types';\nimport { BlockchainMeta } from 'rango-types';\n\nexport type EventHandler = (\n type: WalletType,\n event: Events,\n value: any,\n coreState: State,\n supportedChains: BlockchainMeta[]\n) => void;\n\nexport interface State {\n connected: boolean;\n connecting: boolean;\n reachable: boolean;\n installed: boolean;\n accounts: string[] | null;\n network: Network | null;\n}\n\nexport interface Options {\n config: WalletConfig;\n handler: EventHandler;\n}\n\nclass Wallet<InstanceType = any> {\n private actions: WalletActions;\n private state: State;\n private options: Options;\n private meta: BlockchainMeta[];\n public provider: InstanceType | null;\n\n constructor(options: Options, actions: WalletActions) {\n this.actions = actions;\n this.options = options;\n this.provider = null;\n this.meta = [];\n this.state = {\n connected: false,\n connecting: false,\n // TODO: Remove\n reachable: false,\n installed: false,\n accounts: null,\n network: null,\n };\n\n if (!needsCheckInstallation(options)) {\n this.setInstalledAs(true);\n }\n }\n\n async eagerConnection() {\n // Already connected, so we return provider that we have in memory.\n\n // For switching network on Trust Wallet (WalletConnect),\n // We only kill the session (and not restting the whole state)\n // So we are relying on this.provider for achieving this functionality.\n if (this.state.connected && !!this.provider) {\n return {\n accounts: this.state.accounts,\n network: this.state.network,\n provider: this.provider,\n };\n }\n\n // TODO: call actions.eagerConnection\n return null;\n }\n async connect(network?: Network) {\n // If it's connecting, nothing do.\n if (this.state.connecting) {\n throw new Error('Connecting...');\n }\n\n const eagerConnection = await this.eagerConnection();\n const currentNetwork = this.state.network;\n // If a network hasn't been provided and also we have `lastNetwork`\n // We will use lastNetwork to make sure we will not\n // Ask the user to switch his network wrongly.\n const requestedNetwork =\n network || currentNetwork || this.options.config.defaultNetwork;\n\n if (eagerConnection) {\n const networkChanged =\n currentNetwork !== requestedNetwork && !!requestedNetwork;\n\n // Reuse current connection if nothing has changed and we already have the connection in memory.\n if (currentNetwork === requestedNetwork) {\n return eagerConnection;\n }\n if (networkChanged && !!this.actions.switchNetwork) {\n await this.actions.switchNetwork({\n instance: this.provider,\n meta: this.meta,\n // TODO: Fix type error\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n network: requestedNetwork,\n newInstance: this.tryGetInstance.bind(this),\n });\n\n return {\n // Only network has been changed, so we reuse accounts from what we have already.\n accounts: eagerConnection.accounts,\n network: requestedNetwork,\n provider: this.provider,\n };\n }\n\n // If none of the above conditions didn't match, continute to connect.\n }\n\n // We are connecting to wallet for the first time\n\n // Trying to get wallet's instance, if it's not available, raise an error.\n const instance = await this.tryGetInstance({ network });\n\n // Instance exists, trying to connect\n this.updateState({\n connecting: true,\n });\n this.setInstalledAs(true);\n\n try {\n // eslint-disable-next-line no-var\n var connectResult = await this.actions.connect({\n instance,\n network: requestedNetwork || undefined,\n meta: this.meta || [],\n });\n } catch (e) {\n this.resetState();\n throw e;\n }\n\n this.updateState({\n connected: true,\n reachable: true,\n connecting: false,\n });\n\n // TODO: Handle accounts.length > 0\n\n // Inserting accounts into our state.\n let nextAccounts: string[] = [];\n let nextNetwork: Network | null | undefined = null;\n if (Array.isArray(connectResult)) {\n const accounts = connectResult.flatMap((blockchain) => {\n const chainId = blockchain.chainId || Networks.Unknown;\n // Try to map chainId with a Network, if not found, we use chainId directly.\n const network =\n getBlockChainNameFromId(chainId, this.meta) || Networks.Unknown;\n // TODO: second parameter should be `string` when we decided to open source the package.\n return accountAddressesWithNetwork(blockchain.accounts, network);\n });\n // Typescript can not detect we are filtering out null values:(\n nextAccounts = accounts.filter(Boolean) as string[];\n nextNetwork = requestedNetwork || this.options.config.defaultNetwork;\n } else {\n const chainId = connectResult.chainId || Networks.Unknown;\n const network =\n getBlockChainNameFromId(chainId, this.meta) || Networks.Unknown;\n // We fallback to current active network if `chainId` not provided.\n nextAccounts = accountAddressesWithNetwork(\n connectResult.accounts,\n network\n );\n nextNetwork = network;\n }\n\n if (nextAccounts.length > 0) {\n this.updateState({\n accounts: nextAccounts,\n network: nextNetwork,\n });\n }\n\n return {\n accounts: this.state.accounts,\n network: this.state.network,\n provider: this.provider,\n };\n }\n\n async disconnect() {\n this.resetState();\n\n if (this.actions.disconnect) {\n this.actions.disconnect({\n instance: this.provider,\n // On wallet connect, we need to destory the instance and get a whole new instance when we are going to connect\n destroyInstance: () => {\n this.setProvider(null);\n },\n });\n }\n }\n\n getSigners(provider: any) {\n return this.actions.getSigners(provider);\n }\n getWalletInfo(allBlockChains: BlockchainMeta[]) {\n return this.actions.getWalletInfo(allBlockChains);\n }\n canSwitchNetworkTo(network: Network, provider: any) {\n const switchTo = this.actions.canSwitchNetworkTo;\n if (!switchTo) return false;\n\n return switchTo({\n network,\n meta: this.meta,\n provider,\n });\n }\n\n onInit() {\n if (!this.options.config.isAsyncInstance) {\n const instance = this.actions.getInstance();\n if (!!instance && !this.state.installed) {\n this.setInstalledAs(true);\n }\n }\n }\n\n setProvider(value: any) {\n this.provider = value;\n if (!!value && !!this.actions.subscribe) {\n this.actions.subscribe({\n instance: value,\n state: this.state,\n meta: this.meta,\n connect: this.connect.bind(this),\n disconnect: this.disconnect.bind(this),\n updateAccounts: (accounts, chainId) => {\n let network = this.state.network;\n if (chainId) {\n network =\n getBlockChainNameFromId(chainId, this.meta) || Networks.Unknown;\n }\n\n const nextAccounts = accountAddressesWithNetwork(accounts, network);\n if (nextAccounts.length > 0) {\n this.updateState({\n accounts: nextAccounts,\n });\n }\n },\n updateChainId: (chainId) => {\n const network = chainId\n ? getBlockChainNameFromId(chainId, this.meta)\n : Networks.Unknown;\n this.updateState({\n network,\n });\n },\n });\n }\n }\n\n setMeta(value: BlockchainMeta[]) {\n this.meta = value;\n }\n\n setHandler(handler: EventHandler) {\n this.options.handler = handler;\n }\n\n getState(): State {\n return this.state;\n }\n updateState(states: Partial<State>) {\n // We will notify handler after updating all the states.\n // Because when we call `handler` it will has latest states.\n const updates: [Events, any][] = [];\n\n if (typeof states.connected !== 'undefined') {\n this.state.connected = states.connected;\n updates.push([Events.CONNECTED, states.connected]);\n }\n if (typeof states.connecting !== 'undefined') {\n this.state.connecting = states.connecting;\n updates.push([Events.CONNECTING, states.connecting]);\n }\n if (typeof states.reachable !== 'undefined') {\n this.state.reachable = states.reachable;\n updates.push([Events.REACHABLE, states.reachable]);\n }\n if (typeof states.installed !== 'undefined') {\n this.state.installed = states.installed;\n updates.push([Events.INSTALLED, states.installed]);\n }\n if (typeof states.accounts !== 'undefined') {\n this.state.accounts = states.accounts;\n updates.push([Events.ACCOUNTS, states.accounts]);\n }\n if (typeof states.network !== 'undefined') {\n this.state.network = states.network;\n updates.push([Events.NETWORK, states.network]);\n }\n\n const state = this.getState();\n updates.forEach(([name, value]) => {\n this.options.handler(\n this.options.config.type,\n name,\n value,\n state,\n this.meta\n );\n });\n }\n\n resetState() {\n this.updateState({\n connected: false,\n connecting: false,\n reachable: false,\n accounts: null,\n network: null,\n });\n }\n\n private setInstalledAs(value: boolean) {\n if (!needsCheckInstallation(this.options) && value === false) return;\n\n this.updateState({\n installed: value,\n });\n }\n private async tryGetInstance({\n network,\n force,\n }: {\n network?: Network;\n force?: boolean;\n }) {\n let instance = null;\n // For switching network on Trust Wallet (WalletConnect),\n // We only kill the session (and not restting the whole state)\n // So we are relying on this.provider for achieving this functionality.\n this.setProvider(null);\n if (this.options.config.isAsyncInstance) {\n // Trying to connect\n const instanceOptions: GetInstanceOptions = {\n currentProvider: this.provider,\n meta: this.meta,\n force: force || false,\n updateChainId: (chainId) => {\n const network = chainId\n ? getBlockChainNameFromId(chainId, this.meta)\n : Networks.Unknown;\n this.updateState({\n network,\n });\n },\n };\n\n if (network) {\n instanceOptions.network = network;\n }\n instance = await this.actions.getInstance(instanceOptions);\n } else {\n instance = this.actions.getInstance();\n }\n\n if (!instance) {\n this.setInstalledAs(false);\n this.resetState();\n\n const error_message = `It seems your selected wallet (${this.options.config.type}) isn't installed.`;\n throw new Error(error_message);\n }\n\n this.setProvider(instance);\n return instance;\n }\n}\n\nexport default Wallet;\n", "import { PropsWithChildren } from 'react';\nimport { Network, WalletType, WalletInfo } from '@rango-dev/wallets-shared';\nimport {\n EventHandler as WalletEventHandler,\n State as WalletState,\n} from './wallet';\nimport { SignerFactory, BlockchainMeta } from 'rango-types';\n\nexport type State = {\n [key: string]: WalletState | undefined;\n};\n\nexport type ConnectResult = {\n accounts: string[] | null;\n network: Network | null;\n provider: any;\n};\n\nexport type Providers = { [type in WalletType]?: any };\n\nexport type ProviderContext = {\n connect(type: WalletType, network?: Network): Promise<ConnectResult>;\n disconnect(type: WalletType): Promise<void>;\n disconnectAll(): Promise<PromiseSettledResult<any>[]>;\n state(type: WalletType): WalletState;\n canSwitchNetworkTo(type: WalletType, network: Network): boolean;\n providers(): Providers;\n getSigners(type: WalletType): SignerFactory;\n getWalletInfo(type: WalletType): WalletInfo;\n};\n\nexport type ProviderProps = PropsWithChildren<{\n onUpdateState?: WalletEventHandler;\n allBlockChains?: BlockchainMeta[];\n providers: WalletProvider[];\n autoConnect?: boolean;\n}>;\n\nexport enum Events {\n CONNECTED = 'connected',\n CONNECTING = 'connecting',\n REACHABLE = 'reachable',\n INSTALLED = 'installed',\n ACCOUNTS = 'accounts',\n NETWORK = 'network',\n}\n\nexport type ProviderConnectResult = {\n accounts: string[];\n chainId: string;\n};\n\nexport type GetInstanceOptions = {\n network?: Network;\n currentProvider: any;\n meta: BlockchainMeta[];\n force?: boolean;\n updateChainId: (chainId: number | string) => void;\n};\n\nexport type GetInstance =\n | (() => any)\n | ((options: GetInstanceOptions) => Promise<any>);\nexport type TryGetInstance =\n | (() => any)\n | ((options: Pick<GetInstanceOptions, 'force' | 'network'>) => Promise<any>);\nexport type Connect = (options: {\n instance: any;\n network?: Network;\n meta: BlockchainMeta[];\n}) => Promise<ProviderConnectResult | ProviderConnectResult[]>;\n\nexport type Disconnect = (options: {\n instance: any;\n destroyInstance: () => void;\n}) => Promise<void>;\nexport type Subscribe = (options: {\n instance: any;\n state: WalletState;\n meta: BlockchainMeta[];\n updateChainId: (chainId: string) => void;\n updateAccounts: (accounts: string[], chainId?: string) => void;\n connect: (network?: Network) => void;\n disconnect: () => void;\n}) => void;\n\nexport type SwitchNetwork = (options: {\n instance: any;\n network: Network;\n meta: BlockchainMeta[];\n newInstance?: TryGetInstance;\n}) => Promise<void>;\n\nexport type CanSwitchNetwork = (options: {\n network: Network;\n meta: BlockchainMeta[];\n provider: any;\n}) => boolean;\n\nexport interface WalletActions {\n connect: Connect;\n getInstance: any;\n disconnect?: Disconnect;\n subscribe?: Subscribe;\n // eagerConnect, // optional?\n // unsubscribe, // coupled to subscribe.\n\n // Optional, but should be provided at the same time.\n switchNetwork?: SwitchNetwork;\n getSigners: (provider: any) => SignerFactory;\n canSwitchNetworkTo?: CanSwitchNetwork;\n getWalletInfo(allBlockChains: BlockchainMeta[]): WalletInfo;\n}\n\nexport interface WalletConfig {\n type: WalletType;\n defaultNetwork?: Network;\n checkInstallation?: boolean;\n isAsyncInstance?: boolean;\n}\n\nexport type WalletProviders = Map<\n WalletType,\n {\n actions: WalletActions;\n config: WalletConfig;\n }\n>;\n\nexport type WalletProvider = { config: WalletConfig } & WalletActions;\n"],
5
- "mappings": "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",
6
- "names": ["WalletConnectProvider", "convertEvmBlockchainMetaToEvmChainInfo", "evmChainsToRpcMap", "WalletTypes", "isEvmBlockchain", "Persistor", "name", "item", "value", "__name", "LASTE_CONNECTED_WALLETS", "choose", "wallets", "type", "wallet", "__name", "defaultWalletState", "state_reducer", "state", "action", "target_wallet", "formatAddressWithNetwork", "address", "network", "accountAddressesWithNetwork", "addresses", "readAccountAddress", "addressWithNetwork", "connectedWallets", "providersState", "wallet_state", "availableWallets", "checkWalletProviders", "list", "provider", "config", "actions", "isAsync", "fn", "needsCheckInstallation", "options", "checkInstallation", "isWalletDerivedFromWalletConnect", "wallet_type", "WalletTypes", "getComptaibleProvider", "supportedChains", "evmBlockchains", "isEvmBlockchain", "rpcUrls", "evmChainsToRpcMap", "convertEvmBlockchainMetaToEvmChainInfo", "WalletConnectProvider", "persistWallet", "persistor", "Persistor", "LASTE_CONNECTED_WALLETS", "walletAlreadyPersisted", "removeWalletFromPersist", "clearPersistStorage", "autoConnect", "addWalletRef", "lastConnectedWallets", "connect_promises", "walletType", "ref", "connect", "React", "createContext", "useContext", "useEffect", "useReducer", "useRef", "getBlockChainNameFromId", "Networks", "Events", "Wallet", "options", "actions", "needsCheckInstallation", "network", "eagerConnection", "currentNetwork", "requestedNetwork", "networkChanged", "instance", "connectResult", "e", "nextAccounts", "nextNetwork", "blockchain", "chainId", "Networks", "getBlockChainNameFromId", "accountAddressesWithNetwork", "provider", "allBlockChains", "switchTo", "value", "accounts", "handler", "states", "updates", "state", "name", "force", "instanceOptions", "error_message", "__name", "wallet_default", "WalletContext", "createContext", "makeEventHandler", "dispatcher", "onUpdateState", "__name", "type", "name", "value", "coreState", "supportedChains", "useInitializers", "onChangeState", "availableWallets", "useRef", "updater", "wallet", "wallet_default", "Provider", "props", "providersState", "dispatch", "useReducer", "state_reducer", "addWalletRef", "listOfProviders", "wallets", "checkWalletProviders", "api", "network", "result", "persistWallet", "removeWalletFromPersist", "disconnect_promises", "connectedWallets", "ref", "clearPersistStorage", "defaultWalletState", "providers", "provider", "getComptaibleProvider", "useEffect", "runOnInit", "initWhenPageIsReady", "event", "autoConnect", "React", "useWallets", "context", "useContext", "provider_default"]
3
+ "sources": ["../src/helpers.ts", "../src/persistor.ts", "../src/constants.ts", "../src/provider.tsx", "../src/hooks.ts", "../src/context.ts", "../src/wallet.ts", "../src/types.ts"],
4
+ "sourcesContent": ["import WalletConnectProvider from '@walletconnect/ethereum-provider';\nimport {\n convertEvmBlockchainMetaToEvmChainInfo,\n evmChainsToRpcMap,\n Network,\n WalletConfig,\n WalletType,\n WalletTypes,\n} from '@rango-dev/wallets-shared';\nimport {\n State,\n WalletActions,\n ProviderInterface,\n WalletProviders,\n} from './types';\nimport Wallet, { Options, State as WalletState } from './wallet';\nimport type { BlockchainMeta } from 'rango-types';\nimport { isEvmBlockchain } from 'rango-types';\nimport { Persistor } from './persistor';\nimport { LASTE_CONNECTED_WALLETS } from './constants';\nimport type { EventHandler as WalletEventHandler } from './wallet';\n\nexport function choose(wallets: any[], type: WalletType): any | null {\n return wallets.find((wallet) => wallet.type === type) || null;\n}\n\nexport const defaultWalletState: WalletState = {\n connected: false,\n connecting: false,\n reachable: false,\n installed: false,\n accounts: null,\n network: null,\n};\n\nexport function state_reducer(state: State, action: any) {\n if (action.type === 'new_state') {\n // TODO fix problem and remove ts-ignore\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const target_wallet = state[action.wallet];\n if (!target_wallet) {\n return {\n ...state,\n [action.wallet]: {\n ...defaultWalletState,\n [action.name]: action.value,\n },\n };\n }\n\n return {\n ...state,\n [action.wallet]: {\n ...target_wallet,\n [action.name]: action.value,\n },\n };\n }\n\n return state;\n}\n\nexport function formatAddressWithNetwork(\n address: string,\n network?: Network | null\n) {\n return `${network || ''}:${address}`;\n}\n\nexport function accountAddressesWithNetwork(\n addresses: string[] | null,\n network?: Network | null\n) {\n if (!addresses) return [];\n\n return addresses.map((address) => {\n return formatAddressWithNetwork(address, network);\n });\n}\n\nexport function readAccountAddress(addressWithNetwork: string): {\n address: string;\n network: Network;\n} {\n const [network, address] = addressWithNetwork.split(':');\n\n return {\n network,\n address,\n };\n}\n\nexport function connectedWallets(providersState: State): WalletType[] {\n return Object.entries(providersState)\n .filter(([, wallet_state]) => {\n return wallet_state?.connected;\n })\n .map(([type]) => {\n return type;\n });\n}\n\nexport function availableWallets(providersState: State): WalletType[] {\n return Object.entries(providersState).map(([type]) => {\n return type;\n });\n}\n\nexport function checkWalletProviders(\n list: ProviderInterface[]\n): WalletProviders {\n const wallets: WalletProviders = new Map();\n\n list.forEach((provider) => {\n const { config, ...actions } = provider;\n wallets.set(config.type, {\n actions,\n config,\n });\n });\n\n return wallets;\n}\n\n/* eslint-disable @typescript-eslint/ban-types */\nexport function isAsync(fn: Function) {\n return fn?.constructor?.name === 'AsyncFunction';\n}\n\nexport function needsCheckInstallation(options: Options) {\n const { checkInstallation = true } = options.config;\n return checkInstallation;\n}\n\n/*\n WalletConnect instance is not compatible with ethers.providers.Web3Provider,\n Here we are returning a comptable instance, instead of the original one. \n*/\n\nexport function isWalletDerivedFromWalletConnect(wallet_type: WalletType) {\n return wallet_type === WalletTypes.WALLET_CONNECT;\n}\n\nexport function getComptaibleProvider(\n supportedChains: BlockchainMeta[],\n provider: any,\n type: WalletType\n) {\n if (isWalletDerivedFromWalletConnect(type)) {\n const evmBlockchains = supportedChains.filter(isEvmBlockchain);\n const rpcUrls = evmChainsToRpcMap(\n convertEvmBlockchainMetaToEvmChainInfo(evmBlockchains)\n );\n return new WalletConnectProvider({\n qrcode: false,\n rpc: rpcUrls,\n connector: provider,\n chainId: provider.chainId,\n });\n }\n return provider;\n}\n\nexport async function persistWallet(type: WalletType) {\n const persistor = new Persistor<string[]>();\n const wallets = persistor.getItem(LASTE_CONNECTED_WALLETS);\n const walletAlreadyPersisted = !!wallets?.find((wallet) => wallet === type);\n if (wallets && !walletAlreadyPersisted)\n persistor.setItem(LASTE_CONNECTED_WALLETS, wallets.concat(type));\n else persistor.setItem(LASTE_CONNECTED_WALLETS, [type]);\n}\n\nexport function removeWalletFromPersist(type: WalletType) {\n const persistor = new Persistor<string[]>();\n const wallets = persistor.getItem(LASTE_CONNECTED_WALLETS);\n if (wallets)\n persistor.setItem(\n LASTE_CONNECTED_WALLETS,\n wallets.filter((wallet) => wallet !== type)\n );\n}\n\nexport function clearPersistStorage() {\n const persistor = new Persistor<string[]>();\n const wallets = persistor.getItem(LASTE_CONNECTED_WALLETS);\n if (wallets) persistor.removeItem(LASTE_CONNECTED_WALLETS);\n}\n\nexport async function autoConnect(\n wallets: WalletProviders,\n addWalletRef: (wallet: {\n actions: WalletActions;\n config: WalletConfig;\n }) => Wallet<any>\n) {\n const persistor = new Persistor<string[]>();\n const lastConnectedWallets = persistor.getItem(LASTE_CONNECTED_WALLETS);\n if (lastConnectedWallets && lastConnectedWallets.length) {\n const connect_promises: {\n walletType: WalletType;\n connect: () => Promise<any>;\n }[] = [];\n lastConnectedWallets.forEach((walletType) => {\n const wallet = wallets.get(walletType);\n\n if (!!wallet) {\n const ref = addWalletRef(wallet);\n connect_promises.push({ walletType, connect: ref.connect.bind(ref) });\n }\n });\n\n for (const { connect, walletType } of connect_promises) {\n try {\n await connect();\n } catch (error) {\n removeWalletFromPersist(walletType);\n }\n }\n }\n}\n/*\n Our event handler includes an internal state updater, and a notifier\n for the outside listener.\n On creating first wallet refrence, and on chaning `props.onUpdateState`\n we are using this function.\n*/\nexport function makeEventHandler(\n dispatcher: any,\n onUpdateState?: WalletEventHandler\n) {\n const handler: WalletEventHandler = (\n type,\n name,\n value,\n coreState,\n supportedChains\n ) => {\n const action = { type: 'new_state', wallet: type, name, value };\n // Update state\n dispatcher(action);\n\n // Giving the event to the outside listener\n if (onUpdateState) {\n onUpdateState(type, name, value, coreState, supportedChains);\n }\n };\n\n return handler;\n}\n", "export interface PersistStorage<T> {\n getItem: (name: string) => T | null;\n setItem: (name: string, value: T) => void;\n removeItem: (name: string) => void;\n}\n\nexport class Persistor<T> implements PersistStorage<T> {\n getItem(name: string) {\n const item = localStorage.getItem(name);\n const parsedItem = item ? (JSON.parse(item) as T) : null;\n return parsedItem;\n }\n setItem(name: string, value: T) {\n localStorage.setItem(name, JSON.stringify(value));\n }\n removeItem(name: string) {\n localStorage.removeItem(name);\n }\n}\n", "export const LASTE_CONNECTED_WALLETS = 'last-connected-wallets';\n", "import React, { useEffect, useReducer } from 'react';\n\nimport {\n autoConnect,\n availableWallets,\n checkWalletProviders,\n clearPersistStorage,\n connectedWallets,\n defaultWalletState,\n getComptaibleProvider,\n persistWallet,\n removeWalletFromPersist,\n makeEventHandler,\n state_reducer,\n} from './helpers';\nimport { ProviderProps, ProviderContext } from './types';\nimport { WalletType } from '@rango-dev/wallets-shared';\nimport { useInitializers } from './hooks';\nimport { WalletContext } from './context';\n\nfunction Provider(props: ProviderProps) {\n const [providersState, dispatch] = useReducer(state_reducer, {});\n\n // Get (or add) wallet instance (`provider`s will be wraped in a `Wallet`)\n const getWalletInstance = useInitializers(\n makeEventHandler(dispatch, props.onUpdateState)\n );\n\n // Getting providers from props and put all of them in a `Map` with an appropriate interface.\n const listOfProviders = props.providers;\n const wallets = checkWalletProviders(listOfProviders);\n\n // Final API we put in context and it will be available to use for users.\n const api: ProviderContext = {\n async connect(type, network) {\n const wallet = wallets.get(type);\n if (!wallet) {\n throw new Error(`You should add ${type} to provider first.`);\n }\n\n const walletInstance = getWalletInstance(wallet);\n const result = await walletInstance.connect(network);\n if (props.autoConnect) persistWallet(type);\n\n return result;\n },\n async disconnect(type) {\n const wallet = wallets.get(type);\n if (!wallet) {\n throw new Error(`You should add ${type} to provider first.`);\n }\n\n const walletInstance = getWalletInstance(wallet);\n await walletInstance.disconnect();\n if (props.autoConnect) removeWalletFromPersist(type);\n },\n async disconnectAll() {\n const disconnect_promises: Promise<any>[] = [];\n\n // When a wallet is initializing, a record will be added to `providersState`\n // So we use them to know what wallet has been initialized then we need to\n // filter connected wallets only.\n connectedWallets(providersState).forEach((type) => {\n const wallet = wallets.get(type);\n\n if (wallet) {\n const walletInstance = getWalletInstance(wallet);\n disconnect_promises.push(walletInstance.disconnect());\n }\n });\n\n if (props.autoConnect) clearPersistStorage();\n return await Promise.allSettled(disconnect_promises);\n },\n state(type) {\n return providersState[type] || defaultWalletState;\n },\n canSwitchNetworkTo(type, network) {\n const wallet = wallets.get(type);\n if (!wallet) {\n return false;\n }\n\n const walletInstance = getWalletInstance(wallet);\n return walletInstance.canSwitchNetworkTo\n ? walletInstance.canSwitchNetworkTo(network, walletInstance.provider)\n : false;\n },\n providers() {\n const providers: { [type in WalletType]?: any } = {};\n availableWallets(providersState).forEach((type) => {\n const wallet = wallets.get(type);\n if (wallet) {\n const walletInstance = getWalletInstance(wallet);\n providers[type] = walletInstance.provider;\n }\n });\n\n return providers;\n },\n getWalletInfo(type) {\n const wallet = wallets.get(type);\n if (!wallet) {\n throw new Error(`You should add ${type} to provider first.`);\n }\n\n // Get wallet info could be used in render methods to show wallets data\n // So, addWalletRef method shouldn't be called in this method\n\n return wallet.actions.getWalletInfo(props.allBlockChains || []);\n },\n getSigners(type) {\n const wallet = wallets.get(type);\n\n if (!wallet) {\n throw new Error(`You should add ${type} to provider first.`);\n }\n const walletInstance = getWalletInstance(wallet);\n const supportedChains = walletInstance.getWalletInfo(\n props.allBlockChains || []\n ).supportedChains;\n const provider = getComptaibleProvider(\n supportedChains,\n walletInstance.provider,\n type\n );\n const result = walletInstance.getSigners(provider);\n\n return result;\n },\n };\n\n useEffect(() => {\n wallets.forEach((wallet) => {\n const walletInstance = getWalletInstance(wallet);\n const runOnInit = () => {\n if (walletInstance.onInit) {\n walletInstance.onInit();\n }\n };\n\n const initWhenPageIsReady = (event: Event) => {\n if (\n event.target &&\n (event.target as Document).readyState === 'complete'\n ) {\n runOnInit();\n\n document.removeEventListener('readystatechange', initWhenPageIsReady);\n }\n };\n\n // Try to run, maybe it's ready.\n runOnInit();\n\n // Try again when the page has been completely loaded.\n // Some of wallets, take some time to be fully injected and loaded.\n document.addEventListener('readystatechange', initWhenPageIsReady);\n });\n }, []);\n\n useEffect(() => {\n const allBlockChains = props.allBlockChains;\n if (allBlockChains) {\n wallets.forEach((wallet) => {\n const walletInstance = getWalletInstance(wallet);\n const supportedChains = walletInstance.getWalletInfo(\n props.allBlockChains || []\n ).supportedChains;\n walletInstance.setMeta(supportedChains);\n });\n }\n }, [props.allBlockChains]);\n\n useEffect(() => {\n wallets.forEach((wallet) => {\n const walletInstance = getWalletInstance(wallet);\n walletInstance.setHandler(\n makeEventHandler(dispatch, props.onUpdateState)\n );\n });\n }, [props.onUpdateState]);\n\n useEffect(() => {\n const shouldTryAutoConnect =\n props.allBlockChains && props.allBlockChains.length && props.autoConnect;\n if (shouldTryAutoConnect) {\n (async () => {\n await autoConnect(wallets, getWalletInstance);\n })();\n }\n }, [props.autoConnect, props.allBlockChains]);\n\n return (\n <WalletContext.Provider value={api}>\n {props.children}\n </WalletContext.Provider>\n );\n}\n\nexport default Provider;\n", "import { useContext, useRef } from 'react';\nimport { WalletContext } from './context';\nimport { ProviderContext, WalletActions, WalletConfig } from './types';\nimport Wallet, { EventHandler as WalletEventHandler } from './wallet';\n\n/**\n *\n *\n */\nexport function useInitializers(onChangeState: WalletEventHandler) {\n const availableWallets = useRef<{\n [key: string]: Wallet | undefined;\n }>({});\n\n // If `wallet` hasn't been added to `availableWallets`,\n // Get a instance of `Wallet` and save the refrence in `availableWallets`.\n // Otherwise, return the already created instance.\n function updater(wallet: {\n actions: WalletActions;\n config: WalletConfig;\n }): Wallet {\n const type = wallet.config.type;\n // We only update, if there is no instance available.\n if (typeof availableWallets.current[type] === 'undefined') {\n availableWallets.current[type] = new Wallet(\n {\n config: wallet.config,\n handler: onChangeState,\n },\n wallet.actions\n );\n }\n\n return availableWallets.current[type]!;\n }\n\n return updater;\n}\n\nexport function useWallets(): ProviderContext {\n const context = useContext(WalletContext);\n if (!context)\n throw Error('useWallet can only be used within the Provider component');\n return context;\n}\n", "import { createContext } from 'react';\nimport { ProviderContext } from './types';\n\nconst defaultErrorMesssage = \"Context hasn't been initialized yet.\";\nconst defaultContext: ProviderContext = {\n async connect() {\n throw new Error(defaultErrorMesssage);\n },\n async disconnect() {\n throw new Error(defaultErrorMesssage);\n },\n async disconnectAll() {\n throw new Error(defaultErrorMesssage);\n },\n state() {\n throw new Error(defaultErrorMesssage);\n },\n canSwitchNetworkTo() {\n throw new Error(defaultErrorMesssage);\n },\n providers() {\n throw new Error(defaultErrorMesssage);\n },\n getWalletInfo() {\n throw new Error(defaultErrorMesssage);\n },\n getSigners() {\n throw new Error(defaultErrorMesssage);\n },\n};\n\nexport const WalletContext = createContext<ProviderContext>(defaultContext);\n", "import {\n getBlockChainNameFromId,\n Network,\n Networks,\n WalletType,\n} from '@rango-dev/wallets-shared';\nimport { accountAddressesWithNetwork, needsCheckInstallation } from './helpers';\nimport {\n Events,\n GetInstanceOptions,\n WalletActions,\n WalletConfig,\n} from './types';\nimport { BlockchainMeta } from 'rango-types';\n\nexport type EventHandler = (\n type: WalletType,\n event: Events,\n value: any,\n coreState: State,\n supportedChains: BlockchainMeta[]\n) => void;\n\nexport interface State {\n connected: boolean;\n connecting: boolean;\n reachable: boolean;\n installed: boolean;\n accounts: string[] | null;\n network: Network | null;\n}\n\nexport interface Options {\n config: WalletConfig;\n handler: EventHandler;\n}\n\nclass Wallet<InstanceType = any> {\n private actions: WalletActions;\n private state: State;\n private options: Options;\n private meta: BlockchainMeta[];\n public provider: InstanceType | null;\n\n constructor(options: Options, actions: WalletActions) {\n this.actions = actions;\n this.options = options;\n this.provider = null;\n this.meta = [];\n this.state = {\n connected: false,\n connecting: false,\n // TODO: Remove\n reachable: false,\n installed: false,\n accounts: null,\n network: null,\n };\n\n if (!needsCheckInstallation(options)) {\n this.setInstalledAs(true);\n }\n }\n\n async eagerConnection() {\n // Already connected, so we return provider that we have in memory.\n\n // For switching network on Trust Wallet (WalletConnect),\n // We only kill the session (and not restting the whole state)\n // So we are relying on this.provider for achieving this functionality.\n if (this.state.connected && !!this.provider) {\n return {\n accounts: this.state.accounts,\n network: this.state.network,\n provider: this.provider,\n };\n }\n\n // TODO: call actions.eagerConnection\n return null;\n }\n async connect(network?: Network) {\n // If it's connecting, nothing do.\n if (this.state.connecting) {\n throw new Error('Connecting...');\n }\n\n const eagerConnection = await this.eagerConnection();\n const currentNetwork = this.state.network;\n // If a network hasn't been provided and also we have `lastNetwork`\n // We will use lastNetwork to make sure we will not\n // Ask the user to switch his network wrongly.\n const requestedNetwork =\n network || currentNetwork || this.options.config.defaultNetwork;\n\n if (eagerConnection) {\n const networkChanged =\n currentNetwork !== requestedNetwork && !!requestedNetwork;\n\n // Reuse current connection if nothing has changed and we already have the connection in memory.\n if (currentNetwork === requestedNetwork) {\n return eagerConnection;\n }\n if (networkChanged && !!this.actions.switchNetwork) {\n await this.actions.switchNetwork({\n instance: this.provider,\n meta: this.meta,\n // TODO: Fix type error\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n network: requestedNetwork,\n newInstance: this.tryGetInstance.bind(this),\n });\n\n return {\n // Only network has been changed, so we reuse accounts from what we have already.\n accounts: eagerConnection.accounts,\n network: requestedNetwork,\n provider: this.provider,\n };\n }\n\n // If none of the above conditions didn't match, continute to connect.\n }\n\n // We are connecting to wallet for the first time\n\n // Trying to get wallet's instance, if it's not available, raise an error.\n const instance = await this.tryGetInstance({ network });\n\n // Instance exists, trying to connect\n this.updateState({\n connecting: true,\n });\n this.setInstalledAs(true);\n\n try {\n // eslint-disable-next-line no-var\n var connectResult = await this.actions.connect({\n instance,\n network: requestedNetwork || undefined,\n meta: this.meta || [],\n });\n } catch (e) {\n this.resetState();\n throw e;\n }\n\n this.updateState({\n connected: true,\n reachable: true,\n connecting: false,\n });\n\n // TODO: Handle accounts.length > 0\n\n // Inserting accounts into our state.\n let nextAccounts: string[] = [];\n let nextNetwork: Network | null | undefined = null;\n if (Array.isArray(connectResult)) {\n const accounts = connectResult.flatMap((blockchain) => {\n const chainId = blockchain.chainId || Networks.Unknown;\n // Try to map chainId with a Network, if not found, we use chainId directly.\n const network =\n getBlockChainNameFromId(chainId, this.meta) || Networks.Unknown;\n // TODO: second parameter should be `string` when we decided to open source the package.\n return accountAddressesWithNetwork(blockchain.accounts, network);\n });\n // Typescript can not detect we are filtering out null values:(\n nextAccounts = accounts.filter(Boolean) as string[];\n nextNetwork = requestedNetwork || this.options.config.defaultNetwork;\n } else {\n const chainId = connectResult.chainId || Networks.Unknown;\n const network =\n getBlockChainNameFromId(chainId, this.meta) || Networks.Unknown;\n // We fallback to current active network if `chainId` not provided.\n nextAccounts = accountAddressesWithNetwork(\n connectResult.accounts,\n network\n );\n nextNetwork = network;\n }\n\n if (nextAccounts.length > 0) {\n this.updateState({\n accounts: nextAccounts,\n network: nextNetwork,\n });\n }\n\n return {\n accounts: this.state.accounts,\n network: this.state.network,\n provider: this.provider,\n };\n }\n\n async disconnect() {\n this.resetState();\n\n if (this.actions.disconnect) {\n this.actions.disconnect({\n instance: this.provider,\n // On wallet connect, we need to destory the instance and get a whole new instance when we are going to connect\n destroyInstance: () => {\n this.setProvider(null);\n },\n });\n }\n }\n\n getSigners(provider: any) {\n return this.actions.getSigners(provider);\n }\n getWalletInfo(allBlockChains: BlockchainMeta[]) {\n return this.actions.getWalletInfo(allBlockChains);\n }\n canSwitchNetworkTo(network: Network, provider: any) {\n const switchTo = this.actions.canSwitchNetworkTo;\n if (!switchTo) return false;\n\n return switchTo({\n network,\n meta: this.meta,\n provider,\n });\n }\n\n onInit() {\n if (!this.options.config.isAsyncInstance) {\n const instance = this.actions.getInstance();\n if (!!instance && !this.state.installed) {\n this.setInstalledAs(true);\n }\n }\n }\n\n setProvider(value: any) {\n this.provider = value;\n if (!!value && !!this.actions.subscribe) {\n this.actions.subscribe({\n instance: value,\n state: this.state,\n meta: this.meta,\n connect: this.connect.bind(this),\n disconnect: this.disconnect.bind(this),\n updateAccounts: (accounts, chainId) => {\n let network = this.state.network;\n if (chainId) {\n network =\n getBlockChainNameFromId(chainId, this.meta) || Networks.Unknown;\n }\n\n const nextAccounts = accountAddressesWithNetwork(accounts, network);\n if (nextAccounts.length > 0) {\n this.updateState({\n accounts: nextAccounts,\n });\n }\n },\n updateChainId: (chainId) => {\n const network = chainId\n ? getBlockChainNameFromId(chainId, this.meta)\n : Networks.Unknown;\n this.updateState({\n network,\n });\n },\n });\n }\n }\n\n setMeta(value: BlockchainMeta[]) {\n this.meta = value;\n }\n\n setHandler(handler: EventHandler) {\n this.options.handler = handler;\n }\n\n getState(): State {\n return this.state;\n }\n updateState(states: Partial<State>) {\n // We will notify handler after updating all the states.\n // Because when we call `handler` it will has latest states.\n const updates: [Events, any][] = [];\n\n if (typeof states.connected !== 'undefined') {\n this.state.connected = states.connected;\n updates.push([Events.CONNECTED, states.connected]);\n }\n if (typeof states.connecting !== 'undefined') {\n this.state.connecting = states.connecting;\n updates.push([Events.CONNECTING, states.connecting]);\n }\n if (typeof states.reachable !== 'undefined') {\n this.state.reachable = states.reachable;\n updates.push([Events.REACHABLE, states.reachable]);\n }\n if (typeof states.installed !== 'undefined') {\n this.state.installed = states.installed;\n updates.push([Events.INSTALLED, states.installed]);\n }\n if (typeof states.accounts !== 'undefined') {\n this.state.accounts = states.accounts;\n updates.push([Events.ACCOUNTS, states.accounts]);\n }\n if (typeof states.network !== 'undefined') {\n this.state.network = states.network;\n updates.push([Events.NETWORK, states.network]);\n }\n\n const state = this.getState();\n updates.forEach(([name, value]) => {\n this.options.handler(\n this.options.config.type,\n name,\n value,\n state,\n this.meta\n );\n });\n }\n\n resetState() {\n this.updateState({\n connected: false,\n connecting: false,\n reachable: false,\n accounts: null,\n network: null,\n });\n }\n\n private setInstalledAs(value: boolean) {\n if (!needsCheckInstallation(this.options) && value === false) return;\n\n this.updateState({\n installed: value,\n });\n }\n private async tryGetInstance({\n network,\n force,\n }: {\n network?: Network;\n force?: boolean;\n }) {\n let instance = null;\n // For switching network on Trust Wallet (WalletConnect),\n // We only kill the session (and not restting the whole state)\n // So we are relying on this.provider for achieving this functionality.\n this.setProvider(null);\n if (this.options.config.isAsyncInstance) {\n // Trying to connect\n const instanceOptions: GetInstanceOptions = {\n currentProvider: this.provider,\n meta: this.meta,\n force: force || false,\n updateChainId: (chainId) => {\n const network = chainId\n ? getBlockChainNameFromId(chainId, this.meta)\n : Networks.Unknown;\n this.updateState({\n network,\n });\n },\n };\n\n if (network) {\n instanceOptions.network = network;\n }\n instance = await this.actions.getInstance(instanceOptions);\n } else {\n instance = this.actions.getInstance();\n }\n\n if (!instance) {\n this.setInstalledAs(false);\n this.resetState();\n\n const error_message = `It seems your selected wallet (${this.options.config.type}) isn't installed.`;\n throw new Error(error_message);\n }\n\n this.setProvider(instance);\n return instance;\n }\n}\n\nexport default Wallet;\n", "import { PropsWithChildren } from 'react';\nimport { Network, WalletType, WalletInfo } from '@rango-dev/wallets-shared';\nimport {\n EventHandler as WalletEventHandler,\n State as WalletState,\n} from './wallet';\nimport { SignerFactory, BlockchainMeta } from 'rango-types';\n\nexport type State = {\n [key: string]: WalletState | undefined;\n};\n\nexport type ConnectResult = {\n accounts: string[] | null;\n network: Network | null;\n provider: any;\n};\n\nexport type Providers = { [type in WalletType]?: any };\n\nexport type ProviderContext = {\n connect(type: WalletType, network?: Network): Promise<ConnectResult>;\n disconnect(type: WalletType): Promise<void>;\n disconnectAll(): Promise<PromiseSettledResult<any>[]>;\n state(type: WalletType): WalletState;\n canSwitchNetworkTo(type: WalletType, network: Network): boolean;\n providers(): Providers;\n getSigners(type: WalletType): SignerFactory;\n getWalletInfo(type: WalletType): WalletInfo;\n};\n\nexport type ProviderProps = PropsWithChildren<{\n onUpdateState?: WalletEventHandler;\n allBlockChains?: BlockchainMeta[];\n autoConnect?: boolean;\n providers: ProviderInterface[];\n}>;\n\nexport enum Events {\n CONNECTED = 'connected',\n CONNECTING = 'connecting',\n REACHABLE = 'reachable',\n INSTALLED = 'installed',\n ACCOUNTS = 'accounts',\n NETWORK = 'network',\n}\n\nexport type ProviderConnectResult = {\n accounts: string[];\n chainId: string;\n};\n\nexport type GetInstanceOptions = {\n network?: Network;\n currentProvider: any;\n meta: BlockchainMeta[];\n force?: boolean;\n updateChainId: (chainId: number | string) => void;\n};\n\nexport type GetInstance =\n | (() => any)\n | ((options: GetInstanceOptions) => Promise<any>);\nexport type TryGetInstance =\n | (() => any)\n | ((options: Pick<GetInstanceOptions, 'force' | 'network'>) => Promise<any>);\nexport type Connect = (options: {\n instance: any;\n network?: Network;\n meta: BlockchainMeta[];\n}) => Promise<ProviderConnectResult | ProviderConnectResult[]>;\n\nexport type Disconnect = (options: {\n instance: any;\n destroyInstance: () => void;\n}) => Promise<void>;\nexport type Subscribe = (options: {\n instance: any;\n state: WalletState;\n meta: BlockchainMeta[];\n updateChainId: (chainId: string) => void;\n updateAccounts: (accounts: string[], chainId?: string) => void;\n connect: (network?: Network) => void;\n disconnect: () => void;\n}) => void;\n\nexport type SwitchNetwork = (options: {\n instance: any;\n network: Network;\n meta: BlockchainMeta[];\n newInstance?: TryGetInstance;\n}) => Promise<void>;\n\nexport type CanSwitchNetwork = (options: {\n network: Network;\n meta: BlockchainMeta[];\n provider: any;\n}) => boolean;\n\nexport interface WalletActions {\n connect: Connect;\n getInstance: any;\n disconnect?: Disconnect;\n subscribe?: Subscribe;\n // eagerConnect, // optional?\n // unsubscribe, // coupled to subscribe.\n\n // Optional, but should be provided at the same time.\n switchNetwork?: SwitchNetwork;\n getSigners: (provider: any) => SignerFactory;\n canSwitchNetworkTo?: CanSwitchNetwork;\n getWalletInfo(allBlockChains: BlockchainMeta[]): WalletInfo;\n}\n\nexport interface WalletConfig {\n type: WalletType;\n defaultNetwork?: Network;\n checkInstallation?: boolean;\n isAsyncInstance?: boolean;\n}\n\nexport type WalletProviders = Map<\n WalletType,\n {\n actions: WalletActions;\n config: WalletConfig;\n }\n>;\n\nexport type ProviderInterface = { config: WalletConfig } & WalletActions;\n"],
5
+ "mappings": "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",
6
+ "names": ["WalletConnectProvider", "convertEvmBlockchainMetaToEvmChainInfo", "evmChainsToRpcMap", "WalletTypes", "isEvmBlockchain", "Persistor", "name", "item", "value", "__name", "LASTE_CONNECTED_WALLETS", "choose", "wallets", "type", "wallet", "__name", "defaultWalletState", "state_reducer", "state", "action", "target_wallet", "formatAddressWithNetwork", "address", "network", "accountAddressesWithNetwork", "addresses", "readAccountAddress", "addressWithNetwork", "connectedWallets", "providersState", "wallet_state", "availableWallets", "checkWalletProviders", "list", "provider", "config", "actions", "isAsync", "fn", "needsCheckInstallation", "options", "checkInstallation", "isWalletDerivedFromWalletConnect", "wallet_type", "WalletTypes", "getComptaibleProvider", "supportedChains", "evmBlockchains", "isEvmBlockchain", "rpcUrls", "evmChainsToRpcMap", "convertEvmBlockchainMetaToEvmChainInfo", "WalletConnectProvider", "persistWallet", "persistor", "Persistor", "LASTE_CONNECTED_WALLETS", "walletAlreadyPersisted", "removeWalletFromPersist", "clearPersistStorage", "autoConnect", "addWalletRef", "lastConnectedWallets", "connect_promises", "walletType", "ref", "connect", "makeEventHandler", "dispatcher", "onUpdateState", "name", "value", "coreState", "React", "useEffect", "useReducer", "useContext", "useRef", "createContext", "defaultErrorMesssage", "defaultContext", "WalletContext", "getBlockChainNameFromId", "Networks", "Events", "Wallet", "options", "actions", "needsCheckInstallation", "network", "eagerConnection", "currentNetwork", "requestedNetwork", "networkChanged", "instance", "connectResult", "e", "nextAccounts", "nextNetwork", "blockchain", "chainId", "Networks", "getBlockChainNameFromId", "accountAddressesWithNetwork", "provider", "allBlockChains", "switchTo", "value", "accounts", "handler", "states", "updates", "state", "name", "force", "instanceOptions", "error_message", "__name", "wallet_default", "useInitializers", "onChangeState", "availableWallets", "useRef", "updater", "wallet", "type", "wallet_default", "__name", "useWallets", "context", "useContext", "WalletContext", "Provider", "props", "providersState", "dispatch", "useReducer", "state_reducer", "getWalletInstance", "useInitializers", "makeEventHandler", "listOfProviders", "wallets", "checkWalletProviders", "api", "type", "network", "wallet", "result", "persistWallet", "removeWalletFromPersist", "disconnect_promises", "connectedWallets", "walletInstance", "clearPersistStorage", "defaultWalletState", "providers", "availableWallets", "supportedChains", "provider", "getComptaibleProvider", "useEffect", "runOnInit", "__name", "initWhenPageIsReady", "event", "autoConnect", "React", "WalletContext", "provider_default"]
7
7
  }
@@ -1,6 +1,5 @@
1
1
  /// <reference types="react" />
2
- import { ProviderProps, ProviderContext } from './types';
2
+ import { ProviderProps } from './types';
3
3
  declare function Provider(props: ProviderProps): JSX.Element;
4
- export declare function useWallets(): ProviderContext;
5
4
  export default Provider;
6
5
  //# sourceMappingURL=provider.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../src/provider.tsx"],"names":[],"mappings":";AAoBA,OAAO,EACL,aAAa,EACb,eAAe,EAGhB,MAAM,SAAS,CAAC;AAgEjB,iBAAS,QAAQ,CAAC,KAAK,EAAE,aAAa,eAgLrC;AAED,wBAAgB,UAAU,IAAI,eAAe,CAK5C;AAED,eAAe,QAAQ,CAAC"}
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../src/provider.tsx"],"names":[],"mappings":";AAeA,OAAO,EAAE,aAAa,EAAmB,MAAM,SAAS,CAAC;AAKzD,iBAAS,QAAQ,CAAC,KAAK,EAAE,aAAa,eAkLrC;AAED,eAAe,QAAQ,CAAC"}
package/dist/types.d.ts CHANGED
@@ -26,8 +26,8 @@ export type ProviderContext = {
26
26
  export type ProviderProps = PropsWithChildren<{
27
27
  onUpdateState?: WalletEventHandler;
28
28
  allBlockChains?: BlockchainMeta[];
29
- providers: WalletProvider[];
30
29
  autoConnect?: boolean;
30
+ providers: ProviderInterface[];
31
31
  }>;
32
32
  export declare enum Events {
33
33
  CONNECTED = "connected",
@@ -99,7 +99,7 @@ export type WalletProviders = Map<WalletType, {
99
99
  actions: WalletActions;
100
100
  config: WalletConfig;
101
101
  }>;
102
- export type WalletProvider = {
102
+ export type ProviderInterface = {
103
103
  config: WalletConfig;
104
104
  } & WalletActions;
105
105
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rango-dev/wallets-core",
3
- "version": "0.5.1-next.4",
3
+ "version": "0.5.1-next.6",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "module": "./dist/index.js",
@@ -25,7 +25,7 @@
25
25
  "react-dom": "^17.0.0 || ^18.0.0"
26
26
  },
27
27
  "dependencies": {
28
- "@rango-dev/wallets-shared": "^0.5.1-next.10",
28
+ "@rango-dev/wallets-shared": "^0.5.1-next.11",
29
29
  "@walletconnect/ethereum-provider": "1.8.0",
30
30
  "rango-types": "^0.1.39"
31
31
  },
package/src/context.ts ADDED
@@ -0,0 +1,32 @@
1
+ import { createContext } from 'react';
2
+ import { ProviderContext } from './types';
3
+
4
+ const defaultErrorMesssage = "Context hasn't been initialized yet.";
5
+ const defaultContext: ProviderContext = {
6
+ async connect() {
7
+ throw new Error(defaultErrorMesssage);
8
+ },
9
+ async disconnect() {
10
+ throw new Error(defaultErrorMesssage);
11
+ },
12
+ async disconnectAll() {
13
+ throw new Error(defaultErrorMesssage);
14
+ },
15
+ state() {
16
+ throw new Error(defaultErrorMesssage);
17
+ },
18
+ canSwitchNetworkTo() {
19
+ throw new Error(defaultErrorMesssage);
20
+ },
21
+ providers() {
22
+ throw new Error(defaultErrorMesssage);
23
+ },
24
+ getWalletInfo() {
25
+ throw new Error(defaultErrorMesssage);
26
+ },
27
+ getSigners() {
28
+ throw new Error(defaultErrorMesssage);
29
+ },
30
+ };
31
+
32
+ export const WalletContext = createContext<ProviderContext>(defaultContext);
package/src/helpers.ts CHANGED
@@ -7,12 +7,18 @@ import {
7
7
  WalletType,
8
8
  WalletTypes,
9
9
  } from '@rango-dev/wallets-shared';
10
- import { State, WalletActions, WalletProvider, WalletProviders } from './types';
10
+ import {
11
+ State,
12
+ WalletActions,
13
+ ProviderInterface,
14
+ WalletProviders,
15
+ } from './types';
11
16
  import Wallet, { Options, State as WalletState } from './wallet';
12
17
  import type { BlockchainMeta } from 'rango-types';
13
18
  import { isEvmBlockchain } from 'rango-types';
14
19
  import { Persistor } from './persistor';
15
20
  import { LASTE_CONNECTED_WALLETS } from './constants';
21
+ import type { EventHandler as WalletEventHandler } from './wallet';
16
22
 
17
23
  export function choose(wallets: any[], type: WalletType): any | null {
18
24
  return wallets.find((wallet) => wallet.type === type) || null;
@@ -80,7 +86,7 @@ export function readAccountAddress(addressWithNetwork: string): {
80
86
  const [network, address] = addressWithNetwork.split(':');
81
87
 
82
88
  return {
83
- network: network,
89
+ network,
84
90
  address,
85
91
  };
86
92
  }
@@ -101,7 +107,9 @@ export function availableWallets(providersState: State): WalletType[] {
101
107
  });
102
108
  }
103
109
 
104
- export function checkWalletProviders(list: WalletProvider[]): WalletProviders {
110
+ export function checkWalletProviders(
111
+ list: ProviderInterface[]
112
+ ): WalletProviders {
105
113
  const wallets: WalletProviders = new Map();
106
114
 
107
115
  list.forEach((provider) => {
@@ -211,3 +219,32 @@ export async function autoConnect(
211
219
  }
212
220
  }
213
221
  }
222
+ /*
223
+ Our event handler includes an internal state updater, and a notifier
224
+ for the outside listener.
225
+ On creating first wallet refrence, and on chaning `props.onUpdateState`
226
+ we are using this function.
227
+ */
228
+ export function makeEventHandler(
229
+ dispatcher: any,
230
+ onUpdateState?: WalletEventHandler
231
+ ) {
232
+ const handler: WalletEventHandler = (
233
+ type,
234
+ name,
235
+ value,
236
+ coreState,
237
+ supportedChains
238
+ ) => {
239
+ const action = { type: 'new_state', wallet: type, name, value };
240
+ // Update state
241
+ dispatcher(action);
242
+
243
+ // Giving the event to the outside listener
244
+ if (onUpdateState) {
245
+ onUpdateState(type, name, value, coreState, supportedChains);
246
+ }
247
+ };
248
+
249
+ return handler;
250
+ }
package/src/hooks.ts ADDED
@@ -0,0 +1,45 @@
1
+ import { useContext, useRef } from 'react';
2
+ import { WalletContext } from './context';
3
+ import { ProviderContext, WalletActions, WalletConfig } from './types';
4
+ import Wallet, { EventHandler as WalletEventHandler } from './wallet';
5
+
6
+ /**
7
+ *
8
+ *
9
+ */
10
+ export function useInitializers(onChangeState: WalletEventHandler) {
11
+ const availableWallets = useRef<{
12
+ [key: string]: Wallet | undefined;
13
+ }>({});
14
+
15
+ // If `wallet` hasn't been added to `availableWallets`,
16
+ // Get a instance of `Wallet` and save the refrence in `availableWallets`.
17
+ // Otherwise, return the already created instance.
18
+ function updater(wallet: {
19
+ actions: WalletActions;
20
+ config: WalletConfig;
21
+ }): Wallet {
22
+ const type = wallet.config.type;
23
+ // We only update, if there is no instance available.
24
+ if (typeof availableWallets.current[type] === 'undefined') {
25
+ availableWallets.current[type] = new Wallet(
26
+ {
27
+ config: wallet.config,
28
+ handler: onChangeState,
29
+ },
30
+ wallet.actions
31
+ );
32
+ }
33
+
34
+ return availableWallets.current[type]!;
35
+ }
36
+
37
+ return updater;
38
+ }
39
+
40
+ export function useWallets(): ProviderContext {
41
+ const context = useContext(WalletContext);
42
+ if (!context)
43
+ throw Error('useWallet can only be used within the Provider component');
44
+ return context;
45
+ }
package/src/index.ts CHANGED
@@ -1,3 +1,5 @@
1
1
  export * from './helpers';
2
- export { default as Provider, useWallets } from './provider';
2
+ export { default as Provider } from './provider';
3
+ export { useWallets } from './hooks';
4
+ export type { EventHandler } from './wallet';
3
5
  export * from './types';
package/src/provider.tsx CHANGED
@@ -1,10 +1,4 @@
1
- import React, {
2
- createContext,
3
- useContext,
4
- useEffect,
5
- useReducer,
6
- useRef,
7
- } from 'react';
1
+ import React, { useEffect, useReducer } from 'react';
8
2
 
9
3
  import {
10
4
  autoConnect,
@@ -16,99 +10,36 @@ import {
16
10
  getComptaibleProvider,
17
11
  persistWallet,
18
12
  removeWalletFromPersist,
13
+ makeEventHandler,
19
14
  state_reducer,
20
15
  } from './helpers';
21
- import {
22
- ProviderProps,
23
- ProviderContext,
24
- WalletActions,
25
- WalletConfig,
26
- } from './types';
16
+ import { ProviderProps, ProviderContext } from './types';
27
17
  import { WalletType } from '@rango-dev/wallets-shared';
28
-
29
- import Wallet, { EventHandler as WalletEventHandler } from './wallet';
30
-
31
- // TODO fix lint problem
32
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
33
- // @ts-ignore
34
- const WalletContext = createContext<ProviderContext>({});
35
-
36
- /*
37
- Our event handler includes an internal state updater, and a notifier
38
- for the outside listener.
39
- On creating first wallet refrence, and on chaning `props.onUpdateState`
40
- we are using this function.
41
- */
42
- function makeEventHandler(dispatcher: any, onUpdateState?: WalletEventHandler) {
43
- const handler: WalletEventHandler = (
44
- type,
45
- name,
46
- value,
47
- coreState,
48
- supportedChains
49
- ) => {
50
- const action = { type: 'new_state', wallet: type, name, value };
51
- // Update state
52
- dispatcher(action);
53
-
54
- // Giving the event to the outside listener
55
- if (onUpdateState) {
56
- onUpdateState(type, name, value, coreState, supportedChains);
57
- }
58
- };
59
-
60
- return handler;
61
- }
62
-
63
- function useInitializers(onChangeState: WalletEventHandler) {
64
- const availableWallets = useRef<{
65
- [key: string]: Wallet | undefined;
66
- }>({});
67
-
68
- function updater(wallet: {
69
- actions: WalletActions;
70
- config: WalletConfig;
71
- }): Wallet {
72
- const type = wallet.config.type;
73
- // We only update, if there is no instance available.
74
- if (typeof availableWallets.current[type] === 'undefined') {
75
- availableWallets.current[type] = new Wallet(
76
- {
77
- config: wallet.config,
78
- handler: onChangeState,
79
- },
80
- wallet.actions
81
- );
82
- }
83
-
84
- return availableWallets.current[type]!;
85
- }
86
-
87
- return updater;
88
- }
18
+ import { useInitializers } from './hooks';
19
+ import { WalletContext } from './context';
89
20
 
90
21
  function Provider(props: ProviderProps) {
91
22
  const [providersState, dispatch] = useReducer(state_reducer, {});
92
23
 
93
- const addWalletRef = useInitializers(
24
+ // Get (or add) wallet instance (`provider`s will be wraped in a `Wallet`)
25
+ const getWalletInstance = useInitializers(
94
26
  makeEventHandler(dispatch, props.onUpdateState)
95
27
  );
96
- // const providersRef = useRef<{ [type in WalletType]?: any }>({});
97
28
 
29
+ // Getting providers from props and put all of them in a `Map` with an appropriate interface.
98
30
  const listOfProviders = props.providers;
99
31
  const wallets = checkWalletProviders(listOfProviders);
32
+
33
+ // Final API we put in context and it will be available to use for users.
100
34
  const api: ProviderContext = {
101
- // TODO: Fix type error
102
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
103
- // @ts-ignore
104
35
  async connect(type, network) {
105
36
  const wallet = wallets.get(type);
106
37
  if (!wallet) {
107
38
  throw new Error(`You should add ${type} to provider first.`);
108
39
  }
109
40
 
110
- const ref = addWalletRef(wallet);
111
- const result = await ref.connect(network);
41
+ const walletInstance = getWalletInstance(wallet);
42
+ const result = await walletInstance.connect(network);
112
43
  if (props.autoConnect) persistWallet(type);
113
44
 
114
45
  return result;
@@ -119,8 +50,8 @@ function Provider(props: ProviderProps) {
119
50
  throw new Error(`You should add ${type} to provider first.`);
120
51
  }
121
52
 
122
- const ref = addWalletRef(wallet);
123
- await ref.disconnect();
53
+ const walletInstance = getWalletInstance(wallet);
54
+ await walletInstance.disconnect();
124
55
  if (props.autoConnect) removeWalletFromPersist(type);
125
56
  },
126
57
  async disconnectAll() {
@@ -133,8 +64,8 @@ function Provider(props: ProviderProps) {
133
64
  const wallet = wallets.get(type);
134
65
 
135
66
  if (wallet) {
136
- const ref = addWalletRef(wallet);
137
- disconnect_promises.push(ref.disconnect());
67
+ const walletInstance = getWalletInstance(wallet);
68
+ disconnect_promises.push(walletInstance.disconnect());
138
69
  }
139
70
  });
140
71
 
@@ -150,9 +81,9 @@ function Provider(props: ProviderProps) {
150
81
  return false;
151
82
  }
152
83
 
153
- const ref = addWalletRef(wallet);
154
- return ref.canSwitchNetworkTo
155
- ? ref.canSwitchNetworkTo(network, ref.provider)
84
+ const walletInstance = getWalletInstance(wallet);
85
+ return walletInstance.canSwitchNetworkTo
86
+ ? walletInstance.canSwitchNetworkTo(network, walletInstance.provider)
156
87
  : false;
157
88
  },
158
89
  providers() {
@@ -160,8 +91,8 @@ function Provider(props: ProviderProps) {
160
91
  availableWallets(providersState).forEach((type) => {
161
92
  const wallet = wallets.get(type);
162
93
  if (wallet) {
163
- const ref = addWalletRef(wallet);
164
- providers[type] = ref.provider;
94
+ const walletInstance = getWalletInstance(wallet);
95
+ providers[type] = walletInstance.provider;
165
96
  }
166
97
  });
167
98
 
@@ -184,16 +115,16 @@ function Provider(props: ProviderProps) {
184
115
  if (!wallet) {
185
116
  throw new Error(`You should add ${type} to provider first.`);
186
117
  }
187
- const ref = addWalletRef(wallet);
188
- const supportedChains = ref.getWalletInfo(
118
+ const walletInstance = getWalletInstance(wallet);
119
+ const supportedChains = walletInstance.getWalletInfo(
189
120
  props.allBlockChains || []
190
121
  ).supportedChains;
191
122
  const provider = getComptaibleProvider(
192
123
  supportedChains,
193
- ref.provider,
124
+ walletInstance.provider,
194
125
  type
195
126
  );
196
- const result = ref.getSigners(provider);
127
+ const result = walletInstance.getSigners(provider);
197
128
 
198
129
  return result;
199
130
  },
@@ -201,10 +132,10 @@ function Provider(props: ProviderProps) {
201
132
 
202
133
  useEffect(() => {
203
134
  wallets.forEach((wallet) => {
204
- const ref = addWalletRef(wallet);
135
+ const walletInstance = getWalletInstance(wallet);
205
136
  const runOnInit = () => {
206
- if (ref.onInit) {
207
- ref.onInit();
137
+ if (walletInstance.onInit) {
138
+ walletInstance.onInit();
208
139
  }
209
140
  };
210
141
 
@@ -232,19 +163,21 @@ function Provider(props: ProviderProps) {
232
163
  const allBlockChains = props.allBlockChains;
233
164
  if (allBlockChains) {
234
165
  wallets.forEach((wallet) => {
235
- const ref = addWalletRef(wallet);
236
- const supportedChains = ref.getWalletInfo(
166
+ const walletInstance = getWalletInstance(wallet);
167
+ const supportedChains = walletInstance.getWalletInfo(
237
168
  props.allBlockChains || []
238
169
  ).supportedChains;
239
- ref.setMeta(supportedChains);
170
+ walletInstance.setMeta(supportedChains);
240
171
  });
241
172
  }
242
173
  }, [props.allBlockChains]);
243
174
 
244
175
  useEffect(() => {
245
176
  wallets.forEach((wallet) => {
246
- const ref = addWalletRef(wallet);
247
- ref.setHandler(makeEventHandler(dispatch, props.onUpdateState));
177
+ const walletInstance = getWalletInstance(wallet);
178
+ walletInstance.setHandler(
179
+ makeEventHandler(dispatch, props.onUpdateState)
180
+ );
248
181
  });
249
182
  }, [props.onUpdateState]);
250
183
 
@@ -253,7 +186,7 @@ function Provider(props: ProviderProps) {
253
186
  props.allBlockChains && props.allBlockChains.length && props.autoConnect;
254
187
  if (shouldTryAutoConnect) {
255
188
  (async () => {
256
- await autoConnect(wallets, addWalletRef);
189
+ await autoConnect(wallets, getWalletInstance);
257
190
  })();
258
191
  }
259
192
  }, [props.autoConnect, props.allBlockChains]);
@@ -265,11 +198,4 @@ function Provider(props: ProviderProps) {
265
198
  );
266
199
  }
267
200
 
268
- export function useWallets(): ProviderContext {
269
- const context = useContext(WalletContext);
270
- if (!context)
271
- throw Error('useWallet can only be used within the Provider component');
272
- return context;
273
- }
274
-
275
201
  export default Provider;
package/src/types.ts CHANGED
@@ -32,8 +32,8 @@ export type ProviderContext = {
32
32
  export type ProviderProps = PropsWithChildren<{
33
33
  onUpdateState?: WalletEventHandler;
34
34
  allBlockChains?: BlockchainMeta[];
35
- providers: WalletProvider[];
36
35
  autoConnect?: boolean;
36
+ providers: ProviderInterface[];
37
37
  }>;
38
38
 
39
39
  export enum Events {
@@ -127,4 +127,4 @@ export type WalletProviders = Map<
127
127
  }
128
128
  >;
129
129
 
130
- export type WalletProvider = { config: WalletConfig } & WalletActions;
130
+ export type ProviderInterface = { config: WalletConfig } & WalletActions;