@reown/appkit-core-react-native 0.0.0-canary-20241010175718 → 0.0.0-develop-20241106142253

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.
Files changed (165) hide show
  1. package/lib/commonjs/controllers/AccountController.js +35 -1
  2. package/lib/commonjs/controllers/AccountController.js.map +1 -1
  3. package/lib/commonjs/controllers/ApiController.js +3 -3
  4. package/lib/commonjs/controllers/ApiController.js.map +1 -1
  5. package/lib/commonjs/controllers/BlockchainApiController.js +84 -0
  6. package/lib/commonjs/controllers/BlockchainApiController.js.map +1 -1
  7. package/lib/commonjs/controllers/ConnectionController.js +30 -8
  8. package/lib/commonjs/controllers/ConnectionController.js.map +1 -1
  9. package/lib/commonjs/controllers/ConnectorController.js +9 -1
  10. package/lib/commonjs/controllers/ConnectorController.js.map +1 -1
  11. package/lib/commonjs/controllers/EnsController.js +35 -0
  12. package/lib/commonjs/controllers/EnsController.js.map +1 -0
  13. package/lib/commonjs/controllers/EventsController.js +1 -15
  14. package/lib/commonjs/controllers/EventsController.js.map +1 -1
  15. package/lib/commonjs/controllers/ModalController.js +3 -1
  16. package/lib/commonjs/controllers/ModalController.js.map +1 -1
  17. package/lib/commonjs/controllers/NetworkController.js +17 -1
  18. package/lib/commonjs/controllers/NetworkController.js.map +1 -1
  19. package/lib/commonjs/controllers/OptionsController.js +10 -2
  20. package/lib/commonjs/controllers/OptionsController.js.map +1 -1
  21. package/lib/commonjs/controllers/RouterController.js +22 -1
  22. package/lib/commonjs/controllers/RouterController.js.map +1 -1
  23. package/lib/commonjs/controllers/SendController.js +176 -0
  24. package/lib/commonjs/controllers/SendController.js.map +1 -0
  25. package/lib/commonjs/controllers/SwapController.js +91 -0
  26. package/lib/commonjs/controllers/SwapController.js.map +1 -0
  27. package/lib/commonjs/controllers/TransactionsController.js +112 -0
  28. package/lib/commonjs/controllers/TransactionsController.js.map +1 -0
  29. package/lib/commonjs/controllers/WebviewController.js +40 -0
  30. package/lib/commonjs/controllers/WebviewController.js.map +1 -0
  31. package/lib/commonjs/index.js +42 -0
  32. package/lib/commonjs/index.js.map +1 -1
  33. package/lib/commonjs/utils/ApiUtil.js +18 -0
  34. package/lib/commonjs/utils/ApiUtil.js.map +1 -0
  35. package/lib/commonjs/utils/ConstantsUtil.js +8 -1
  36. package/lib/commonjs/utils/ConstantsUtil.js.map +1 -1
  37. package/lib/commonjs/utils/CoreHelperUtil.js +33 -0
  38. package/lib/commonjs/utils/CoreHelperUtil.js.map +1 -1
  39. package/lib/commonjs/utils/FetchUtil.js.map +1 -1
  40. package/lib/commonjs/utils/StorageUtil.js +24 -0
  41. package/lib/commonjs/utils/StorageUtil.js.map +1 -1
  42. package/lib/commonjs/utils/SwapApiUtil.js +23 -0
  43. package/lib/commonjs/utils/SwapApiUtil.js.map +1 -0
  44. package/lib/commonjs/utils/SwapCalculationUtil.js +24 -0
  45. package/lib/commonjs/utils/SwapCalculationUtil.js.map +1 -0
  46. package/lib/commonjs/utils/TypeUtil.js +4 -0
  47. package/lib/module/controllers/AccountController.js +35 -1
  48. package/lib/module/controllers/AccountController.js.map +1 -1
  49. package/lib/module/controllers/ApiController.js +3 -3
  50. package/lib/module/controllers/ApiController.js.map +1 -1
  51. package/lib/module/controllers/BlockchainApiController.js +84 -0
  52. package/lib/module/controllers/BlockchainApiController.js.map +1 -1
  53. package/lib/module/controllers/ConnectionController.js +30 -8
  54. package/lib/module/controllers/ConnectionController.js.map +1 -1
  55. package/lib/module/controllers/ConnectorController.js +9 -1
  56. package/lib/module/controllers/ConnectorController.js.map +1 -1
  57. package/lib/module/controllers/EnsController.js +30 -0
  58. package/lib/module/controllers/EnsController.js.map +1 -0
  59. package/lib/module/controllers/EventsController.js +1 -15
  60. package/lib/module/controllers/EventsController.js.map +1 -1
  61. package/lib/module/controllers/ModalController.js +3 -1
  62. package/lib/module/controllers/ModalController.js.map +1 -1
  63. package/lib/module/controllers/NetworkController.js +17 -1
  64. package/lib/module/controllers/NetworkController.js.map +1 -1
  65. package/lib/module/controllers/OptionsController.js +10 -2
  66. package/lib/module/controllers/OptionsController.js.map +1 -1
  67. package/lib/module/controllers/RouterController.js +22 -1
  68. package/lib/module/controllers/RouterController.js.map +1 -1
  69. package/lib/module/controllers/SendController.js +171 -0
  70. package/lib/module/controllers/SendController.js.map +1 -0
  71. package/lib/module/controllers/SwapController.js +86 -0
  72. package/lib/module/controllers/SwapController.js.map +1 -0
  73. package/lib/module/controllers/TransactionsController.js +107 -0
  74. package/lib/module/controllers/TransactionsController.js.map +1 -0
  75. package/lib/module/controllers/WebviewController.js +35 -0
  76. package/lib/module/controllers/WebviewController.js.map +1 -0
  77. package/lib/module/index.js +7 -0
  78. package/lib/module/index.js.map +1 -1
  79. package/lib/module/utils/ApiUtil.js +12 -0
  80. package/lib/module/utils/ApiUtil.js.map +1 -0
  81. package/lib/module/utils/ConstantsUtil.js +8 -1
  82. package/lib/module/utils/ConstantsUtil.js.map +1 -1
  83. package/lib/module/utils/CoreHelperUtil.js +33 -0
  84. package/lib/module/utils/CoreHelperUtil.js.map +1 -1
  85. package/lib/module/utils/FetchUtil.js.map +1 -1
  86. package/lib/module/utils/StorageUtil.js +24 -0
  87. package/lib/module/utils/StorageUtil.js.map +1 -1
  88. package/lib/module/utils/SwapApiUtil.js +17 -0
  89. package/lib/module/utils/SwapApiUtil.js.map +1 -0
  90. package/lib/module/utils/SwapCalculationUtil.js +19 -0
  91. package/lib/module/utils/SwapCalculationUtil.js.map +1 -0
  92. package/lib/module/utils/TypeUtil.js +1 -1
  93. package/lib/typescript/controllers/AccountController.d.ts +9 -1
  94. package/lib/typescript/controllers/AccountController.d.ts.map +1 -1
  95. package/lib/typescript/controllers/ApiController.d.ts +1 -1
  96. package/lib/typescript/controllers/ApiController.d.ts.map +1 -1
  97. package/lib/typescript/controllers/BlockchainApiController.d.ts +6 -1
  98. package/lib/typescript/controllers/BlockchainApiController.d.ts.map +1 -1
  99. package/lib/typescript/controllers/ConnectionController.d.ts +16 -1
  100. package/lib/typescript/controllers/ConnectionController.d.ts.map +1 -1
  101. package/lib/typescript/controllers/ConnectorController.d.ts +1 -1
  102. package/lib/typescript/controllers/ConnectorController.d.ts.map +1 -1
  103. package/lib/typescript/controllers/EnsController.d.ts +10 -0
  104. package/lib/typescript/controllers/EnsController.d.ts.map +1 -0
  105. package/lib/typescript/controllers/EventsController.d.ts +0 -6
  106. package/lib/typescript/controllers/EventsController.d.ts.map +1 -1
  107. package/lib/typescript/controllers/ModalController.d.ts.map +1 -1
  108. package/lib/typescript/controllers/NetworkController.d.ts +4 -0
  109. package/lib/typescript/controllers/NetworkController.d.ts.map +1 -1
  110. package/lib/typescript/controllers/OptionsController.d.ts +4 -2
  111. package/lib/typescript/controllers/OptionsController.d.ts.map +1 -1
  112. package/lib/typescript/controllers/RouterController.d.ts +15 -1
  113. package/lib/typescript/controllers/RouterController.d.ts.map +1 -1
  114. package/lib/typescript/controllers/SendController.d.ts +41 -0
  115. package/lib/typescript/controllers/SendController.d.ts.map +1 -0
  116. package/lib/typescript/controllers/SwapController.d.ts +29 -0
  117. package/lib/typescript/controllers/SwapController.d.ts.map +1 -0
  118. package/lib/typescript/controllers/TransactionsController.d.ts +21 -0
  119. package/lib/typescript/controllers/TransactionsController.d.ts.map +1 -0
  120. package/lib/typescript/controllers/WebviewController.d.ts +18 -0
  121. package/lib/typescript/controllers/WebviewController.d.ts.map +1 -0
  122. package/lib/typescript/index.d.ts +19 -26
  123. package/lib/typescript/index.d.ts.map +1 -1
  124. package/lib/typescript/utils/ApiUtil.d.ts +5 -0
  125. package/lib/typescript/utils/ApiUtil.d.ts.map +1 -0
  126. package/lib/typescript/utils/ConstantsUtil.d.ts +3 -0
  127. package/lib/typescript/utils/ConstantsUtil.d.ts.map +1 -1
  128. package/lib/typescript/utils/CoreHelperUtil.d.ts +6 -0
  129. package/lib/typescript/utils/CoreHelperUtil.d.ts.map +1 -1
  130. package/lib/typescript/utils/FetchUtil.d.ts +3 -0
  131. package/lib/typescript/utils/FetchUtil.d.ts.map +1 -1
  132. package/lib/typescript/utils/StorageUtil.d.ts +5 -1
  133. package/lib/typescript/utils/StorageUtil.d.ts.map +1 -1
  134. package/lib/typescript/utils/SwapApiUtil.d.ts +4 -0
  135. package/lib/typescript/utils/SwapApiUtil.d.ts.map +1 -0
  136. package/lib/typescript/utils/SwapCalculationUtil.d.ts +5 -0
  137. package/lib/typescript/utils/SwapCalculationUtil.d.ts.map +1 -0
  138. package/lib/typescript/utils/TypeUtil.d.ts +240 -3
  139. package/lib/typescript/utils/TypeUtil.d.ts.map +1 -1
  140. package/package.json +5 -5
  141. package/readme.md +1 -1
  142. package/src/controllers/AccountController.ts +50 -2
  143. package/src/controllers/ApiController.ts +3 -7
  144. package/src/controllers/BlockchainApiController.ts +88 -1
  145. package/src/controllers/ConnectionController.ts +52 -9
  146. package/src/controllers/ConnectorController.ts +13 -1
  147. package/src/controllers/EnsController.ts +39 -0
  148. package/src/controllers/EventsController.ts +1 -13
  149. package/src/controllers/ModalController.ts +3 -1
  150. package/src/controllers/NetworkController.ts +27 -1
  151. package/src/controllers/OptionsController.ts +19 -4
  152. package/src/controllers/RouterController.ts +59 -10
  153. package/src/controllers/SendController.ts +234 -0
  154. package/src/controllers/SwapController.ts +108 -0
  155. package/src/controllers/TransactionsController.ts +142 -0
  156. package/src/controllers/WebviewController.ts +48 -0
  157. package/src/index.ts +43 -30
  158. package/src/utils/ApiUtil.ts +18 -0
  159. package/src/utils/ConstantsUtil.ts +13 -1
  160. package/src/utils/CoreHelperUtil.ts +38 -1
  161. package/src/utils/FetchUtil.ts +4 -0
  162. package/src/utils/StorageUtil.ts +31 -1
  163. package/src/utils/SwapApiUtil.ts +19 -0
  164. package/src/utils/SwapCalculationUtil.ts +21 -0
  165. package/src/utils/TypeUtil.ts +272 -3
@@ -1,8 +1,14 @@
1
- import { subscribeKey as subKey } from 'valtio/utils';
2
1
  import { proxy, ref } from 'valtio';
2
+ import { subscribeKey as subKey } from 'valtio/utils';
3
+ import type { SocialProvider } from '@reown/appkit-common-react-native';
3
4
  import { CoreHelperUtil } from '../utils/CoreHelperUtil';
4
5
  import { StorageUtil } from '../utils/StorageUtil';
5
- import type { Connector, WcWallet } from '../utils/TypeUtil';
6
+ import type {
7
+ Connector,
8
+ SendTransactionArgs,
9
+ WcWallet,
10
+ WriteContractArgs
11
+ } from '../utils/TypeUtil';
6
12
  import { RouterController } from './RouterController';
7
13
  import { ConnectorController } from './ConnectorController';
8
14
 
@@ -21,7 +27,13 @@ export interface ConnectionControllerClient {
21
27
  ) => Promise<void>;
22
28
  connectExternal?: (options: ConnectExternalOptions) => Promise<void>;
23
29
  signMessage: (message: string) => Promise<string>;
30
+ sendTransaction: (args: SendTransactionArgs) => Promise<`0x${string}` | null>;
31
+ parseUnits: (value: string, decimals: number) => bigint;
32
+ formatUnits: (value: bigint, decimals: number) => string;
33
+ writeContract: (args: WriteContractArgs) => Promise<`0x${string}` | null>;
24
34
  disconnect: () => Promise<void>;
35
+ getEnsAddress: (value: string) => Promise<false | string>;
36
+ getEnsAvatar: (value: string) => Promise<false | string>;
25
37
  }
26
38
 
27
39
  export interface ConnectionControllerState {
@@ -37,6 +49,7 @@ export interface ConnectionControllerState {
37
49
  pressedWallet?: WcWallet;
38
50
  recentWallets?: WcWallet[];
39
51
  connectedWalletImageUrl?: string;
52
+ connectedSocialProvider?: SocialProvider;
40
53
  }
41
54
 
42
55
  type StateKey = keyof ConnectionControllerState;
@@ -73,15 +86,11 @@ export const ConnectionController = {
73
86
  state.wcPromise = this._getClient().connectWalletConnect(uri => {
74
87
  state.wcUri = uri;
75
88
  state.wcPairingExpiry = CoreHelperUtil.getPairingExpiry();
76
- ConnectorController.setConnectedConnector('WALLET_CONNECT');
77
- StorageUtil.setConnectedConnector('WALLET_CONNECT');
78
89
  }, walletUniversalLink);
79
90
  },
80
91
 
81
92
  async connectExternal(options: ConnectExternalOptions) {
82
93
  await this._getClient().connectExternal?.(options);
83
- ConnectorController.setConnectedConnector(options.type);
84
- StorageUtil.setConnectedConnector(options.type);
85
94
  },
86
95
 
87
96
  async signMessage(message: string) {
@@ -122,6 +131,40 @@ export const ConnectionController = {
122
131
  }
123
132
  },
124
133
 
134
+ setConnectedSocialProvider(provider: ConnectionControllerState['connectedSocialProvider']) {
135
+ state.connectedSocialProvider = provider;
136
+
137
+ if (provider) {
138
+ StorageUtil.setConnectedSocialProvider(provider);
139
+ } else {
140
+ StorageUtil.removeConnectedSocialProvider();
141
+ }
142
+ },
143
+
144
+ parseUnits(value: string, decimals: number) {
145
+ return this._getClient().parseUnits(value, decimals);
146
+ },
147
+
148
+ formatUnits(value: bigint, decimals: number) {
149
+ return this._getClient().formatUnits(value, decimals);
150
+ },
151
+
152
+ async sendTransaction(args: SendTransactionArgs) {
153
+ return this._getClient().sendTransaction(args);
154
+ },
155
+
156
+ async writeContract(args: WriteContractArgs) {
157
+ return this._getClient().writeContract(args);
158
+ },
159
+
160
+ async getEnsAddress(value: string) {
161
+ return this._getClient().getEnsAddress(value);
162
+ },
163
+
164
+ async getEnsAvatar(value: string) {
165
+ return this._getClient().getEnsAvatar(value);
166
+ },
167
+
125
168
  clearUri() {
126
169
  state.wcUri = undefined;
127
170
  state.wcPairingExpiry = undefined;
@@ -132,16 +175,16 @@ export const ConnectionController = {
132
175
  resetWcConnection() {
133
176
  this.clearUri();
134
177
  state.pressedWallet = undefined;
135
- state.connectedWalletImageUrl = undefined;
178
+ ConnectionController.setConnectedSocialProvider(undefined);
179
+ ConnectionController.setConnectedWalletImageUrl(undefined);
136
180
  ConnectorController.setConnectedConnector(undefined);
137
181
  StorageUtil.removeWalletConnectDeepLink();
138
- StorageUtil.removeConnectedWalletImageUrl();
139
- StorageUtil.removeConnectedConnector();
140
182
  },
141
183
 
142
184
  async disconnect() {
143
185
  await this._getClient().disconnect();
144
186
  this.resetWcConnection();
187
+ // remove transactions
145
188
  RouterController.reset('Connect');
146
189
  }
147
190
  };
@@ -1,6 +1,7 @@
1
1
  import { subscribeKey as subKey } from 'valtio/utils';
2
2
  import { proxy, ref } from 'valtio';
3
3
  import type { Connector, ConnectorType } from '../utils/TypeUtil';
4
+ import { StorageUtil } from '../utils/StorageUtil';
4
5
 
5
6
  // -- Types --------------------------------------------- //
6
7
  export interface ConnectorControllerState {
@@ -40,8 +41,19 @@ export const ConnectorController = {
40
41
  return state.connectors.find(c => c.type === 'AUTH');
41
42
  },
42
43
 
43
- setConnectedConnector(connectorType: ConnectorControllerState['connectedConnector']) {
44
+ setConnectedConnector(
45
+ connectorType: ConnectorControllerState['connectedConnector'],
46
+ saveStorage = true
47
+ ) {
44
48
  state.connectedConnector = connectorType;
49
+
50
+ if (saveStorage) {
51
+ if (connectorType) {
52
+ StorageUtil.setConnectedConnector(connectorType);
53
+ } else {
54
+ StorageUtil.removeConnectedConnector();
55
+ }
56
+ }
45
57
  },
46
58
 
47
59
  setAuthLoading(loading: ConnectorControllerState['authLoading']) {
@@ -0,0 +1,39 @@
1
+ import { subscribeKey as subKey } from 'valtio/vanilla/utils';
2
+ import { proxy, subscribe as sub } from 'valtio/vanilla';
3
+ import { BlockchainApiController } from './BlockchainApiController';
4
+ import type { BlockchainApiEnsError } from '../utils/TypeUtil';
5
+
6
+ // -- Types --------------------------------------------- //
7
+
8
+ export interface EnsControllerState {
9
+ loading: boolean;
10
+ }
11
+
12
+ type StateKey = keyof EnsControllerState;
13
+
14
+ // -- State --------------------------------------------- //
15
+ const state = proxy<EnsControllerState>({
16
+ loading: false
17
+ });
18
+
19
+ // -- Controller ---------------------------------------- //
20
+ export const EnsController = {
21
+ state,
22
+
23
+ subscribe(callback: (newState: EnsControllerState) => void) {
24
+ return sub(state, () => callback(state));
25
+ },
26
+
27
+ subscribeKey<K extends StateKey>(key: K, callback: (value: EnsControllerState[K]) => void) {
28
+ return subKey(state, key, callback);
29
+ },
30
+
31
+ async resolveName(name: string) {
32
+ try {
33
+ return await BlockchainApiController.lookupEnsName(name);
34
+ } catch (e) {
35
+ const error = e as BlockchainApiEnsError;
36
+ throw new Error(error?.reasons?.[0]?.description || 'Error resolving name');
37
+ }
38
+ }
39
+ };
@@ -1,4 +1,3 @@
1
- import { Platform } from 'react-native';
2
1
  import { proxy, subscribe as sub } from 'valtio/vanilla';
3
2
  import { ApiController } from './ApiController';
4
3
  import { OptionsController } from './OptionsController';
@@ -34,17 +33,6 @@ export const EventsController = {
34
33
  return sub(state, () => callback(state));
35
34
  },
36
35
 
37
- _getApiHeaders() {
38
- const { projectId, sdkType, sdkVersion } = OptionsController.state;
39
-
40
- return {
41
- 'x-project-id': projectId,
42
- 'x-sdk-type': sdkType,
43
- 'x-sdk-version': sdkVersion,
44
- 'User-Agent': `${Platform.OS}-${Platform.Version}`
45
- };
46
- },
47
-
48
36
  async _sendAnalyticsEvent(data: EventsControllerState['data'], timestamp: number) {
49
37
  if (excluded.includes(data.event)) {
50
38
  return;
@@ -53,7 +41,7 @@ export const EventsController = {
53
41
  try {
54
42
  await api.post({
55
43
  path: '/e',
56
- headers: this._getApiHeaders(),
44
+ headers: ApiController._getApiHeaders(),
57
45
  body: {
58
46
  eventId: CoreHelperUtil.getUUID(),
59
47
  bundleId: CoreHelperUtil.getBundleId(),
@@ -5,6 +5,7 @@ import { RouterController } from './RouterController';
5
5
  import { PublicStateController } from './PublicStateController';
6
6
  import { EventsController } from './EventsController';
7
7
  import { ApiController } from './ApiController';
8
+ import { ConnectorController } from './ConnectorController';
8
9
 
9
10
  // -- Types --------------------------------------------- //
10
11
  export interface ModalControllerState {
@@ -34,7 +35,8 @@ export const ModalController = {
34
35
  if (options?.view) {
35
36
  RouterController.reset(options.view);
36
37
  } else if (AccountController.state.isConnected) {
37
- RouterController.reset('Account');
38
+ const isUniversalWallet = ConnectorController.state.connectedConnector === 'AUTH';
39
+ RouterController.reset(isUniversalWallet ? 'Account' : 'AccountDefault');
38
40
  } else {
39
41
  RouterController.reset('Connect');
40
42
  }
@@ -1,6 +1,7 @@
1
1
  import { proxy, ref } from 'valtio';
2
2
  import type { CaipNetwork, CaipNetworkId } from '../utils/TypeUtil';
3
3
  import { PublicStateController } from './PublicStateController';
4
+ import { NetworkUtil } from '@reown/appkit-common-react-native';
4
5
 
5
6
  // -- Types --------------------------------------------- //
6
7
  export interface NetworkControllerClient {
@@ -18,12 +19,14 @@ export interface NetworkControllerState {
18
19
  caipNetwork?: CaipNetwork;
19
20
  requestedCaipNetworks?: CaipNetwork[];
20
21
  approvedCaipNetworkIds?: CaipNetworkId[];
22
+ smartAccountEnabledNetworks: number[];
21
23
  }
22
24
 
23
25
  // -- State --------------------------------------------- //
24
26
  const state = proxy<NetworkControllerState>({
25
27
  supportsAllNetworks: true,
26
- isDefaultCaipNetwork: false
28
+ isDefaultCaipNetwork: false,
29
+ smartAccountEnabledNetworks: []
27
30
  });
28
31
 
29
32
  // -- Controller ---------------------------------------- //
@@ -57,12 +60,34 @@ export const NetworkController = {
57
60
  state.requestedCaipNetworks = requestedNetworks;
58
61
  },
59
62
 
63
+ setSmartAccountEnabledNetworks(
64
+ smartAccountEnabledNetworks: NetworkControllerState['smartAccountEnabledNetworks']
65
+ ) {
66
+ state.smartAccountEnabledNetworks = smartAccountEnabledNetworks;
67
+ },
68
+
69
+ checkIfSmartAccountEnabled() {
70
+ const networkId = NetworkUtil.caipNetworkIdToNumber(state.caipNetwork?.id);
71
+
72
+ if (!networkId) {
73
+ return false;
74
+ }
75
+
76
+ return Boolean(state.smartAccountEnabledNetworks?.includes(Number(networkId)));
77
+ },
78
+
60
79
  async getApprovedCaipNetworksData() {
61
80
  const data = await this._getClient().getApprovedCaipNetworksData();
62
81
  state.supportsAllNetworks = data.supportsAllNetworks;
63
82
  state.approvedCaipNetworkIds = data.approvedCaipNetworkIds;
64
83
  },
65
84
 
85
+ getApprovedCaipNetworks() {
86
+ return state.approvedCaipNetworkIds
87
+ ?.map(id => state.requestedCaipNetworks?.find(network => network.id === id))
88
+ .filter(Boolean) as CaipNetwork[];
89
+ },
90
+
66
91
  async switchActiveNetwork(network: NetworkControllerState['caipNetwork']) {
67
92
  await this._getClient().switchCaipNetwork(network);
68
93
  state.caipNetwork = network;
@@ -75,5 +100,6 @@ export const NetworkController = {
75
100
  }
76
101
  state.approvedCaipNetworkIds = undefined;
77
102
  state.supportsAllNetworks = true;
103
+ state.smartAccountEnabledNetworks = [];
78
104
  }
79
105
  };
@@ -1,5 +1,14 @@
1
1
  import { proxy, ref } from 'valtio';
2
- import type { CustomWallet, Metadata, ProjectId, SdkVersion, Tokens } from '../utils/TypeUtil';
2
+ import type {
3
+ CustomWallet,
4
+ Features,
5
+ Metadata,
6
+ ProjectId,
7
+ SdkType,
8
+ SdkVersion,
9
+ Tokens
10
+ } from '../utils/TypeUtil';
11
+ import { ConstantsUtil } from '../utils/ConstantsUtil';
3
12
 
4
13
  // -- Types --------------------------------------------- //
5
14
  export interface ClipboardClient {
@@ -15,17 +24,19 @@ export interface OptionsControllerState {
15
24
  customWallets?: CustomWallet[];
16
25
  tokens?: Tokens;
17
26
  enableAnalytics?: boolean;
18
- sdkType: string;
27
+ sdkType: SdkType;
19
28
  sdkVersion: SdkVersion;
20
29
  metadata?: Metadata;
21
30
  isSiweEnabled?: boolean;
31
+ features?: Features;
22
32
  }
23
33
 
24
34
  // -- State --------------------------------------------- //
25
35
  const state = proxy<OptionsControllerState>({
26
36
  projectId: '',
27
37
  sdkType: 'appkit',
28
- sdkVersion: 'react-native-wagmi-undefined'
38
+ sdkVersion: 'react-native-wagmi-undefined',
39
+ features: ConstantsUtil.DEFAULT_FEATURES
29
40
  });
30
41
 
31
42
  // -- Controller ---------------------------------------- //
@@ -76,6 +87,10 @@ export const OptionsController = {
76
87
  state.isSiweEnabled = isSiweEnabled;
77
88
  },
78
89
 
90
+ setFeatures(features: OptionsControllerState['features']) {
91
+ state.features = { ...ConstantsUtil.DEFAULT_FEATURES, ...features };
92
+ },
93
+
79
94
  isClipboardAvailable() {
80
95
  return !!state._clipboardClient;
81
96
  },
@@ -83,7 +98,7 @@ export const OptionsController = {
83
98
  copyToClipboard(value: string) {
84
99
  const client = state._clipboardClient;
85
100
  if (client) {
86
- client.setString(value);
101
+ client?.setString(value);
87
102
  }
88
103
  }
89
104
  };
@@ -1,26 +1,48 @@
1
1
  import { proxy } from 'valtio';
2
2
  import type { WcWallet, CaipNetwork, Connector } from '../utils/TypeUtil';
3
+ import type { SocialProvider } from '@reown/appkit-common-react-native';
3
4
 
4
5
  // -- Types --------------------------------------------- //
6
+ type TransactionAction = {
7
+ goBack: boolean;
8
+ view: RouterControllerState['view'] | null;
9
+ close?: boolean;
10
+ replace?: boolean;
11
+ onSuccess?: () => void;
12
+ onCancel?: () => void;
13
+ };
14
+
5
15
  export interface RouterControllerState {
6
16
  view:
7
17
  | 'Account'
18
+ | 'AccountDefault'
19
+ | 'AllWallets'
8
20
  | 'Connect'
9
- | 'ConnectingWalletConnect'
21
+ | 'ConnectSocials'
10
22
  | 'ConnectingExternal'
11
- | 'Networks'
12
- | 'SwitchNetwork'
13
- | 'AllWallets'
14
- | 'WhatIsAWallet'
15
- | 'WhatIsANetwork'
16
- | 'GetWallet'
23
+ | 'ConnectingSiwe'
24
+ | 'ConnectingSocial'
25
+ | 'ConnectingFarcaster'
26
+ | 'ConnectingWalletConnect'
27
+ | 'Create'
17
28
  | 'EmailVerifyDevice'
18
29
  | 'EmailVerifyOtp'
19
- | 'UpdateEmailWallet'
30
+ | 'GetWallet'
31
+ | 'Networks'
32
+ | 'SwitchNetwork'
33
+ | 'Transactions'
20
34
  | 'UpdateEmailPrimaryOtp'
21
35
  | 'UpdateEmailSecondaryOtp'
36
+ | 'UpdateEmailWallet'
22
37
  | 'UpgradeEmailWallet'
23
- | 'ConnectingSiwe';
38
+ | 'UpgradeToSmartAccount'
39
+ | 'WalletCompatibleNetworks'
40
+ | 'WalletReceive'
41
+ | 'WalletSend'
42
+ | 'WalletSendPreview'
43
+ | 'WalletSendSelectToken'
44
+ | 'WhatIsANetwork'
45
+ | 'WhatIsAWallet';
24
46
  history: RouterControllerState['view'][];
25
47
  data?: {
26
48
  connector?: Connector;
@@ -28,13 +50,16 @@ export interface RouterControllerState {
28
50
  network?: CaipNetwork;
29
51
  email?: string;
30
52
  newEmail?: string;
53
+ socialProvider?: SocialProvider;
31
54
  };
55
+ transactionStack: TransactionAction[];
32
56
  }
33
57
 
34
58
  // -- State --------------------------------------------- //
35
59
  const state = proxy<RouterControllerState>({
36
60
  view: 'Connect',
37
- history: ['Connect']
61
+ history: ['Connect'],
62
+ transactionStack: []
38
63
  });
39
64
 
40
65
  // -- Controller ---------------------------------------- //
@@ -49,6 +74,30 @@ export const RouterController = {
49
74
  }
50
75
  },
51
76
 
77
+ pushTransactionStack(action: TransactionAction) {
78
+ state.transactionStack.push(action);
79
+ },
80
+
81
+ popTransactionStack(cancel?: boolean) {
82
+ const action = state.transactionStack.pop();
83
+
84
+ if (!action) {
85
+ return;
86
+ }
87
+
88
+ if (cancel) {
89
+ this.goBack();
90
+ action?.onCancel?.();
91
+ } else {
92
+ if (action.goBack) {
93
+ this.goBack();
94
+ } else if (action.view) {
95
+ this.reset(action.view);
96
+ }
97
+ action?.onSuccess?.();
98
+ }
99
+ },
100
+
52
101
  reset(view: RouterControllerState['view']) {
53
102
  state.view = view;
54
103
  state.history = [view];
@@ -0,0 +1,234 @@
1
+ import { subscribeKey as subKey } from 'valtio/vanilla/utils';
2
+ import { proxy, ref, subscribe as sub } from 'valtio/vanilla';
3
+ import { ContractUtil, type Balance } from '@reown/appkit-common-react-native';
4
+ import { AccountController } from './AccountController';
5
+ import { ConnectionController } from './ConnectionController';
6
+ import { SnackController } from './SnackController';
7
+ import { CoreHelperUtil } from '../utils/CoreHelperUtil';
8
+ import { EventsController } from './EventsController';
9
+ import { NetworkController } from './NetworkController';
10
+ import { RouterController } from './RouterController';
11
+
12
+ // -- Types --------------------------------------------- //
13
+ export interface TxParams {
14
+ receiverAddress: string;
15
+ sendTokenAmount: number;
16
+ gasPrice: bigint;
17
+ decimals: string;
18
+ }
19
+
20
+ export interface ContractWriteParams {
21
+ receiverAddress: string;
22
+ tokenAddress: string;
23
+ sendTokenAmount: number;
24
+ decimals: string;
25
+ }
26
+
27
+ export interface SendControllerState {
28
+ token?: Balance;
29
+ sendTokenAmount?: number;
30
+ receiverAddress?: string;
31
+ receiverProfileName?: string;
32
+ receiverProfileImageUrl?: string;
33
+ gasPrice?: bigint;
34
+ gasPriceInUSD?: number;
35
+ loading: boolean;
36
+ }
37
+
38
+ type StateKey = keyof SendControllerState;
39
+
40
+ // -- State --------------------------------------------- //
41
+ const state = proxy<SendControllerState>({
42
+ loading: false
43
+ });
44
+
45
+ // -- Controller ---------------------------------------- //
46
+ export const SendController = {
47
+ state,
48
+
49
+ subscribe(callback: (newState: SendControllerState) => void) {
50
+ return sub(state, () => callback(state));
51
+ },
52
+
53
+ subscribeKey<K extends StateKey>(key: K, callback: (value: SendControllerState[K]) => void) {
54
+ return subKey(state, key, callback);
55
+ },
56
+
57
+ setToken(token: SendControllerState['token']) {
58
+ if (token) {
59
+ state.token = ref(token);
60
+ }
61
+ },
62
+
63
+ setTokenAmount(sendTokenAmount: SendControllerState['sendTokenAmount']) {
64
+ state.sendTokenAmount = sendTokenAmount;
65
+ },
66
+
67
+ setReceiverAddress(receiverAddress: SendControllerState['receiverAddress']) {
68
+ state.receiverAddress = receiverAddress;
69
+ },
70
+
71
+ setReceiverProfileImageUrl(
72
+ receiverProfileImageUrl: SendControllerState['receiverProfileImageUrl']
73
+ ) {
74
+ state.receiverProfileImageUrl = receiverProfileImageUrl;
75
+ },
76
+
77
+ setReceiverProfileName(receiverProfileName: SendControllerState['receiverProfileName']) {
78
+ state.receiverProfileName = receiverProfileName;
79
+ },
80
+
81
+ setGasPrice(gasPrice: SendControllerState['gasPrice']) {
82
+ state.gasPrice = gasPrice;
83
+ },
84
+
85
+ setGasPriceInUsd(gasPriceInUSD: SendControllerState['gasPriceInUSD']) {
86
+ state.gasPriceInUSD = gasPriceInUSD;
87
+ },
88
+
89
+ setLoading(loading: SendControllerState['loading']) {
90
+ state.loading = loading;
91
+ },
92
+
93
+ sendToken() {
94
+ if (this.state.token?.address && this.state.sendTokenAmount && this.state.receiverAddress) {
95
+ state.loading = true;
96
+ EventsController.sendEvent({
97
+ type: 'track',
98
+ event: 'SEND_INITIATED',
99
+ properties: {
100
+ isSmartAccount: AccountController.state.preferredAccountType === 'smartAccount',
101
+ token: this.state.token.address,
102
+ amount: this.state.sendTokenAmount,
103
+ network: NetworkController.state.caipNetwork?.id || ''
104
+ }
105
+ });
106
+ this.sendERC20Token({
107
+ receiverAddress: this.state.receiverAddress,
108
+ tokenAddress: this.state.token.address,
109
+ sendTokenAmount: this.state.sendTokenAmount,
110
+ decimals: this.state.token.quantity.decimals
111
+ });
112
+ } else if (
113
+ this.state.receiverAddress &&
114
+ this.state.sendTokenAmount &&
115
+ this.state.gasPrice &&
116
+ this.state.token?.quantity.decimals
117
+ ) {
118
+ state.loading = true;
119
+ EventsController.sendEvent({
120
+ type: 'track',
121
+ event: 'SEND_INITIATED',
122
+ properties: {
123
+ isSmartAccount: AccountController.state.preferredAccountType === 'smartAccount',
124
+ token: this.state.token?.symbol,
125
+ amount: this.state.sendTokenAmount,
126
+ network: NetworkController.state.caipNetwork?.id || ''
127
+ }
128
+ });
129
+ this.sendNativeToken({
130
+ receiverAddress: this.state.receiverAddress,
131
+ sendTokenAmount: this.state.sendTokenAmount,
132
+ gasPrice: this.state.gasPrice,
133
+ decimals: this.state.token.quantity.decimals
134
+ });
135
+ }
136
+ },
137
+
138
+ async sendNativeToken(params: TxParams) {
139
+ RouterController.pushTransactionStack({
140
+ view: 'Account',
141
+ goBack: false
142
+ });
143
+
144
+ const to = params.receiverAddress as `0x${string}`;
145
+ const address = AccountController.state.address as `0x${string}`;
146
+ const value = ConnectionController.parseUnits(
147
+ params.sendTokenAmount.toString(),
148
+ Number(params.decimals)
149
+ );
150
+ const data = '0x';
151
+
152
+ try {
153
+ await ConnectionController.sendTransaction({
154
+ to,
155
+ address,
156
+ data,
157
+ value,
158
+ gasPrice: params.gasPrice
159
+ });
160
+ SnackController.showSuccess('Transaction started');
161
+ EventsController.sendEvent({
162
+ type: 'track',
163
+ event: 'SEND_SUCCESS',
164
+ properties: {
165
+ isSmartAccount: AccountController.state.preferredAccountType === 'smartAccount',
166
+ token: this.state.token?.symbol || '',
167
+ amount: params.sendTokenAmount,
168
+ network: NetworkController.state.caipNetwork?.id || ''
169
+ }
170
+ });
171
+ this.resetSend();
172
+ } catch (error) {
173
+ state.loading = false;
174
+ EventsController.sendEvent({
175
+ type: 'track',
176
+ event: 'SEND_ERROR',
177
+ properties: {
178
+ isSmartAccount: AccountController.state.preferredAccountType === 'smartAccount',
179
+ token: this.state.token?.symbol || '',
180
+ amount: params.sendTokenAmount,
181
+ network: NetworkController.state.caipNetwork?.id || ''
182
+ }
183
+ });
184
+ SnackController.showError('Something went wrong');
185
+ }
186
+ },
187
+
188
+ async sendERC20Token(params: ContractWriteParams) {
189
+ RouterController.pushTransactionStack({
190
+ view: 'Account',
191
+ goBack: false
192
+ });
193
+
194
+ const amount = ConnectionController.parseUnits(
195
+ params.sendTokenAmount.toString(),
196
+ Number(params.decimals)
197
+ );
198
+
199
+ try {
200
+ if (
201
+ AccountController.state.address &&
202
+ params.sendTokenAmount &&
203
+ params.receiverAddress &&
204
+ params.tokenAddress
205
+ ) {
206
+ const tokenAddress = CoreHelperUtil.getPlainAddress(
207
+ params.tokenAddress as `${string}:${string}:${string}`
208
+ ) as `0x${string}`;
209
+ await ConnectionController.writeContract({
210
+ fromAddress: AccountController.state.address as `0x${string}`,
211
+ tokenAddress,
212
+ receiverAddress: params.receiverAddress as `0x${string}`,
213
+ tokenAmount: amount,
214
+ method: 'transfer',
215
+ abi: ContractUtil.getERC20Abi(tokenAddress)
216
+ });
217
+ SnackController.showSuccess('Transaction started');
218
+ this.resetSend();
219
+ }
220
+ } catch (error) {
221
+ state.loading = false;
222
+ SnackController.showError('Something went wrong');
223
+ }
224
+ },
225
+
226
+ resetSend() {
227
+ state.token = undefined;
228
+ state.sendTokenAmount = undefined;
229
+ state.receiverAddress = undefined;
230
+ state.receiverProfileImageUrl = undefined;
231
+ state.receiverProfileName = undefined;
232
+ state.loading = false;
233
+ }
234
+ };