@interchain-kit/react 0.3.18 → 0.3.20

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.
@@ -2,7 +2,6 @@ import { useWalletModal } from "../modal";
2
2
  import { useWalletManager } from './useWalletManager';
3
3
  import { ChainNameNotExist } from '@interchain-kit/core';
4
4
  import { useSigningClient } from './useSigningClient';
5
- import { decorateWallet } from '../utils/decorateWallet';
6
5
  export const useChain = (chainName) => {
7
6
  const { assetLists, currentWalletName, disconnect, setCurrentChainName, getChainByName, getWalletByName, getChainWalletState, getChainLogoUrl, connect, getSigningClient, getRpcEndpoint, getAccount } = useWalletManager();
8
7
  const chain = getChainByName(chainName);
@@ -35,11 +34,7 @@ export const useChain = (chainName) => {
35
34
  chain,
36
35
  assetList,
37
36
  address: chainWalletStateToShow?.account?.address,
38
- wallet: wallet ? decorateWallet(wallet, {
39
- connect: () => connect(currentWalletName, chainName),
40
- disconnect: () => disconnect(currentWalletName, chainName),
41
- getAccount: () => getAccount(currentWalletName, chainName),
42
- }) : null,
37
+ wallet,
43
38
  getSigningClient: () => getSigningClient(currentWalletName, chainName),
44
39
  signingClient,
45
40
  isSigningClientLoading,
@@ -1,6 +1,5 @@
1
1
  import { useWalletManager } from "./useWalletManager";
2
2
  import { useSigningClient } from "./useSigningClient";
3
- import { decorateWallet } from "../utils/decorateWallet";
4
3
  export const useChainWallet = (chainName, walletName) => {
5
4
  const { assetLists, disconnect, setCurrentChainName, setCurrentWalletName, getChainByName, getWalletByName, getChainWalletState, getChainLogoUrl, connect, getSigningClient, getRpcEndpoint, getAccount } = useWalletManager();
6
5
  const chain = getChainByName(chainName);
@@ -25,11 +24,7 @@ export const useChainWallet = (chainName, walletName) => {
25
24
  chain,
26
25
  assetList,
27
26
  address: chainWalletStateToShow?.account?.address,
28
- wallet: wallet ? decorateWallet(wallet, {
29
- connect: () => connect(walletName, chainName),
30
- disconnect: () => disconnect(walletName, chainName),
31
- getAccount: () => getAccount(walletName, chainName),
32
- }) : null,
27
+ wallet,
33
28
  getSigningClient: () => getSigningClient(walletName, chainName),
34
29
  signingClient,
35
30
  isSigningClientLoading,
@@ -1,8 +1,9 @@
1
- import { clientNotExistError, WalletState } from "@interchain-kit/core";
1
+ import { clientNotExistError, WalletState, WCWallet } from "@interchain-kit/core";
2
2
  import { createStore } from "zustand";
3
3
  import { immer } from "zustand/middleware/immer";
4
4
  import { persist, createJSONStorage } from 'zustand/middleware';
5
5
  import { dedupeAsync } from '../utils';
6
+ import { decorateWallet } from '../utils/decorateWallet';
6
7
  const immerSyncUp = (newWalletManager) => {
7
8
  return (draft) => {
8
9
  draft.chains = newWalletManager.chains;
@@ -24,7 +25,7 @@ export const createInterchainStore = (walletManager) => {
24
25
  currentChainName: '',
25
26
  chains: [...walletManager.chains],
26
27
  assetLists: [...walletManager.assetLists],
27
- wallets: walletManager.wallets,
28
+ wallets: [],
28
29
  signerOptions: walletManager.signerOptions,
29
30
  endpointOptions: walletManager.endpointOptions,
30
31
  preferredSignTypeMap: { ...walletManager.preferredSignTypeMap },
@@ -38,7 +39,135 @@ export const createInterchainStore = (walletManager) => {
38
39
  draft.chainWalletState[targetIndex] = { ...draft.chainWalletState[targetIndex], ...data };
39
40
  });
40
41
  },
42
+ createStatefulWallet: () => {
43
+ const wallets = walletManager.wallets.map(wallet => {
44
+ // safeStrictBatchPatch(wallet, {
45
+ // connect: async (original, chainId) => {
46
+ // const walletName = wallet.info.name
47
+ // const chainName = get().chains.find(chain => chain.chainId === chainId)?.chainName
48
+ // const state = get().getChainWalletState(walletName, chainName)?.walletState
49
+ // if (state === WalletState.NotExist) {
50
+ // return
51
+ // }
52
+ // if (walletName === 'WalletConnect' && state === WalletState.Connected) {
53
+ // return
54
+ // }
55
+ // set(draft => {
56
+ // draft.currentChainName = chainName
57
+ // draft.currentWalletName = walletName
58
+ // draft.walletConnectQRCodeUri = ''
59
+ // })
60
+ // get().updateChainWalletState(walletName, chainName, { walletState: WalletState.Connecting, errorMessage: '' })
61
+ // try {
62
+ // if (wallet instanceof WCWallet) {
63
+ // wallet.setOnPairingUriCreatedCallback((uri) => {
64
+ // set(draft => {
65
+ // draft.walletConnectQRCodeUri = uri
66
+ // })
67
+ // })
68
+ // }
69
+ // await original(chainId)
70
+ // get().updateChainWalletState(walletName, chainName, { walletState: WalletState.Connected })
71
+ // await get().getAccount(walletName, chainName)
72
+ // } catch (error) {
73
+ // if ((error as any).message === 'Request rejected') {
74
+ // get().updateChainWalletState(walletName, chainName, { walletState: WalletState.Rejected, errorMessage: (error as any).message })
75
+ // return
76
+ // }
77
+ // get().updateChainWalletState(walletName, chainName, { walletState: WalletState.Disconnected, errorMessage: (error as any).message })
78
+ // }
79
+ // },
80
+ // disconnect: async (original, chainId) => {
81
+ // const walletName = wallet.info.name
82
+ // const chainName = get().chains.find(chain => chain.chainId === chainId)?.chainName
83
+ // try {
84
+ // await original(chainId)
85
+ // get().updateChainWalletState(walletName, chainName, { walletState: WalletState.Disconnected, account: null })
86
+ // } catch (error) {
87
+ // }
88
+ // },
89
+ // getAccount: async (original, chainId) => {
90
+ // const walletName = wallet.info.name
91
+ // const chainName = get().chains.find(chain => chain.chainId === chainId)?.chainName
92
+ // try {
93
+ // const account = await original(chainId)
94
+ // get().updateChainWalletState(walletName, chainName, { account })
95
+ // return account
96
+ // } catch (error) {
97
+ // console.log(error)
98
+ // }
99
+ // },
100
+ // walletState: get().getChainWalletState(wallet.info.name, walletManager.chains?.[0].chainName)?.walletState || WalletState.Disconnected
101
+ // })
102
+ // return wallet
103
+ return decorateWallet(wallet, {
104
+ connect: async (chainId) => {
105
+ const walletName = wallet.info.name;
106
+ const chainName = get().chains.find(chain => chain.chainId === chainId)?.chainName;
107
+ const state = get().getChainWalletState(walletName, chainName)?.walletState;
108
+ if (state === WalletState.NotExist) {
109
+ return;
110
+ }
111
+ if (walletName === 'WalletConnect' && state === WalletState.Connected) {
112
+ return;
113
+ }
114
+ set(draft => {
115
+ draft.currentChainName = chainName;
116
+ draft.currentWalletName = walletName;
117
+ draft.walletConnectQRCodeUri = '';
118
+ });
119
+ get().updateChainWalletState(walletName, chainName, { walletState: WalletState.Connecting, errorMessage: '' });
120
+ try {
121
+ if (wallet instanceof WCWallet) {
122
+ wallet.setOnPairingUriCreatedCallback((uri) => {
123
+ set(draft => {
124
+ draft.walletConnectQRCodeUri = uri;
125
+ });
126
+ });
127
+ }
128
+ await wallet.connect(chainId);
129
+ get().updateChainWalletState(walletName, chainName, { walletState: WalletState.Connected });
130
+ await get().getAccount(walletName, chainName);
131
+ }
132
+ catch (error) {
133
+ if (error.message === 'Request rejected') {
134
+ get().updateChainWalletState(walletName, chainName, { walletState: WalletState.Rejected, errorMessage: error.message });
135
+ return;
136
+ }
137
+ get().updateChainWalletState(walletName, chainName, { walletState: WalletState.Disconnected, errorMessage: error.message });
138
+ }
139
+ },
140
+ disconnect: async (chainId) => {
141
+ const walletName = wallet.info.name;
142
+ const chainName = get().chains.find(chain => chain.chainId === chainId)?.chainName;
143
+ try {
144
+ await wallet.disconnect(chainId);
145
+ get().updateChainWalletState(walletName, chainName, { walletState: WalletState.Disconnected, account: null });
146
+ }
147
+ catch (error) {
148
+ }
149
+ },
150
+ getAccount: async (chainId) => {
151
+ const walletName = wallet.info.name;
152
+ const chainName = get().chains.find(chain => chain.chainId === chainId)?.chainName;
153
+ try {
154
+ const account = await wallet.getAccount(chainId);
155
+ get().updateChainWalletState(walletName, chainName, { account });
156
+ return account;
157
+ }
158
+ catch (error) {
159
+ console.log(error);
160
+ }
161
+ },
162
+ walletState: get().getChainWalletState(wallet.info.name, walletManager.chains?.[0].chainName)?.walletState || WalletState.Disconnected
163
+ });
164
+ });
165
+ set(draft => {
166
+ draft.wallets = wallets;
167
+ });
168
+ },
41
169
  init: async () => {
170
+ get().createStatefulWallet();
42
171
  const oldChainWalletStatesMap = new Map(get().chainWalletState.map(cws => [cws.walletName + cws.chainName, cws]));
43
172
  // should remove wallet that already disconnected ,for hydrain back from localstorage
44
173
  // const oldChainWalletStateMap = new Map()
@@ -2,13 +2,20 @@ export const decorateWallet = (wallet, decorateMethods) => {
2
2
  return new Proxy(wallet, {
3
3
  get(target, prop, receiver) {
4
4
  if (prop in decorateMethods) {
5
- const method = decorateMethods[prop];
6
- if (typeof method === "function") {
7
- return method.bind(target);
5
+ const value = decorateMethods[prop];
6
+ if (typeof value === "function") {
7
+ return value.bind(target);
8
8
  }
9
- return method;
9
+ return value;
10
10
  }
11
11
  return Reflect.get(target, prop, receiver);
12
12
  },
13
+ set(target, prop, value, receiver) {
14
+ if (prop in decorateMethods) {
15
+ decorateMethods[prop] = value;
16
+ return true;
17
+ }
18
+ return Reflect.set(target, prop, value, receiver);
19
+ },
13
20
  });
14
21
  };
@@ -0,0 +1,26 @@
1
+ export function safeStrictBatchPatch(target, patches) {
2
+ Object.keys(patches).forEach((key) => {
3
+ const patch = patches[key];
4
+ const original = target[key];
5
+ const isDescriptor = patch && typeof patch === 'object' &&
6
+ (typeof patch.get === 'function' ||
7
+ typeof patch.set === 'function');
8
+ if (isDescriptor) {
9
+ const descriptor = patch;
10
+ const originalDescriptor = Object.getOwnPropertyDescriptor(target, key);
11
+ Object.defineProperty(target, key, {
12
+ configurable: true,
13
+ enumerable: originalDescriptor ? originalDescriptor.enumerable : true,
14
+ ...descriptor
15
+ });
16
+ }
17
+ else if (typeof original === 'function' && typeof patch === 'function') {
18
+ target[key] = function (...args) {
19
+ return patch.call(this, original.bind(this), ...args);
20
+ };
21
+ }
22
+ else {
23
+ target[key] = patch;
24
+ }
25
+ });
26
+ }
package/hooks/useChain.js CHANGED
@@ -5,7 +5,6 @@ const modal_1 = require("../modal");
5
5
  const useWalletManager_1 = require("./useWalletManager");
6
6
  const core_1 = require("@interchain-kit/core");
7
7
  const useSigningClient_1 = require("./useSigningClient");
8
- const decorateWallet_1 = require("../utils/decorateWallet");
9
8
  const useChain = (chainName) => {
10
9
  const { assetLists, currentWalletName, disconnect, setCurrentChainName, getChainByName, getWalletByName, getChainWalletState, getChainLogoUrl, connect, getSigningClient, getRpcEndpoint, getAccount } = (0, useWalletManager_1.useWalletManager)();
11
10
  const chain = getChainByName(chainName);
@@ -38,11 +37,7 @@ const useChain = (chainName) => {
38
37
  chain,
39
38
  assetList,
40
39
  address: chainWalletStateToShow?.account?.address,
41
- wallet: wallet ? (0, decorateWallet_1.decorateWallet)(wallet, {
42
- connect: () => connect(currentWalletName, chainName),
43
- disconnect: () => disconnect(currentWalletName, chainName),
44
- getAccount: () => getAccount(currentWalletName, chainName),
45
- }) : null,
40
+ wallet,
46
41
  getSigningClient: () => getSigningClient(currentWalletName, chainName),
47
42
  signingClient,
48
43
  isSigningClientLoading,
@@ -3,7 +3,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.useChainWallet = void 0;
4
4
  const useWalletManager_1 = require("./useWalletManager");
5
5
  const useSigningClient_1 = require("./useSigningClient");
6
- const decorateWallet_1 = require("../utils/decorateWallet");
7
6
  const useChainWallet = (chainName, walletName) => {
8
7
  const { assetLists, disconnect, setCurrentChainName, setCurrentWalletName, getChainByName, getWalletByName, getChainWalletState, getChainLogoUrl, connect, getSigningClient, getRpcEndpoint, getAccount } = (0, useWalletManager_1.useWalletManager)();
9
8
  const chain = getChainByName(chainName);
@@ -28,11 +27,7 @@ const useChainWallet = (chainName, walletName) => {
28
27
  chain,
29
28
  assetList,
30
29
  address: chainWalletStateToShow?.account?.address,
31
- wallet: wallet ? (0, decorateWallet_1.decorateWallet)(wallet, {
32
- connect: () => connect(walletName, chainName),
33
- disconnect: () => disconnect(walletName, chainName),
34
- getAccount: () => getAccount(walletName, chainName),
35
- }) : null,
30
+ wallet,
36
31
  getSigningClient: () => getSigningClient(walletName, chainName),
37
32
  signingClient,
38
33
  isSigningClientLoading,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@interchain-kit/react",
3
- "version": "0.3.18",
3
+ "version": "0.3.20",
4
4
  "author": "Hyperweb <developers@hyperweb.io>",
5
5
  "description": "interchain-kit wallet connector react package",
6
6
  "main": "index.js",
@@ -34,13 +34,14 @@
34
34
  "keywords": [],
35
35
  "dependencies": {
36
36
  "@chain-registry/v2-types": "^0.53.40",
37
- "@interchain-kit/core": "0.3.18",
37
+ "@interchain-kit/core": "^0.3.20",
38
38
  "@interchain-ui/react": "1.26.1",
39
- "@interchainjs/cosmos": "1.11.5",
40
- "@interchainjs/cosmos-types": "1.11.5",
39
+ "@interchainjs/cosmos": "1.11.9",
40
+ "@interchainjs/cosmos-types": "1.11.9",
41
+ "@interchainjs/types": "1.11.9",
41
42
  "@react-icons/all-files": "^4.1.0",
42
43
  "@walletconnect/types": "^2.17.3",
43
- "interchainjs": "1.11.5",
44
+ "interchainjs": "1.11.9",
44
45
  "zustand": "^5.0.3"
45
46
  },
46
47
  "devDependencies": {
@@ -63,5 +64,5 @@
63
64
  "react": "^19.0.0",
64
65
  "react-dom": "^19.0.0"
65
66
  },
66
- "gitHead": "efcb06d9945c5146c5a7a618c06508d0d5c6c3a9"
67
+ "gitHead": "dff9d352f8545f3106e72009101ccd581d7c6f4d"
67
68
  }
package/store/store.d.ts CHANGED
@@ -19,6 +19,7 @@ export interface InterchainStore extends WalletManager {
19
19
  getDraftChainWalletState: (state: InterchainStore, walletName: string, chainName: string) => ChainWalletState;
20
20
  getChainWalletState: (walletName: string, chainName: string) => ChainWalletState | undefined;
21
21
  updateChainWalletState: (walletName: string, chainName: string, data: Partial<ChainWalletState>) => void;
22
+ createStatefulWallet: () => void;
22
23
  isReady: boolean;
23
24
  }
24
25
  export type InterchainStoreData = {
package/store/store.js CHANGED
@@ -6,6 +6,7 @@ const zustand_1 = require("zustand");
6
6
  const immer_1 = require("zustand/middleware/immer");
7
7
  const middleware_1 = require("zustand/middleware");
8
8
  const utils_1 = require("../utils");
9
+ const decorateWallet_1 = require("../utils/decorateWallet");
9
10
  const immerSyncUp = (newWalletManager) => {
10
11
  return (draft) => {
11
12
  draft.chains = newWalletManager.chains;
@@ -27,7 +28,7 @@ const createInterchainStore = (walletManager) => {
27
28
  currentChainName: '',
28
29
  chains: [...walletManager.chains],
29
30
  assetLists: [...walletManager.assetLists],
30
- wallets: walletManager.wallets,
31
+ wallets: [],
31
32
  signerOptions: walletManager.signerOptions,
32
33
  endpointOptions: walletManager.endpointOptions,
33
34
  preferredSignTypeMap: { ...walletManager.preferredSignTypeMap },
@@ -41,7 +42,135 @@ const createInterchainStore = (walletManager) => {
41
42
  draft.chainWalletState[targetIndex] = { ...draft.chainWalletState[targetIndex], ...data };
42
43
  });
43
44
  },
45
+ createStatefulWallet: () => {
46
+ const wallets = walletManager.wallets.map(wallet => {
47
+ // safeStrictBatchPatch(wallet, {
48
+ // connect: async (original, chainId) => {
49
+ // const walletName = wallet.info.name
50
+ // const chainName = get().chains.find(chain => chain.chainId === chainId)?.chainName
51
+ // const state = get().getChainWalletState(walletName, chainName)?.walletState
52
+ // if (state === WalletState.NotExist) {
53
+ // return
54
+ // }
55
+ // if (walletName === 'WalletConnect' && state === WalletState.Connected) {
56
+ // return
57
+ // }
58
+ // set(draft => {
59
+ // draft.currentChainName = chainName
60
+ // draft.currentWalletName = walletName
61
+ // draft.walletConnectQRCodeUri = ''
62
+ // })
63
+ // get().updateChainWalletState(walletName, chainName, { walletState: WalletState.Connecting, errorMessage: '' })
64
+ // try {
65
+ // if (wallet instanceof WCWallet) {
66
+ // wallet.setOnPairingUriCreatedCallback((uri) => {
67
+ // set(draft => {
68
+ // draft.walletConnectQRCodeUri = uri
69
+ // })
70
+ // })
71
+ // }
72
+ // await original(chainId)
73
+ // get().updateChainWalletState(walletName, chainName, { walletState: WalletState.Connected })
74
+ // await get().getAccount(walletName, chainName)
75
+ // } catch (error) {
76
+ // if ((error as any).message === 'Request rejected') {
77
+ // get().updateChainWalletState(walletName, chainName, { walletState: WalletState.Rejected, errorMessage: (error as any).message })
78
+ // return
79
+ // }
80
+ // get().updateChainWalletState(walletName, chainName, { walletState: WalletState.Disconnected, errorMessage: (error as any).message })
81
+ // }
82
+ // },
83
+ // disconnect: async (original, chainId) => {
84
+ // const walletName = wallet.info.name
85
+ // const chainName = get().chains.find(chain => chain.chainId === chainId)?.chainName
86
+ // try {
87
+ // await original(chainId)
88
+ // get().updateChainWalletState(walletName, chainName, { walletState: WalletState.Disconnected, account: null })
89
+ // } catch (error) {
90
+ // }
91
+ // },
92
+ // getAccount: async (original, chainId) => {
93
+ // const walletName = wallet.info.name
94
+ // const chainName = get().chains.find(chain => chain.chainId === chainId)?.chainName
95
+ // try {
96
+ // const account = await original(chainId)
97
+ // get().updateChainWalletState(walletName, chainName, { account })
98
+ // return account
99
+ // } catch (error) {
100
+ // console.log(error)
101
+ // }
102
+ // },
103
+ // walletState: get().getChainWalletState(wallet.info.name, walletManager.chains?.[0].chainName)?.walletState || WalletState.Disconnected
104
+ // })
105
+ // return wallet
106
+ return (0, decorateWallet_1.decorateWallet)(wallet, {
107
+ connect: async (chainId) => {
108
+ const walletName = wallet.info.name;
109
+ const chainName = get().chains.find(chain => chain.chainId === chainId)?.chainName;
110
+ const state = get().getChainWalletState(walletName, chainName)?.walletState;
111
+ if (state === core_1.WalletState.NotExist) {
112
+ return;
113
+ }
114
+ if (walletName === 'WalletConnect' && state === core_1.WalletState.Connected) {
115
+ return;
116
+ }
117
+ set(draft => {
118
+ draft.currentChainName = chainName;
119
+ draft.currentWalletName = walletName;
120
+ draft.walletConnectQRCodeUri = '';
121
+ });
122
+ get().updateChainWalletState(walletName, chainName, { walletState: core_1.WalletState.Connecting, errorMessage: '' });
123
+ try {
124
+ if (wallet instanceof core_1.WCWallet) {
125
+ wallet.setOnPairingUriCreatedCallback((uri) => {
126
+ set(draft => {
127
+ draft.walletConnectQRCodeUri = uri;
128
+ });
129
+ });
130
+ }
131
+ await wallet.connect(chainId);
132
+ get().updateChainWalletState(walletName, chainName, { walletState: core_1.WalletState.Connected });
133
+ await get().getAccount(walletName, chainName);
134
+ }
135
+ catch (error) {
136
+ if (error.message === 'Request rejected') {
137
+ get().updateChainWalletState(walletName, chainName, { walletState: core_1.WalletState.Rejected, errorMessage: error.message });
138
+ return;
139
+ }
140
+ get().updateChainWalletState(walletName, chainName, { walletState: core_1.WalletState.Disconnected, errorMessage: error.message });
141
+ }
142
+ },
143
+ disconnect: async (chainId) => {
144
+ const walletName = wallet.info.name;
145
+ const chainName = get().chains.find(chain => chain.chainId === chainId)?.chainName;
146
+ try {
147
+ await wallet.disconnect(chainId);
148
+ get().updateChainWalletState(walletName, chainName, { walletState: core_1.WalletState.Disconnected, account: null });
149
+ }
150
+ catch (error) {
151
+ }
152
+ },
153
+ getAccount: async (chainId) => {
154
+ const walletName = wallet.info.name;
155
+ const chainName = get().chains.find(chain => chain.chainId === chainId)?.chainName;
156
+ try {
157
+ const account = await wallet.getAccount(chainId);
158
+ get().updateChainWalletState(walletName, chainName, { account });
159
+ return account;
160
+ }
161
+ catch (error) {
162
+ console.log(error);
163
+ }
164
+ },
165
+ walletState: get().getChainWalletState(wallet.info.name, walletManager.chains?.[0].chainName)?.walletState || core_1.WalletState.Disconnected
166
+ });
167
+ });
168
+ set(draft => {
169
+ draft.wallets = wallets;
170
+ });
171
+ },
44
172
  init: async () => {
173
+ get().createStatefulWallet();
45
174
  const oldChainWalletStatesMap = new Map(get().chainWalletState.map(cws => [cws.walletName + cws.chainName, cws]));
46
175
  // should remove wallet that already disconnected ,for hydrain back from localstorage
47
176
  // const oldChainWalletStateMap = new Map()
@@ -5,14 +5,21 @@ const decorateWallet = (wallet, decorateMethods) => {
5
5
  return new Proxy(wallet, {
6
6
  get(target, prop, receiver) {
7
7
  if (prop in decorateMethods) {
8
- const method = decorateMethods[prop];
9
- if (typeof method === "function") {
10
- return method.bind(target);
8
+ const value = decorateMethods[prop];
9
+ if (typeof value === "function") {
10
+ return value.bind(target);
11
11
  }
12
- return method;
12
+ return value;
13
13
  }
14
14
  return Reflect.get(target, prop, receiver);
15
15
  },
16
+ set(target, prop, value, receiver) {
17
+ if (prop in decorateMethods) {
18
+ decorateMethods[prop] = value;
19
+ return true;
20
+ }
21
+ return Reflect.set(target, prop, value, receiver);
22
+ },
16
23
  });
17
24
  };
18
25
  exports.decorateWallet = decorateWallet;
@@ -0,0 +1,8 @@
1
+ type MethodPatch<T, K extends keyof T> = T[K] extends (...args: any[]) => any ? (original: T[K], ...args: Parameters<T[K]>) => ReturnType<T[K]> : never;
2
+ type PropertyPatch<T, K extends keyof T> = T[K];
3
+ type DescriptorPatch = PropertyDescriptor;
4
+ type PatchConfig<T> = {
5
+ [K in keyof T]?: MethodPatch<T, K> | PropertyPatch<T, K> | DescriptorPatch;
6
+ };
7
+ export declare function safeStrictBatchPatch<T>(target: T, patches: PatchConfig<T>): void;
8
+ export {};
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.safeStrictBatchPatch = safeStrictBatchPatch;
4
+ function safeStrictBatchPatch(target, patches) {
5
+ Object.keys(patches).forEach((key) => {
6
+ const patch = patches[key];
7
+ const original = target[key];
8
+ const isDescriptor = patch && typeof patch === 'object' &&
9
+ (typeof patch.get === 'function' ||
10
+ typeof patch.set === 'function');
11
+ if (isDescriptor) {
12
+ const descriptor = patch;
13
+ const originalDescriptor = Object.getOwnPropertyDescriptor(target, key);
14
+ Object.defineProperty(target, key, {
15
+ configurable: true,
16
+ enumerable: originalDescriptor ? originalDescriptor.enumerable : true,
17
+ ...descriptor
18
+ });
19
+ }
20
+ else if (typeof original === 'function' && typeof patch === 'function') {
21
+ target[key] = function (...args) {
22
+ return patch.call(this, original.bind(this), ...args);
23
+ };
24
+ }
25
+ else {
26
+ target[key] = patch;
27
+ }
28
+ });
29
+ }