@fastnear/api 0.3.0 → 0.4.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.
@@ -278,7 +278,7 @@ function parseJsonFromBytes(bytes) {
278
278
  }
279
279
  }
280
280
  function withBlockId(params, blockId) {
281
- return blockId === "final" || blockId === "optimistic" ? { ...params, finality: blockId } : !!blockId ? { ...params, block_id: blockId } : { ...params, finality: "optimistic" };
281
+ return blockId === "final" || blockId === "optimistic" ? { ...params, finality: blockId } : blockId ? { ...params, block_id: blockId } : { ...params, finality: "optimistic" };
282
282
  }
283
283
  async function queryRpc(method, params) {
284
284
  const response = await fetch(_config.nodeUrl, {
@@ -374,10 +374,10 @@ function convertUnit(s, ...args) {
374
374
  });
375
375
  }
376
376
  if (typeof s == "string") {
377
- let match = s.match(/([0-9.,_]+)\s*([a-zA-Z]+)?/);
377
+ const match = s.match(/([0-9.,_]+)\s*([a-zA-Z]+)?/);
378
378
  if (match) {
379
- let amount = match[1].replace(/[_,]/g, "");
380
- let unitPart = match[2];
379
+ const amount = match[1].replace(/[_,]/g, "");
380
+ const unitPart = match[2];
381
381
  if (unitPart) {
382
382
  switch (unitPart.toLowerCase()) {
383
383
  case "near":
@@ -387,9 +387,10 @@ function convertUnit(s, ...args) {
387
387
  case "ggas":
388
388
  return Big(amount).mul(Big(10).pow(9)).toFixed(0);
389
389
  case "gas":
390
+ case "yoctonear":
390
391
  return Big(amount).toFixed(0);
391
392
  default:
392
- throw new Error(`Unknown unit: ${unit}`);
393
+ throw new Error(`Unknown unit: ${unitPart}`);
393
394
  }
394
395
  } else {
395
396
  return Big(amount).toFixed(0);
@@ -440,7 +441,13 @@ var api = {
440
441
  return "SignedIn";
441
442
  },
442
443
  // Query Methods
443
- async view({ contractId, methodName, args, argsBase64, blockId }) {
444
+ async view({
445
+ contractId,
446
+ methodName,
447
+ args,
448
+ argsBase64,
449
+ blockId
450
+ }) {
444
451
  const encodedArgs = argsBase64 || (args ? toBase64(JSON.stringify(args)) : "");
445
452
  const result = await queryRpc(
446
453
  "query",
@@ -456,7 +463,10 @@ var api = {
456
463
  );
457
464
  return parseJsonFromBytes(result.result);
458
465
  },
459
- async account({ accountId, blockId }) {
466
+ async account({
467
+ accountId,
468
+ blockId
469
+ }) {
460
470
  return queryRpc(
461
471
  "query",
462
472
  withBlockId(
@@ -471,7 +481,11 @@ var api = {
471
481
  async block({ blockId }) {
472
482
  return queryRpc("block", withBlockId({}, blockId));
473
483
  },
474
- async accessKey({ accountId, publicKey, blockId }) {
484
+ async accessKey({
485
+ accountId,
486
+ publicKey,
487
+ blockId
488
+ }) {
475
489
  return queryRpc(
476
490
  "query",
477
491
  withBlockId(
@@ -491,7 +505,11 @@ var api = {
491
505
  return [..._txHistory];
492
506
  },
493
507
  // Transaction Methods
494
- async sendTx({ receiverId, actions, waitUntil }) {
508
+ async sendTx({
509
+ receiverId,
510
+ actions,
511
+ waitUntil
512
+ }) {
495
513
  const signerId = _state.accountId;
496
514
  if (!signerId) {
497
515
  throw new Error("Not signed in");
@@ -511,7 +529,7 @@ var api = {
511
529
  tx: jsonTransaction2,
512
530
  finalState: false
513
531
  });
514
- const url = new URL(window.location.href);
532
+ const url = new URL(typeof window !== "undefined" ? window.location.href : "");
515
533
  url.searchParams.set("txIds", txId);
516
534
  _adapter.sendTransactions({
517
535
  transactions: [jsonTransaction2],
@@ -520,16 +538,18 @@ var api = {
520
538
  console.log("Transaction result:", result);
521
539
  if (result.url) {
522
540
  console.log("Redirecting to wallet:", result.url);
523
- setTimeout(() => {
524
- window.location.href = result.url;
525
- }, 100);
541
+ if (typeof window !== "undefined") {
542
+ setTimeout(() => {
543
+ window.location.href = result.url;
544
+ }, 100);
545
+ }
526
546
  } else if (result.outcomes) {
527
- result.outcomes.forEach((result2) => {
547
+ result.outcomes.forEach((r) => {
528
548
  updateTxHistory({
529
549
  txId,
530
550
  status: "Executed",
531
- result: result2,
532
- txHash: result2.transaction.hash,
551
+ result: r,
552
+ txHash: r.transaction.hash,
533
553
  finalState: true
534
554
  });
535
555
  });
@@ -557,10 +577,11 @@ var api = {
557
577
  });
558
578
  return txId;
559
579
  }
560
- const toDoPromises = {};
561
580
  let nonce = lsGet("nonce");
581
+ let block = lsGet("block");
582
+ const toDoPromises = {};
562
583
  if (nonce === null || nonce === void 0) {
563
- toDoPromises.nonce = this.accessKey({
584
+ toDoPromises.nonce = api.accessKey({
564
585
  accountId: signerId,
565
586
  publicKey
566
587
  }).then((accessKey) => {
@@ -571,30 +592,30 @@ var api = {
571
592
  return accessKey.nonce;
572
593
  });
573
594
  }
574
- let block = lsGet("block");
575
- if (!block || parseFloat(block.header.timestamp_nanosec) / 1e6 + MaxBlockDelayMs < Date.now()) {
576
- toDoPromises.block = this.block({ blockId: "final" }).then((block2) => {
577
- block2 = {
595
+ if (!block || !block.header || parseFloat(block.header.timestamp_nanosec) / 1e6 + MaxBlockDelayMs < Date.now()) {
596
+ toDoPromises.block = api.block({ blockId: "final" }).then((b) => {
597
+ const newBlock = {
578
598
  header: {
579
- prev_hash: block2.header.prev_hash,
580
- timestamp_nanosec: block2.header.timestamp_nanosec
599
+ prev_hash: b.header.prev_hash,
600
+ timestamp_nanosec: b.header.timestamp_nanosec
581
601
  }
582
602
  };
583
- lsSet("block", block2);
584
- return block2;
603
+ lsSet("block", newBlock);
604
+ return newBlock;
585
605
  });
586
606
  }
587
607
  if (Object.keys(toDoPromises).length > 0) {
588
- let results = await Promise.all(Object.values(toDoPromises));
589
- for (let i = 0; i < results.length; i++) {
590
- if (Object.keys(toDoPromises)[i] === "nonce") {
591
- nonce = results[i];
592
- } else if (Object.keys(toDoPromises)[i] === "block") {
593
- block = results[i];
608
+ const results = await Promise.all(Object.values(toDoPromises));
609
+ const keys = Object.keys(toDoPromises);
610
+ results.forEach((res, i) => {
611
+ if (keys[i] === "nonce") {
612
+ nonce = res;
613
+ } else if (keys[i] === "block") {
614
+ block = res;
594
615
  }
595
- }
616
+ });
596
617
  }
597
- const newNonce = nonce + 1;
618
+ const newNonce = (nonce ?? 0) + 1;
598
619
  lsSet("nonce", newNonce);
599
620
  const blockHash = block.header.prev_hash;
600
621
  const jsonTransaction = {
@@ -609,11 +630,8 @@ var api = {
609
630
  const transaction = serializeTransaction(jsonTransaction);
610
631
  const txHash = toBase58(sha256(transaction));
611
632
  const signature = signHash(txHash, privateKey);
612
- const singedTransaction = serializeSignedTransaction(
613
- jsonTransaction,
614
- signature
615
- );
616
- const signedTxBase64 = toBase64(singedTransaction);
633
+ const signedTransaction = serializeSignedTransaction(jsonTransaction, signature);
634
+ const signedTxBase64 = toBase64(signedTransaction);
617
635
  updateTxHistory({
618
636
  status: "Pending",
619
637
  txId,
@@ -646,9 +664,11 @@ var api = {
646
664
  }
647
665
  if (result.url) {
648
666
  console.log("Redirecting to wallet:", result.url);
649
- setTimeout(() => {
650
- window.location.href = result.url;
651
- }, 100);
667
+ if (typeof window !== "undefined") {
668
+ setTimeout(() => {
669
+ window.location.href = result.url;
670
+ }, 100);
671
+ }
652
672
  } else if (result.accountId) {
653
673
  updateState({
654
674
  accountId: result.accountId
@@ -681,7 +701,13 @@ var api = {
681
701
  },
682
702
  // Action Helpers
683
703
  actions: {
684
- functionCall: ({ methodName, gas, deposit, args, argsBase64 }) => ({
704
+ functionCall: ({
705
+ methodName,
706
+ gas,
707
+ deposit,
708
+ args,
709
+ argsBase64
710
+ }) => ({
685
711
  type: "FunctionCall",
686
712
  methodName,
687
713
  args,
@@ -742,66 +768,68 @@ var api = {
742
768
  }
743
769
  };
744
770
  try {
745
- const url = new URL(window.location.href);
746
- const accountId = url.searchParams.get("account_id");
747
- const publicKey = url.searchParams.get("public_key");
748
- const errorCode = url.searchParams.get("errorCode");
749
- const errorMessage = url.searchParams.get("errorMessage");
750
- const transactionHashes = url.searchParams.get("transactionHashes");
751
- const txIds = url.searchParams.get("txIds");
752
- if (errorCode || errorMessage) {
753
- console.warn(new Error(`Wallet error: ${errorCode} ${errorMessage}`));
754
- }
755
- if (accountId && publicKey) {
756
- if (publicKey === _state.publicKey) {
757
- updateState({
758
- accountId
759
- });
760
- } else {
761
- console.error(
762
- new Error("Public key mismatch from wallet redirect"),
763
- publicKey,
764
- _state.publicKey
765
- );
771
+ if (typeof window !== "undefined") {
772
+ const url = new URL(window.location.href);
773
+ const accountId = url.searchParams.get("account_id");
774
+ const publicKey = url.searchParams.get("public_key");
775
+ const errorCode = url.searchParams.get("errorCode");
776
+ const errorMessage = url.searchParams.get("errorMessage");
777
+ const transactionHashes = url.searchParams.get("transactionHashes");
778
+ const txIds = url.searchParams.get("txIds");
779
+ if (errorCode || errorMessage) {
780
+ console.warn(new Error(`Wallet error: ${errorCode} ${errorMessage}`));
766
781
  }
767
- }
768
- if (transactionHashes || txIds) {
769
- const txHashes = transactionHashes ? transactionHashes.split(",") : [];
770
- const txIdsArray = txIds ? txIds.split(",") : [];
771
- if (txIdsArray.length > txHashes.length) {
772
- txIdsArray.forEach((txId, i) => {
773
- updateTxHistory({
774
- txId,
775
- status: "RejectedByUser",
776
- finalState: true
782
+ if (accountId && publicKey) {
783
+ if (publicKey === _state.publicKey) {
784
+ updateState({
785
+ accountId
777
786
  });
778
- });
779
- } else if (txIdsArray.length === txHashes.length) {
780
- txIdsArray.forEach((txId, i) => {
781
- updateTxHistory({
782
- txId,
783
- status: "PendingGotTxHash",
784
- txHash: txHashes[i],
785
- finalState: false
787
+ } else {
788
+ console.error(
789
+ new Error("Public key mismatch from wallet redirect"),
790
+ publicKey,
791
+ _state.publicKey
792
+ );
793
+ }
794
+ }
795
+ if (transactionHashes || txIds) {
796
+ const txHashes = transactionHashes ? transactionHashes.split(",") : [];
797
+ const txIdsArray = txIds ? txIds.split(",") : [];
798
+ if (txIdsArray.length > txHashes.length) {
799
+ txIdsArray.forEach((txId, i) => {
800
+ updateTxHistory({
801
+ txId,
802
+ status: "RejectedByUser",
803
+ finalState: true
804
+ });
786
805
  });
787
- afterTxSent(txId);
788
- });
789
- } else {
790
- console.error(
791
- new Error("Transaction hash mismatch from wallet redirect"),
792
- txIdsArray,
793
- txHashes
794
- );
806
+ } else if (txIdsArray.length === txHashes.length) {
807
+ txIdsArray.forEach((txId, i) => {
808
+ updateTxHistory({
809
+ txId,
810
+ status: "PendingGotTxHash",
811
+ txHash: txHashes[i],
812
+ finalState: false
813
+ });
814
+ afterTxSent(txId);
815
+ });
816
+ } else {
817
+ console.error(
818
+ new Error("Transaction hash mismatch from wallet redirect"),
819
+ txIdsArray,
820
+ txHashes
821
+ );
822
+ }
795
823
  }
824
+ url.searchParams.delete("account_id");
825
+ url.searchParams.delete("public_key");
826
+ url.searchParams.delete("errorCode");
827
+ url.searchParams.delete("errorMessage");
828
+ url.searchParams.delete("all_keys");
829
+ url.searchParams.delete("transactionHashes");
830
+ url.searchParams.delete("txIds");
831
+ window.history.replaceState({}, "", url.toString());
796
832
  }
797
- url.searchParams.delete("account_id");
798
- url.searchParams.delete("public_key");
799
- url.searchParams.delete("errorCode");
800
- url.searchParams.delete("errorMessage");
801
- url.searchParams.delete("all_keys");
802
- url.searchParams.delete("transactionHashes");
803
- url.searchParams.delete("txIds");
804
- window.history.replaceState({}, "", url.toString());
805
833
  } catch (e) {
806
834
  console.error("Error handling wallet redirect:", e);
807
835
  }
@@ -811,4 +839,4 @@ export {
811
839
  convertUnit,
812
840
  api
813
841
  };
814
- //# sourceMappingURL=chunk-B2HMQPYI.js.map
842
+ //# sourceMappingURL=chunk-OR3WITSY.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/near.ts", "../../../wallet-adapter/src/index.ts"],
4
+ "sourcesContent": ["import Big from \"big.js\";\nimport { WalletAdapter } from \"@fastnear/wallet-adapter\";\nimport * as cryptoUtils from \"./cryptoUtils.js\";\nimport {\n canSignWithLAK,\n fromBase58,\n fromBase64,\n lsGet,\n lsSet,\n toBase58,\n toBase64,\n tryParseJson,\n} from \"./utils\";\nimport {\n serializeSignedTransaction,\n serializeTransaction,\n} from \"./transaction\";\n\nBig.DP = 27;\n\n// Constants\nconst MaxBlockDelayMs = 1000 * 60 * 60 * 6; // 6 hours\n\n// const WIDGET_URL = \"https://wallet-adapter.fastnear.com\";\nconst WIDGET_URL = \"http://localhost:3000/\";\n\nconst DEFAULT_NETWORK_ID = \"mainnet\";\nconst NETWORKS = {\n testnet: {\n networkId: \"testnet\",\n nodeUrl: \"https://rpc.testnet.fastnear.com/\",\n },\n mainnet: {\n networkId: \"mainnet\",\n nodeUrl: \"https://rpc.mainnet.fastnear.com/\",\n },\n};\n\n// State\nlet _config = lsGet(\"config\") || { ...NETWORKS[DEFAULT_NETWORK_ID] };\n\nlet _state = lsGet(\"state\") || {};\ntry {\n _state.publicKey = _state.privateKey\n ? cryptoUtils.publicKeyFromPrivate(_state.privateKey)\n : null;\n} catch (e) {\n console.error(\"Error parsing private key:\", e);\n _state.privateKey = null;\n lsSet(\"nonce\", null);\n}\n\n// TODO: Store tx history in local storage more efficiently\nlet _txHistory = lsGet(\"txHistory\") || {};\nconst _eventListeners = {\n account: new Set(),\n tx: new Set(),\n};\nconst _unbroadcastedEvents = {\n account: [],\n tx: [],\n};\n\nfunction getWalletAdapterState() {\n return {\n publicKey: _state.publicKey,\n accountId: _state.accountId,\n lastWalletId: _state.lastWalletId,\n networkId: DEFAULT_NETWORK_ID,\n };\n}\nlet _adapter;\n\nfunction updateState(newState: Record<string, any>) {\n const oldState = _state;\n _state = { ..._state, ...newState };\n lsSet(\"state\", {\n accountId: _state.accountId,\n privateKey: _state.privateKey,\n lastWalletId: _state.lastWalletId,\n accessKeyContractId: _state.accessKeyContractId,\n });\n if (\n newState.hasOwnProperty(\"privateKey\") &&\n newState.privateKey !== oldState.privateKey\n ) {\n _state.publicKey = newState.privateKey\n ? cryptoUtils.publicKeyFromPrivate(newState.privateKey)\n : null;\n lsSet(\"nonce\", null);\n }\n if (newState.accountId !== oldState.accountId) {\n notifyAccountListeners(newState.accountId);\n }\n if (\n (newState.hasOwnProperty(\"lastWalletId\") &&\n newState.lastWalletId !== oldState.lastWalletId) ||\n (newState.hasOwnProperty(\"accountId\") &&\n newState.accountId !== oldState.accountId) ||\n (newState.hasOwnProperty(\"privateKey\") &&\n newState.privateKey !== oldState.privateKey)\n ) {\n _adapter.setState(getWalletAdapterState());\n }\n}\n\nfunction updateTxHistory(txStatus: Record<string, any>) {\n const txId = txStatus.txId;\n _txHistory[txId] = {\n ...(_txHistory[txId] ?? {}),\n ...txStatus,\n updateTimestamp: Date.now(),\n };\n lsSet(\"txHistory\", _txHistory);\n notifyTxListeners(_txHistory[txId]);\n}\n\nfunction onAdapterStateUpdate(state: Record<string, any>) {\n console.log(\"Adapter state update:\", state);\n const { accountId, lastWalletId, privateKey } = state;\n updateState({\n accountId,\n lastWalletId,\n ...(privateKey && { privateKey }),\n });\n}\n\n// Create adapter instance\n_adapter = new WalletAdapter({\n onStateUpdate: onAdapterStateUpdate,\n lastState: getWalletAdapterState(),\n widgetUrl: WIDGET_URL,\n});\n\n// Utils\nexport function parseJsonFromBytes(bytes: Uint8Array) {\n try {\n const decoder = new TextDecoder();\n return JSON.parse(decoder.decode(bytes instanceof Uint8Array ? bytes : new Uint8Array(bytes)));\n } catch (e) {\n try {\n return bytes instanceof Uint8Array ? bytes : new Uint8Array(bytes);\n } catch (e) {\n return bytes;\n }\n }\n}\n\nfunction withBlockId(params: Record<string, any>, blockId?: string) {\n return blockId === \"final\" || blockId === \"optimistic\"\n ? { ...params, finality: blockId }\n : blockId\n ? { ...params, block_id: blockId }\n : { ...params, finality: \"optimistic\" };\n}\n\nasync function queryRpc(method: string, params: Record<string, any> | any[]) {\n const response = await fetch(_config.nodeUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n jsonrpc: \"2.0\",\n id: `fastnear-${Date.now()}`,\n method,\n params,\n }),\n });\n\n const result = await response.json();\n if (result.error) {\n throw new Error(JSON.stringify(result.error));\n }\n return result.result;\n}\n\nfunction afterTxSent(txId: string) {\n queryRpc(\"tx\", {\n tx_hash: _txHistory[txId].txHash,\n sender_account_id: _txHistory[txId].tx.signerId,\n wait_until: \"EXECUTED_OPTIMISTIC\",\n })\n .then((result) => {\n const successValue = result?.status?.SuccessValue;\n updateTxHistory({\n txId,\n status: \"Executed\",\n result,\n successValue: successValue\n ? tryParseJson(fromBase64(successValue))\n : undefined,\n finalState: true,\n });\n })\n .catch((error) => {\n updateTxHistory({\n txId,\n status: \"ErrorAfterIncluded\",\n error: tryParseJson(error.message),\n finalState: true,\n });\n });\n}\n\nfunction sendTxToRpc(\n signedTxBase64: string,\n waitUntil: string | undefined,\n txId: string,\n) {\n queryRpc(\"send_tx\", {\n signed_tx_base64: signedTxBase64,\n wait_until: waitUntil ?? \"INCLUDED\",\n })\n .then((result) => {\n console.log(\"Transaction included:\", result);\n updateTxHistory({\n txId,\n status: \"Included\",\n finalState: false,\n });\n afterTxSent(txId);\n })\n .catch((error) => {\n updateTxHistory({\n txId,\n status: \"Error\",\n error: tryParseJson(error.message),\n finalState: false,\n });\n });\n}\n\n// Event Notifiers\nfunction notifyAccountListeners(accountId: string) {\n if (_eventListeners.account.size === 0) {\n _unbroadcastedEvents.account.push(accountId);\n return;\n }\n _eventListeners.account.forEach((callback: any) => {\n try {\n callback(accountId);\n } catch (e) {\n console.error(e);\n }\n });\n}\n\nfunction notifyTxListeners(tx: Record<string, any>) {\n if (_eventListeners.tx.size === 0) {\n _unbroadcastedEvents.tx.push(tx);\n return;\n }\n _eventListeners.tx.forEach((callback: any) => {\n try {\n callback(tx);\n } catch (e) {\n console.error(e);\n }\n });\n}\n\nfunction convertUnit(s: string | TemplateStringsArray, ...args: any[]): string {\n // Reconstruct raw string from template literal\n if (Array.isArray(s)) {\n s = s.reduce((acc, part, i) => {\n return acc + (args[i - 1] ?? \"\") + part;\n });\n }\n // Convert from `100 NEAR` into yoctoNear\n if (typeof s == \"string\") {\n const match = s.match(/([0-9.,_]+)\\s*([a-zA-Z]+)?/);\n if (match) {\n const amount = match[1].replace(/[_,]/g, \"\");\n const unitPart = match[2];\n if (unitPart) {\n switch (unitPart.toLowerCase()) {\n case \"near\":\n return Big(amount).mul(Big(10).pow(24)).toFixed(0);\n case \"tgas\":\n return Big(amount).mul(Big(10).pow(12)).toFixed(0);\n case \"ggas\":\n return Big(amount).mul(Big(10).pow(9)).toFixed(0);\n case \"gas\":\n case \"yoctonear\":\n return Big(amount).toFixed(0);\n default:\n throw new Error(`Unknown unit: ${unitPart}`);\n }\n } else {\n return Big(amount).toFixed(0);\n }\n }\n }\n return Big(s).toFixed(0);\n}\n\ninterface AccessKeyView {\n nonce: number;\n permission: any;\n}\n\n// Core API Implementation\nconst api = {\n // Context\n get accountId() {\n return _state.accountId;\n },\n\n get publicKey() {\n return _state.publicKey;\n },\n\n config(newConfig?: Record<string, any>) {\n if (newConfig) {\n if (newConfig.networkId && _config.networkId !== newConfig.networkId) {\n _config = { ...NETWORKS[newConfig.networkId] };\n updateState({\n accountId: null,\n privateKey: null,\n lastWalletId: null,\n });\n lsSet(\"block\", null);\n _txHistory = {};\n lsSet(\"txHistory\", _txHistory);\n }\n\n _config = { ..._config, ...newConfig };\n lsSet(\"config\", _config);\n }\n return _config;\n },\n\n get authStatus(): string | Record<string, any> {\n if (!_state.accountId) {\n return \"SignedOut\";\n }\n\n // Check for limited access key\n const accessKey = _state.publicKey;\n const contractId = _state.accessKeyContractId;\n if (accessKey && contractId && _state.privateKey) {\n return {\n type: \"SignedInWithLimitedAccessKey\",\n accessKey,\n contractId,\n };\n }\n return \"SignedIn\";\n },\n\n // Query Methods\n async view({\n contractId,\n methodName,\n args,\n argsBase64,\n blockId,\n }: {\n contractId: string;\n methodName: string;\n args?: any;\n argsBase64?: string;\n blockId?: string;\n }) {\n const encodedArgs =\n argsBase64 || (args ? toBase64(JSON.stringify(args)) : \"\");\n\n const result = await queryRpc(\n \"query\",\n withBlockId(\n {\n request_type: \"call_function\",\n account_id: contractId,\n method_name: methodName,\n args_base64: encodedArgs,\n },\n blockId,\n ),\n );\n\n return parseJsonFromBytes(result.result);\n },\n\n async account({\n accountId,\n blockId,\n }: {\n accountId: string;\n blockId?: string;\n }) {\n return queryRpc(\n \"query\",\n withBlockId(\n {\n request_type: \"view_account\",\n account_id: accountId,\n },\n blockId,\n ),\n );\n },\n\n async block({ blockId }: { blockId?: string }) {\n return queryRpc(\"block\", withBlockId({}, blockId));\n },\n\n async accessKey({\n accountId,\n publicKey,\n blockId,\n }: {\n accountId: string;\n publicKey: string;\n blockId?: string;\n }): Promise<AccessKeyView> {\n return queryRpc(\n \"query\",\n withBlockId(\n {\n request_type: \"view_access_key\",\n account_id: accountId,\n public_key: publicKey,\n },\n blockId,\n ),\n );\n },\n\n async tx({ txHash, accountId }: { txHash: string; accountId: string }) {\n return queryRpc(\"tx\", [txHash, accountId]);\n },\n\n localTxHistory() {\n return [..._txHistory];\n },\n\n // Transaction Methods\n async sendTx({\n receiverId,\n actions,\n waitUntil,\n }: {\n receiverId: string;\n actions: any[];\n waitUntil?: string;\n }) {\n const signerId = _state.accountId;\n if (!signerId) {\n throw new Error(\"Not signed in\");\n }\n\n const publicKey = _state.publicKey;\n const privateKey = _state.privateKey;\n const txId = `tx-${Date.now()}-${Math.random()}`;\n\n if (\n !privateKey ||\n receiverId !== _state.accessKeyContractId ||\n !canSignWithLAK(actions)\n ) {\n const jsonTransaction = {\n signerId,\n receiverId,\n actions,\n };\n\n updateTxHistory({\n status: \"Pending\",\n txId,\n tx: jsonTransaction,\n finalState: false,\n });\n\n const url = new URL(typeof window !== \"undefined\" ? window.location.href : \"\");\n url.searchParams.set(\"txIds\", txId);\n\n _adapter\n .sendTransactions({\n transactions: [jsonTransaction],\n callbackUrl: url.toString(),\n })\n .then((result: any) => {\n console.log(\"Transaction result:\", result);\n if (result.url) {\n console.log(\"Redirecting to wallet:\", result.url);\n if (typeof window !== \"undefined\") {\n setTimeout(() => {\n window.location.href = result.url;\n }, 100);\n }\n } else if (result.outcomes) {\n result.outcomes.forEach((r: any) => {\n updateTxHistory({\n txId,\n status: \"Executed\",\n result: r,\n txHash: r.transaction.hash,\n finalState: true,\n });\n });\n } else if (result.rejected) {\n updateTxHistory({\n txId,\n status: \"RejectedByUser\",\n finalState: true,\n });\n } else if (result.error) {\n updateTxHistory({\n txId,\n status: \"Error\",\n error: tryParseJson(result.error),\n finalState: true,\n });\n }\n })\n .catch((error: any) => {\n updateTxHistory({\n txId,\n status: \"Error\",\n error: tryParseJson(error.message),\n finalState: true,\n });\n });\n return txId;\n }\n\n let nonce: number | null = lsGet(\"nonce\") as any;\n let block: any = lsGet(\"block\") as any;\n const toDoPromises: Record<string, Promise<any>> = {};\n\n if (nonce === null || nonce === undefined) {\n toDoPromises.nonce = api.accessKey({\n accountId: signerId,\n publicKey,\n }).then((accessKey) => {\n if ((accessKey as any).error) {\n throw new Error(`Access key error: ${(accessKey as any).error}`);\n }\n lsSet(\"nonce\", accessKey.nonce);\n return accessKey.nonce;\n });\n }\n\n if (\n !block ||\n !block.header ||\n parseFloat(block.header.timestamp_nanosec) / 1e6 + MaxBlockDelayMs <\n Date.now()\n ) {\n toDoPromises.block = api.block({ blockId: \"final\" }).then((b: any) => {\n const newBlock = {\n header: {\n prev_hash: b.header.prev_hash,\n timestamp_nanosec: b.header.timestamp_nanosec,\n },\n };\n lsSet(\"block\", newBlock);\n return newBlock;\n });\n }\n\n if (Object.keys(toDoPromises).length > 0) {\n const results = await Promise.all(Object.values(toDoPromises));\n const keys = Object.keys(toDoPromises);\n results.forEach((res, i) => {\n if (keys[i] === \"nonce\") {\n nonce = res;\n } else if (keys[i] === \"block\") {\n block = res;\n }\n });\n }\n\n const newNonce = (nonce ?? 0) + 1;\n lsSet(\"nonce\", newNonce);\n const blockHash = block.header.prev_hash;\n\n const jsonTransaction = {\n signerId,\n publicKey,\n nonce: newNonce,\n receiverId,\n blockHash,\n actions,\n };\n\n console.log(\"Transaction:\", jsonTransaction);\n const transaction = serializeTransaction(jsonTransaction);\n const txHash = toBase58(cryptoUtils.sha256(transaction));\n const signature = cryptoUtils.signHash(txHash, privateKey);\n const signedTransaction = serializeSignedTransaction(jsonTransaction, signature);\n const signedTxBase64 = toBase64(signedTransaction);\n\n updateTxHistory({\n status: \"Pending\",\n txId,\n tx: jsonTransaction,\n signature,\n signedTxBase64,\n txHash,\n finalState: false,\n });\n\n sendTxToRpc(signedTxBase64, waitUntil, txId);\n\n return txId;\n },\n\n // Authentication Methods\n async requestSignIn({ contractId }: { contractId: string }) {\n const privateKey = cryptoUtils.privateKeyFromRandom();\n updateState({\n accessKeyContractId: contractId,\n accountId: null,\n privateKey,\n });\n const publicKey = cryptoUtils.publicKeyFromPrivate(privateKey);\n const result = await _adapter.signIn({\n networkId: _config.networkId,\n contractId,\n publicKey,\n });\n console.log(\"Sign in result:\", result);\n if (result.error) {\n throw new Error(`Wallet error: ${result.error}`);\n }\n if (result.url) {\n console.log(\"Redirecting to wallet:\", result.url);\n if (typeof window !== \"undefined\") {\n setTimeout(() => {\n window.location.href = result.url;\n }, 100);\n }\n } else if (result.accountId) {\n updateState({\n accountId: result.accountId,\n });\n }\n },\n\n signOut() {\n updateState({\n accountId: null,\n privateKey: null,\n contractId: null,\n });\n // TODO: Implement actual wallet integration\n },\n\n // Event Handlers\n onAccount(callback: (accountId: string) => void) {\n _eventListeners.account.add(callback);\n if (_unbroadcastedEvents.account.length > 0) {\n const events = _unbroadcastedEvents.account;\n _unbroadcastedEvents.account = [];\n events.forEach(notifyAccountListeners);\n }\n },\n\n onTx(callback: (tx: Record<string, any>) => void) {\n _eventListeners.tx.add(callback);\n if (_unbroadcastedEvents.tx.length > 0) {\n const events = _unbroadcastedEvents.tx;\n _unbroadcastedEvents.tx = [];\n events.forEach(notifyTxListeners);\n }\n },\n\n // Action Helpers\n actions: {\n functionCall: ({\n methodName,\n gas,\n deposit,\n args,\n argsBase64,\n }: {\n methodName: string;\n gas?: string;\n deposit?: string;\n args?: Record<string, any>;\n argsBase64?: string;\n }) => ({\n type: \"FunctionCall\",\n methodName,\n args,\n argsBase64,\n gas,\n deposit,\n }),\n\n transfer: (yoctoAmount: string) => ({\n type: \"Transfer\",\n deposit: yoctoAmount,\n }),\n\n stakeNEAR: ({ amount, publicKey }: { amount: string; publicKey: string }) => ({\n type: \"Stake\",\n stake: amount,\n publicKey,\n }),\n\n addFullAccessKey: ({ publicKey }: { publicKey: string }) => ({\n type: \"AddKey\",\n publicKey: publicKey,\n accessKey: { permission: \"FullAccess\" },\n }),\n\n addLimitedAccessKey: ({\n publicKey,\n allowance,\n accountId,\n methodNames,\n }: {\n publicKey: string;\n allowance: string;\n accountId: string;\n methodNames: string[];\n }) => ({\n type: \"AddKey\",\n publicKey: publicKey,\n accessKey: {\n permission: \"FunctionCall\",\n allowance,\n receiverId: accountId,\n methodNames,\n },\n }),\n\n deleteKey: ({ publicKey }: { publicKey: string }) => ({\n type: \"DeleteKey\",\n publicKey,\n }),\n\n deleteAccount: ({ beneficiaryId }: { beneficiaryId: string }) => ({\n type: \"DeleteAccount\",\n beneficiaryId,\n }),\n\n createAccount: () => ({\n type: \"CreateAccount\",\n }),\n\n deployContract: ({ codeBase64 }: { codeBase64: string }) => ({\n type: \"DeployContract\",\n codeBase64,\n }),\n },\n\n utils: {\n toBase64,\n fromBase64,\n toBase58,\n fromBase58,\n },\n};\n\n// Handle wallet redirect if applicable\ntry {\n if (typeof window !== \"undefined\") {\n const url = new URL(window.location.href);\n const accountId = url.searchParams.get(\"account_id\");\n const publicKey = url.searchParams.get(\"public_key\");\n const errorCode = url.searchParams.get(\"errorCode\");\n const errorMessage = url.searchParams.get(\"errorMessage\");\n const transactionHashes = url.searchParams.get(\"transactionHashes\");\n const txIds = url.searchParams.get(\"txIds\");\n\n if (errorCode || errorMessage) {\n console.warn(new Error(`Wallet error: ${errorCode} ${errorMessage}`));\n }\n\n if (accountId && publicKey) {\n if (publicKey === _state.publicKey) {\n updateState({\n accountId,\n });\n } else {\n console.error(\n new Error(\"Public key mismatch from wallet redirect\"),\n publicKey,\n _state.publicKey,\n );\n }\n }\n\n if (transactionHashes || txIds) {\n const txHashes = transactionHashes ? transactionHashes.split(\",\") : [];\n const txIdsArray = txIds ? txIds.split(\",\") : [];\n if (txIdsArray.length > txHashes.length) {\n txIdsArray.forEach((txId, i) => {\n updateTxHistory({\n txId,\n status: \"RejectedByUser\",\n finalState: true,\n });\n });\n } else if (txIdsArray.length === txHashes.length) {\n txIdsArray.forEach((txId, i) => {\n updateTxHistory({\n txId,\n status: \"PendingGotTxHash\",\n txHash: txHashes[i],\n finalState: false,\n });\n afterTxSent(txId);\n });\n } else {\n console.error(\n new Error(\"Transaction hash mismatch from wallet redirect\"),\n txIdsArray,\n txHashes,\n );\n }\n }\n\n // Remove wallet parameters from the URL\n url.searchParams.delete(\"account_id\");\n url.searchParams.delete(\"public_key\");\n url.searchParams.delete(\"errorCode\");\n url.searchParams.delete(\"errorMessage\");\n url.searchParams.delete(\"all_keys\");\n url.searchParams.delete(\"transactionHashes\");\n url.searchParams.delete(\"txIds\");\n window.history.replaceState({}, \"\", url.toString());\n }\n} catch (e) {\n console.error(\"Error handling wallet redirect:\", e);\n}\n\nexport { api, convertUnit };\n\n// import Big from \"big.js\";\n// import { WalletAdapter } from \"@fastnear/wallet-adapter\";\n// import * as cryptoUtils from \"./cryptoUtils.js\";\n// import {\n// canSignWithLAK,\n// fromBase58,\n// fromBase64,\n// lsGet,\n// lsSet,\n// toBase58,\n// toBase64,\n// tryParseJson,\n// } from \"./utils\";\n// import {\n// serializeSignedTransaction,\n// serializeTransaction,\n// } from \"./transaction\";\n//\n// Big.DP = 27;\n//\n// // Constants\n// const MaxBlockDelayMs = 1000 * 60 * 60 * 6; // 6 hours\n//\n// // const WIDGET_URL = \"https://wallet-adapter.fastnear.com\";\n// const WIDGET_URL = \"http://localhost:3000/\";\n//\n// const DEFAULT_NETWORK_ID = \"mainnet\";\n// const NETWORKS = {\n// testnet: {\n// networkId: \"testnet\",\n// nodeUrl: \"https://rpc.testnet.fastnear.com/\",\n// },\n// mainnet: {\n// networkId: \"mainnet\",\n// nodeUrl: \"https://rpc.mainnet.fastnear.com/\",\n// },\n// };\n//\n// // State\n// let _config = lsGet(\"config\") || { ...NETWORKS[DEFAULT_NETWORK_ID] };\n//\n// let _state = lsGet(\"state\") || {};\n// try {\n// _state.publicKey = _state.privateKey\n// ? cryptoUtils.publicKeyFromPrivate(_state.privateKey)\n// : null;\n// } catch (e) {\n// console.error(\"Error parsing private key:\", e);\n// _state.privateKey = null;\n// lsSet(\"nonce\", null);\n// }\n//\n// // TODO: Store tx history in local storage more efficiently\n// let _txHistory = lsGet(\"txHistory\") || {};\n// const _eventListeners = {\n// account: new Set(),\n// tx: new Set(),\n// };\n// const _unbroadcastedEvents = {\n// account: [],\n// tx: [],\n// };\n//\n// function getWalletAdapterState() {\n// return {\n// publicKey: _state.publicKey,\n// accountId: _state.accountId,\n// lastWalletId: _state.lastWalletId,\n// networkId: DEFAULT_NETWORK_ID,\n// };\n// }\n// let _adapter;\n//\n// function updateState(newState) {\n// const oldState = _state;\n// _state = { ..._state, ...newState };\n// lsSet(\"state\", {\n// accountId: _state.accountId,\n// privateKey: _state.privateKey,\n// lastWalletId: _state.lastWalletId,\n// accessKeyContractId: _state.accessKeyContractId,\n// });\n// if (\n// newState.hasOwnProperty(\"privateKey\") &&\n// newState.privateKey !== oldState.privateKey\n// ) {\n// _state.publicKey = newState.privateKey\n// ? cryptoUtils.publicKeyFromPrivate(newState.privateKey)\n// : null;\n// lsSet(\"nonce\", null);\n// }\n// if (newState.accountId !== oldState.accountId) {\n// notifyAccountListeners(newState.accountId);\n// }\n// if (\n// (newState.hasOwnProperty(\"lastWalletId\") &&\n// newState.lastWalletId !== oldState.lastWalletId) ||\n// (newState.hasOwnProperty(\"accountId\") &&\n// newState.accountId !== oldState.accountId) ||\n// (newState.hasOwnProperty(\"privateKey\") &&\n// newState.privateKey !== oldState.privateKey)\n// ) {\n// _adapter.setState(getWalletAdapterState());\n// }\n// }\n//\n// function updateTxHistory(txStatus) {\n// const txId = txStatus.txId;\n// _txHistory[txId] = {\n// ...(_txHistory[txId] ?? {}),\n// ...txStatus,\n// updateTimestamp: Date.now(),\n// };\n// lsSet(\"txHistory\", _txHistory);\n// notifyTxListeners(_txHistory[txId]);\n// }\n//\n// function onAdapterStateUpdate(state) {\n// console.log(\"Adapter state update:\", state);\n// const { accountId, lastWalletId, privateKey } = state;\n// updateState({\n// accountId,\n// lastWalletId,\n// ...(privateKey && { privateKey }),\n// });\n// }\n//\n// // Create adapter instance\n// _adapter = new WalletAdapter({\n// onStateUpdate: onAdapterStateUpdate,\n// lastState: getWalletAdapterState(),\n// widgetUrl: WIDGET_URL,\n// });\n//\n// // Utils\n// export function parseJsonFromBytes(bytes: Uint8Array) {\n// try {\n// const decoder = new TextDecoder();\n// return JSON.parse(decoder.decode(bytes instanceof Uint8Array ? bytes : new Uint8Array(bytes)));\n// } catch (e) {\n// try {\n// return bytes instanceof Uint8Array ? bytes : new Uint8Array(bytes);\n// } catch (e) {\n// return bytes;\n// }\n// }\n// }\n//\n// function withBlockId(params, blockId) {\n// return blockId === \"final\" || blockId === \"optimistic\"\n// ? { ...params, finality: blockId }\n// : !!blockId\n// ? { ...params, block_id: blockId }\n// : { ...params, finality: \"optimistic\" };\n// }\n//\n// async function queryRpc(method, params) {\n// const response = await fetch(_config.nodeUrl, {\n// method: \"POST\",\n// headers: { \"Content-Type\": \"application/json\" },\n// body: JSON.stringify({\n// jsonrpc: \"2.0\",\n// id: `fastnear-${Date.now()}`,\n// method,\n// params,\n// }),\n// });\n//\n// const result = await response.json();\n// if (result.error) {\n// throw new Error(JSON.stringify(result.error));\n// }\n// return result.result;\n// }\n//\n// function afterTxSent(txId) {\n// queryRpc(\"tx\", {\n// tx_hash: _txHistory[txId].txHash,\n// sender_account_id: _txHistory[txId].tx.signerId,\n// wait_until: \"EXECUTED_OPTIMISTIC\",\n// })\n// .then((result) => {\n// const successValue = result?.status?.SuccessValue;\n// updateTxHistory({\n// txId,\n// status: \"Executed\",\n// result,\n// successValue: successValue\n// ? tryParseJson(fromBase64(successValue))\n// : undefined,\n// finalState: true,\n// });\n// })\n// .catch((error) => {\n// updateTxHistory({\n// txId,\n// status: \"ErrorAfterIncluded\",\n// error: tryParseJson(error.message),\n// finalState: true,\n// });\n// });\n// }\n//\n// function sendTxToRpc(signedTxBase64, waitUntil, txId) {\n// queryRpc(\"send_tx\", {\n// signed_tx_base64: signedTxBase64,\n// wait_until: waitUntil ?? \"INCLUDED\",\n// })\n// .then((result) => {\n// console.log(\"Transaction included:\", result);\n// updateTxHistory({\n// txId,\n// status: \"Included\",\n// finalState: false,\n// });\n// afterTxSent(txId);\n// })\n// .catch((error) => {\n// // TODO: Catch nonce errors and update nonce\n// // TODO: Handle timeouts (non-final status)\n// // TODO: Handle shard congestions\n// updateTxHistory({\n// txId,\n// status: \"Error\",\n// error: tryParseJson(error.message),\n// finalState: false,\n// });\n// });\n// }\n//\n// // Event Notifiers\n// function notifyAccountListeners(accountId) {\n// if (_eventListeners.account.size === 0) {\n// _unbroadcastedEvents.account.push(accountId);\n// return;\n// }\n// _eventListeners.account.forEach((callback) => {\n// try {\n// callback(accountId);\n// } catch (e) {\n// console.error(e);\n// }\n// });\n// }\n//\n// function notifyTxListeners(tx) {\n// if (_eventListeners.tx.size === 0) {\n// _unbroadcastedEvents.tx.push(tx);\n// return;\n// }\n// _eventListeners.tx.forEach((callback) => {\n// try {\n// callback(tx);\n// } catch (e) {\n// console.error(e);\n// }\n// });\n// }\n//\n// function convertUnit(s, ...args) {\n// // Reconstruct raw string from template literal\n// if (Array.isArray(s)) {\n// s = s.reduce((acc, part, i) => {\n// return acc + (args[i - 1] ?? \"\") + part;\n// });\n// }\n// // Convert from `100 NEAR` into yoctoNear\n// if (typeof s == \"string\") {\n// let match = s.match(/([0-9.,_]+)\\s*([a-zA-Z]+)?/);\n// if (match) {\n// let amount = match[1].replace(/[_,]/g, \"\");\n// let unitPart = match[2];\n// if (unitPart) {\n// switch (unitPart.toLowerCase()) {\n// case \"near\":\n// return Big(amount).mul(Big(10).pow(24)).toFixed(0);\n// case \"tgas\":\n// return Big(amount).mul(Big(10).pow(12)).toFixed(0);\n// case \"ggas\":\n// return Big(amount).mul(Big(10).pow(9)).toFixed(0);\n// case \"gas\" || \"yoctonear\":\n// return Big(amount).toFixed(0);\n// default:\n// throw new Error(`Unknown unit: ${unit}`);\n// }\n// } else {\n// return Big(amount).toFixed(0);\n// }\n// }\n// }\n// return Big(s).toFixed(0);\n// }\n//\n// // Core API Implementation\n// const api = {\n// // Context\n// get accountId() {\n// return _state.accountId;\n// },\n//\n// get publicKey() {\n// return _state.publicKey;\n// },\n//\n// config(newConfig) {\n// if (newConfig) {\n// if (newConfig.networkId && _config.networkId !== newConfig.networkId) {\n// _config = { ...NETWORKS[newConfig.networkId] };\n// updateState({\n// accountId: null,\n// privateKey: null,\n// lastWalletId: null,\n// });\n// lsSet(\"block\", null);\n// _txHistory = {};\n// lsSet(\"txHistory\", _txHistory);\n// }\n//\n// _config = { ..._config, ...newConfig };\n// lsSet(\"config\", _config);\n// }\n// return _config;\n// },\n//\n// get authStatus() {\n// if (!_state.accountId) {\n// return \"SignedOut\";\n// }\n//\n// // Check for limited access key\n// const accessKey = _state.publicKey;\n// const contractId = _state.accessKeyContractId;\n// if (accessKey && contractId && _state.privateKey) {\n// return {\n// type: \"SignedInWithLimitedAccessKey\",\n// accessKey,\n// contractId,\n// };\n// }\n// return \"SignedIn\";\n// },\n//\n// // Query Methods\n// async view({ contractId, methodName, args, argsBase64, blockId }) {\n// const encodedArgs =\n// argsBase64 || (args ? toBase64(JSON.stringify(args)) : \"\");\n//\n// const result = await queryRpc(\n// \"query\",\n// withBlockId(\n// {\n// request_type: \"call_function\",\n// account_id: contractId,\n// method_name: methodName,\n// args_base64: encodedArgs,\n// },\n// blockId,\n// ),\n// );\n//\n// return parseJsonFromBytes(result.result);\n// },\n//\n// async account({ accountId, blockId }) {\n// return queryRpc(\n// \"query\",\n// withBlockId(\n// {\n// request_type: \"view_account\",\n// account_id: accountId,\n// },\n// blockId,\n// ),\n// );\n// },\n//\n// async block({ blockId }) {\n// return queryRpc(\"block\", withBlockId({}, blockId));\n// },\n//\n// async accessKey({ accountId, publicKey, blockId }) {\n// return queryRpc(\n// \"query\",\n// withBlockId(\n// {\n// request_type: \"view_access_key\",\n// account_id: accountId,\n// public_key: publicKey,\n// },\n// blockId,\n// ),\n// );\n// },\n//\n// async tx({ txHash, accountId }) {\n// return queryRpc(\"tx\", [txHash, accountId]);\n// },\n//\n// localTxHistory() {\n// return [..._txHistory];\n// },\n//\n// // Transaction Methods\n// async sendTx({ receiverId, actions, waitUntil }) {\n// const signerId = _state.accountId;\n// if (!signerId) {\n// throw new Error(\"Not signed in\");\n// }\n//\n// const publicKey = _state.publicKey;\n// const privateKey = _state.privateKey;\n// const txId = `tx-${Date.now()}-${Math.random()}`;\n//\n// if (\n// !privateKey ||\n// receiverId !== _state.accessKeyContractId ||\n// !canSignWithLAK(actions)\n// ) {\n// const jsonTransaction = {\n// signerId,\n// receiverId,\n// actions,\n// };\n//\n// updateTxHistory({\n// status: \"Pending\",\n// txId,\n// tx: jsonTransaction,\n// finalState: false,\n// });\n//\n// const url = new URL(window.location.href);\n// url.searchParams.set(\"txIds\", txId);\n//\n// _adapter\n// .sendTransactions({\n// transactions: [jsonTransaction],\n// callbackUrl: url.toString(),\n// })\n// .then((result) => {\n// console.log(\"Transaction result:\", result);\n// if (result.url) {\n// console.log(\"Redirecting to wallet:\", result.url);\n// setTimeout(() => {\n// window.location.href = result.url;\n// }, 100);\n// } else if (result.outcomes) {\n// result.outcomes.forEach((result) => {\n// updateTxHistory({\n// txId,\n// status: \"Executed\",\n// result,\n// txHash: result.transaction.hash,\n// finalState: true,\n// });\n// });\n// } else if (result.rejected) {\n// updateTxHistory({\n// txId,\n// status: \"RejectedByUser\",\n// finalState: true,\n// });\n// } else if (result.error) {\n// updateTxHistory({\n// txId,\n// status: \"Error\",\n// error: tryParseJson(result.error),\n// finalState: true,\n// });\n// }\n// })\n// .catch((error) => {\n// updateTxHistory({\n// txId,\n// status: \"Error\",\n// error: tryParseJson(error.message),\n// finalState: true,\n// });\n// });\n// return txId;\n// }\n//\n// const toDoPromises = {};\n// let nonce = lsGet(\"nonce\");\n// if (nonce === null || nonce === undefined) {\n// toDoPromises.nonce = this.accessKey({\n// accountId: signerId,\n// publicKey,\n// }).then((accessKey) => {\n// if (accessKey.error) {\n// throw new Error(`Access key error: ${accessKey.error}`);\n// }\n// lsSet(\"nonce\", accessKey.nonce);\n// return accessKey.nonce;\n// });\n// }\n// let block = lsGet(\"block\");\n// if (\n// !block ||\n// parseFloat(block.header.timestamp_nanosec) / 1e6 + MaxBlockDelayMs <\n// Date.now()\n// ) {\n// toDoPromises.block = this.block({ blockId: \"final\" }).then((block) => {\n// block = {\n// header: {\n// prev_hash: block.header.prev_hash,\n// timestamp_nanosec: block.header.timestamp_nanosec,\n// },\n// };\n// lsSet(\"block\", block);\n// return block;\n// });\n// }\n//\n// if (Object.keys(toDoPromises).length > 0) {\n// let results = await Promise.all(Object.values(toDoPromises));\n// for (let i = 0; i < results.length; i++) {\n// if (Object.keys(toDoPromises)[i] === \"nonce\") {\n// nonce = results[i];\n// } else if (Object.keys(toDoPromises)[i] === \"block\") {\n// block = results[i];\n// }\n// }\n// }\n//\n// const newNonce = nonce + 1;\n// lsSet(\"nonce\", newNonce);\n// const blockHash = block.header.prev_hash;\n//\n// const jsonTransaction = {\n// signerId,\n// publicKey,\n// nonce: newNonce,\n// receiverId,\n// blockHash,\n// actions,\n// };\n//\n// console.log(\"Transaction:\", jsonTransaction);\n// const transaction = serializeTransaction(jsonTransaction);\n// const txHash = toBase58(cryptoUtils.sha256(transaction));\n// const signature = cryptoUtils.signHash(txHash, privateKey);\n// const singedTransaction = serializeSignedTransaction(\n// jsonTransaction,\n// signature,\n// );\n// const signedTxBase64 = toBase64(singedTransaction);\n//\n// updateTxHistory({\n// status: \"Pending\",\n// txId,\n// tx: jsonTransaction,\n// signature,\n// signedTxBase64,\n// txHash,\n// finalState: false,\n// });\n//\n// sendTxToRpc(signedTxBase64, waitUntil, txId);\n//\n// return txId;\n// },\n//\n// // Authentication Methods\n// async requestSignIn({ contractId }) {\n// const privateKey = cryptoUtils.privateKeyFromRandom();\n// updateState({\n// accessKeyContractId: contractId,\n// accountId: null,\n// privateKey,\n// });\n// const publicKey = cryptoUtils.publicKeyFromPrivate(privateKey);\n// const result = await _adapter.signIn({\n// networkId: _config.networkId,\n// contractId,\n// publicKey,\n// });\n// console.log(\"Sign in result:\", result);\n// if (result.error) {\n// throw new Error(`Wallet error: ${result.error}`);\n// }\n// if (result.url) {\n// console.log(\"Redirecting to wallet:\", result.url);\n// setTimeout(() => {\n// window.location.href = result.url;\n// }, 100);\n// } else if (result.accountId) {\n// updateState({\n// accountId: result.accountId,\n// });\n// }\n// },\n//\n// signOut() {\n// updateState({\n// accountId: null,\n// privateKey: null,\n// contractId: null,\n// });\n//\n// // TODO: Implement actual wallet integration\n// },\n//\n// // Event Handlers\n// onAccount(callback) {\n// _eventListeners.account.add(callback);\n// if (_unbroadcastedEvents.account.length > 0) {\n// const events = _unbroadcastedEvents.account;\n// _unbroadcastedEvents.account = [];\n// events.forEach(notifyAccountListeners);\n// }\n// },\n//\n// onTx(callback) {\n// _eventListeners.tx.add(callback);\n// if (_unbroadcastedEvents.tx.length > 0) {\n// const events = _unbroadcastedEvents.tx;\n// _unbroadcastedEvents.tx = [];\n// events.forEach(notifyTxListeners);\n// }\n// },\n//\n// // Action Helpers\n// actions: {\n// functionCall: ({ methodName, gas, deposit, args, argsBase64 }) => ({\n// type: \"FunctionCall\",\n// methodName,\n// args,\n// argsBase64,\n// gas,\n// deposit,\n// }),\n//\n// transfer: (yoctoAmount) => ({\n// type: \"Transfer\",\n// deposit: yoctoAmount,\n// }),\n//\n// stakeNEAR: ({ amount, publicKey }) => ({\n// type: \"Stake\",\n// stake: amount,\n// publicKey,\n// }),\n//\n// addFullAccessKey: ({ publicKey }) => ({\n// type: \"AddKey\",\n// publicKey: publicKey,\n// accessKey: { permission: \"FullAccess\" },\n// }),\n//\n// addLimitedAccessKey: ({\n// publicKey,\n// allowance,\n// accountId,\n// methodNames,\n// }) => ({\n// type: \"AddKey\",\n// publicKey: publicKey,\n// accessKey: {\n// permission: \"FunctionCall\",\n// allowance,\n// receiverId: accountId,\n// methodNames,\n// },\n// }),\n//\n// deleteKey: ({ publicKey }) => ({\n// type: \"DeleteKey\",\n// publicKey,\n// }),\n//\n// deleteAccount: ({ beneficiaryId }) => ({\n// type: \"DeleteAccount\",\n// beneficiaryId,\n// }),\n//\n// createAccount: () => ({\n// type: \"CreateAccount\",\n// }),\n//\n// deployContract: ({ codeBase64 }) => ({\n// type: \"DeployContract\",\n// codeBase64,\n// }),\n// },\n//\n// utils: {\n// toBase64,\n// fromBase64,\n// toBase58,\n// fromBase58,\n// },\n// };\n//\n// // _adapter.handleWalletRedirect();\n//\n// // Handle wallet redirect if applicable\n// // TODO: Implement actual wallet integration\n// try {\n// const url = new URL(window.location.href);\n// const accountId = url.searchParams.get(\"account_id\");\n// const publicKey = url.searchParams.get(\"public_key\");\n// const errorCode = url.searchParams.get(\"errorCode\");\n// const errorMessage = url.searchParams.get(\"errorMessage\");\n// const transactionHashes = url.searchParams.get(\"transactionHashes\");\n// const txIds = url.searchParams.get(\"txIds\");\n//\n// if (errorCode || errorMessage) {\n// console.warn(new Error(`Wallet error: ${errorCode} ${errorMessage}`));\n// }\n//\n// if (accountId && publicKey) {\n// if (publicKey === _state.publicKey) {\n// updateState({\n// accountId,\n// });\n// } else {\n// console.error(\n// new Error(\"Public key mismatch from wallet redirect\"),\n// publicKey,\n// _state.publicKey,\n// );\n// }\n// }\n//\n// if (transactionHashes || txIds) {\n// const txHashes = transactionHashes ? transactionHashes.split(\",\") : [];\n// const txIdsArray = txIds ? txIds.split(\",\") : [];\n// if (txIdsArray.length > txHashes.length) {\n// txIdsArray.forEach((txId, i) => {\n// updateTxHistory({\n// txId,\n// status: \"RejectedByUser\",\n// finalState: true,\n// });\n// });\n// } else if (txIdsArray.length === txHashes.length) {\n// txIdsArray.forEach((txId, i) => {\n// updateTxHistory({\n// txId,\n// status: \"PendingGotTxHash\",\n// txHash: txHashes[i],\n// finalState: false,\n// });\n// afterTxSent(txId);\n// });\n// } else {\n// console.error(\n// new Error(\"Transaction hash mismatch from wallet redirect\"),\n// txIdsArray,\n// txHashes,\n// );\n// }\n// }\n//\n// // Remove wallet parameters from the URL\n// url.searchParams.delete(\"account_id\");\n// url.searchParams.delete(\"public_key\");\n// url.searchParams.delete(\"errorCode\");\n// url.searchParams.delete(\"errorMessage\");\n// url.searchParams.delete(\"all_keys\");\n// url.searchParams.delete(\"transactionHashes\");\n// url.searchParams.delete(\"txIds\");\n// window.history.replaceState({}, \"\", url.toString());\n// } catch (e) {\n// console.error(\"Error handling wallet redirect:\", e);\n// }\n//\n// export { api, convertUnit };\n", "/**\n * @typedef {Object} WalletState\n * @property {string} [accountId] - NEAR account ID if signed in\n * @property {string} [publicKey] - Public key if available\n * @property {string} [privateKey] - Private key if available\n * @property {string} [lastWalletId] - ID of last used wallet\n * @property {string} [networkId] - ID of last used network\n */\n\n/**\n * @typedef {Object} SignInConfig\n * @property {string} networkId - NEAR network ID ('mainnet' or 'testnet')\n * @property {string} contractId - Contract ID to request access for\n * @property {string} [walletId] - Preferred wallet to use. E.g. 'near', 'here', 'meteor'\n * @property {string} [callbackUrl] - URL to redirect back to after wallet interaction\n */\n\n/**\n * @typedef {Object} SignInResult\n * @property {string} [url] - URL to redirect to if needed\n * @property {string} [accountId] - Account ID if immediately available\n * @property {string} [error] - Error message if sign in failed\n */\n\n/**\n * @typedef {Object} Transaction\n * @property {string} [signerId] - Transaction signer account ID\n * @property {string} receiverId - Transaction receiver account ID\n * @property {Object[]} actions - Transaction actions to perform\n */\n\n/**\n * @typedef {Object} TransactionConfig\n * @property {Transaction} transactions - Transaction actions to perform\n * @property {string} [callbackUrl] - URL to redirect back to after wallet interaction\n */\n\n/**\n * @typedef {Object} TransactionResult\n * @property {string} [url] - URL to redirect to if needed\n * @property {string} [hash] - Transaction hash if immediately available\n * @property {string} [error] - Error message if transaction failed\n */\n\nexport interface WalletAdapterConstructor {\n widgetUrl?: string;\n targetOrigin?: string;\n onStateUpdate?: (state: any) => void;\n lastState?: any;\n callbackUrl?: string;\n}\n\n/**\n * @typedef {Object} WalletAdapterConfig\n * @property {string} [widgetUrl] - URL of the wallet widget (defaults to official hosted version)\n * @property {string} [targetOrigin] - Target origin for postMessage (defaults to '*')\n * @property {string} [lastState] - The last state that was given by WalletAdapter before the redirect or reload.\n * @property {(state: WalletState) => void} [onStateUpdate] - Called when wallet state changes\n * @property {string} [callbackUrl] - Default callback URL for wallet interactions (defaults to current page URL)\n */\n\n/**\n * Interface for interacting with NEAR wallets\n */\nexport class WalletAdapter {\n /** @type {HTMLIFrameElement} */\n #iframe = null;\n\n /** @type {string} */\n #targetOrigin;\n\n /** @type {string} */\n #widgetUrl;\n\n /** @type {Map<string, Function>} */\n #pending = new Map();\n\n /** @type {WalletState} */\n #state;\n\n /** @type {Function} */\n #onStateUpdate;\n\n /** @type {string} */\n #callbackUrl;\n\n /** @type {string} */\n static defaultWidgetUrl = \"https://wallet-adapter.fastnear.com\";\n\n\n\n/**\n * @param {WalletAdapterConfig} [config]\n */\n constructor({\n widgetUrl = WalletAdapter.defaultWidgetUrl,\n targetOrigin = \"*\",\n onStateUpdate,\n lastState,\n callbackUrl = window.location.href,\n }: WalletAdapterConstructor = {}) {\n this.#targetOrigin = targetOrigin;\n this.#widgetUrl = widgetUrl;\n this.#onStateUpdate = onStateUpdate;\n this.#callbackUrl = callbackUrl;\n this.#state = lastState || {};\n window.addEventListener(\"message\", this.#handleMessage.bind(this));\n }\n\n /**\n * Creates an iframe for wallet interaction\n * @param {string} path - Path to load in iframe\n * @returns {HTMLIFrameElement}\n */\n #createIframe(path) {\n // Remove existing iframe if any\n if (this.#iframe) {\n this.#iframe.remove();\n }\n\n // Create URL\n const url = new URL(path, this.#widgetUrl);\n\n // Create and configure iframe\n const iframe = document.createElement(\"iframe\");\n iframe.src = url.toString();\n iframe.allow = \"usb\";\n iframe.style.border = \"none\";\n iframe.style.zIndex = \"10000\";\n iframe.style.position = \"fixed\";\n iframe.style.display = \"block\";\n iframe.style.top = \"0\";\n iframe.style.left = \"0\";\n iframe.style.width = \"100%\";\n iframe.style.height = \"100%\";\n document.body.appendChild(iframe);\n\n this.#iframe = iframe;\n return iframe;\n }\n\n /**\n * Handles messages from the wallet widget\n * @param {MessageEvent} event\n */\n #handleMessage(event) {\n // Check origin if specified\n if (this.#targetOrigin !== \"*\" && event.origin !== this.#targetOrigin) {\n return;\n }\n\n const { id, type, action, payload } = event.data;\n if (type !== \"wallet-adapter\") return;\n\n // Handle close action\n if (action === \"close\") {\n this.#iframe?.remove();\n this.#iframe = null;\n return;\n }\n\n // Update state if provided\n if (payload?.state) {\n this.#state = { ...this.#state, ...payload.state };\n this.#onStateUpdate?.(this.#state);\n }\n\n // Resolve pending promise if any\n const resolve = this.#pending.get(id);\n if (resolve) {\n this.#pending.delete(id);\n this.#iframe?.remove();\n this.#iframe = null;\n resolve(payload);\n }\n }\n\n /**\n * Sends a message to the wallet widget\n * @param {string} path - Path to load in iframe\n * @param {string} method - Method to call\n * @param {Object} params - Parameters to pass\n * @returns {Promise<any>}\n */\n async #sendMessage(path, method, params) {\n return new Promise((resolve) => {\n const id = Math.random().toString(36).slice(2);\n this.#pending.set(id, resolve);\n\n const iframe = this.#createIframe(path);\n\n iframe.onload = () => {\n iframe.contentWindow?.postMessage(\n {\n type: \"wallet-adapter\",\n method,\n params: {\n id,\n ...params,\n state: this.#state,\n callbackUrl: params.callbackUrl || this.#callbackUrl,\n },\n },\n this.#targetOrigin\n );\n };\n });\n }\n\n /**\n * Get current wallet state\n * @returns {WalletState}\n */\n getState() {\n return { ...this.#state };\n }\n\n /**\n * Set current wallet state\n * @param state\n */\n setState(state) {\n this.#state = state;\n }\n\n /**\n * Sign in with a NEAR wallet\n * @param {SignInConfig} config\n * @returns {Promise<SignInResult>}\n */\n async signIn(config) {\n return this.#sendMessage(\"/login.html\", \"signIn\", config);\n }\n\n /**\n * Send a transaction using connected wallet\n * @param {TransactionConfig} config\n * @returns {Promise<TransactionResult>}\n */\n async sendTransactions(config) {\n return this.#sendMessage(\"/send.html\", \"sendTransactions\", config);\n }\n\n /**\n * Clean up adapter resources\n */\n destroy() {\n window.removeEventListener(\"message\", this.#handleMessage);\n this.#iframe?.remove();\n this.#iframe = null;\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["e", "jsonTransaction"]
7
+ }
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  api,
4
4
  convertUnit
5
- } from "./chunk-B2HMQPYI.js";
5
+ } from "./chunk-OR3WITSY.js";
6
6
  import "./chunk-YKPILPMX.js";
7
7
  import "./chunk-S5Q2EM2B.js";
8
8
  import "./chunk-2SCAGR3F.js";
package/dist/esm/index.js CHANGED
@@ -3,7 +3,7 @@ import {
3
3
  api,
4
4
  convertUnit,
5
5
  parseJsonFromBytes
6
- } from "./chunk-B2HMQPYI.js";
6
+ } from "./chunk-OR3WITSY.js";
7
7
  import {
8
8
  SCHEMA,
9
9
  mapAction,
package/dist/esm/near.js CHANGED
@@ -3,7 +3,7 @@ import {
3
3
  api,
4
4
  convertUnit,
5
5
  parseJsonFromBytes
6
- } from "./chunk-B2HMQPYI.js";
6
+ } from "./chunk-OR3WITSY.js";
7
7
  import "./chunk-YKPILPMX.js";
8
8
  import "./chunk-S5Q2EM2B.js";
9
9
  import "./chunk-2SCAGR3F.js";