@worldcoin/minikit-js 2.0.0-dev.0 → 2.0.0-dev.1

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.
@@ -34,11 +34,21 @@ __export(connector_exports, {
34
34
  });
35
35
  module.exports = __toCommonJS(connector_exports);
36
36
 
37
+ // src/commands/fallback-adapter-registry.ts
38
+ var FALLBACK_ADAPTER_KEY = "__minikit_fallback_adapter__";
39
+ function setFallbackAdapter(adapter) {
40
+ globalThis[FALLBACK_ADAPTER_KEY] = adapter;
41
+ }
42
+ function getFallbackAdapter() {
43
+ return globalThis[FALLBACK_ADAPTER_KEY];
44
+ }
45
+
37
46
  // src/commands/wagmi-fallback.ts
38
47
  var SIWE_NONCE_REGEX = /^[a-zA-Z0-9]{8,}$/;
39
48
  var WAGMI_KEY = "__minikit_wagmi_config__";
40
49
  function setWagmiConfig(config) {
41
50
  globalThis[WAGMI_KEY] = config;
51
+ registerWagmiFallbacks();
42
52
  }
43
53
  function getWagmiConfig() {
44
54
  return globalThis[WAGMI_KEY];
@@ -46,14 +56,70 @@ function getWagmiConfig() {
46
56
  function hasWagmiConfig() {
47
57
  return globalThis[WAGMI_KEY] !== void 0;
48
58
  }
59
+ function registerWagmiFallbacks() {
60
+ setFallbackAdapter({
61
+ walletAuth: wagmiWalletAuth,
62
+ signMessage: wagmiSignMessage,
63
+ signTypedData: wagmiSignTypedData,
64
+ sendTransaction: wagmiSendTransaction
65
+ });
66
+ }
67
+ async function loadWagmiActions() {
68
+ console.log("[MiniKit WagmiFallback] loadWagmiActions:start", {
69
+ hasWindow: typeof window !== "undefined",
70
+ hasWagmiConfig: hasWagmiConfig()
71
+ });
72
+ try {
73
+ const actions = await import(
74
+ /* webpackIgnore: true */
75
+ "wagmi/actions"
76
+ );
77
+ console.log("[MiniKit WagmiFallback] loadWagmiActions:success");
78
+ return actions;
79
+ } catch (error) {
80
+ console.log("[MiniKit WagmiFallback] loadWagmiActions:error", {
81
+ message: error instanceof Error ? error.message : String(error)
82
+ });
83
+ const wrappedError = new Error(
84
+ 'Wagmi fallback requires the "wagmi" package. Install wagmi or provide a custom fallback.'
85
+ );
86
+ wrappedError.cause = error;
87
+ throw wrappedError;
88
+ }
89
+ }
90
+ async function loadSiwe() {
91
+ try {
92
+ return await import(
93
+ /* webpackIgnore: true */
94
+ "siwe"
95
+ );
96
+ } catch (error) {
97
+ const wrappedError = new Error(
98
+ 'Wagmi walletAuth fallback requires the "siwe" package. Install siwe or provide a custom fallback.'
99
+ );
100
+ wrappedError.cause = error;
101
+ throw wrappedError;
102
+ }
103
+ }
104
+ async function checksumAddress(addr) {
105
+ try {
106
+ const { getAddress: getAddress2 } = await import(
107
+ /* webpackIgnore: true */
108
+ "viem"
109
+ );
110
+ return getAddress2(addr);
111
+ } catch {
112
+ return addr;
113
+ }
114
+ }
49
115
  async function ensureConnected(config) {
50
- const { connect, getConnections } = await import("wagmi/actions");
116
+ const { connect, getConnections } = await loadWagmiActions();
51
117
  const isWorldApp = typeof window !== "undefined" && Boolean(window.WorldApp);
52
118
  const existingConnection = getConnections(config).find(
53
119
  (connection) => connection.accounts && connection.accounts.length > 0 && (isWorldApp || connection.connector?.id !== "worldApp")
54
120
  );
55
121
  if (existingConnection && existingConnection.accounts) {
56
- return existingConnection.accounts[0];
122
+ return checksumAddress(existingConnection.accounts[0]);
57
123
  }
58
124
  const connectors = config.connectors;
59
125
  if (!connectors || connectors.length === 0) {
@@ -74,7 +140,7 @@ async function ensureConnected(config) {
74
140
  const account = result.accounts[0];
75
141
  const address = typeof account === "string" ? account : account.address;
76
142
  if (address) {
77
- return address;
143
+ return checksumAddress(address);
78
144
  }
79
145
  }
80
146
  } catch (error) {
@@ -88,14 +154,19 @@ async function ensureConnected(config) {
88
154
  throw new Error("Failed to connect wallet");
89
155
  }
90
156
  async function wagmiWalletAuth(params) {
157
+ console.log("[MiniKit WagmiFallback] walletAuth:start", {
158
+ hasWagmiConfig: hasWagmiConfig(),
159
+ nonceLength: params.nonce?.length ?? 0
160
+ });
91
161
  const config = getWagmiConfig();
92
162
  if (!config) {
163
+ console.log("[MiniKit WagmiFallback] walletAuth:error:no-config");
93
164
  throw new Error(
94
165
  "Wagmi config not available. Pass wagmiConfig to MiniKitProvider."
95
166
  );
96
167
  }
97
- const { signMessage: signMessage2 } = await import("wagmi/actions");
98
- const { SiweMessage } = await import("siwe");
168
+ const { signMessage: signMessage2 } = await loadWagmiActions();
169
+ const { SiweMessage } = await loadSiwe();
99
170
  const address = await ensureConnected(config);
100
171
  if (!SIWE_NONCE_REGEX.test(params.nonce)) {
101
172
  throw new Error(
@@ -122,13 +193,17 @@ async function wagmiWalletAuth(params) {
122
193
  };
123
194
  }
124
195
  async function wagmiSignMessage(params) {
196
+ console.log("[MiniKit WagmiFallback] signMessage:start", {
197
+ hasWagmiConfig: hasWagmiConfig()
198
+ });
125
199
  const config = getWagmiConfig();
126
200
  if (!config) {
201
+ console.log("[MiniKit WagmiFallback] signMessage:error:no-config");
127
202
  throw new Error(
128
203
  "Wagmi config not available. Pass wagmiConfig to MiniKitProvider."
129
204
  );
130
205
  }
131
- const { signMessage: signMessage2 } = await import("wagmi/actions");
206
+ const { signMessage: signMessage2 } = await loadWagmiActions();
132
207
  const address = await ensureConnected(config);
133
208
  const signature = await signMessage2(config, {
134
209
  account: address,
@@ -142,13 +217,18 @@ async function wagmiSignMessage(params) {
142
217
  };
143
218
  }
144
219
  async function wagmiSignTypedData(params) {
220
+ console.log("[MiniKit WagmiFallback] signTypedData:start", {
221
+ hasWagmiConfig: hasWagmiConfig(),
222
+ hasChainId: params.chainId !== void 0
223
+ });
145
224
  const config = getWagmiConfig();
146
225
  if (!config) {
226
+ console.log("[MiniKit WagmiFallback] signTypedData:error:no-config");
147
227
  throw new Error(
148
228
  "Wagmi config not available. Pass wagmiConfig to MiniKitProvider."
149
229
  );
150
230
  }
151
- const { getChainId, signTypedData: signTypedData2, switchChain } = await import("wagmi/actions");
231
+ const { getChainId, signTypedData: signTypedData2, switchChain } = await loadWagmiActions();
152
232
  const address = await ensureConnected(config);
153
233
  if (params.chainId !== void 0) {
154
234
  const currentChainId = await getChainId(config);
@@ -175,13 +255,19 @@ function isChainMismatchError(error) {
175
255
  return message.includes("does not match the target chain");
176
256
  }
177
257
  async function wagmiSendTransaction(params) {
258
+ console.log("[MiniKit WagmiFallback] sendTransaction:start", {
259
+ hasWagmiConfig: hasWagmiConfig(),
260
+ chainId: params.chainId,
261
+ hasData: Boolean(params.transaction.data)
262
+ });
178
263
  const config = getWagmiConfig();
179
264
  if (!config) {
265
+ console.log("[MiniKit WagmiFallback] sendTransaction:error:no-config");
180
266
  throw new Error(
181
267
  "Wagmi config not available. Pass wagmiConfig to MiniKitProvider."
182
268
  );
183
269
  }
184
- const { getChainId, getWalletClient, sendTransaction: sendTransaction2, switchChain } = await import("wagmi/actions");
270
+ const { getChainId, getWalletClient, sendTransaction: sendTransaction2, switchChain } = await loadWagmiActions();
185
271
  await ensureConnected(config);
186
272
  const targetChainId = params.chainId ?? config.chains?.[0]?.id;
187
273
  const ensureTargetChain = async () => {
@@ -224,9 +310,10 @@ async function wagmiSendTransaction(params) {
224
310
 
225
311
  // src/commands/types.ts
226
312
  var COMMAND_VERSIONS = {
313
+ ["attestation" /* Attestation */]: 1,
227
314
  ["pay" /* Pay */]: 1,
228
315
  ["wallet-auth" /* WalletAuth */]: 2,
229
- ["send-transaction" /* SendTransaction */]: 1,
316
+ ["send-transaction" /* SendTransaction */]: 2,
230
317
  ["sign-message" /* SignMessage */]: 1,
231
318
  ["sign-typed-data" /* SignTypedData */]: 1,
232
319
  ["share-contacts" /* ShareContacts */]: 1,
@@ -234,9 +321,11 @@ var COMMAND_VERSIONS = {
234
321
  ["get-permissions" /* GetPermissions */]: 1,
235
322
  ["send-haptic-feedback" /* SendHapticFeedback */]: 1,
236
323
  ["share" /* Share */]: 1,
237
- ["chat" /* Chat */]: 1
324
+ ["chat" /* Chat */]: 1,
325
+ ["close-miniapp" /* CloseMiniApp */]: 1
238
326
  };
239
327
  var commandAvailability = {
328
+ ["attestation" /* Attestation */]: false,
240
329
  ["pay" /* Pay */]: false,
241
330
  ["wallet-auth" /* WalletAuth */]: false,
242
331
  ["send-transaction" /* SendTransaction */]: false,
@@ -247,7 +336,8 @@ var commandAvailability = {
247
336
  ["get-permissions" /* GetPermissions */]: false,
248
337
  ["send-haptic-feedback" /* SendHapticFeedback */]: false,
249
338
  ["share" /* Share */]: false,
250
- ["chat" /* Chat */]: false
339
+ ["chat" /* Chat */]: false,
340
+ ["close-miniapp" /* CloseMiniApp */]: false
251
341
  };
252
342
  function isCommandAvailable(command) {
253
343
  return commandAvailability[command] ?? false;
@@ -319,6 +409,8 @@ var CommandUnavailableError = class extends Error {
319
409
  var EventManager = class {
320
410
  constructor() {
321
411
  this.listeners = {
412
+ ["miniapp-attestation" /* MiniAppAttestation */]: () => {
413
+ },
322
414
  ["miniapp-payment" /* MiniAppPayment */]: () => {
323
415
  },
324
416
  ["miniapp-wallet-auth" /* MiniAppWalletAuth */]: () => {
@@ -383,7 +475,7 @@ async function executeWithFallback(options) {
383
475
  console.warn(`Native ${command} failed, attempting fallback:`, error);
384
476
  }
385
477
  }
386
- if (!inWorldApp && wagmiFallback && hasWagmiConfig()) {
478
+ if (!inWorldApp && wagmiFallback) {
387
479
  try {
388
480
  const data = await wagmiFallback();
389
481
  return { data, executedWith: "wagmi" };
@@ -391,7 +483,7 @@ async function executeWithFallback(options) {
391
483
  console.warn(`Wagmi fallback for ${command} failed:`, error);
392
484
  }
393
485
  }
394
- if (customFallback) {
486
+ if (!inWorldApp && customFallback) {
395
487
  const data = await customFallback();
396
488
  return { data, executedWith: "fallback" };
397
489
  }
@@ -413,6 +505,67 @@ function determineFallbackReason(command) {
413
505
  return "commandNotSupported";
414
506
  }
415
507
 
508
+ // src/commands/attestation/types.ts
509
+ var AttestationError = class extends Error {
510
+ constructor(error_code) {
511
+ super(`Attestation failed: ${error_code}`);
512
+ this.error_code = error_code;
513
+ this.name = "AttestationError";
514
+ }
515
+ };
516
+
517
+ // src/commands/attestation/index.ts
518
+ async function attestation(options, ctx) {
519
+ const result = await executeWithFallback({
520
+ command: "attestation" /* Attestation */,
521
+ nativeExecutor: () => nativeAttestation(options, ctx),
522
+ customFallback: options.fallback
523
+ });
524
+ if (result.executedWith === "fallback") {
525
+ return { executedWith: "fallback", data: result.data };
526
+ }
527
+ return {
528
+ executedWith: "minikit",
529
+ data: result.data
530
+ };
531
+ }
532
+ async function nativeAttestation(options, ctx) {
533
+ if (!ctx) {
534
+ ctx = { events: new EventManager(), state: { deviceProperties: {} } };
535
+ }
536
+ if (typeof window === "undefined" || !isCommandAvailable("attestation" /* Attestation */)) {
537
+ throw new Error(
538
+ "'attestation' command is unavailable. Check MiniKit.install() or update the app version"
539
+ );
540
+ }
541
+ if (!options.requestHash || options.requestHash.length === 0) {
542
+ throw new Error("'attestation' command requires a non-empty requestHash");
543
+ }
544
+ const payload = await new Promise(
545
+ (resolve, reject) => {
546
+ try {
547
+ ctx.events.subscribe("miniapp-attestation" /* MiniAppAttestation */, (response) => {
548
+ ctx.events.unsubscribe("miniapp-attestation" /* MiniAppAttestation */);
549
+ resolve(response);
550
+ });
551
+ sendMiniKitEvent({
552
+ command: "attestation" /* Attestation */,
553
+ version: COMMAND_VERSIONS["attestation" /* Attestation */],
554
+ payload: {
555
+ request_hash: options.requestHash
556
+ }
557
+ });
558
+ } catch (error) {
559
+ reject(error);
560
+ }
561
+ }
562
+ );
563
+ if (payload.status === "error") {
564
+ throw new AttestationError(payload.error_code);
565
+ }
566
+ return payload;
567
+ }
568
+
416
569
  // src/commands/chat/types.ts
417
570
  var ChatError = class extends Error {
418
571
  constructor(error_code) {
@@ -474,6 +627,38 @@ async function nativeChat(options, ctx) {
474
627
  return payload;
475
628
  }
476
629
 
630
+ // src/commands/close-miniapp/index.ts
631
+ async function closeMiniApp(options = {}, _ctx) {
632
+ const result = await executeWithFallback({
633
+ command: "close-miniapp" /* CloseMiniApp */,
634
+ nativeExecutor: () => nativeCloseMiniApp(),
635
+ customFallback: options.fallback
636
+ });
637
+ if (result.executedWith === "fallback") {
638
+ return { executedWith: "fallback", data: result.data };
639
+ }
640
+ return {
641
+ executedWith: "minikit",
642
+ data: result.data
643
+ };
644
+ }
645
+ async function nativeCloseMiniApp() {
646
+ if (typeof window === "undefined" || !isCommandAvailable("close-miniapp" /* CloseMiniApp */)) {
647
+ throw new Error(
648
+ "'closeMiniApp' command is unavailable. Check MiniKit.install() or update the app version"
649
+ );
650
+ }
651
+ sendMiniKitEvent({
652
+ command: "close-miniapp" /* CloseMiniApp */,
653
+ version: COMMAND_VERSIONS["close-miniapp" /* CloseMiniApp */],
654
+ payload: {}
655
+ });
656
+ return {
657
+ status: "success",
658
+ version: COMMAND_VERSIONS["close-miniapp" /* CloseMiniApp */]
659
+ };
660
+ }
661
+
477
662
  // src/commands/get-permissions/types.ts
478
663
  var GetPermissionsError = class extends Error {
479
664
  constructor(error_code) {
@@ -742,9 +927,6 @@ async function nativeSendHapticFeedback(options, ctx) {
742
927
  return payload;
743
928
  }
744
929
 
745
- // src/commands/send-transaction/index.ts
746
- var import_viem = require("viem");
747
-
748
930
  // src/commands/send-transaction/types.ts
749
931
  var SendTransactionError = class extends Error {
750
932
  constructor(code, details) {
@@ -759,16 +941,6 @@ var SendTransactionError = class extends Error {
759
941
  var isValidHex = (str) => {
760
942
  return /^0x[0-9A-Fa-f]+$/.test(str);
761
943
  };
762
- var objectValuesToArrayRecursive = (input) => {
763
- if (input === null || typeof input !== "object") {
764
- return input;
765
- }
766
- if (Array.isArray(input)) {
767
- return input.map((item) => objectValuesToArrayRecursive(item));
768
- }
769
- const values = Object.values(input);
770
- return values.map((value) => objectValuesToArrayRecursive(value));
771
- };
772
944
  var processPayload = (payload) => {
773
945
  if (typeof payload === "boolean" || typeof payload === "string" || payload === null || payload === void 0) {
774
946
  return payload;
@@ -781,6 +953,20 @@ var processPayload = (payload) => {
781
953
  }
782
954
  if (typeof payload === "object") {
783
955
  const result = { ...payload };
956
+ if ("chainId" in result && result.chainId !== void 0) {
957
+ if (typeof result.chainId === "string") {
958
+ const parsed = Number(result.chainId);
959
+ if (Number.isFinite(parsed)) {
960
+ result.chainId = parsed;
961
+ }
962
+ } else if (typeof result.chainId === "bigint") {
963
+ const parsed = Number(result.chainId);
964
+ if (!Number.isSafeInteger(parsed)) {
965
+ throw new Error(`Invalid chainId: ${String(result.chainId)}`);
966
+ }
967
+ result.chainId = parsed;
968
+ }
969
+ }
784
970
  if ("value" in result && result.value !== void 0) {
785
971
  if (typeof result.value !== "string") {
786
972
  result.value = String(result.value);
@@ -797,6 +983,7 @@ var processPayload = (payload) => {
797
983
  }
798
984
  for (const key in result) {
799
985
  if (Object.prototype.hasOwnProperty.call(result, key)) {
986
+ if (key === "chainId") continue;
800
987
  result[key] = processPayload(result[key]);
801
988
  }
802
989
  }
@@ -805,37 +992,48 @@ var processPayload = (payload) => {
805
992
  return payload;
806
993
  };
807
994
  var validateSendTransactionPayload = (payload) => {
808
- if (payload.formatPayload) {
809
- const formattedPayload = processPayload(payload);
810
- formattedPayload.transaction = formattedPayload.transaction.map((tx) => {
811
- if ("args" in tx && tx.args !== void 0) {
812
- const args = objectValuesToArrayRecursive(tx.args);
813
- return {
814
- ...tx,
815
- args
816
- };
817
- }
818
- return tx;
819
- });
820
- return formattedPayload;
821
- }
822
- return payload;
995
+ return processPayload(payload);
823
996
  };
824
997
 
825
998
  // src/commands/send-transaction/index.ts
826
999
  var WORLD_CHAIN_ID = 480;
827
1000
  var WAGMI_MULTI_TX_ERROR_MESSAGE = "Wagmi fallback does not support multi-transaction execution. Pass a single transaction, run inside World App for batching, or provide a custom fallback.";
1001
+ function resolveChainId(options) {
1002
+ return options.chainId;
1003
+ }
1004
+ function resolveTransactions(options) {
1005
+ if (options.transactions.length === 0) {
1006
+ throw new SendTransactionError("input_error" /* InputError */, {
1007
+ reason: "At least one transaction is required. Use `transactions: [{ to, data, value }]`."
1008
+ });
1009
+ }
1010
+ return options.transactions;
1011
+ }
1012
+ function normalizeSendTransactionOptions(options) {
1013
+ const chainId = resolveChainId(options);
1014
+ if (chainId !== WORLD_CHAIN_ID) {
1015
+ throw new SendTransactionError("invalid_operation" /* InvalidOperation */, {
1016
+ reason: `World App only supports World Chain (chainId: ${WORLD_CHAIN_ID})`
1017
+ });
1018
+ }
1019
+ return {
1020
+ transactions: resolveTransactions(options),
1021
+ chainId
1022
+ };
1023
+ }
828
1024
  async function sendTransaction(options, ctx) {
829
- const isWagmiFallbackPath = !isInWorldApp() && hasWagmiConfig();
830
- if (isWagmiFallbackPath && options.transaction.length > 1 && !options.fallback) {
1025
+ const normalizedOptions = normalizeSendTransactionOptions(options);
1026
+ const fallbackAdapter = getFallbackAdapter();
1027
+ const isWagmiFallbackPath = !isInWorldApp() && Boolean(fallbackAdapter?.sendTransaction);
1028
+ if (isWagmiFallbackPath && normalizedOptions.transactions.length > 1 && !options.fallback) {
831
1029
  throw new SendTransactionError("invalid_operation" /* InvalidOperation */, {
832
1030
  reason: WAGMI_MULTI_TX_ERROR_MESSAGE
833
1031
  });
834
1032
  }
835
1033
  const result = await executeWithFallback({
836
1034
  command: "send-transaction" /* SendTransaction */,
837
- nativeExecutor: () => nativeSendTransaction(options, ctx),
838
- wagmiFallback: () => wagmiSendTransactionAdapter(options),
1035
+ nativeExecutor: () => nativeSendTransaction(normalizedOptions, ctx),
1036
+ wagmiFallback: fallbackAdapter?.sendTransaction ? () => adapterSendTransactionFallback(normalizedOptions) : void 0,
839
1037
  customFallback: options.fallback
840
1038
  });
841
1039
  if (result.executedWith === "fallback") {
@@ -861,15 +1059,22 @@ async function nativeSendTransaction(options, ctx) {
861
1059
  "'sendTransaction' command is unavailable. Check MiniKit.install() or update the app version"
862
1060
  );
863
1061
  }
864
- if (options.chainId !== void 0 && options.chainId !== WORLD_CHAIN_ID) {
1062
+ if (options.chainId !== WORLD_CHAIN_ID) {
865
1063
  throw new Error(
866
1064
  `World App only supports World Chain (chainId: ${WORLD_CHAIN_ID})`
867
1065
  );
868
1066
  }
1067
+ const commandInput = window.WorldApp?.supported_commands.find(
1068
+ (command) => command.name === "send-transaction" /* SendTransaction */
1069
+ );
1070
+ if (commandInput && !commandInput.supported_versions.includes(
1071
+ COMMAND_VERSIONS["send-transaction" /* SendTransaction */]
1072
+ )) {
1073
+ throw new CommandUnavailableError("send-transaction" /* SendTransaction */, "oldAppVersion");
1074
+ }
869
1075
  const input = {
870
- transaction: options.transaction,
871
- permit2: options.permit2,
872
- formatPayload: options.formatPayload !== false
1076
+ transactions: options.transactions,
1077
+ chainId: options.chainId
873
1078
  };
874
1079
  const validatedPayload = validateSendTransactionPayload(input);
875
1080
  const finalPayload = await new Promise(
@@ -895,71 +1100,43 @@ async function nativeSendTransaction(options, ctx) {
895
1100
  finalPayload.details
896
1101
  );
897
1102
  }
1103
+ const successPayload = finalPayload;
898
1104
  return {
899
- transactionHash: null,
900
- userOpHash: finalPayload.userOpHash ?? null,
901
- mini_app_id: finalPayload.mini_app_id ?? null,
1105
+ userOpHash: String(successPayload.userOpHash ?? ""),
902
1106
  status: finalPayload.status,
903
1107
  version: finalPayload.version,
904
- transactionId: finalPayload.transaction_id,
905
- reference: finalPayload.reference,
906
- from: finalPayload.from,
907
- chain: finalPayload.chain,
908
- timestamp: finalPayload.timestamp,
909
- // Deprecated aliases
910
- transaction_id: finalPayload.transaction_id,
911
- transaction_status: "submitted"
1108
+ from: String(successPayload.from ?? ""),
1109
+ timestamp: String(successPayload.timestamp ?? (/* @__PURE__ */ new Date()).toISOString())
912
1110
  };
913
1111
  }
914
- async function wagmiSendTransactionAdapter(options) {
915
- if (options.transaction.length > 1) {
1112
+ async function adapterSendTransactionFallback(options) {
1113
+ if (options.transactions.length > 1) {
916
1114
  throw new Error(WAGMI_MULTI_TX_ERROR_MESSAGE);
917
1115
  }
918
- if (options.permit2 && options.permit2.length > 0) {
919
- console.warn(
920
- "Permit2 signature is not automatically supported via Wagmi fallback. Transactions will execute without permit2."
921
- );
922
- }
923
- const transactions = options.transaction.map((tx) => ({
924
- address: tx.address,
925
- // Encode the function call data
926
- data: encodeTransactionData(tx),
927
- value: tx.value
928
- }));
929
- const firstTransaction = transactions[0];
1116
+ const firstTransaction = options.transactions[0];
930
1117
  if (!firstTransaction) {
931
1118
  throw new Error("At least one transaction is required");
932
1119
  }
933
- const result = await wagmiSendTransaction({
934
- transaction: firstTransaction,
1120
+ const fallbackAdapter = getFallbackAdapter();
1121
+ if (!fallbackAdapter?.sendTransaction) {
1122
+ throw new Error("Fallback adapter is not registered.");
1123
+ }
1124
+ const result = await fallbackAdapter.sendTransaction({
1125
+ transaction: {
1126
+ address: firstTransaction.to,
1127
+ data: firstTransaction.data,
1128
+ value: firstTransaction.value
1129
+ },
935
1130
  chainId: options.chainId
936
1131
  });
937
1132
  return {
938
- transactionHash: result.transactionHash,
939
- userOpHash: null,
940
- mini_app_id: null,
1133
+ userOpHash: result.transactionHash,
941
1134
  status: "success",
942
- version: 1,
943
- transactionId: null,
944
- reference: null,
945
- from: null,
946
- chain: null,
947
- timestamp: null
1135
+ version: COMMAND_VERSIONS["send-transaction" /* SendTransaction */],
1136
+ from: "",
1137
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
948
1138
  };
949
1139
  }
950
- function encodeTransactionData(tx) {
951
- if (tx.data) {
952
- return tx.data;
953
- }
954
- if (!tx.abi || !tx.functionName) {
955
- throw new Error("Transaction requires `data` or `abi` + `functionName`.");
956
- }
957
- return (0, import_viem.encodeFunctionData)({
958
- abi: tx.abi,
959
- functionName: tx.functionName,
960
- args: tx.args ?? []
961
- });
962
- }
963
1140
 
964
1141
  // src/commands/share/format.ts
965
1142
  var MAX_FILES = 10;
@@ -1178,12 +1355,13 @@ var SignMessageError = class extends Error {
1178
1355
 
1179
1356
  // src/commands/sign-message/index.ts
1180
1357
  async function signMessage(options, ctx) {
1358
+ const fallbackAdapter = getFallbackAdapter();
1181
1359
  const result = await executeWithFallback({
1182
1360
  command: "sign-message" /* SignMessage */,
1183
1361
  nativeExecutor: () => nativeSignMessage(options, ctx),
1184
- wagmiFallback: () => wagmiSignMessage({
1362
+ wagmiFallback: fallbackAdapter?.signMessage ? () => fallbackAdapter.signMessage({
1185
1363
  message: options.message
1186
- }),
1364
+ }) : void 0,
1187
1365
  customFallback: options.fallback
1188
1366
  });
1189
1367
  if (result.executedWith === "fallback") {
@@ -1243,16 +1421,17 @@ var SignTypedDataError = class extends Error {
1243
1421
 
1244
1422
  // src/commands/sign-typed-data/index.ts
1245
1423
  async function signTypedData(options, ctx) {
1424
+ const fallbackAdapter = getFallbackAdapter();
1246
1425
  const result = await executeWithFallback({
1247
1426
  command: "sign-typed-data" /* SignTypedData */,
1248
1427
  nativeExecutor: () => nativeSignTypedData(options, ctx),
1249
- wagmiFallback: () => wagmiSignTypedData({
1428
+ wagmiFallback: fallbackAdapter?.signTypedData ? () => fallbackAdapter.signTypedData({
1250
1429
  types: options.types,
1251
1430
  primaryType: options.primaryType,
1252
1431
  message: options.message,
1253
1432
  domain: options.domain,
1254
1433
  chainId: options.chainId
1255
- }),
1434
+ }) : void 0,
1256
1435
  customFallback: options.fallback
1257
1436
  });
1258
1437
  if (result.executedWith === "fallback") {
@@ -1309,7 +1488,7 @@ async function nativeSignTypedData(options, ctx) {
1309
1488
  }
1310
1489
 
1311
1490
  // src/commands/wallet-auth/siwe.ts
1312
- var import_viem2 = require("viem");
1491
+ var import_viem = require("viem");
1313
1492
  var import_chains = require("viem/chains");
1314
1493
  var generateSiweMessage = (siweMessageData) => {
1315
1494
  let siweMessage = "";
@@ -1399,14 +1578,15 @@ var validateWalletAuthCommandInput = (params) => {
1399
1578
 
1400
1579
  // src/commands/wallet-auth/index.ts
1401
1580
  async function walletAuth(options, ctx) {
1581
+ const fallbackAdapter = getFallbackAdapter();
1402
1582
  const result = await executeWithFallback({
1403
1583
  command: "wallet-auth" /* WalletAuth */,
1404
1584
  nativeExecutor: () => nativeWalletAuth(options, ctx),
1405
- wagmiFallback: () => wagmiWalletAuth({
1585
+ wagmiFallback: fallbackAdapter?.walletAuth ? () => fallbackAdapter.walletAuth({
1406
1586
  nonce: options.nonce,
1407
1587
  statement: options.statement,
1408
1588
  expirationTime: options.expirationTime
1409
- }),
1589
+ }) : void 0,
1410
1590
  customFallback: options.fallback
1411
1591
  });
1412
1592
  if (result.executedWith === "fallback") {
@@ -1660,11 +1840,10 @@ var _MiniKit = class _MiniKit {
1660
1840
  * ```typescript
1661
1841
  * const result = await MiniKit.sendTransaction({
1662
1842
  * chainId: 480,
1663
- * transaction: [{
1664
- * address: '0x...',
1665
- * abi: ContractABI,
1666
- * functionName: 'mint',
1667
- * args: [],
1843
+ * transactions: [{
1844
+ * to: '0x...',
1845
+ * data: '0x...',
1846
+ * value: '0x0',
1668
1847
  * }],
1669
1848
  * });
1670
1849
  * ```
@@ -1789,6 +1968,26 @@ var _MiniKit = class _MiniKit {
1789
1968
  }
1790
1969
  return sendHapticFeedback(options, this.getContext());
1791
1970
  }
1971
+ /**
1972
+ * Request app attestation token for a request hash
1973
+ */
1974
+ static attestation(options) {
1975
+ const active = this.getActiveMiniKit();
1976
+ if (active !== this) {
1977
+ return active.attestation(options);
1978
+ }
1979
+ return attestation(options, this.getContext());
1980
+ }
1981
+ /**
1982
+ * Close the mini app
1983
+ */
1984
+ static closeMiniApp(options = {}) {
1985
+ const active = this.getActiveMiniKit();
1986
+ if (active !== this) {
1987
+ return active.closeMiniApp(options);
1988
+ }
1989
+ return closeMiniApp(options, this.getContext());
1990
+ }
1792
1991
  // ============================================================================
1793
1992
  // Public State Accessors
1794
1993
  // ============================================================================
@@ -1967,6 +2166,8 @@ var _MiniKit = class _MiniKit {
1967
2166
  * - `MiniKit.commands.getPermissions()` → `await MiniKit.getPermissions()`
1968
2167
  * - `MiniKit.commands.requestPermission(payload)` → `await MiniKit.requestPermission(input)`
1969
2168
  * - `MiniKit.commands.sendHapticFeedback(payload)` → `await MiniKit.sendHapticFeedback(input)`
2169
+ * - `MiniKit.commands.attestation(payload)` → `await MiniKit.attestation(options)`
2170
+ * - `MiniKit.commands.closeMiniApp()` → `await MiniKit.closeMiniApp()`
1970
2171
  */
1971
2172
  static get commands() {
1972
2173
  throw new Error(
@@ -2054,13 +2255,18 @@ _MiniKit.showProfileCard = (username, walletAddress) => {
2054
2255
  var MiniKit = _MiniKit;
2055
2256
 
2056
2257
  // src/provider.ts
2258
+ var import_viem2 = require("viem");
2057
2259
  function _getAddress() {
2058
2260
  if (typeof window === "undefined") return void 0;
2059
2261
  return window.__worldapp_eip1193_address__;
2060
2262
  }
2061
2263
  function _setAddress(addr) {
2062
2264
  if (typeof window === "undefined") return;
2063
- window.__worldapp_eip1193_address__ = addr;
2265
+ try {
2266
+ window.__worldapp_eip1193_address__ = (0, import_viem2.getAddress)(addr);
2267
+ } catch {
2268
+ window.__worldapp_eip1193_address__ = addr;
2269
+ }
2064
2270
  }
2065
2271
  function _clearAddress() {
2066
2272
  if (typeof window === "undefined") return;
@@ -2184,16 +2390,19 @@ function createProvider() {
2184
2390
  }
2185
2391
  let authInFlight;
2186
2392
  async function doAuth() {
2187
- if (!MiniKit.isInWorldApp()) {
2188
- throw rpcError(4900, "World App provider only works inside World App");
2393
+ if (!MiniKit.isInWorldApp() || !MiniKit.isInstalled()) {
2394
+ throw rpcError(
2395
+ 4900,
2396
+ "World App provider only works inside World App and must be installed"
2397
+ );
2189
2398
  }
2190
2399
  try {
2191
2400
  const result = await MiniKit.walletAuth({
2192
2401
  nonce: crypto.randomUUID().replace(/-/g, ""),
2193
2402
  statement: "Sign in with World App"
2194
2403
  });
2195
- const addr = result.data.address;
2196
- _setAddress(addr);
2404
+ _setAddress(result.data.address);
2405
+ const addr = _getAddress();
2197
2406
  emit("accountsChanged", [addr]);
2198
2407
  return [addr];
2199
2408
  } catch (e) {
@@ -2263,18 +2472,21 @@ function createProvider() {
2263
2472
  }
2264
2473
  case "eth_sendTransaction": {
2265
2474
  const tx = extractTransactionParams(params);
2475
+ if (tx.chainId !== void 0 && tx.chainId !== 480) {
2476
+ throw rpcError(4902, "World App only supports World Chain (480)");
2477
+ }
2266
2478
  try {
2267
2479
  const result = await MiniKit.sendTransaction({
2268
- ...tx.chainId !== void 0 ? { chainId: tx.chainId } : {},
2269
- transaction: [
2480
+ chainId: tx.chainId ?? 480,
2481
+ transactions: [
2270
2482
  {
2271
- address: tx.to,
2483
+ to: tx.to,
2272
2484
  ...tx.data && tx.data !== "0x" ? { data: tx.data } : {},
2273
2485
  value: tx.value
2274
2486
  }
2275
2487
  ]
2276
2488
  });
2277
- return result.data.transactionId;
2489
+ return result.data.userOpHash;
2278
2490
  } catch (e) {
2279
2491
  throw rpcError(4001, `Send transaction failed: ${e.message}`);
2280
2492
  }
@@ -2352,7 +2564,8 @@ function createConnectorFn(name) {
2352
2564
  method: "eth_requestAccounts"
2353
2565
  });
2354
2566
  if (Array.isArray(accounts) && accounts.length > 0 && typeof accounts[0] === "string") {
2355
- return [accounts[0]];
2567
+ _setAddress(accounts[0]);
2568
+ return [_getAddress()];
2356
2569
  }
2357
2570
  } catch {
2358
2571
  }