@nexus-cross/crossx-sdk-wagmi 1.3.2 → 1.3.4

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.
@@ -9,6 +9,19 @@ export interface CROSSxConnectorOptions {
9
9
  getStoredWalletIndex?: () => number;
10
10
  /** 활성 지갑 인덱스 변경 시 호출되는 콜백. 미설정 시 localStorage 자동 사용. */
11
11
  onWalletIndexChanged?: (index: number) => void;
12
+ /**
13
+ * 로그인 모달에서 "Connect with Other Wallets" 클릭 시 호출되는 콜백.
14
+ *
15
+ * 제공 시 SDK의 `connectExternalWallet` 이벤트에 자동 등록됩니다.
16
+ * DApp에서 이 콜백으로 wagmi 등 외부 지갑 연결 UI를 열어주세요.
17
+ *
18
+ * @example
19
+ * createCROSSxConnector({
20
+ * sdk,
21
+ * openConnectOtherWallet: () => openConnectModal(),
22
+ * })
23
+ */
24
+ openConnectOtherWallet?: () => void;
12
25
  }
13
26
  /** 간편 모드: SDK 설정만 전달하면 내부에서 SDK를 생성 */
14
27
  export type CrossxConnectorOptions = Omit<SDKConfig, 'useMockWallet'> & {
@@ -17,6 +30,21 @@ export type CrossxConnectorOptions = Omit<SDKConfig, 'useMockWallet'> & {
17
30
  getStoredWalletIndex?: () => number;
18
31
  /** 활성 지갑 인덱스 변경 시 호출되는 콜백. 미설정 시 localStorage 자동 사용. */
19
32
  onWalletIndexChanged?: (index: number) => void;
33
+ /**
34
+ * 로그인 모달에서 "Connect with Other Wallets" 클릭 시 호출되는 콜백.
35
+ *
36
+ * 제공 시 `showConnectOtherWallets: true`가 자동 적용되며,
37
+ * SDK의 `connectExternalWallet` 이벤트에 자동 등록됩니다.
38
+ * 별도로 `showConnectOtherWallets`를 설정하거나 이벤트 리스너를 등록할 필요가 없습니다.
39
+ *
40
+ * @example
41
+ * crossxConnector({
42
+ * projectId: '...',
43
+ * appName: 'MyDApp',
44
+ * openConnectOtherWallet: () => openConnectModal(),
45
+ * })
46
+ */
47
+ openConnectOtherWallet?: () => void;
20
48
  };
21
49
  export declare function crossxConnector(options: CrossxConnectorOptions): import('wagmi').CreateConnectorFn<CROSSxEIP1193Provider, Record<string, unknown>, Record<string, unknown>>;
22
50
  export declare function createCROSSxConnector(options: CROSSxConnectorOptions): import('wagmi').CreateConnectorFn<CROSSxEIP1193Provider, Record<string, unknown>, Record<string, unknown>>;
@@ -1 +1 @@
1
- {"version":3,"file":"connector.d.ts","sourceRoot":"","sources":["../src/connector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAEzE,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAInD,oCAAoC;AACpC,MAAM,WAAW,sBAAsB;IACrC,GAAG,EAAE,SAAS,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACjC,qDAAqD;IACrD,oBAAoB,CAAC,EAAE,MAAM,MAAM,CAAC;IACpC,wDAAwD;IACxD,oBAAoB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CAChD;AAED,uCAAuC;AACvC,MAAM,MAAM,sBAAsB,GAAG,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,GAAG;IACtE,cAAc,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACjC,qDAAqD;IACrD,oBAAoB,CAAC,EAAE,MAAM,MAAM,CAAC;IACpC,wDAAwD;IACxD,oBAAoB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CAChD,CAAC;AAgCF,wBAAgB,eAAe,CAAC,OAAO,EAAE,sBAAsB,8GAI9D;AAID,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,sBAAsB,8GAoNpE"}
1
+ {"version":3,"file":"connector.d.ts","sourceRoot":"","sources":["../src/connector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAEzE,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAInD,oCAAoC;AACpC,MAAM,WAAW,sBAAsB;IACrC,GAAG,EAAE,SAAS,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACjC,qDAAqD;IACrD,oBAAoB,CAAC,EAAE,MAAM,MAAM,CAAC;IACpC,wDAAwD;IACxD,oBAAoB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/C;;;;;;;;;;;OAWG;IACH,sBAAsB,CAAC,EAAE,MAAM,IAAI,CAAC;CACrC;AAED,uCAAuC;AACvC,MAAM,MAAM,sBAAsB,GAAG,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,GAAG;IACtE,cAAc,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACjC,qDAAqD;IACrD,oBAAoB,CAAC,EAAE,MAAM,MAAM,CAAC;IACpC,wDAAwD;IACxD,oBAAoB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/C;;;;;;;;;;;;;OAaG;IACH,sBAAsB,CAAC,EAAE,MAAM,IAAI,CAAC;CACrC,CAAC;AAgCF,wBAAgB,eAAe,CAAC,OAAO,EAAE,sBAAsB,8GAS9D;AAID,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,sBAAsB,8GAyNpE"}
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const v=require("wagmi"),D=require("viem"),f=require("@nexus-cross/crossx-sdk-core");function P(i){return parseInt(i.split(":")[1]??"1",10)}function y(i){return`eip155:${i}`}function E(i){return"0x"+i.toString(16)}function R(i){const t=i.startsWith("0x")?i.slice(2):i,s=new Uint8Array(t.length/2);for(let n=0;n<s.length;n++)s[n]=parseInt(t.substring(n*2,n*2+2),16);return new TextDecoder().decode(s)}class W{constructor(t,s=f.ChainId.CROSS_MAINNET){this.sdk=t,this.listeners=new Map,this.walletIndex=0,this.currentAccounts=[],this.off=this.removeListener.bind(this),this.chainId=typeof s=="number"?s:P(s),this.sdk.on("addressChanged",({address:n,index:o})=>{this.setWalletIndex(o),this.notifyAccountsChanged([n])})}_setWalletIndexChangeCallback(t){this.walletIndexChangeCallback=t}async request({method:t,params:s}){try{return await this._handleRequest(t,s)}catch(n){throw n instanceof f.CROSSxError&&n.code===f.ErrorCode.USER_REJECTED?Object.assign(new Error("User rejected the request"),{code:4001,data:n.details}):n}}async _handleRequest(t,s){var o;const n=s??[];switch(t){case"eth_requestAccounts":case"eth_accounts":{if(this.currentAccounts.length>0)return[...this.currentAccounts];const e=await this.sdk.getAddress();return e?[e.address]:[]}case"eth_chainId":return E(this.chainId);case"net_version":return String(this.chainId);case"personal_sign":{const[e]=n,r=e.startsWith("0x")?R(e):e;return(await this.sdk.signMessage(y(this.chainId),r,{index:this.walletIndex})).signature}case"eth_sign":{const[,e]=n,r=e.startsWith("0x")?R(e):e;return(await this.sdk.signMessage(y(this.chainId),r,{index:this.walletIndex})).signature}case"eth_signTypedData":case"eth_signTypedData_v3":case"eth_signTypedData_v4":{const[,e]=n,r=typeof e=="string"?JSON.parse(e):e,l=(o=r==null?void 0:r.domain)==null?void 0:o.chainId,I=l==null||l===0,u=I?0:Number(l),h={index:this.walletIndex};return(I?await this.sdk.signTypedDataOffchain(r,h):await this.sdk.signTypedData(y(u),r,h)).signature}case"eth_sendTransaction":{const[e]=n,r=y(this.chainId);return(await this.sdk.sendTransaction(r,{from:e.from,to:e.to,value:e.value,data:e.data,gasLimit:e.gasLimit??e.gas,gasPrice:e.gasPrice,maxFeePerGas:e.maxFeePerGas,maxPriorityFeePerGas:e.maxPriorityFeePerGas,nonce:e.nonce!==void 0?parseInt(String(e.nonce),16):void 0,chainId:this.chainId},{index:this.walletIndex})).txHash}case"wallet_switchEthereumChain":{const[{chainId:e}]=n,r=parseInt(e,16);return r!==this.chainId&&(this.chainId=r,this.emit("chainChanged",E(r))),null}case"wallet_addEthereumChain":return null;default:return this.sdk.walletRpc(t,n,y(this.chainId))}}on(t,s){return this.listeners.has(t)||this.listeners.set(t,new Set),this.listeners.get(t).add(s),this}removeListener(t,s){var n;return(n=this.listeners.get(t))==null||n.delete(s),this}emit(t,...s){var n;(n=this.listeners.get(t))==null||n.forEach(o=>o(...s))}notifyAccountsChanged(t){this.currentAccounts=t,this.emit("accountsChanged",t)}notifyDisconnect(t){this.currentAccounts=[],this.walletIndex=0,this.emit("disconnect",t)}getCurrentChainId(){return this.chainId}setChainId(t){t!==this.chainId&&(this.chainId=t,this.emit("chainChanged",E(t)))}setWalletIndex(t){var s;this.walletIndex=t,(s=this.walletIndexChangeCallback)==null||s.call(this,t)}getWalletIndex(){return this.walletIndex}getCurrentAccounts(){return[...this.currentAccounts]}}function N(i){return typeof i=="number"?i:parseInt(i.split(":")[1]??"1",10)}const _="crossx-wallet-index";function L(){try{const i=typeof window<"u"?localStorage.getItem(_):null;return i&&Number(i)||0}catch{return 0}}function q(i){try{typeof window<"u"&&localStorage.setItem(_,String(i))}catch{}}function G(){try{typeof window<"u"&&localStorage.removeItem(_)}catch{}}function M(i){const{defaultChainId:t,getStoredWalletIndex:s,onWalletIndexChanged:n,...o}=i,e=f.createCROSSxSDK(o);return b({sdk:e,defaultChainId:t,getStoredWalletIndex:s,onWalletIndexChanged:n})}function b(i){const{sdk:t,defaultChainId:s=f.ChainId.CROSS_MAINNET,getStoredWalletIndex:n=L,onWalletIndexChanged:o=q}=i,e=N(s);let r=null,l=!1,I=!1;function u(){return r||(r=new W(t,e),r._setWalletIndexChangeCallback(o)),r}return v.createConnector(h=>({id:"crossx",name:"CROSSx Wallet",type:"crossx",async setup(){if(!l){const g=n();await t.initialize({preferredWalletIndex:g}),l=!0,t.on("addressChanged",({address:c,index:C})=>{if(I)return;const m=u();m.setWalletIndex(C),c&&m.notifyAccountsChanged([c])})}const a=u();a.on("accountsChanged",this.onAccountsChanged.bind(this)),a.on("chainChanged",this.onChainChanged.bind(this)),a.on("disconnect",this.onDisconnect.bind(this))},async connect({chainId:a,isReconnecting:g}={}){var m;const c=u(),C=a??e;I=!0;try{if(g||t.isAuthenticated()){const d=n();if(t.isAuthenticated()){try{const S=await t.getAddresses();if(S.length>0){const A=S.find(T=>T.index===d)??S[0];return c.setWalletIndex(A.index),c.notifyAccountsChanged([A.address]),{accounts:[A.address],chainId:C}}}catch{}await t.signOut().catch(()=>{}),c.notifyDisconnect()}}let x;try{x=await t.signInWithCreate()}catch(d){throw d instanceof f.CROSSxError&&d.code===f.ErrorCode.EXTERNAL_WALLET_REQUESTED?(c.notifyDisconnect(),new D.UserRejectedRequestError(d)):(t.isAuthenticated()||(c.notifyDisconnect(),h.emitter.emit("disconnect")),d)}if(!x.success)throw new Error(x.error??"CROSSx sign-in failed");const w=x.address,O=x.addresses.map(d=>d.address).filter(d=>!w||d.toLowerCase()!==w.toLowerCase()),p=w?[w,...O]:O;if(p.length===0)throw new Error("No address found after sign-in");const k=((m=x.addresses.find(d=>w&&d.address.toLowerCase()===w.toLowerCase()))==null?void 0:m.index)??0;return c.setWalletIndex(k),c.notifyAccountsChanged(p),{accounts:p,chainId:C}}finally{I=!1}},async disconnect(){const a=u();await t.signOut(),a.notifyDisconnect(),G(),o(0),h.emitter.emit("disconnect")},async getAccounts(){const g=u().getCurrentAccounts();if(g.length>0)return g;const c=await t.getAddress();return c?[c.address]:[]},async getChainId(){return u().getCurrentChainId()},async getProvider({chainId:a}={}){return u()},async isAuthorized(){return await t.whenReady(),t.isAuthenticated()},async switchChain({chainId:a}){u().setChainId(a),h.emitter.emit("change",{chainId:a});const c=h.chains.find(C=>C.id===a);if(!c)throw new Error(`Chain ${a} is not configured`);return c},onAccountsChanged(a){a.length===0?h.emitter.emit("disconnect"):h.emitter.emit("change",{accounts:a})},onChainChanged(a){h.emitter.emit("change",{chainId:Number(a)})},onDisconnect(){h.emitter.emit("disconnect")}}))}exports.CROSSxEIP1193Provider=W;exports.createCROSSxConnector=b;exports.crossxConnector=M;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const D=require("wagmi"),P=require("viem"),f=require("@nexus-cross/crossx-sdk-core");function N(i){return parseInt(i.split(":")[1]??"1",10)}function y(i){return`eip155:${i}`}function W(i){return"0x"+i.toString(16)}function R(i){const t=i.startsWith("0x")?i.slice(2):i,s=new Uint8Array(t.length/2);for(let n=0;n<s.length;n++)s[n]=parseInt(t.substring(n*2,n*2+2),16);return new TextDecoder().decode(s)}class b{constructor(t,s=f.ChainId.CROSS_MAINNET){this.sdk=t,this.listeners=new Map,this.walletIndex=0,this.currentAccounts=[],this.off=this.removeListener.bind(this),this.chainId=typeof s=="number"?s:N(s),this.sdk.on("addressChanged",({address:n,index:o})=>{this.setWalletIndex(o),this.notifyAccountsChanged([n])})}_setWalletIndexChangeCallback(t){this.walletIndexChangeCallback=t}async request({method:t,params:s}){try{return await this._handleRequest(t,s)}catch(n){throw n instanceof f.CROSSxError&&n.code===f.ErrorCode.USER_REJECTED?Object.assign(new Error("User rejected the request"),{code:4001,data:n.details}):n}}async _handleRequest(t,s){var o;const n=s??[];switch(t){case"eth_requestAccounts":case"eth_accounts":{if(this.currentAccounts.length>0)return[...this.currentAccounts];const e=await this.sdk.getAddress();return e?[e.address]:[]}case"eth_chainId":return W(this.chainId);case"net_version":return String(this.chainId);case"personal_sign":{const[e]=n,r=e.startsWith("0x")?R(e):e;return(await this.sdk.signMessage(y(this.chainId),r,{index:this.walletIndex})).signature}case"eth_sign":{const[,e]=n,r=e.startsWith("0x")?R(e):e;return(await this.sdk.signMessage(y(this.chainId),r,{index:this.walletIndex})).signature}case"eth_signTypedData":case"eth_signTypedData_v3":case"eth_signTypedData_v4":{const[,e]=n,r=typeof e=="string"?JSON.parse(e):e,d=(o=r==null?void 0:r.domain)==null?void 0:o.chainId,w=d==null||d===0,m=w?0:Number(d),l={index:this.walletIndex};return(w?await this.sdk.signTypedDataOffchain(r,l):await this.sdk.signTypedData(y(m),r,l)).signature}case"eth_sendTransaction":{const[e]=n,r=y(this.chainId);return(await this.sdk.sendTransaction(r,{from:e.from,to:e.to,value:e.value,data:e.data,gasLimit:e.gasLimit??e.gas,gasPrice:e.gasPrice,maxFeePerGas:e.maxFeePerGas,maxPriorityFeePerGas:e.maxPriorityFeePerGas,nonce:e.nonce!==void 0?parseInt(String(e.nonce),16):void 0,chainId:this.chainId},{index:this.walletIndex})).txHash}case"wallet_switchEthereumChain":{const[{chainId:e}]=n,r=parseInt(e,16);return r!==this.chainId&&(this.chainId=r,this.emit("chainChanged",W(r))),null}case"wallet_addEthereumChain":return null;default:return this.sdk.walletRpc(t,n,y(this.chainId))}}on(t,s){return this.listeners.has(t)||this.listeners.set(t,new Set),this.listeners.get(t).add(s),this}removeListener(t,s){var n;return(n=this.listeners.get(t))==null||n.delete(s),this}emit(t,...s){var n;(n=this.listeners.get(t))==null||n.forEach(o=>o(...s))}notifyAccountsChanged(t){this.currentAccounts=t,this.emit("accountsChanged",t)}notifyDisconnect(t){this.currentAccounts=[],this.walletIndex=0,this.emit("disconnect",t)}getCurrentChainId(){return this.chainId}setChainId(t){t!==this.chainId&&(this.chainId=t,this.emit("chainChanged",W(t)))}setWalletIndex(t){var s;this.walletIndex=t,(s=this.walletIndexChangeCallback)==null||s.call(this,t)}getWalletIndex(){return this.walletIndex}getCurrentAccounts(){return[...this.currentAccounts]}}function L(i){return typeof i=="number"?i:parseInt(i.split(":")[1]??"1",10)}const O="crossx-wallet-index";function q(){try{const i=typeof window<"u"?localStorage.getItem(O):null;return i&&Number(i)||0}catch{return 0}}function G(i){try{typeof window<"u"&&localStorage.setItem(O,String(i))}catch{}}function M(){try{typeof window<"u"&&localStorage.removeItem(O)}catch{}}function U(i){const{defaultChainId:t,getStoredWalletIndex:s,onWalletIndexChanged:n,openConnectOtherWallet:o,...e}=i;o&&(e.showConnectOtherWallets=!0);const r=f.createCROSSxSDK(e);return k({sdk:r,defaultChainId:t,getStoredWalletIndex:s,onWalletIndexChanged:n,openConnectOtherWallet:o})}function k(i){const{sdk:t,defaultChainId:s=f.ChainId.CROSS_MAINNET,getStoredWalletIndex:n=q,onWalletIndexChanged:o=G,openConnectOtherWallet:e}=i,r=L(s);let d=null,w=!1,m=!1;function l(){return d||(d=new b(t,r),d._setWalletIndexChangeCallback(o)),d}return D.createConnector(u=>({id:"crossx",name:"CROSSx Wallet",type:"crossx",async setup(){if(!w){const g=n();await t.initialize({preferredWalletIndex:g}),w=!0,t.on("addressChanged",({address:c,index:C})=>{if(m)return;const p=l();p.setWalletIndex(C),c&&p.notifyAccountsChanged([c])}),e&&t.on("connectExternalWallet",e)}const a=l();a.on("accountsChanged",this.onAccountsChanged.bind(this)),a.on("chainChanged",this.onChainChanged.bind(this)),a.on("disconnect",this.onDisconnect.bind(this))},async connect({chainId:a,isReconnecting:g}={}){var p;const c=l(),C=a??r;m=!0;try{if(g||t.isAuthenticated()){const h=n();if(t.isAuthenticated()){try{const A=await t.getAddresses();if(A.length>0){const E=A.find(v=>v.index===h)??A[0];return c.setWalletIndex(E.index),c.notifyAccountsChanged([E.address]),{accounts:[E.address],chainId:C}}}catch{}await t.signOut().catch(()=>{}),c.notifyDisconnect()}}let I;try{I=await t.signInWithCreate()}catch(h){throw h instanceof f.CROSSxError&&h.code===f.ErrorCode.EXTERNAL_WALLET_REQUESTED?(c.notifyDisconnect(),new P.UserRejectedRequestError(h)):(t.isAuthenticated()||(c.notifyDisconnect(),u.emitter.emit("disconnect")),h)}if(!I.success)throw new Error(I.error??"CROSSx sign-in failed");const x=I.address,_=I.addresses.map(h=>h.address).filter(h=>!x||h.toLowerCase()!==x.toLowerCase()),S=x?[x,..._]:_;if(S.length===0)throw new Error("No address found after sign-in");const T=((p=I.addresses.find(h=>x&&h.address.toLowerCase()===x.toLowerCase()))==null?void 0:p.index)??0;return c.setWalletIndex(T),c.notifyAccountsChanged(S),{accounts:S,chainId:C}}finally{m=!1}},async disconnect(){const a=l();await t.signOut(),a.notifyDisconnect(),M(),o(0),u.emitter.emit("disconnect")},async getAccounts(){const g=l().getCurrentAccounts();if(g.length>0)return g;const c=await t.getAddress();return c?[c.address]:[]},async getChainId(){return l().getCurrentChainId()},async getProvider({chainId:a}={}){return l()},async isAuthorized(){return await t.whenReady(),t.isAuthenticated()},async switchChain({chainId:a}){l().setChainId(a),u.emitter.emit("change",{chainId:a});const c=u.chains.find(C=>C.id===a);if(!c)throw new Error(`Chain ${a} is not configured`);return c},onAccountsChanged(a){a.length===0?u.emitter.emit("disconnect"):u.emitter.emit("change",{accounts:a})},onChainChanged(a){u.emitter.emit("change",{chainId:Number(a)})},onDisconnect(){u.emitter.emit("disconnect")}}))}exports.CROSSxEIP1193Provider=b;exports.createCROSSxConnector=k;exports.crossxConnector=U;
package/dist/index.js CHANGED
@@ -1,24 +1,24 @@
1
- import { createConnector as D } from "wagmi";
2
- import { UserRejectedRequestError as v } from "viem";
3
- import { ChainId as b, CROSSxError as R, ErrorCode as k, createCROSSxSDK as P } from "@nexus-cross/crossx-sdk-core";
4
- function N(i) {
1
+ import { createConnector as v } from "wagmi";
2
+ import { UserRejectedRequestError as P } from "viem";
3
+ import { ChainId as b, CROSSxError as R, ErrorCode as k, createCROSSxSDK as N } from "@nexus-cross/crossx-sdk-core";
4
+ function L(i) {
5
5
  return parseInt(i.split(":")[1] ?? "1", 10);
6
6
  }
7
- function m(i) {
7
+ function p(i) {
8
8
  return `eip155:${i}`;
9
9
  }
10
- function A(i) {
10
+ function E(i) {
11
11
  return "0x" + i.toString(16);
12
12
  }
13
- function W(i) {
13
+ function O(i) {
14
14
  const t = i.startsWith("0x") ? i.slice(2) : i, s = new Uint8Array(t.length / 2);
15
15
  for (let n = 0; n < s.length; n++)
16
16
  s[n] = parseInt(t.substring(n * 2, n * 2 + 2), 16);
17
17
  return new TextDecoder().decode(s);
18
18
  }
19
- class L {
19
+ class q {
20
20
  constructor(t, s = b.CROSS_MAINNET) {
21
- this.sdk = t, this.listeners = /* @__PURE__ */ new Map(), this.walletIndex = 0, this.currentAccounts = [], this.off = this.removeListener.bind(this), this.chainId = typeof s == "number" ? s : N(s), this.sdk.on("addressChanged", ({ address: n, index: o }) => {
21
+ this.sdk = t, this.listeners = /* @__PURE__ */ new Map(), this.walletIndex = 0, this.currentAccounts = [], this.off = this.removeListener.bind(this), this.chainId = typeof s == "number" ? s : L(s), this.sdk.on("addressChanged", ({ address: n, index: o }) => {
22
22
  this.setWalletIndex(o), this.notifyAccountsChanged([n]);
23
23
  });
24
24
  }
@@ -49,21 +49,21 @@ class L {
49
49
  return e ? [e.address] : [];
50
50
  }
51
51
  case "eth_chainId":
52
- return A(this.chainId);
52
+ return E(this.chainId);
53
53
  case "net_version":
54
54
  return String(this.chainId);
55
55
  case "personal_sign": {
56
- const [e] = n, r = e.startsWith("0x") ? W(e) : e;
56
+ const [e] = n, r = e.startsWith("0x") ? O(e) : e;
57
57
  return (await this.sdk.signMessage(
58
- m(this.chainId),
58
+ p(this.chainId),
59
59
  r,
60
60
  { index: this.walletIndex }
61
61
  )).signature;
62
62
  }
63
63
  case "eth_sign": {
64
- const [, e] = n, r = e.startsWith("0x") ? W(e) : e;
64
+ const [, e] = n, r = e.startsWith("0x") ? O(e) : e;
65
65
  return (await this.sdk.signMessage(
66
- m(this.chainId),
66
+ p(this.chainId),
67
67
  r,
68
68
  { index: this.walletIndex }
69
69
  )).signature;
@@ -71,11 +71,11 @@ class L {
71
71
  case "eth_signTypedData":
72
72
  case "eth_signTypedData_v3":
73
73
  case "eth_signTypedData_v4": {
74
- const [, e] = n, r = typeof e == "string" ? JSON.parse(e) : e, l = (o = r == null ? void 0 : r.domain) == null ? void 0 : o.chainId, f = l == null || l === 0, u = f ? 0 : Number(l), h = { index: this.walletIndex };
75
- return (f ? await this.sdk.signTypedDataOffchain(r, h) : await this.sdk.signTypedData(m(u), r, h)).signature;
74
+ const [, e] = n, r = typeof e == "string" ? JSON.parse(e) : e, d = (o = r == null ? void 0 : r.domain) == null ? void 0 : o.chainId, x = d == null || d === 0, w = x ? 0 : Number(d), l = { index: this.walletIndex };
75
+ return (x ? await this.sdk.signTypedDataOffchain(r, l) : await this.sdk.signTypedData(p(w), r, l)).signature;
76
76
  }
77
77
  case "eth_sendTransaction": {
78
- const [e] = n, r = m(this.chainId);
78
+ const [e] = n, r = p(this.chainId);
79
79
  return (await this.sdk.sendTransaction(r, {
80
80
  from: e.from,
81
81
  to: e.to,
@@ -91,12 +91,12 @@ class L {
91
91
  }
92
92
  case "wallet_switchEthereumChain": {
93
93
  const [{ chainId: e }] = n, r = parseInt(e, 16);
94
- return r !== this.chainId && (this.chainId = r, this.emit("chainChanged", A(r))), null;
94
+ return r !== this.chainId && (this.chainId = r, this.emit("chainChanged", E(r))), null;
95
95
  }
96
96
  case "wallet_addEthereumChain":
97
97
  return null;
98
98
  default:
99
- return this.sdk.walletRpc(t, n, m(this.chainId));
99
+ return this.sdk.walletRpc(t, n, p(this.chainId));
100
100
  }
101
101
  }
102
102
  // ── EIP-1193 이벤트 ───────────────────────────────────────────────────────
@@ -122,7 +122,7 @@ class L {
122
122
  return this.chainId;
123
123
  }
124
124
  setChainId(t) {
125
- t !== this.chainId && (this.chainId = t, this.emit("chainChanged", A(t)));
125
+ t !== this.chainId && (this.chainId = t, this.emit("chainChanged", E(t)));
126
126
  }
127
127
  /**
128
128
  * 활성 지갑 인덱스 설정.
@@ -139,77 +139,80 @@ class L {
139
139
  return [...this.currentAccounts];
140
140
  }
141
141
  }
142
- function q(i) {
142
+ function G(i) {
143
143
  return typeof i == "number" ? i : parseInt(i.split(":")[1] ?? "1", 10);
144
144
  }
145
- const E = "crossx-wallet-index";
146
- function G() {
145
+ const W = "crossx-wallet-index";
146
+ function U() {
147
147
  try {
148
- const i = typeof window < "u" ? localStorage.getItem(E) : null;
148
+ const i = typeof window < "u" ? localStorage.getItem(W) : null;
149
149
  return i && Number(i) || 0;
150
150
  } catch {
151
151
  return 0;
152
152
  }
153
153
  }
154
- function U(i) {
154
+ function M(i) {
155
155
  try {
156
- typeof window < "u" && localStorage.setItem(E, String(i));
156
+ typeof window < "u" && localStorage.setItem(W, String(i));
157
157
  } catch {
158
158
  }
159
159
  }
160
- function M() {
160
+ function F() {
161
161
  try {
162
- typeof window < "u" && localStorage.removeItem(E);
162
+ typeof window < "u" && localStorage.removeItem(W);
163
163
  } catch {
164
164
  }
165
165
  }
166
- function J(i) {
167
- const { defaultChainId: t, getStoredWalletIndex: s, onWalletIndexChanged: n, ...o } = i, e = P(o);
168
- return F({ sdk: e, defaultChainId: t, getStoredWalletIndex: s, onWalletIndexChanged: n });
166
+ function K(i) {
167
+ const { defaultChainId: t, getStoredWalletIndex: s, onWalletIndexChanged: n, openConnectOtherWallet: o, ...e } = i;
168
+ o && (e.showConnectOtherWallets = !0);
169
+ const r = N(e);
170
+ return j({ sdk: r, defaultChainId: t, getStoredWalletIndex: s, onWalletIndexChanged: n, openConnectOtherWallet: o });
169
171
  }
170
- function F(i) {
172
+ function j(i) {
171
173
  const {
172
174
  sdk: t,
173
175
  defaultChainId: s = b.CROSS_MAINNET,
174
- getStoredWalletIndex: n = G,
175
- onWalletIndexChanged: o = U
176
- } = i, e = q(s);
177
- let r = null, l = !1, f = !1;
178
- function u() {
179
- return r || (r = new L(t, e), r._setWalletIndexChangeCallback(o)), r;
176
+ getStoredWalletIndex: n = U,
177
+ onWalletIndexChanged: o = M,
178
+ openConnectOtherWallet: e
179
+ } = i, r = G(s);
180
+ let d = null, x = !1, w = !1;
181
+ function l() {
182
+ return d || (d = new q(t, r), d._setWalletIndexChangeCallback(o)), d;
180
183
  }
181
- return D((h) => ({
184
+ return v((u) => ({
182
185
  id: "crossx",
183
186
  name: "CROSSx Wallet",
184
187
  type: "crossx",
185
188
  async setup() {
186
- if (!l) {
189
+ if (!x) {
187
190
  const g = n();
188
- await t.initialize({ preferredWalletIndex: g }), l = !0, t.on("addressChanged", ({ address: c, index: I }) => {
189
- if (f) return;
190
- const w = u();
191
- w.setWalletIndex(I), c && w.notifyAccountsChanged([c]);
192
- });
191
+ await t.initialize({ preferredWalletIndex: g }), x = !0, t.on("addressChanged", ({ address: c, index: f }) => {
192
+ if (w) return;
193
+ const m = l();
194
+ m.setWalletIndex(f), c && m.notifyAccountsChanged([c]);
195
+ }), e && t.on("connectExternalWallet", e);
193
196
  }
194
- const a = u();
197
+ const a = l();
195
198
  a.on("accountsChanged", this.onAccountsChanged.bind(this)), a.on("chainChanged", this.onChainChanged.bind(this)), a.on("disconnect", this.onDisconnect.bind(this));
196
199
  },
197
200
  // ── connect ─────────────────────────────────────────────────────────────
198
201
  async connect({ chainId: a, isReconnecting: g } = {}) {
199
- var w;
200
- const c = u(), I = a ?? e;
201
- f = !0;
202
+ var m;
203
+ const c = l(), f = a ?? r;
204
+ w = !0;
202
205
  try {
203
206
  if (g || t.isAuthenticated()) {
204
- const d = n();
207
+ const h = n();
205
208
  if (t.isAuthenticated()) {
206
209
  try {
207
- const y = await t.getAddresses();
208
- if (y.length > 0) {
209
- const S = y.find((T) => T.index === d) ?? y[0];
210
- return c.setWalletIndex(S.index), c.notifyAccountsChanged([S.address]), {
211
- accounts: [S.address],
212
- chainId: I
210
+ const S = await t.getAddresses();
211
+ if (S.length > 0) {
212
+ const A = S.find((D) => D.index === h) ?? S[0];
213
+ return c.setWalletIndex(A.index), c.notifyAccountsChanged([A.address]), {
214
+ accounts: [A.address],
215
+ chainId: f
213
216
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
214
217
  };
215
218
  }
@@ -219,48 +222,48 @@ function F(i) {
219
222
  }), c.notifyDisconnect();
220
223
  }
221
224
  }
222
- let C;
225
+ let I;
223
226
  try {
224
- C = await t.signInWithCreate();
225
- } catch (d) {
226
- throw d instanceof R && d.code === k.EXTERNAL_WALLET_REQUESTED ? (c.notifyDisconnect(), new v(d)) : (t.isAuthenticated() || (c.notifyDisconnect(), h.emitter.emit("disconnect")), d);
227
+ I = await t.signInWithCreate();
228
+ } catch (h) {
229
+ throw h instanceof R && h.code === k.EXTERNAL_WALLET_REQUESTED ? (c.notifyDisconnect(), new P(h)) : (t.isAuthenticated() || (c.notifyDisconnect(), u.emitter.emit("disconnect")), h);
227
230
  }
228
- if (!C.success)
229
- throw new Error(C.error ?? "CROSSx sign-in failed");
230
- const x = C.address, _ = C.addresses.map((d) => d.address).filter((d) => !x || d.toLowerCase() !== x.toLowerCase()), p = x ? [x, ..._] : _;
231
- if (p.length === 0)
231
+ if (!I.success)
232
+ throw new Error(I.error ?? "CROSSx sign-in failed");
233
+ const C = I.address, _ = I.addresses.map((h) => h.address).filter((h) => !C || h.toLowerCase() !== C.toLowerCase()), y = C ? [C, ..._] : _;
234
+ if (y.length === 0)
232
235
  throw new Error("No address found after sign-in");
233
- const O = ((w = C.addresses.find(
234
- (d) => x && d.address.toLowerCase() === x.toLowerCase()
235
- )) == null ? void 0 : w.index) ?? 0;
236
- return c.setWalletIndex(O), c.notifyAccountsChanged(p), {
237
- accounts: p,
238
- chainId: I
236
+ const T = ((m = I.addresses.find(
237
+ (h) => C && h.address.toLowerCase() === C.toLowerCase()
238
+ )) == null ? void 0 : m.index) ?? 0;
239
+ return c.setWalletIndex(T), c.notifyAccountsChanged(y), {
240
+ accounts: y,
241
+ chainId: f
239
242
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
240
243
  };
241
244
  } finally {
242
- f = !1;
245
+ w = !1;
243
246
  }
244
247
  },
245
248
  // ── disconnect ──────────────────────────────────────────────────────────
246
249
  async disconnect() {
247
- const a = u();
248
- await t.signOut(), a.notifyDisconnect(), M(), o(0), h.emitter.emit("disconnect");
250
+ const a = l();
251
+ await t.signOut(), a.notifyDisconnect(), F(), o(0), u.emitter.emit("disconnect");
249
252
  },
250
253
  // ── getAccounts ─────────────────────────────────────────────────────────
251
254
  async getAccounts() {
252
- const g = u().getCurrentAccounts();
255
+ const g = l().getCurrentAccounts();
253
256
  if (g.length > 0) return g;
254
257
  const c = await t.getAddress();
255
258
  return c ? [c.address] : [];
256
259
  },
257
260
  // ── getChainId ──────────────────────────────────────────────────────────
258
261
  async getChainId() {
259
- return u().getCurrentChainId();
262
+ return l().getCurrentChainId();
260
263
  },
261
264
  // ── getProvider ─────────────────────────────────────────────────────────
262
265
  async getProvider({ chainId: a } = {}) {
263
- return u();
266
+ return l();
264
267
  },
265
268
  // ── isAuthorized ────────────────────────────────────────────────────────
266
269
  async isAuthorized() {
@@ -268,30 +271,30 @@ function F(i) {
268
271
  },
269
272
  // ── switchChain ─────────────────────────────────────────────────────────
270
273
  async switchChain({ chainId: a }) {
271
- u().setChainId(a), h.emitter.emit("change", { chainId: a });
272
- const c = h.chains.find((I) => I.id === a);
274
+ l().setChainId(a), u.emitter.emit("change", { chainId: a });
275
+ const c = u.chains.find((f) => f.id === a);
273
276
  if (!c)
274
277
  throw new Error(`Chain ${a} is not configured`);
275
278
  return c;
276
279
  },
277
280
  // ── 이벤트 핸들러 ───────────────────────────────────────────────────────
278
281
  onAccountsChanged(a) {
279
- a.length === 0 ? h.emitter.emit("disconnect") : h.emitter.emit("change", {
282
+ a.length === 0 ? u.emitter.emit("disconnect") : u.emitter.emit("change", {
280
283
  accounts: a
281
284
  });
282
285
  },
283
286
  onChainChanged(a) {
284
- h.emitter.emit("change", {
287
+ u.emitter.emit("change", {
285
288
  chainId: Number(a)
286
289
  });
287
290
  },
288
291
  onDisconnect() {
289
- h.emitter.emit("disconnect");
292
+ u.emitter.emit("disconnect");
290
293
  }
291
294
  }));
292
295
  }
293
296
  export {
294
- L as CROSSxEIP1193Provider,
295
- F as createCROSSxConnector,
296
- J as crossxConnector
297
+ q as CROSSxEIP1193Provider,
298
+ j as createCROSSxConnector,
299
+ K as crossxConnector
297
300
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nexus-cross/crossx-sdk-wagmi",
3
- "version": "1.3.2",
3
+ "version": "1.3.4",
4
4
  "description": "CROSSx SDK wagmi Connector — OAuth 임베디드 지갑을 wagmi에 통합",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -17,7 +17,7 @@
17
17
  "dist"
18
18
  ],
19
19
  "dependencies": {
20
- "@nexus-cross/crossx-sdk-core": "1.3.2"
20
+ "@nexus-cross/crossx-sdk-core": "1.3.4"
21
21
  },
22
22
  "peerDependencies": {
23
23
  "viem": ">=2.0.0",