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

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,13 @@
1
+ import { CROSSxSDK } from '@nexus-cross/crossx-sdk-core';
2
+ import { CROSSxEIP1193Provider } from './provider';
3
+
4
+ export interface CROSSxConnectorOptions {
5
+ sdk: CROSSxSDK;
6
+ /**
7
+ * 기본 체인 ID (숫자 또는 ChainId 상수의 CAIP-2 값)
8
+ * 기본값: ChainId.CROSS_MAINNET ('eip155:612055' → 612055)
9
+ */
10
+ defaultChainId?: string | number;
11
+ }
12
+ export declare function createCROSSxConnector(options: CROSSxConnectorOptions): import('wagmi').CreateConnectorFn<CROSSxEIP1193Provider, Record<string, unknown>, Record<string, unknown>>;
13
+ //# sourceMappingURL=connector.d.ts.map
@@ -0,0 +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"}
package/dist/index.cjs ADDED
@@ -0,0 +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;
@@ -0,0 +1,24 @@
1
+ /**
2
+ * @nexus-cross/crossx-sdk-wagmi
3
+ *
4
+ * CROSSx 임베디드 지갑을 wagmi에 통합하는 Connector 패키지.
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();
13
+ *
14
+ * const config = createConfig({
15
+ * chains: [crossMainnet],
16
+ * connectors: [createCROSSxConnector({ sdk })],
17
+ * transports: { [crossMainnet.id]: http() },
18
+ * });
19
+ */
20
+ export { createCROSSxConnector } from './connector';
21
+ export type { CROSSxConnectorOptions } from './connector';
22
+ export { CROSSxEIP1193Provider } from './provider';
23
+ export type { EIP1193RequestArguments } from './provider';
24
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +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"}
package/dist/index.js ADDED
@@ -0,0 +1,188 @@
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);
6
+ }
7
+ function d(r) {
8
+ return `eip155:${r}`;
9
+ }
10
+ function m(r) {
11
+ return "0x" + r.toString(16);
12
+ }
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);
16
+ }
17
+ // ============================================================================
18
+ // EIP-1193 request
19
+ // ============================================================================
20
+ async request({ method: t, params: a }) {
21
+ const i = a ?? [];
22
+ switch (t) {
23
+ case "eth_requestAccounts":
24
+ case "eth_accounts": {
25
+ const e = this.sdk.getAddress();
26
+ return e ? [e] : [];
27
+ }
28
+ case "eth_chainId":
29
+ return m(this.chainId);
30
+ case "net_version":
31
+ return String(this.chainId);
32
+ case "personal_sign": {
33
+ const [e] = i, s = d(this.chainId);
34
+ return (await this.sdk.signMessage(s, e)).signature;
35
+ }
36
+ case "eth_sign": {
37
+ const [, e] = i, s = d(this.chainId);
38
+ return (await this.sdk.signMessage(s, e)).signature;
39
+ }
40
+ case "eth_signTypedData":
41
+ 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;
44
+ }
45
+ case "eth_sendTransaction": {
46
+ const [e] = i, s = d(this.chainId);
47
+ 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,
57
+ chainId: this.chainId
58
+ })).txHash;
59
+ }
60
+ 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;
63
+ }
64
+ case "wallet_addEthereumChain":
65
+ return null;
66
+ default:
67
+ throw new Error(`[CROSSx] 지원하지 않는 RPC 메서드: ${t}`);
68
+ }
69
+ }
70
+ // ============================================================================
71
+ // EIP-1193 이벤트 (EventEmitter 호환)
72
+ // ============================================================================
73
+ on(t, a) {
74
+ return this.listeners.has(t) || this.listeners.set(t, /* @__PURE__ */ new Set()), this.listeners.get(t).add(a), this;
75
+ }
76
+ removeListener(t, a) {
77
+ var i;
78
+ return (i = this.listeners.get(t)) == null || i.delete(a), this;
79
+ }
80
+ emit(t, ...a) {
81
+ var i;
82
+ (i = this.listeners.get(t)) == null || i.forEach((e) => e(...a));
83
+ }
84
+ // ============================================================================
85
+ // 내부 헬퍼 (Connector에서 호출)
86
+ // ============================================================================
87
+ /** 계정 변경 이벤트 발생 (connect/disconnect 시 Connector가 호출) */
88
+ notifyAccountsChanged(t) {
89
+ this.emit("accountsChanged", t);
90
+ }
91
+ /** 연결 해제 이벤트 발생 */
92
+ notifyDisconnect(t) {
93
+ this.emit("disconnect", t);
94
+ }
95
+ getCurrentChainId() {
96
+ return this.chainId;
97
+ }
98
+ }
99
+ function y(r) {
100
+ if (typeof r == "number") return r;
101
+ const t = r.split(":");
102
+ return parseInt(t[1] ?? "1", 10);
103
+ }
104
+ function A(r) {
105
+ const { sdk: t, defaultChainId: a = I.CROSS_MAINNET } = r, i = y(a);
106
+ let e = null;
107
+ function s() {
108
+ return e || (e = new w(t, i)), e;
109
+ }
110
+ return p((c) => ({
111
+ id: "crossx",
112
+ name: "CROSSx Wallet",
113
+ 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
126
+ };
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
140
+ };
141
+ },
142
+ // ── 연결 해제 ─────────────────────────────────────────────────────────────
143
+ async disconnect() {
144
+ const n = s();
145
+ await t.signOut(), n.notifyDisconnect(), c.emitter.emit("disconnect");
146
+ },
147
+ // ── 계정 ─────────────────────────────────────────────────────────────────
148
+ async getAccounts() {
149
+ const n = await t.getAddress();
150
+ return n ? [n.address] : [];
151
+ },
152
+ // ── 체인 ─────────────────────────────────────────────────────────────────
153
+ async getChainId() {
154
+ return s().getCurrentChainId();
155
+ },
156
+ // ── Provider ─────────────────────────────────────────────────────────────
157
+ async getProvider({ chainId: n } = {}) {
158
+ return s();
159
+ },
160
+ // ── 인증 상태 ─────────────────────────────────────────────────────────────
161
+ async isAuthorized() {
162
+ return t.isAuthenticated();
163
+ },
164
+ // ── 이벤트 핸들러 (wagmi 내부 이벤트 연결) ────────────────────────────────
165
+ onAccountsChanged(n) {
166
+ n.length === 0 ? c.emitter.emit("disconnect") : c.emitter.emit("change", {
167
+ accounts: n
168
+ });
169
+ },
170
+ onChainChanged(n) {
171
+ c.emitter.emit("change", {
172
+ chainId: Number(n)
173
+ });
174
+ },
175
+ onDisconnect() {
176
+ 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
+ }
183
+ }));
184
+ }
185
+ export {
186
+ w as CROSSxEIP1193Provider,
187
+ A as createCROSSxConnector
188
+ };
@@ -0,0 +1,28 @@
1
+ import { CROSSxSDK } from '@nexus-cross/crossx-sdk-core';
2
+
3
+ type EventListener = (...args: any[]) => void;
4
+ export interface EIP1193RequestArguments {
5
+ method: string;
6
+ params?: readonly unknown[] | object;
7
+ }
8
+ export declare class CROSSxEIP1193Provider {
9
+ private readonly sdk;
10
+ private listeners;
11
+ /** 현재 활성 체인 ID (숫자) */
12
+ private chainId;
13
+ constructor(sdk: CROSSxSDK,
14
+ /** 기본 체인 ID. ChainId 상수의 CAIP-2 값 또는 숫자 허용 */
15
+ defaultChainId?: string | number);
16
+ request({ method, params }: EIP1193RequestArguments): Promise<unknown>;
17
+ on(event: string, listener: EventListener): this;
18
+ removeListener(event: string, listener: EventListener): this;
19
+ off: (event: string, listener: EventListener) => this;
20
+ emit(event: string, ...args: unknown[]): void;
21
+ /** 계정 변경 이벤트 발생 (connect/disconnect 시 Connector가 호출) */
22
+ notifyAccountsChanged(accounts: string[]): void;
23
+ /** 연결 해제 이벤트 발생 */
24
+ notifyDisconnect(error?: Error): void;
25
+ getCurrentChainId(): number;
26
+ }
27
+ export {};
28
+ //# sourceMappingURL=provider.d.ts.map
@@ -0,0 +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"}
package/package.json ADDED
@@ -0,0 +1,50 @@
1
+ {
2
+ "name": "@nexus-cross/crossx-sdk-wagmi",
3
+ "version": "0.0.0-beta.2",
4
+ "description": "CROSSx SDK wagmi Connector — OAuth 임베디드 지갑을 wagmi에 통합",
5
+ "type": "module",
6
+ "main": "./dist/index.cjs",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "import": "./dist/index.js",
12
+ "require": "./dist/index.cjs",
13
+ "types": "./dist/index.d.ts"
14
+ }
15
+ },
16
+ "files": [
17
+ "dist"
18
+ ],
19
+ "dependencies": {
20
+ "@nexus-cross/crossx-sdk-core": "0.0.0-beta.2"
21
+ },
22
+ "peerDependencies": {
23
+ "viem": ">=2.0.0",
24
+ "wagmi": ">=2.0.0"
25
+ },
26
+ "devDependencies": {
27
+ "typescript": "^5.3.3",
28
+ "viem": "^2.46.2",
29
+ "vite": "^5.0.11",
30
+ "vite-plugin-dts": "^3.7.1",
31
+ "wagmi": "^3.5.0"
32
+ },
33
+ "keywords": [
34
+ "crossx",
35
+ "wagmi",
36
+ "connector",
37
+ "embedded-wallet",
38
+ "eip-1193"
39
+ ],
40
+ "license": "MIT",
41
+ "publishConfig": {
42
+ "registry": "https://registry.npmjs.org",
43
+ "access": "public"
44
+ },
45
+ "scripts": {
46
+ "build": "vite build",
47
+ "dev": "vite build --watch",
48
+ "typecheck": "tsc --noEmit"
49
+ }
50
+ }