Compare commits

...

15 Commits
v1.3.1 ... main

38 changed files with 1175 additions and 767 deletions

View File

@ -1,5 +1,54 @@
# Changelog
## Manifest Version 1.3.7
- improved add Network pages
- upgraded and optimized some dependencies including vite
- optimized vite config
- added condition to not reinject wallet if already injected for websites that reload injected scripts
- optimized throttle fuffilment of requests in case of too many requests
- removed uneeded mobile native code
## Manifest Version 1.3.6
- better display of blockchain explorer button
- updated ethers dependency to latest 6.11.1
- better handling of type sigining
- changed the password input for unlock to not lose focus
- activated focus on password input for unlock on view enter
- disabled integration of fire wallet(in cause user has it installed) with type signing due to incompatibility
- other misc improvements
- added a check when sending native token to check if internet / RPC or Blockchain and show a message to the user
- customize testNets icons to show a small dev icon on the top right corner
- updated testNets templates to include newer networks
- show icons for testNets too in most places
## Manifest Version 1.3.5
- added copy button to chainId for easier development
- added settings to be able to transfrom address to lower case when copying
- added a check in get recepit to return null if hash is missing
- added version display to wallet first page
## Manifest Version 1.3.4
- bump fake Metamask version signature to 11.0.0
- improved compatibility with older deprecated websites
- improved mimicking of Metamask API
- made the wallet compatible with fire extension on sending transaction( by mimicking new Metamask API)
## Manifest Version 1.3.3
- improved eth_call and eth_blockNumber to be more compatible with older websites
- better error internal handling
- modify the receipt returned to resamble more the one from Metamask
- change some notes in about
- refactored account name edit to be more user friendly
## Manifest Version 1.3.2
- added button to open non kyc exchange, no referral is used to maximize privacy
## Manifest Version 1.3.1
- refactored the wallet to use etheres V6

View File

@ -1,42 +1,38 @@
{
"name": "clear-wallet",
"version": "1.3.1",
"version": "1.3.7",
"private": true,
"description": "Clear Wallet (CLW) is a wallet that helps you manage your Ethereum assets and interact with Ethereum dApps and contracts with the main focus on absolute privacy.",
"type": "module",
"scripts": {
"dev": "vite",
"inject": "tsc --downlevelIteration --outFile src/extension/inject.js src/extension/inject.ts",
"content": "tsc --outFile src/extension/content.js src/extension/content.ts",
"post-build": "ts-node ./release-scripts/post-build.ts",
"post-build": "yarn tsx ./release-scripts/post-build.ts",
"build": "yarn inject && yarn content && vue-tsc --noEmit && vite build && yarn post-build",
"preview": "vite preview",
"release": "yarn config set version-tag-prefix clear-wallet@v && yarn config set version-git-message 'clear-wallet@v%s' && yarn version --patch && yarn postversion",
"postversion": "git push",
"pub": "yarn build && yarn release && ts-node ./release-scripts/create-release.ts"
"pub": "yarn build && yarn release && yarn tsx ./release-scripts/create-release.ts"
},
"dependencies": {
"@capacitor/app": "^5.0.6",
"@capacitor/core": "^5.2.3",
"@capacitor/haptics": "^5.0.6",
"@capacitor/keyboard": "^5.0.6",
"@capacitor/status-bar": "^5.0.6",
"@ionic/vue": "^7.2.3",
"@ionic/vue-router": "^7.2.3",
"@types/chrome": "^0.0.243",
"core-js": "^3.32.0",
"ethers": "^6.7.0",
"ethers": "^6.11.1",
"vue": "^3.3.4",
"vue-router": "^4.2.4"
},
"devDependencies": {
"@capacitor/cli": "^5.2.3",
"@crxjs/vite-plugin": "^1.0.14",
"@crxjs/vite-plugin": "^2.0.0-beta.23",
"@types/archiver": "^5.3.2",
"@types/chrome": "^0.0.243",
"@types/jest": "^29.5.3",
"@types/node": "^20.5.0",
"@typescript-eslint/eslint-plugin": "^6.3.0",
"@typescript-eslint/parser": "^6.3.0",
"@vitejs/plugin-vue": "^4.2.3",
"@vitejs/plugin-vue": "^5.0.4",
"@vue/eslint-config-typescript": "^11.0.3",
"archiver": "^5.3.1",
"eslint": "^8.47.0",
@ -48,11 +44,18 @@
"sass": "^1.65.1",
"stream-browserify": "^3.0.0",
"ts-jest": "^29.1.1",
"ts-node": "^10.9.1",
"tsx": "^4.8.0",
"typescript": "^5.1.6",
"util": "^0.12.5",
"vite": "^4.4.9",
"vite": "^5.2.10",
"vue-tsc": "^1.8.8",
"yarn-upgrade-all": "^0.7.2"
},
"disabledNativeDependencies": {
"@capacitor/app": "^5.0.6",
"@capacitor/core": "^5.2.3",
"@capacitor/haptics": "^5.0.6",
"@capacitor/keyboard": "^5.0.6",
"@capacitor/status-bar": "^5.0.6"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 680 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 7.6 KiB

View File

@ -1 +0,0 @@
<svg width="350" height="140" xmlns="http://www.w3.org/2000/svg" style="background:#f6f7f9"><g fill="none" fill-rule="evenodd"><path fill="#F04141" style="mix-blend-mode:multiply" d="M61.905-34.23l96.194 54.51-66.982 54.512L22 34.887z"/><circle fill="#10DC60" style="mix-blend-mode:multiply" cx="155.5" cy="135.5" r="57.5"/><path fill="#3880FF" style="mix-blend-mode:multiply" d="M208.538 9.513l84.417 15.392L223.93 93.93z"/><path fill="#FFCE00" style="mix-blend-mode:multiply" d="M268.625 106.557l46.332-26.75 46.332 26.75v53.5l-46.332 26.75-46.332-26.75z"/><circle fill="#7044FF" style="mix-blend-mode:multiply" cx="299.5" cy="9.5" r="38.5"/><rect fill="#11D3EA" style="mix-blend-mode:multiply" transform="rotate(-60 148.47 37.886)" x="143.372" y="-7.056" width="10.196" height="89.884" rx="5.098"/><path d="M-25.389 74.253l84.86 8.107c5.498.525 9.53 5.407 9.004 10.905a10 10 0 0 1-.057.477l-12.36 85.671a10.002 10.002 0 0 1-11.634 8.42l-86.351-15.226c-5.44-.959-9.07-6.145-8.112-11.584l13.851-78.551a10 10 0 0 1 10.799-8.219z" fill="#7044FF" style="mix-blend-mode:multiply"/><circle fill="#0CD1E8" style="mix-blend-mode:multiply" cx="273.5" cy="106.5" r="20.5"/></g></svg>

Before

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -6,7 +6,7 @@
<script lang="ts">
import { IonApp, IonRouterOutlet } from "@ionic/vue";
import { defineComponent, onBeforeMount, onMounted, onUnmounted } from "vue";
import { defineComponent, onBeforeMount, onMounted } from "vue";
import { useRoute, useRouter } from "vue-router";
import { getSettings } from "@/utils/platform";
import { getSelectedAddress } from "@/utils/wallet";
@ -58,7 +58,7 @@ export default defineComponent({
sendResponse({
error: true,
message:
"ClearWallet: Invalid PAGE request method " + message?.method ?? "",
"ClearWallet: Invalid PAGE request method " + (message?.method ?? ""),
});
break;
}
@ -68,6 +68,11 @@ export default defineComponent({
return true;
};
if (chrome?.runtime?.onMessage) {
chrome.runtime.onMessage.addListener(pageListener);
console.info("page listener set");
}
onBeforeMount(() => {
getSettings().then((settings) => {
if (settings.theme !== "system") {
@ -75,18 +80,14 @@ export default defineComponent({
document.body.classList.add(settings.theme);
}
});
if (chrome?.runtime?.onMessage) {
chrome.runtime.onMessage.addListener(pageListener);
console.info("page listener set");
}
});
onUnmounted(() => {
if (chrome?.runtime?.onMessage) {
chrome.runtime.onMessage.removeListener(pageListener);
console.info("page listener removed");
}
});
// onUnmounted(() => {
// if (chrome?.runtime?.onMessage) {
// chrome.runtime.onMessage.removeListener(pageListener);
// console.info("page listener removed");
// }
// });
onMounted(() => {
switch (route?.query?.route ?? "") {

View File

@ -1,29 +1,17 @@
(() => {
// Not needed anymore since injection is done with MAIN_WORLD context
// try {
// const container = document.documentElement;
// const script = document.createElement('script');
// script.setAttribute('async', "false")
// script.setAttribute('fetchpriority', "high")
// script.src = chrome.runtime.getURL('src/extension/inject.js')
// container.prepend(script)
// script.addEventListener('load', () => { container.removeChild(script) })
// } catch (error) {
// console.info('Error: MetaMask: Provider injection failed.', error);
// }
})()
const allowedMethods = {
'eth_accounts': true,
'eth_requestAccounts': true,
'eth_chainId': true,
'personal_sign': true,
'wallet_requestPermissions': true,
'wallet_registerOnboarding': true,
'wallet_revokePermissions': true,
'eth_gasPrice': true,
'eth_getBlockByNumber': true,
'eth_blockNumber': true,
'eth_estimateGas': true,
'eth_syncing': true,
'eth_sign': true,
'net_version': true,
'eth_sendTransaction': true,
@ -53,30 +41,51 @@ window.addEventListener("message", (event) => {
if (event.source != window)
return;
if (event?.data?.type === "CLWALLET_CONTENT") {
event.data.data.resId = event.data.resId
event.data.data.type = "CLWALLET_CONTENT_MSG"
event.data.data.website = document?.location?.href ?? ''
event.data.data.data.resId = event.data.resId
event.data.data.data.type = "CLWALLET_CONTENT_MSG"
event.data.data.data.website = document?.location?.href ?? ''
if ((event?.data?.data?.method ?? 'x') in allowedMethods) {
chrome.runtime.sendMessage(event.data.data, (res) => {
event.data.data.data.method = event?.data?.data?.method ?? ''
chrome?.runtime?.sendMessage(event.data.data.data, (res) => {
if (chrome.runtime.lastError) {
console.warn("LOC1: Error sending message:", chrome.runtime.lastError);
}
const id = Number(event.data.resId.replace(/[A-Za-z]/g, '').slice(0, 10))
const data = {
target: 'metamask-inpage',
type: "CLWALLET_PAGE",
resId: event.data.resId,
data: { name: 'metamask-provider', data: {
jsonrpc: '2.0',
id,
result: res,
},
id,
method: event?.data?.data?.data?.method ?? '',
params: event?.data?.data?.data?.params ?? [],
},
}
const data = { type: "CLWALLET_PAGE", data: res, resId: event.data.resId };
// console.info('data out', data)
window.postMessage(data, "*");
})
}
else {
const data = { type: "CLWALLET_PAGE", data: { error: true, message: 'ClearWallet: Unknown method requested ' + event?.data?.data?.method ?? '' }, resId: event.data.resId };
const data = {
type: "CLWALLET_PAGE",
data: {
data: {
result: { error: true, message: 'ClearWallet: Unknown method requested ' + (event?.data?.data?.data?.method ?? '') }
} }
, resId: event.data.resId };
window.postMessage(data, "*");
}
} else if (event?.data?.type === "CLWALLET_PING") {
event.data.data.resId = event.data.resId
event.data.data.type = "CLWALLET_CONTENT_MSG"
event.data.data.method = "wallet_connect"
event.data.data.params = Array(0)
chrome.runtime.sendMessage(event.data.data, async (res) => {
event.data.data.data.resId = event.data.resId
event.data.data.data.type = "CLWALLET_CONTENT_MSG"
event.data.data.data.method = "wallet_connect"
event.data.data.data.params = Array(0)
chrome.runtime.sendMessage(event.data.data.data, async (res) => {
if (chrome.runtime.lastError) {
console.warn("LOC2: Error sending message:", chrome.runtime.lastError);
}

View File

@ -18,6 +18,10 @@ const ProviderInfo: EIP6963ProviderInfo = {
rdns: 'clear-wallet.flashsoft.eu/',
}
const THROTTLE_LEVEL = 20;
const THROTTLE_TIMEOUT = 500;
const MAX_PROMISES = 50
function loadEIP1193Provider(provider: any) {
function announceProvider() {
@ -69,27 +73,43 @@ const getListnersCount = (): number => {
return count
}
const sendMessage = (args: RequestArguments, ping = false) => {
if(Object.values(promResolvers).filter(r=> r).length < 10 ) {
return new Promise((resolve, reject) => {
const sendMessage = (args: RequestArguments, ping = false, from = 'request'): Promise<unknown> => {
return new Promise(async (resolve, reject) => {
if(promResolvers.size < MAX_PROMISES && promResolvers.size > THROTTLE_LEVEL) {
await new Promise((res) => setTimeout(res, THROTTLE_TIMEOUT))
} else if(promResolvers.size > MAX_PROMISES) {
reject({code: -32000, message: 'ClearWallet: Too many requests', error: true })
}
const resId = [...`${Math.random().toString(16) + Date.now().toString(16)}`].slice(2).join('')
promResolvers.set(resId, { resolve, reject })
const data = { type: "CLWALLET_CONTENT", data: args, resId};
const p = [ "eth_signTypedData", "eth_signTypedData_v3", "eth_signTypedData_v4"]
const method = args.method
if (p.includes(args.method)) {
args.method = undefined as any
}
const data = {
type: "CLWALLET_CONTENT",
target: 'metamask-contentscript',
data: {
method,
name: 'metamask-provider', data: args, jsonrpc: '2.0', id: Number(resId.replace(/[A-Za-z]/g, '').slice(0, 10)) },
resId,
from,
}
if (ping) {
data.type = 'CLWALLET_PING'
}
// console.info('data in', data)
window.postMessage(data, "*");
})
} else {
return new Promise((resolve, reject) => {
reject(new Error("You have reached the maximum number of concurent wallet messeges."))
})
}
})
}
class MetaMaskAPI {
isMetaMask = true
isClWallet = true
_state = {accounts: Array(1), isConnected: true, isUnlocked: true, initialized: true, isPermanentlyDisconnected: false}
_sentWarnings = {enable: false, experimentalMethods: false, send: false, events: {}}
// Deprecated - hardcoded for now, websites should not access this directly since is deprecated for a long time
@ -125,25 +145,26 @@ class MetaMaskAPI {
}
request(args: RequestArguments): Promise<unknown> {
return sendMessage(args)
return sendMessage(args) as Promise<unknown>
}
// Deprecated
sendAsync (arg1: any, arg2: any): void | Promise<unknown> {
// return this.send(arg1, arg2) as any
if( typeof arg1 === 'string' ) {
return sendMessage({
method: arg1,
params: arg2 as object
})
}, false , 'sendAsync') as Promise<unknown>
}else if (typeof arg2 === 'function'){
sendMessage(arg1 as RequestArguments).then(result => {
((sendMessage(arg1 as RequestArguments, false, 'sendAsync') as Promise<unknown>).then(result => {
(arg2 as (e?: any, r?: any) => any )(undefined, {
id: (arg1 as RequestArguments)?.id,
jsonrpc: '2.0',
method: (arg1 as RequestArguments).method,
result
}
)
}).catch( e => {
)
}) as Promise<unknown>).catch( e => {
(arg2 as (er?: any, r?: any) => any )(new Error(e), {
id: (arg1 as RequestArguments)?.id,
jsonrpc: '2.0',
@ -152,45 +173,44 @@ class MetaMaskAPI {
}
)
})
}
} else {
return sendMessage(arg1 as RequestArguments, false, 'sendAsync') as Promise<unknown>
}
}
// Deprecated
send (arg1: unknown, arg2: unknown): unknown {
const resultFmt = async (result: Promise<any>) => {
return {
"id": 0,
"jsonrpc": "2.0",
result: await result
}
}
if (arg2 === undefined) {
if( typeof arg1 === 'string' ) {
return sendMessage({
return resultFmt(sendMessage({
method: arg1,
params: undefined
})
} else if (typeof arg1 === 'object') {
return sendMessage(arg1 as RequestArguments)
}, false, 'send'))
} else {
console.info('ERROR: Clear Wallet: faulty request')
return resultFmt(sendMessage(arg1 as RequestArguments, false, 'send'))
}
} else if (typeof arg1 === 'object') {
if( typeof arg1 === 'string' ) {
return resultFmt(sendMessage(arg1 as RequestArguments, false, 'send'))
} else {
return resultFmt(sendMessage(arg1 as RequestArguments, false, 'send'))
}
}else if( typeof arg1 === 'string' ) {
return sendMessage({
return resultFmt( sendMessage({
method: arg1,
params: arg2 as object
})
}, false, 'send'))
}else if (typeof arg2 === 'function'){
sendMessage(arg1 as RequestArguments).then(result => {
(arg2 as (e?: any, r?: any) => any )(undefined, {
id: (arg1 as RequestArguments)?.id,
jsonrpc: '2.0',
method: (arg1 as RequestArguments).method,
result
}
)
}).catch( e => {
(arg2 as (er?: any, r?: any) => any )(new Error(e), {
id: (arg1 as RequestArguments)?.id,
jsonrpc: '2.0',
method: (arg1 as RequestArguments).method,
error: new Error(e)
}
)
})
}
return resultFmt( sendMessage(arg1 as RequestArguments, false, 'send'))
} else {
return resultFmt(sendMessage(arg1 as RequestArguments , false, 'send'))
}
}
on (eventName: string, callback: () => void) {
this.addListener(eventName, callback)
@ -308,118 +328,173 @@ class MetaMaskAPI {
_handleStreamDisconnect() { return true }
_handleUnlockStateChanged() { return true }
_sendSync () {
console.info('ERROR: Clear Wallet: Sync calling is deprecated and not supported')
console.warn('ERROR: Clear Wallet: Sync calling is deprecated and not supported')
}
}
const eth = new Proxy( new MetaMaskAPI(), {
deleteProperty: () => { return true },
// set(obj, prop, value) {
// // Reflect.set(obj, prop, value);
// return true;
// }
})
const listner = function(event: any) {
if (event.source != window) return;
if (event?.data?.type === "CLWALLET_PAGE") {
if(!['CLWALLET_PAGE', 'CLWALLET_PAGE_LISTENER'].includes(event?.data?.type)) return;
const eventData = event?.data
const eventDataData = event?.data?.data
const eventDataDataData = event?.data?.data?.data
const resId = eventData?.resId
const result = eventDataDataData?.result
if (eventData?.type === "CLWALLET_PAGE") {
try {
if(event?.data?.data?.error){
promResolvers.get(event.data.resId)?.reject(event.data.data);
console.info('Error: ', event?.data?.data)
if(result?.error){
promResolvers.get(resId).reject(result);
}else {
promResolvers.get(event.data.resId)?.resolve(event.data.data);
promResolvers.get(resId).resolve(result);
}
promResolvers.delete(event.data.resId)
} catch (e) {
// console.log('Failed to connect resolve msg', e)
// console.error('Failed to connect resolve msg', e)
promResolvers.get(resId)?.reject({code: -32000, message: 'Failed to connect resolve msg', error: true });
}
} else if(event?.data?.type === "CLWALLET_PAGE_LISTENER") {
if((event?.data?.data?.listner ?? 'x') in listners ) {
} else if(eventData?.type === "CLWALLET_PAGE_LISTENER") {
if((eventDataData?.listner ?? 'x') in listners ) {
try {
const listnerName = event?.data?.data?.listner as ('accountsChanged' | 'connect' | 'disconnect' | 'chainChanged')
if( listnerName === 'connect' && event?.data?.data?.data) {
(<any>eth).networkVersion = event?.data?.data?.data?.chainId?.toString(10) ?? '137';
(<any>eth).chainId = event?.data?.data?.data?.chainId ?? '0x89';
(<any>eth).selectedAddress = event?.data?.data?.address ?? null;
const listnerName = eventDataData.listner as ('accountsChanged' | 'connect' | 'disconnect' | 'chainChanged')
if( listnerName === 'connect' && eventDataData) {
(<any>eth).networkVersion = String(parseInt(eventDataDataData?.chainId ?? "0x89", 16));
(<any>eth).chainId = eventDataDataData?.chainId ?? '0x89';
(<any>eth).selectedAddress = eventDataData?.address?.[0] ?? null;
(<any>eth).accounts = eventDataData.address?.[0] ? [eventDataData.address?.[0]] : [];
(<any>eth).isConnected = () => true;
} else if( listnerName === 'chainChanged' ) {
// console.info(event?.data?.data?.data);
(<any>eth).networkVersion = event?.data?.data?.data.toString(10) ?? '137';
(<any>eth).chainId = event?.data?.data?.data ?? '0x89';
(<any>eth).networkVersion = String(parseInt(eventDataDataData ?? "0x89", 16));
(<any>eth).chainId = eventDataData ?? '0x89';
} else if ( listnerName === 'accountsChanged' ) {
(<any>eth).selectedAddress = event?.data?.data?.data?.address ?? 'dummy-string';
(<any>eth).accounts = eventDataData?.[0] ? [eventDataData?.[0]] : [];
(<any>eth).selectedAddress = eventDataData?.[0] ?? '';
}
listners[listnerName].forEach(listner => listner(event?.data?.data?.data));
listners[listnerName].forEach(listner => listner(eventDataDataData));
listners.once[listnerName].forEach(listner => {
listner(event?.data?.data?.data)
listner(eventDataData)
listners.once[listnerName].delete(listner)
});
} catch (e) {
// console.info(e)
// ignore
}
}
}
}
if(promResolvers.has(resId)) {
promResolvers.delete(resId)
}
}
window.addEventListener("message",listner)
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const proxy1 = new Proxy(new MetaMaskAPI(), {
get: function (target: any, prop: any) {
// Intercept method calls and log them
if (typeof target[prop] === 'function') {
return function (...args: any[]) {
console.log(`Calling ${prop} with arguments:`, args);
// eslint-disable-next-line prefer-spread
const result = target[prop].apply(target, args);
console.log(`${prop} returned:`, result);
return result;
};
} else {
console.log(`Reading ${prop}`);
return target[prop];
}
},
})
Object.defineProperties(eth, {
selectedAddress: { enumerable: false },
chainId: { enumerable: false },
networkVersion: { enumerable: false },
});
// const web3Shim = {
// currentProvider: eth,
// __isMetaMaskShim__: true
// }
const web3Shim = {
currentProvider: eth,
__isMetaMaskShim__: true
}
const injectWallet = (win: any) => {
Object.defineProperty(win, 'ethereum', {
const ethKey = 'ethereum'
if (win[ethKey]?.isClWallet) {
return;
}
Object.defineProperty(win, ethKey, {
value: eth,
});
Object.defineProperty(win, 'web3', {
value: eth
value: web3Shim
});
sendMessage({
method: 'wallet_ready'
}, true)
console.log('Clear wallet injected', (window as any).ethereum, win)
}
injectWallet(this);
loadEIP1193Provider(eth)
// HELPERS TO CLONE METAMASK API
// window.addEventListener("message" , (event) => {
// console.log('event', JSON.stringify(event?.data?.data, null, 2), JSON.stringify(event?.data, null, 2))
// })
// setTimeout(() => {
// // console.log('Metamask clone test');
// // (<any>window).ethereum.request({method: 'eth_requestAccounts', params: Array(0)}).then((res: any) => { console.log(res, '111111111')});
// // (<any>window).ethereum.request({method: 'eth_accounts', params: Array(0)}).then((res: any) => { console.log(res, '111111111')});
// // (<any>window).ethereum.request({method: 'eth_chainId', params: Array(0)}).then((res: any) => { console.log(res, '111111111')});
// // (<any>window).ethereum.request({method: 'wallet_requestPermissions', params: [{eth_accounts: {}}]}).then((res: any) => { console.log(res, '111111111')});
// // (<any>window).ethereum.request({method: 'net_version', params: []}).then((res: any) => { console.log(res, '111111111')});
// // (<any>window).ethereum.request({method: 'wallet_switchEthereumChain', params: [{chainId: "0x89"}]}).then((res: any) => { console.log(res, '111111111')});
// // (<any>window).ethereum2.request({method: 'wallet_switchEthereumChain', params: [{chainId: "0x89"}]}).then((res: any) => { console.log(res, '111111111')});
// // (<any>window).ethereum.on('connect', ((a: any, b: any) => console.log('connect', a, b)));
// // (<any>window).ethereum.on('accountsChanged', ((a: any, b: any) => console.log('accountsChanged', a, b)));
// // (<any>window).ethereum.on('chainChanged', ((a: any) => console.log('chainChanged', a, typeof a)));
// // console.log((<any>window).ethereum.on('message', (a: any, b:any) => console.log(a,b)))
// console.log((<any>window).ethereum.toString())
// console.log((<any>window).ethereum2.toString())
// console.log((<any>window).ethereum.Symbold)
// console.log('Metamask clone test');
// console.log((<any>window).ethereum.send({
// "jsonrpc": "2.0",
// "method": "eth_accounts",
// "params": [],
// "id": 0
// }))
// console.log((<any>window).ethereum.request({
// "jsonrpc": "2.0",
// "method": "eth_accounts",
// "params": [],
// "id": 0
// }))
// }, 5000)
// setTimeout(async () => {
// console.log('Metamask clone test');
// (<any>window).ethereum.request({method: 'eth_requestAccounts', params: Array(0)}).then((res: any) => { console.log(res, 'MT: eth_requestAccounts')});
// (<any>window).ethereum2.request({method: 'eth_requestAccounts', params: Array(0)}).then((res: any) => { console.log(res, 'CW: eth_requestAccounts')});
// await new Promise((resolve) => setTimeout(resolve, 1000));
// (<any>window).ethereum.request({method: 'eth_accounts', params: Array(0)}).then((res: any) => { console.log(res, 'MT: eth_accounts')});
// (<any>window).ethereum2.request({method: 'eth_accounts', params: Array(0)}).then((res: any) => { console.log(res, 'CW: eth_accounts')});
// await new Promise((resolve) => setTimeout(resolve, 1000));
// (<any>window).ethereum.request({method: 'eth_chainId', params: Array(0)}).then((res: any) => { console.log(res, 'MT: eth_chainId')});
// (<any>window).ethereum2.request({method: 'eth_chainId', params: Array(0)}).then((res: any) => { console.log(res, 'CW: eth_chainId')});
// await new Promise((resolve) => setTimeout(resolve, 1000));
// (<any>window).ethereum.request({method: 'eth_blockNumber', params: Array(0)}).then((res: any) => { console.log(res, 'MT: eth_chainId')});
// (<any>window).ethereum2.request({method: 'eth_blockNumber', params: Array(0)}).then((res: any) => { console.log(res, 'CW: eth_chainId')});
// await new Promise((resolve) => setTimeout(resolve, 1000));
// (<any>window).ethereum.request({method: 'wallet_requestPermissions', params: [{eth_accounts: {}}]}).then((res: any) => { console.log(res, 'MT: wallet_requestPermissions')});
// (<any>window).ethereum2.request({method: 'wallet_requestPermissions', params: [{eth_accounts: {}}]}).then((res: any) => { console.log(res, 'CW: wallet_requestPermissions')});
// await new Promise((resolve) => setTimeout(resolve, 1000));
// (<any>window).ethereum.request({method: 'net_version', params: []}).then((res: any) => { console.log(res, 'MT: net_version')});
// (<any>window).ethereum2.request({method: 'net_version', params: []}).then((res: any) => { console.log(res, 'CW: net_version')});
// await new Promise((resolve) => setTimeout(resolve, 1000));
// (<any>window).ethereum.request({method: 'wallet_switchEthereumChain', params: [{chainId: "0x89"}]}).then((res: any) => { console.log(res, 'MT: wallet_switchEthereumChain')});
// (<any>window).ethereum2.request({method: 'wallet_switchEthereumChain', params: [{chainId: "0x89"}]}).then((res: any) => { console.log(res, 'CW: wallet_switchEthereumChain')});
// await new Promise((resolve) => setTimeout(resolve, 1000));
// (<any>window).ethereum.on('connect', ((a: any, b: any) => console.log('connect MT', a, b)));
// (<any>window).ethereum.on('accountsChanged', ((a: any, b: any) => console.log('accountsChanged MT', a, b)));
// (<any>window).ethereum.on('chainChanged', ((a: any) => console.log('chainChanged MT', a, typeof a)));
// await new Promise((resolve) => setTimeout(resolve, 1000));
// (<any>window).ethereum2.on('connect', ((a: any, b: any) => console.log('connect CW', a, b)));
// (<any>window).ethereum2.on('accountsChanged', ((a: any, b: any) => console.log('accountsChanged CW', a, b)));
// (<any>window).ethereum2.on('chainChanged', ((a: any) => console.log('chainChanged CW', a, typeof a)));
// }, 3500)
// console.log( (window as any).ethereum.request({method: 'eth_chainId'}))

View File

@ -2,10 +2,15 @@ import type { listnerType } from '@/extension/types'
export const triggerListner = ( type: listnerType, listnerData: any ) => {
const data = { type: "CLWALLET_EXT_LISTNER", data: { listner: type, data: listnerData } }
chrome.tabs.query({}, (tabs) => tabs.forEach( tab =>
{
chrome.tabs.query({}, (tabs) => tabs.forEach( async tab =>
{
if (tab?.id) {
chrome.tabs.sendMessage(tab.id, data)
try {
await chrome.tabs.sendMessage(tab.id, data)
} catch
{
// ignore
}
}
}
));

View File

@ -3,8 +3,8 @@
"name": "__MSG_appName__",
"description": "__MSG_appDesc__",
"default_locale": "en",
"version": "1.3.1",
"version_name": "1.3.1",
"version": "1.3.7",
"version_name": "1.3.7",
"icons": {
"16": "assets/extension-icon/wallet_16.png",
"32": "assets/extension-icon/wallet_32.png",
@ -47,7 +47,7 @@
],
"all_frames": true,
"run_at": "document_start",
"js": ["/src/extension/content.ts"]
"js": ["/src/extension/content.js"]
},
{
"matches": [
@ -56,7 +56,7 @@
],
"all_frames": true,
"run_at": "document_start",
"js": ["/src/extension/inject.ts"],
"js": ["/src/extension/inject.js"],
"world": "MAIN"
}
],

View File

@ -38,7 +38,9 @@ import {
import type { RequestArguments } from '@/extension/types'
import { rpcError } from '@/extension/rpcConstants'
import { updatePrices } from '@/utils/gecko'
import { mainNets, testNets } from '@/utils/networks'
import { allTemplateNets } from '@/utils/networks'
// const METAMAKS_EXTENSION_ID = 'nkbihfbeogaeaoehlefnkodbefgpgknn'
let notificationUrl: string
@ -154,9 +156,7 @@ const mainListner = (message: RequestArguments, sender:any, sendResponse: (a: an
if(message?.type !== "CLWALLET_CONTENT_MSG") {
return true
}
console.info('main listener', message);
(async () => {
if (!(message?.method)) {
sendResponse({
@ -167,24 +167,36 @@ const mainListner = (message: RequestArguments, sender:any, sendResponse: (a: an
// ETH API
switch (message.method) {
case 'eth_call': {
sendResponse(await evmCall(message?.params?.[0]))
try {
sendResponse(await evmCall(message?.params ?? []))
} catch (e) {
sendResponse({
error: true,
code: rpcError.USER_REJECTED,
message: 'No network or user selected'
})
console.warn('Error: eth_call', e)
}
break
}
case 'eth_getBlockByNumber': {
try {
const params = message?.params?.[0] as any
const block = await getBlockByNumber(params) as any
block.gasLimit = block.gasLimit.toHexString()
block.gasUsed = block.gasUsed.toHexString()
block.baseFeePerGas = block.baseFeePerGas.toHexString()
block._difficulty = block._difficulty.toHexString()
sendResponse(block)
} catch {
const newBlock = {...block}
newBlock.gasLimit = numToHexStr(block.gasLimit)
newBlock.gasUsed = numToHexStr(block.gasUsed)
newBlock.baseFeePerGas = numToHexStr(block.baseFeePerGas)
newBlock._difficulty = numToHexStr(block.difficulty)
newBlock.difficulty = block._difficulty
sendResponse(newBlock)
} catch (e) {
sendResponse({
error: true,
code: rpcError.USER_REJECTED,
message: 'No network or user selected'
})
console.warn('Error: eth_getBlockByNumber', e)
}
break;
}
@ -195,49 +207,52 @@ const mainListner = (message: RequestArguments, sender:any, sendResponse: (a: an
}else {
sendResponse(numToHexStr(Number(await getTxCount(message?.params?.[0] as string))))
}
} catch {
} catch (e) {
sendResponse({
error: true,
code: rpcError.USER_REJECTED,
message: 'No network or user selected'
})
console.warn('Error: eth_getTransactionCount', e)
}
break
}
case 'eth_getTransactionByHash': {
try {
sendResponse(await getTxByHash(message?.params?.[0] as string))
} catch {
} catch (e) {
sendResponse({
error: true,
code: rpcError.USER_REJECTED,
message: 'No network or user selected'
})
console.warn('Error: eth_getTransactionByHash', e)
}
break
}
case 'eth_getTransactionReceipt':{
try {
sendResponse(await getTxReceipt(message?.params?.[0] as string))
} catch {
} catch (e) {
sendResponse({
error: true,
code: rpcError.USER_REJECTED,
message: 'No network or user selected'
})
console.warn('Error: eth_getTransactionReceipt', e)
}
break
}
case 'eth_gasPrice': {
try {
sendResponse(numToHexStr(BigInt(Math.trunc(await getGasPrice() * 1e9))))
} catch {
} catch(e) {
sendResponse({
error: true,
code: rpcError.USER_REJECTED,
message: 'No network or user selected'
})
console.warn('Error: eth_gasPrice', e)
}
break;
}
@ -246,36 +261,39 @@ const mainListner = (message: RequestArguments, sender:any, sendResponse: (a: an
const balance = await getBalance()
const balanceHex = numToHexStr(balance ?? 0n)
sendResponse(balanceHex)
} catch {
} catch (e) {
sendResponse({
error: true,
code: rpcError.USER_REJECTED,
message: 'No network or user selected'
})
console.warn('Error: eth_getBalance', e)
}
break
}
case 'eth_getCode': {
try {
sendResponse(await getCode(message?.params?.[0] as string))
} catch {
} catch (e) {
sendResponse({
error: true,
code: rpcError.USER_REJECTED,
message: 'No network or user selected'
})
console.warn('Error: eth_getCode', e)
}
break
}
case 'eth_blockNumber': {
try {
sendResponse(await getBlockNumber())
} catch {
sendResponse(numToHexStr(await getBlockNumber()))
} catch (e) {
sendResponse({
error: true,
code: rpcError.USER_REJECTED,
message: 'No network or user selected'
})
console.warn('Error: eth_blockNumber', e)
}
break
}
@ -311,12 +329,14 @@ const mainListner = (message: RequestArguments, sender:any, sendResponse: (a: an
code: rpcError.USER_REJECTED,
message: 'Gas estimate failed'
})
}
} else {
sendResponse({
error: true,
code: rpcError.USER_REJECTED,
message: 'No network or user selected'
})
console.warn('Error: eth_estimateGas', err)
}
}
break
}
@ -324,12 +344,13 @@ const mainListner = (message: RequestArguments, sender:any, sendResponse: (a: an
case 'eth_accounts': {
try {
sendResponse(await getSelectedAddress())
} catch {
} catch (e) {
sendResponse({
error: true,
code: rpcError.USER_REJECTED,
message: 'No network or user selected'
})
console.warn('Error: eth_accounts', e)
}
break
}
@ -338,12 +359,13 @@ const mainListner = (message: RequestArguments, sender:any, sendResponse: (a: an
const network = await getSelectedNetwork()
const chainId = network?.chainId ?? 0
sendResponse(`0x${chainId.toString(16)}`)
} catch {
} catch (e) {
sendResponse({
error: true,
code: rpcError.USER_REJECTED,
message: 'No network or user selected'
})
console.warn('Error: eth_chainId', e)
}
break
}
@ -456,7 +478,7 @@ const mainListner = (message: RequestArguments, sender:any, sendResponse: (a: an
} as any)
}
} catch(err) {
// console.log(err)
console.warn('Error: eth_sendTransaction', err)
sendResponse({
error: true,
code: rpcError.USER_REJECTED,
@ -523,7 +545,7 @@ const mainListner = (message: RequestArguments, sender:any, sendResponse: (a: an
clearPk()
}
} catch (e) {
// console.info(e)
console.warn('Error: signTypedData', e)
sendResponse({
error: true,
code: rpcError.USER_REJECTED,
@ -544,7 +566,7 @@ const mainListner = (message: RequestArguments, sender:any, sendResponse: (a: an
break
}
case 'web3_clientVersion': {
sendResponse("MetaMask/v10.20.0")
sendResponse("MetaMask/v11.0.0")
break
}
case 'wallet_getPermissions':
@ -563,9 +585,21 @@ const mainListner = (message: RequestArguments, sender:any, sendResponse: (a: an
}])
break
}
case 'wallet_revokePermissions': {
sendResponse(null)
break
}
case 'wallet_registerOnboarding': {
sendResponse(true)
break
}
case 'eth_syncing': {
sendResponse(false)
break
}
case 'net_version': {
const network = await getSelectedNetwork()
const chainId = network?.chainId ?? 0
const chainId = String(network?.chainId ?? 1)
sendResponse(chainId)
break
}
@ -600,7 +634,7 @@ const mainListner = (message: RequestArguments, sender:any, sendResponse: (a: an
}
case 'wallet_addEthereumChain': {
const userNetworks = await getNetworks()
const networks = {...mainNets, ...testNets, ...userNetworks}
const networks = {...allTemplateNets, ...userNetworks}
const chainId = Number(message?.params?.[0]?.chainId ?? '0')
if(!chainId) {
sendResponse({
@ -659,7 +693,8 @@ const mainListner = (message: RequestArguments, sender:any, sendResponse: (a: an
const [network, account] = await Promise.all([pNetwork, pAccount])
const address = account?.address ? [account?.address] : []
const chainId = `0x${(network?.chainId ?? 0).toString(16)}`
const data = { type: "CLWALLET_PAGE_LISTENER", data: {
const data = {
type: "CLWALLET_PAGE_LISTENER", data: {
listner: 'connect',
data: {
chainId
@ -703,12 +738,13 @@ const mainListner = (message: RequestArguments, sender:any, sendResponse: (a: an
sendResponse({
error: true,
code: rpcError.INVALID_PARAM,
message: 'ClearWallet: Invalid request method ' + message?.method ?? ''
message: 'ClearWallet: Invalid request method ' + (message?.method ?? '')
})
break
}
}
}
}
)();
return true;

View File

@ -57,6 +57,7 @@ export interface Settings {
theme: 'system' | 'light' | 'dark'
lastLock: number
lockOutBlocked: boolean
copyLowerCaseAddress?: boolean
}
export type listnerType = 'accountsChanged' | 'connect' | 'disconnect' | 'chainChanged'

View File

@ -1,6 +1,7 @@
import { createRouter, createWebHistory } from '@ionic/vue-router';
import { RouteRecordRaw } from 'vue-router';
import AppTabs from '@/views/AppTabs.vue'
import HomeTab from '@/views/HomeTab.vue'
const routes: Array<RouteRecordRaw> = [
{
@ -41,7 +42,7 @@ const routes: Array<RouteRecordRaw> = [
},
{
path: 'home',
component: () => import('@/views/HomeTab.vue'),
component: HomeTab,
},
{
path: 'networks',

View File

@ -68,57 +68,66 @@ export const mainNets: {[key: number]: Network} = {
}
export const testNets = {
5: {
name: 'TESTNET Ethereum Goerli',
rpc: 'https://rpc.ankr.com/eth_goerli',
chainId: 5,
explorer: 'https://goerli.etherscan.io',
icon: 'eth.webp'
11155111: {
name: 'TESTNET Ethereum Sepolia',
rpc: 'https://ethereum-sepolia-rpc.publicnode.com',
chainId: 11155111,
explorer: 'https://sepolia.etherscan.io',
icon: 'eth_t.webp'
},
4: {
name: 'TESTNET Ethereum Rinkeby',
rpc: 'https://rpc.ankr.com/eth_rinkeby',
chainId: 4,
explorer: 'https://rinkeby.etherscan.io',
icon: 'eth.webp'
84532: {
name: 'TESTNET Base Sepolia',
rpc: 'https://sepolia.base.org',
chainId: 84532,
explorer: 'https://sepolia.basescan.org/',
icon: 'base_t.webp'
},
80001: {
name: 'TESTNET Polygon',
rpc: 'https://rpc.ankr.com/polygon_mumbai',
chainId: 80001,
explorer: 'https://mumbai.polygonscan.com',
icon:'polygon.webp'
80002: {
name: 'TESTNET Polygon Amoy',
rpc: 'https://rpc-amoy.polygon.technology',
chainId: 80002,
explorer: 'https://oklink.com/amoy',
icon:'polygon_t.webp'
},
100100: {
100200: {
name: 'TESTNET Gnosis Chiado',
rpc: 'https://gnosis-mainnet.public.blastapi.io',
chainId: 100100,
explorer: '',
icon:'xdai.webp'
rpc: 'https://rpc.chiadochain.net',
chainId: 100200,
explorer: 'https://gnosis-chiado.blockscout.com',
icon:'xdai_t.webp'
},
420: {
name: 'TESTNET Optimism Goreli',
rpc: 'https://goerli.optimism.io/',
chainId: 420,
explorer: 'https://goerli.etherscan.io',
icon: 'optimism.webp'
icon: 'optimism_t.webp'
},
11155420 : {
name: 'TESTNET Optimism Sepolia',
rpc: 'https://sepolia.optimism.io',
chainId: 11155420 ,
explorer: 'https://sepolia-optimistic.etherscan.io/',
icon: 'optimism_t.webp'
},
97: {
name: 'TESTNET BSC',
rpc: 'https://bsctestapi.terminet.io/rpc',
rpc: 'https://bsc-testnet-rpc.publicnode.com',
chainId: 97,
explorer: 'https://testnet.bscscan.com',
icon: 'binance.webp'
icon: 'binance_t.webp'
},
421613: {
name: 'TESTNET Arbitrum One',
rpc: 'https://goerli-rollup.arbitrum.io/rpc/',
chainId: 421613,
explorer: 'https://testnet.arbiscan.io',
icon: 'arbitrum.webp'
421614: {
name: 'TESTNET Arbitrum Sepolia',
rpc: 'https://sepolia-rollup.arbitrum.io/rpc',
chainId: 421614,
explorer: 'https://sepolia.arbiscan.io/',
icon: 'arbitrum_t.webp'
},
}
export const allTemplateNets = {...mainNets, ...testNets}
export const chainIdToPriceId = (chainId: number): string => {
return mainNets?.[chainId]?.priceId ?? 'x'
}

View File

@ -1,6 +1,8 @@
import type { Network, Account, Prices, Settings, Networks, HistoryItem, ContractActions, ContractAction, Contact } from '@/extension/types'
import type { Ref } from 'vue'
const pottentialMissingSettings = ['copyLowerCaseAddress']
const defaultSettings = {
enableStorageEnctyption: false,
encryptAfterEveryTx: false,
@ -8,7 +10,8 @@ const defaultSettings = {
lockOutPeriod: 2,
lockOutBlocked: false,
theme: 'system',
lastLock: Date.now()
lastLock: Date.now(),
copyLowerCaseAddress: false
}
const defaultAbis = {} as {
@ -45,6 +48,7 @@ export const saveNetwork = async (network: Network): Promise<void> => {
export const getSelectedNetwork = async (): Promise<Network > => {
console.info('network', (await (storageGet('selectedNetwork')))?.selectedNetwork)
return (await storageGet('selectedNetwork'))?.selectedNetwork ?? null as unknown as Network
}
@ -118,7 +122,13 @@ export const wipeHistory = async (): Promise<void> => {
}
export const getSettings = async (): Promise<Settings> => {
return (await storageGet('settings'))?.settings ?? defaultSettings as unknown as Settings
const settings = (await storageGet('settings'))?.settings ?? defaultSettings as unknown as Settings
pottentialMissingSettings.forEach( (s: string) => {
if(settings[s] === undefined) {
settings[s as keyof Settings] = defaultSettings[s as keyof Settings]
}
})
return settings
}
export const setSettings = async (settings: Settings): Promise<void> => {
@ -264,7 +274,7 @@ export const strToHex = (str: string) => `0x${str.split('').map( s => s.charCod
export const numToHexStr = (num: number | bigint) => `0x${num.toString(16)}`
export const copyAddress = async (address: string, toastRef: Ref<boolean>) => {
export const copyText = async (address: string, toastRef: Ref<boolean>) => {
await navigator.clipboard.writeText(address)
toastRef.value = true
}
@ -305,3 +315,5 @@ export const openTab = (url: string) => {
url
});
}
export const getVersion = () => chrome?.runtime?.getManifest()?.version ?? ''

View File

@ -1,5 +1,30 @@
import { getSelectedAccount, getSelectedNetwork } from '@/utils/platform';
import { ethers} from "ethers"
import { getSelectedAccount, getSelectedNetwork, numToHexStr } from '@/utils/platform';
import { ethers } from "ethers"
const convertReceipt = (receipt: ethers.TransactionReceipt | null) => {
if(!receipt) return null
const newReceipt = {...receipt} as any
newReceipt.transactionHash = newReceipt.hash
newReceipt.blockNumber = numToHexStr(newReceipt.blockNumber)
newReceipt.index = numToHexStr(newReceipt.index)
newReceipt.transactionIndex = newReceipt.index
newReceipt.cumulativeGasUsed = numToHexStr(newReceipt.cumulativeGasUsed)
newReceipt.gasUsed = numToHexStr(newReceipt.gasUsed)
newReceipt.gasPrice = numToHexStr(newReceipt.gasPrice)
newReceipt.type = "0x2"
newReceipt.status = numToHexStr(newReceipt.status)
newReceipt.logs = receipt?.logs?.map((log: any) => {
return {
...log,
blockNumber: numToHexStr(log.blockNumber),
logIndex: numToHexStr(log.index),
transactionIndex: numToHexStr(log.transactionIndex),
removed: false
}
})
return newReceipt
}
export const signMsg = async (msg: string) => {
const account = await getSelectedAccount()
@ -11,15 +36,15 @@ export const signTypedData = async (msg: string) => {
const account = await getSelectedAccount()
const wallet = new ethers.Wallet(account.pk)
const parsedMsg = JSON.parse(msg)
if(parsedMsg?.primaryType) {
if(parsedMsg.primaryType in parsedMsg.types){
parsedMsg.types = {
[parsedMsg.primaryType]: parsedMsg.types[parsedMsg.primaryType]
}
const types = {} as Record<string, any>
for (const key in parsedMsg.types) {
if (key !== 'EIP712Domain') {
types[key] = parsedMsg.types[key]
}
}
return await wallet.signTypedData(parsedMsg.domain, parsedMsg.types, parsedMsg.message)
parsedMsg.types = types
const args = [parsedMsg.domain, parsedMsg.types, parsedMsg.message]
return await wallet.signTypedData(args[0], args[1], args[2])
}
export const getBalance = async () =>{
@ -55,10 +80,24 @@ export const estimateGas = async ({to = '', from = '', data = '', value = '0x0'
return await provider.estimateGas({to, from, data, value})
}
export const evmCall = async ({to = '', from = '', data = '', value = '0x0' }: {to: string, from: string, data: string, value: string}) => {
export const evmCall = async (params: any[]) => {
const tx = {} as {to: string, from: string, data: string, value: string, blockTag: string}
const param1 = params[0] as any
if(param1.to) tx.to = param1.to
if(param1.from) tx.from = param1.from
if(param1.data) tx.data = param1.data
if(param1.value) tx.value = param1.value
const param2 = params[1] as string
if (param2.startsWith('0x')) {
tx.blockTag = param2
} else {
tx.blockTag = 'latest'
}
const network = await getSelectedNetwork()
const provider = new ethers.JsonRpcProvider(network.rpc)
return await provider.call({to, from, data, value})
const result = await provider.call(tx)
return result
}
export const getTxByHash = async (hash: string) => {
@ -68,9 +107,17 @@ export const getTxByHash = async (hash: string) => {
}
export const getTxReceipt = async (hash: string) => {
try {
if (!hash) return null
const network = await getSelectedNetwork()
const provider = new ethers.JsonRpcProvider(network.rpc)
return await provider.getTransactionReceipt(hash)
const receipt = await provider.getTransactionReceipt(hash)
return convertReceipt(receipt)
} catch (e) {
console.error(e)
return null
}
}
export const getCode = async (addr: string) => {

View File

@ -31,7 +31,7 @@
{{ account.name }}
</ion-label>
</ion-item>
<ion-item @click="copyAddress(account.address, getToastRef())">
<ion-item @click="copyText(account.address, getToastRef())">
<p style="font-size: 0.7rem">{{ account.address }}</p>
<ion-icon :icon="copyOutline"></ion-icon>
</ion-item>
@ -52,7 +52,7 @@
</ion-toolbar>
</ion-header>
<ion-content class="ion-padding">
<ion-item @click="copyAddress(shownPk, getToastRef())" button>
<ion-item @click="copyText(shownPk, getToastRef())" button>
<ion-icon style="margin-right: 0.5rem" :icon="copyOutline" />
<ion-label button>PK</ion-label>
<ion-input
@ -72,7 +72,7 @@
import { defineComponent, ref, Ref } from "vue";
import {
getAccounts,
copyAddress,
copyText,
replaceAccounts,
getSettings,
clearPk,
@ -220,7 +220,7 @@ export default defineComponent({
addCircleOutline,
copyOutline,
toastState,
copyAddress,
copyText,
getToastRef,
deleteAccount,
editAccount,

View File

@ -42,9 +42,16 @@
</template>
<ion-item>
<ion-button @click="onCancel">Cancel</ion-button>
<ion-button @click="onAddAccount">{{
isEdit ? "Edit Account" : "Add Account"
}}</ion-button>
<ion-button
@click="
() => {
isEdit ? onEditAccount() : onAddAccount();
}
"
expand="full"
color="primary"
>{{ isEdit ? "Edit Account" : "Add Account" }}</ion-button
>
</ion-item>
<ion-alert
:is-open="alertOpen"
@ -120,6 +127,7 @@ import {
smallRandomString,
paste,
getSettings,
replaceAccounts,
} from "@/utils/platform";
import router from "@/router";
import { useRoute } from "vue-router";
@ -192,8 +200,48 @@ export default defineComponent({
}
});
const deleteAccount = async (address: string, accounts: Account[]) => {
const findIndex = accounts.findIndex((a) => a.address === address);
const pArr: Array<Promise<void>> = [];
if (findIndex !== -1) {
accounts.splice(findIndex, 1);
pArr.push(replaceAccounts([...accounts]));
}
await Promise.all(pArr);
};
const onEditAccount = async () => {
if (name.value.length < 1) {
alertMsg.value = "Name cannot be empty.";
alertOpen.value = true;
return;
}
const accounts = (await accountsProm) as Account[];
const account = accounts.find((acc) => acc.address === paramAddress);
if (!account) {
alertMsg.value = "Account not found.";
alertOpen.value = true;
return;
}
const savedAcc = {
address: account.address,
name: name.value,
pk: account.pk,
encPk: account.encPk,
};
await deleteAccount(account.address, accounts);
await saveAccount(savedAcc);
router.push("/tabs/accounts");
};
const onAddAccount = async () => {
let p1 = Promise.resolve();
if (name.value.length < 1) {
alertMsg.value = "Name cannot be empty.";
alertOpen.value = true;
return;
}
if (pk.value.length === 64) {
pk.value = `0x${pk.value.trim()}`;
}
@ -320,6 +368,7 @@ export default defineComponent({
mnemonic,
mnemonicIndex,
extractMnemonic,
onEditAccount,
};
},
});

View File

@ -159,6 +159,7 @@ import {
import {
getNetworks,
saveSelectedNetwork,
getSelectedNetwork,
getUrl,
paste,
replaceNetworks,
@ -203,7 +204,6 @@ export default defineComponent({
const route = useRoute();
const isEdit = route.path.includes("/edit");
const paramChainId = route.params.chainId ?? "";
let networksProm: Promise<Networks | undefined>;
const fillNetworkInputs = (network: Network) => {
name.value = network.name;
@ -215,8 +215,7 @@ export default defineComponent({
onIonViewWillEnter(async () => {
if (isEdit && paramChainId) {
networksProm = getNetworks();
const networks = (await networksProm) as Networks;
const networks = (await getNetworks()) as Networks;
fillNetworkInputs(networks[Number(paramChainId)]);
}
});
@ -249,10 +248,13 @@ export default defineComponent({
}
}
let p1 = Promise.resolve();
if (!networksProm) {
networksProm = getNetworks();
}
const networks = (await networksProm) as Networks;
const networksProm = getNetworks();
const selectedNetworkProm = getSelectedNetwork();
const allNetworks = await Promise.all([networksProm, selectedNetworkProm]);
const networks = allNetworks[0] as Networks;
const selectedNetwork = allNetworks[1] as Network;
const network = {
name: name.value,
chainId: chainId.value,
@ -260,7 +262,10 @@ export default defineComponent({
...(symbol.value ? { symbol: symbol.value } : {}),
...(explorer.value ? { explorer: explorer.value } : {}),
};
if ((Object.keys(networks).length ?? 0) < 1) {
if (
(Object.keys(networks).length ?? 0) < 1 ||
selectedNetwork.chainId === chainId.value
) {
p1 = saveSelectedNetwork(network);
} else {
if (chainId.value in networks && !isEdit) {

View File

@ -26,7 +26,7 @@
<ion-item>
<ion-label>Assests for Account: {{ selectedAccount?.name }}</ion-label>
</ion-item>
<ion-item button @click="copyAddress(selectedAccount?.address, getToastRef())">
<ion-item button @click="copyText(selectedAccount?.address, getToastRef())">
<p style="font-size: 0.7rem">{{ selectedAccount?.address }}</p>
<ion-icon style="margin-left: 0.5rem" :icon="copyOutline"></ion-icon>
</ion-item>
@ -47,12 +47,12 @@
<ion-item v-for="token of ethTokens" :key="token.address">
<ion-avatar
v-if="token?.image"
style="margin-right: 1rem; width: 1.8rem; height: 1.8rem"
style="margin-right: 1rem; width: 1.6rem; height: 1.6rem"
>
<img
:alt="token?.name"
:src="token?.image"
@error="token.image = getUrl('assets/randomGrad.svg')"
@error="token.image = getUrl('assets/chain-icons/eth.webp')"
/>
</ion-avatar>
<ion-label
@ -71,7 +71,7 @@
<ion-item v-for="token of polyTokens" :key="token.address">
<ion-avatar
v-if="token?.image"
style="margin-right: 1rem; width: 1.8rem; height: 1.8rem"
style="margin-right: 1rem; width: 1.6rem; height: 1.6rem"
>
<img
:alt="token?.name"
@ -96,7 +96,7 @@
<ion-item v-for="nft of ethNfts" :key="nft.address">
<ion-avatar
v-if="nft?.imageURI"
style="margin-right: 1rem; width: 1.8rem; height: 1.8rem"
style="margin-right: 1rem; width: 1.6rem; height: 1.6rem"
>
<img
:alt="nft?.collectionName"
@ -120,7 +120,7 @@
<ion-item v-for="nft of polyNfts" :key="nft.address">
<ion-avatar
v-if="nft?.imageURI"
style="margin-right: 1rem; width: 1.8rem; height: 1.8rem"
style="margin-right: 1rem; width: 1.6rem; height: 1.6rem"
>
<img
:alt="nft?.collectionName"
@ -144,7 +144,7 @@
<ion-item v-for="nft of poaps" :key="nft.eventId">
<ion-avatar
v-if="nft?.image"
style="margin-right: 1rem; width: 1.8rem; height: 1.8rem"
style="margin-right: 1rem; width: 1.6rem; height: 1.6rem"
>
<img
:alt="nft?.title"
@ -184,7 +184,7 @@ import {
IonLoading,
IonIcon,
} from "@ionic/vue";
import { getSelectedAccount, copyAddress, getUrl } from "@/utils/platform";
import { getSelectedAccount, copyText, getUrl } from "@/utils/platform";
import type { Account } from "@/extension/types";
import { copyOutline } from "ionicons/icons";
@ -564,7 +564,7 @@ export default defineComponent({
isError,
noAssets,
getToastRef,
copyAddress,
copyText,
copyOutline,
ethTokens,
polyTokens,

View File

@ -12,12 +12,12 @@
>
<ion-item>
<ion-avatar
v-if="(mainNets as any)[selectedNetwork?.chainId]?.icon"
style="margin-right: 1rem; width: 1.8rem; height: 1.8rem"
v-if="(allTemplateNets as any)[selectedNetwork?.chainId]?.icon"
style="margin-right: 1rem; width: 1.6rem; height: 1.6rem"
>
<img
:alt="selectedNetwork?.name"
:src="getUrl('assets/chain-icons/' + (mainNets as any)[selectedNetwork?.chainId]?.icon)"
:src="getUrl('assets/chain-icons/' + (allTemplateNets as any)[selectedNetwork?.chainId]?.icon)"
/>
</ion-avatar>
<ion-label>Network ID: {{ selectedNetwork?.chainId }}</ion-label>
@ -75,7 +75,7 @@ import {
import { useRoute } from "vue-router";
import { getSelectedNetwork, getUrl, hexTostr } from "@/utils/platform";
import type { Network } from "@/extension/types";
import { mainNets } from "@/utils/networks";
import { allTemplateNets } from "@/utils/networks";
export default defineComponent({
components: {
@ -112,7 +112,7 @@ export default defineComponent({
contract,
loading,
selectedNetwork,
mainNets,
allTemplateNets,
getUrl,
error,
};

View File

@ -21,7 +21,7 @@
><b style="margin-right: 0.5rem">Date:</b>
{{ new Date(item.date).toDateString() }}</ion-item
>
<ion-item button @click="copyAddress(item.txHash, getToastRef())">
<ion-item button @click="copyText(item.txHash, getToastRef())">
<p style="font-size: 0.7rem">
<b style="margin-right: 0.5rem"
><ion-icon
@ -88,7 +88,7 @@ import {
IonButton,
IonIcon,
} from "@ionic/vue";
import { getHistory, copyAddress, wipeHistory, openTab } from "@/utils/platform";
import { getHistory, copyText, wipeHistory, openTab } from "@/utils/platform";
import type { HistoryItem } from "@/extension/types";
import { copyOutline } from "ionicons/icons";
@ -130,7 +130,7 @@ export default defineComponent({
return {
history,
loading,
copyAddress,
copyText,
getToastRef,
toastState,
copyOutline,

View File

@ -4,13 +4,26 @@
<ion-toolbar>
<ion-title>
<ion-avatar
style="margin: 0.3rem; width: 1.8rem; height: 1.8rem; display: inline-flex"
style="margin: 0.3rem; width: 1.6rem; height: 1.6rem; display: inline-flex"
>
<img alt="clw" :src="getUrl('assets/extension-icon/wallet_32.png')" />
</ion-avatar>
<span style="position: absolute; top: 0.45rem; margin-left: 0.3rem"
>CL Wallet</span
>
<span
v-if="version"
style="
position: absolute;
top: 0.3rem;
right: 1.1rem;
margin-left: 0.3rem;
color: coral;
font-weight: bold;
font-size: 0.65rem;
"
>Version: {{ version }}</span
>
</ion-title>
</ion-toolbar>
</ion-header>
@ -32,7 +45,17 @@
>Select</ion-button
>
</ion-item>
<ion-item button @click="copyAddress(selectedAccount?.address, getToastRef())">
<ion-item
button
@click="
copyText(
settings?.copyLowerCaseAddress
? selectedAccount?.address?.toLowerCase()
: selectedAccount?.address,
getToastRef()
)
"
>
<p style="font-size: 0.7rem; color: coral">{{ selectedAccount?.address }}</p>
<ion-icon style="margin-left: 0.5rem" :icon="copyOutline"></ion-icon>
</ion-item>
@ -48,10 +71,15 @@
)
)
"
class="ion-text-wrap"
expand="block"
style="margin: auto; width: 98%; font-size: 0.8rem; padding: 0.6rem"
>View Address on
{{
`${selectedNetwork.explorer}`.replace("https://", "").replace("http://", "")
`${selectedNetwork.explorer}`
.replace("https://", "")
.replace("http://", "")
.replace(/\/.*/, "")
}}
</ion-button>
</ion-item>
@ -60,22 +88,26 @@
<ion-label>No EVM Networks found</ion-label>
<ion-button @click="goToAddNetwork">Add Network</ion-button>
</ion-item>
<ion-item v-else>
<ion-item style="font-size: 0.86rem" v-else>
<ion-avatar
v-if="(mainNets as any)[selectedNetwork?.chainId]?.icon"
style="margin-right: 1rem; width: 1.8rem; height: 1.8rem"
v-if="(allTemplateNets as any)[selectedNetwork?.chainId]?.icon"
style="margin-right: 1rem; width: 1.6rem; height: 1.6rem"
>
<img
:alt="selectedNetwork?.name"
:src="getUrl('assets/chain-icons/' + (mainNets as any)[selectedNetwork?.chainId]?.icon)"
:src="getUrl('assets/chain-icons/' + (allTemplateNets as any)[selectedNetwork?.chainId]?.icon)"
/>
</ion-avatar>
<ion-label
button
@click="copyText(String(selectedNetwork?.chainId), getToastRef())"
style="cursor: pointer"
>Selected Network ID:
<span style="color: coral; font-weight: bold">{{
selectedNetwork?.chainId
}}</span></ion-label
>
}}</span>
<ion-icon style="margin-left: 0.5rem" :icon="copyOutline"></ion-icon>
</ion-label>
<ion-button
@click="
() => {
@ -86,6 +118,21 @@
>Select</ion-button
>
</ion-item>
<ion-item style="margin-top: 0.3rem">
<div class="display: flex; flex-direction: column">
<img
alt="stealthex"
@click="openTab('https://stealthex.io')"
id="exchange-btn"
:src="getUrl('assets/exchange-btn-min.svg')"
class="exchange-btn"
style=""
/>
<p style="font-size: 0.75rem; opacity: 0.8; padding: 0.2rem">
This button does not contain any referral to maximize privacy.
</p>
</div>
</ion-item>
<ion-loading
:is-open="loading"
@ -224,20 +271,23 @@ import {
saveSelectedAccount,
replaceAccounts,
getSelectedNetwork,
copyAddress,
copyText,
replaceNetworks,
getUrl,
saveSelectedNetwork,
numToHexStr,
openTab,
getSettings,
getVersion,
} from "@/utils/platform";
import type { Network, Account, Networks } from "@/extension/types";
import { mainNets } from "@/utils/networks";
import { allTemplateNets } from "@/utils/networks";
import router from "@/router";
import { triggerListner } from "@/extension/listners";
import { copyOutline } from "ionicons/icons";
const version = getVersion();
export default defineComponent({
components: {
IonContent,
@ -269,6 +319,7 @@ export default defineComponent({
const selectedAccount = (ref(null) as unknown) as Ref<Account>;
const selectedNetwork = (ref(null) as unknown) as Ref<Network>;
const toastState = ref(false);
const settings = ref({}) as Ref<Awaited<ReturnType<typeof getSettings>>>;
const getToastRef = () => toastState;
@ -278,15 +329,21 @@ export default defineComponent({
const pNetworks = getNetworks();
const pSelectedAccount = getSelectedAccount();
const pSelectedNetwork = getSelectedNetwork();
Promise.all([pAccounts, pNetworks, pSelectedAccount, pSelectedNetwork]).then(
(res) => {
accounts.value = res[0];
networks.value = res[1];
selectedAccount.value = res[2];
selectedNetwork.value = res[3];
loading.value = false;
}
);
const pSettings = getSettings();
Promise.all([
pAccounts,
pNetworks,
pSelectedAccount,
pSelectedNetwork,
pSettings,
]).then((res) => {
accounts.value = res[0];
networks.value = res[1];
selectedAccount.value = res[2];
selectedNetwork.value = res[3];
settings.value = res[4];
loading.value = false;
});
};
onIonViewWillEnter(() => {
@ -316,10 +373,7 @@ export default defineComponent({
accounts.value.splice(0, 0, selectedAccount.value);
const newAccounts = [...accounts.value];
await replaceAccounts(newAccounts);
triggerListner(
"accountsChanged",
newAccounts.map((a) => a.address)
);
triggerListner("accountsChanged", [newAccounts.map((a) => a.address)?.[0]]);
}
accountsModal.value = false;
loading.value = false;
@ -350,15 +404,33 @@ export default defineComponent({
selectedNetwork,
changeSelectedAccount,
changeSelectedNetwork,
copyAddress,
copyText,
copyOutline,
toastState,
getToastRef,
networksModal,
mainNets,
allTemplateNets,
getUrl,
openTab,
settings,
version,
};
},
});
</script>
<style scoped>
.exchange-btn {
height: 2rem;
margin-top: 0.3rem;
margin-left: auto;
margin-right: auto;
display: block;
cursor: pointer;
}
.exchange-btn:hover {
opacity: 0.8;
transition: opacity 0.2s ease-in-out;
transform: scale(1.05);
}
</style>

View File

@ -4,11 +4,11 @@
<ion-toolbar>
<ion-buttons slot="end">
<router-link to="/tabs/add-network">
<ion-button>
<ion-icon slot="icon-only" :icon="addCircleOutline"></ion-icon>
</ion-button>
</router-link>
</ion-buttons>
<ion-button>
<ion-icon slot="icon-only" :icon="addCircleOutline"></ion-icon>
</ion-button>
</router-link>
</ion-buttons>
<ion-title>Networks</ion-title>
</ion-toolbar>
</ion-header>
@ -19,30 +19,34 @@
<ion-button @click="goToAddNetwork">Add Network</ion-button>
</ion-item>
<ion-list v-for="network of networks" :key="network.chainId">
<ion-item>
<ion-avatar v-if="(mainNets as any)[network.chainId]?.icon" style="margin-right: 1rem; width: 1.8rem; height:1.8rem;">
<img :alt="network.name" :src="getUrl('assets/chain-icons/' + (mainNets as any)[network.chainId].icon)" />
</ion-avatar>
<ion-label>
{{ network.name }}
</ion-label>
<ion-label>
ID: {{ network.chainId }}
</ion-label>
</ion-item>
<ion-list v-for="network of networks" :key="network.chainId">
<ion-item>
<ion-chip @click="editNetwork(network.chainId)" button>Edit</ion-chip>
<ion-chip @click="deleteNetwork(network.chainId)" button>Delete</ion-chip>
<ion-avatar
v-if="(allTemplateNets as any)[network.chainId]?.icon"
style="margin-right: 1rem; width: 1.6rem; height: 1.6rem"
>
<img
:alt="network.name"
:src="getUrl('assets/chain-icons/' + (allTemplateNets as any)[network.chainId].icon)"
/>
</ion-avatar>
<ion-label>
{{ network.name }}
</ion-label>
<ion-label> ID: {{ network.chainId }} </ion-label>
</ion-item>
</ion-list>
<ion-item>
<ion-chip @click="editNetwork(network.chainId)" button>Edit</ion-chip>
<ion-chip @click="deleteNetwork(network.chainId)" button>Delete</ion-chip>
</ion-item>
</ion-list>
</ion-content>
</ion-page>
</template>
<script lang="ts">
import { defineComponent, ref, Ref } from "vue";
import { getNetworks, copyAddress, getUrl, replaceNetworks } from "@/utils/platform"
import { getNetworks, copyText, getUrl, replaceNetworks } from "@/utils/platform";
import {
IonContent,
IonHeader,
@ -57,12 +61,12 @@ import {
IonButtons,
IonButton,
onIonViewWillEnter,
IonAvatar
IonAvatar,
} from "@ionic/vue";
import { mainNets } from "@/utils/networks"
import { allTemplateNets } from "@/utils/networks";
import { addCircleOutline, copyOutline } from "ionicons/icons";
import router from '@/router/index'
import type { Networks } from '@/extension/types'
import router from "@/router/index";
import type { Networks } from "@/extension/types";
export default defineComponent({
components: {
@ -77,60 +81,57 @@ export default defineComponent({
IonLabel,
IonChip,
IonButtons,
IonButton,
IonAvatar
IonButton,
IonAvatar,
},
setup () {
const networks = ref({}) as Ref<Networks>
const loading = ref(true)
const toastState = ref(false)
setup() {
const networks = ref({}) as Ref<Networks>;
const loading = ref(true);
const toastState = ref(false);
const getToastRef = () => toastState;
const getToastRef = () => toastState
const loadData = () => {
const pAccounts = getNetworks()
Promise.all([pAccounts]).then(( res ) => {
networks.value = res[0]
loading.value = false
})
}
const pAccounts = getNetworks();
Promise.all([pAccounts]).then((res) => {
networks.value = res[0];
loading.value = false;
});
};
const deleteNetwork = async (chainId: number) => {
loading.value = true
delete networks.value[chainId]
await replaceNetworks(networks.value)
loading.value = false
}
loading.value = true;
delete networks.value[chainId];
await replaceNetworks(networks.value);
loading.value = false;
};
const editNetwork = (chainId: number) => {
router.push(`add-network/edit/${chainId}`)
}
router.push(`add-network/edit/${chainId}`);
};
const goToAddNetwork = () => {
router.push("/tabs/add-network");
};
onIonViewWillEnter(() => {
loadData()
})
loadData();
});
return {
networks,
addCircleOutline,
copyOutline,
toastState,
copyAddress,
getToastRef,
getUrl,
mainNets,
deleteNetwork,
editNetwork,
loading,
goToAddNetwork
}
}
return {
networks,
addCircleOutline,
copyOutline,
toastState,
copyText,
getToastRef,
getUrl,
allTemplateNets,
deleteNetwork,
editNetwork,
loading,
goToAddNetwork,
};
},
});
</script>

View File

@ -112,7 +112,6 @@ import {
import { useRoute } from "vue-router";
import { getUrl, saveSelectedNetwork, saveNetwork, hexTostr } from "@/utils/platform";
import type { Network } from "@/extension/types";
import { mainNets, testNets } from "@/utils/networks";
import { approve, walletPing } from "@/extension/userRequest";
import { triggerListner } from "@/extension/listners";
@ -137,7 +136,6 @@ export default defineComponent({
const rid = (route?.params?.rid as string) ?? "";
const networkData = hexTostr((route.params?.param as string) ?? "");
const alertOpen = ref(false);
const templateNetworks = Object.assign({}, mainNets, testNets) ?? {};
const timerReject = ref(140);
let interval: any;
const website = ref("");
@ -208,7 +206,6 @@ export default defineComponent({
onCancel,
alertOpen,
loading,
templateNetworks,
getUrl,
onAddSwitch,
timerReject,

View File

@ -198,9 +198,15 @@ export default defineComponent({
// };
onIonViewWillEnter(async () => {
selectedNetwork.value = await getSelectedNetwork();
selectedAccount.value = await getSelectedAccount();
currentBalance.value = Number(formatEther((await getBalance()).toString()));
try {
selectedNetwork.value = await getSelectedNetwork();
selectedAccount.value = await getSelectedAccount();
currentBalance.value = Number(formatEther((await getBalance()).toString()));
} catch (e) {
alertOpen.value = true;
alertMsg.value =
"Error getting network & balance Internet or RPC or blockchain may be down";
}
loading.value = false;
});

View File

@ -89,7 +89,7 @@
</ion-accordion>
<ion-accordion value="2">
<ion-item slot="header" color="light">
<ion-label>Theme</ion-label>
<ion-label>Theme & Misc</ion-label>
</ion-item>
<div class="ion-padding" slot="content">
<ion-list>
@ -107,6 +107,18 @@
<ion-label>Light</ion-label>
</ion-item>
</ion-radio-group>
<ion-item>
<ion-label style="font-size: 0.7rem"
>Convert Address to lowercase on copy</ion-label
>
<ion-toggle
aria-label="Convert Address to Lowercase on Copy"
@ion-change="changeCopyLowerCaseAddress"
:key="updateKey"
slot="end"
:checked="settings.s.copyLowerCaseAddress"
></ion-toggle>
</ion-item>
</ion-list>
</div>
</ion-accordion>
@ -120,13 +132,12 @@
and Ethers.
</p>
<p>
It emulates Metamask Wallet and can be used as a drop-in replacement, right
now if you have both extensions, CLW will overwrite Metamask.
</p>
<p>
Main philosophy of the wallet is: no trackers, full control, export/import
JSONs with accounts, fast generate new accounts, and wipe everything with
one click.
Unlike most wallets, this wallet has no ads, no analytics, no trackers, no
bloatware, no telemetry, no data collection, no sponsored content, no
sponsored Dapps, no sponsored tokens, no sponsored NFTs, no sponsored
anything. It is a clean wallet with no revenue model, made by a single
developer, if you want to support this project financially you can donate at
andrei0x309.eth.
</p>
<p>
Github Repo:
@ -134,6 +145,10 @@
>LINK</a
>
</p>
<p>
Docs Website:
<a href="#" @click="openTab('https://clear-wallet.flashsoft.eu')">LINK</a>
</p>
<br />
<p style="margin-bottom: 0.2rem">Places you can check me out:</p>
<p>
@ -148,10 +163,6 @@
Blog Flashsoft
<a href="#" @click="openTab('https://blog.flashsoft.eu')">LINK</a>
</p>
<p>
Crypto-Leftists Discord
<a href="#" @click="openTab('https://discord.gg/gzA4bTCdhb')">LINK</a>
</p>
</div>
</ion-accordion>
<ion-accordion value="4">
@ -409,6 +420,12 @@ export default defineComponent({
defaultAccordionOpen.value = "1";
};
const changeCopyLowerCaseAddress = async () => {
settings.s.copyLowerCaseAddress = !settings.s?.copyLowerCaseAddress;
await saveSettings();
defaultAccordionOpen.value = "2";
};
const changeTheme = async (theme: "system" | "light" | "dark") => {
document.body.classList.remove(radioTheme.value);
document.body.classList.add(theme);
@ -698,6 +715,7 @@ export default defineComponent({
openTab,
radioTheme,
changePermaLock,
changeCopyLowerCaseAddress,
};
},
});

View File

@ -12,12 +12,12 @@
>
<ion-item>
<ion-avatar
v-if="(mainNets as any)[selectedNetwork?.chainId]?.icon"
style="margin-right: 1rem; width: 1.8rem; height: 1.8rem"
v-if="(allTemplateNets as any)[selectedNetwork?.chainId]?.icon"
style="margin-right: 1rem; width: 1.6rem; height: 1.6rem"
>
<img
:alt="selectedNetwork?.name"
:src="getUrl('assets/chain-icons/' + (mainNets as any)[selectedNetwork?.chainId]?.icon)"
:src="getUrl('assets/chain-icons/' + (allTemplateNets as any)[selectedNetwork?.chainId]?.icon)"
/>
</ion-avatar>
<ion-label>Network ID: {{ selectedNetwork?.chainId }}</ion-label>
@ -201,7 +201,7 @@ import {
} from "@/utils/platform";
import { getBalance, getGasPrice, estimateGas } from "@/utils/wallet";
import type { Network } from "@/extension/types";
import { mainNets, chainIdToPriceId } from "@/utils/networks";
import { allTemplateNets, chainIdToPriceId } from "@/utils/networks";
import UnlockModal from "@/views/UnlockModal.vue";
import router from "@/router";
@ -424,7 +424,7 @@ export default defineComponent({
bars,
loading,
selectedNetwork,
mainNets,
allTemplateNets,
getUrl,
setGasLimit,
setGasPrice,

View File

@ -20,12 +20,12 @@
<ion-item>Network Name: {{ selectedNetwork?.name }}</ion-item>
<ion-item>
<ion-avatar
v-if="(templateNetworks as any)[selectedNetwork?.chainId]?.icon"
style="margin-right: 1rem; width: 1.8rem; height: 1.8rem"
v-if="(allTemplateNets as any)[selectedNetwork?.chainId]?.icon"
style="margin-right: 1rem; width: 1.6rem; height: 1.6rem"
>
<img
:alt="selectedNetwork?.name"
:src="getUrl('assets/chain-icons/' + (templateNetworks as any)[selectedNetwork?.chainId]?.icon)"
:src="getUrl('assets/chain-icons/' + (allTemplateNets as any)[selectedNetwork?.chainId]?.icon)"
/>
</ion-avatar>
<ion-label>Network ID: {{ selectedNetwork?.chainId }}</ion-label>
@ -42,7 +42,7 @@
<ion-item>
<ion-avatar
v-if="(existingNetworks as any)[networkId]?.icon"
style="margin-right: 1rem; width: 1.8rem; height: 1.8rem"
style="margin-right: 1rem; width: 1.6rem; height: 1.6rem"
>
<img
:alt="(existingNetworks as any)[networkId]?.name"
@ -132,7 +132,7 @@ import {
numToHexStr,
} from "@/utils/platform";
import type { Network, Networks } from "@/extension/types";
import { mainNets, testNets } from "@/utils/networks";
import { allTemplateNets } from "@/utils/networks";
import { approve, walletPing } from "@/extension/userRequest";
import { triggerListner } from "@/extension/listners";
@ -162,7 +162,6 @@ export default defineComponent({
const alertMsg = ref("");
const networkCase = ref("");
let pnetworks: Promise<Networks>;
const templateNetworks = Object.assign({}, mainNets, testNets) ?? {};
const addChainUrl = `${chainListPage}${networkId.value}`;
const timerReject = ref(140);
let interval: any;
@ -184,10 +183,10 @@ export default defineComponent({
pnetworks = getNetworks();
selectedNetwork.value = await getSelectedNetwork();
existingNetworks.value = await pnetworks;
if ((networkId.value ?? "0") in existingNetworks.value ?? {}) {
if ((networkId.value ?? "0") in (existingNetworks?.value ?? {})) {
networkCase.value = "exists";
} else if ((networkId.value ?? "0") in templateNetworks) {
existingNetworks.value = templateNetworks;
} else if ((networkId.value ?? "0") in allTemplateNets) {
existingNetworks.value = allTemplateNets;
networkCase.value = "inTemplates";
} else {
networkCase.value = "doesNotExist";
@ -217,9 +216,10 @@ export default defineComponent({
const onSwitchTemplates = async () => {
loading.value = true;
selectedNetwork.value = templateNetworks[Number(networkId.value)];
await saveNetwork(templateNetworks[Number(networkId.value)]);
await saveSelectedNetwork(templateNetworks[Number(networkId.value)]);
const nId = Number(networkId.value) as keyof typeof allTemplateNets;
selectedNetwork.value = allTemplateNets[nId];
await saveNetwork(allTemplateNets[nId]);
await saveSelectedNetwork(allTemplateNets[nId]);
triggerListner("chainChanged", numToHexStr(selectedNetwork.value?.chainId ?? 0));
approve(rid);
loading.value = false;
@ -240,7 +240,7 @@ export default defineComponent({
loading,
networkCase,
selectedNetwork,
templateNetworks,
allTemplateNets,
getUrl,
onSwitchTemplates,
onSwitchNotExisting,

View File

@ -2,10 +2,10 @@
<ion-page>
<ion-header>
<ion-toolbar>
<ion-buttons slot="start">
<ion-button @click="close">Close</ion-button>
</ion-buttons>
<ion-title>Unlock to Proceed</ion-title>
<ion-buttons slot="end">
<ion-button @click="close" color="primary">Close</ion-button>
</ion-buttons>
</ion-toolbar>
</ion-header>
@ -30,9 +30,29 @@
<ion-item>
<ion-label>Unlock Password</ion-label>
</ion-item>
<ion-item>
<ion-input aria-label="password" v-model="mpPass" type="password"></ion-input>
</ion-item>
<ion-list>
<ion-item>
<ion-input
aria-label="password"
placeholder=""
class="password-input"
type="password"
@ion-input="mpPass = String($event.target.value)"
fill="solid"
ref="ionInput"
></ion-input>
<!-- <ion-input
label="Password"
label-placement="floating"
fill="outline"
placeholder=""
type="password"
ref="ionInput"
@ion-input="mpPass = String($event.target.value)"
></ion-input> -->
</ion-item>
</ion-list>
</ion-list>
<ion-item>
<ion-button @click="unlock">Confirm</ion-button>
@ -57,7 +77,7 @@
</template>
<script lang="ts">
import { defineComponent, ref } from "vue";
import { defineComponent, ref, onMounted } from "vue";
import {
IonContent,
IonHeader,
@ -133,6 +153,14 @@ export default defineComponent({
}
};
onMounted(async () => {
await new Promise((resolve) => setTimeout(resolve, 150));
const el = document?.querySelector(
".password-input .native-input"
) as HTMLInputElement;
el?.focus?.();
});
return {
loading,
unlock,

View File

@ -1,12 +1,9 @@
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import { fileURLToPath, URL } from 'url'
import nodePolyfills from 'rollup-plugin-polyfill-node'
import { crx } from '@crxjs/vite-plugin'
import manifest from './src/extension/manifest.json'
const production = process.env.NODE_ENV === 'production'
// https://vitejs.dev/config/
export default defineConfig({
publicDir: './public',
@ -25,7 +22,13 @@ export default defineConfig({
},
build: {
rollupOptions: {
plugins: [nodePolyfills()],
// plugins: [nodePolyfills()],
onwarn: (warning) => {
if (warning.message.includes('comment will be removed')) {
return false;
}
return true;
},
input: {
['eval-sandbox']: 'eval-sandbox.html',
},
@ -36,12 +39,11 @@ export default defineConfig({
transformMixedEsModules: true
},
},
esbuild: {
legalComments: 'none',
},
plugins: [
!production &&
nodePolyfills({
include: ['node_modules/**/*.js', new RegExp('node_modules/.vite/.*js')]
}),
crx({ manifest }),
crx({ manifest: manifest as any }),
vue()
],
server: {

670
yarn.lock
View File

@ -7,10 +7,10 @@
resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf"
integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==
"@adraffy/ens-normalize@1.9.2":
version "1.9.2"
resolved "https://registry.yarnpkg.com/@adraffy/ens-normalize/-/ens-normalize-1.9.2.tgz#60111a5d9db45b2e5cbb6231b0bb8d97e8659316"
integrity sha512-0h+FrQDqe2Wn+IIGFkTCd4aAwTJ+7834Ek1COohCyV26AXhwQ7WQaz+4F/nLOeVl/3BtWHOHLPsq46V8YB46Eg==
"@adraffy/ens-normalize@1.10.1":
version "1.10.1"
resolved "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz#63430d04bd8c5e74f8d7d049338f1cd9d4f02069"
integrity sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==
"@ampproject/remapping@^2.1.0":
version "2.2.0"
@ -37,7 +37,7 @@
resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.19.1.tgz#72d647b4ff6a4f82878d184613353af1dd0290f9"
integrity sha512-72a9ghR0gnESIa7jBN53U32FOVCEoztyIlKaNoU05zRhEecduGK9L9c3ww7Mp06JiR+0ls0GBPFJQwwtjn9ksg==
"@babel/core@^7.11.6", "@babel/core@^7.18.13":
"@babel/core@^7.11.6":
version "7.19.1"
resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.19.1.tgz#c8fa615c5e88e272564ace3d42fbc8b17bfeb22b"
integrity sha512-1H8VgqXme4UXCRv7/Wa1bq7RVymKOzC7znjyFM8KiEzwFqcKUKYNoQef4GhdklgNvoBXyW4gYhuBNCM5o1zImw==
@ -97,13 +97,6 @@
"@jridgewell/gen-mapping" "^0.3.2"
jsesc "^2.5.1"
"@babel/helper-annotate-as-pure@^7.18.6":
version "7.18.6"
resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb"
integrity sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==
dependencies:
"@babel/types" "^7.18.6"
"@babel/helper-compilation-targets@^7.18.9":
version "7.18.9"
resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz#69e64f57b524cde3e5ff6cc5a9f4a387ee5563bf"
@ -192,11 +185,6 @@
resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.9.tgz#4b8aea3b069d8cb8a72cdfe28ddf5ceca695ef2f"
integrity sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w==
"@babel/helper-plugin-utils@^7.19.0":
version "7.19.0"
resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.19.0.tgz#4796bb14961521f0f8715990bee2fb6e51ce21bf"
integrity sha512-40Ryx7I8mT+0gaNxm8JGTZFUITNqdLAgdg0hXzeVZxVD6nFsdhQvip6v8dqkRHzsz1VFpFAaOCHNn0vKBL7Czw==
"@babel/helper-simple-access@^7.18.6":
version "7.18.6"
resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz#d6d8f51f4ac2978068df934b569f08f29788c7ea"
@ -303,7 +291,7 @@
dependencies:
"@babel/helper-plugin-utils" "^7.8.0"
"@babel/plugin-syntax-jsx@^7.18.6", "@babel/plugin-syntax-jsx@^7.7.2":
"@babel/plugin-syntax-jsx@^7.7.2":
version "7.18.6"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz#a8feef63b010150abd97f1649ec296e849943ca0"
integrity sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==
@ -366,38 +354,6 @@
dependencies:
"@babel/helper-plugin-utils" "^7.18.6"
"@babel/plugin-transform-react-jsx-development@^7.18.6":
version "7.18.6"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz#dbe5c972811e49c7405b630e4d0d2e1380c0ddc5"
integrity sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==
dependencies:
"@babel/plugin-transform-react-jsx" "^7.18.6"
"@babel/plugin-transform-react-jsx-self@^7.18.6":
version "7.18.6"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.18.6.tgz#3849401bab7ae8ffa1e3e5687c94a753fc75bda7"
integrity sha512-A0LQGx4+4Jv7u/tWzoJF7alZwnBDQd6cGLh9P+Ttk4dpiL+J5p7NSNv/9tlEFFJDq3kjxOavWmbm6t0Gk+A3Ig==
dependencies:
"@babel/helper-plugin-utils" "^7.18.6"
"@babel/plugin-transform-react-jsx-source@^7.18.6":
version "7.18.6"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.18.6.tgz#06e9ae8a14d2bc19ce6e3c447d842032a50598fc"
integrity sha512-utZmlASneDfdaMh0m/WausbjUjEdGrQJz0vFK93d7wD3xf5wBtX219+q6IlCNZeguIcxS2f/CvLZrlLSvSHQXw==
dependencies:
"@babel/helper-plugin-utils" "^7.18.6"
"@babel/plugin-transform-react-jsx@^7.18.10", "@babel/plugin-transform-react-jsx@^7.18.6":
version "7.19.0"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.19.0.tgz#b3cbb7c3a00b92ec8ae1027910e331ba5c500eb9"
integrity sha512-UVEvX3tXie3Szm3emi1+G63jyw1w5IcMY0FSKM+CRnKRI5Mr1YbCNgsSTwoTwKphQEG9P+QqmuRFneJPZuHNhg==
dependencies:
"@babel/helper-annotate-as-pure" "^7.18.6"
"@babel/helper-module-imports" "^7.18.6"
"@babel/helper-plugin-utils" "^7.19.0"
"@babel/plugin-syntax-jsx" "^7.18.6"
"@babel/types" "^7.19.0"
"@babel/template@^7.18.10", "@babel/template@^7.18.6", "@babel/template@^7.3.3":
version "7.18.10"
resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.18.10.tgz#6f9134835970d1dbf0835c0d100c9f38de0c5e71"
@ -462,11 +418,6 @@
resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39"
integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==
"@capacitor/app@^5.0.6":
version "5.0.6"
resolved "https://registry.yarnpkg.com/@capacitor/app/-/app-5.0.6.tgz#2ee02551115fd2e92dc7e81bc30a6c6fa78efa66"
integrity sha512-6ZXVdnNmaYILasC/RjQw+yfTmq2ZO7Q3v5lFcDVfq3PFGnybyYQh+RstBrYri+376OmXOXxBD7E6UxBhrMzXGA==
"@capacitor/cli@^5.2.3":
version "5.2.3"
resolved "https://registry.yarnpkg.com/@capacitor/cli/-/cli-5.2.3.tgz#e28f8a21079a0ed28c6d5ec1d926d32e584f815c"
@ -490,38 +441,17 @@
tslib "^2.4.0"
xml2js "^0.5.0"
"@capacitor/core@^5.2.3":
version "5.2.3"
resolved "https://registry.yarnpkg.com/@capacitor/core/-/core-5.2.3.tgz#0d26ae70656b5281dd3c93f73843b0d730f31754"
integrity sha512-Q1zbgt3Mvldy7six2/GX54kTL0ozgnR37jeDUAXL/fOJBF4Iorr/8A0OjGEAnwEjpR1la7uFZUunESMFyMLhEQ==
dependencies:
tslib "^2.1.0"
"@capacitor/haptics@^5.0.6":
version "5.0.6"
resolved "https://registry.yarnpkg.com/@capacitor/haptics/-/haptics-5.0.6.tgz#c22fd6acbc62cbdff39279ded687c418f2c89a5a"
integrity sha512-UrMcR7p2X10ql4VLlowUuH/VckTeu0lj+RQpekxox14uxDmu5AGIFDK/iDTi8W6QZkxTJRZK6sbCjgwYgNJ7Pw==
"@capacitor/keyboard@^5.0.6":
version "5.0.6"
resolved "https://registry.yarnpkg.com/@capacitor/keyboard/-/keyboard-5.0.6.tgz#04400e71b677abf9f1fc1ceaffd1211e7d864319"
integrity sha512-9GewAa/y2Hwkdw/Be8MTdiAjrFZ7TPDKpR44M0Y/0QMnK+mBbgzcoZ/UkuumWv6e2F1IAI+VY5eYVQHDeZcRoA==
"@capacitor/status-bar@^5.0.6":
version "5.0.6"
resolved "https://registry.yarnpkg.com/@capacitor/status-bar/-/status-bar-5.0.6.tgz#281568a7f7aeacf80777702cb9947c29dc32685c"
integrity sha512-7od8CxsBnot1XMK3IeOkproFL4hgoKoWAc3pwUvmDOkQsXoxwQm4SR9mLwQavv1XfxtHbFV9Ukd7FwMxOPSViw==
"@crxjs/vite-plugin@^1.0.14":
version "1.0.14"
resolved "https://registry.yarnpkg.com/@crxjs/vite-plugin/-/vite-plugin-1.0.14.tgz#b0f6e2bdcdfbc090b2f3765408cc8743af382ade"
integrity sha512-emOueVCqFRFmpcfT80Xsm4mfuFw9VSp5GY4eh5qeLDeiP81g0hddlobVQCo0pE2ZvNnWbyhLrXEYAaMAXjNL6A==
"@crxjs/vite-plugin@^2.0.0-beta.23":
version "2.0.0-beta.23"
resolved "https://registry.npmjs.org/@crxjs/vite-plugin/-/vite-plugin-2.0.0-beta.23.tgz#4d402f25d0ce5456cce5e7627b98210256fbf624"
integrity sha512-AO+VYhtNZ1fITq/sc54FZpTtFvHR+gJwFGiWTGKs07bwYzzZFdF0sYeiFgZiEjaNkddkAzuM4F4lgOmCm69YUw==
dependencies:
"@rollup/pluginutils" "^4.1.2"
"@webcomponents/custom-elements" "^1.5.0"
acorn-walk "^8.2.0"
cheerio "^1.0.0-rc.10"
connect-injector "^0.4.4"
convert-source-map "^1.7.0"
debug "^4.3.3"
es-module-lexer "^0.10.0"
fast-glob "^3.2.11"
@ -530,126 +460,123 @@
magic-string "^0.26.0"
picocolors "^1.0.0"
react-refresh "^0.13.0"
rollup "^2.70.2"
optionalDependencies:
"@vitejs/plugin-react" ">=1.2.0"
rollup "2.78.1"
rxjs "7.5.7"
"@cspotcode/source-map-support@^0.8.0":
version "0.8.1"
resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1"
integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==
dependencies:
"@jridgewell/trace-mapping" "0.3.9"
"@esbuild/aix-ppc64@0.20.2":
version "0.20.2"
resolved "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz#a70f4ac11c6a1dfc18b8bbb13284155d933b9537"
integrity sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==
"@esbuild/android-arm64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz#984b4f9c8d0377443cc2dfcef266d02244593622"
integrity sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==
"@esbuild/android-arm64@0.20.2":
version "0.20.2"
resolved "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz#db1c9202a5bc92ea04c7b6840f1bbe09ebf9e6b9"
integrity sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==
"@esbuild/android-arm@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.18.20.tgz#fedb265bc3a589c84cc11f810804f234947c3682"
integrity sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==
"@esbuild/android-arm@0.20.2":
version "0.20.2"
resolved "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz#3b488c49aee9d491c2c8f98a909b785870d6e995"
integrity sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==
"@esbuild/android-x64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.18.20.tgz#35cf419c4cfc8babe8893d296cd990e9e9f756f2"
integrity sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==
"@esbuild/android-x64@0.20.2":
version "0.20.2"
resolved "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz#3b1628029e5576249d2b2d766696e50768449f98"
integrity sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==
"@esbuild/darwin-arm64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz#08172cbeccf95fbc383399a7f39cfbddaeb0d7c1"
integrity sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==
"@esbuild/darwin-arm64@0.20.2":
version "0.20.2"
resolved "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz#6e8517a045ddd86ae30c6608c8475ebc0c4000bb"
integrity sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==
"@esbuild/darwin-x64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz#d70d5790d8bf475556b67d0f8b7c5bdff053d85d"
integrity sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==
"@esbuild/darwin-x64@0.20.2":
version "0.20.2"
resolved "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz#90ed098e1f9dd8a9381695b207e1cff45540a0d0"
integrity sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==
"@esbuild/freebsd-arm64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz#98755cd12707f93f210e2494d6a4b51b96977f54"
integrity sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==
"@esbuild/freebsd-arm64@0.20.2":
version "0.20.2"
resolved "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz#d71502d1ee89a1130327e890364666c760a2a911"
integrity sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==
"@esbuild/freebsd-x64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz#c1eb2bff03915f87c29cece4c1a7fa1f423b066e"
integrity sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==
"@esbuild/freebsd-x64@0.20.2":
version "0.20.2"
resolved "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz#aa5ea58d9c1dd9af688b8b6f63ef0d3d60cea53c"
integrity sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==
"@esbuild/linux-arm64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz#bad4238bd8f4fc25b5a021280c770ab5fc3a02a0"
integrity sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==
"@esbuild/linux-arm64@0.20.2":
version "0.20.2"
resolved "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz#055b63725df678379b0f6db9d0fa85463755b2e5"
integrity sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==
"@esbuild/linux-arm@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz#3e617c61f33508a27150ee417543c8ab5acc73b0"
integrity sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==
"@esbuild/linux-arm@0.20.2":
version "0.20.2"
resolved "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz#76b3b98cb1f87936fbc37f073efabad49dcd889c"
integrity sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==
"@esbuild/linux-ia32@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz#699391cccba9aee6019b7f9892eb99219f1570a7"
integrity sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==
"@esbuild/linux-ia32@0.20.2":
version "0.20.2"
resolved "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz#c0e5e787c285264e5dfc7a79f04b8b4eefdad7fa"
integrity sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==
"@esbuild/linux-loong64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz#e6fccb7aac178dd2ffb9860465ac89d7f23b977d"
integrity sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==
"@esbuild/linux-loong64@0.20.2":
version "0.20.2"
resolved "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz#a6184e62bd7cdc63e0c0448b83801001653219c5"
integrity sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==
"@esbuild/linux-mips64el@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz#eeff3a937de9c2310de30622a957ad1bd9183231"
integrity sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==
"@esbuild/linux-mips64el@0.20.2":
version "0.20.2"
resolved "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz#d08e39ce86f45ef8fc88549d29c62b8acf5649aa"
integrity sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==
"@esbuild/linux-ppc64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz#2f7156bde20b01527993e6881435ad79ba9599fb"
integrity sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==
"@esbuild/linux-ppc64@0.20.2":
version "0.20.2"
resolved "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz#8d252f0b7756ffd6d1cbde5ea67ff8fd20437f20"
integrity sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==
"@esbuild/linux-riscv64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz#6628389f210123d8b4743045af8caa7d4ddfc7a6"
integrity sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==
"@esbuild/linux-riscv64@0.20.2":
version "0.20.2"
resolved "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz#19f6dcdb14409dae607f66ca1181dd4e9db81300"
integrity sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==
"@esbuild/linux-s390x@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz#255e81fb289b101026131858ab99fba63dcf0071"
integrity sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==
"@esbuild/linux-s390x@0.20.2":
version "0.20.2"
resolved "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz#3c830c90f1a5d7dd1473d5595ea4ebb920988685"
integrity sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==
"@esbuild/linux-x64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz#c7690b3417af318a9b6f96df3031a8865176d338"
integrity sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==
"@esbuild/linux-x64@0.20.2":
version "0.20.2"
resolved "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz#86eca35203afc0d9de0694c64ec0ab0a378f6fff"
integrity sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==
"@esbuild/netbsd-x64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz#30e8cd8a3dded63975e2df2438ca109601ebe0d1"
integrity sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==
"@esbuild/netbsd-x64@0.20.2":
version "0.20.2"
resolved "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz#e771c8eb0e0f6e1877ffd4220036b98aed5915e6"
integrity sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==
"@esbuild/openbsd-x64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz#7812af31b205055874c8082ea9cf9ab0da6217ae"
integrity sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==
"@esbuild/openbsd-x64@0.20.2":
version "0.20.2"
resolved "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz#9a795ae4b4e37e674f0f4d716f3e226dd7c39baf"
integrity sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==
"@esbuild/sunos-x64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz#d5c275c3b4e73c9b0ecd38d1ca62c020f887ab9d"
integrity sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==
"@esbuild/sunos-x64@0.20.2":
version "0.20.2"
resolved "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz#7df23b61a497b8ac189def6e25a95673caedb03f"
integrity sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==
"@esbuild/win32-arm64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz#73bc7f5a9f8a77805f357fab97f290d0e4820ac9"
integrity sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==
"@esbuild/win32-arm64@0.20.2":
version "0.20.2"
resolved "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz#f1ae5abf9ca052ae11c1bc806fb4c0f519bacf90"
integrity sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==
"@esbuild/win32-ia32@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz#ec93cbf0ef1085cc12e71e0d661d20569ff42102"
integrity sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==
"@esbuild/win32-ia32@0.20.2":
version "0.20.2"
resolved "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz#241fe62c34d8e8461cd708277813e1d0ba55ce23"
integrity sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==
"@esbuild/win32-x64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz#786c5f41f043b07afb1af37683d7c33668858f6d"
integrity sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==
"@esbuild/win32-x64@0.20.2":
version "0.20.2"
resolved "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz#9c907b21e30a52db959ba4f80bb01a0cc403d5cc"
integrity sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==
"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0":
version "4.4.0"
@ -1091,14 +1018,6 @@
resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32"
integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==
"@jridgewell/trace-mapping@0.3.9":
version "0.3.9"
resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9"
integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==
dependencies:
"@jridgewell/resolve-uri" "^3.0.3"
"@jridgewell/sourcemap-codec" "^1.4.10"
"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.9":
version "0.3.15"
resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz#aba35c48a38d3fd84b37e66c9c0423f9744f9774"
@ -1115,15 +1034,17 @@
"@jridgewell/resolve-uri" "^3.1.0"
"@jridgewell/sourcemap-codec" "^1.4.14"
"@noble/hashes@1.1.2":
version "1.1.2"
resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.1.2.tgz#e9e035b9b166ca0af657a7848eb2718f0f22f183"
integrity sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA==
"@noble/curves@1.2.0":
version "1.2.0"
resolved "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz#92d7e12e4e49b23105a2555c6984d41733d65c35"
integrity sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==
dependencies:
"@noble/hashes" "1.3.2"
"@noble/secp256k1@1.7.1":
version "1.7.1"
resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.7.1.tgz#b251c70f824ce3ca7f8dc3df08d58f005cc0507c"
integrity sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==
"@noble/hashes@1.3.2":
version "1.3.2"
resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz#6f26dbc8fbc7205873ce3cee2f690eba0d421b39"
integrity sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==
"@nodelib/fs.scandir@2.1.5":
version "2.1.5"
@ -1172,6 +1093,86 @@
estree-walker "^2.0.2"
picomatch "^2.3.1"
"@rollup/rollup-android-arm-eabi@4.17.2":
version "4.17.2"
resolved "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.17.2.tgz#1a32112822660ee104c5dd3a7c595e26100d4c2d"
integrity sha512-NM0jFxY8bB8QLkoKxIQeObCaDlJKewVlIEkuyYKm5An1tdVZ966w2+MPQ2l8LBZLjR+SgyV+nRkTIunzOYBMLQ==
"@rollup/rollup-android-arm64@4.17.2":
version "4.17.2"
resolved "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.17.2.tgz#5aeef206d65ff4db423f3a93f71af91b28662c5b"
integrity sha512-yeX/Usk7daNIVwkq2uGoq2BYJKZY1JfyLTaHO/jaiSwi/lsf8fTFoQW/n6IdAsx5tx+iotu2zCJwz8MxI6D/Bw==
"@rollup/rollup-darwin-arm64@4.17.2":
version "4.17.2"
resolved "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.17.2.tgz#6b66aaf003c70454c292cd5f0236ebdc6ffbdf1a"
integrity sha512-kcMLpE6uCwls023+kknm71ug7MZOrtXo+y5p/tsg6jltpDtgQY1Eq5sGfHcQfb+lfuKwhBmEURDga9N0ol4YPw==
"@rollup/rollup-darwin-x64@4.17.2":
version "4.17.2"
resolved "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.17.2.tgz#f64fc51ed12b19f883131ccbcea59fc68cbd6c0b"
integrity sha512-AtKwD0VEx0zWkL0ZjixEkp5tbNLzX+FCqGG1SvOu993HnSz4qDI6S4kGzubrEJAljpVkhRSlg5bzpV//E6ysTQ==
"@rollup/rollup-linux-arm-gnueabihf@4.17.2":
version "4.17.2"
resolved "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.17.2.tgz#1a7641111be67c10111f7122d1e375d1226cbf14"
integrity sha512-3reX2fUHqN7sffBNqmEyMQVj/CKhIHZd4y631duy0hZqI8Qoqf6lTtmAKvJFYa6bhU95B1D0WgzHkmTg33In0A==
"@rollup/rollup-linux-arm-musleabihf@4.17.2":
version "4.17.2"
resolved "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.17.2.tgz#c93fd632923e0fee25aacd2ae414288d0b7455bb"
integrity sha512-uSqpsp91mheRgw96xtyAGP9FW5ChctTFEoXP0r5FAzj/3ZRv3Uxjtc7taRQSaQM/q85KEKjKsZuiZM3GyUivRg==
"@rollup/rollup-linux-arm64-gnu@4.17.2":
version "4.17.2"
resolved "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.17.2.tgz#fa531425dd21d058a630947527b4612d9d0b4a4a"
integrity sha512-EMMPHkiCRtE8Wdk3Qhtciq6BndLtstqZIroHiiGzB3C5LDJmIZcSzVtLRbwuXuUft1Cnv+9fxuDtDxz3k3EW2A==
"@rollup/rollup-linux-arm64-musl@4.17.2":
version "4.17.2"
resolved "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.17.2.tgz#8acc16f095ceea5854caf7b07e73f7d1802ac5af"
integrity sha512-NMPylUUZ1i0z/xJUIx6VUhISZDRT+uTWpBcjdv0/zkp7b/bQDF+NfnfdzuTiB1G6HTodgoFa93hp0O1xl+/UbA==
"@rollup/rollup-linux-powerpc64le-gnu@4.17.2":
version "4.17.2"
resolved "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.17.2.tgz#94e69a8499b5cf368911b83a44bb230782aeb571"
integrity sha512-T19My13y8uYXPw/L/k0JYaX1fJKFT/PWdXiHr8mTbXWxjVF1t+8Xl31DgBBvEKclw+1b00Chg0hxE2O7bTG7GQ==
"@rollup/rollup-linux-riscv64-gnu@4.17.2":
version "4.17.2"
resolved "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.17.2.tgz#7ef1c781c7e59e85a6ce261cc95d7f1e0b56db0f"
integrity sha512-BOaNfthf3X3fOWAB+IJ9kxTgPmMqPPH5f5k2DcCsRrBIbWnaJCgX2ll77dV1TdSy9SaXTR5iDXRL8n7AnoP5cg==
"@rollup/rollup-linux-s390x-gnu@4.17.2":
version "4.17.2"
resolved "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.17.2.tgz#f15775841c3232fca9b78cd25a7a0512c694b354"
integrity sha512-W0UP/x7bnn3xN2eYMql2T/+wpASLE5SjObXILTMPUBDB/Fg/FxC+gX4nvCfPBCbNhz51C+HcqQp2qQ4u25ok6g==
"@rollup/rollup-linux-x64-gnu@4.17.2":
version "4.17.2"
resolved "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.17.2.tgz#b521d271798d037ad70c9f85dd97d25f8a52e811"
integrity sha512-Hy7pLwByUOuyaFC6mAr7m+oMC+V7qyifzs/nW2OJfC8H4hbCzOX07Ov0VFk/zP3kBsELWNFi7rJtgbKYsav9QQ==
"@rollup/rollup-linux-x64-musl@4.17.2":
version "4.17.2"
resolved "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.17.2.tgz#9254019cc4baac35800991315d133cc9fd1bf385"
integrity sha512-h1+yTWeYbRdAyJ/jMiVw0l6fOOm/0D1vNLui9iPuqgRGnXA0u21gAqOyB5iHjlM9MMfNOm9RHCQ7zLIzT0x11Q==
"@rollup/rollup-win32-arm64-msvc@4.17.2":
version "4.17.2"
resolved "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.17.2.tgz#27f65a89f6f52ee9426ec11e3571038e4671790f"
integrity sha512-tmdtXMfKAjy5+IQsVtDiCfqbynAQE/TQRpWdVataHmhMb9DCoJxp9vLcCBjEQWMiUYxO1QprH/HbY9ragCEFLA==
"@rollup/rollup-win32-ia32-msvc@4.17.2":
version "4.17.2"
resolved "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.17.2.tgz#a2fbf8246ed0bb014f078ca34ae6b377a90cb411"
integrity sha512-7II/QCSTAHuE5vdZaQEwJq2ZACkBpQDOmQsE6D6XUbnBHW8IAhm4eTufL6msLJorzrHDFv3CF8oCA/hSIRuZeQ==
"@rollup/rollup-win32-x64-msvc@4.17.2":
version "4.17.2"
resolved "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.17.2.tgz#5a2d08b81e8064b34242d5cc9973ef8dd1e60503"
integrity sha512-TGGO7v7qOq4CYmSBVEYpI1Y5xDuCEnbVC5Vth8mOsW0gDSzxNrVERPc790IGHsrT2dQSimgMr9Ub3Y1Jci5/8w==
"@sinclair/typebox@^0.24.1":
version "0.24.28"
resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.24.28.tgz#15aa0b416f82c268b1573ab653e4413c965fe794"
@ -1206,26 +1207,6 @@
resolved "https://registry.yarnpkg.com/@stencil/core/-/core-3.4.2.tgz#57ce7f71fe18c2ec0967821bec667fc453cca962"
integrity sha512-FAUhUVaakCy29nU2GwO/HQBRV1ihPRvncz3PUc8oR+UJLAxGabTmP8PLY7wvHfbw+Cvi4VXfJFTBvdfDu6iKPQ==
"@tsconfig/node10@^1.0.7":
version "1.0.9"
resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2"
integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==
"@tsconfig/node12@^1.0.7":
version "1.0.11"
resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d"
integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==
"@tsconfig/node14@^1.0.0":
version "1.0.3"
resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1"
integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==
"@tsconfig/node16@^1.0.2":
version "1.0.3"
resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.3.tgz#472eaab5f15c1ffdd7f8628bd4c4f753995ec79e"
integrity sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==
"@types/archiver@^5.3.2":
version "5.3.2"
resolved "https://registry.yarnpkg.com/@types/archiver/-/archiver-5.3.2.tgz#a9f0bcb0f0b991400e7766d35f6e19d163bdadcc"
@ -1274,6 +1255,11 @@
"@types/filesystem" "*"
"@types/har-format" "*"
"@types/estree@1.0.5":
version "1.0.5"
resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4"
integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==
"@types/estree@^1.0.0":
version "1.0.0"
resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.0.tgz#5fb2e536c1ae9bf35366eed879e827fa59ca41c2"
@ -1571,23 +1557,10 @@
"@typescript-eslint/types" "6.3.0"
eslint-visitor-keys "^3.4.1"
"@vitejs/plugin-react@>=1.2.0":
version "2.1.0"
resolved "https://registry.yarnpkg.com/@vitejs/plugin-react/-/plugin-react-2.1.0.tgz#4c99df15e71d2630601bd3018093bdc787d40e55"
integrity sha512-am6rPyyU3LzUYne3Gd9oj9c4Rzbq5hQnuGXSMT6Gujq45Il/+bunwq3lrB7wghLkiF45ygMwft37vgJ/NE8IAA==
dependencies:
"@babel/core" "^7.18.13"
"@babel/plugin-transform-react-jsx" "^7.18.10"
"@babel/plugin-transform-react-jsx-development" "^7.18.6"
"@babel/plugin-transform-react-jsx-self" "^7.18.6"
"@babel/plugin-transform-react-jsx-source" "^7.18.6"
magic-string "^0.26.2"
react-refresh "^0.14.0"
"@vitejs/plugin-vue@^4.2.3":
version "4.2.3"
resolved "https://registry.yarnpkg.com/@vitejs/plugin-vue/-/plugin-vue-4.2.3.tgz#ee0b6dfcc62fe65364e6395bf38fa2ba10bb44b6"
integrity sha512-R6JDUfiZbJA9cMiguQ7jxALsgiprjBeHL5ikpXfJCH62pPHtI+JdJ5xWj6Ev73yXSlYl86+blXn1kZHQ7uElxw==
"@vitejs/plugin-vue@^5.0.4":
version "5.0.4"
resolved "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.0.4.tgz#508d6a0f2440f86945835d903fcc0d95d1bb8a37"
integrity sha512-WS3hevEszI6CEVEx28F8RjTX97k3KsrcY6kvTg7+Whm5y3oYvcqzVeGCU3hxSAn4uY2CLCkeokkGKpoctccilQ==
"@volar/language-core@1.10.0", "@volar/language-core@~1.10.0":
version "1.10.0"
@ -1756,12 +1729,12 @@ acorn-jsx@^5.3.2:
resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937"
integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==
acorn-walk@^8.1.1, acorn-walk@^8.2.0:
acorn-walk@^8.2.0:
version "8.2.0"
resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1"
integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==
acorn@^8.4.1, acorn@^8.8.0:
acorn@^8.8.0:
version "8.8.0"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.0.tgz#88c0187620435c7f6015803f5539dae05a9dbea8"
integrity sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==
@ -1854,11 +1827,6 @@ archiver@^5.3.1:
tar-stream "^2.2.0"
zip-stream "^4.1.0"
arg@^4.1.0:
version "4.1.3"
resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089"
integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==
argparse@^1.0.7:
version "1.0.10"
resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
@ -2091,7 +2059,7 @@ caniuse-lite@^1.0.30001370:
chalk@^2.0.0:
version "2.4.2"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
dependencies:
ansi-styles "^3.2.1"
@ -2274,11 +2242,6 @@ crc32-stream@^4.0.2:
crc-32 "^1.2.0"
readable-stream "^3.4.0"
create-require@^1.1.0:
version "1.1.1"
resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333"
integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==
cross-spawn@^7.0.2, cross-spawn@^7.0.3:
version "7.0.3"
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
@ -2376,11 +2339,6 @@ diff-sequences@^29.4.3:
resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.4.3.tgz#9314bc1fabe09267ffeca9cbafc457d8499a13f2"
integrity sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==
diff@^4.0.1:
version "4.0.2"
resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d"
integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==
dir-glob@^3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f"
@ -2515,33 +2473,34 @@ es-to-primitive@^1.2.1:
is-date-object "^1.0.1"
is-symbol "^1.0.2"
esbuild@^0.18.10:
version "0.18.20"
resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.18.20.tgz#4709f5a34801b43b799ab7d6d82f7284a9b7a7a6"
integrity sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==
esbuild@^0.20.1, esbuild@~0.20.2:
version "0.20.2"
resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz#9d6b2386561766ee6b5a55196c6d766d28c87ea1"
integrity sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==
optionalDependencies:
"@esbuild/android-arm" "0.18.20"
"@esbuild/android-arm64" "0.18.20"
"@esbuild/android-x64" "0.18.20"
"@esbuild/darwin-arm64" "0.18.20"
"@esbuild/darwin-x64" "0.18.20"
"@esbuild/freebsd-arm64" "0.18.20"
"@esbuild/freebsd-x64" "0.18.20"
"@esbuild/linux-arm" "0.18.20"
"@esbuild/linux-arm64" "0.18.20"
"@esbuild/linux-ia32" "0.18.20"
"@esbuild/linux-loong64" "0.18.20"
"@esbuild/linux-mips64el" "0.18.20"
"@esbuild/linux-ppc64" "0.18.20"
"@esbuild/linux-riscv64" "0.18.20"
"@esbuild/linux-s390x" "0.18.20"
"@esbuild/linux-x64" "0.18.20"
"@esbuild/netbsd-x64" "0.18.20"
"@esbuild/openbsd-x64" "0.18.20"
"@esbuild/sunos-x64" "0.18.20"
"@esbuild/win32-arm64" "0.18.20"
"@esbuild/win32-ia32" "0.18.20"
"@esbuild/win32-x64" "0.18.20"
"@esbuild/aix-ppc64" "0.20.2"
"@esbuild/android-arm" "0.20.2"
"@esbuild/android-arm64" "0.20.2"
"@esbuild/android-x64" "0.20.2"
"@esbuild/darwin-arm64" "0.20.2"
"@esbuild/darwin-x64" "0.20.2"
"@esbuild/freebsd-arm64" "0.20.2"
"@esbuild/freebsd-x64" "0.20.2"
"@esbuild/linux-arm" "0.20.2"
"@esbuild/linux-arm64" "0.20.2"
"@esbuild/linux-ia32" "0.20.2"
"@esbuild/linux-loong64" "0.20.2"
"@esbuild/linux-mips64el" "0.20.2"
"@esbuild/linux-ppc64" "0.20.2"
"@esbuild/linux-riscv64" "0.20.2"
"@esbuild/linux-s390x" "0.20.2"
"@esbuild/linux-x64" "0.20.2"
"@esbuild/netbsd-x64" "0.20.2"
"@esbuild/openbsd-x64" "0.20.2"
"@esbuild/sunos-x64" "0.20.2"
"@esbuild/win32-arm64" "0.20.2"
"@esbuild/win32-ia32" "0.20.2"
"@esbuild/win32-x64" "0.20.2"
escalade@^3.1.1:
version "3.1.1"
@ -2717,14 +2676,14 @@ esutils@^2.0.2:
resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
ethers@^6.7.0:
version "6.7.0"
resolved "https://registry.yarnpkg.com/ethers/-/ethers-6.7.0.tgz#0f772c31a9450de28aa518b181c8cb269bbe7fd1"
integrity sha512-pxt5hK82RNwcTX2gOZP81t6qVPVspnkpeivwEgQuK9XUvbNtghBnT8GNIb/gPh+WnVSfi8cXC9XlfT8sqc6D6w==
ethers@^6.11.1:
version "6.11.1"
resolved "https://registry.npmjs.org/ethers/-/ethers-6.11.1.tgz#96aae00b627c2e35f9b0a4d65c7ab658259ee6af"
integrity sha512-mxTAE6wqJQAbp5QAe/+o+rXOID7Nw91OZXvgpjDa1r4fAbq2Nu314oEZSbjoRLacuCzs7kUC3clEvkCQowffGg==
dependencies:
"@adraffy/ens-normalize" "1.9.2"
"@noble/hashes" "1.1.2"
"@noble/secp256k1" "1.7.1"
"@adraffy/ens-normalize" "1.10.1"
"@noble/curves" "1.2.0"
"@noble/hashes" "1.3.2"
"@types/node" "18.15.13"
aes-js "4.0.0-beta.5"
tslib "2.4.0"
@ -2922,6 +2881,11 @@ fsevents@^2.3.2, fsevents@~2.3.2:
resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a"
integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==
fsevents@~2.3.3:
version "2.3.3"
resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6"
integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==
function-bind@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
@ -2979,6 +2943,13 @@ get-symbol-description@^1.0.0:
call-bind "^1.0.2"
get-intrinsic "^1.1.1"
get-tsconfig@^4.7.3:
version "4.7.3"
resolved "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.3.tgz#0498163d98f7b58484dd4906999c0c9d5f103f83"
integrity sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==
dependencies:
resolve-pkg-maps "^1.0.0"
glob-parent@^5.1.2, glob-parent@~5.1.2:
version "5.1.2"
resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
@ -3999,7 +3970,7 @@ lru-cache@^6.0.0:
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.0.1.tgz#0a3be479df549cca0e5d693ac402ff19537a6b7a"
integrity sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==
magic-string@^0.26.0, magic-string@^0.26.2:
magic-string@^0.26.0:
version "0.26.4"
resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.26.4.tgz#3d057d3d0234c3b179aa3f421b33fe5d8a4044a8"
integrity sha512-e5uXtVJ22aEpK9u1+eQf0fSxHeqwyV19K+uGnlROCxUhzwRip9tBsaMViK/0vC3viyPd5Gtucp3UmEp/Q2cPTQ==
@ -4027,7 +3998,7 @@ make-dir@^3.0.0:
dependencies:
semver "^6.0.0"
make-error@1.x, make-error@^1.1.1:
make-error@1.x:
version "1.3.6"
resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2"
integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==
@ -4140,10 +4111,10 @@ nanoid@^3.3.4:
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab"
integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==
nanoid@^3.3.6:
version "3.3.6"
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c"
integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==
nanoid@^3.3.7:
version "3.3.7"
resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8"
integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==
native-run@^1.7.2:
version "1.7.2"
@ -4415,14 +4386,14 @@ postcss@^8.1.10:
picocolors "^1.0.0"
source-map-js "^1.0.2"
postcss@^8.4.27:
version "8.4.27"
resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.27.tgz#234d7e4b72e34ba5a92c29636734349e0d9c3057"
integrity sha512-gY/ACJtJPSmUFPDCHtX78+01fHa64FaU4zaaWfuh1MhGJISufJAH4cun6k/8fwsHYeK4UQmENQK+tRLCFJE8JQ==
postcss@^8.4.38:
version "8.4.38"
resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz#b387d533baf2054288e337066d81c6bee9db9e0e"
integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==
dependencies:
nanoid "^3.3.6"
nanoid "^3.3.7"
picocolors "^1.0.0"
source-map-js "^1.0.2"
source-map-js "^1.2.0"
prelude-ls@^1.2.1:
version "1.2.1"
@ -4490,11 +4461,6 @@ react-refresh@^0.13.0:
resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.13.0.tgz#cbd01a4482a177a5da8d44c9755ebb1f26d5a1c1"
integrity sha512-XP8A9BT0CpRBD+NYLLeIhld/RqG9+gktUjW1FkE+Vm7OCinbG1SshcK5tb9ls4kzvjZr9mOQc7HYgBngEyPAXg==
react-refresh@^0.14.0:
version "0.14.0"
resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.14.0.tgz#4e02825378a5f227079554d4284889354e5f553e"
integrity sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==
readable-stream@3, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.5.0, readable-stream@^3.6.0:
version "3.6.0"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
@ -4562,6 +4528,11 @@ resolve-from@^5.0.0:
resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69"
integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==
resolve-pkg-maps@^1.0.0:
version "1.0.0"
resolved "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f"
integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==
resolve.exports@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.0.tgz#c1a0028c2d166ec2fbf7d0644584927e76e7400e"
@ -4602,18 +4573,36 @@ rollup-plugin-polyfill-node@^0.12.0:
dependencies:
"@rollup/plugin-inject" "^5.0.1"
rollup@^2.70.2:
version "2.79.1"
resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.79.1.tgz#bedee8faef7c9f93a2647ac0108748f497f081c7"
integrity sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==
rollup@2.78.1:
version "2.78.1"
resolved "https://registry.npmjs.org/rollup/-/rollup-2.78.1.tgz#52fe3934d9c83cb4f7c4cb5fb75d88591be8648f"
integrity sha512-VeeCgtGi4P+o9hIg+xz4qQpRl6R401LWEXBmxYKOV4zlF82lyhgh2hTZnheFUbANE8l2A41F458iwj2vEYaXJg==
optionalDependencies:
fsevents "~2.3.2"
rollup@^3.27.1:
version "3.28.0"
resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.28.0.tgz#a3c70004b01934760c0cb8df717c7a1d932389a2"
integrity sha512-d7zhvo1OUY2SXSM6pfNjgD5+d0Nz87CUp4mt8l/GgVP3oBsPwzNvSzyu1me6BSG9JIgWNTVcafIXBIyM8yQ3yw==
rollup@^4.13.0:
version "4.17.2"
resolved "https://registry.npmjs.org/rollup/-/rollup-4.17.2.tgz#26d1785d0144122277fdb20ab3a24729ae68301f"
integrity sha512-/9ClTJPByC0U4zNLowV1tMBe8yMEAxewtR3cUNX5BoEpGH3dQEWpJLr6CLp0fPdYRF/fzVOgvDb1zXuakwF5kQ==
dependencies:
"@types/estree" "1.0.5"
optionalDependencies:
"@rollup/rollup-android-arm-eabi" "4.17.2"
"@rollup/rollup-android-arm64" "4.17.2"
"@rollup/rollup-darwin-arm64" "4.17.2"
"@rollup/rollup-darwin-x64" "4.17.2"
"@rollup/rollup-linux-arm-gnueabihf" "4.17.2"
"@rollup/rollup-linux-arm-musleabihf" "4.17.2"
"@rollup/rollup-linux-arm64-gnu" "4.17.2"
"@rollup/rollup-linux-arm64-musl" "4.17.2"
"@rollup/rollup-linux-powerpc64le-gnu" "4.17.2"
"@rollup/rollup-linux-riscv64-gnu" "4.17.2"
"@rollup/rollup-linux-s390x-gnu" "4.17.2"
"@rollup/rollup-linux-x64-gnu" "4.17.2"
"@rollup/rollup-linux-x64-musl" "4.17.2"
"@rollup/rollup-win32-arm64-msvc" "4.17.2"
"@rollup/rollup-win32-ia32-msvc" "4.17.2"
"@rollup/rollup-win32-x64-msvc" "4.17.2"
fsevents "~2.3.2"
run-parallel@^1.1.9:
@ -4623,6 +4612,13 @@ run-parallel@^1.1.9:
dependencies:
queue-microtask "^1.2.2"
rxjs@7.5.7:
version "7.5.7"
resolved "https://registry.npmjs.org/rxjs/-/rxjs-7.5.7.tgz#2ec0d57fdc89ece220d2e702730ae8f1e49def39"
integrity sha512-z9MzKh/UcOqB3i20H6rtrlaE/CgjLOvheWK/9ILrbhROGTweAi1BaFsTT9FbwZi5Trr1qNRs+MXkhmR06awzQA==
dependencies:
tslib "^2.1.0"
safe-buffer@~5.1.0, safe-buffer@~5.1.1:
version "5.1.2"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
@ -4730,6 +4726,11 @@ slice-ansi@^4.0.0:
resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c"
integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==
source-map-js@^1.2.0:
version "1.2.0"
resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af"
integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==
source-map-support@0.5.13:
version "0.5.13"
resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932"
@ -4960,25 +4961,6 @@ ts-jest@^29.1.1:
semver "^7.5.3"
yargs-parser "^21.0.1"
ts-node@^10.9.1:
version "10.9.1"
resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b"
integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==
dependencies:
"@cspotcode/source-map-support" "^0.8.0"
"@tsconfig/node10" "^1.0.7"
"@tsconfig/node12" "^1.0.7"
"@tsconfig/node14" "^1.0.0"
"@tsconfig/node16" "^1.0.2"
acorn "^8.4.1"
acorn-walk "^8.1.1"
arg "^4.1.0"
create-require "^1.1.0"
diff "^4.0.1"
make-error "^1.1.1"
v8-compile-cache-lib "^3.0.1"
yn "3.1.1"
tslib@2.4.0, tslib@^2.0.1, tslib@^2.1.0, tslib@^2.4.0:
version "2.4.0"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3"
@ -4996,6 +4978,16 @@ tsutils@^3.21.0:
dependencies:
tslib "^1.8.1"
tsx@^4.8.0:
version "4.8.0"
resolved "https://registry.npmjs.org/tsx/-/tsx-4.8.0.tgz#b548e20b872c020060a62ca3d3a211ae163aa31d"
integrity sha512-lp2y1/L03n7HUMujPgJQ/BwLDT4QEPPY5gBsDohsx54o0d0FqC8uL7QeQwv29ZVrv6S8rH8nzQ5cPn5ry4KBZA==
dependencies:
esbuild "~0.20.2"
get-tsconfig "^4.7.3"
optionalDependencies:
fsevents "~2.3.3"
type-check@^0.4.0, type-check@~0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1"
@ -5079,11 +5071,6 @@ util@^0.12.5:
is-typed-array "^1.1.3"
which-typed-array "^1.1.2"
v8-compile-cache-lib@^3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf"
integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==
v8-to-istanbul@^9.0.1:
version "9.0.1"
resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz#b6f994b0b5d4ef255e17a0d17dc444a9f5132fa4"
@ -5093,16 +5080,16 @@ v8-to-istanbul@^9.0.1:
"@types/istanbul-lib-coverage" "^2.0.1"
convert-source-map "^1.6.0"
vite@^4.4.9:
version "4.4.9"
resolved "https://registry.yarnpkg.com/vite/-/vite-4.4.9.tgz#1402423f1a2f8d66fd8d15e351127c7236d29d3d"
integrity sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==
vite@^5.2.10:
version "5.2.11"
resolved "https://registry.npmjs.org/vite/-/vite-5.2.11.tgz#726ec05555431735853417c3c0bfb36003ca0cbd"
integrity sha512-HndV31LWW05i1BLPMUCE1B9E9GFbOu1MbenhS58FuK6owSO5qHm7GiCotrNY1YE5rMeQSFBGmT5ZaLEjFizgiQ==
dependencies:
esbuild "^0.18.10"
postcss "^8.4.27"
rollup "^3.27.1"
esbuild "^0.20.1"
postcss "^8.4.38"
rollup "^4.13.0"
optionalDependencies:
fsevents "~2.3.2"
fsevents "~2.3.3"
vue-eslint-parser@^9.1.1, vue-eslint-parser@^9.3.1:
version "9.3.1"
@ -5280,11 +5267,6 @@ yauzl@^2.10.0:
buffer-crc32 "~0.2.3"
fd-slicer "~1.1.0"
yn@3.1.1:
version "3.1.1"
resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50"
integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==
yocto-queue@^0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"