@nexus-cross/crossx-sdk-wagmi 0.0.0-beta.2 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=connector.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connector.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/connector.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=provider.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/provider.test.ts"],"names":[],"mappings":""}
@@ -1,13 +1,15 @@
1
- import { CROSSxSDK } from '@nexus-cross/crossx-sdk-core';
1
+ import { CROSSxSDK, SDKConfig } from '@nexus-cross/crossx-sdk-core';
2
2
  import { CROSSxEIP1193Provider } from './provider';
3
3
 
4
+ /** 고급 모드: 이미 생성한 SDK 인스턴스를 직접 주입 */
4
5
  export interface CROSSxConnectorOptions {
5
6
  sdk: CROSSxSDK;
6
- /**
7
- * 기본 체인 ID (숫자 또는 ChainId 상수의 CAIP-2 값)
8
- * 기본값: ChainId.CROSS_MAINNET ('eip155:612055' → 612055)
9
- */
10
7
  defaultChainId?: string | number;
11
8
  }
9
+ /** 간편 모드: SDK 설정만 전달하면 내부에서 SDK를 생성 */
10
+ export type CrossxConnectorOptions = Omit<SDKConfig, 'useMockWallet'> & {
11
+ defaultChainId?: string | number;
12
+ };
13
+ export declare function crossxConnector(options: CrossxConnectorOptions): import('wagmi').CreateConnectorFn<CROSSxEIP1193Provider, Record<string, unknown>, Record<string, unknown>>;
12
14
  export declare function createCROSSxConnector(options: CROSSxConnectorOptions): import('wagmi').CreateConnectorFn<CROSSxEIP1193Provider, Record<string, unknown>, Record<string, unknown>>;
13
15
  //# sourceMappingURL=connector.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"connector.d.ts","sourceRoot":"","sources":["../src/connector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAE9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAEnD,MAAM,WAAW,sBAAsB;IACrC,GAAG,EAAE,SAAS,CAAC;IACf;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAClC;AASD,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,sBAAsB,8GAqIpE"}
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,8GAwIpE"}
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const f=require("wagmi"),C=require("@nexus-cross/crossx-sdk-core");function w(a){const t=a.split(":");return parseInt(t[1]??"1",10)}function d(a){return`eip155:${a}`}function I(a){return"0x"+a.toString(16)}class l{constructor(t,r=C.ChainId.CROSS_MAINNET){this.sdk=t,this.listeners=new Map,this.off=this.removeListener.bind(this),this.chainId=typeof r=="number"?r:w(r)}async request({method:t,params:r}){const i=r??[];switch(t){case"eth_requestAccounts":case"eth_accounts":{const e=this.sdk.getAddress();return e?[e]:[]}case"eth_chainId":return I(this.chainId);case"net_version":return String(this.chainId);case"personal_sign":{const[e]=i,s=d(this.chainId);return(await this.sdk.signMessage(s,e)).signature}case"eth_sign":{const[,e]=i,s=d(this.chainId);return(await this.sdk.signMessage(s,e)).signature}case"eth_signTypedData":case"eth_signTypedData_v4":{const[,e]=i,s=typeof e=="string"?e:JSON.stringify(e),c=d(this.chainId);return(await this.sdk.signMessage(c,s)).signature}case"eth_sendTransaction":{const[e]=i,s=d(this.chainId);return(await this.sdk.sendTransaction(s,{from:e.from,to:e.to,value:e.value,data:e.data,gasLimit:e.gas,gasPrice:e.gasPrice,maxFeePerGas:e.maxFeePerGas,maxPriorityFeePerGas:e.maxPriorityFeePerGas,nonce:e.nonce!==void 0?parseInt(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",I(s))),null}case"wallet_addEthereumChain":return null;default:throw new Error(`[CROSSx] 지원하지 않는 RPC 메서드: ${t}`)}}on(t,r){return this.listeners.has(t)||this.listeners.set(t,new Set),this.listeners.get(t).add(r),this}removeListener(t,r){var i;return(i=this.listeners.get(t))==null||i.delete(r),this}emit(t,...r){var i;(i=this.listeners.get(t))==null||i.forEach(e=>e(...r))}notifyAccountsChanged(t){this.emit("accountsChanged",t)}notifyDisconnect(t){this.emit("disconnect",t)}getCurrentChainId(){return this.chainId}}function S(a){if(typeof a=="number")return a;const t=a.split(":");return parseInt(t[1]??"1",10)}function y(a){const{sdk:t,defaultChainId:r=C.ChainId.CROSS_MAINNET}=a,i=S(r);let e=null;function s(){return e||(e=new l(t,i)),e}return f.createConnector(c=>({id:"crossx",name:"CROSSx Wallet",type:"crossx",async connect({chainId:n,isReconnecting:m}={}){const p=s(),o=n??i;if(m||t.isAuthenticated()){const u=await t.getAddress();if(u)return c.emitter.emit("connect",{accounts:[u.address],chainId:o}),{accounts:[u.address],chainId:o}}const g=await t.signIn();if(!g.success)throw new Error(g.error??"CROSSx 로그인 실패");const h=await t.getAddress();if(!h)throw new Error("로그인 주소를 찾을 수 없습니다");return p.notifyAccountsChanged([h.address]),c.emitter.emit("connect",{accounts:[h.address],chainId:o}),{accounts:[h.address],chainId:o}},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()},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")},async setup(){const n=s();n.on("accountsChanged",this.onAccountsChanged.bind(this)),n.on("chainChanged",this.onChainChanged.bind(this)),n.on("disconnect",this.onDisconnect.bind(this))}}))}exports.CROSSxEIP1193Provider=l;exports.createCROSSxConnector=y;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const S=require("wagmi"),I=require("@nexus-cross/crossx-sdk-core");function w(r){return parseInt(r.split(":")[1]??"1",10)}function h(r){return`eip155:${r}`}function C(r){return"0x"+r.toString(16)}class p{constructor(t,a=I.ChainId.CROSS_MAINNET){this.sdk=t,this.listeners=new Map,this.off=this.removeListener.bind(this),this.chainId=typeof a=="number"?a:w(a)}async request({method:t,params:a}){var o;const i=a??[];switch(t){case"eth_requestAccounts":case"eth_accounts":{const n=await this.sdk.getAddress();return n?[n.address]:[]}case"eth_chainId":return C(this.chainId);case"net_version":return String(this.chainId);case"personal_sign":{const[n]=i;return(await this.sdk.signMessage(h(this.chainId),n)).signature}case"eth_sign":{const[,n]=i;return(await this.sdk.signMessage(h(this.chainId),n)).signature}case"eth_signTypedData":case"eth_signTypedData_v3":case"eth_signTypedData_v4":{const[,n]=i,s=typeof n=="string"?JSON.parse(n):n,c=(o=s==null?void 0:s.domain)==null?void 0:o.chainId;return(c==null||c===0?await this.sdk.signTypedDataOffchain(s):await this.sdk.signTypedData(h(this.chainId),s)).signature}case"eth_sendTransaction":{const[n]=i,s=h(this.chainId);return(await this.sdk.sendTransaction(s,{from:n.from,to:n.to,value:n.value,data:n.data,gasLimit:n.gasLimit??n.gas,gasPrice:n.gasPrice,maxFeePerGas:n.maxFeePerGas,maxPriorityFeePerGas:n.maxPriorityFeePerGas,nonce:n.nonce!==void 0?parseInt(String(n.nonce),16):void 0,chainId:this.chainId})).txHash}case"wallet_switchEthereumChain":{const[{chainId:n}]=i,s=parseInt(n,16);return s!==this.chainId&&(this.chainId=s,this.emit("chainChanged",C(s))),null}case"wallet_addEthereumChain":return null;default:return this.sdk.walletRpc(t,i,h(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",C(t)))}}function x(r){return typeof r=="number"?r:parseInt(r.split(":")[1]??"1",10)}function _(r){const{defaultChainId:t,...a}=r,i=I.createCROSSxSDK(a);return y({sdk:i,defaultChainId:t})}function y(r){const{sdk:t,defaultChainId:a=I.ChainId.CROSS_MAINNET}=r,i=x(a);let o=null,n=!1;function s(){return o||(o=new p(t,i)),o}return S.createConnector(c=>({id:"crossx",name:"CROSSx Wallet",type:"crossx",async setup(){n||(await t.initialize(),n=!0);const e=s();e.on("accountsChanged",this.onAccountsChanged.bind(this)),e.on("chainChanged",this.onChainChanged.bind(this)),e.on("disconnect",this.onDisconnect.bind(this))},async connect({chainId:e,isReconnecting:g}={}){const d=s(),u=e??i;if(g||t.isAuthenticated()){const m=await t.getAddress();if(m)return{accounts:[m.address],chainId:u}}const f=await t.signIn();if(!f.success)throw new Error(f.error??"CROSSx sign-in failed");const l=await t.getAddress();if(!l)throw new Error("No address found after sign-in");return d.notifyAccountsChanged([l.address]),{accounts:[l.address],chainId:u}},async disconnect(){const e=s();await t.signOut(),e.notifyDisconnect(),c.emitter.emit("disconnect")},async getAccounts(){const e=await t.getAddress();return e?[e.address]:[]},async getChainId(){return s().getCurrentChainId()},async getProvider({chainId:e}={}){return s()},async isAuthorized(){return t.isAuthenticated()},async switchChain({chainId:e}){s().setChainId(e),c.emitter.emit("change",{chainId:e});const d=c.chains.find(u=>u.id===e);if(!d)throw new Error(`Chain ${e} is not configured`);return d},onAccountsChanged(e){e.length===0?c.emitter.emit("disconnect"):c.emitter.emit("change",{accounts:e})},onChainChanged(e){c.emitter.emit("change",{chainId:Number(e)})},onDisconnect(){c.emitter.emit("disconnect")}}))}exports.CROSSxEIP1193Provider=p;exports.createCROSSxConnector=y;exports.crossxConnector=_;
package/dist/index.d.ts CHANGED
@@ -3,22 +3,26 @@
3
3
  *
4
4
  * CROSSx 임베디드 지갑을 wagmi에 통합하는 Connector 패키지.
5
5
  *
6
- * 빠른 시작:
7
- * import { createCROSSxConnector } from '@nexus-cross/crossx-sdk-wagmi';
8
- * import { createCROSSxSDK, ChainId } from '@nexus-cross/crossx-sdk-core';
9
- * import { createConfig, http } from 'wagmi';
10
- *
11
- * const sdk = createCROSSxSDK({});
12
- * await sdk.init();
6
+ * 간편 모드:
7
+ * import { crossxConnector } from '@nexus-cross/crossx-sdk-wagmi';
8
+ * const config = createConfig({
9
+ * chains: [crossMainnet],
10
+ * connectors: [crossxConnector({ projectId: 'YOUR_ID' })],
11
+ * transports: { [crossMainnet.id]: http() },
12
+ * });
13
13
  *
14
+ * 고급 모드 (SDK 직접 주입):
15
+ * import { createCROSSxConnector } from '@nexus-cross/crossx-sdk-wagmi';
16
+ * import { createCROSSxSDK } from '@nexus-cross/crossx-sdk-core';
17
+ * const sdk = createCROSSxSDK({ projectId: 'YOUR_ID' });
14
18
  * const config = createConfig({
15
19
  * chains: [crossMainnet],
16
20
  * connectors: [createCROSSxConnector({ sdk })],
17
21
  * transports: { [crossMainnet.id]: http() },
18
22
  * });
19
23
  */
20
- export { createCROSSxConnector } from './connector';
21
- export type { CROSSxConnectorOptions } from './connector';
24
+ export { crossxConnector, createCROSSxConnector } from './connector';
25
+ export type { CrossxConnectorOptions, CROSSxConnectorOptions, } from './connector';
22
26
  export { CROSSxEIP1193Provider } from './provider';
23
27
  export type { EIP1193RequestArguments } from './provider';
24
28
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,YAAY,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAE1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACnD,YAAY,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACrE,YAAY,EACV,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACnD,YAAY,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC"}
package/dist/index.js CHANGED
@@ -1,75 +1,72 @@
1
1
  import { createConnector as p } from "wagmi";
2
- import { ChainId as I } from "@nexus-cross/crossx-sdk-core";
3
- function f(r) {
4
- const t = r.split(":");
5
- return parseInt(t[1] ?? "1", 10);
2
+ import { ChainId as C, createCROSSxSDK as w } from "@nexus-cross/crossx-sdk-core";
3
+ function y(r) {
4
+ return parseInt(r.split(":")[1] ?? "1", 10);
6
5
  }
7
- function d(r) {
6
+ function h(r) {
8
7
  return `eip155:${r}`;
9
8
  }
10
- function m(r) {
9
+ function f(r) {
11
10
  return "0x" + r.toString(16);
12
11
  }
13
- class w {
14
- constructor(t, a = I.CROSS_MAINNET) {
15
- this.sdk = t, this.listeners = /* @__PURE__ */ new Map(), this.off = this.removeListener.bind(this), this.chainId = typeof a == "number" ? a : f(a);
12
+ class S {
13
+ constructor(t, a = C.CROSS_MAINNET) {
14
+ this.sdk = t, this.listeners = /* @__PURE__ */ new Map(), this.off = this.removeListener.bind(this), this.chainId = typeof a == "number" ? a : y(a);
16
15
  }
17
- // ============================================================================
18
- // EIP-1193 request
19
- // ============================================================================
16
+ // ── EIP-1193 request ──────────────────────────────────────────────────────
20
17
  async request({ method: t, params: a }) {
18
+ var o;
21
19
  const i = a ?? [];
22
20
  switch (t) {
23
21
  case "eth_requestAccounts":
24
22
  case "eth_accounts": {
25
- const e = this.sdk.getAddress();
26
- return e ? [e] : [];
23
+ const n = await this.sdk.getAddress();
24
+ return n ? [n.address] : [];
27
25
  }
28
26
  case "eth_chainId":
29
- return m(this.chainId);
27
+ return f(this.chainId);
30
28
  case "net_version":
31
29
  return String(this.chainId);
32
30
  case "personal_sign": {
33
- const [e] = i, s = d(this.chainId);
34
- return (await this.sdk.signMessage(s, e)).signature;
31
+ const [n] = i;
32
+ return (await this.sdk.signMessage(h(this.chainId), n)).signature;
35
33
  }
36
34
  case "eth_sign": {
37
- const [, e] = i, s = d(this.chainId);
38
- return (await this.sdk.signMessage(s, e)).signature;
35
+ const [, n] = i;
36
+ return (await this.sdk.signMessage(h(this.chainId), n)).signature;
39
37
  }
40
38
  case "eth_signTypedData":
39
+ case "eth_signTypedData_v3":
41
40
  case "eth_signTypedData_v4": {
42
- const [, e] = i, s = typeof e == "string" ? e : JSON.stringify(e), c = d(this.chainId);
43
- return (await this.sdk.signMessage(c, s)).signature;
41
+ const [, n] = i, s = typeof n == "string" ? JSON.parse(n) : n, c = (o = s == null ? void 0 : s.domain) == null ? void 0 : o.chainId;
42
+ return (c == null || c === 0 ? await this.sdk.signTypedDataOffchain(s) : await this.sdk.signTypedData(h(this.chainId), s)).signature;
44
43
  }
45
44
  case "eth_sendTransaction": {
46
- const [e] = i, s = d(this.chainId);
45
+ const [n] = i, s = h(this.chainId);
47
46
  return (await this.sdk.sendTransaction(s, {
48
- from: e.from,
49
- to: e.to,
50
- value: e.value,
51
- data: e.data,
52
- gasLimit: e.gas,
53
- gasPrice: e.gasPrice,
54
- maxFeePerGas: e.maxFeePerGas,
55
- maxPriorityFeePerGas: e.maxPriorityFeePerGas,
56
- nonce: e.nonce !== void 0 ? parseInt(e.nonce, 16) : void 0,
47
+ from: n.from,
48
+ to: n.to,
49
+ value: n.value,
50
+ data: n.data,
51
+ gasLimit: n.gasLimit ?? n.gas,
52
+ gasPrice: n.gasPrice,
53
+ maxFeePerGas: n.maxFeePerGas,
54
+ maxPriorityFeePerGas: n.maxPriorityFeePerGas,
55
+ nonce: n.nonce !== void 0 ? parseInt(String(n.nonce), 16) : void 0,
57
56
  chainId: this.chainId
58
57
  })).txHash;
59
58
  }
60
59
  case "wallet_switchEthereumChain": {
61
- const [{ chainId: e }] = i, s = parseInt(e, 16);
62
- return s !== this.chainId && (this.chainId = s, this.emit("chainChanged", m(s))), null;
60
+ const [{ chainId: n }] = i, s = parseInt(n, 16);
61
+ return s !== this.chainId && (this.chainId = s, this.emit("chainChanged", f(s))), null;
63
62
  }
64
63
  case "wallet_addEthereumChain":
65
64
  return null;
66
65
  default:
67
- throw new Error(`[CROSSx] 지원하지 않는 RPC 메서드: ${t}`);
66
+ return this.sdk.walletRpc(t, i, h(this.chainId));
68
67
  }
69
68
  }
70
- // ============================================================================
71
- // EIP-1193 이벤트 (EventEmitter 호환)
72
- // ============================================================================
69
+ // ── EIP-1193 이벤트 ───────────────────────────────────────────────────────
73
70
  on(t, a) {
74
71
  return this.listeners.has(t) || this.listeners.set(t, /* @__PURE__ */ new Set()), this.listeners.get(t).add(a), this;
75
72
  }
@@ -79,110 +76,114 @@ class w {
79
76
  }
80
77
  emit(t, ...a) {
81
78
  var i;
82
- (i = this.listeners.get(t)) == null || i.forEach((e) => e(...a));
79
+ (i = this.listeners.get(t)) == null || i.forEach((o) => o(...a));
83
80
  }
84
- // ============================================================================
85
- // 내부 헬퍼 (Connector에서 호출)
86
- // ============================================================================
87
- /** 계정 변경 이벤트 발생 (connect/disconnect 시 Connector가 호출) */
81
+ // ── Connector 전용 헬퍼 ───────────────────────────────────────────────────
88
82
  notifyAccountsChanged(t) {
89
83
  this.emit("accountsChanged", t);
90
84
  }
91
- /** 연결 해제 이벤트 발생 */
92
85
  notifyDisconnect(t) {
93
86
  this.emit("disconnect", t);
94
87
  }
95
88
  getCurrentChainId() {
96
89
  return this.chainId;
97
90
  }
91
+ setChainId(t) {
92
+ t !== this.chainId && (this.chainId = t, this.emit("chainChanged", f(t)));
93
+ }
98
94
  }
99
- function y(r) {
100
- if (typeof r == "number") return r;
101
- const t = r.split(":");
102
- return parseInt(t[1] ?? "1", 10);
95
+ function x(r) {
96
+ return typeof r == "number" ? r : parseInt(r.split(":")[1] ?? "1", 10);
97
+ }
98
+ function O(r) {
99
+ const { defaultChainId: t, ...a } = r, i = w(a);
100
+ return _({ sdk: i, defaultChainId: t });
103
101
  }
104
- function A(r) {
105
- const { sdk: t, defaultChainId: a = I.CROSS_MAINNET } = r, i = y(a);
106
- let e = null;
102
+ function _(r) {
103
+ const { sdk: t, defaultChainId: a = C.CROSS_MAINNET } = r, i = x(a);
104
+ let o = null, n = !1;
107
105
  function s() {
108
- return e || (e = new w(t, i)), e;
106
+ return o || (o = new S(t, i)), o;
109
107
  }
110
108
  return p((c) => ({
111
109
  id: "crossx",
112
110
  name: "CROSSx Wallet",
113
111
  type: "crossx",
114
- // ── 연결 ─────────────────────────────────────────────────────────────────
115
- async connect({ chainId: n, isReconnecting: l } = {}) {
116
- const C = s(), o = n ?? i;
117
- if (l || t.isAuthenticated()) {
118
- const u = await t.getAddress();
119
- if (u)
120
- return c.emitter.emit("connect", {
121
- accounts: [u.address],
122
- chainId: o
123
- }), {
124
- accounts: [u.address],
125
- chainId: o
112
+ async setup() {
113
+ n || (await t.initialize(), n = !0);
114
+ const e = s();
115
+ e.on("accountsChanged", this.onAccountsChanged.bind(this)), e.on("chainChanged", this.onChainChanged.bind(this)), e.on("disconnect", this.onDisconnect.bind(this));
116
+ },
117
+ // ── connect ─────────────────────────────────────────────────────────────
118
+ async connect({ chainId: e, isReconnecting: g } = {}) {
119
+ const d = s(), u = e ?? i;
120
+ if (g || t.isAuthenticated()) {
121
+ const m = await t.getAddress();
122
+ if (m)
123
+ return {
124
+ accounts: [m.address],
125
+ chainId: u
126
126
  };
127
127
  }
128
- const g = await t.signIn();
129
- if (!g.success)
130
- throw new Error(g.error ?? "CROSSx 로그인 실패");
131
- const h = await t.getAddress();
132
- if (!h)
133
- throw new Error("로그인 주소를 찾을 수 없습니다");
134
- return C.notifyAccountsChanged([h.address]), c.emitter.emit("connect", {
135
- accounts: [h.address],
136
- chainId: o
137
- }), {
138
- accounts: [h.address],
139
- chainId: o
128
+ const I = await t.signIn();
129
+ if (!I.success)
130
+ throw new Error(I.error ?? "CROSSx sign-in failed");
131
+ const l = await t.getAddress();
132
+ if (!l)
133
+ throw new Error("No address found after sign-in");
134
+ return d.notifyAccountsChanged([l.address]), {
135
+ accounts: [l.address],
136
+ chainId: u
140
137
  };
141
138
  },
142
- // ── 연결 해제 ─────────────────────────────────────────────────────────────
139
+ // ── disconnect ──────────────────────────────────────────────────────────
143
140
  async disconnect() {
144
- const n = s();
145
- await t.signOut(), n.notifyDisconnect(), c.emitter.emit("disconnect");
141
+ const e = s();
142
+ await t.signOut(), e.notifyDisconnect(), c.emitter.emit("disconnect");
146
143
  },
147
- // ── 계정 ─────────────────────────────────────────────────────────────────
144
+ // ── getAccounts ─────────────────────────────────────────────────────────
148
145
  async getAccounts() {
149
- const n = await t.getAddress();
150
- return n ? [n.address] : [];
146
+ const e = await t.getAddress();
147
+ return e ? [e.address] : [];
151
148
  },
152
- // ── 체인 ─────────────────────────────────────────────────────────────────
149
+ // ── getChainId ──────────────────────────────────────────────────────────
153
150
  async getChainId() {
154
151
  return s().getCurrentChainId();
155
152
  },
156
- // ── Provider ─────────────────────────────────────────────────────────────
157
- async getProvider({ chainId: n } = {}) {
153
+ // ── getProvider ─────────────────────────────────────────────────────────
154
+ async getProvider({ chainId: e } = {}) {
158
155
  return s();
159
156
  },
160
- // ── 인증 상태 ─────────────────────────────────────────────────────────────
157
+ // ── isAuthorized ────────────────────────────────────────────────────────
161
158
  async isAuthorized() {
162
159
  return t.isAuthenticated();
163
160
  },
164
- // ── 이벤트 핸들러 (wagmi 내부 이벤트 연결) ────────────────────────────────
165
- onAccountsChanged(n) {
166
- n.length === 0 ? c.emitter.emit("disconnect") : c.emitter.emit("change", {
167
- accounts: n
161
+ // ── switchChain ─────────────────────────────────────────────────────────
162
+ async switchChain({ chainId: e }) {
163
+ s().setChainId(e), c.emitter.emit("change", { chainId: e });
164
+ const d = c.chains.find((u) => u.id === e);
165
+ if (!d)
166
+ throw new Error(`Chain ${e} is not configured`);
167
+ return d;
168
+ },
169
+ // ── 이벤트 핸들러 ───────────────────────────────────────────────────────
170
+ onAccountsChanged(e) {
171
+ e.length === 0 ? c.emitter.emit("disconnect") : c.emitter.emit("change", {
172
+ accounts: e
168
173
  });
169
174
  },
170
- onChainChanged(n) {
175
+ onChainChanged(e) {
171
176
  c.emitter.emit("change", {
172
- chainId: Number(n)
177
+ chainId: Number(e)
173
178
  });
174
179
  },
175
180
  onDisconnect() {
176
181
  c.emitter.emit("disconnect");
177
- },
178
- // ── 설정 ─────────────────────────────────────────────────────────────────
179
- async setup() {
180
- const n = s();
181
- n.on("accountsChanged", this.onAccountsChanged.bind(this)), n.on("chainChanged", this.onChainChanged.bind(this)), n.on("disconnect", this.onDisconnect.bind(this));
182
182
  }
183
183
  }));
184
184
  }
185
185
  export {
186
- w as CROSSxEIP1193Provider,
187
- A as createCROSSxConnector
186
+ S as CROSSxEIP1193Provider,
187
+ _ as createCROSSxConnector,
188
+ O as crossxConnector
188
189
  };
@@ -8,21 +8,17 @@ export interface EIP1193RequestArguments {
8
8
  export declare class CROSSxEIP1193Provider {
9
9
  private readonly sdk;
10
10
  private listeners;
11
- /** 현재 활성 체인 ID (숫자) */
12
11
  private chainId;
13
- constructor(sdk: CROSSxSDK,
14
- /** 기본 체인 ID. ChainId 상수의 CAIP-2 값 또는 숫자 허용 */
15
- defaultChainId?: string | number);
12
+ constructor(sdk: CROSSxSDK, defaultChainId?: string | number);
16
13
  request({ method, params }: EIP1193RequestArguments): Promise<unknown>;
17
14
  on(event: string, listener: EventListener): this;
18
15
  removeListener(event: string, listener: EventListener): this;
19
16
  off: (event: string, listener: EventListener) => this;
20
17
  emit(event: string, ...args: unknown[]): void;
21
- /** 계정 변경 이벤트 발생 (connect/disconnect 시 Connector가 호출) */
22
18
  notifyAccountsChanged(accounts: string[]): void;
23
- /** 연결 해제 이벤트 발생 */
24
19
  notifyDisconnect(error?: Error): void;
25
20
  getCurrentChainId(): number;
21
+ setChainId(id: number): void;
26
22
  }
27
23
  export {};
28
24
  //# sourceMappingURL=provider.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;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;AAkBD,qBAAa,qBAAqB;IAO9B,OAAO,CAAC,QAAQ,CAAC,GAAG;IANtB,OAAO,CAAC,SAAS,CAA8C;IAE/D,uBAAuB;IACvB,OAAO,CAAC,OAAO,CAAS;gBAGL,GAAG,EAAE,SAAS;IAC/B,8CAA8C;IAC9C,cAAc,GAAE,MAAM,GAAG,MAA8B;IAYnD,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,uBAAuB,GAAG,OAAO,CAAC,OAAO,CAAC;IAyG5E,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;IAQ7C,wDAAwD;IACxD,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI;IAI/C,mBAAmB;IACnB,gBAAgB,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI;IAIrC,iBAAiB,IAAI,MAAM;CAG5B"}
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;IA0F5E,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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nexus-cross/crossx-sdk-wagmi",
3
- "version": "0.0.0-beta.2",
3
+ "version": "1.0.0",
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": "0.0.0-beta.2"
20
+ "@nexus-cross/crossx-sdk-core": "1.0.0"
21
21
  },
22
22
  "peerDependencies": {
23
23
  "viem": ">=2.0.0",
@@ -28,6 +28,7 @@
28
28
  "viem": "^2.46.2",
29
29
  "vite": "^5.0.11",
30
30
  "vite-plugin-dts": "^3.7.1",
31
+ "vitest": "^1.2.0",
31
32
  "wagmi": "^3.5.0"
32
33
  },
33
34
  "keywords": [
@@ -45,6 +46,7 @@
45
46
  "scripts": {
46
47
  "build": "vite build",
47
48
  "dev": "vite build --watch",
49
+ "test": "vitest run",
48
50
  "typecheck": "tsc --noEmit"
49
51
  }
50
52
  }