@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.
- package/dist/cjs/index.esm.js +126 -98
- package/dist/cjs/index.esm.js.map +3 -3
- package/dist/cjs/index.js +126 -98
- package/dist/cjs/index.js.map +3 -3
- package/dist/cjs/near.js +126 -98
- package/dist/cjs/near.js.map +3 -3
- package/dist/esm/{chunk-B2HMQPYI.js → chunk-OR3WITSY.js} +127 -99
- package/dist/esm/chunk-OR3WITSY.js.map +7 -0
- package/dist/esm/index.esm.js +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/near.js +1 -1
- package/dist/umd/index.js +126 -98
- package/dist/umd/index.js.map +3 -3
- package/package.json +6 -4
- package/dist/esm/chunk-B2HMQPYI.js.map +0 -7
|
@@ -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 } :
|
|
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
|
-
|
|
377
|
+
const match = s.match(/([0-9.,_]+)\s*([a-zA-Z]+)?/);
|
|
378
378
|
if (match) {
|
|
379
|
-
|
|
380
|
-
|
|
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: ${
|
|
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({
|
|
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({
|
|
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({
|
|
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({
|
|
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
|
-
|
|
524
|
-
|
|
525
|
-
|
|
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((
|
|
547
|
+
result.outcomes.forEach((r) => {
|
|
528
548
|
updateTxHistory({
|
|
529
549
|
txId,
|
|
530
550
|
status: "Executed",
|
|
531
|
-
result:
|
|
532
|
-
txHash:
|
|
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 =
|
|
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
|
-
|
|
575
|
-
|
|
576
|
-
|
|
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:
|
|
580
|
-
timestamp_nanosec:
|
|
599
|
+
prev_hash: b.header.prev_hash,
|
|
600
|
+
timestamp_nanosec: b.header.timestamp_nanosec
|
|
581
601
|
}
|
|
582
602
|
};
|
|
583
|
-
lsSet("block",
|
|
584
|
-
return
|
|
603
|
+
lsSet("block", newBlock);
|
|
604
|
+
return newBlock;
|
|
585
605
|
});
|
|
586
606
|
}
|
|
587
607
|
if (Object.keys(toDoPromises).length > 0) {
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
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
|
|
613
|
-
|
|
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
|
-
|
|
650
|
-
|
|
651
|
-
|
|
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: ({
|
|
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
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
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
|
-
|
|
769
|
-
|
|
770
|
-
|
|
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
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
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
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
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-
|
|
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": ";;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,SAAS;;;ACgET,IAAM,gBAAN,MAAM,eAAc;AAAA;AAAA,EAEzB,UAAU;AAAA;AAAA,EAGV;AAAA;AAAA,EAGA;AAAA;AAAA,EAGA,WAAW,oBAAI,IAAI;AAAA;AAAA,EAGnB;AAAA;AAAA,EAGA;AAAA;AAAA,EAGA;AAAA;AAAA,EAGA,OAAO,mBAAmB;AAAA;AAAA;AAAA;AAAA,EAO1B,YAAY;AAAA,IACV,YAAY,eAAc;AAAA,IAC1B,eAAe;AAAA,IACf;AAAA,IACA;AAAA,IACA,cAAc,OAAO,SAAS;AAAA,EAChC,IAA8B,CAAC,GAAG;AAChC,SAAK,gBAAgB;AACrB,SAAK,aAAa;AAClB,SAAK,iBAAiB;AACtB,SAAK,eAAe;AACpB,SAAK,SAAS,aAAa,CAAC;AAC5B,WAAO,iBAAiB,WAAW,KAAK,eAAe,KAAK,IAAI,CAAC;AAAA,EACnE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,cAAc,MAAM;AAElB,QAAI,KAAK,SAAS;AAChB,WAAK,QAAQ,OAAO;AAAA,IACtB;AAGA,UAAM,MAAM,IAAI,IAAI,MAAM,KAAK,UAAU;AAGzC,UAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,WAAO,MAAM,IAAI,SAAS;AAC1B,WAAO,QAAQ;AACf,WAAO,MAAM,SAAS;AACtB,WAAO,MAAM,SAAS;AACtB,WAAO,MAAM,WAAW;AACxB,WAAO,MAAM,UAAU;AACvB,WAAO,MAAM,MAAM;AACnB,WAAO,MAAM,OAAO;AACpB,WAAO,MAAM,QAAQ;AACrB,WAAO,MAAM,SAAS;AACtB,aAAS,KAAK,YAAY,MAAM;AAEhC,SAAK,UAAU;AACf,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,eAAe,OAAO;AAEpB,QAAI,KAAK,kBAAkB,OAAO,MAAM,WAAW,KAAK,eAAe;AACrE;AAAA,IACF;AAEA,UAAM,EAAE,IAAI,MAAM,QAAQ,QAAQ,IAAI,MAAM;AAC5C,QAAI,SAAS,iBAAkB;AAG/B,QAAI,WAAW,SAAS;AACtB,WAAK,SAAS,OAAO;AACrB,WAAK,UAAU;AACf;AAAA,IACF;AAGA,QAAI,SAAS,OAAO;AAClB,WAAK,SAAS,EAAE,GAAG,KAAK,QAAQ,GAAG,QAAQ,MAAM;AACjD,WAAK,iBAAiB,KAAK,MAAM;AAAA,IACnC;AAGA,UAAM,UAAU,KAAK,SAAS,IAAI,EAAE;AACpC,QAAI,SAAS;AACX,WAAK,SAAS,OAAO,EAAE;AACvB,WAAK,SAAS,OAAO;AACrB,WAAK,UAAU;AACf,cAAQ,OAAO;AAAA,IACjB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,aAAa,MAAM,QAAQ,QAAQ;AACvC,WAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,YAAM,KAAK,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,CAAC;AAC7C,WAAK,SAAS,IAAI,IAAI,OAAO;AAE7B,YAAM,SAAS,KAAK,cAAc,IAAI;AAEtC,aAAO,SAAS,MAAM;AACpB,eAAO,eAAe;AAAA,UACpB;AAAA,YACE,MAAM;AAAA,YACN;AAAA,YACA,QAAQ;AAAA,cACN;AAAA,cACA,GAAG;AAAA,cACH,OAAO,KAAK;AAAA,cACZ,aAAa,OAAO,eAAe,KAAK;AAAA,YAC1C;AAAA,UACF;AAAA,UACA,KAAK;AAAA,QACP;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAW;AACT,WAAO,EAAE,GAAG,KAAK,OAAO;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAS,OAAO;AACd,SAAK,SAAS;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,OAAO,QAAQ;AACnB,WAAO,KAAK,aAAa,eAAe,UAAU,MAAM;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,iBAAiB,QAAQ;AAC7B,WAAO,KAAK,aAAa,cAAc,oBAAoB,MAAM;AAAA,EACnE;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU;AACR,WAAO,oBAAoB,WAAW,KAAK,cAAc;AACzD,SAAK,SAAS,OAAO;AACrB,SAAK,UAAU;AAAA,EACjB;AACF;;;ADzOA,IAAI,KAAK;AAGT,IAAM,kBAAkB,MAAO,KAAK,KAAK;AAGzC,IAAM,aAAa;AAEnB,IAAM,qBAAqB;AAC3B,IAAM,WAAW;AAAA,EACf,SAAS;AAAA,IACP,WAAW;AAAA,IACX,SAAS;AAAA,EACX;AAAA,EACA,SAAS;AAAA,IACP,WAAW;AAAA,IACX,SAAS;AAAA,EACX;AACF;AAGA,IAAI,UAAU,MAAM,QAAQ,KAAK,EAAE,GAAG,SAAS,kBAAkB,EAAE;AAEnE,IAAI,SAAS,MAAM,OAAO,KAAK,CAAC;AAChC,IAAI;AACF,SAAO,YAAY,OAAO,aACV,qBAAqB,OAAO,UAAU,IAClD;AACN,SAAS,GAAG;AACV,UAAQ,MAAM,8BAA8B,CAAC;AAC7C,SAAO,aAAa;AACpB,QAAM,SAAS,IAAI;AACrB;AAGA,IAAI,aAAa,MAAM,WAAW,KAAK,CAAC;AACxC,IAAM,kBAAkB;AAAA,EACtB,SAAS,oBAAI,IAAI;AAAA,EACjB,IAAI,oBAAI,IAAI;AACd;AACA,IAAM,uBAAuB;AAAA,EAC3B,SAAS,CAAC;AAAA,EACV,IAAI,CAAC;AACP;AAEA,SAAS,wBAAwB;AAC/B,SAAO;AAAA,IACL,WAAW,OAAO;AAAA,IAClB,WAAW,OAAO;AAAA,IAClB,cAAc,OAAO;AAAA,IACrB,WAAW;AAAA,EACb;AACF;AACA,IAAI;AAEJ,SAAS,YAAY,UAA+B;AAClD,QAAM,WAAW;AACjB,WAAS,EAAE,GAAG,QAAQ,GAAG,SAAS;AAClC,QAAM,SAAS;AAAA,IACb,WAAW,OAAO;AAAA,IAClB,YAAY,OAAO;AAAA,IACnB,cAAc,OAAO;AAAA,IACrB,qBAAqB,OAAO;AAAA,EAC9B,CAAC;AACD,MACE,SAAS,eAAe,YAAY,KACpC,SAAS,eAAe,SAAS,YACjC;AACA,WAAO,YAAY,SAAS,aACZ,qBAAqB,SAAS,UAAU,IACpD;AACJ,UAAM,SAAS,IAAI;AAAA,EACrB;AACA,MAAI,SAAS,cAAc,SAAS,WAAW;AAC7C,2BAAuB,SAAS,SAAS;AAAA,EAC3C;AACA,MACG,SAAS,eAAe,cAAc,KACrC,SAAS,iBAAiB,SAAS,gBACpC,SAAS,eAAe,WAAW,KAClC,SAAS,cAAc,SAAS,aACjC,SAAS,eAAe,YAAY,KACnC,SAAS,eAAe,SAAS,YACnC;AACA,aAAS,SAAS,sBAAsB,CAAC;AAAA,EAC3C;AACF;AAEA,SAAS,gBAAgB,UAA+B;AACtD,QAAM,OAAO,SAAS;AACtB,aAAW,IAAI,IAAI;AAAA,IACjB,GAAI,WAAW,IAAI,KAAK,CAAC;AAAA,IACzB,GAAG;AAAA,IACH,iBAAiB,KAAK,IAAI;AAAA,EAC5B;AACA,QAAM,aAAa,UAAU;AAC7B,oBAAkB,WAAW,IAAI,CAAC;AACpC;AAEA,SAAS,qBAAqB,OAA4B;AACxD,UAAQ,IAAI,yBAAyB,KAAK;AAC1C,QAAM,EAAE,WAAW,cAAc,WAAW,IAAI;AAChD,cAAY;AAAA,IACV;AAAA,IACA;AAAA,IACA,GAAI,cAAc,EAAE,WAAW;AAAA,EACjC,CAAC;AACH;AAGA,WAAW,IAAI,cAAc;AAAA,EAC3B,eAAe;AAAA,EACf,WAAW,sBAAsB;AAAA,EACjC,WAAW;AACb,CAAC;AAGM,SAAS,mBAAmB,OAAmB;AACpD,MAAI;AACF,UAAM,UAAU,IAAI,YAAY;AAChC,WAAO,KAAK,MAAM,QAAQ,OAAO,iBAAiB,aAAa,QAAQ,IAAI,WAAW,KAAK,CAAC,CAAC;AAAA,EAC/F,SAAS,GAAG;AACV,QAAI;AACF,aAAO,iBAAiB,aAAa,QAAQ,IAAI,WAAW,KAAK;AAAA,IACnE,SAASA,IAAG;AACV,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAEA,SAAS,YAAY,QAA6B,SAAkB;AAClE,SAAO,YAAY,WAAW,YAAY,eACtC,EAAE,GAAG,QAAQ,UAAU,QAAQ,IAC/B,UACE,EAAE,GAAG,QAAQ,UAAU,QAAQ,IAC/B,EAAE,GAAG,QAAQ,UAAU,aAAa;AAC5C;AAEA,eAAe,SAAS,QAAgB,QAAqC;AAC3E,QAAM,WAAW,MAAM,MAAM,QAAQ,SAAS;AAAA,IAC5C,QAAQ;AAAA,IACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,IAC9C,MAAM,KAAK,UAAU;AAAA,MACnB,SAAS;AAAA,MACT,IAAI,YAAY,KAAK,IAAI,CAAC;AAAA,MAC1B;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AAED,QAAM,SAAS,MAAM,SAAS,KAAK;AACnC,MAAI,OAAO,OAAO;AAChB,UAAM,IAAI,MAAM,KAAK,UAAU,OAAO,KAAK,CAAC;AAAA,EAC9C;AACA,SAAO,OAAO;AAChB;AAEA,SAAS,YAAY,MAAc;AACjC,WAAS,MAAM;AAAA,IACb,SAAS,WAAW,IAAI,EAAE;AAAA,IAC1B,mBAAmB,WAAW,IAAI,EAAE,GAAG;AAAA,IACvC,YAAY;AAAA,EACd,CAAC,EACE,KAAK,CAAC,WAAW;AAChB,UAAM,eAAe,QAAQ,QAAQ;AACrC,oBAAgB;AAAA,MACd;AAAA,MACA,QAAQ;AAAA,MACR;AAAA,MACA,cAAc,eACV,aAAa,WAAW,YAAY,CAAC,IACrC;AAAA,MACJ,YAAY;AAAA,IACd,CAAC;AAAA,EACH,CAAC,EACA,MAAM,CAAC,UAAU;AAChB,oBAAgB;AAAA,MACd;AAAA,MACA,QAAQ;AAAA,MACR,OAAO,aAAa,MAAM,OAAO;AAAA,MACjC,YAAY;AAAA,IACd,CAAC;AAAA,EACH,CAAC;AACL;AAEA,SAAS,YACP,gBACA,WACA,MACA;AACA,WAAS,WAAW;AAAA,IAClB,kBAAkB;AAAA,IAClB,YAAY,aAAa;AAAA,EAC3B,CAAC,EACE,KAAK,CAAC,WAAW;AAChB,YAAQ,IAAI,yBAAyB,MAAM;AAC3C,oBAAgB;AAAA,MACd;AAAA,MACA,QAAQ;AAAA,MACR,YAAY;AAAA,IACd,CAAC;AACD,gBAAY,IAAI;AAAA,EAClB,CAAC,EACA,MAAM,CAAC,UAAU;AAChB,oBAAgB;AAAA,MACd;AAAA,MACA,QAAQ;AAAA,MACR,OAAO,aAAa,MAAM,OAAO;AAAA,MACjC,YAAY;AAAA,IACd,CAAC;AAAA,EACH,CAAC;AACL;AAGA,SAAS,uBAAuB,WAAmB;AACjD,MAAI,gBAAgB,QAAQ,SAAS,GAAG;AACtC,yBAAqB,QAAQ,KAAK,SAAS;AAC3C;AAAA,EACF;AACA,kBAAgB,QAAQ,QAAQ,CAAC,aAAkB;AACjD,QAAI;AACF,eAAS,SAAS;AAAA,IACpB,SAAS,GAAG;AACV,cAAQ,MAAM,CAAC;AAAA,IACjB;AAAA,EACF,CAAC;AACH;AAEA,SAAS,kBAAkB,IAAyB;AAClD,MAAI,gBAAgB,GAAG,SAAS,GAAG;AACjC,yBAAqB,GAAG,KAAK,EAAE;AAC/B;AAAA,EACF;AACA,kBAAgB,GAAG,QAAQ,CAAC,aAAkB;AAC5C,QAAI;AACF,eAAS,EAAE;AAAA,IACb,SAAS,GAAG;AACV,cAAQ,MAAM,CAAC;AAAA,IACjB;AAAA,EACF,CAAC;AACH;AAEA,SAAS,YAAY,MAAqC,MAAqB;AAE7E,MAAI,MAAM,QAAQ,CAAC,GAAG;AACpB,QAAI,EAAE,OAAO,CAAC,KAAK,MAAM,MAAM;AAC7B,aAAO,OAAO,KAAK,IAAI,CAAC,KAAK,MAAM;AAAA,IACrC,CAAC;AAAA,EACH;AAEA,MAAI,OAAO,KAAK,UAAU;AACxB,UAAM,QAAQ,EAAE,MAAM,4BAA4B;AAClD,QAAI,OAAO;AACT,YAAM,SAAS,MAAM,CAAC,EAAE,QAAQ,SAAS,EAAE;AAC3C,YAAM,WAAW,MAAM,CAAC;AACxB,UAAI,UAAU;AACZ,gBAAQ,SAAS,YAAY,GAAG;AAAA,UAC9B,KAAK;AACH,mBAAO,IAAI,MAAM,EAAE,IAAI,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,CAAC;AAAA,UACnD,KAAK;AACH,mBAAO,IAAI,MAAM,EAAE,IAAI,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,CAAC;AAAA,UACnD,KAAK;AACH,mBAAO,IAAI,MAAM,EAAE,IAAI,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC,EAAE,QAAQ,CAAC;AAAA,UAClD,KAAK;AAAA,UACL,KAAK;AACH,mBAAO,IAAI,MAAM,EAAE,QAAQ,CAAC;AAAA,UAC9B;AACE,kBAAM,IAAI,MAAM,iBAAiB,QAAQ,EAAE;AAAA,QAC/C;AAAA,MACF,OAAO;AACL,eAAO,IAAI,MAAM,EAAE,QAAQ,CAAC;AAAA,MAC9B;AAAA,IACF;AAAA,EACF;AACA,SAAO,IAAI,CAAC,EAAE,QAAQ,CAAC;AACzB;AAQA,IAAM,MAAM;AAAA;AAAA,EAEV,IAAI,YAAY;AACd,WAAO,OAAO;AAAA,EAChB;AAAA,EAEA,IAAI,YAAY;AACd,WAAO,OAAO;AAAA,EAChB;AAAA,EAEA,OAAO,WAAiC;AACtC,QAAI,WAAW;AACb,UAAI,UAAU,aAAa,QAAQ,cAAc,UAAU,WAAW;AACpE,kBAAU,EAAE,GAAG,SAAS,UAAU,SAAS,EAAE;AAC7C,oBAAY;AAAA,UACV,WAAW;AAAA,UACX,YAAY;AAAA,UACZ,cAAc;AAAA,QAChB,CAAC;AACD,cAAM,SAAS,IAAI;AACnB,qBAAa,CAAC;AACd,cAAM,aAAa,UAAU;AAAA,MAC/B;AAEA,gBAAU,EAAE,GAAG,SAAS,GAAG,UAAU;AACrC,YAAM,UAAU,OAAO;AAAA,IACzB;AACA,WAAO;AAAA,EACT;AAAA,EAEA,IAAI,aAA2C;AAC7C,QAAI,CAAC,OAAO,WAAW;AACrB,aAAO;AAAA,IACT;AAGA,UAAM,YAAY,OAAO;AACzB,UAAM,aAAa,OAAO;AAC1B,QAAI,aAAa,cAAc,OAAO,YAAY;AAChD,aAAO;AAAA,QACL,MAAM;AAAA,QACN;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,MAAM,KAAK;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAMR;AACD,UAAM,cACJ,eAAe,OAAO,SAAS,KAAK,UAAU,IAAI,CAAC,IAAI;AAEzD,UAAM,SAAS,MAAM;AAAA,MACnB;AAAA,MACA;AAAA,QACE;AAAA,UACE,cAAc;AAAA,UACd,YAAY;AAAA,UACZ,aAAa;AAAA,UACb,aAAa;AAAA,QACf;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,WAAO,mBAAmB,OAAO,MAAM;AAAA,EACzC;AAAA,EAEA,MAAM,QAAQ;AAAA,IACE;AAAA,IACA;AAAA,EACF,GAGX;AACD,WAAO;AAAA,MACL;AAAA,MACA;AAAA,QACE;AAAA,UACE,cAAc;AAAA,UACd,YAAY;AAAA,QACd;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,MAAM,EAAE,QAAQ,GAAyB;AAC7C,WAAO,SAAS,SAAS,YAAY,CAAC,GAAG,OAAO,CAAC;AAAA,EACnD;AAAA,EAEA,MAAM,UAAU;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAIW;AACzB,WAAO;AAAA,MACL;AAAA,MACA;AAAA,QACE;AAAA,UACE,cAAc;AAAA,UACd,YAAY;AAAA,UACZ,YAAY;AAAA,QACd;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,GAAG,EAAE,QAAQ,UAAU,GAA0C;AACrE,WAAO,SAAS,MAAM,CAAC,QAAQ,SAAS,CAAC;AAAA,EAC3C;AAAA,EAEA,iBAAiB;AACf,WAAO,CAAC,GAAG,UAAU;AAAA,EACvB;AAAA;AAAA,EAGA,MAAM,OAAO;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAIV;AACD,UAAM,WAAW,OAAO;AACxB,QAAI,CAAC,UAAU;AACb,YAAM,IAAI,MAAM,eAAe;AAAA,IACjC;AAEA,UAAM,YAAY,OAAO;AACzB,UAAM,aAAa,OAAO;AAC1B,UAAM,OAAO,MAAM,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC;AAE9C,QACE,CAAC,cACD,eAAe,OAAO,uBACtB,CAAC,eAAe,OAAO,GACvB;AACA,YAAMC,mBAAkB;AAAA,QACtB;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAEA,sBAAgB;AAAA,QACd,QAAQ;AAAA,QACR;AAAA,QACA,IAAIA;AAAA,QACJ,YAAY;AAAA,MACd,CAAC;AAED,YAAM,MAAM,IAAI,IAAI,OAAO,WAAW,cAAc,OAAO,SAAS,OAAO,EAAE;AAC7E,UAAI,aAAa,IAAI,SAAS,IAAI;AAElC,eACG,iBAAiB;AAAA,QAChB,cAAc,CAACA,gBAAe;AAAA,QAC9B,aAAa,IAAI,SAAS;AAAA,MAC5B,CAAC,EACA,KAAK,CAAC,WAAgB;AACrB,gBAAQ,IAAI,uBAAuB,MAAM;AACzC,YAAI,OAAO,KAAK;AACd,kBAAQ,IAAI,0BAA0B,OAAO,GAAG;AAChD,cAAI,OAAO,WAAW,aAAa;AACjC,uBAAW,MAAM;AACf,qBAAO,SAAS,OAAO,OAAO;AAAA,YAChC,GAAG,GAAG;AAAA,UACR;AAAA,QACF,WAAW,OAAO,UAAU;AAC1B,iBAAO,SAAS,QAAQ,CAAC,MAAW;AAClC,4BAAgB;AAAA,cACd;AAAA,cACA,QAAQ;AAAA,cACR,QAAQ;AAAA,cACR,QAAQ,EAAE,YAAY;AAAA,cACtB,YAAY;AAAA,YACd,CAAC;AAAA,UACH,CAAC;AAAA,QACH,WAAW,OAAO,UAAU;AAC1B,0BAAgB;AAAA,YACd;AAAA,YACA,QAAQ;AAAA,YACR,YAAY;AAAA,UACd,CAAC;AAAA,QACH,WAAW,OAAO,OAAO;AACvB,0BAAgB;AAAA,YACd;AAAA,YACA,QAAQ;AAAA,YACR,OAAO,aAAa,OAAO,KAAK;AAAA,YAChC,YAAY;AAAA,UACd,CAAC;AAAA,QACH;AAAA,MACF,CAAC,EACA,MAAM,CAAC,UAAe;AACrB,wBAAgB;AAAA,UACd;AAAA,UACA,QAAQ;AAAA,UACR,OAAO,aAAa,MAAM,OAAO;AAAA,UACjC,YAAY;AAAA,QACd,CAAC;AAAA,MACH,CAAC;AACH,aAAO;AAAA,IACT;AAEA,QAAI,QAAuB,MAAM,OAAO;AACxC,QAAI,QAAa,MAAM,OAAO;AAC9B,UAAM,eAA6C,CAAC;AAEpD,QAAI,UAAU,QAAQ,UAAU,QAAW;AACzC,mBAAa,QAAQ,IAAI,UAAU;AAAA,QACjC,WAAW;AAAA,QACX;AAAA,MACF,CAAC,EAAE,KAAK,CAAC,cAAc;AACrB,YAAK,UAAkB,OAAO;AAC5B,gBAAM,IAAI,MAAM,qBAAsB,UAAkB,KAAK,EAAE;AAAA,QACjE;AACA,cAAM,SAAS,UAAU,KAAK;AAC9B,eAAO,UAAU;AAAA,MACnB,CAAC;AAAA,IACH;AAEA,QACE,CAAC,SACD,CAAC,MAAM,UACP,WAAW,MAAM,OAAO,iBAAiB,IAAI,MAAM,kBACnD,KAAK,IAAI,GACT;AACA,mBAAa,QAAQ,IAAI,MAAM,EAAE,SAAS,QAAQ,CAAC,EAAE,KAAK,CAAC,MAAW;AACpE,cAAM,WAAW;AAAA,UACf,QAAQ;AAAA,YACN,WAAW,EAAE,OAAO;AAAA,YACpB,mBAAmB,EAAE,OAAO;AAAA,UAC9B;AAAA,QACF;AACA,cAAM,SAAS,QAAQ;AACvB,eAAO;AAAA,MACT,CAAC;AAAA,IACH;AAEA,QAAI,OAAO,KAAK,YAAY,EAAE,SAAS,GAAG;AACxC,YAAM,UAAU,MAAM,QAAQ,IAAI,OAAO,OAAO,YAAY,CAAC;AAC7D,YAAM,OAAO,OAAO,KAAK,YAAY;AACrC,cAAQ,QAAQ,CAAC,KAAK,MAAM;AAC1B,YAAI,KAAK,CAAC,MAAM,SAAS;AACvB,kBAAQ;AAAA,QACV,WAAW,KAAK,CAAC,MAAM,SAAS;AAC9B,kBAAQ;AAAA,QACV;AAAA,MACF,CAAC;AAAA,IACH;AAEA,UAAM,YAAY,SAAS,KAAK;AAChC,UAAM,SAAS,QAAQ;AACvB,UAAM,YAAY,MAAM,OAAO;AAE/B,UAAM,kBAAkB;AAAA,MACtB;AAAA,MACA;AAAA,MACA,OAAO;AAAA,MACP;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,YAAQ,IAAI,gBAAgB,eAAe;AAC3C,UAAM,cAAc,qBAAqB,eAAe;AACxD,UAAM,SAAS,SAAqB,OAAO,WAAW,CAAC;AACvD,UAAM,YAAwB,SAAS,QAAQ,UAAU;AACzD,UAAM,oBAAoB,2BAA2B,iBAAiB,SAAS;AAC/E,UAAM,iBAAiB,SAAS,iBAAiB;AAEjD,oBAAgB;AAAA,MACd,QAAQ;AAAA,MACR;AAAA,MACA,IAAI;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA,YAAY;AAAA,IACd,CAAC;AAED,gBAAY,gBAAgB,WAAW,IAAI;AAE3C,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,MAAM,cAAc,EAAE,WAAW,GAA2B;AAC1D,UAAM,aAAyB,qBAAqB;AACpD,gBAAY;AAAA,MACV,qBAAqB;AAAA,MACrB,WAAW;AAAA,MACX;AAAA,IACF,CAAC;AACD,UAAM,YAAwB,qBAAqB,UAAU;AAC7D,UAAM,SAAS,MAAM,SAAS,OAAO;AAAA,MACnC,WAAW,QAAQ;AAAA,MACnB;AAAA,MACA;AAAA,IACF,CAAC;AACD,YAAQ,IAAI,mBAAmB,MAAM;AACrC,QAAI,OAAO,OAAO;AAChB,YAAM,IAAI,MAAM,iBAAiB,OAAO,KAAK,EAAE;AAAA,IACjD;AACA,QAAI,OAAO,KAAK;AACd,cAAQ,IAAI,0BAA0B,OAAO,GAAG;AAChD,UAAI,OAAO,WAAW,aAAa;AACjC,mBAAW,MAAM;AACf,iBAAO,SAAS,OAAO,OAAO;AAAA,QAChC,GAAG,GAAG;AAAA,MACR;AAAA,IACF,WAAW,OAAO,WAAW;AAC3B,kBAAY;AAAA,QACV,WAAW,OAAO;AAAA,MACpB,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,UAAU;AACR,gBAAY;AAAA,MACV,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,YAAY;AAAA,IACd,CAAC;AAAA,EAEH;AAAA;AAAA,EAGA,UAAU,UAAuC;AAC/C,oBAAgB,QAAQ,IAAI,QAAQ;AACpC,QAAI,qBAAqB,QAAQ,SAAS,GAAG;AAC3C,YAAM,SAAS,qBAAqB;AACpC,2BAAqB,UAAU,CAAC;AAChC,aAAO,QAAQ,sBAAsB;AAAA,IACvC;AAAA,EACF;AAAA,EAEA,KAAK,UAA6C;AAChD,oBAAgB,GAAG,IAAI,QAAQ;AAC/B,QAAI,qBAAqB,GAAG,SAAS,GAAG;AACtC,YAAM,SAAS,qBAAqB;AACpC,2BAAqB,KAAK,CAAC;AAC3B,aAAO,QAAQ,iBAAiB;AAAA,IAClC;AAAA,EACF;AAAA;AAAA,EAGA,SAAS;AAAA,IACP,cAAc,CAAC;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,OAMR;AAAA,MACL,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IAEA,UAAU,CAAC,iBAAyB;AAAA,MAClC,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,IAEA,WAAW,CAAC,EAAE,QAAQ,UAAU,OAA8C;AAAA,MAC5E,MAAM;AAAA,MACN,OAAO;AAAA,MACP;AAAA,IACF;AAAA,IAEA,kBAAkB,CAAC,EAAE,UAAU,OAA8B;AAAA,MAC3D,MAAM;AAAA,MACN;AAAA,MACA,WAAW,EAAE,YAAY,aAAa;AAAA,IACxC;AAAA,IAEA,qBAAqB,CAAC;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,OAKf;AAAA,MACL,MAAM;AAAA,MACN;AAAA,MACA,WAAW;AAAA,QACT,YAAY;AAAA,QACZ;AAAA,QACA,YAAY;AAAA,QACZ;AAAA,MACF;AAAA,IACF;AAAA,IAEA,WAAW,CAAC,EAAE,UAAU,OAA8B;AAAA,MACpD,MAAM;AAAA,MACN;AAAA,IACF;AAAA,IAEA,eAAe,CAAC,EAAE,cAAc,OAAkC;AAAA,MAChE,MAAM;AAAA,MACN;AAAA,IACF;AAAA,IAEA,eAAe,OAAO;AAAA,MACpB,MAAM;AAAA,IACR;AAAA,IAEA,gBAAgB,CAAC,EAAE,WAAW,OAA+B;AAAA,MAC3D,MAAM;AAAA,MACN;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAGA,IAAI;AACF,MAAI,OAAO,WAAW,aAAa;AACjC,UAAM,MAAM,IAAI,IAAI,OAAO,SAAS,IAAI;AACxC,UAAM,YAAY,IAAI,aAAa,IAAI,YAAY;AACnD,UAAM,YAAY,IAAI,aAAa,IAAI,YAAY;AACnD,UAAM,YAAY,IAAI,aAAa,IAAI,WAAW;AAClD,UAAM,eAAe,IAAI,aAAa,IAAI,cAAc;AACxD,UAAM,oBAAoB,IAAI,aAAa,IAAI,mBAAmB;AAClE,UAAM,QAAQ,IAAI,aAAa,IAAI,OAAO;AAE1C,QAAI,aAAa,cAAc;AAC7B,cAAQ,KAAK,IAAI,MAAM,iBAAiB,SAAS,IAAI,YAAY,EAAE,CAAC;AAAA,IACtE;AAEA,QAAI,aAAa,WAAW;AAC1B,UAAI,cAAc,OAAO,WAAW;AAClC,oBAAY;AAAA,UACV;AAAA,QACF,CAAC;AAAA,MACH,OAAO;AACL,gBAAQ;AAAA,UACN,IAAI,MAAM,0CAA0C;AAAA,UACpD;AAAA,UACA,OAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAEA,QAAI,qBAAqB,OAAO;AAC9B,YAAM,WAAW,oBAAoB,kBAAkB,MAAM,GAAG,IAAI,CAAC;AACrE,YAAM,aAAa,QAAQ,MAAM,MAAM,GAAG,IAAI,CAAC;AAC/C,UAAI,WAAW,SAAS,SAAS,QAAQ;AACvC,mBAAW,QAAQ,CAAC,MAAM,MAAM;AAC9B,0BAAgB;AAAA,YACd;AAAA,YACA,QAAQ;AAAA,YACR,YAAY;AAAA,UACd,CAAC;AAAA,QACH,CAAC;AAAA,MACH,WAAW,WAAW,WAAW,SAAS,QAAQ;AAChD,mBAAW,QAAQ,CAAC,MAAM,MAAM;AAC9B,0BAAgB;AAAA,YACd;AAAA,YACA,QAAQ;AAAA,YACR,QAAQ,SAAS,CAAC;AAAA,YAClB,YAAY;AAAA,UACd,CAAC;AACD,sBAAY,IAAI;AAAA,QAClB,CAAC;AAAA,MACH,OAAO;AACL,gBAAQ;AAAA,UACN,IAAI,MAAM,gDAAgD;AAAA,UAC1D;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,QAAI,aAAa,OAAO,YAAY;AACpC,QAAI,aAAa,OAAO,YAAY;AACpC,QAAI,aAAa,OAAO,WAAW;AACnC,QAAI,aAAa,OAAO,cAAc;AACtC,QAAI,aAAa,OAAO,UAAU;AAClC,QAAI,aAAa,OAAO,mBAAmB;AAC3C,QAAI,aAAa,OAAO,OAAO;AAC/B,WAAO,QAAQ,aAAa,CAAC,GAAG,IAAI,IAAI,SAAS,CAAC;AAAA,EACpD;AACF,SAAS,GAAG;AACV,UAAQ,MAAM,mCAAmC,CAAC;AACpD;",
|
|
6
|
+
"names": ["e", "jsonTransaction"]
|
|
7
|
+
}
|
package/dist/esm/index.esm.js
CHANGED
package/dist/esm/index.js
CHANGED