@multiplatform.one/web3 7.31.1 → 7.32.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. package/README.md +63 -0
  2. package/dist/cjs/clients/evm.cjs +52 -1
  3. package/dist/cjs/clients/evm.native.js +56 -1
  4. package/dist/cjs/clients/evm.native.js.map +1 -1
  5. package/dist/cjs/clients/hooks.cjs +5 -2
  6. package/dist/cjs/clients/hooks.native.js +7 -2
  7. package/dist/cjs/clients/hooks.native.js.map +1 -1
  8. package/dist/cjs/clients/index.cjs +4 -0
  9. package/dist/cjs/clients/index.native.js +4 -0
  10. package/dist/cjs/clients/index.native.js.map +1 -1
  11. package/dist/cjs/clients/preparedSend.cjs +96 -0
  12. package/dist/cjs/clients/preparedSend.native.js +225 -0
  13. package/dist/cjs/clients/preparedSend.native.js.map +1 -0
  14. package/dist/cjs/connectkit/connectors/metaMaskConnectConnector.cjs +108 -27
  15. package/dist/cjs/connectkit/connectors/metaMaskConnectConnector.native.js +105 -28
  16. package/dist/cjs/connectkit/connectors/metaMaskConnectConnector.native.js.map +1 -1
  17. package/dist/cjs/connectkit/index.cjs +2 -0
  18. package/dist/cjs/connectkit/index.native.js +2 -0
  19. package/dist/cjs/connectkit/index.native.js.map +1 -1
  20. package/dist/cjs/connectkit/openConnector/context.cjs +16 -3
  21. package/dist/cjs/connectkit/openConnector/context.native.js +19 -4
  22. package/dist/cjs/connectkit/openConnector/context.native.js.map +1 -1
  23. package/dist/cjs/connectkit/openConnector/launcher.cjs +2 -2
  24. package/dist/cjs/connectkit/openConnector/launcher.native.js +2 -2
  25. package/dist/cjs/connectkit/openConnector/launcher.native.js.map +1 -1
  26. package/dist/cjs/wagmi/driver.cjs +13 -9
  27. package/dist/cjs/wagmi/driver.native.js +17 -9
  28. package/dist/cjs/wagmi/driver.native.js.map +1 -1
  29. package/dist/esm/clients/evm.mjs +53 -2
  30. package/dist/esm/clients/evm.mjs.map +1 -1
  31. package/dist/esm/clients/evm.native.js +57 -2
  32. package/dist/esm/clients/evm.native.js.map +1 -1
  33. package/dist/esm/clients/hooks.mjs +5 -2
  34. package/dist/esm/clients/hooks.mjs.map +1 -1
  35. package/dist/esm/clients/hooks.native.js +7 -2
  36. package/dist/esm/clients/hooks.native.js.map +1 -1
  37. package/dist/esm/clients/index.mjs +2 -1
  38. package/dist/esm/clients/index.mjs.map +1 -1
  39. package/dist/esm/clients/index.native.js +2 -1
  40. package/dist/esm/clients/index.native.js.map +1 -1
  41. package/dist/esm/clients/preparedSend.mjs +69 -0
  42. package/dist/esm/clients/preparedSend.mjs.map +1 -0
  43. package/dist/esm/clients/preparedSend.native.js +195 -0
  44. package/dist/esm/clients/preparedSend.native.js.map +1 -0
  45. package/dist/esm/connectkit/connectors/metaMaskConnectConnector.mjs +107 -28
  46. package/dist/esm/connectkit/connectors/metaMaskConnectConnector.mjs.map +1 -1
  47. package/dist/esm/connectkit/connectors/metaMaskConnectConnector.native.js +104 -29
  48. package/dist/esm/connectkit/connectors/metaMaskConnectConnector.native.js.map +1 -1
  49. package/dist/esm/connectkit/index.mjs +2 -2
  50. package/dist/esm/connectkit/index.mjs.map +1 -1
  51. package/dist/esm/connectkit/index.native.js +2 -2
  52. package/dist/esm/connectkit/index.native.js.map +1 -1
  53. package/dist/esm/connectkit/openConnector/context.mjs +17 -4
  54. package/dist/esm/connectkit/openConnector/context.mjs.map +1 -1
  55. package/dist/esm/connectkit/openConnector/context.native.js +20 -5
  56. package/dist/esm/connectkit/openConnector/context.native.js.map +1 -1
  57. package/dist/esm/connectkit/openConnector/launcher.mjs +2 -2
  58. package/dist/esm/connectkit/openConnector/launcher.mjs.map +1 -1
  59. package/dist/esm/connectkit/openConnector/launcher.native.js +2 -2
  60. package/dist/esm/connectkit/openConnector/launcher.native.js.map +1 -1
  61. package/dist/esm/wagmi/driver.mjs +14 -10
  62. package/dist/esm/wagmi/driver.mjs.map +1 -1
  63. package/dist/esm/wagmi/driver.native.js +18 -10
  64. package/dist/esm/wagmi/driver.native.js.map +1 -1
  65. package/dist/jsx/clients/evm.mjs +53 -2
  66. package/dist/jsx/clients/evm.mjs.map +1 -1
  67. package/dist/jsx/clients/evm.native.js +56 -1
  68. package/dist/jsx/clients/evm.native.js.map +1 -1
  69. package/dist/jsx/clients/hooks.mjs +5 -2
  70. package/dist/jsx/clients/hooks.mjs.map +1 -1
  71. package/dist/jsx/clients/hooks.native.js +7 -2
  72. package/dist/jsx/clients/hooks.native.js.map +1 -1
  73. package/dist/jsx/clients/index.mjs +2 -1
  74. package/dist/jsx/clients/index.mjs.map +1 -1
  75. package/dist/jsx/clients/index.native.js +4 -0
  76. package/dist/jsx/clients/index.native.js.map +1 -1
  77. package/dist/jsx/clients/preparedSend.mjs +69 -0
  78. package/dist/jsx/clients/preparedSend.mjs.map +1 -0
  79. package/dist/jsx/clients/preparedSend.native.js +225 -0
  80. package/dist/jsx/clients/preparedSend.native.js.map +1 -0
  81. package/dist/jsx/connectkit/connectors/metaMaskConnectConnector.mjs +107 -28
  82. package/dist/jsx/connectkit/connectors/metaMaskConnectConnector.mjs.map +1 -1
  83. package/dist/jsx/connectkit/connectors/metaMaskConnectConnector.native.js +105 -28
  84. package/dist/jsx/connectkit/connectors/metaMaskConnectConnector.native.js.map +1 -1
  85. package/dist/jsx/connectkit/index.mjs +2 -2
  86. package/dist/jsx/connectkit/index.mjs.map +1 -1
  87. package/dist/jsx/connectkit/index.native.js +2 -0
  88. package/dist/jsx/connectkit/index.native.js.map +1 -1
  89. package/dist/jsx/connectkit/openConnector/context.mjs +17 -4
  90. package/dist/jsx/connectkit/openConnector/context.mjs.map +1 -1
  91. package/dist/jsx/connectkit/openConnector/context.native.js +19 -4
  92. package/dist/jsx/connectkit/openConnector/context.native.js.map +1 -1
  93. package/dist/jsx/connectkit/openConnector/launcher.mjs +2 -2
  94. package/dist/jsx/connectkit/openConnector/launcher.mjs.map +1 -1
  95. package/dist/jsx/connectkit/openConnector/launcher.native.js +2 -2
  96. package/dist/jsx/connectkit/openConnector/launcher.native.js.map +1 -1
  97. package/dist/jsx/wagmi/driver.mjs +14 -10
  98. package/dist/jsx/wagmi/driver.mjs.map +1 -1
  99. package/dist/jsx/wagmi/driver.native.js +17 -9
  100. package/dist/jsx/wagmi/driver.native.js.map +1 -1
  101. package/dist/keycloak/login.iife.js +382 -382
  102. package/package.json +6 -6
  103. package/src/clients/evm.ts +86 -0
  104. package/src/clients/hooks.spec.tsx +1 -0
  105. package/src/clients/hooks.ts +4 -1
  106. package/src/clients/index.ts +12 -0
  107. package/src/clients/preparedSend.spec.ts +214 -0
  108. package/src/clients/preparedSend.ts +136 -0
  109. package/src/connectkit/connectors/metaMaskConnectConnector.spec.ts +256 -4
  110. package/src/connectkit/connectors/metaMaskConnectConnector.ts +145 -33
  111. package/src/connectkit/index.ts +2 -0
  112. package/src/connectkit/openConnector/context.tsx +10 -5
  113. package/src/connectkit/openConnector/launcher.spec.ts +24 -2
  114. package/src/connectkit/openConnector/launcher.ts +10 -3
  115. package/src/core/types.ts +7 -0
  116. package/src/wagmi/driver.spec.ts +31 -0
  117. package/src/wagmi/driver.ts +11 -4
  118. package/types/clients/evm.d.ts +32 -0
  119. package/types/clients/evm.d.ts.map +1 -1
  120. package/types/clients/hooks.d.ts.map +1 -1
  121. package/types/clients/index.d.ts +2 -1
  122. package/types/clients/index.d.ts.map +1 -1
  123. package/types/clients/preparedSend.d.ts +71 -0
  124. package/types/clients/preparedSend.d.ts.map +1 -0
  125. package/types/connectkit/connectors/metaMaskConnectConnector.d.ts +27 -0
  126. package/types/connectkit/connectors/metaMaskConnectConnector.d.ts.map +1 -1
  127. package/types/connectkit/index.d.ts +1 -1
  128. package/types/connectkit/index.d.ts.map +1 -1
  129. package/types/connectkit/openConnector/context.d.ts.map +1 -1
  130. package/types/connectkit/openConnector/launcher.d.ts +8 -1
  131. package/types/connectkit/openConnector/launcher.d.ts.map +1 -1
  132. package/types/core/types.d.ts +7 -0
  133. package/types/core/types.d.ts.map +1 -1
  134. package/types/wagmi/driver.d.ts +1 -1
  135. package/types/wagmi/driver.d.ts.map +1 -1
@@ -0,0 +1,225 @@
1
+ "use strict";
2
+
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __export = (target, all) => {
8
+ for (var name in all) __defProp(target, name, {
9
+ get: all[name],
10
+ enumerable: true
11
+ });
12
+ };
13
+ var __copyProps = (to, from, except, desc) => {
14
+ if (from && typeof from === "object" || typeof from === "function") {
15
+ for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
16
+ get: () => from[key],
17
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
18
+ });
19
+ }
20
+ return to;
21
+ };
22
+ var __toCommonJS = mod => __copyProps(__defProp({}, "__esModule", {
23
+ value: true
24
+ }), mod);
25
+ var preparedSend_exports = {};
26
+ __export(preparedSend_exports, {
27
+ DEFAULT_PREPARED_SEND_MAX_AGE_MS: () => DEFAULT_PREPARED_SEND_MAX_AGE_MS,
28
+ PreparedSendStaleError: () => PreparedSendStaleError,
29
+ prepareEvmSend: () => prepareEvmSend
30
+ });
31
+ module.exports = __toCommonJS(preparedSend_exports);
32
+ var import_viem = require("viem");
33
+ function _assert_this_initialized(self) {
34
+ if (self === void 0) {
35
+ throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
36
+ }
37
+ return self;
38
+ }
39
+ function _call_super(_this, derived, args) {
40
+ derived = _get_prototype_of(derived);
41
+ return _possible_constructor_return(_this, _is_native_reflect_construct() ? Reflect.construct(derived, args || [], _get_prototype_of(_this).constructor) : derived.apply(_this, args));
42
+ }
43
+ function _class_call_check(instance, Constructor) {
44
+ if (!(instance instanceof Constructor)) {
45
+ throw new TypeError("Cannot call a class as a function");
46
+ }
47
+ }
48
+ function _construct(Parent, args, Class) {
49
+ if (_is_native_reflect_construct()) {
50
+ _construct = Reflect.construct;
51
+ } else {
52
+ _construct = function construct(Parent2, args2, Class2) {
53
+ var a = [null];
54
+ a.push.apply(a, args2);
55
+ var Constructor = Function.bind.apply(Parent2, a);
56
+ var instance = new Constructor();
57
+ if (Class2) _set_prototype_of(instance, Class2.prototype);
58
+ return instance;
59
+ };
60
+ }
61
+ return _construct.apply(null, arguments);
62
+ }
63
+ function _define_property(obj, key, value) {
64
+ if (key in obj) {
65
+ Object.defineProperty(obj, key, {
66
+ value,
67
+ enumerable: true,
68
+ configurable: true,
69
+ writable: true
70
+ });
71
+ } else {
72
+ obj[key] = value;
73
+ }
74
+ return obj;
75
+ }
76
+ function _get_prototype_of(o) {
77
+ _get_prototype_of = Object.setPrototypeOf ? Object.getPrototypeOf : function getPrototypeOf(o2) {
78
+ return o2.__proto__ || Object.getPrototypeOf(o2);
79
+ };
80
+ return _get_prototype_of(o);
81
+ }
82
+ function _inherits(subClass, superClass) {
83
+ if (typeof superClass !== "function" && superClass !== null) {
84
+ throw new TypeError("Super expression must either be null or a function");
85
+ }
86
+ subClass.prototype = Object.create(superClass && superClass.prototype, {
87
+ constructor: {
88
+ value: subClass,
89
+ writable: true,
90
+ configurable: true
91
+ }
92
+ });
93
+ if (superClass) _set_prototype_of(subClass, superClass);
94
+ }
95
+ function _is_native_function(fn) {
96
+ return Function.toString.call(fn).indexOf("[native code]") !== -1;
97
+ }
98
+ function _possible_constructor_return(self, call) {
99
+ if (call && (_type_of(call) === "object" || typeof call === "function")) {
100
+ return call;
101
+ }
102
+ return _assert_this_initialized(self);
103
+ }
104
+ function _set_prototype_of(o, p) {
105
+ _set_prototype_of = Object.setPrototypeOf || function setPrototypeOf(o2, p2) {
106
+ o2.__proto__ = p2;
107
+ return o2;
108
+ };
109
+ return _set_prototype_of(o, p);
110
+ }
111
+ function _type_of(obj) {
112
+ "@swc/helpers - typeof";
113
+
114
+ return obj && typeof Symbol !== "undefined" && obj.constructor === Symbol ? "symbol" : typeof obj;
115
+ }
116
+ function _wrap_native_super(Class) {
117
+ var _cache = typeof Map === "function" ? /* @__PURE__ */new Map() : void 0;
118
+ _wrap_native_super = function wrapNativeSuper(Class2) {
119
+ if (Class2 === null || !_is_native_function(Class2)) return Class2;
120
+ if (typeof Class2 !== "function") {
121
+ throw new TypeError("Super expression must either be null or a function");
122
+ }
123
+ if (typeof _cache !== "undefined") {
124
+ if (_cache.has(Class2)) return _cache.get(Class2);
125
+ _cache.set(Class2, Wrapper);
126
+ }
127
+ function Wrapper() {
128
+ return _construct(Class2, arguments, _get_prototype_of(this).constructor);
129
+ }
130
+ Wrapper.prototype = Object.create(Class2.prototype, {
131
+ constructor: {
132
+ value: Wrapper,
133
+ enumerable: false,
134
+ writable: true,
135
+ configurable: true
136
+ }
137
+ });
138
+ return _set_prototype_of(Wrapper, Class2);
139
+ };
140
+ return _wrap_native_super(Class);
141
+ }
142
+ function _is_native_reflect_construct() {
143
+ try {
144
+ var result = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));
145
+ } catch (_) {}
146
+ return (_is_native_reflect_construct = function () {
147
+ return !!result;
148
+ })();
149
+ }
150
+ var PreparedSendStaleError = /* @__PURE__ */function (Error1) {
151
+ "use strict";
152
+
153
+ _inherits(PreparedSendStaleError2, Error1);
154
+ function PreparedSendStaleError2(reason, detail) {
155
+ _class_call_check(this, PreparedSendStaleError2);
156
+ var _this;
157
+ _this = _call_super(this, PreparedSendStaleError2, [`Prepared transaction is stale (${reason}): ${detail}. Prepare it again.`]), _define_property(_this, "reason", void 0);
158
+ _this.name = "PreparedSendStaleError";
159
+ _this.reason = reason;
160
+ return _this;
161
+ }
162
+ return PreparedSendStaleError2;
163
+ }(_wrap_native_super(Error));
164
+ var DEFAULT_PREPARED_SEND_MAX_AGE_MS = 6e4;
165
+ var same = function same2(a, b) {
166
+ return !!a && !!b && a.toLowerCase() === b.toLowerCase();
167
+ };
168
+ async function prepareEvmSend(parameters) {
169
+ var _parameters_maxAgeMs;
170
+ var {
171
+ publicClient,
172
+ request,
173
+ from,
174
+ chainId,
175
+ current
176
+ } = parameters;
177
+ var maxAgeMs = (_parameters_maxAgeMs = parameters.maxAgeMs) !== null && _parameters_maxAgeMs !== void 0 ? _parameters_maxAgeMs : DEFAULT_PREPARED_SEND_MAX_AGE_MS;
178
+ var prepared = await publicClient.prepareTransactionRequest({
179
+ account: from,
180
+ chain: publicClient.chain,
181
+ to: parameters.to,
182
+ ...(parameters.data ? {
183
+ data: parameters.data
184
+ } : {}),
185
+ ...(parameters.value !== void 0 ? {
186
+ value: parameters.value
187
+ } : {}),
188
+ ...(parameters.gas !== void 0 ? {
189
+ gas: parameters.gas
190
+ } : {}),
191
+ ...(parameters.nonce !== void 0 ? {
192
+ nonce: parameters.nonce
193
+ } : {}),
194
+ parameters: ["fees", "gas", "nonce", "type"]
195
+ });
196
+ var {
197
+ account: _account,
198
+ chain: _chain,
199
+ ...transaction
200
+ } = prepared;
201
+ var rpc = {
202
+ ...(0, import_viem.formatTransactionRequest)(transaction),
203
+ from,
204
+ chainId: (0, import_viem.numberToHex)(chainId)
205
+ };
206
+ var preparedAt = Date.now();
207
+ return Object.freeze({
208
+ request: Object.freeze(rpc),
209
+ from,
210
+ chainId,
211
+ preparedAt,
212
+ send() {
213
+ var age = Date.now() - preparedAt;
214
+ if (age > maxAgeMs) return Promise.reject(new PreparedSendStaleError("expired", `prepared ${age} ms ago, limit ${maxAgeMs} ms`));
215
+ var now = current === null || current === void 0 ? void 0 : current();
216
+ if ((now === null || now === void 0 ? void 0 : now.address) !== void 0 && !same(now.address, from)) return Promise.reject(new PreparedSendStaleError("account", `prepared for ${from}, wallet is on ${now.address}`));
217
+ if ((now === null || now === void 0 ? void 0 : now.chainId) !== void 0 && now.chainId !== chainId) return Promise.reject(new PreparedSendStaleError("chain", `prepared for ${chainId}, wallet is on ${now.chainId}`));
218
+ return request({
219
+ method: "eth_sendTransaction",
220
+ params: [rpc]
221
+ });
222
+ }
223
+ });
224
+ }
225
+ //# sourceMappingURL=preparedSend.native.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["__toCommonJS","mod","__copyProps","__defProp","value","preparedSend_exports","__export","DEFAULT_PREPARED_SEND_MAX_AGE_MS","PreparedSendStaleError","prepareEvmSend","module","exports","import_viem","require","_assert_this_initialized","self","ReferenceError","_call_super","_this","derived","args","_get_prototype_of","_possible_constructor_return","_is_native_reflect_construct","Reflect","construct","constructor","apply","_class_call_check","instance","Constructor","TypeError","_construct","Parent","Class","Parent2","args2","Class2","a","push","Function","bind","_set_prototype_of","prototype","arguments","_define_property","obj","key","Object","defineProperty","enumerable","configurable","writable","o","setPrototypeOf","getPrototypeOf","o2","__proto__","_inherits","subClass","superClass","create"],"sources":["../../../src/clients/preparedSend.ts"],"sourcesContent":[null],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,YAAA,GAAAC,GAAA,IAAAC,WAAA,CAAAC,SAAA;EAAAC,KAAA;AAAA,IAAAH,GAAA;AAAA,IAAAI,oBAAA;AAAAC,QAAA,CAAAD,oBAAA;EAAAE,gCAAA,EAAAA,CAAA,KAAAA,gCAAA;EAAAC,sBAAA,EAAAA,CAAA,KAAAA,sBAAA;EAAAC,cAAA,EAAAA,CAAA,KAAAA;AAAA;AAAAC,MAAA,CAAAC,OAAA,GAAAX,YAQO,CAAAK,oBAAA;AAkCA,IAAAO,WAAM,GAAAC,OAAA;AAAqC,SACvCC,yBAAAC,IAAA;EACT,IAAAA,IAAA,KAAY,QAAiC;IAC3C,MAAM,IAAAC,cAAA,4DAAyE;EAC/E;EACA,OAAKD,IAAA;AAAS;AAElB,SAAAE,YAAAC,KAAA,EAAAC,OAAA,EAAAC,IAAA;EAyBOD,OAAM,GAAAE,iBAAA,CAAAF,OAAA;EAEb,OAAMG,4BAAiD,CAAAJ,KAAE,EAAAK,4BAAgC,KAAAC,OAAA,CAAAC,SAAA,CAAAN,OAAA,EAAAC,IAAA,QAAAC,iBAAA,CAAAH,KAAA,EAAAQ,WAAA,IAAAP,OAAA,CAAAQ,KAAA,CAAAT,KAAA,EAAAE,IAAA;AAOzF;AAGE,SAAMQ,iBAAgBA,CAAAC,QAAS,EAAAC,WAAe;EAC9C,MAAMD,QAAA,YAAWC,WAAW,GAAY;IACxC,MAAM,IAAAC,SAAW,oCAAmB;EAA0B;AACnD;AACW,SAChBC,UAAWA,CAAAC,MAAA,EAAAb,IAAA,EAAAc,KAAA;EAAA,IACfX,4BAA8B;IAC9BS,UAAI,GAAAR,OAAW,CAAAC,SAAU;EAA2C,OAChE;IACJO,UAAI,YAAWP,SAAUA,CAAAU,OAAc,EAAAC,KAAO,EAAAC,MAAW;MACzD,IAAAC,CAAA,IACQ,KACV;MACAA,CAAA,CAAMC,IAAA,CAAAZ,KAAM,CAAAW,CAAA,EAAAF,KAAA;MACV,IAAAN,WAAG,GAAAU,QAAA,CAAAC,IAAA,CAAAd,KAAA,CAAAQ,OAAyB,EAAAG,CAAA;MAC5B,IAAAT,QAAA,OAAAC,WAAA;MACA,IAAAO,MAAA,EAASK,iBAAA,CAAAb,QAAY,EAAAQ,MAAO,CAAAM,SAAA;MAC9B,OAAAd,QAAA;IACA;EAEA;EAAqB,OACnBG,UAAS,CAAOL,KAAA,KAAU,EAAAiB,SAAA;AAAA;AAC1B,SACAC,iBAAAC,GAAA,EAAAC,GAAA,EAAA3C,KAAA;EAAA,IACA2C,GAAA,IAAAD,GAAA;IACAE,MAAA,CAAsBC,cAAA,CAAAH,GAAA,EAAAC,GAAA;MACpB3C,KAAA;MACA8C,UAAU;MACRC,YAAO,MAAQ;MAAAC,QACT;IAAgF;EAExF;IACAN,GAAA,CAAAC,GAAI,IAAK3C,KAAA;EACP;EAAe,OAAA0C,GACb;AAAI;AACF,SAAAzB,iBACAA,CAAAgC,CAAgB;EAAiChC,iBACnD,GAAA2B,MAAA,CAAAM,cAAA,GAAAN,MAAA,CAAAO,cAAA,YAAAA,eAAAC,EAAA;IAAA,OACFA,EAAA,CAAAC,SAAA,IAAAT,MAAA,CAAAO,cAAA,CAAAC,EAAA;EACF;EACE,OAAAnC,iBAAe,CAAAgC,CAAA;AAAA;AACT,SAAAK,SACFA,CAAAC,QAAA,EAAAC,UAAA;EAAA,WACAA,UAAA,KAAgB,UAAO,IAAAA,UAAA,KAAsB;IAAO,MACtD,IAAA7B,SAAA;EAAA;EAEJ4B,QAAA,CAAAhB,SAAO,GAAUK,MAAA,CAAAa,MAAQ,CAAAD,UAAA,IAAAA,UAAuB,CAAQjB,SAAO;IACjEjB,WAAA;MACDtB,KAAA,EAAAuD,QAAA;MACHP,QAAA","ignoreList":[]}
@@ -35,11 +35,14 @@ var metaMaskConnectConnector_exports = {};
35
35
  __export(metaMaskConnectConnector_exports, {
36
36
  metaMaskConnect: () => metaMaskConnect,
37
37
  metaMaskConnectChainIds: () => metaMaskConnectChainIds,
38
+ metaMaskMayLackChain: () => metaMaskMayLackChain,
38
39
  metaMaskNetworks: () => metaMaskNetworks,
39
40
  metaMaskSupportedNetworks: () => metaMaskSupportedNetworks,
41
+ reopenMetaMask: () => reopenMetaMask,
40
42
  resetMetaMaskConnectClient: () => resetMetaMaskConnectClient
41
43
  });
42
44
  module.exports = __toCommonJS(metaMaskConnectConnector_exports);
45
+ var import_connectkit = require("@multiplatform.one/connectkit");
43
46
  var import_wagmi = require("wagmi");
44
47
  var import_viem = require("viem");
45
48
  var import_chains = require("wagmi/chains");
@@ -93,6 +96,17 @@ function isUrl(value) {
93
96
  return false;
94
97
  }
95
98
  }
99
+ const metaMaskBuiltInTestnets = /* @__PURE__ */new Set([11155111, 59141, 10143, 6342, 6343]);
100
+ function metaMaskMayLackChain(chain) {
101
+ return chain.testnet === true && !metaMaskBuiltInTestnets.has(chain.id);
102
+ }
103
+ function isUnrecognizedChain(err) {
104
+ const {
105
+ code,
106
+ message
107
+ } = err ?? {};
108
+ return code === 4902 || typeof message === "string" && message.includes("Unrecognized chain");
109
+ }
96
110
  function metaMaskConnectChainIds(networks, chainId) {
97
111
  const ids = Object.keys(networks);
98
112
  if (!chainId || (0, import_syntheticChains.isSyntheticChainId)(chainId)) return ids;
@@ -101,6 +115,31 @@ function metaMaskConnectChainIds(networks, chainId) {
101
115
  }
102
116
  let client;
103
117
  let owner;
118
+ const permittedChains = /* @__PURE__ */new Set();
119
+ const unrecognizedChains = /* @__PURE__ */new Set();
120
+ let lastDeeplink;
121
+ function forgetChains() {
122
+ permittedChains.clear();
123
+ unrecognizedChains.clear();
124
+ lastDeeplink = void 0;
125
+ }
126
+ function reopenMetaMask() {
127
+ if (!lastDeeplink) return false;
128
+ lastDeeplink.open(lastDeeplink.url, "_self");
129
+ return true;
130
+ }
131
+ function recordingOpenLink(open) {
132
+ return (url, target) => {
133
+ lastDeeplink = {
134
+ url,
135
+ open
136
+ };
137
+ open(url, target);
138
+ };
139
+ }
140
+ function navigate(url) {
141
+ if (typeof window !== "undefined") window.location.href = url;
142
+ }
104
143
  function getClient(parameters, networks) {
105
144
  if (client) return client;
106
145
  client = import("@metamask/connect-evm").then(({
@@ -126,16 +165,19 @@ function getClient(parameters, networks) {
126
165
  headless: true
127
166
  }
128
167
  } : {}),
129
- ...(parameters.preferredOpenLink || parameters.useDeeplink !== void 0 ? {
130
- mobile: {
131
- ...(parameters.preferredOpenLink ? {
132
- preferredOpenLink: parameters.preferredOpenLink
133
- } : {}),
134
- ...(parameters.useDeeplink !== void 0 ? {
135
- useDeeplink: parameters.useDeeplink
136
- } : {})
137
- }
138
- } : {}),
168
+ mobile: {
169
+ // MetaMask Connect's own opener does the same location change for a
170
+ // metamask:// link; going through one here keeps the link to reopen.
171
+ // With useDeeplink false it clicks a universal link instead, left as is.
172
+ ...(parameters.preferredOpenLink ? {
173
+ preferredOpenLink: recordingOpenLink(parameters.preferredOpenLink)
174
+ } : parameters.useDeeplink === false ? {} : {
175
+ preferredOpenLink: recordingOpenLink(navigate)
176
+ }),
177
+ ...(parameters.useDeeplink !== void 0 ? {
178
+ useDeeplink: parameters.useDeeplink
179
+ } : {})
180
+ },
139
181
  eventHandlers: {
140
182
  // A session approved outside connect(), in another tab say. wagmi drops
141
183
  // `change` for a connector it has no connection for, so only `connect`
@@ -150,14 +192,23 @@ function getClient(parameters, networks) {
150
192
  });
151
193
  },
152
194
  accountsChanged: accounts => {
153
- if (accounts.length === 0) owner?.emit("disconnect");else owner?.emit("change", {
195
+ if (accounts.length === 0) {
196
+ forgetChains();
197
+ owner?.emit("disconnect");
198
+ } else owner?.emit("change", {
154
199
  accounts: accounts.map(a => (0, import_viem.getAddress)(a))
155
200
  });
156
201
  },
157
- chainChanged: chainId => owner?.emit("change", {
158
- chainId: Number(chainId)
159
- }),
160
- disconnect: () => owner?.emit("disconnect"),
202
+ chainChanged: chainId => {
203
+ permittedChains.add(Number(chainId));
204
+ owner?.emit("change", {
205
+ chainId: Number(chainId)
206
+ });
207
+ },
208
+ disconnect: () => {
209
+ forgetChains();
210
+ owner?.emit("disconnect");
211
+ },
161
212
  displayUri: uri => owner?.emit("message", {
162
213
  type: "display_uri",
163
214
  data: uri
@@ -172,6 +223,7 @@ function getClient(parameters, networks) {
172
223
  function resetMetaMaskConnectClient() {
173
224
  client = void 0;
174
225
  owner = void 0;
226
+ forgetChains();
175
227
  }
176
228
  function rethrow(err) {
177
229
  const code = err?.code;
@@ -186,6 +238,8 @@ function metaMaskConnect(parameters) {
186
238
  const networks = metaMaskNetworks(config.chains, config.transports);
187
239
  const supportedNetworks = metaMaskSupportedNetworks(networks, config.transports);
188
240
  const fallbackChainId = Number(Object.keys(networks)[0] ?? 1);
241
+ const mobile = parameters.mobile ?? (0, import_connectkit.isMobile)();
242
+ const addChainFirst = parameters.addChainFirst ?? metaMaskMayLackChain;
189
243
  const instance = () => getClient(parameters, supportedNetworks);
190
244
  let guarded;
191
245
  const claim = () => {
@@ -218,15 +272,18 @@ function metaMaskConnect(parameters) {
218
272
  });
219
273
  accounts = result.accounts.map(a => (0, import_viem.getAddress)(a));
220
274
  }
275
+ const current = chainIdOf(mm);
276
+ permittedChains.add(current);
221
277
  return {
222
278
  accounts,
223
- chainId: chainIdOf(mm)
279
+ chainId: current
224
280
  };
225
281
  } catch (err) {
226
282
  rethrow(err);
227
283
  }
228
284
  },
229
285
  async disconnect() {
286
+ forgetChains();
230
287
  await (await claim()).disconnect();
231
288
  },
232
289
  async getAccounts() {
@@ -257,22 +314,46 @@ function metaMaskConnect(parameters) {
257
314
  }) {
258
315
  const chain = config.chains.find(c => c.id === chainId);
259
316
  if (!chain || !networks[(0, import_viem.numberToHex)(chainId)]) throw new import_viem.SwitchChainError(new import_wagmi.ChainNotConfiguredError());
317
+ const chainConfiguration = {
318
+ chainId: (0, import_viem.numberToHex)(chainId),
319
+ chainName: addEthereumChainParameter?.chainName ?? chain.name,
320
+ nativeCurrency: addEthereumChainParameter?.nativeCurrency ?? chain.nativeCurrency,
321
+ rpcUrls: addEthereumChainParameter?.rpcUrls ? [...addEthereumChainParameter.rpcUrls] : [networks[(0, import_viem.numberToHex)(chainId)]],
322
+ ...(chain.blockExplorers?.default.url ? {
323
+ blockExplorerUrls: [chain.blockExplorers.default.url]
324
+ } : {})
325
+ };
326
+ const mm = await claim();
327
+ if (mm.getChainId() === (0, import_viem.numberToHex)(chainId)) return chain;
260
328
  try {
261
- await (await claim()).switchChain({
262
- chainId: (0, import_viem.numberToHex)(chainId),
263
- chainConfiguration: {
329
+ if (!mobile) {
330
+ await mm.switchChain({
264
331
  chainId: (0, import_viem.numberToHex)(chainId),
265
- chainName: addEthereumChainParameter?.chainName ?? chain.name,
266
- nativeCurrency: addEthereumChainParameter?.nativeCurrency ?? chain.nativeCurrency,
267
- rpcUrls: addEthereumChainParameter?.rpcUrls ? [...addEthereumChainParameter.rpcUrls] : [networks[(0, import_viem.numberToHex)(chainId)]],
268
- ...(chain.blockExplorers?.default.url ? {
269
- blockExplorerUrls: [chain.blockExplorers.default.url]
270
- } : {})
271
- }
272
- });
332
+ chainConfiguration
333
+ });
334
+ } else if (!permittedChains.has(chainId) && (unrecognizedChains.has(chainId) || addChainFirst(chain))) {
335
+ await mm.getProvider().request({
336
+ method: "wallet_addEthereumChain",
337
+ params: [chainConfiguration]
338
+ });
339
+ } else {
340
+ await mm.switchChain({
341
+ chainId: (0, import_viem.numberToHex)(chainId)
342
+ });
343
+ }
344
+ permittedChains.add(chainId);
345
+ unrecognizedChains.delete(chainId);
273
346
  return chain;
274
347
  } catch (err) {
275
348
  if (err?.code === import_viem.UserRejectedRequestError.code) throw new import_viem.UserRejectedRequestError(err);
349
+ if (mobile && isUnrecognizedChain(err)) {
350
+ unrecognizedChains.add(chainId);
351
+ throw new import_viem.SwitchChainError(Object.assign(new Error(`MetaMask does not have ${chain.name} yet. Switch again from a tap to add it.`, {
352
+ cause: err
353
+ }), {
354
+ code: 4902
355
+ }));
356
+ }
276
357
  throw new import_viem.SwitchChainError(err);
277
358
  }
278
359
  },
@@ -37,11 +37,14 @@ var metaMaskConnectConnector_exports = {};
37
37
  __export(metaMaskConnectConnector_exports, {
38
38
  metaMaskConnect: () => metaMaskConnect,
39
39
  metaMaskConnectChainIds: () => metaMaskConnectChainIds,
40
+ metaMaskMayLackChain: () => metaMaskMayLackChain,
40
41
  metaMaskNetworks: () => metaMaskNetworks,
41
42
  metaMaskSupportedNetworks: () => metaMaskSupportedNetworks,
43
+ reopenMetaMask: () => reopenMetaMask,
42
44
  resetMetaMaskConnectClient: () => resetMetaMaskConnectClient
43
45
  });
44
46
  module.exports = __toCommonJS(metaMaskConnectConnector_exports);
47
+ var import_connectkit = require("@multiplatform.one/connectkit");
45
48
  var import_wagmi = require("wagmi");
46
49
  var import_viem = require("viem");
47
50
  var import_chains = require("wagmi/chains");
@@ -117,6 +120,17 @@ function isUrl(value) {
117
120
  return false;
118
121
  }
119
122
  }
123
+ var metaMaskBuiltInTestnets = /* @__PURE__ */new Set([11155111, 59141, 10143, 6342, 6343]);
124
+ function metaMaskMayLackChain(chain) {
125
+ return chain.testnet === true && !metaMaskBuiltInTestnets.has(chain.id);
126
+ }
127
+ function isUnrecognizedChain(err) {
128
+ var {
129
+ code,
130
+ message
131
+ } = err !== null && err !== void 0 ? err : {};
132
+ return code === 4902 || typeof message === "string" && message.includes("Unrecognized chain");
133
+ }
120
134
  function metaMaskConnectChainIds(networks, chainId) {
121
135
  var ids = Object.keys(networks);
122
136
  if (!chainId || (0, import_syntheticChains.isSyntheticChainId)(chainId)) return ids;
@@ -127,6 +141,31 @@ function metaMaskConnectChainIds(networks, chainId) {
127
141
  }
128
142
  var client;
129
143
  var owner;
144
+ var permittedChains = /* @__PURE__ */new Set();
145
+ var unrecognizedChains = /* @__PURE__ */new Set();
146
+ var lastDeeplink;
147
+ function forgetChains() {
148
+ permittedChains.clear();
149
+ unrecognizedChains.clear();
150
+ lastDeeplink = void 0;
151
+ }
152
+ function reopenMetaMask() {
153
+ if (!lastDeeplink) return false;
154
+ lastDeeplink.open(lastDeeplink.url, "_self");
155
+ return true;
156
+ }
157
+ function recordingOpenLink(open) {
158
+ return function (url, target) {
159
+ lastDeeplink = {
160
+ url,
161
+ open
162
+ };
163
+ open(url, target);
164
+ };
165
+ }
166
+ function navigate(url) {
167
+ if (typeof window !== "undefined") window.location.href = url;
168
+ }
130
169
  function getClient(parameters, networks) {
131
170
  if (client) return client;
132
171
  client = import("@metamask/connect-evm").then(function (param) {
@@ -155,16 +194,19 @@ function getClient(parameters, networks) {
155
194
  headless: true
156
195
  }
157
196
  } : {}),
158
- ...(parameters.preferredOpenLink || parameters.useDeeplink !== void 0 ? {
159
- mobile: {
160
- ...(parameters.preferredOpenLink ? {
161
- preferredOpenLink: parameters.preferredOpenLink
162
- } : {}),
163
- ...(parameters.useDeeplink !== void 0 ? {
164
- useDeeplink: parameters.useDeeplink
165
- } : {})
166
- }
167
- } : {}),
197
+ mobile: {
198
+ // MetaMask Connect's own opener does the same location change for a
199
+ // metamask:// link; going through one here keeps the link to reopen.
200
+ // With useDeeplink false it clicks a universal link instead, left as is.
201
+ ...(parameters.preferredOpenLink ? {
202
+ preferredOpenLink: recordingOpenLink(parameters.preferredOpenLink)
203
+ } : parameters.useDeeplink === false ? {} : {
204
+ preferredOpenLink: recordingOpenLink(navigate)
205
+ }),
206
+ ...(parameters.useDeeplink !== void 0 ? {
207
+ useDeeplink: parameters.useDeeplink
208
+ } : {})
209
+ },
168
210
  eventHandlers: {
169
211
  // A session approved outside connect(), in another tab say. wagmi drops
170
212
  // `change` for a connector it has no connection for, so only `connect`
@@ -182,19 +224,24 @@ function getClient(parameters, networks) {
182
224
  });
183
225
  },
184
226
  accountsChanged: function accountsChanged(accounts) {
185
- if (accounts.length === 0) owner === null || owner === void 0 ? void 0 : owner.emit("disconnect");else owner === null || owner === void 0 ? void 0 : owner.emit("change", {
227
+ if (accounts.length === 0) {
228
+ forgetChains();
229
+ owner === null || owner === void 0 ? void 0 : owner.emit("disconnect");
230
+ } else owner === null || owner === void 0 ? void 0 : owner.emit("change", {
186
231
  accounts: accounts.map(function (a) {
187
232
  return (0, import_viem.getAddress)(a);
188
233
  })
189
234
  });
190
235
  },
191
236
  chainChanged: function chainChanged(chainId) {
192
- return owner === null || owner === void 0 ? void 0 : owner.emit("change", {
237
+ permittedChains.add(Number(chainId));
238
+ owner === null || owner === void 0 ? void 0 : owner.emit("change", {
193
239
  chainId: Number(chainId)
194
240
  });
195
241
  },
196
242
  disconnect: function disconnect() {
197
- return owner === null || owner === void 0 ? void 0 : owner.emit("disconnect");
243
+ forgetChains();
244
+ owner === null || owner === void 0 ? void 0 : owner.emit("disconnect");
198
245
  },
199
246
  displayUri: function displayUri(uri) {
200
247
  return owner === null || owner === void 0 ? void 0 : owner.emit("message", {
@@ -213,6 +260,7 @@ function getClient(parameters, networks) {
213
260
  function resetMetaMaskConnectClient() {
214
261
  client = void 0;
215
262
  owner = void 0;
263
+ forgetChains();
216
264
  }
217
265
  function rethrow(err) {
218
266
  var code = err === null || err === void 0 ? void 0 : err.code;
@@ -223,11 +271,13 @@ function rethrow(err) {
223
271
  metaMaskConnect.type = "metaMask";
224
272
  function metaMaskConnect(parameters) {
225
273
  return (0, import_wagmi.createConnector)(function (config) {
226
- var _Object_keys_;
274
+ var _Object_keys_, _parameters_mobile, _parameters_addChainFirst;
227
275
  owner !== null && owner !== void 0 ? owner : owner = config.emitter;
228
276
  var networks = metaMaskNetworks(config.chains, config.transports);
229
277
  var supportedNetworks = metaMaskSupportedNetworks(networks, config.transports);
230
278
  var fallbackChainId = Number((_Object_keys_ = Object.keys(networks)[0]) !== null && _Object_keys_ !== void 0 ? _Object_keys_ : 1);
279
+ var mobile = (_parameters_mobile = parameters.mobile) !== null && _parameters_mobile !== void 0 ? _parameters_mobile : (0, import_connectkit.isMobile)();
280
+ var addChainFirst = (_parameters_addChainFirst = parameters.addChainFirst) !== null && _parameters_addChainFirst !== void 0 ? _parameters_addChainFirst : metaMaskMayLackChain;
231
281
  var instance = function instance2() {
232
282
  return getClient(parameters, supportedNetworks);
233
283
  };
@@ -271,15 +321,18 @@ function metaMaskConnect(parameters) {
271
321
  return (0, import_viem.getAddress)(a);
272
322
  });
273
323
  }
324
+ var current = chainIdOf(mm);
325
+ permittedChains.add(current);
274
326
  return {
275
327
  accounts,
276
- chainId: chainIdOf(mm)
328
+ chainId: current
277
329
  };
278
330
  } catch (err) {
279
331
  rethrow(err);
280
332
  }
281
333
  },
282
334
  async disconnect() {
335
+ forgetChains();
283
336
  await (await claim()).disconnect();
284
337
  },
285
338
  async getAccounts() {
@@ -309,28 +362,52 @@ function metaMaskConnect(parameters) {
309
362
  addEthereumChainParameter,
310
363
  chainId
311
364
  } = param;
365
+ var _ref, _ref1;
366
+ var _chain_blockExplorers;
312
367
  var chain = config.chains.find(function (c) {
313
368
  return c.id === chainId;
314
369
  });
315
370
  if (!chain || !networks[(0, import_viem.numberToHex)(chainId)]) throw new import_viem.SwitchChainError(new import_wagmi.ChainNotConfiguredError());
371
+ var chainConfiguration = {
372
+ chainId: (0, import_viem.numberToHex)(chainId),
373
+ chainName: (_ref = addEthereumChainParameter === null || addEthereumChainParameter === void 0 ? void 0 : addEthereumChainParameter.chainName) !== null && _ref !== void 0 ? _ref : chain.name,
374
+ nativeCurrency: (_ref1 = addEthereumChainParameter === null || addEthereumChainParameter === void 0 ? void 0 : addEthereumChainParameter.nativeCurrency) !== null && _ref1 !== void 0 ? _ref1 : chain.nativeCurrency,
375
+ rpcUrls: (addEthereumChainParameter === null || addEthereumChainParameter === void 0 ? void 0 : addEthereumChainParameter.rpcUrls) ? [...addEthereumChainParameter.rpcUrls] : [networks[(0, import_viem.numberToHex)(chainId)]],
376
+ ...(((_chain_blockExplorers = chain.blockExplorers) === null || _chain_blockExplorers === void 0 ? void 0 : _chain_blockExplorers.default.url) ? {
377
+ blockExplorerUrls: [chain.blockExplorers.default.url]
378
+ } : {})
379
+ };
380
+ var mm = await claim();
381
+ if (mm.getChainId() === (0, import_viem.numberToHex)(chainId)) return chain;
316
382
  try {
317
- var _ref, _ref1;
318
- var _chain_blockExplorers;
319
- await (await claim()).switchChain({
320
- chainId: (0, import_viem.numberToHex)(chainId),
321
- chainConfiguration: {
383
+ if (!mobile) {
384
+ await mm.switchChain({
322
385
  chainId: (0, import_viem.numberToHex)(chainId),
323
- chainName: (_ref = addEthereumChainParameter === null || addEthereumChainParameter === void 0 ? void 0 : addEthereumChainParameter.chainName) !== null && _ref !== void 0 ? _ref : chain.name,
324
- nativeCurrency: (_ref1 = addEthereumChainParameter === null || addEthereumChainParameter === void 0 ? void 0 : addEthereumChainParameter.nativeCurrency) !== null && _ref1 !== void 0 ? _ref1 : chain.nativeCurrency,
325
- rpcUrls: (addEthereumChainParameter === null || addEthereumChainParameter === void 0 ? void 0 : addEthereumChainParameter.rpcUrls) ? [...addEthereumChainParameter.rpcUrls] : [networks[(0, import_viem.numberToHex)(chainId)]],
326
- ...(((_chain_blockExplorers = chain.blockExplorers) === null || _chain_blockExplorers === void 0 ? void 0 : _chain_blockExplorers.default.url) ? {
327
- blockExplorerUrls: [chain.blockExplorers.default.url]
328
- } : {})
329
- }
330
- });
386
+ chainConfiguration
387
+ });
388
+ } else if (!permittedChains.has(chainId) && (unrecognizedChains.has(chainId) || addChainFirst(chain))) {
389
+ await mm.getProvider().request({
390
+ method: "wallet_addEthereumChain",
391
+ params: [chainConfiguration]
392
+ });
393
+ } else {
394
+ await mm.switchChain({
395
+ chainId: (0, import_viem.numberToHex)(chainId)
396
+ });
397
+ }
398
+ permittedChains.add(chainId);
399
+ unrecognizedChains.delete(chainId);
331
400
  return chain;
332
401
  } catch (err) {
333
402
  if ((err === null || err === void 0 ? void 0 : err.code) === import_viem.UserRejectedRequestError.code) throw new import_viem.UserRejectedRequestError(err);
403
+ if (mobile && isUnrecognizedChain(err)) {
404
+ unrecognizedChains.add(chainId);
405
+ throw new import_viem.SwitchChainError(Object.assign(new Error(`MetaMask does not have ${chain.name} yet. Switch again from a tap to add it.`, {
406
+ cause: err
407
+ }), {
408
+ code: 4902
409
+ }));
410
+ }
334
411
  throw new import_viem.SwitchChainError(err);
335
412
  }
336
413
  },