@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.
- package/dist/connector.d.ts +8 -0
- package/dist/connector.d.ts.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.js +162 -98
- package/dist/provider.d.ts +13 -1
- package/dist/provider.d.ts.map +1 -1
- package/package.json +2 -2
package/dist/connector.d.ts
CHANGED
|
@@ -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>>;
|
package/dist/connector.d.ts.map
CHANGED
|
@@ -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;
|
|
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
|
|
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
|
|
2
|
-
import { ChainId as
|
|
3
|
-
function
|
|
4
|
-
return parseInt(
|
|
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
|
|
7
|
-
return `eip155:${
|
|
6
|
+
function S(s) {
|
|
7
|
+
return `eip155:${s}`;
|
|
8
8
|
}
|
|
9
|
-
function
|
|
10
|
-
return "0x" +
|
|
9
|
+
function A(s) {
|
|
10
|
+
return "0x" + s.toString(16);
|
|
11
11
|
}
|
|
12
|
-
class
|
|
13
|
-
constructor(
|
|
14
|
-
this.sdk =
|
|
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:
|
|
18
|
-
var
|
|
19
|
-
const
|
|
20
|
-
switch (
|
|
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
|
-
|
|
24
|
-
|
|
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
|
|
33
|
+
return A(this.chainId);
|
|
28
34
|
case "net_version":
|
|
29
35
|
return String(this.chainId);
|
|
30
36
|
case "personal_sign": {
|
|
31
|
-
const [
|
|
32
|
-
return (await this.sdk.signMessage(
|
|
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 [,
|
|
36
|
-
return (await this.sdk.signMessage(
|
|
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 [,
|
|
42
|
-
return (
|
|
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 [
|
|
46
|
-
return (await this.sdk.sendTransaction(
|
|
47
|
-
from:
|
|
48
|
-
to:
|
|
49
|
-
value:
|
|
50
|
-
data:
|
|
51
|
-
gasLimit:
|
|
52
|
-
gasPrice:
|
|
53
|
-
maxFeePerGas:
|
|
54
|
-
maxPriorityFeePerGas:
|
|
55
|
-
nonce:
|
|
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:
|
|
61
|
-
return
|
|
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(
|
|
80
|
+
return this.sdk.walletRpc(e, a, S(this.chainId));
|
|
67
81
|
}
|
|
68
82
|
}
|
|
69
83
|
// ── EIP-1193 이벤트 ───────────────────────────────────────────────────────
|
|
70
|
-
on(
|
|
71
|
-
return this.listeners.has(
|
|
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(
|
|
74
|
-
var
|
|
75
|
-
return (
|
|
87
|
+
removeListener(e, i) {
|
|
88
|
+
var a;
|
|
89
|
+
return (a = this.listeners.get(e)) == null || a.delete(i), this;
|
|
76
90
|
}
|
|
77
|
-
emit(
|
|
78
|
-
var
|
|
79
|
-
(
|
|
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(
|
|
83
|
-
this.emit("accountsChanged",
|
|
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(
|
|
86
|
-
this.emit("disconnect",
|
|
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(
|
|
92
|
-
|
|
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
|
|
96
|
-
return typeof
|
|
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
|
|
99
|
-
const { defaultChainId:
|
|
100
|
-
return
|
|
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
|
|
103
|
-
const {
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
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
|
|
162
|
+
return R((u) => ({
|
|
109
163
|
id: "crossx",
|
|
110
164
|
name: "CROSSx Wallet",
|
|
111
165
|
type: "crossx",
|
|
112
166
|
async setup() {
|
|
113
|
-
|
|
114
|
-
const n =
|
|
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
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
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:
|
|
182
|
+
chainId: f
|
|
126
183
|
};
|
|
184
|
+
console.log("[CROSSx-debug] connector.connect() 재연결 경로 — info null, 신규 로그인으로 진행");
|
|
127
185
|
}
|
|
128
|
-
const
|
|
129
|
-
if (!
|
|
130
|
-
throw new Error(
|
|
131
|
-
const
|
|
132
|
-
if (
|
|
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
|
-
|
|
135
|
-
|
|
136
|
-
|
|
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 =
|
|
142
|
-
await
|
|
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 =
|
|
147
|
-
|
|
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
|
|
214
|
+
return d().getCurrentChainId();
|
|
152
215
|
},
|
|
153
216
|
// ── getProvider ─────────────────────────────────────────────────────────
|
|
154
217
|
async getProvider({ chainId: n } = {}) {
|
|
155
|
-
return
|
|
218
|
+
return d();
|
|
156
219
|
},
|
|
157
220
|
// ── isAuthorized ────────────────────────────────────────────────────────
|
|
158
221
|
async isAuthorized() {
|
|
159
|
-
|
|
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
|
-
|
|
164
|
-
const
|
|
165
|
-
if (!
|
|
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
|
|
231
|
+
return o;
|
|
168
232
|
},
|
|
169
233
|
// ── 이벤트 핸들러 ───────────────────────────────────────────────────────
|
|
170
234
|
onAccountsChanged(n) {
|
|
171
|
-
n.length === 0 ?
|
|
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
|
-
|
|
240
|
+
u.emitter.emit("change", {
|
|
177
241
|
chainId: Number(n)
|
|
178
242
|
});
|
|
179
243
|
},
|
|
180
244
|
onDisconnect() {
|
|
181
|
-
|
|
245
|
+
u.emitter.emit("disconnect");
|
|
182
246
|
}
|
|
183
247
|
}));
|
|
184
248
|
}
|
|
185
249
|
export {
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
250
|
+
v as CROSSxEIP1193Provider,
|
|
251
|
+
N as createCROSSxConnector,
|
|
252
|
+
G as crossxConnector
|
|
189
253
|
};
|
package/dist/provider.d.ts
CHANGED
|
@@ -6,10 +6,15 @@ export interface EIP1193RequestArguments {
|
|
|
6
6
|
params?: readonly unknown[] | object;
|
|
7
7
|
}
|
|
8
8
|
export declare class CROSSxEIP1193Provider {
|
|
9
|
-
|
|
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
|
package/dist/provider.d.ts.map
CHANGED
|
@@ -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;
|
|
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.
|
|
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.
|
|
20
|
+
"@nexus-cross/crossx-sdk-core": "1.0.5"
|
|
21
21
|
},
|
|
22
22
|
"peerDependencies": {
|
|
23
23
|
"viem": ">=2.0.0",
|