@nexus-cross/crossx-sdk-wagmi 1.0.4 → 1.0.5

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.
@@ -5,10 +5,18 @@ import { CROSSxEIP1193Provider } from './provider';
5
5
  export interface CROSSxConnectorOptions {
6
6
  sdk: CROSSxSDK;
7
7
  defaultChainId?: string | number;
8
+ /** 저장된 지갑 인덱스를 반환하는 콜백. 미설정 시 localStorage 자동 사용. */
9
+ getStoredWalletIndex?: () => number;
10
+ /** 활성 지갑 인덱스 변경 시 호출되는 콜백. 미설정 시 localStorage 자동 사용. */
11
+ onWalletIndexChanged?: (index: number) => void;
8
12
  }
9
13
  /** 간편 모드: SDK 설정만 전달하면 내부에서 SDK를 생성 */
10
14
  export type CrossxConnectorOptions = Omit<SDKConfig, 'useMockWallet'> & {
11
15
  defaultChainId?: string | number;
16
+ /** 저장된 지갑 인덱스를 반환하는 콜백. 미설정 시 localStorage 자동 사용. */
17
+ getStoredWalletIndex?: () => number;
18
+ /** 활성 지갑 인덱스 변경 시 호출되는 콜백. 미설정 시 localStorage 자동 사용. */
19
+ onWalletIndexChanged?: (index: number) => void;
12
20
  };
13
21
  export declare function crossxConnector(options: CrossxConnectorOptions): import('wagmi').CreateConnectorFn<CROSSxEIP1193Provider, Record<string, unknown>, Record<string, unknown>>;
14
22
  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;CAClC;AAED,uCAAuC;AACvC,MAAM,MAAM,sBAAsB,GAAG,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,GAAG;IACtE,cAAc,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAClC,CAAC;AAWF,wBAAgB,eAAe,CAAC,OAAO,EAAE,sBAAsB,8GAI9D;AAID,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,sBAAsB,8GA8IpE"}
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,8GAkLpE"}
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const x=require("wagmi"),p=require("@nexus-cross/crossx-sdk-core");function _(r){return parseInt(r.split(":")[1]??"1",10)}function u(r){return`eip155:${r}`}function f(r){return"0x"+r.toString(16)}class w{constructor(t,a=p.ChainId.CROSS_MAINNET){this.sdk=t,this.listeners=new Map,this.off=this.removeListener.bind(this),this.chainId=typeof a=="number"?a:_(a)}async request({method:t,params:a}){var o;const i=a??[];switch(t){case"eth_requestAccounts":case"eth_accounts":{const e=await this.sdk.getAddress();return e?[e.address]:[]}case"eth_chainId":return f(this.chainId);case"net_version":return String(this.chainId);case"personal_sign":{const[e]=i;return(await this.sdk.signMessage(u(this.chainId),e)).signature}case"eth_sign":{const[,e]=i;return(await this.sdk.signMessage(u(this.chainId),e)).signature}case"eth_signTypedData":case"eth_signTypedData_v3":case"eth_signTypedData_v4":{const[,e]=i,s=typeof e=="string"?JSON.parse(e):e,c=(o=s==null?void 0:s.domain)==null?void 0:o.chainId,n=c==null||c===0,g=n?0:Number(c);return(n?await this.sdk.signTypedDataOffchain(s):await this.sdk.signTypedData(u(g),s)).signature}case"eth_sendTransaction":{const[e]=i,s=u(this.chainId);return(await this.sdk.sendTransaction(s,{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})).txHash}case"wallet_switchEthereumChain":{const[{chainId:e}]=i,s=parseInt(e,16);return s!==this.chainId&&(this.chainId=s,this.emit("chainChanged",f(s))),null}case"wallet_addEthereumChain":return null;default:return this.sdk.walletRpc(t,i,u(this.chainId))}}on(t,a){return this.listeners.has(t)||this.listeners.set(t,new Set),this.listeners.get(t).add(a),this}removeListener(t,a){var i;return(i=this.listeners.get(t))==null||i.delete(a),this}emit(t,...a){var i;(i=this.listeners.get(t))==null||i.forEach(o=>o(...a))}notifyAccountsChanged(t){this.emit("accountsChanged",t)}notifyDisconnect(t){this.emit("disconnect",t)}getCurrentChainId(){return this.chainId}setChainId(t){t!==this.chainId&&(this.chainId=t,this.emit("chainChanged",f(t)))}}function P(r){return typeof r=="number"?r:parseInt(r.split(":")[1]??"1",10)}function v(r){const{defaultChainId:t,...a}=r,i=p.createCROSSxSDK(a);return S({sdk:i,defaultChainId:t})}function S(r){const{sdk:t,defaultChainId:a=p.ChainId.CROSS_MAINNET}=r,i=P(a);let o=null,e=!1;function s(){return o||(o=new w(t,i)),o}return x.createConnector(c=>({id:"crossx",name:"CROSSx Wallet",type:"crossx",async setup(){e||(await t.initialize(),e=!0);const n=s();n.on("accountsChanged",this.onAccountsChanged.bind(this)),n.on("chainChanged",this.onChainChanged.bind(this)),n.on("disconnect",this.onDisconnect.bind(this))},async connect({chainId:n,isReconnecting:g}={}){const d=s(),l=n??i;if(g||t.isAuthenticated()){const h=await t.getAddress();if(h)return{accounts:[h.address],chainId:l}}const C=await t.signInWithCreate();if(!C.success)throw new Error(C.error??"CROSSx sign-in failed");const I=C.address,y=C.addresses.map(h=>h.address).filter(h=>!I||h.toLowerCase()!==I.toLowerCase()),m=I?[I,...y]:y;if(m.length===0)throw new Error("No address found after sign-in");return d.notifyAccountsChanged(m),{accounts:m,chainId:l}},async disconnect(){const n=s();await t.signOut(),n.notifyDisconnect(),c.emitter.emit("disconnect")},async getAccounts(){const n=await t.getAddress();return n?[n.address]:[]},async getChainId(){return s().getCurrentChainId()},async getProvider({chainId:n}={}){return s()},async isAuthorized(){return t.isAuthenticated()},async switchChain({chainId:n}){s().setChainId(n),c.emitter.emit("change",{chainId:n});const d=c.chains.find(l=>l.id===n);if(!d)throw new Error(`Chain ${n} is not configured`);return d},onAccountsChanged(n){n.length===0?c.emitter.emit("disconnect"):c.emitter.emit("change",{accounts:n})},onChainChanged(n){c.emitter.emit("change",{chainId:Number(n)})},onDisconnect(){c.emitter.emit("disconnect")}}))}exports.CROSSxEIP1193Provider=w;exports.createCROSSxConnector=S;exports.crossxConnector=v;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const v=require("wagmi"),b=require("@nexus-cross/crossx-sdk-core");function _(s){return parseInt(s.split(":")[1]??"1",10)}function S(s){return`eip155:${s}`}function A(s){return"0x"+s.toString(16)}class R{constructor(e,c=b.ChainId.CROSS_MAINNET){this.sdk=e,this.listeners=new Map,this.walletIndex=0,this.currentAccounts=[],this.off=this.removeListener.bind(this),this.chainId=typeof c=="number"?c:_(c)}_setWalletIndexChangeCallback(e){this.walletIndexChangeCallback=e}async request({method:e,params:c}){var r;const a=c??[];switch(e){case"eth_requestAccounts":case"eth_accounts":{if(this.currentAccounts.length>0)return console.log("[CROSSx-debug] provider.eth_accounts → currentAccounts:",this.currentAccounts[0],"walletIndex:",this.walletIndex),[...this.currentAccounts];const t=await this.sdk.getAddress();return console.log("[CROSSx-debug] provider.eth_accounts → fallback sdk.getAddress():",t==null?void 0:t.address),t?[t.address]:[]}case"eth_chainId":return A(this.chainId);case"net_version":return String(this.chainId);case"personal_sign":{const[t]=a;return(await this.sdk.signMessage(S(this.chainId),t,{index:this.walletIndex})).signature}case"eth_sign":{const[,t]=a;return(await this.sdk.signMessage(S(this.chainId),t,{index:this.walletIndex})).signature}case"eth_signTypedData":case"eth_signTypedData_v3":case"eth_signTypedData_v4":{const[,t]=a,i=typeof t=="string"?JSON.parse(t):t,C=(r=i==null?void 0:i.domain)==null?void 0:r.chainId,d=C==null||C===0,u=d?0:Number(C),n={index:this.walletIndex};return(d?await this.sdk.signTypedDataOffchain(i,n):await this.sdk.signTypedData(S(u),i,n)).signature}case"eth_sendTransaction":{const[t]=a,i=S(this.chainId);return(await this.sdk.sendTransaction(i,{from:t.from,to:t.to,value:t.value,data:t.data,gasLimit:t.gasLimit??t.gas,gasPrice:t.gasPrice,maxFeePerGas:t.maxFeePerGas,maxPriorityFeePerGas:t.maxPriorityFeePerGas,nonce:t.nonce!==void 0?parseInt(String(t.nonce),16):void 0,chainId:this.chainId},{index:this.walletIndex})).txHash}case"wallet_switchEthereumChain":{const[{chainId:t}]=a,i=parseInt(t,16);return i!==this.chainId&&(this.chainId=i,this.emit("chainChanged",A(i))),null}case"wallet_addEthereumChain":return null;default:return this.sdk.walletRpc(e,a,S(this.chainId))}}on(e,c){return this.listeners.has(e)||this.listeners.set(e,new Set),this.listeners.get(e).add(c),this}removeListener(e,c){var a;return(a=this.listeners.get(e))==null||a.delete(c),this}emit(e,...c){var a;(a=this.listeners.get(e))==null||a.forEach(r=>r(...c))}notifyAccountsChanged(e){console.log("[CROSSx-debug] provider.notifyAccountsChanged:",e[0],"walletIndex:",this.walletIndex),this.currentAccounts=e,this.emit("accountsChanged",e)}notifyDisconnect(e){this.currentAccounts=[],this.walletIndex=0,this.emit("disconnect",e)}getCurrentChainId(){return this.chainId}setChainId(e){e!==this.chainId&&(this.chainId=e,this.emit("chainChanged",A(e)))}setWalletIndex(e){var c;console.log("[CROSSx-debug] provider.setWalletIndex:",e),this.walletIndex=e,(c=this.walletIndexChangeCallback)==null||c.call(this,e)}getWalletIndex(){return this.walletIndex}getCurrentAccounts(){return[...this.currentAccounts]}}function W(s){return typeof s=="number"?s:parseInt(s.split(":")[1]??"1",10)}const O="crossx-wallet-index";function P(){try{const s=typeof window<"u"?localStorage.getItem(O):null;return s&&Number(s)||0}catch{return 0}}function T(s){try{typeof window<"u"&&localStorage.setItem(O,String(s))}catch{}}function D(){try{typeof window<"u"&&localStorage.removeItem(O)}catch{}}function E(s){const{defaultChainId:e,getStoredWalletIndex:c,onWalletIndexChanged:a,...r}=s,t=b.createCROSSxSDK(r);return k({sdk:t,defaultChainId:e,getStoredWalletIndex:c,onWalletIndexChanged:a})}function k(s){const{sdk:e,defaultChainId:c=b.ChainId.CROSS_MAINNET,getStoredWalletIndex:a=P,onWalletIndexChanged:r=T}=s,t=W(c);let i=null,C=!1;function d(){return i||(i=new R(e,t),i._setWalletIndexChangeCallback(r)),i}return v.createConnector(u=>({id:"crossx",name:"CROSSx Wallet",type:"crossx",async setup(){console.log("[CROSSx-debug] connector.setup() 시작"),C||(await e.initialize(),C=!0),console.log("[CROSSx-debug] connector.setup() SDK initialized, isAuthenticated:",e.isAuthenticated());const n=d();n.on("accountsChanged",this.onAccountsChanged.bind(this)),n.on("chainChanged",this.onChainChanged.bind(this)),n.on("disconnect",this.onDisconnect.bind(this)),console.log("[CROSSx-debug] connector.setup() 완료, 이벤트 리스너 등록됨")},async connect({chainId:n,isReconnecting:g}={}){console.log("[CROSSx-debug] connector.connect() 호출",{isReconnecting:g,targetChainId:n});const o=d(),f=n??t;if(g||e.isAuthenticated()){const l=a();console.log("[CROSSx-debug] connector.connect() 재연결 경로",{storedIndex:l,isAuth:e.isAuthenticated()});const h=await e.getAddress(l||void 0);if(console.log("[CROSSx-debug] connector.connect() sdk.getAddress 결과",{address:h==null?void 0:h.address,index:h==null?void 0:h.index,requestedIndex:l||void 0}),h)return o.setWalletIndex(l),o.notifyAccountsChanged([h.address]),console.log("[CROSSx-debug] connector.connect() 재연결 완료 → 반환 address:",h.address),{accounts:[h.address],chainId:f};console.log("[CROSSx-debug] connector.connect() 재연결 경로 — info null, 신규 로그인으로 진행")}const x=await e.signInWithCreate();if(!x.success)throw new Error(x.error??"CROSSx sign-in failed");const I=x.address,y=x.addresses.map(l=>l.address).filter(l=>!I||l.toLowerCase()!==I.toLowerCase()),w=I?[I,...y]:y;if(w.length===0)throw new Error("No address found after sign-in");const m=x.addresses.find(l=>l.address.toLowerCase()===(I==null?void 0:I.toLowerCase())),p=(m==null?void 0:m.index)??0;return console.log("[CROSSx-debug] connector.connect() signIn 완료, selected:",{address:I,index:p}),o.setWalletIndex(p),r(p),o.notifyAccountsChanged(w),{accounts:w,chainId:f}},async disconnect(){const n=d();await e.signOut(),n.notifyDisconnect(),D(),r(0),u.emitter.emit("disconnect")},async getAccounts(){const n=d(),g=n.getCurrentAccounts();if(console.log("[CROSSx-debug] connector.getAccounts()",{trackedLen:g.length,tracked:g[0],walletIndex:n.getWalletIndex()}),g.length>0)return g;const o=await e.getAddress();return console.log("[CROSSx-debug] connector.getAccounts() fallback sdk.getAddress():",o==null?void 0:o.address),o?[o.address]:[]},async getChainId(){return d().getCurrentChainId()},async getProvider({chainId:n}={}){return d()},async isAuthorized(){const n=e.isAuthenticated();return console.log("[CROSSx-debug] connector.isAuthorized():",n),n},async switchChain({chainId:n}){d().setChainId(n),u.emitter.emit("change",{chainId:n});const o=u.chains.find(f=>f.id===n);if(!o)throw new Error(`Chain ${n} is not configured`);return o},onAccountsChanged(n){console.log("[CROSSx-debug] connector.onAccountsChanged:",n),n.length===0?u.emitter.emit("disconnect"):u.emitter.emit("change",{accounts:n})},onChainChanged(n){u.emitter.emit("change",{chainId:Number(n)})},onDisconnect(){u.emitter.emit("disconnect")}}))}exports.CROSSxEIP1193Provider=R;exports.createCROSSxConnector=k;exports.crossxConnector=E;
package/dist/index.js CHANGED
@@ -1,189 +1,253 @@
1
- import { createConnector as y } from "wagmi";
2
- import { ChainId as w, createCROSSxSDK as S } from "@nexus-cross/crossx-sdk-core";
3
- function x(r) {
4
- return parseInt(r.split(":")[1] ?? "1", 10);
1
+ import { createConnector as R } from "wagmi";
2
+ import { ChainId as y, createCROSSxSDK as k } from "@nexus-cross/crossx-sdk-core";
3
+ function _(s) {
4
+ return parseInt(s.split(":")[1] ?? "1", 10);
5
5
  }
6
- function u(r) {
7
- return `eip155:${r}`;
6
+ function S(s) {
7
+ return `eip155:${s}`;
8
8
  }
9
- function I(r) {
10
- return "0x" + r.toString(16);
9
+ function A(s) {
10
+ return "0x" + s.toString(16);
11
11
  }
12
- class _ {
13
- constructor(t, a = w.CROSS_MAINNET) {
14
- this.sdk = t, this.listeners = /* @__PURE__ */ new Map(), this.off = this.removeListener.bind(this), this.chainId = typeof a == "number" ? a : x(a);
12
+ class v {
13
+ constructor(e, i = y.CROSS_MAINNET) {
14
+ this.sdk = e, this.listeners = /* @__PURE__ */ new Map(), this.walletIndex = 0, this.currentAccounts = [], this.off = this.removeListener.bind(this), this.chainId = typeof i == "number" ? i : _(i);
15
+ }
16
+ /** connector가 내부적으로 호출. 외부에서 사용하지 않습니다. */
17
+ _setWalletIndexChangeCallback(e) {
18
+ this.walletIndexChangeCallback = e;
15
19
  }
16
20
  // ── EIP-1193 request ──────────────────────────────────────────────────────
17
- async request({ method: t, params: a }) {
18
- var o;
19
- const i = a ?? [];
20
- switch (t) {
21
+ async request({ method: e, params: i }) {
22
+ var r;
23
+ const a = i ?? [];
24
+ switch (e) {
21
25
  case "eth_requestAccounts":
22
26
  case "eth_accounts": {
23
- const e = await this.sdk.getAddress();
24
- return e ? [e.address] : [];
27
+ if (this.currentAccounts.length > 0)
28
+ return console.log("[CROSSx-debug] provider.eth_accounts → currentAccounts:", this.currentAccounts[0], "walletIndex:", this.walletIndex), [...this.currentAccounts];
29
+ const t = await this.sdk.getAddress();
30
+ return console.log("[CROSSx-debug] provider.eth_accounts → fallback sdk.getAddress():", t == null ? void 0 : t.address), t ? [t.address] : [];
25
31
  }
26
32
  case "eth_chainId":
27
- return I(this.chainId);
33
+ return A(this.chainId);
28
34
  case "net_version":
29
35
  return String(this.chainId);
30
36
  case "personal_sign": {
31
- const [e] = i;
32
- return (await this.sdk.signMessage(u(this.chainId), e)).signature;
37
+ const [t] = a;
38
+ return (await this.sdk.signMessage(
39
+ S(this.chainId),
40
+ t,
41
+ { index: this.walletIndex }
42
+ )).signature;
33
43
  }
34
44
  case "eth_sign": {
35
- const [, e] = i;
36
- return (await this.sdk.signMessage(u(this.chainId), e)).signature;
45
+ const [, t] = a;
46
+ return (await this.sdk.signMessage(
47
+ S(this.chainId),
48
+ t,
49
+ { index: this.walletIndex }
50
+ )).signature;
37
51
  }
38
52
  case "eth_signTypedData":
39
53
  case "eth_signTypedData_v3":
40
54
  case "eth_signTypedData_v4": {
41
- const [, e] = i, s = typeof e == "string" ? JSON.parse(e) : e, c = (o = s == null ? void 0 : s.domain) == null ? void 0 : o.chainId, n = c == null || c === 0, g = n ? 0 : Number(c);
42
- return (n ? await this.sdk.signTypedDataOffchain(s) : await this.sdk.signTypedData(u(g), s)).signature;
55
+ const [, t] = a, c = typeof t == "string" ? JSON.parse(t) : t, I = (r = c == null ? void 0 : c.domain) == null ? void 0 : r.chainId, d = I == null || I === 0, u = d ? 0 : Number(I), n = { index: this.walletIndex };
56
+ return (d ? await this.sdk.signTypedDataOffchain(c, n) : await this.sdk.signTypedData(S(u), c, n)).signature;
43
57
  }
44
58
  case "eth_sendTransaction": {
45
- const [e] = i, s = u(this.chainId);
46
- return (await this.sdk.sendTransaction(s, {
47
- from: e.from,
48
- to: e.to,
49
- value: e.value,
50
- data: e.data,
51
- gasLimit: e.gasLimit ?? e.gas,
52
- gasPrice: e.gasPrice,
53
- maxFeePerGas: e.maxFeePerGas,
54
- maxPriorityFeePerGas: e.maxPriorityFeePerGas,
55
- nonce: e.nonce !== void 0 ? parseInt(String(e.nonce), 16) : void 0,
59
+ const [t] = a, c = S(this.chainId);
60
+ return (await this.sdk.sendTransaction(c, {
61
+ from: t.from,
62
+ to: t.to,
63
+ value: t.value,
64
+ data: t.data,
65
+ gasLimit: t.gasLimit ?? t.gas,
66
+ gasPrice: t.gasPrice,
67
+ maxFeePerGas: t.maxFeePerGas,
68
+ maxPriorityFeePerGas: t.maxPriorityFeePerGas,
69
+ nonce: t.nonce !== void 0 ? parseInt(String(t.nonce), 16) : void 0,
56
70
  chainId: this.chainId
57
- })).txHash;
71
+ }, { index: this.walletIndex })).txHash;
58
72
  }
59
73
  case "wallet_switchEthereumChain": {
60
- const [{ chainId: e }] = i, s = parseInt(e, 16);
61
- return s !== this.chainId && (this.chainId = s, this.emit("chainChanged", I(s))), null;
74
+ const [{ chainId: t }] = a, c = parseInt(t, 16);
75
+ return c !== this.chainId && (this.chainId = c, this.emit("chainChanged", A(c))), null;
62
76
  }
63
77
  case "wallet_addEthereumChain":
64
78
  return null;
65
79
  default:
66
- return this.sdk.walletRpc(t, i, u(this.chainId));
80
+ return this.sdk.walletRpc(e, a, S(this.chainId));
67
81
  }
68
82
  }
69
83
  // ── EIP-1193 이벤트 ───────────────────────────────────────────────────────
70
- on(t, a) {
71
- return this.listeners.has(t) || this.listeners.set(t, /* @__PURE__ */ new Set()), this.listeners.get(t).add(a), this;
84
+ on(e, i) {
85
+ return this.listeners.has(e) || this.listeners.set(e, /* @__PURE__ */ new Set()), this.listeners.get(e).add(i), this;
72
86
  }
73
- removeListener(t, a) {
74
- var i;
75
- return (i = this.listeners.get(t)) == null || i.delete(a), this;
87
+ removeListener(e, i) {
88
+ var a;
89
+ return (a = this.listeners.get(e)) == null || a.delete(i), this;
76
90
  }
77
- emit(t, ...a) {
78
- var i;
79
- (i = this.listeners.get(t)) == null || i.forEach((o) => o(...a));
91
+ emit(e, ...i) {
92
+ var a;
93
+ (a = this.listeners.get(e)) == null || a.forEach((r) => r(...i));
80
94
  }
81
95
  // ── Connector 전용 헬퍼 ───────────────────────────────────────────────────
82
- notifyAccountsChanged(t) {
83
- this.emit("accountsChanged", t);
96
+ notifyAccountsChanged(e) {
97
+ console.log("[CROSSx-debug] provider.notifyAccountsChanged:", e[0], "walletIndex:", this.walletIndex), this.currentAccounts = e, this.emit("accountsChanged", e);
84
98
  }
85
- notifyDisconnect(t) {
86
- this.emit("disconnect", t);
99
+ notifyDisconnect(e) {
100
+ this.currentAccounts = [], this.walletIndex = 0, this.emit("disconnect", e);
87
101
  }
88
102
  getCurrentChainId() {
89
103
  return this.chainId;
90
104
  }
91
- setChainId(t) {
92
- t !== this.chainId && (this.chainId = t, this.emit("chainChanged", I(t)));
105
+ setChainId(e) {
106
+ e !== this.chainId && (this.chainId = e, this.emit("chainChanged", A(e)));
107
+ }
108
+ /**
109
+ * 활성 지갑 인덱스 설정.
110
+ * Provider가 SDK 메서드를 호출할 때 이 인덱스를 전달합니다.
111
+ */
112
+ setWalletIndex(e) {
113
+ var i;
114
+ console.log("[CROSSx-debug] provider.setWalletIndex:", e), this.walletIndex = e, (i = this.walletIndexChangeCallback) == null || i.call(this, e);
115
+ }
116
+ getWalletIndex() {
117
+ return this.walletIndex;
118
+ }
119
+ getCurrentAccounts() {
120
+ return [...this.currentAccounts];
93
121
  }
94
122
  }
95
- function A(r) {
96
- return typeof r == "number" ? r : parseInt(r.split(":")[1] ?? "1", 10);
123
+ function W(s) {
124
+ return typeof s == "number" ? s : parseInt(s.split(":")[1] ?? "1", 10);
125
+ }
126
+ const b = "crossx-wallet-index";
127
+ function P() {
128
+ try {
129
+ const s = typeof window < "u" ? localStorage.getItem(b) : null;
130
+ return s && Number(s) || 0;
131
+ } catch {
132
+ return 0;
133
+ }
134
+ }
135
+ function D(s) {
136
+ try {
137
+ typeof window < "u" && localStorage.setItem(b, String(s));
138
+ } catch {
139
+ }
140
+ }
141
+ function T() {
142
+ try {
143
+ typeof window < "u" && localStorage.removeItem(b);
144
+ } catch {
145
+ }
97
146
  }
98
- function O(r) {
99
- const { defaultChainId: t, ...a } = r, i = S(a);
100
- return v({ sdk: i, defaultChainId: t });
147
+ function G(s) {
148
+ const { defaultChainId: e, getStoredWalletIndex: i, onWalletIndexChanged: a, ...r } = s, t = k(r);
149
+ return N({ sdk: t, defaultChainId: e, getStoredWalletIndex: i, onWalletIndexChanged: a });
101
150
  }
102
- function v(r) {
103
- const { sdk: t, defaultChainId: a = w.CROSS_MAINNET } = r, i = A(a);
104
- let o = null, e = !1;
105
- function s() {
106
- return o || (o = new _(t, i)), o;
151
+ function N(s) {
152
+ const {
153
+ sdk: e,
154
+ defaultChainId: i = y.CROSS_MAINNET,
155
+ getStoredWalletIndex: a = P,
156
+ onWalletIndexChanged: r = D
157
+ } = s, t = W(i);
158
+ let c = null, I = !1;
159
+ function d() {
160
+ return c || (c = new v(e, t), c._setWalletIndexChangeCallback(r)), c;
107
161
  }
108
- return y((c) => ({
162
+ return R((u) => ({
109
163
  id: "crossx",
110
164
  name: "CROSSx Wallet",
111
165
  type: "crossx",
112
166
  async setup() {
113
- e || (await t.initialize(), e = !0);
114
- const n = s();
115
- n.on("accountsChanged", this.onAccountsChanged.bind(this)), n.on("chainChanged", this.onChainChanged.bind(this)), n.on("disconnect", this.onDisconnect.bind(this));
167
+ console.log("[CROSSx-debug] connector.setup() 시작"), I || (await e.initialize(), I = !0), console.log("[CROSSx-debug] connector.setup() SDK initialized, isAuthenticated:", e.isAuthenticated());
168
+ const n = d();
169
+ n.on("accountsChanged", this.onAccountsChanged.bind(this)), n.on("chainChanged", this.onChainChanged.bind(this)), n.on("disconnect", this.onDisconnect.bind(this)), console.log("[CROSSx-debug] connector.setup() 완료, 이벤트 리스너 등록됨");
116
170
  },
117
171
  // ── connect ─────────────────────────────────────────────────────────────
118
172
  async connect({ chainId: n, isReconnecting: g } = {}) {
119
- const d = s(), l = n ?? i;
120
- if (g || t.isAuthenticated()) {
121
- const h = await t.getAddress();
122
- if (h)
123
- return {
173
+ console.log("[CROSSx-debug] connector.connect() 호출", { isReconnecting: g, targetChainId: n });
174
+ const o = d(), f = n ?? t;
175
+ if (g || e.isAuthenticated()) {
176
+ const l = a();
177
+ console.log("[CROSSx-debug] connector.connect() 재연결 경로", { storedIndex: l, isAuth: e.isAuthenticated() });
178
+ const h = await e.getAddress(l || void 0);
179
+ if (console.log("[CROSSx-debug] connector.connect() sdk.getAddress 결과", { address: h == null ? void 0 : h.address, index: h == null ? void 0 : h.index, requestedIndex: l || void 0 }), h)
180
+ return o.setWalletIndex(l), o.notifyAccountsChanged([h.address]), console.log("[CROSSx-debug] connector.connect() 재연결 완료 → 반환 address:", h.address), {
124
181
  accounts: [h.address],
125
- chainId: l
182
+ chainId: f
126
183
  };
184
+ console.log("[CROSSx-debug] connector.connect() 재연결 경로 — info null, 신규 로그인으로 진행");
127
185
  }
128
- const m = await t.signInWithCreate();
129
- if (!m.success)
130
- throw new Error(m.error ?? "CROSSx sign-in failed");
131
- const f = m.address, p = m.addresses.map((h) => h.address).filter((h) => !f || h.toLowerCase() !== f.toLowerCase()), C = f ? [f, ...p] : p;
132
- if (C.length === 0)
186
+ const x = await e.signInWithCreate();
187
+ if (!x.success)
188
+ throw new Error(x.error ?? "CROSSx sign-in failed");
189
+ const C = x.address, O = x.addresses.map((l) => l.address).filter((l) => !C || l.toLowerCase() !== C.toLowerCase()), w = C ? [C, ...O] : O;
190
+ if (w.length === 0)
133
191
  throw new Error("No address found after sign-in");
134
- return d.notifyAccountsChanged(C), {
135
- accounts: C,
136
- chainId: l
192
+ const m = x.addresses.find(
193
+ (l) => l.address.toLowerCase() === (C == null ? void 0 : C.toLowerCase())
194
+ ), p = (m == null ? void 0 : m.index) ?? 0;
195
+ return console.log("[CROSSx-debug] connector.connect() signIn 완료, selected:", { address: C, index: p }), o.setWalletIndex(p), r(p), o.notifyAccountsChanged(w), {
196
+ accounts: w,
197
+ chainId: f
137
198
  };
138
199
  },
139
200
  // ── disconnect ──────────────────────────────────────────────────────────
140
201
  async disconnect() {
141
- const n = s();
142
- await t.signOut(), n.notifyDisconnect(), c.emitter.emit("disconnect");
202
+ const n = d();
203
+ await e.signOut(), n.notifyDisconnect(), T(), r(0), u.emitter.emit("disconnect");
143
204
  },
144
205
  // ── getAccounts ─────────────────────────────────────────────────────────
145
206
  async getAccounts() {
146
- const n = await t.getAddress();
147
- return n ? [n.address] : [];
207
+ const n = d(), g = n.getCurrentAccounts();
208
+ if (console.log("[CROSSx-debug] connector.getAccounts()", { trackedLen: g.length, tracked: g[0], walletIndex: n.getWalletIndex() }), g.length > 0) return g;
209
+ const o = await e.getAddress();
210
+ return console.log("[CROSSx-debug] connector.getAccounts() fallback sdk.getAddress():", o == null ? void 0 : o.address), o ? [o.address] : [];
148
211
  },
149
212
  // ── getChainId ──────────────────────────────────────────────────────────
150
213
  async getChainId() {
151
- return s().getCurrentChainId();
214
+ return d().getCurrentChainId();
152
215
  },
153
216
  // ── getProvider ─────────────────────────────────────────────────────────
154
217
  async getProvider({ chainId: n } = {}) {
155
- return s();
218
+ return d();
156
219
  },
157
220
  // ── isAuthorized ────────────────────────────────────────────────────────
158
221
  async isAuthorized() {
159
- return t.isAuthenticated();
222
+ const n = e.isAuthenticated();
223
+ return console.log("[CROSSx-debug] connector.isAuthorized():", n), n;
160
224
  },
161
225
  // ── switchChain ─────────────────────────────────────────────────────────
162
226
  async switchChain({ chainId: n }) {
163
- s().setChainId(n), c.emitter.emit("change", { chainId: n });
164
- const d = c.chains.find((l) => l.id === n);
165
- if (!d)
227
+ d().setChainId(n), u.emitter.emit("change", { chainId: n });
228
+ const o = u.chains.find((f) => f.id === n);
229
+ if (!o)
166
230
  throw new Error(`Chain ${n} is not configured`);
167
- return d;
231
+ return o;
168
232
  },
169
233
  // ── 이벤트 핸들러 ───────────────────────────────────────────────────────
170
234
  onAccountsChanged(n) {
171
- n.length === 0 ? c.emitter.emit("disconnect") : c.emitter.emit("change", {
235
+ console.log("[CROSSx-debug] connector.onAccountsChanged:", n), n.length === 0 ? u.emitter.emit("disconnect") : u.emitter.emit("change", {
172
236
  accounts: n
173
237
  });
174
238
  },
175
239
  onChainChanged(n) {
176
- c.emitter.emit("change", {
240
+ u.emitter.emit("change", {
177
241
  chainId: Number(n)
178
242
  });
179
243
  },
180
244
  onDisconnect() {
181
- c.emitter.emit("disconnect");
245
+ u.emitter.emit("disconnect");
182
246
  }
183
247
  }));
184
248
  }
185
249
  export {
186
- _ as CROSSxEIP1193Provider,
187
- v as createCROSSxConnector,
188
- O as crossxConnector
250
+ v as CROSSxEIP1193Provider,
251
+ N as createCROSSxConnector,
252
+ G as crossxConnector
189
253
  };
@@ -6,10 +6,15 @@ export interface EIP1193RequestArguments {
6
6
  params?: readonly unknown[] | object;
7
7
  }
8
8
  export declare class CROSSxEIP1193Provider {
9
- private readonly sdk;
9
+ readonly sdk: CROSSxSDK;
10
10
  private listeners;
11
11
  private chainId;
12
+ private walletIndex;
13
+ private currentAccounts;
14
+ private walletIndexChangeCallback?;
12
15
  constructor(sdk: CROSSxSDK, defaultChainId?: string | number);
16
+ /** connector가 내부적으로 호출. 외부에서 사용하지 않습니다. */
17
+ _setWalletIndexChangeCallback(cb: (index: number) => void): void;
13
18
  request({ method, params }: EIP1193RequestArguments): Promise<unknown>;
14
19
  on(event: string, listener: EventListener): this;
15
20
  removeListener(event: string, listener: EventListener): this;
@@ -19,6 +24,13 @@ export declare class CROSSxEIP1193Provider {
19
24
  notifyDisconnect(error?: Error): void;
20
25
  getCurrentChainId(): number;
21
26
  setChainId(id: number): void;
27
+ /**
28
+ * 활성 지갑 인덱스 설정.
29
+ * Provider가 SDK 메서드를 호출할 때 이 인덱스를 전달합니다.
30
+ */
31
+ setWalletIndex(index: number): void;
32
+ getWalletIndex(): number;
33
+ getCurrentAccounts(): string[];
22
34
  }
23
35
  export {};
24
36
  //# sourceMappingURL=provider.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAG9D,KAAK,aAAa,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC;AAE9C,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,SAAS,OAAO,EAAE,GAAG,MAAM,CAAC;CACtC;AAcD,qBAAa,qBAAqB;IAK9B,OAAO,CAAC,QAAQ,CAAC,GAAG;IAJtB,OAAO,CAAC,SAAS,CAA8C;IAC/D,OAAO,CAAC,OAAO,CAAS;gBAGL,GAAG,EAAE,SAAS,EAC/B,cAAc,GAAE,MAAM,GAAG,MAA8B;IAUnD,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,uBAAuB,GAAG,OAAO,CAAC,OAAO,CAAC;IA2F5E,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,GAAG,IAAI;IAQhD,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,GAAG,IAAI;IAK5D,GAAG,UALmB,MAAM,YAAY,aAAa,KAAG,IAAI,CAKvB;IAErC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI;IAM7C,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI;IAI/C,gBAAgB,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI;IAIrC,iBAAiB,IAAI,MAAM;IAI3B,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;CAM7B"}
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAG9D,KAAK,aAAa,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC;AAE9C,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,SAAS,OAAO,EAAE,GAAG,MAAM,CAAC;CACtC;AAcD,qBAAa,qBAAqB;IAQ9B,QAAQ,CAAC,GAAG,EAAE,SAAS;IAPzB,OAAO,CAAC,SAAS,CAA8C;IAC/D,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,eAAe,CAAgB;IACvC,OAAO,CAAC,yBAAyB,CAAC,CAA0B;gBAGjD,GAAG,EAAE,SAAS,EACvB,cAAc,GAAE,MAAM,GAAG,MAA8B;IAQzD,2CAA2C;IAC3C,6BAA6B,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI;IAM1D,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,uBAAuB,GAAG,OAAO,CAAC,OAAO,CAAC;IAqG5E,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,GAAG,IAAI;IAQhD,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,GAAG,IAAI;IAK5D,GAAG,UALmB,MAAM,YAAY,aAAa,KAAG,IAAI,CAKvB;IAErC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI;IAM7C,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI;IAM/C,gBAAgB,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI;IAMrC,iBAAiB,IAAI,MAAM;IAI3B,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAO5B;;;OAGG;IACH,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAMnC,cAAc,IAAI,MAAM;IAIxB,kBAAkB,IAAI,MAAM,EAAE;CAG/B"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nexus-cross/crossx-sdk-wagmi",
3
- "version": "1.0.4",
3
+ "version": "1.0.5",
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.0.4"
20
+ "@nexus-cross/crossx-sdk-core": "1.0.5"
21
21
  },
22
22
  "peerDependencies": {
23
23
  "viem": ">=2.0.0",