├── .github └── workflows │ ├── publish.yml │ └── test-windows-build.yml ├── .gitignore ├── .gitmodules ├── README.md ├── browser-extension ├── background.js ├── content-script.js ├── eip1193provider.js ├── logo │ └── 128x128.png ├── manifest.json ├── popup │ ├── popup.html │ └── save-settings.js └── redir.js ├── build.sh ├── imgs ├── image-20220907174327860.png ├── image-20220907174435322.png ├── image-20220907174518714.png ├── image-20220907174619204.png └── image-20220907174703173.png ├── mfer-safe-desktop-app ├── .gitignore ├── README.md ├── package-lock.json ├── package.json ├── public │ ├── favicon.ico │ ├── index.html │ ├── logo192.png │ ├── logo512.png │ ├── manifest.json │ └── robots.txt ├── src-tauri │ ├── .gitignore │ ├── Cargo.lock │ ├── Cargo.toml │ ├── build.rs │ ├── icons │ │ ├── 128x128.png │ │ ├── 128x128@2x.png │ │ ├── 32x32.png │ │ ├── Square107x107Logo.png │ │ ├── Square142x142Logo.png │ │ ├── Square150x150Logo.png │ │ ├── Square284x284Logo.png │ │ ├── Square30x30Logo.png │ │ ├── Square310x310Logo.png │ │ ├── Square44x44Logo.png │ │ ├── Square71x71Logo.png │ │ ├── Square89x89Logo.png │ │ ├── StoreLogo.png │ │ ├── icon.icns │ │ ├── icon.ico │ │ └── icon.png │ ├── src │ │ └── main.rs │ └── tauri.conf.json └── src │ ├── AbiEventForm.js │ ├── App.css │ ├── App.js │ ├── App.test.js │ ├── BalanceOverview.css │ ├── BalanceOverview.js │ ├── EventForm.css │ ├── FieldSet.js │ ├── LogsView.js │ ├── NavTabs.js │ ├── SettingsView.js │ ├── SimulateView.js │ ├── TraceView.js │ ├── TxDataOverview.js │ ├── eventSignatures.json │ ├── functionSignatures.json │ ├── index.css │ ├── index.js │ ├── logo.svg │ ├── processTokenTransfers.js │ ├── react-app-env.d.ts │ ├── reportWebVitals.js │ ├── setupTests.js │ ├── sushi_token_list.json │ └── utils.js ├── preprocess_4bytes.js └── preprocess_topic0.js /.github/workflows/publish.yml: -------------------------------------------------------------------------------- 1 | name: "publish" 2 | on: 3 | push: 4 | branches: 5 | - release 6 | 7 | jobs: 8 | publish-mfer-safe: 9 | strategy: 10 | fail-fast: false 11 | matrix: 12 | platform: [macos-latest, ubuntu-latest, windows-latest] 13 | 14 | runs-on: ${{ matrix.platform }} 15 | steps: 16 | - uses: actions/checkout@v2 17 | with: 18 | submodules: recursive 19 | - name: Setup Go environment 20 | uses: actions/setup-go@v3.2.1 21 | - name: setup node 22 | uses: actions/setup-node@v1 23 | with: 24 | node-version: 16 25 | - name: install Rust stable 26 | uses: actions-rs/toolchain@v1 27 | with: 28 | toolchain: stable 29 | - name: install dependencies (ubuntu only) 30 | if: matrix.platform == 'ubuntu-latest' 31 | run: | 32 | sudo apt-get update 33 | sudo apt-get install -y libgtk-3-dev webkit2gtk-4.0 libappindicator3-dev librsvg2-dev patchelf 34 | - name: build mfer-node 35 | if: matrix.platform != 'windows-latest' 36 | run: | 37 | export "TRIPLE=$(rustc -Vv | grep host | cut -f2 -d' ')" 38 | cd mfer-node/cmd/mfer-node 39 | echo "Building mfer-node-$TRIPLE" 40 | go build -o $GITHUB_WORKSPACE/mfer-safe-desktop-app/src-tauri/bin/mfer-node-$TRIPLE 41 | - name: build mfer-node (windows only) 42 | if: matrix.platform == 'windows-latest' 43 | run: | 44 | $TRIPLE = (rustc -Vv | grep host | cut -f2 -d' ') 45 | $EXECUTABLE = "mfer-node-$TRIPLE.exe" 46 | $DEST = "$env:GITHUB_WORKSPACE/mfer-safe-desktop-app/src-tauri/bin/$EXECUTABLE" 47 | cd mfer-node/cmd/mfer-node 48 | echo "Building mfer-node-$TRIPLE" 49 | go build -o $DEST 50 | - name: build frontend 51 | working-directory: ./mfer-safe-desktop-app 52 | run: | 53 | npm i 54 | npm run build 55 | - uses: tauri-apps/tauri-action@v0 56 | env: 57 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 58 | with: 59 | tagName: mfer-safe-v__VERSION__ # the action automatically replaces \_\_VERSION\_\_ with the app version 60 | releaseName: "MferSafe v__VERSION__" 61 | releaseBody: "See the assets to download this version and install." 62 | releaseDraft: true 63 | prerelease: false 64 | 65 | -------------------------------------------------------------------------------- /.github/workflows/test-windows-build.yml: -------------------------------------------------------------------------------- 1 | name: "test-windows-build" 2 | on: 3 | push: 4 | branches: 5 | - release 6 | 7 | jobs: 8 | publish-tauri: 9 | strategy: 10 | fail-fast: false 11 | matrix: 12 | platform: [windows-latest] 13 | 14 | runs-on: ${{ matrix.platform }} 15 | steps: 16 | # - uses: actions/checkout@v2 17 | # with: 18 | # token: ${{ secrets.MFER_NODE_PAT }} 19 | # submodules: recursive 20 | # - name: install Rust stable 21 | # uses: actions-rs/toolchain@v1 22 | # with: 23 | # toolchain: stable 24 | # - name: Setup Go environment 25 | # uses: actions/setup-go@v3.2.1 26 | - name: build mfer-node (windows only) 27 | if: matrix.platform == 'windows-latest' 28 | run: | 29 | $TRIPLE = "x86_64-pc-windows-msvc" 30 | env 31 | rustc -Vv | grep host | cut -f2 -d' ' 32 | # cd mfer-node/cmd/mfer-node 33 | echo "Building mfer-node-$TRIPLE" 34 | $DEST = "$env:GITHUB_WORKSPACE/mfer-safe-desktop-app/src-tauri/bin/mfer-node-$TRIPLE" 35 | echo "build dest: $DEST" 36 | # go build -o $GITHUB_WORKSPACE/mfer-safe-desktop-app/src-tauri/bin/mfer-node-$TRIPLE 37 | # dir $GITHUB_WORKSPACE/mfer-safe-desktop-app/src-tauri/bin -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .DS_Store 3 | .vscode 4 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "topic0"] 2 | path = topic0 3 | url = https://github.com/wmitsuda/topic0 4 | [submodule "mfer-node"] 5 | path = mfer-node 6 | url = https://github.com/sec-bit/mfer-node 7 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## MferSafe is inspired by [ApeSafe](https://github.com/banteg/ape-safe), which focuses on interaction via Dapp's front end. 2 | 3 | What can MferSafe do? 4 | 5 | Let me show some cases: 6 | 7 | For users who want to experience dapps for free. 8 | 9 | For advanced users who want to inspect dapp details. 10 | 11 | For developers who want to test in production. 12 | 13 | For MEV searchers (pinning blocks, arbitrage by hand, then analyzing call traces to evaluate profit). 14 | 15 | For whitehats (test attack vector in almost real-world, mint huge amount of money for oracle manipulation). 16 | 17 | For Gnosis Safe MultiSig Wallet users or other smart wallet users. 18 | 19 | Protect your assets from a compromised front end. 20 | 21 | Protect your privacy by using Address Randomization. 22 | 23 | More functions will be extended by you! (just write some simple HTTP requests) 24 | 25 | By using MferSafe's browser extension, it will redirect all eth_xx RPC to MferSafe and record all transactions, and make state mutations at local, so you can do lots of Dapp interactions seamlessly. 26 | 27 | You can set the account address (ENS is supported) you want to impersonate and view the local transaction pool, inspect each transaction's event log and debug trace. 28 | 29 | If you are using the GnosisSafe multi-sig wallet, you can simulate the local transaction pool as a transaction bundle, and send the bundle via MultiSend. 30 | 31 | MferSafe also provides a convenient way to sign GnosisSafe transactions. When you simulate the transaction bundle, it shows up ApproveHash and ApproveHashCalldata. 32 | 33 | You have 2 options to execute the multi-sig transaction. 34 | 35 | The widely used way is to sign the ApproveHash and set each participant's Signature Override field, then you can send a transaction to your wallet address and set the calldata to 'ExecTransaction Calldata'. 36 | 37 | The other way of signing the transaction is by calling 'approveHash' function by all participants and sending the execution transaction by the last participant. 38 | 39 | Demo: 40 | 41 | [![Demo Video](https://img.youtube.com/vi/zciR5oEg-uY/hqdefault.jpg)](https://youtu.be/zciR5oEg-uY) 42 | 43 | ### How to use 44 | 45 | 1. [Install browser-extension](https://chrome.google.com/webstore/detail/mfersafe/ppkcjeilamojjbimmkbpkfknjccpflbh) 46 | 2. Launch the MferSafe app 47 | 48 | ### Screenshots 49 | 50 | ![](imgs/image-20220907174327860.png) 51 | 52 | ![](imgs/image-20220907174435322.png) 53 | 54 | ![](imgs/image-20220907174518714.png) 55 | 56 | ![](imgs/image-20220907174619204.png) 57 | 58 | ![](imgs/image-20220907174703173.png) 59 | 60 | ### Build 61 | 62 | Apple Silicon macOS Prerequisite: 63 | 64 | `brew install pkg-config cairo pango libpng jpeg giflib librsvg pixman` 65 | 66 | 1. [Install tauri build environment](https://tauri.app/zh/v1/guides/getting-started/prerequisites) 67 | 2. [Install golang](https://go.dev/doc/install) 68 | 3. `./build.sh` 69 | 70 | ### Download Binary build by Github Action 71 | 72 | [Download Binary] https://github.com/sec-bit/mfer-safe/releases 73 | -------------------------------------------------------------------------------- /browser-extension/background.js: -------------------------------------------------------------------------------- 1 | const mfersafeSettings = { rpc: "http://localhost:10545" }; 2 | 3 | chrome.storage.local.get(["rpcAddr"], function (result) { 4 | var rpcAddr = result.rpcAddr || "http://localhost:10545"; 5 | console.log("rpcAddr init value: " + rpcAddr); 6 | mfersafeSettings.rpc = rpcAddr; 7 | }); 8 | 9 | chrome.storage.onChanged.addListener((changes, namespace) => { 10 | if (!changes.rpcAddr){ 11 | return; 12 | } 13 | console.log("rpc changes from:", mfersafeSettings.rpc, "to:", changes.rpcAddr.newValue); 14 | mfersafeSettings.rpc = changes.rpcAddr.newValue; 15 | }); 16 | 17 | chrome.runtime.onMessage.addListener((request, sender, sendResponse) => { 18 | if ( 19 | request === undefined || 20 | request.method === undefined || 21 | request.method.indexOf("eth_") < 0 22 | ) { 23 | sendResponse(false); 24 | return; 25 | } 26 | 27 | try { 28 | var reqBody = { 29 | headers: { 30 | Accept: "application/json", 31 | "Content-Type": "application/json", 32 | }, 33 | body: JSON.stringify(request), 34 | method: "POST", 35 | }; 36 | 37 | fetch(mfersafeSettings.rpc, reqBody) 38 | .then((response) => response.json()) 39 | .then((body) => { 40 | console.log("mfernode response:", body); 41 | sendResponse(body); 42 | }); 43 | } catch (e) { 44 | console.log(request, e); 45 | sendResponse(false); 46 | } 47 | return true; 48 | }); 49 | -------------------------------------------------------------------------------- /browser-extension/content-script.js: -------------------------------------------------------------------------------- 1 | var s = document.createElement("script"); 2 | s.src = chrome.runtime.getURL("redir.js"); 3 | s.onload = function () { 4 | this.remove(); 5 | }; 6 | (document.head || document.documentElement).appendChild(s); 7 | console.log("redir injected"); 8 | 9 | chrome.storage.local.get(["inject"], function (result) { 10 | if (result.inject) { 11 | var s = document.createElement("script"); 12 | s.src = chrome.runtime.getURL("eip1193provider.js"); 13 | s.onload = function () { 14 | this.remove(); 15 | }; 16 | (document.head || document.documentElement).appendChild(s); 17 | console.log("eip1193 provider injected"); 18 | } 19 | }); 20 | 21 | window.addEventListener( 22 | "message", 23 | (event) => { 24 | // We only accept messages from ourselves 25 | if (event.source != window) { 26 | return; 27 | } 28 | 29 | if (event.data.type && event.data.type == "FROM_PAGE") { 30 | var request = event.data.request; 31 | chrome.runtime.sendMessage(request, (response) => { 32 | window.postMessage( 33 | { 34 | type: "TO_PAGE", 35 | text: "hello from content script", 36 | request: request, 37 | response: response, 38 | }, 39 | "*" 40 | ); 41 | }); 42 | } 43 | }, 44 | false 45 | ); 46 | -------------------------------------------------------------------------------- /browser-extension/eip1193provider.js: -------------------------------------------------------------------------------- 1 | //////// EIP1193 Provider //////// 2 | class EIP1193Provider { 3 | request(args) { 4 | if (args === undefined) { 5 | return; 6 | } 7 | 8 | switch (args.method) { 9 | case "eth_chainId": 10 | if (this.chainId !== "0x00") { 11 | return Promise.resolve(this.chainId); 12 | } 13 | break; 14 | case "net_version": 15 | if (this.netVersion !== "0") { 16 | return Promise.resolve(this.netVersion); 17 | } 18 | break; 19 | } 20 | 21 | if (args && args.params === undefined) { 22 | if (typeof args === "string" || args instanceof String) { 23 | args = { method: args }; 24 | } 25 | args.params = []; 26 | } 27 | 28 | this.id = this.id + 1; 29 | const request = { 30 | jsonrpc: "2.0", 31 | id: this.id, 32 | method: args.method, 33 | //https://github.com/aklinkert/js-json-rpc-client/blob/master/src/index.js 34 | params: Array.isArray(args.params) ? args.params : [args.params], 35 | }; 36 | 37 | return fetchWeb3(request) 38 | .then((content) => content.json()) 39 | .then((result) => result.result); 40 | } 41 | 42 | enable() { 43 | console.log("enable"); 44 | return this.request({ method: "eth_accounts", params: [] }); 45 | } 46 | 47 | send(args) { 48 | return this.request(args); 49 | } 50 | 51 | isConnected() { 52 | console.log("is connected"); 53 | return true; 54 | } 55 | 56 | on(event, listener) { 57 | console.log("on:", event, listener); 58 | } 59 | 60 | removeListener(event, listener) { 61 | console.log("removeListener:", event, listener); 62 | } 63 | 64 | removeAllListeners(args) { 65 | console.log("removeAllListeners:", args); 66 | } 67 | 68 | isMetaMask = true; 69 | 70 | chainId = "0x00"; 71 | 72 | selectedAddress = "0x0000000000000000000000000000000000000000"; 73 | 74 | constructor() { 75 | this.id = 0; 76 | this.request({ method: "eth_chainId", params: [] }).then((response) => { 77 | console.log("chainId =", response); 78 | this.chainId = response; 79 | this.netVersion = parseInt(response).toString(); 80 | }); 81 | this.request({ method: "eth_requestAccounts", params: [] }).then( 82 | (response) => { 83 | console.log("default address", response); 84 | this.selectedAddress = response[0]; 85 | } 86 | ); 87 | } 88 | } 89 | 90 | window.ethereum = new EIP1193Provider(); 91 | -------------------------------------------------------------------------------- /browser-extension/logo/128x128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sec-bit/mfer-safe/6584897af725796128315715a6877ecabb0e8b27/browser-extension/logo/128x128.png -------------------------------------------------------------------------------- /browser-extension/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "manifest_version": 3, 3 | "name": "MferSafe", 4 | "description": "MferSafe's Browser extension", 5 | "version": "0.0.3", 6 | "icons": { 7 | "128": "logo/128x128.png" 8 | }, 9 | "action": { 10 | "default_title": "MferSafe", 11 | "default_popup": "popup/popup.html" 12 | }, 13 | "permissions": [ 14 | "storage" 15 | ], 16 | "host_permissions": [ 17 | "*://*/*" 18 | ], 19 | "background": { 20 | "service_worker": "background.js" 21 | }, 22 | "content_scripts": [ 23 | { 24 | "js": [ 25 | "content-script.js" 26 | ], 27 | "matches": [ 28 | "https://*/*", 29 | "http://*/*" 30 | ], 31 | "run_at": "document_start" 32 | } 33 | ], 34 | "web_accessible_resources": [ 35 | { 36 | "resources": [ 37 | "redir.js", 38 | "eip1193provider.js" 39 | ], 40 | "matches": [ 41 | "" 42 | ] 43 | } 44 | ] 45 | } -------------------------------------------------------------------------------- /browser-extension/popup/popup.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 |

MferSafe Settings

6 |
7 | 8 |

9 | 10 |

11 | 12 |
13 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /browser-extension/popup/save-settings.js: -------------------------------------------------------------------------------- 1 | function saveRPCSettings() { 2 | var textfield = document.getElementById("rpc"); 3 | chrome.storage.local.set({ rpcAddr: textfield.value }, function () { 4 | console.log("Value is set to " + textfield.value); 5 | }); 6 | } 7 | const check_inj = document.querySelector("#cbox_inj"); 8 | 9 | function getAllSettings() { 10 | var textfield = document.getElementById("rpc"); 11 | chrome.storage.local.get(["rpcAddr","inject"], function (result) { 12 | var rpcAddr = result.rpcAddr; 13 | console.log("Value currently is " + rpcAddr); 14 | textfield.value = rpcAddr || "http://localhost:10545"; 15 | check_inj.checked = result.inject || false; 16 | }); 17 | } 18 | 19 | const button = document.querySelector("button"); 20 | button.addEventListener("click", (event) => { 21 | saveRPCSettings(); 22 | }); 23 | 24 | check_inj.addEventListener("change", function (e) { 25 | console.log("Inject is set to " + e.currentTarget.checked); 26 | chrome.storage.local.set({ inject: e.currentTarget.checked }, function () { 27 | }) 28 | }); 29 | 30 | getAllSettings(); -------------------------------------------------------------------------------- /browser-extension/redir.js: -------------------------------------------------------------------------------- 1 | //////// BASE FUNCTION //////// 2 | const resopnseDict = {}; 3 | const fetchWeb3 = function (request) { 4 | // console.log("from injected: ", request); 5 | window.postMessage( 6 | { 7 | type: "FROM_PAGE", 8 | text: "hello from injected script", 9 | request: request, 10 | }, 11 | "*" 12 | ); 13 | 14 | return new Promise((resolve, reject) => { 15 | var requestKey = JSON.stringify(request); 16 | resopnseDict[requestKey] = resolve; // resolved by response 17 | }); 18 | }; 19 | 20 | window.addEventListener( 21 | "message", 22 | (event) => { 23 | if (event.source != window) { 24 | return; 25 | } 26 | if (event.data.type && event.data.type == "TO_PAGE") { 27 | var blob = new Blob([JSON.stringify(event.data.response)], { 28 | type: "application/json", 29 | }); 30 | var newResponse = new Response(blob); 31 | var requestKey = JSON.stringify(event.data.request); 32 | resopnseDict[requestKey](newResponse); // resolve 33 | delete resopnseDict.requestKey; // free dict 34 | } 35 | }, 36 | false 37 | ); 38 | 39 | //////// INTERCEPT FETCH //////// 40 | // https://stackoverflow.com/questions/45425169/intercept-fetch-api-requests-and-responses-in-javascript 41 | const { fetch: origFetch } = window; 42 | window.fetch = async (...args) => { 43 | if (args.length <= 1 || args[1].body === undefined) { 44 | return await origFetch(...args); 45 | } 46 | var jsonStr; 47 | var requestBody; 48 | try { 49 | if (typeof args[1].body === "string") { 50 | jsonStr = args[1].body; 51 | } else { 52 | jsonStr = new TextDecoder().decode(args[1].body); 53 | } 54 | requestBody = JSON.parse(jsonStr); 55 | if ( 56 | requestBody.method === undefined || 57 | requestBody.method.indexOf("eth_") < 0 58 | ) { 59 | return await origFetch(...args); 60 | } 61 | } catch (e) { 62 | // console.log("error:", e, args); 63 | return await origFetch(...args); 64 | } 65 | // console.log(requestBody); 66 | return fetchWeb3(requestBody); 67 | }; 68 | 69 | // https://gilfink.medium.com/quick-tip-creating-an-xmlhttprequest-interceptor-1da23cf90b76 70 | let origXHRSend = window.XMLHttpRequest.prototype.send; 71 | window.XMLHttpRequest.prototype.send = function (args) { 72 | if (args === undefined) { 73 | return origXHRSend.apply(this, arguments); 74 | } 75 | 76 | try { 77 | var parsed = JSON.parse(args); 78 | if ( 79 | parsed.method === undefined || 80 | parsed.method.indexOf("eth_") < 0 81 | ) { 82 | return origXHRSend.apply(this, arguments); 83 | } 84 | fetchWeb3(parsed) 85 | .then((response) => response.json()) 86 | .then((body) => { 87 | // https://stackoverflow.com/a/28513219 88 | Object.defineProperty(this, 'responseText', { 89 | get: () => JSON.stringify(body), 90 | set: (x) => console.log("set: ", x), 91 | configurable: true 92 | }); 93 | Object.defineProperty(this, 'readyState', { 94 | get: () => 4, 95 | set: (x) => console.log("set: ", x), 96 | configurable: true 97 | }); 98 | this.onreadystatechange(); 99 | }); 100 | return; 101 | } 102 | catch (e) { 103 | return origXHRSend.apply(this, arguments); 104 | } 105 | } -------------------------------------------------------------------------------- /build.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | git submodule update --init --recursive 4 | # git submodule foreach --recursive git checkout main 5 | 6 | ROOT_DIR=$(pwd) 7 | cd mfer-node/cmd/mfer-node 8 | echo "Building mfer-node" 9 | TRIPLE=$(rustc -Vv | grep host | cut -f2 -d' ') 10 | go build -o $ROOT_DIR/mfer-safe-desktop-app/src-tauri/bin/mfer-node-$TRIPLE 11 | cd $ROOT_DIR 12 | 13 | echo "Building topic0" 14 | node preprocess_topic0.js 15 | 16 | echo "Building 4bytes" 17 | echo "Due to too much signature files slow down computer, using Pre-built version instead" 18 | echo "Pre-build version's commit id: 5197eb52b81b8594b6c5d3de023e649bec9523ca" 19 | # You can build your own version by uncommenting the following lines 20 | # git clone https://github.com/ethereum-lists/4bytes 21 | # node preprocess_4bytes.js 22 | 23 | cd mfer-safe-desktop-app 24 | echo "Building desktop app" 25 | npm i 26 | if [ "dev" = "$1" ]; then 27 | npm run tauri dev 28 | else 29 | npm run tauri build 30 | fi 31 | -------------------------------------------------------------------------------- /imgs/image-20220907174327860.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sec-bit/mfer-safe/6584897af725796128315715a6877ecabb0e8b27/imgs/image-20220907174327860.png -------------------------------------------------------------------------------- /imgs/image-20220907174435322.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sec-bit/mfer-safe/6584897af725796128315715a6877ecabb0e8b27/imgs/image-20220907174435322.png -------------------------------------------------------------------------------- /imgs/image-20220907174518714.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sec-bit/mfer-safe/6584897af725796128315715a6877ecabb0e8b27/imgs/image-20220907174518714.png -------------------------------------------------------------------------------- /imgs/image-20220907174619204.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sec-bit/mfer-safe/6584897af725796128315715a6877ecabb0e8b27/imgs/image-20220907174619204.png -------------------------------------------------------------------------------- /imgs/image-20220907174703173.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sec-bit/mfer-safe/6584897af725796128315715a6877ecabb0e8b27/imgs/image-20220907174703173.png -------------------------------------------------------------------------------- /mfer-safe-desktop-app/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # production 12 | /build 13 | 14 | # misc 15 | .DS_Store 16 | .env.local 17 | .env.development.local 18 | .env.test.local 19 | .env.production.local 20 | 21 | npm-debug.log* 22 | yarn-debug.log* 23 | yarn-error.log* -------------------------------------------------------------------------------- /mfer-safe-desktop-app/README.md: -------------------------------------------------------------------------------- 1 | # Getting Started with Create React App 2 | 3 | This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app). 4 | 5 | ## Available Scripts 6 | 7 | In the project directory, you can run: 8 | 9 | ### `npm start` 10 | 11 | Runs the app in the development mode.\ 12 | Open [http://localhost:3000](http://localhost:3000) to view it in your browser. 13 | 14 | The page will reload when you make changes.\ 15 | You may also see any lint errors in the console. 16 | 17 | ### `npm test` 18 | 19 | Launches the test runner in the interactive watch mode.\ 20 | See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information. 21 | 22 | ### `npm run build` 23 | 24 | Builds the app for production to the `build` folder.\ 25 | It correctly bundles React in production mode and optimizes the build for the best performance. 26 | 27 | The build is minified and the filenames include the hashes.\ 28 | Your app is ready to be deployed! 29 | 30 | See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information. 31 | 32 | ### `npm run eject` 33 | 34 | **Note: this is a one-way operation. Once you `eject`, you can't go back!** 35 | 36 | If you aren't satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project. 37 | 38 | Instead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you're on your own. 39 | 40 | You don't have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn't feel obligated to use this feature. However we understand that this tool wouldn't be useful if you couldn't customize it when you are ready for it. 41 | 42 | ## Learn More 43 | 44 | You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started). 45 | 46 | To learn React, check out the [React documentation](https://reactjs.org/). 47 | 48 | ### Code Splitting 49 | 50 | This section has moved here: [https://facebook.github.io/create-react-app/docs/code-splitting](https://facebook.github.io/create-react-app/docs/code-splitting) 51 | 52 | ### Analyzing the Bundle Size 53 | 54 | This section has moved here: [https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size](https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size) 55 | 56 | ### Making a Progressive Web App 57 | 58 | This section has moved here: [https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app](https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app) 59 | 60 | ### Advanced Configuration 61 | 62 | This section has moved here: [https://facebook.github.io/create-react-app/docs/advanced-configuration](https://facebook.github.io/create-react-app/docs/advanced-configuration) 63 | 64 | ### Deployment 65 | 66 | This section has moved here: [https://facebook.github.io/create-react-app/docs/deployment](https://facebook.github.io/create-react-app/docs/deployment) 67 | 68 | ### `npm run build` fails to minify 69 | 70 | This section has moved here: [https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify](https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify) 71 | -------------------------------------------------------------------------------- /mfer-safe-desktop-app/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "mfer-safe", 3 | "version": "0.1.6", 4 | "private": true, 5 | "dependencies": { 6 | "@emotion/react": "^11.9.3", 7 | "@emotion/styled": "^11.9.3", 8 | "@mui/icons-material": "^5.8.4", 9 | "@mui/material": "^5.8.7", 10 | "@mui/x-data-grid": "^5.13.0", 11 | "@tauri-apps/api": "^1.0.2", 12 | "@testing-library/jest-dom": "^5.16.4", 13 | "@testing-library/react": "^13.3.0", 14 | "@testing-library/user-event": "^13.5.0", 15 | "4byte": "^0.0.1", 16 | "ethers": "^5.6.9", 17 | "react": "^18.2.0", 18 | "react-dom": "^18.2.0", 19 | "react-json-view": "^1.21.3", 20 | "react-router-dom": "^6.3.0", 21 | "react-scripts": "5.0.1", 22 | "react-window": "^1.8.7", 23 | "utila": "^0.5.0-dev.1", 24 | "utilia": "^2.0.0", 25 | "web-vitals": "^2.1.4" 26 | }, 27 | "overrides": { 28 | "react-json-view": { 29 | "react": "^18.2.0", 30 | "react-dom": "^18.2.0" 31 | } 32 | }, 33 | "scripts": { 34 | "start": "cross-env BROWSER=none react-scripts start", 35 | "build": "react-scripts build", 36 | "test": "react-scripts test", 37 | "eject": "react-scripts eject", 38 | "tauri": "tauri" 39 | }, 40 | "eslintConfig": { 41 | "extends": [ 42 | "react-app", 43 | "react-app/jest" 44 | ] 45 | }, 46 | "browserslist": { 47 | "production": [ 48 | ">0.2%", 49 | "not dead", 50 | "not op_mini all" 51 | ], 52 | "development": [ 53 | "last 1 chrome version", 54 | "last 1 firefox version", 55 | "last 1 safari version" 56 | ] 57 | }, 58 | "devDependencies": { 59 | "@tauri-apps/cli": "^1.0.5", 60 | "buffer": "^6.0.3", 61 | "cross-env": "^7.0.3" 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /mfer-safe-desktop-app/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sec-bit/mfer-safe/6584897af725796128315715a6877ecabb0e8b27/mfer-safe-desktop-app/public/favicon.ico -------------------------------------------------------------------------------- /mfer-safe-desktop-app/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 12 | 13 | 17 | 18 | 27 | Control Panel 28 | 29 | 30 | 31 |
32 | 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /mfer-safe-desktop-app/public/logo192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sec-bit/mfer-safe/6584897af725796128315715a6877ecabb0e8b27/mfer-safe-desktop-app/public/logo192.png -------------------------------------------------------------------------------- /mfer-safe-desktop-app/public/logo512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sec-bit/mfer-safe/6584897af725796128315715a6877ecabb0e8b27/mfer-safe-desktop-app/public/logo512.png -------------------------------------------------------------------------------- /mfer-safe-desktop-app/public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "React App", 3 | "name": "Create React App Sample", 4 | "icons": [ 5 | { 6 | "src": "favicon.ico", 7 | "sizes": "64x64 32x32 24x24 16x16", 8 | "type": "image/x-icon" 9 | }, 10 | { 11 | "src": "logo192.png", 12 | "type": "image/png", 13 | "sizes": "192x192" 14 | }, 15 | { 16 | "src": "logo512.png", 17 | "type": "image/png", 18 | "sizes": "512x512" 19 | } 20 | ], 21 | "start_url": ".", 22 | "display": "standalone", 23 | "theme_color": "#000000", 24 | "background_color": "#ffffff" 25 | } 26 | -------------------------------------------------------------------------------- /mfer-safe-desktop-app/public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /mfer-safe-desktop-app/src-tauri/.gitignore: -------------------------------------------------------------------------------- 1 | # Generated by Cargo 2 | # will have compiled files and executables 3 | /target/ 4 | /bin/* -------------------------------------------------------------------------------- /mfer-safe-desktop-app/src-tauri/Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "adler" 7 | version = "1.0.2" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" 10 | 11 | [[package]] 12 | name = "adler32" 13 | version = "1.2.0" 14 | source = "registry+https://github.com/rust-lang/crates.io-index" 15 | checksum = "aae1277d39aeec15cb388266ecc24b11c80469deae6067e17a1a7aa9e5c1f234" 16 | 17 | [[package]] 18 | name = "aho-corasick" 19 | version = "0.7.19" 20 | source = "registry+https://github.com/rust-lang/crates.io-index" 21 | checksum = "b4f55bd91a0978cbfd91c457a164bab8b4001c833b7f323132c0a4e1922dd44e" 22 | dependencies = [ 23 | "memchr", 24 | ] 25 | 26 | [[package]] 27 | name = "alloc-no-stdlib" 28 | version = "2.0.3" 29 | source = "registry+https://github.com/rust-lang/crates.io-index" 30 | checksum = "35ef4730490ad1c4eae5c4325b2a95f521d023e5c885853ff7aca0a6a1631db3" 31 | 32 | [[package]] 33 | name = "alloc-stdlib" 34 | version = "0.2.1" 35 | source = "registry+https://github.com/rust-lang/crates.io-index" 36 | checksum = "697ed7edc0f1711de49ce108c541623a0af97c6c60b2f6e2b65229847ac843c2" 37 | dependencies = [ 38 | "alloc-no-stdlib", 39 | ] 40 | 41 | [[package]] 42 | name = "ansi_term" 43 | version = "0.12.1" 44 | source = "registry+https://github.com/rust-lang/crates.io-index" 45 | checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" 46 | dependencies = [ 47 | "winapi", 48 | ] 49 | 50 | [[package]] 51 | name = "anyhow" 52 | version = "1.0.64" 53 | source = "registry+https://github.com/rust-lang/crates.io-index" 54 | checksum = "b9a8f622bcf6ff3df478e9deba3e03e4e04b300f8e6a139e192c05fa3490afc7" 55 | 56 | [[package]] 57 | name = "app" 58 | version = "0.1.0" 59 | dependencies = [ 60 | "serde", 61 | "serde_json", 62 | "tauri", 63 | "tauri-build", 64 | "tokio", 65 | ] 66 | 67 | [[package]] 68 | name = "atk" 69 | version = "0.15.1" 70 | source = "registry+https://github.com/rust-lang/crates.io-index" 71 | checksum = "2c3d816ce6f0e2909a96830d6911c2aff044370b1ef92d7f267b43bae5addedd" 72 | dependencies = [ 73 | "atk-sys", 74 | "bitflags", 75 | "glib", 76 | "libc", 77 | ] 78 | 79 | [[package]] 80 | name = "atk-sys" 81 | version = "0.15.1" 82 | source = "registry+https://github.com/rust-lang/crates.io-index" 83 | checksum = "58aeb089fb698e06db8089971c7ee317ab9644bade33383f63631437b03aafb6" 84 | dependencies = [ 85 | "glib-sys", 86 | "gobject-sys", 87 | "libc", 88 | "system-deps 6.0.2", 89 | ] 90 | 91 | [[package]] 92 | name = "autocfg" 93 | version = "1.1.0" 94 | source = "registry+https://github.com/rust-lang/crates.io-index" 95 | checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" 96 | 97 | [[package]] 98 | name = "base64" 99 | version = "0.13.0" 100 | source = "registry+https://github.com/rust-lang/crates.io-index" 101 | checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" 102 | 103 | [[package]] 104 | name = "bitflags" 105 | version = "1.3.2" 106 | source = "registry+https://github.com/rust-lang/crates.io-index" 107 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 108 | 109 | [[package]] 110 | name = "block" 111 | version = "0.1.6" 112 | source = "registry+https://github.com/rust-lang/crates.io-index" 113 | checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" 114 | 115 | [[package]] 116 | name = "block-buffer" 117 | version = "0.10.3" 118 | source = "registry+https://github.com/rust-lang/crates.io-index" 119 | checksum = "69cce20737498f97b993470a6e536b8523f0af7892a4f928cceb1ac5e52ebe7e" 120 | dependencies = [ 121 | "generic-array", 122 | ] 123 | 124 | [[package]] 125 | name = "brotli" 126 | version = "3.3.4" 127 | source = "registry+https://github.com/rust-lang/crates.io-index" 128 | checksum = "a1a0b1dbcc8ae29329621f8d4f0d835787c1c38bb1401979b49d13b0b305ff68" 129 | dependencies = [ 130 | "alloc-no-stdlib", 131 | "alloc-stdlib", 132 | "brotli-decompressor", 133 | ] 134 | 135 | [[package]] 136 | name = "brotli-decompressor" 137 | version = "2.3.2" 138 | source = "registry+https://github.com/rust-lang/crates.io-index" 139 | checksum = "59ad2d4653bf5ca36ae797b1f4bb4dbddb60ce49ca4aed8a2ce4829f60425b80" 140 | dependencies = [ 141 | "alloc-no-stdlib", 142 | "alloc-stdlib", 143 | ] 144 | 145 | [[package]] 146 | name = "bstr" 147 | version = "0.2.17" 148 | source = "registry+https://github.com/rust-lang/crates.io-index" 149 | checksum = "ba3569f383e8f1598449f1a423e72e99569137b47740b1da11ef19af3d5c3223" 150 | dependencies = [ 151 | "memchr", 152 | ] 153 | 154 | [[package]] 155 | name = "bytemuck" 156 | version = "1.12.1" 157 | source = "registry+https://github.com/rust-lang/crates.io-index" 158 | checksum = "2f5715e491b5a1598fc2bef5a606847b5dc1d48ea625bd3c02c00de8285591da" 159 | 160 | [[package]] 161 | name = "byteorder" 162 | version = "1.4.3" 163 | source = "registry+https://github.com/rust-lang/crates.io-index" 164 | checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" 165 | 166 | [[package]] 167 | name = "bytes" 168 | version = "1.2.1" 169 | source = "registry+https://github.com/rust-lang/crates.io-index" 170 | checksum = "ec8a7b6a70fde80372154c65702f00a0f56f3e1c36abbc6c440484be248856db" 171 | 172 | [[package]] 173 | name = "cairo-rs" 174 | version = "0.15.12" 175 | source = "registry+https://github.com/rust-lang/crates.io-index" 176 | checksum = "c76ee391b03d35510d9fa917357c7f1855bd9a6659c95a1b392e33f49b3369bc" 177 | dependencies = [ 178 | "bitflags", 179 | "cairo-sys-rs", 180 | "glib", 181 | "libc", 182 | "thiserror", 183 | ] 184 | 185 | [[package]] 186 | name = "cairo-sys-rs" 187 | version = "0.15.1" 188 | source = "registry+https://github.com/rust-lang/crates.io-index" 189 | checksum = "3c55d429bef56ac9172d25fecb85dc8068307d17acd74b377866b7a1ef25d3c8" 190 | dependencies = [ 191 | "glib-sys", 192 | "libc", 193 | "system-deps 6.0.2", 194 | ] 195 | 196 | [[package]] 197 | name = "cargo_toml" 198 | version = "0.11.6" 199 | source = "registry+https://github.com/rust-lang/crates.io-index" 200 | checksum = "a4419e9adae9fd7e231b60d50467481bf8181ddeef6ed54683b23ae925c74c9c" 201 | dependencies = [ 202 | "serde", 203 | "serde_derive", 204 | "toml", 205 | ] 206 | 207 | [[package]] 208 | name = "cc" 209 | version = "1.0.73" 210 | source = "registry+https://github.com/rust-lang/crates.io-index" 211 | checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" 212 | 213 | [[package]] 214 | name = "cesu8" 215 | version = "1.1.0" 216 | source = "registry+https://github.com/rust-lang/crates.io-index" 217 | checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" 218 | 219 | [[package]] 220 | name = "cfb" 221 | version = "0.6.1" 222 | source = "registry+https://github.com/rust-lang/crates.io-index" 223 | checksum = "74f89d248799e3f15f91b70917f65381062a01bb8e222700ea0e5a7ff9785f9c" 224 | dependencies = [ 225 | "byteorder", 226 | "uuid 0.8.2", 227 | ] 228 | 229 | [[package]] 230 | name = "cfg-expr" 231 | version = "0.9.1" 232 | source = "registry+https://github.com/rust-lang/crates.io-index" 233 | checksum = "3431df59f28accaf4cb4eed4a9acc66bea3f3c3753aa6cdc2f024174ef232af7" 234 | dependencies = [ 235 | "smallvec", 236 | ] 237 | 238 | [[package]] 239 | name = "cfg-expr" 240 | version = "0.10.3" 241 | source = "registry+https://github.com/rust-lang/crates.io-index" 242 | checksum = "0aacacf4d96c24b2ad6eb8ee6df040e4f27b0d0b39a5710c30091baa830485db" 243 | dependencies = [ 244 | "smallvec", 245 | ] 246 | 247 | [[package]] 248 | name = "cfg-if" 249 | version = "1.0.0" 250 | source = "registry+https://github.com/rust-lang/crates.io-index" 251 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 252 | 253 | [[package]] 254 | name = "cocoa" 255 | version = "0.24.0" 256 | source = "registry+https://github.com/rust-lang/crates.io-index" 257 | checksum = "6f63902e9223530efb4e26ccd0cf55ec30d592d3b42e21a28defc42a9586e832" 258 | dependencies = [ 259 | "bitflags", 260 | "block", 261 | "cocoa-foundation", 262 | "core-foundation", 263 | "core-graphics", 264 | "foreign-types", 265 | "libc", 266 | "objc", 267 | ] 268 | 269 | [[package]] 270 | name = "cocoa-foundation" 271 | version = "0.1.0" 272 | source = "registry+https://github.com/rust-lang/crates.io-index" 273 | checksum = "7ade49b65d560ca58c403a479bb396592b155c0185eada742ee323d1d68d6318" 274 | dependencies = [ 275 | "bitflags", 276 | "block", 277 | "core-foundation", 278 | "core-graphics-types", 279 | "foreign-types", 280 | "libc", 281 | "objc", 282 | ] 283 | 284 | [[package]] 285 | name = "color_quant" 286 | version = "1.1.0" 287 | source = "registry+https://github.com/rust-lang/crates.io-index" 288 | checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" 289 | 290 | [[package]] 291 | name = "combine" 292 | version = "4.6.6" 293 | source = "registry+https://github.com/rust-lang/crates.io-index" 294 | checksum = "35ed6e9d84f0b51a7f52daf1c7d71dd136fd7a3f41a8462b8cdb8c78d920fad4" 295 | dependencies = [ 296 | "bytes", 297 | "memchr", 298 | ] 299 | 300 | [[package]] 301 | name = "convert_case" 302 | version = "0.4.0" 303 | source = "registry+https://github.com/rust-lang/crates.io-index" 304 | checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" 305 | 306 | [[package]] 307 | name = "core-foundation" 308 | version = "0.9.3" 309 | source = "registry+https://github.com/rust-lang/crates.io-index" 310 | checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" 311 | dependencies = [ 312 | "core-foundation-sys", 313 | "libc", 314 | ] 315 | 316 | [[package]] 317 | name = "core-foundation-sys" 318 | version = "0.8.3" 319 | source = "registry+https://github.com/rust-lang/crates.io-index" 320 | checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" 321 | 322 | [[package]] 323 | name = "core-graphics" 324 | version = "0.22.3" 325 | source = "registry+https://github.com/rust-lang/crates.io-index" 326 | checksum = "2581bbab3b8ffc6fcbd550bf46c355135d16e9ff2a6ea032ad6b9bf1d7efe4fb" 327 | dependencies = [ 328 | "bitflags", 329 | "core-foundation", 330 | "core-graphics-types", 331 | "foreign-types", 332 | "libc", 333 | ] 334 | 335 | [[package]] 336 | name = "core-graphics-types" 337 | version = "0.1.1" 338 | source = "registry+https://github.com/rust-lang/crates.io-index" 339 | checksum = "3a68b68b3446082644c91ac778bf50cd4104bfb002b5a6a7c44cca5a2c70788b" 340 | dependencies = [ 341 | "bitflags", 342 | "core-foundation", 343 | "foreign-types", 344 | "libc", 345 | ] 346 | 347 | [[package]] 348 | name = "cpufeatures" 349 | version = "0.2.5" 350 | source = "registry+https://github.com/rust-lang/crates.io-index" 351 | checksum = "28d997bd5e24a5928dd43e46dc529867e207907fe0b239c3477d924f7f2ca320" 352 | dependencies = [ 353 | "libc", 354 | ] 355 | 356 | [[package]] 357 | name = "crc32fast" 358 | version = "1.3.2" 359 | source = "registry+https://github.com/rust-lang/crates.io-index" 360 | checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" 361 | dependencies = [ 362 | "cfg-if", 363 | ] 364 | 365 | [[package]] 366 | name = "crossbeam-channel" 367 | version = "0.5.6" 368 | source = "registry+https://github.com/rust-lang/crates.io-index" 369 | checksum = "c2dd04ddaf88237dc3b8d8f9a3c1004b506b54b3313403944054d23c0870c521" 370 | dependencies = [ 371 | "cfg-if", 372 | "crossbeam-utils", 373 | ] 374 | 375 | [[package]] 376 | name = "crossbeam-utils" 377 | version = "0.8.11" 378 | source = "registry+https://github.com/rust-lang/crates.io-index" 379 | checksum = "51887d4adc7b564537b15adcfb307936f8075dfcd5f00dde9a9f1d29383682bc" 380 | dependencies = [ 381 | "cfg-if", 382 | "once_cell", 383 | ] 384 | 385 | [[package]] 386 | name = "crypto-common" 387 | version = "0.1.6" 388 | source = "registry+https://github.com/rust-lang/crates.io-index" 389 | checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" 390 | dependencies = [ 391 | "generic-array", 392 | "typenum", 393 | ] 394 | 395 | [[package]] 396 | name = "cssparser" 397 | version = "0.27.2" 398 | source = "registry+https://github.com/rust-lang/crates.io-index" 399 | checksum = "754b69d351cdc2d8ee09ae203db831e005560fc6030da058f86ad60c92a9cb0a" 400 | dependencies = [ 401 | "cssparser-macros", 402 | "dtoa-short", 403 | "itoa 0.4.8", 404 | "matches", 405 | "phf 0.8.0", 406 | "proc-macro2", 407 | "quote", 408 | "smallvec", 409 | "syn", 410 | ] 411 | 412 | [[package]] 413 | name = "cssparser-macros" 414 | version = "0.6.0" 415 | source = "registry+https://github.com/rust-lang/crates.io-index" 416 | checksum = "dfae75de57f2b2e85e8768c3ea840fd159c8f33e2b6522c7835b7abac81be16e" 417 | dependencies = [ 418 | "quote", 419 | "syn", 420 | ] 421 | 422 | [[package]] 423 | name = "ctor" 424 | version = "0.1.23" 425 | source = "registry+https://github.com/rust-lang/crates.io-index" 426 | checksum = "cdffe87e1d521a10f9696f833fe502293ea446d7f256c06128293a4119bdf4cb" 427 | dependencies = [ 428 | "quote", 429 | "syn", 430 | ] 431 | 432 | [[package]] 433 | name = "cty" 434 | version = "0.2.2" 435 | source = "registry+https://github.com/rust-lang/crates.io-index" 436 | checksum = "b365fabc795046672053e29c954733ec3b05e4be654ab130fe8f1f94d7051f35" 437 | 438 | [[package]] 439 | name = "darling" 440 | version = "0.13.4" 441 | source = "registry+https://github.com/rust-lang/crates.io-index" 442 | checksum = "a01d95850c592940db9b8194bc39f4bc0e89dee5c4265e4b1807c34a9aba453c" 443 | dependencies = [ 444 | "darling_core", 445 | "darling_macro", 446 | ] 447 | 448 | [[package]] 449 | name = "darling_core" 450 | version = "0.13.4" 451 | source = "registry+https://github.com/rust-lang/crates.io-index" 452 | checksum = "859d65a907b6852c9361e3185c862aae7fafd2887876799fa55f5f99dc40d610" 453 | dependencies = [ 454 | "fnv", 455 | "ident_case", 456 | "proc-macro2", 457 | "quote", 458 | "strsim", 459 | "syn", 460 | ] 461 | 462 | [[package]] 463 | name = "darling_macro" 464 | version = "0.13.4" 465 | source = "registry+https://github.com/rust-lang/crates.io-index" 466 | checksum = "9c972679f83bdf9c42bd905396b6c3588a843a17f0f16dfcfa3e2c5d57441835" 467 | dependencies = [ 468 | "darling_core", 469 | "quote", 470 | "syn", 471 | ] 472 | 473 | [[package]] 474 | name = "deflate" 475 | version = "0.7.20" 476 | source = "registry+https://github.com/rust-lang/crates.io-index" 477 | checksum = "707b6a7b384888a70c8d2e8650b3e60170dfc6a67bb4aa67b6dfca57af4bedb4" 478 | dependencies = [ 479 | "adler32", 480 | "byteorder", 481 | ] 482 | 483 | [[package]] 484 | name = "derive_more" 485 | version = "0.99.17" 486 | source = "registry+https://github.com/rust-lang/crates.io-index" 487 | checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" 488 | dependencies = [ 489 | "convert_case", 490 | "proc-macro2", 491 | "quote", 492 | "rustc_version 0.4.0", 493 | "syn", 494 | ] 495 | 496 | [[package]] 497 | name = "digest" 498 | version = "0.10.3" 499 | source = "registry+https://github.com/rust-lang/crates.io-index" 500 | checksum = "f2fb860ca6fafa5552fb6d0e816a69c8e49f0908bf524e30a90d97c85892d506" 501 | dependencies = [ 502 | "block-buffer", 503 | "crypto-common", 504 | ] 505 | 506 | [[package]] 507 | name = "dirs-next" 508 | version = "2.0.0" 509 | source = "registry+https://github.com/rust-lang/crates.io-index" 510 | checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" 511 | dependencies = [ 512 | "cfg-if", 513 | "dirs-sys-next", 514 | ] 515 | 516 | [[package]] 517 | name = "dirs-sys-next" 518 | version = "0.1.2" 519 | source = "registry+https://github.com/rust-lang/crates.io-index" 520 | checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" 521 | dependencies = [ 522 | "libc", 523 | "redox_users", 524 | "winapi", 525 | ] 526 | 527 | [[package]] 528 | name = "dispatch" 529 | version = "0.2.0" 530 | source = "registry+https://github.com/rust-lang/crates.io-index" 531 | checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" 532 | 533 | [[package]] 534 | name = "dtoa" 535 | version = "0.4.8" 536 | source = "registry+https://github.com/rust-lang/crates.io-index" 537 | checksum = "56899898ce76aaf4a0f24d914c97ea6ed976d42fec6ad33fcbb0a1103e07b2b0" 538 | 539 | [[package]] 540 | name = "dtoa-short" 541 | version = "0.3.3" 542 | source = "registry+https://github.com/rust-lang/crates.io-index" 543 | checksum = "bde03329ae10e79ede66c9ce4dc930aa8599043b0743008548680f25b91502d6" 544 | dependencies = [ 545 | "dtoa", 546 | ] 547 | 548 | [[package]] 549 | name = "embed_plist" 550 | version = "1.2.2" 551 | source = "registry+https://github.com/rust-lang/crates.io-index" 552 | checksum = "4ef6b89e5b37196644d8796de5268852ff179b44e96276cf4290264843743bb7" 553 | 554 | [[package]] 555 | name = "fastrand" 556 | version = "1.8.0" 557 | source = "registry+https://github.com/rust-lang/crates.io-index" 558 | checksum = "a7a407cfaa3385c4ae6b23e84623d48c2798d06e3e6a1878f7f59f17b3f86499" 559 | dependencies = [ 560 | "instant", 561 | ] 562 | 563 | [[package]] 564 | name = "field-offset" 565 | version = "0.3.4" 566 | source = "registry+https://github.com/rust-lang/crates.io-index" 567 | checksum = "1e1c54951450cbd39f3dbcf1005ac413b49487dabf18a720ad2383eccfeffb92" 568 | dependencies = [ 569 | "memoffset", 570 | "rustc_version 0.3.3", 571 | ] 572 | 573 | [[package]] 574 | name = "filetime" 575 | version = "0.2.17" 576 | source = "registry+https://github.com/rust-lang/crates.io-index" 577 | checksum = "e94a7bbaa59354bc20dd75b67f23e2797b4490e9d6928203fb105c79e448c86c" 578 | dependencies = [ 579 | "cfg-if", 580 | "libc", 581 | "redox_syscall", 582 | "windows-sys", 583 | ] 584 | 585 | [[package]] 586 | name = "flate2" 587 | version = "1.0.24" 588 | source = "registry+https://github.com/rust-lang/crates.io-index" 589 | checksum = "f82b0f4c27ad9f8bfd1f3208d882da2b09c301bc1c828fd3a00d0216d2fbbff6" 590 | dependencies = [ 591 | "crc32fast", 592 | "miniz_oxide", 593 | ] 594 | 595 | [[package]] 596 | name = "fnv" 597 | version = "1.0.7" 598 | source = "registry+https://github.com/rust-lang/crates.io-index" 599 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 600 | 601 | [[package]] 602 | name = "foreign-types" 603 | version = "0.3.2" 604 | source = "registry+https://github.com/rust-lang/crates.io-index" 605 | checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" 606 | dependencies = [ 607 | "foreign-types-shared", 608 | ] 609 | 610 | [[package]] 611 | name = "foreign-types-shared" 612 | version = "0.1.1" 613 | source = "registry+https://github.com/rust-lang/crates.io-index" 614 | checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" 615 | 616 | [[package]] 617 | name = "form_urlencoded" 618 | version = "1.0.1" 619 | source = "registry+https://github.com/rust-lang/crates.io-index" 620 | checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191" 621 | dependencies = [ 622 | "matches", 623 | "percent-encoding", 624 | ] 625 | 626 | [[package]] 627 | name = "futf" 628 | version = "0.1.5" 629 | source = "registry+https://github.com/rust-lang/crates.io-index" 630 | checksum = "df420e2e84819663797d1ec6544b13c5be84629e7bb00dc960d6917db2987843" 631 | dependencies = [ 632 | "mac", 633 | "new_debug_unreachable", 634 | ] 635 | 636 | [[package]] 637 | name = "futures" 638 | version = "0.3.24" 639 | source = "registry+https://github.com/rust-lang/crates.io-index" 640 | checksum = "7f21eda599937fba36daeb58a22e8f5cee2d14c4a17b5b7739c7c8e5e3b8230c" 641 | dependencies = [ 642 | "futures-channel", 643 | "futures-core", 644 | "futures-executor", 645 | "futures-io", 646 | "futures-sink", 647 | "futures-task", 648 | "futures-util", 649 | ] 650 | 651 | [[package]] 652 | name = "futures-channel" 653 | version = "0.3.24" 654 | source = "registry+https://github.com/rust-lang/crates.io-index" 655 | checksum = "30bdd20c28fadd505d0fd6712cdfcb0d4b5648baf45faef7f852afb2399bb050" 656 | dependencies = [ 657 | "futures-core", 658 | "futures-sink", 659 | ] 660 | 661 | [[package]] 662 | name = "futures-core" 663 | version = "0.3.24" 664 | source = "registry+https://github.com/rust-lang/crates.io-index" 665 | checksum = "4e5aa3de05362c3fb88de6531e6296e85cde7739cccad4b9dfeeb7f6ebce56bf" 666 | 667 | [[package]] 668 | name = "futures-executor" 669 | version = "0.3.24" 670 | source = "registry+https://github.com/rust-lang/crates.io-index" 671 | checksum = "9ff63c23854bee61b6e9cd331d523909f238fc7636290b96826e9cfa5faa00ab" 672 | dependencies = [ 673 | "futures-core", 674 | "futures-task", 675 | "futures-util", 676 | ] 677 | 678 | [[package]] 679 | name = "futures-io" 680 | version = "0.3.24" 681 | source = "registry+https://github.com/rust-lang/crates.io-index" 682 | checksum = "bbf4d2a7a308fd4578637c0b17c7e1c7ba127b8f6ba00b29f717e9655d85eb68" 683 | 684 | [[package]] 685 | name = "futures-lite" 686 | version = "1.12.0" 687 | source = "registry+https://github.com/rust-lang/crates.io-index" 688 | checksum = "7694489acd39452c77daa48516b894c153f192c3578d5a839b62c58099fcbf48" 689 | dependencies = [ 690 | "fastrand", 691 | "futures-core", 692 | "futures-io", 693 | "memchr", 694 | "parking", 695 | "pin-project-lite", 696 | "waker-fn", 697 | ] 698 | 699 | [[package]] 700 | name = "futures-macro" 701 | version = "0.3.24" 702 | source = "registry+https://github.com/rust-lang/crates.io-index" 703 | checksum = "42cd15d1c7456c04dbdf7e88bcd69760d74f3a798d6444e16974b505b0e62f17" 704 | dependencies = [ 705 | "proc-macro2", 706 | "quote", 707 | "syn", 708 | ] 709 | 710 | [[package]] 711 | name = "futures-sink" 712 | version = "0.3.24" 713 | source = "registry+https://github.com/rust-lang/crates.io-index" 714 | checksum = "21b20ba5a92e727ba30e72834706623d94ac93a725410b6a6b6fbc1b07f7ba56" 715 | 716 | [[package]] 717 | name = "futures-task" 718 | version = "0.3.24" 719 | source = "registry+https://github.com/rust-lang/crates.io-index" 720 | checksum = "a6508c467c73851293f390476d4491cf4d227dbabcd4170f3bb6044959b294f1" 721 | 722 | [[package]] 723 | name = "futures-util" 724 | version = "0.3.24" 725 | source = "registry+https://github.com/rust-lang/crates.io-index" 726 | checksum = "44fb6cb1be61cc1d2e43b262516aafcf63b241cffdb1d3fa115f91d9c7b09c90" 727 | dependencies = [ 728 | "futures-channel", 729 | "futures-core", 730 | "futures-io", 731 | "futures-macro", 732 | "futures-sink", 733 | "futures-task", 734 | "memchr", 735 | "pin-project-lite", 736 | "pin-utils", 737 | "slab", 738 | ] 739 | 740 | [[package]] 741 | name = "fxhash" 742 | version = "0.2.1" 743 | source = "registry+https://github.com/rust-lang/crates.io-index" 744 | checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" 745 | dependencies = [ 746 | "byteorder", 747 | ] 748 | 749 | [[package]] 750 | name = "gdk" 751 | version = "0.15.4" 752 | source = "registry+https://github.com/rust-lang/crates.io-index" 753 | checksum = "a6e05c1f572ab0e1f15be94217f0dc29088c248b14f792a5ff0af0d84bcda9e8" 754 | dependencies = [ 755 | "bitflags", 756 | "cairo-rs", 757 | "gdk-pixbuf", 758 | "gdk-sys", 759 | "gio", 760 | "glib", 761 | "libc", 762 | "pango", 763 | ] 764 | 765 | [[package]] 766 | name = "gdk-pixbuf" 767 | version = "0.15.11" 768 | source = "registry+https://github.com/rust-lang/crates.io-index" 769 | checksum = "ad38dd9cc8b099cceecdf41375bb6d481b1b5a7cd5cd603e10a69a9383f8619a" 770 | dependencies = [ 771 | "bitflags", 772 | "gdk-pixbuf-sys", 773 | "gio", 774 | "glib", 775 | "libc", 776 | ] 777 | 778 | [[package]] 779 | name = "gdk-pixbuf-sys" 780 | version = "0.15.10" 781 | source = "registry+https://github.com/rust-lang/crates.io-index" 782 | checksum = "140b2f5378256527150350a8346dbdb08fadc13453a7a2d73aecd5fab3c402a7" 783 | dependencies = [ 784 | "gio-sys", 785 | "glib-sys", 786 | "gobject-sys", 787 | "libc", 788 | "system-deps 6.0.2", 789 | ] 790 | 791 | [[package]] 792 | name = "gdk-sys" 793 | version = "0.15.1" 794 | source = "registry+https://github.com/rust-lang/crates.io-index" 795 | checksum = "32e7a08c1e8f06f4177fb7e51a777b8c1689f743a7bc11ea91d44d2226073a88" 796 | dependencies = [ 797 | "cairo-sys-rs", 798 | "gdk-pixbuf-sys", 799 | "gio-sys", 800 | "glib-sys", 801 | "gobject-sys", 802 | "libc", 803 | "pango-sys", 804 | "pkg-config", 805 | "system-deps 6.0.2", 806 | ] 807 | 808 | [[package]] 809 | name = "gdkx11-sys" 810 | version = "0.15.1" 811 | source = "registry+https://github.com/rust-lang/crates.io-index" 812 | checksum = "b4b7f8c7a84b407aa9b143877e267e848ff34106578b64d1e0a24bf550716178" 813 | dependencies = [ 814 | "gdk-sys", 815 | "glib-sys", 816 | "libc", 817 | "system-deps 6.0.2", 818 | "x11", 819 | ] 820 | 821 | [[package]] 822 | name = "generator" 823 | version = "0.7.1" 824 | source = "registry+https://github.com/rust-lang/crates.io-index" 825 | checksum = "cc184cace1cea8335047a471cc1da80f18acf8a76f3bab2028d499e328948ec7" 826 | dependencies = [ 827 | "cc", 828 | "libc", 829 | "log", 830 | "rustversion", 831 | "windows 0.32.0", 832 | ] 833 | 834 | [[package]] 835 | name = "generic-array" 836 | version = "0.14.6" 837 | source = "registry+https://github.com/rust-lang/crates.io-index" 838 | checksum = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9" 839 | dependencies = [ 840 | "typenum", 841 | "version_check", 842 | ] 843 | 844 | [[package]] 845 | name = "getrandom" 846 | version = "0.1.16" 847 | source = "registry+https://github.com/rust-lang/crates.io-index" 848 | checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" 849 | dependencies = [ 850 | "cfg-if", 851 | "libc", 852 | "wasi 0.9.0+wasi-snapshot-preview1", 853 | ] 854 | 855 | [[package]] 856 | name = "getrandom" 857 | version = "0.2.7" 858 | source = "registry+https://github.com/rust-lang/crates.io-index" 859 | checksum = "4eb1a864a501629691edf6c15a593b7a51eebaa1e8468e9ddc623de7c9b58ec6" 860 | dependencies = [ 861 | "cfg-if", 862 | "libc", 863 | "wasi 0.11.0+wasi-snapshot-preview1", 864 | ] 865 | 866 | [[package]] 867 | name = "gio" 868 | version = "0.15.12" 869 | source = "registry+https://github.com/rust-lang/crates.io-index" 870 | checksum = "68fdbc90312d462781a395f7a16d96a2b379bb6ef8cd6310a2df272771c4283b" 871 | dependencies = [ 872 | "bitflags", 873 | "futures-channel", 874 | "futures-core", 875 | "futures-io", 876 | "gio-sys", 877 | "glib", 878 | "libc", 879 | "once_cell", 880 | "thiserror", 881 | ] 882 | 883 | [[package]] 884 | name = "gio-sys" 885 | version = "0.15.10" 886 | source = "registry+https://github.com/rust-lang/crates.io-index" 887 | checksum = "32157a475271e2c4a023382e9cab31c4584ee30a97da41d3c4e9fdd605abcf8d" 888 | dependencies = [ 889 | "glib-sys", 890 | "gobject-sys", 891 | "libc", 892 | "system-deps 6.0.2", 893 | "winapi", 894 | ] 895 | 896 | [[package]] 897 | name = "glib" 898 | version = "0.15.12" 899 | source = "registry+https://github.com/rust-lang/crates.io-index" 900 | checksum = "edb0306fbad0ab5428b0ca674a23893db909a98582969c9b537be4ced78c505d" 901 | dependencies = [ 902 | "bitflags", 903 | "futures-channel", 904 | "futures-core", 905 | "futures-executor", 906 | "futures-task", 907 | "glib-macros", 908 | "glib-sys", 909 | "gobject-sys", 910 | "libc", 911 | "once_cell", 912 | "smallvec", 913 | "thiserror", 914 | ] 915 | 916 | [[package]] 917 | name = "glib-macros" 918 | version = "0.15.11" 919 | source = "registry+https://github.com/rust-lang/crates.io-index" 920 | checksum = "25a68131a662b04931e71891fb14aaf65ee4b44d08e8abc10f49e77418c86c64" 921 | dependencies = [ 922 | "anyhow", 923 | "heck 0.4.0", 924 | "proc-macro-crate", 925 | "proc-macro-error", 926 | "proc-macro2", 927 | "quote", 928 | "syn", 929 | ] 930 | 931 | [[package]] 932 | name = "glib-sys" 933 | version = "0.15.10" 934 | source = "registry+https://github.com/rust-lang/crates.io-index" 935 | checksum = "ef4b192f8e65e9cf76cbf4ea71fa8e3be4a0e18ffe3d68b8da6836974cc5bad4" 936 | dependencies = [ 937 | "libc", 938 | "system-deps 6.0.2", 939 | ] 940 | 941 | [[package]] 942 | name = "glob" 943 | version = "0.3.0" 944 | source = "registry+https://github.com/rust-lang/crates.io-index" 945 | checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" 946 | 947 | [[package]] 948 | name = "globset" 949 | version = "0.4.9" 950 | source = "registry+https://github.com/rust-lang/crates.io-index" 951 | checksum = "0a1e17342619edbc21a964c2afbeb6c820c6a2560032872f397bb97ea127bd0a" 952 | dependencies = [ 953 | "aho-corasick", 954 | "bstr", 955 | "fnv", 956 | "log", 957 | "regex", 958 | ] 959 | 960 | [[package]] 961 | name = "gobject-sys" 962 | version = "0.15.10" 963 | source = "registry+https://github.com/rust-lang/crates.io-index" 964 | checksum = "0d57ce44246becd17153bd035ab4d32cfee096a657fc01f2231c9278378d1e0a" 965 | dependencies = [ 966 | "glib-sys", 967 | "libc", 968 | "system-deps 6.0.2", 969 | ] 970 | 971 | [[package]] 972 | name = "gtk" 973 | version = "0.15.5" 974 | source = "registry+https://github.com/rust-lang/crates.io-index" 975 | checksum = "92e3004a2d5d6d8b5057d2b57b3712c9529b62e82c77f25c1fecde1fd5c23bd0" 976 | dependencies = [ 977 | "atk", 978 | "bitflags", 979 | "cairo-rs", 980 | "field-offset", 981 | "futures-channel", 982 | "gdk", 983 | "gdk-pixbuf", 984 | "gio", 985 | "glib", 986 | "gtk-sys", 987 | "gtk3-macros", 988 | "libc", 989 | "once_cell", 990 | "pango", 991 | "pkg-config", 992 | ] 993 | 994 | [[package]] 995 | name = "gtk-sys" 996 | version = "0.15.3" 997 | source = "registry+https://github.com/rust-lang/crates.io-index" 998 | checksum = "d5bc2f0587cba247f60246a0ca11fe25fb733eabc3de12d1965fc07efab87c84" 999 | dependencies = [ 1000 | "atk-sys", 1001 | "cairo-sys-rs", 1002 | "gdk-pixbuf-sys", 1003 | "gdk-sys", 1004 | "gio-sys", 1005 | "glib-sys", 1006 | "gobject-sys", 1007 | "libc", 1008 | "pango-sys", 1009 | "system-deps 6.0.2", 1010 | ] 1011 | 1012 | [[package]] 1013 | name = "gtk3-macros" 1014 | version = "0.15.4" 1015 | source = "registry+https://github.com/rust-lang/crates.io-index" 1016 | checksum = "24f518afe90c23fba585b2d7697856f9e6a7bbc62f65588035e66f6afb01a2e9" 1017 | dependencies = [ 1018 | "anyhow", 1019 | "proc-macro-crate", 1020 | "proc-macro-error", 1021 | "proc-macro2", 1022 | "quote", 1023 | "syn", 1024 | ] 1025 | 1026 | [[package]] 1027 | name = "hashbrown" 1028 | version = "0.12.3" 1029 | source = "registry+https://github.com/rust-lang/crates.io-index" 1030 | checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" 1031 | 1032 | [[package]] 1033 | name = "heck" 1034 | version = "0.3.3" 1035 | source = "registry+https://github.com/rust-lang/crates.io-index" 1036 | checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" 1037 | dependencies = [ 1038 | "unicode-segmentation", 1039 | ] 1040 | 1041 | [[package]] 1042 | name = "heck" 1043 | version = "0.4.0" 1044 | source = "registry+https://github.com/rust-lang/crates.io-index" 1045 | checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9" 1046 | 1047 | [[package]] 1048 | name = "hermit-abi" 1049 | version = "0.1.19" 1050 | source = "registry+https://github.com/rust-lang/crates.io-index" 1051 | checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" 1052 | dependencies = [ 1053 | "libc", 1054 | ] 1055 | 1056 | [[package]] 1057 | name = "html5ever" 1058 | version = "0.25.2" 1059 | source = "registry+https://github.com/rust-lang/crates.io-index" 1060 | checksum = "e5c13fb08e5d4dfc151ee5e88bae63f7773d61852f3bdc73c9f4b9e1bde03148" 1061 | dependencies = [ 1062 | "log", 1063 | "mac", 1064 | "markup5ever", 1065 | "proc-macro2", 1066 | "quote", 1067 | "syn", 1068 | ] 1069 | 1070 | [[package]] 1071 | name = "http" 1072 | version = "0.2.8" 1073 | source = "registry+https://github.com/rust-lang/crates.io-index" 1074 | checksum = "75f43d41e26995c17e71ee126451dd3941010b0514a81a9d11f3b341debc2399" 1075 | dependencies = [ 1076 | "bytes", 1077 | "fnv", 1078 | "itoa 1.0.3", 1079 | ] 1080 | 1081 | [[package]] 1082 | name = "http-range" 1083 | version = "0.1.5" 1084 | source = "registry+https://github.com/rust-lang/crates.io-index" 1085 | checksum = "21dec9db110f5f872ed9699c3ecf50cf16f423502706ba5c72462e28d3157573" 1086 | 1087 | [[package]] 1088 | name = "ico" 1089 | version = "0.1.0" 1090 | source = "registry+https://github.com/rust-lang/crates.io-index" 1091 | checksum = "6a4b3331534254a9b64095ae60d3dc2a8225a7a70229cd5888be127cdc1f6804" 1092 | dependencies = [ 1093 | "byteorder", 1094 | "png 0.11.0", 1095 | ] 1096 | 1097 | [[package]] 1098 | name = "ident_case" 1099 | version = "1.0.1" 1100 | source = "registry+https://github.com/rust-lang/crates.io-index" 1101 | checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" 1102 | 1103 | [[package]] 1104 | name = "idna" 1105 | version = "0.2.3" 1106 | source = "registry+https://github.com/rust-lang/crates.io-index" 1107 | checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" 1108 | dependencies = [ 1109 | "matches", 1110 | "unicode-bidi", 1111 | "unicode-normalization", 1112 | ] 1113 | 1114 | [[package]] 1115 | name = "ignore" 1116 | version = "0.4.18" 1117 | source = "registry+https://github.com/rust-lang/crates.io-index" 1118 | checksum = "713f1b139373f96a2e0ce3ac931cd01ee973c3c5dd7c40c0c2efe96ad2b6751d" 1119 | dependencies = [ 1120 | "crossbeam-utils", 1121 | "globset", 1122 | "lazy_static", 1123 | "log", 1124 | "memchr", 1125 | "regex", 1126 | "same-file", 1127 | "thread_local", 1128 | "walkdir", 1129 | "winapi-util", 1130 | ] 1131 | 1132 | [[package]] 1133 | name = "image" 1134 | version = "0.24.3" 1135 | source = "registry+https://github.com/rust-lang/crates.io-index" 1136 | checksum = "7e30ca2ecf7666107ff827a8e481de6a132a9b687ed3bb20bb1c144a36c00964" 1137 | dependencies = [ 1138 | "bytemuck", 1139 | "byteorder", 1140 | "color_quant", 1141 | "num-rational", 1142 | "num-traits", 1143 | ] 1144 | 1145 | [[package]] 1146 | name = "indexmap" 1147 | version = "1.9.1" 1148 | source = "registry+https://github.com/rust-lang/crates.io-index" 1149 | checksum = "10a35a97730320ffe8e2d410b5d3b69279b98d2c14bdb8b70ea89ecf7888d41e" 1150 | dependencies = [ 1151 | "autocfg", 1152 | "hashbrown", 1153 | ] 1154 | 1155 | [[package]] 1156 | name = "infer" 1157 | version = "0.7.0" 1158 | source = "registry+https://github.com/rust-lang/crates.io-index" 1159 | checksum = "20b2b533137b9cad970793453d4f921c2e91312a6d88b1085c07bc15fc51bb3b" 1160 | dependencies = [ 1161 | "cfb", 1162 | ] 1163 | 1164 | [[package]] 1165 | name = "inflate" 1166 | version = "0.3.4" 1167 | source = "registry+https://github.com/rust-lang/crates.io-index" 1168 | checksum = "f5f9f47468e9a76a6452271efadc88fe865a82be91fe75e6c0c57b87ccea59d4" 1169 | dependencies = [ 1170 | "adler32", 1171 | ] 1172 | 1173 | [[package]] 1174 | name = "instant" 1175 | version = "0.1.12" 1176 | source = "registry+https://github.com/rust-lang/crates.io-index" 1177 | checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" 1178 | dependencies = [ 1179 | "cfg-if", 1180 | ] 1181 | 1182 | [[package]] 1183 | name = "itoa" 1184 | version = "0.4.8" 1185 | source = "registry+https://github.com/rust-lang/crates.io-index" 1186 | checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" 1187 | 1188 | [[package]] 1189 | name = "itoa" 1190 | version = "1.0.3" 1191 | source = "registry+https://github.com/rust-lang/crates.io-index" 1192 | checksum = "6c8af84674fe1f223a982c933a0ee1086ac4d4052aa0fb8060c12c6ad838e754" 1193 | 1194 | [[package]] 1195 | name = "javascriptcore-rs" 1196 | version = "0.16.0" 1197 | source = "registry+https://github.com/rust-lang/crates.io-index" 1198 | checksum = "bf053e7843f2812ff03ef5afe34bb9c06ffee120385caad4f6b9967fcd37d41c" 1199 | dependencies = [ 1200 | "bitflags", 1201 | "glib", 1202 | "javascriptcore-rs-sys", 1203 | ] 1204 | 1205 | [[package]] 1206 | name = "javascriptcore-rs-sys" 1207 | version = "0.4.0" 1208 | source = "registry+https://github.com/rust-lang/crates.io-index" 1209 | checksum = "905fbb87419c5cde6e3269537e4ea7d46431f3008c5d057e915ef3f115e7793c" 1210 | dependencies = [ 1211 | "glib-sys", 1212 | "gobject-sys", 1213 | "libc", 1214 | "system-deps 5.0.0", 1215 | ] 1216 | 1217 | [[package]] 1218 | name = "jni" 1219 | version = "0.18.0" 1220 | source = "registry+https://github.com/rust-lang/crates.io-index" 1221 | checksum = "24967112a1e4301ca5342ea339763613a37592b8a6ce6cf2e4494537c7a42faf" 1222 | dependencies = [ 1223 | "cesu8", 1224 | "combine", 1225 | "jni-sys", 1226 | "log", 1227 | "thiserror", 1228 | "walkdir", 1229 | ] 1230 | 1231 | [[package]] 1232 | name = "jni" 1233 | version = "0.19.0" 1234 | source = "registry+https://github.com/rust-lang/crates.io-index" 1235 | checksum = "c6df18c2e3db7e453d3c6ac5b3e9d5182664d28788126d39b91f2d1e22b017ec" 1236 | dependencies = [ 1237 | "cesu8", 1238 | "combine", 1239 | "jni-sys", 1240 | "log", 1241 | "thiserror", 1242 | "walkdir", 1243 | ] 1244 | 1245 | [[package]] 1246 | name = "jni-sys" 1247 | version = "0.3.0" 1248 | source = "registry+https://github.com/rust-lang/crates.io-index" 1249 | checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" 1250 | 1251 | [[package]] 1252 | name = "json-patch" 1253 | version = "0.2.6" 1254 | source = "registry+https://github.com/rust-lang/crates.io-index" 1255 | checksum = "f995a3c8f2bc3dd52a18a583e90f9ec109c047fa1603a853e46bcda14d2e279d" 1256 | dependencies = [ 1257 | "serde", 1258 | "serde_json", 1259 | "treediff", 1260 | ] 1261 | 1262 | [[package]] 1263 | name = "kuchiki" 1264 | version = "0.8.1" 1265 | source = "registry+https://github.com/rust-lang/crates.io-index" 1266 | checksum = "1ea8e9c6e031377cff82ee3001dc8026cdf431ed4e2e6b51f98ab8c73484a358" 1267 | dependencies = [ 1268 | "cssparser", 1269 | "html5ever", 1270 | "matches", 1271 | "selectors", 1272 | ] 1273 | 1274 | [[package]] 1275 | name = "lazy_static" 1276 | version = "1.4.0" 1277 | source = "registry+https://github.com/rust-lang/crates.io-index" 1278 | checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" 1279 | 1280 | [[package]] 1281 | name = "libc" 1282 | version = "0.2.132" 1283 | source = "registry+https://github.com/rust-lang/crates.io-index" 1284 | checksum = "8371e4e5341c3a96db127eb2465ac681ced4c433e01dd0e938adbef26ba93ba5" 1285 | 1286 | [[package]] 1287 | name = "line-wrap" 1288 | version = "0.1.1" 1289 | source = "registry+https://github.com/rust-lang/crates.io-index" 1290 | checksum = "f30344350a2a51da54c1d53be93fade8a237e545dbcc4bdbe635413f2117cab9" 1291 | dependencies = [ 1292 | "safemem", 1293 | ] 1294 | 1295 | [[package]] 1296 | name = "lock_api" 1297 | version = "0.4.8" 1298 | source = "registry+https://github.com/rust-lang/crates.io-index" 1299 | checksum = "9f80bf5aacaf25cbfc8210d1cfb718f2bf3b11c4c54e5afe36c236853a8ec390" 1300 | dependencies = [ 1301 | "autocfg", 1302 | "scopeguard", 1303 | ] 1304 | 1305 | [[package]] 1306 | name = "log" 1307 | version = "0.4.17" 1308 | source = "registry+https://github.com/rust-lang/crates.io-index" 1309 | checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" 1310 | dependencies = [ 1311 | "cfg-if", 1312 | ] 1313 | 1314 | [[package]] 1315 | name = "loom" 1316 | version = "0.5.6" 1317 | source = "registry+https://github.com/rust-lang/crates.io-index" 1318 | checksum = "ff50ecb28bb86013e935fb6683ab1f6d3a20016f123c76fd4c27470076ac30f5" 1319 | dependencies = [ 1320 | "cfg-if", 1321 | "generator", 1322 | "scoped-tls", 1323 | "serde", 1324 | "serde_json", 1325 | "tracing", 1326 | "tracing-subscriber", 1327 | ] 1328 | 1329 | [[package]] 1330 | name = "mac" 1331 | version = "0.1.1" 1332 | source = "registry+https://github.com/rust-lang/crates.io-index" 1333 | checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" 1334 | 1335 | [[package]] 1336 | name = "malloc_buf" 1337 | version = "0.0.6" 1338 | source = "registry+https://github.com/rust-lang/crates.io-index" 1339 | checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" 1340 | dependencies = [ 1341 | "libc", 1342 | ] 1343 | 1344 | [[package]] 1345 | name = "markup5ever" 1346 | version = "0.10.1" 1347 | source = "registry+https://github.com/rust-lang/crates.io-index" 1348 | checksum = "a24f40fb03852d1cdd84330cddcaf98e9ec08a7b7768e952fad3b4cf048ec8fd" 1349 | dependencies = [ 1350 | "log", 1351 | "phf 0.8.0", 1352 | "phf_codegen", 1353 | "string_cache", 1354 | "string_cache_codegen", 1355 | "tendril", 1356 | ] 1357 | 1358 | [[package]] 1359 | name = "matchers" 1360 | version = "0.1.0" 1361 | source = "registry+https://github.com/rust-lang/crates.io-index" 1362 | checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" 1363 | dependencies = [ 1364 | "regex-automata", 1365 | ] 1366 | 1367 | [[package]] 1368 | name = "matches" 1369 | version = "0.1.9" 1370 | source = "registry+https://github.com/rust-lang/crates.io-index" 1371 | checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" 1372 | 1373 | [[package]] 1374 | name = "memchr" 1375 | version = "2.5.0" 1376 | source = "registry+https://github.com/rust-lang/crates.io-index" 1377 | checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" 1378 | 1379 | [[package]] 1380 | name = "memoffset" 1381 | version = "0.6.5" 1382 | source = "registry+https://github.com/rust-lang/crates.io-index" 1383 | checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" 1384 | dependencies = [ 1385 | "autocfg", 1386 | ] 1387 | 1388 | [[package]] 1389 | name = "miniz_oxide" 1390 | version = "0.5.4" 1391 | source = "registry+https://github.com/rust-lang/crates.io-index" 1392 | checksum = "96590ba8f175222643a85693f33d26e9c8a015f599c216509b1a6894af675d34" 1393 | dependencies = [ 1394 | "adler", 1395 | ] 1396 | 1397 | [[package]] 1398 | name = "mio" 1399 | version = "0.8.4" 1400 | source = "registry+https://github.com/rust-lang/crates.io-index" 1401 | checksum = "57ee1c23c7c63b0c9250c339ffdc69255f110b298b901b9f6c82547b7b87caaf" 1402 | dependencies = [ 1403 | "libc", 1404 | "log", 1405 | "wasi 0.11.0+wasi-snapshot-preview1", 1406 | "windows-sys", 1407 | ] 1408 | 1409 | [[package]] 1410 | name = "ndk" 1411 | version = "0.6.0" 1412 | source = "registry+https://github.com/rust-lang/crates.io-index" 1413 | checksum = "2032c77e030ddee34a6787a64166008da93f6a352b629261d0fee232b8742dd4" 1414 | dependencies = [ 1415 | "bitflags", 1416 | "jni-sys", 1417 | "ndk-sys", 1418 | "num_enum", 1419 | "thiserror", 1420 | ] 1421 | 1422 | [[package]] 1423 | name = "ndk-context" 1424 | version = "0.1.1" 1425 | source = "registry+https://github.com/rust-lang/crates.io-index" 1426 | checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" 1427 | 1428 | [[package]] 1429 | name = "ndk-sys" 1430 | version = "0.3.0" 1431 | source = "registry+https://github.com/rust-lang/crates.io-index" 1432 | checksum = "6e5a6ae77c8ee183dcbbba6150e2e6b9f3f4196a7666c02a715a95692ec1fa97" 1433 | dependencies = [ 1434 | "jni-sys", 1435 | ] 1436 | 1437 | [[package]] 1438 | name = "new_debug_unreachable" 1439 | version = "1.0.4" 1440 | source = "registry+https://github.com/rust-lang/crates.io-index" 1441 | checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54" 1442 | 1443 | [[package]] 1444 | name = "nodrop" 1445 | version = "0.1.14" 1446 | source = "registry+https://github.com/rust-lang/crates.io-index" 1447 | checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" 1448 | 1449 | [[package]] 1450 | name = "num-integer" 1451 | version = "0.1.45" 1452 | source = "registry+https://github.com/rust-lang/crates.io-index" 1453 | checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" 1454 | dependencies = [ 1455 | "autocfg", 1456 | "num-traits", 1457 | ] 1458 | 1459 | [[package]] 1460 | name = "num-iter" 1461 | version = "0.1.43" 1462 | source = "registry+https://github.com/rust-lang/crates.io-index" 1463 | checksum = "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252" 1464 | dependencies = [ 1465 | "autocfg", 1466 | "num-integer", 1467 | "num-traits", 1468 | ] 1469 | 1470 | [[package]] 1471 | name = "num-rational" 1472 | version = "0.4.1" 1473 | source = "registry+https://github.com/rust-lang/crates.io-index" 1474 | checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" 1475 | dependencies = [ 1476 | "autocfg", 1477 | "num-integer", 1478 | "num-traits", 1479 | ] 1480 | 1481 | [[package]] 1482 | name = "num-traits" 1483 | version = "0.2.15" 1484 | source = "registry+https://github.com/rust-lang/crates.io-index" 1485 | checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" 1486 | dependencies = [ 1487 | "autocfg", 1488 | ] 1489 | 1490 | [[package]] 1491 | name = "num_cpus" 1492 | version = "1.13.1" 1493 | source = "registry+https://github.com/rust-lang/crates.io-index" 1494 | checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1" 1495 | dependencies = [ 1496 | "hermit-abi", 1497 | "libc", 1498 | ] 1499 | 1500 | [[package]] 1501 | name = "num_enum" 1502 | version = "0.5.7" 1503 | source = "registry+https://github.com/rust-lang/crates.io-index" 1504 | checksum = "cf5395665662ef45796a4ff5486c5d41d29e0c09640af4c5f17fd94ee2c119c9" 1505 | dependencies = [ 1506 | "num_enum_derive", 1507 | ] 1508 | 1509 | [[package]] 1510 | name = "num_enum_derive" 1511 | version = "0.5.7" 1512 | source = "registry+https://github.com/rust-lang/crates.io-index" 1513 | checksum = "3b0498641e53dd6ac1a4f22547548caa6864cc4933784319cd1775271c5a46ce" 1514 | dependencies = [ 1515 | "proc-macro-crate", 1516 | "proc-macro2", 1517 | "quote", 1518 | "syn", 1519 | ] 1520 | 1521 | [[package]] 1522 | name = "num_threads" 1523 | version = "0.1.6" 1524 | source = "registry+https://github.com/rust-lang/crates.io-index" 1525 | checksum = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44" 1526 | dependencies = [ 1527 | "libc", 1528 | ] 1529 | 1530 | [[package]] 1531 | name = "objc" 1532 | version = "0.2.7" 1533 | source = "registry+https://github.com/rust-lang/crates.io-index" 1534 | checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" 1535 | dependencies = [ 1536 | "malloc_buf", 1537 | "objc_exception", 1538 | ] 1539 | 1540 | [[package]] 1541 | name = "objc_exception" 1542 | version = "0.1.2" 1543 | source = "registry+https://github.com/rust-lang/crates.io-index" 1544 | checksum = "ad970fb455818ad6cba4c122ad012fae53ae8b4795f86378bce65e4f6bab2ca4" 1545 | dependencies = [ 1546 | "cc", 1547 | ] 1548 | 1549 | [[package]] 1550 | name = "objc_id" 1551 | version = "0.1.1" 1552 | source = "registry+https://github.com/rust-lang/crates.io-index" 1553 | checksum = "c92d4ddb4bd7b50d730c215ff871754d0da6b2178849f8a2a2ab69712d0c073b" 1554 | dependencies = [ 1555 | "objc", 1556 | ] 1557 | 1558 | [[package]] 1559 | name = "once_cell" 1560 | version = "1.14.0" 1561 | source = "registry+https://github.com/rust-lang/crates.io-index" 1562 | checksum = "2f7254b99e31cad77da24b08ebf628882739a608578bb1bcdfc1f9c21260d7c0" 1563 | 1564 | [[package]] 1565 | name = "os_pipe" 1566 | version = "1.0.1" 1567 | source = "registry+https://github.com/rust-lang/crates.io-index" 1568 | checksum = "2c92f2b54f081d635c77e7120862d48db8e91f7f21cef23ab1b4fe9971c59f55" 1569 | dependencies = [ 1570 | "libc", 1571 | "winapi", 1572 | ] 1573 | 1574 | [[package]] 1575 | name = "pango" 1576 | version = "0.15.10" 1577 | source = "registry+https://github.com/rust-lang/crates.io-index" 1578 | checksum = "22e4045548659aee5313bde6c582b0d83a627b7904dd20dc2d9ef0895d414e4f" 1579 | dependencies = [ 1580 | "bitflags", 1581 | "glib", 1582 | "libc", 1583 | "once_cell", 1584 | "pango-sys", 1585 | ] 1586 | 1587 | [[package]] 1588 | name = "pango-sys" 1589 | version = "0.15.10" 1590 | source = "registry+https://github.com/rust-lang/crates.io-index" 1591 | checksum = "d2a00081cde4661982ed91d80ef437c20eacaf6aa1a5962c0279ae194662c3aa" 1592 | dependencies = [ 1593 | "glib-sys", 1594 | "gobject-sys", 1595 | "libc", 1596 | "system-deps 6.0.2", 1597 | ] 1598 | 1599 | [[package]] 1600 | name = "parking" 1601 | version = "2.0.0" 1602 | source = "registry+https://github.com/rust-lang/crates.io-index" 1603 | checksum = "427c3892f9e783d91cc128285287e70a59e206ca452770ece88a76f7a3eddd72" 1604 | 1605 | [[package]] 1606 | name = "parking_lot" 1607 | version = "0.12.1" 1608 | source = "registry+https://github.com/rust-lang/crates.io-index" 1609 | checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" 1610 | dependencies = [ 1611 | "lock_api", 1612 | "parking_lot_core", 1613 | ] 1614 | 1615 | [[package]] 1616 | name = "parking_lot_core" 1617 | version = "0.9.3" 1618 | source = "registry+https://github.com/rust-lang/crates.io-index" 1619 | checksum = "09a279cbf25cb0757810394fbc1e359949b59e348145c643a939a525692e6929" 1620 | dependencies = [ 1621 | "cfg-if", 1622 | "libc", 1623 | "redox_syscall", 1624 | "smallvec", 1625 | "windows-sys", 1626 | ] 1627 | 1628 | [[package]] 1629 | name = "paste" 1630 | version = "1.0.9" 1631 | source = "registry+https://github.com/rust-lang/crates.io-index" 1632 | checksum = "b1de2e551fb905ac83f73f7aedf2f0cb4a0da7e35efa24a202a936269f1f18e1" 1633 | 1634 | [[package]] 1635 | name = "percent-encoding" 1636 | version = "2.1.0" 1637 | source = "registry+https://github.com/rust-lang/crates.io-index" 1638 | checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" 1639 | 1640 | [[package]] 1641 | name = "pest" 1642 | version = "2.3.0" 1643 | source = "registry+https://github.com/rust-lang/crates.io-index" 1644 | checksum = "4b0560d531d1febc25a3c9398a62a71256c0178f2e3443baedd9ad4bb8c9deb4" 1645 | dependencies = [ 1646 | "thiserror", 1647 | "ucd-trie", 1648 | ] 1649 | 1650 | [[package]] 1651 | name = "phf" 1652 | version = "0.8.0" 1653 | source = "registry+https://github.com/rust-lang/crates.io-index" 1654 | checksum = "3dfb61232e34fcb633f43d12c58f83c1df82962dcdfa565a4e866ffc17dafe12" 1655 | dependencies = [ 1656 | "phf_macros 0.8.0", 1657 | "phf_shared 0.8.0", 1658 | "proc-macro-hack", 1659 | ] 1660 | 1661 | [[package]] 1662 | name = "phf" 1663 | version = "0.10.1" 1664 | source = "registry+https://github.com/rust-lang/crates.io-index" 1665 | checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259" 1666 | dependencies = [ 1667 | "phf_macros 0.10.0", 1668 | "phf_shared 0.10.0", 1669 | "proc-macro-hack", 1670 | ] 1671 | 1672 | [[package]] 1673 | name = "phf_codegen" 1674 | version = "0.8.0" 1675 | source = "registry+https://github.com/rust-lang/crates.io-index" 1676 | checksum = "cbffee61585b0411840d3ece935cce9cb6321f01c45477d30066498cd5e1a815" 1677 | dependencies = [ 1678 | "phf_generator 0.8.0", 1679 | "phf_shared 0.8.0", 1680 | ] 1681 | 1682 | [[package]] 1683 | name = "phf_generator" 1684 | version = "0.8.0" 1685 | source = "registry+https://github.com/rust-lang/crates.io-index" 1686 | checksum = "17367f0cc86f2d25802b2c26ee58a7b23faeccf78a396094c13dced0d0182526" 1687 | dependencies = [ 1688 | "phf_shared 0.8.0", 1689 | "rand 0.7.3", 1690 | ] 1691 | 1692 | [[package]] 1693 | name = "phf_generator" 1694 | version = "0.10.0" 1695 | source = "registry+https://github.com/rust-lang/crates.io-index" 1696 | checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6" 1697 | dependencies = [ 1698 | "phf_shared 0.10.0", 1699 | "rand 0.8.5", 1700 | ] 1701 | 1702 | [[package]] 1703 | name = "phf_macros" 1704 | version = "0.8.0" 1705 | source = "registry+https://github.com/rust-lang/crates.io-index" 1706 | checksum = "7f6fde18ff429ffc8fe78e2bf7f8b7a5a5a6e2a8b58bc5a9ac69198bbda9189c" 1707 | dependencies = [ 1708 | "phf_generator 0.8.0", 1709 | "phf_shared 0.8.0", 1710 | "proc-macro-hack", 1711 | "proc-macro2", 1712 | "quote", 1713 | "syn", 1714 | ] 1715 | 1716 | [[package]] 1717 | name = "phf_macros" 1718 | version = "0.10.0" 1719 | source = "registry+https://github.com/rust-lang/crates.io-index" 1720 | checksum = "58fdf3184dd560f160dd73922bea2d5cd6e8f064bf4b13110abd81b03697b4e0" 1721 | dependencies = [ 1722 | "phf_generator 0.10.0", 1723 | "phf_shared 0.10.0", 1724 | "proc-macro-hack", 1725 | "proc-macro2", 1726 | "quote", 1727 | "syn", 1728 | ] 1729 | 1730 | [[package]] 1731 | name = "phf_shared" 1732 | version = "0.8.0" 1733 | source = "registry+https://github.com/rust-lang/crates.io-index" 1734 | checksum = "c00cf8b9eafe68dde5e9eaa2cef8ee84a9336a47d566ec55ca16589633b65af7" 1735 | dependencies = [ 1736 | "siphasher", 1737 | ] 1738 | 1739 | [[package]] 1740 | name = "phf_shared" 1741 | version = "0.10.0" 1742 | source = "registry+https://github.com/rust-lang/crates.io-index" 1743 | checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" 1744 | dependencies = [ 1745 | "siphasher", 1746 | ] 1747 | 1748 | [[package]] 1749 | name = "pin-project-lite" 1750 | version = "0.2.9" 1751 | source = "registry+https://github.com/rust-lang/crates.io-index" 1752 | checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" 1753 | 1754 | [[package]] 1755 | name = "pin-utils" 1756 | version = "0.1.0" 1757 | source = "registry+https://github.com/rust-lang/crates.io-index" 1758 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 1759 | 1760 | [[package]] 1761 | name = "pkg-config" 1762 | version = "0.3.25" 1763 | source = "registry+https://github.com/rust-lang/crates.io-index" 1764 | checksum = "1df8c4ec4b0627e53bdf214615ad287367e482558cf84b109250b37464dc03ae" 1765 | 1766 | [[package]] 1767 | name = "plist" 1768 | version = "1.3.1" 1769 | source = "registry+https://github.com/rust-lang/crates.io-index" 1770 | checksum = "bd39bc6cdc9355ad1dc5eeedefee696bb35c34caf21768741e81826c0bbd7225" 1771 | dependencies = [ 1772 | "base64", 1773 | "indexmap", 1774 | "line-wrap", 1775 | "serde", 1776 | "time", 1777 | "xml-rs", 1778 | ] 1779 | 1780 | [[package]] 1781 | name = "png" 1782 | version = "0.11.0" 1783 | source = "registry+https://github.com/rust-lang/crates.io-index" 1784 | checksum = "f0b0cabbbd20c2d7f06dbf015e06aad59b6ca3d9ed14848783e98af9aaf19925" 1785 | dependencies = [ 1786 | "bitflags", 1787 | "deflate", 1788 | "inflate", 1789 | "num-iter", 1790 | ] 1791 | 1792 | [[package]] 1793 | name = "png" 1794 | version = "0.17.6" 1795 | source = "registry+https://github.com/rust-lang/crates.io-index" 1796 | checksum = "8f0e7f4c94ec26ff209cee506314212639d6c91b80afb82984819fafce9df01c" 1797 | dependencies = [ 1798 | "bitflags", 1799 | "crc32fast", 1800 | "flate2", 1801 | "miniz_oxide", 1802 | ] 1803 | 1804 | [[package]] 1805 | name = "ppv-lite86" 1806 | version = "0.2.16" 1807 | source = "registry+https://github.com/rust-lang/crates.io-index" 1808 | checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" 1809 | 1810 | [[package]] 1811 | name = "precomputed-hash" 1812 | version = "0.1.1" 1813 | source = "registry+https://github.com/rust-lang/crates.io-index" 1814 | checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" 1815 | 1816 | [[package]] 1817 | name = "proc-macro-crate" 1818 | version = "1.2.1" 1819 | source = "registry+https://github.com/rust-lang/crates.io-index" 1820 | checksum = "eda0fc3b0fb7c975631757e14d9049da17374063edb6ebbcbc54d880d4fe94e9" 1821 | dependencies = [ 1822 | "once_cell", 1823 | "thiserror", 1824 | "toml", 1825 | ] 1826 | 1827 | [[package]] 1828 | name = "proc-macro-error" 1829 | version = "1.0.4" 1830 | source = "registry+https://github.com/rust-lang/crates.io-index" 1831 | checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" 1832 | dependencies = [ 1833 | "proc-macro-error-attr", 1834 | "proc-macro2", 1835 | "quote", 1836 | "syn", 1837 | "version_check", 1838 | ] 1839 | 1840 | [[package]] 1841 | name = "proc-macro-error-attr" 1842 | version = "1.0.4" 1843 | source = "registry+https://github.com/rust-lang/crates.io-index" 1844 | checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" 1845 | dependencies = [ 1846 | "proc-macro2", 1847 | "quote", 1848 | "version_check", 1849 | ] 1850 | 1851 | [[package]] 1852 | name = "proc-macro-hack" 1853 | version = "0.5.19" 1854 | source = "registry+https://github.com/rust-lang/crates.io-index" 1855 | checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5" 1856 | 1857 | [[package]] 1858 | name = "proc-macro2" 1859 | version = "1.0.43" 1860 | source = "registry+https://github.com/rust-lang/crates.io-index" 1861 | checksum = "0a2ca2c61bc9f3d74d2886294ab7b9853abd9c1ad903a3ac7815c58989bb7bab" 1862 | dependencies = [ 1863 | "unicode-ident", 1864 | ] 1865 | 1866 | [[package]] 1867 | name = "quote" 1868 | version = "1.0.21" 1869 | source = "registry+https://github.com/rust-lang/crates.io-index" 1870 | checksum = "bbe448f377a7d6961e30f5955f9b8d106c3f5e449d493ee1b125c1d43c2b5179" 1871 | dependencies = [ 1872 | "proc-macro2", 1873 | ] 1874 | 1875 | [[package]] 1876 | name = "rand" 1877 | version = "0.7.3" 1878 | source = "registry+https://github.com/rust-lang/crates.io-index" 1879 | checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" 1880 | dependencies = [ 1881 | "getrandom 0.1.16", 1882 | "libc", 1883 | "rand_chacha 0.2.2", 1884 | "rand_core 0.5.1", 1885 | "rand_hc", 1886 | "rand_pcg", 1887 | ] 1888 | 1889 | [[package]] 1890 | name = "rand" 1891 | version = "0.8.5" 1892 | source = "registry+https://github.com/rust-lang/crates.io-index" 1893 | checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 1894 | dependencies = [ 1895 | "libc", 1896 | "rand_chacha 0.3.1", 1897 | "rand_core 0.6.3", 1898 | ] 1899 | 1900 | [[package]] 1901 | name = "rand_chacha" 1902 | version = "0.2.2" 1903 | source = "registry+https://github.com/rust-lang/crates.io-index" 1904 | checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" 1905 | dependencies = [ 1906 | "ppv-lite86", 1907 | "rand_core 0.5.1", 1908 | ] 1909 | 1910 | [[package]] 1911 | name = "rand_chacha" 1912 | version = "0.3.1" 1913 | source = "registry+https://github.com/rust-lang/crates.io-index" 1914 | checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" 1915 | dependencies = [ 1916 | "ppv-lite86", 1917 | "rand_core 0.6.3", 1918 | ] 1919 | 1920 | [[package]] 1921 | name = "rand_core" 1922 | version = "0.5.1" 1923 | source = "registry+https://github.com/rust-lang/crates.io-index" 1924 | checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" 1925 | dependencies = [ 1926 | "getrandom 0.1.16", 1927 | ] 1928 | 1929 | [[package]] 1930 | name = "rand_core" 1931 | version = "0.6.3" 1932 | source = "registry+https://github.com/rust-lang/crates.io-index" 1933 | checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" 1934 | dependencies = [ 1935 | "getrandom 0.2.7", 1936 | ] 1937 | 1938 | [[package]] 1939 | name = "rand_hc" 1940 | version = "0.2.0" 1941 | source = "registry+https://github.com/rust-lang/crates.io-index" 1942 | checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" 1943 | dependencies = [ 1944 | "rand_core 0.5.1", 1945 | ] 1946 | 1947 | [[package]] 1948 | name = "rand_pcg" 1949 | version = "0.2.1" 1950 | source = "registry+https://github.com/rust-lang/crates.io-index" 1951 | checksum = "16abd0c1b639e9eb4d7c50c0b8100b0d0f849be2349829c740fe8e6eb4816429" 1952 | dependencies = [ 1953 | "rand_core 0.5.1", 1954 | ] 1955 | 1956 | [[package]] 1957 | name = "raw-window-handle" 1958 | version = "0.4.3" 1959 | source = "registry+https://github.com/rust-lang/crates.io-index" 1960 | checksum = "b800beb9b6e7d2df1fe337c9e3d04e3af22a124460fb4c30fcc22c9117cefb41" 1961 | dependencies = [ 1962 | "cty", 1963 | ] 1964 | 1965 | [[package]] 1966 | name = "redox_syscall" 1967 | version = "0.2.16" 1968 | source = "registry+https://github.com/rust-lang/crates.io-index" 1969 | checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" 1970 | dependencies = [ 1971 | "bitflags", 1972 | ] 1973 | 1974 | [[package]] 1975 | name = "redox_users" 1976 | version = "0.4.3" 1977 | source = "registry+https://github.com/rust-lang/crates.io-index" 1978 | checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" 1979 | dependencies = [ 1980 | "getrandom 0.2.7", 1981 | "redox_syscall", 1982 | "thiserror", 1983 | ] 1984 | 1985 | [[package]] 1986 | name = "regex" 1987 | version = "1.6.0" 1988 | source = "registry+https://github.com/rust-lang/crates.io-index" 1989 | checksum = "4c4eb3267174b8c6c2f654116623910a0fef09c4753f8dd83db29c48a0df988b" 1990 | dependencies = [ 1991 | "aho-corasick", 1992 | "memchr", 1993 | "regex-syntax", 1994 | ] 1995 | 1996 | [[package]] 1997 | name = "regex-automata" 1998 | version = "0.1.10" 1999 | source = "registry+https://github.com/rust-lang/crates.io-index" 2000 | checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" 2001 | dependencies = [ 2002 | "regex-syntax", 2003 | ] 2004 | 2005 | [[package]] 2006 | name = "regex-syntax" 2007 | version = "0.6.27" 2008 | source = "registry+https://github.com/rust-lang/crates.io-index" 2009 | checksum = "a3f87b73ce11b1619a3c6332f45341e0047173771e8b8b73f87bfeefb7b56244" 2010 | 2011 | [[package]] 2012 | name = "remove_dir_all" 2013 | version = "0.5.3" 2014 | source = "registry+https://github.com/rust-lang/crates.io-index" 2015 | checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" 2016 | dependencies = [ 2017 | "winapi", 2018 | ] 2019 | 2020 | [[package]] 2021 | name = "rustc_version" 2022 | version = "0.3.3" 2023 | source = "registry+https://github.com/rust-lang/crates.io-index" 2024 | checksum = "f0dfe2087c51c460008730de8b57e6a320782fbfb312e1f4d520e6c6fae155ee" 2025 | dependencies = [ 2026 | "semver 0.11.0", 2027 | ] 2028 | 2029 | [[package]] 2030 | name = "rustc_version" 2031 | version = "0.4.0" 2032 | source = "registry+https://github.com/rust-lang/crates.io-index" 2033 | checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" 2034 | dependencies = [ 2035 | "semver 1.0.13", 2036 | ] 2037 | 2038 | [[package]] 2039 | name = "rustversion" 2040 | version = "1.0.9" 2041 | source = "registry+https://github.com/rust-lang/crates.io-index" 2042 | checksum = "97477e48b4cf8603ad5f7aaf897467cf42ab4218a38ef76fb14c2d6773a6d6a8" 2043 | 2044 | [[package]] 2045 | name = "ryu" 2046 | version = "1.0.11" 2047 | source = "registry+https://github.com/rust-lang/crates.io-index" 2048 | checksum = "4501abdff3ae82a1c1b477a17252eb69cee9e66eb915c1abaa4f44d873df9f09" 2049 | 2050 | [[package]] 2051 | name = "safemem" 2052 | version = "0.3.3" 2053 | source = "registry+https://github.com/rust-lang/crates.io-index" 2054 | checksum = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072" 2055 | 2056 | [[package]] 2057 | name = "same-file" 2058 | version = "1.0.6" 2059 | source = "registry+https://github.com/rust-lang/crates.io-index" 2060 | checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" 2061 | dependencies = [ 2062 | "winapi-util", 2063 | ] 2064 | 2065 | [[package]] 2066 | name = "scoped-tls" 2067 | version = "1.0.0" 2068 | source = "registry+https://github.com/rust-lang/crates.io-index" 2069 | checksum = "ea6a9290e3c9cf0f18145ef7ffa62d68ee0bf5fcd651017e586dc7fd5da448c2" 2070 | 2071 | [[package]] 2072 | name = "scopeguard" 2073 | version = "1.1.0" 2074 | source = "registry+https://github.com/rust-lang/crates.io-index" 2075 | checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" 2076 | 2077 | [[package]] 2078 | name = "selectors" 2079 | version = "0.22.0" 2080 | source = "registry+https://github.com/rust-lang/crates.io-index" 2081 | checksum = "df320f1889ac4ba6bc0cdc9c9af7af4bd64bb927bccdf32d81140dc1f9be12fe" 2082 | dependencies = [ 2083 | "bitflags", 2084 | "cssparser", 2085 | "derive_more", 2086 | "fxhash", 2087 | "log", 2088 | "matches", 2089 | "phf 0.8.0", 2090 | "phf_codegen", 2091 | "precomputed-hash", 2092 | "servo_arc", 2093 | "smallvec", 2094 | "thin-slice", 2095 | ] 2096 | 2097 | [[package]] 2098 | name = "semver" 2099 | version = "0.11.0" 2100 | source = "registry+https://github.com/rust-lang/crates.io-index" 2101 | checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" 2102 | dependencies = [ 2103 | "semver-parser", 2104 | ] 2105 | 2106 | [[package]] 2107 | name = "semver" 2108 | version = "1.0.13" 2109 | source = "registry+https://github.com/rust-lang/crates.io-index" 2110 | checksum = "93f6841e709003d68bb2deee8c343572bf446003ec20a583e76f7b15cebf3711" 2111 | dependencies = [ 2112 | "serde", 2113 | ] 2114 | 2115 | [[package]] 2116 | name = "semver-parser" 2117 | version = "0.10.2" 2118 | source = "registry+https://github.com/rust-lang/crates.io-index" 2119 | checksum = "00b0bef5b7f9e0df16536d3961cfb6e84331c065b4066afb39768d0e319411f7" 2120 | dependencies = [ 2121 | "pest", 2122 | ] 2123 | 2124 | [[package]] 2125 | name = "serde" 2126 | version = "1.0.144" 2127 | source = "registry+https://github.com/rust-lang/crates.io-index" 2128 | checksum = "0f747710de3dcd43b88c9168773254e809d8ddbdf9653b84e2554ab219f17860" 2129 | dependencies = [ 2130 | "serde_derive", 2131 | ] 2132 | 2133 | [[package]] 2134 | name = "serde_derive" 2135 | version = "1.0.144" 2136 | source = "registry+https://github.com/rust-lang/crates.io-index" 2137 | checksum = "94ed3a816fb1d101812f83e789f888322c34e291f894f19590dc310963e87a00" 2138 | dependencies = [ 2139 | "proc-macro2", 2140 | "quote", 2141 | "syn", 2142 | ] 2143 | 2144 | [[package]] 2145 | name = "serde_json" 2146 | version = "1.0.85" 2147 | source = "registry+https://github.com/rust-lang/crates.io-index" 2148 | checksum = "e55a28e3aaef9d5ce0506d0a14dbba8054ddc7e499ef522dd8b26859ec9d4a44" 2149 | dependencies = [ 2150 | "itoa 1.0.3", 2151 | "ryu", 2152 | "serde", 2153 | ] 2154 | 2155 | [[package]] 2156 | name = "serde_repr" 2157 | version = "0.1.9" 2158 | source = "registry+https://github.com/rust-lang/crates.io-index" 2159 | checksum = "1fe39d9fbb0ebf5eb2c7cb7e2a47e4f462fad1379f1166b8ae49ad9eae89a7ca" 2160 | dependencies = [ 2161 | "proc-macro2", 2162 | "quote", 2163 | "syn", 2164 | ] 2165 | 2166 | [[package]] 2167 | name = "serde_with" 2168 | version = "1.14.0" 2169 | source = "registry+https://github.com/rust-lang/crates.io-index" 2170 | checksum = "678b5a069e50bf00ecd22d0cd8ddf7c236f68581b03db652061ed5eb13a312ff" 2171 | dependencies = [ 2172 | "serde", 2173 | "serde_with_macros", 2174 | ] 2175 | 2176 | [[package]] 2177 | name = "serde_with_macros" 2178 | version = "1.5.2" 2179 | source = "registry+https://github.com/rust-lang/crates.io-index" 2180 | checksum = "e182d6ec6f05393cc0e5ed1bf81ad6db3a8feedf8ee515ecdd369809bcce8082" 2181 | dependencies = [ 2182 | "darling", 2183 | "proc-macro2", 2184 | "quote", 2185 | "syn", 2186 | ] 2187 | 2188 | [[package]] 2189 | name = "serialize-to-javascript" 2190 | version = "0.1.1" 2191 | source = "registry+https://github.com/rust-lang/crates.io-index" 2192 | checksum = "c9823f2d3b6a81d98228151fdeaf848206a7855a7a042bbf9bf870449a66cafb" 2193 | dependencies = [ 2194 | "serde", 2195 | "serde_json", 2196 | "serialize-to-javascript-impl", 2197 | ] 2198 | 2199 | [[package]] 2200 | name = "serialize-to-javascript-impl" 2201 | version = "0.1.1" 2202 | source = "registry+https://github.com/rust-lang/crates.io-index" 2203 | checksum = "74064874e9f6a15f04c1f3cb627902d0e6b410abbf36668afa873c61889f1763" 2204 | dependencies = [ 2205 | "proc-macro2", 2206 | "quote", 2207 | "syn", 2208 | ] 2209 | 2210 | [[package]] 2211 | name = "servo_arc" 2212 | version = "0.1.1" 2213 | source = "registry+https://github.com/rust-lang/crates.io-index" 2214 | checksum = "d98238b800e0d1576d8b6e3de32827c2d74bee68bb97748dcf5071fb53965432" 2215 | dependencies = [ 2216 | "nodrop", 2217 | "stable_deref_trait", 2218 | ] 2219 | 2220 | [[package]] 2221 | name = "sha2" 2222 | version = "0.10.5" 2223 | source = "registry+https://github.com/rust-lang/crates.io-index" 2224 | checksum = "cf9db03534dff993187064c4e0c05a5708d2a9728ace9a8959b77bedf415dac5" 2225 | dependencies = [ 2226 | "cfg-if", 2227 | "cpufeatures", 2228 | "digest", 2229 | ] 2230 | 2231 | [[package]] 2232 | name = "sharded-slab" 2233 | version = "0.1.4" 2234 | source = "registry+https://github.com/rust-lang/crates.io-index" 2235 | checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31" 2236 | dependencies = [ 2237 | "lazy_static", 2238 | ] 2239 | 2240 | [[package]] 2241 | name = "shared_child" 2242 | version = "1.0.0" 2243 | source = "registry+https://github.com/rust-lang/crates.io-index" 2244 | checksum = "b0d94659ad3c2137fef23ae75b03d5241d633f8acded53d672decfa0e6e0caef" 2245 | dependencies = [ 2246 | "libc", 2247 | "winapi", 2248 | ] 2249 | 2250 | [[package]] 2251 | name = "signal-hook-registry" 2252 | version = "1.4.0" 2253 | source = "registry+https://github.com/rust-lang/crates.io-index" 2254 | checksum = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0" 2255 | dependencies = [ 2256 | "libc", 2257 | ] 2258 | 2259 | [[package]] 2260 | name = "siphasher" 2261 | version = "0.3.10" 2262 | source = "registry+https://github.com/rust-lang/crates.io-index" 2263 | checksum = "7bd3e3206899af3f8b12af284fafc038cc1dc2b41d1b89dd17297221c5d225de" 2264 | 2265 | [[package]] 2266 | name = "slab" 2267 | version = "0.4.7" 2268 | source = "registry+https://github.com/rust-lang/crates.io-index" 2269 | checksum = "4614a76b2a8be0058caa9dbbaf66d988527d86d003c11a94fbd335d7661edcef" 2270 | dependencies = [ 2271 | "autocfg", 2272 | ] 2273 | 2274 | [[package]] 2275 | name = "smallvec" 2276 | version = "1.9.0" 2277 | source = "registry+https://github.com/rust-lang/crates.io-index" 2278 | checksum = "2fd0db749597d91ff862fd1d55ea87f7855a744a8425a64695b6fca237d1dad1" 2279 | 2280 | [[package]] 2281 | name = "socket2" 2282 | version = "0.4.7" 2283 | source = "registry+https://github.com/rust-lang/crates.io-index" 2284 | checksum = "02e2d2db9033d13a1567121ddd7a095ee144db4e1ca1b1bda3419bc0da294ebd" 2285 | dependencies = [ 2286 | "libc", 2287 | "winapi", 2288 | ] 2289 | 2290 | [[package]] 2291 | name = "soup2" 2292 | version = "0.2.1" 2293 | source = "registry+https://github.com/rust-lang/crates.io-index" 2294 | checksum = "b2b4d76501d8ba387cf0fefbe055c3e0a59891d09f0f995ae4e4b16f6b60f3c0" 2295 | dependencies = [ 2296 | "bitflags", 2297 | "gio", 2298 | "glib", 2299 | "libc", 2300 | "once_cell", 2301 | "soup2-sys", 2302 | ] 2303 | 2304 | [[package]] 2305 | name = "soup2-sys" 2306 | version = "0.2.0" 2307 | source = "registry+https://github.com/rust-lang/crates.io-index" 2308 | checksum = "009ef427103fcb17f802871647a7fa6c60cbb654b4c4e4c0ac60a31c5f6dc9cf" 2309 | dependencies = [ 2310 | "bitflags", 2311 | "gio-sys", 2312 | "glib-sys", 2313 | "gobject-sys", 2314 | "libc", 2315 | "system-deps 5.0.0", 2316 | ] 2317 | 2318 | [[package]] 2319 | name = "stable_deref_trait" 2320 | version = "1.2.0" 2321 | source = "registry+https://github.com/rust-lang/crates.io-index" 2322 | checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" 2323 | 2324 | [[package]] 2325 | name = "state" 2326 | version = "0.5.3" 2327 | source = "registry+https://github.com/rust-lang/crates.io-index" 2328 | checksum = "dbe866e1e51e8260c9eed836a042a5e7f6726bb2b411dffeaa712e19c388f23b" 2329 | dependencies = [ 2330 | "loom", 2331 | ] 2332 | 2333 | [[package]] 2334 | name = "string_cache" 2335 | version = "0.8.4" 2336 | source = "registry+https://github.com/rust-lang/crates.io-index" 2337 | checksum = "213494b7a2b503146286049378ce02b482200519accc31872ee8be91fa820a08" 2338 | dependencies = [ 2339 | "new_debug_unreachable", 2340 | "once_cell", 2341 | "parking_lot", 2342 | "phf_shared 0.10.0", 2343 | "precomputed-hash", 2344 | "serde", 2345 | ] 2346 | 2347 | [[package]] 2348 | name = "string_cache_codegen" 2349 | version = "0.5.2" 2350 | source = "registry+https://github.com/rust-lang/crates.io-index" 2351 | checksum = "6bb30289b722be4ff74a408c3cc27edeaad656e06cb1fe8fa9231fa59c728988" 2352 | dependencies = [ 2353 | "phf_generator 0.10.0", 2354 | "phf_shared 0.10.0", 2355 | "proc-macro2", 2356 | "quote", 2357 | ] 2358 | 2359 | [[package]] 2360 | name = "strsim" 2361 | version = "0.10.0" 2362 | source = "registry+https://github.com/rust-lang/crates.io-index" 2363 | checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" 2364 | 2365 | [[package]] 2366 | name = "syn" 2367 | version = "1.0.99" 2368 | source = "registry+https://github.com/rust-lang/crates.io-index" 2369 | checksum = "58dbef6ec655055e20b86b15a8cc6d439cca19b667537ac6a1369572d151ab13" 2370 | dependencies = [ 2371 | "proc-macro2", 2372 | "quote", 2373 | "unicode-ident", 2374 | ] 2375 | 2376 | [[package]] 2377 | name = "system-deps" 2378 | version = "5.0.0" 2379 | source = "registry+https://github.com/rust-lang/crates.io-index" 2380 | checksum = "18db855554db7bd0e73e06cf7ba3df39f97812cb11d3f75e71c39bf45171797e" 2381 | dependencies = [ 2382 | "cfg-expr 0.9.1", 2383 | "heck 0.3.3", 2384 | "pkg-config", 2385 | "toml", 2386 | "version-compare 0.0.11", 2387 | ] 2388 | 2389 | [[package]] 2390 | name = "system-deps" 2391 | version = "6.0.2" 2392 | source = "registry+https://github.com/rust-lang/crates.io-index" 2393 | checksum = "a1a45a1c4c9015217e12347f2a411b57ce2c4fc543913b14b6fe40483328e709" 2394 | dependencies = [ 2395 | "cfg-expr 0.10.3", 2396 | "heck 0.4.0", 2397 | "pkg-config", 2398 | "toml", 2399 | "version-compare 0.1.0", 2400 | ] 2401 | 2402 | [[package]] 2403 | name = "tao" 2404 | version = "0.12.2" 2405 | source = "registry+https://github.com/rust-lang/crates.io-index" 2406 | checksum = "f6fd7725dc1e593e9ecabd9fe49c112a204c8c8694db4182e78b2a5af490b1ae" 2407 | dependencies = [ 2408 | "bitflags", 2409 | "cairo-rs", 2410 | "cc", 2411 | "cocoa", 2412 | "core-foundation", 2413 | "core-graphics", 2414 | "crossbeam-channel", 2415 | "dispatch", 2416 | "gdk", 2417 | "gdk-pixbuf", 2418 | "gdk-sys", 2419 | "gdkx11-sys", 2420 | "gio", 2421 | "glib", 2422 | "glib-sys", 2423 | "gtk", 2424 | "image", 2425 | "instant", 2426 | "jni 0.19.0", 2427 | "lazy_static", 2428 | "libc", 2429 | "log", 2430 | "ndk", 2431 | "ndk-context", 2432 | "ndk-sys", 2433 | "objc", 2434 | "once_cell", 2435 | "parking_lot", 2436 | "paste", 2437 | "png 0.17.6", 2438 | "raw-window-handle", 2439 | "scopeguard", 2440 | "serde", 2441 | "unicode-segmentation", 2442 | "uuid 1.1.2", 2443 | "windows 0.37.0", 2444 | "windows-implement", 2445 | "x11-dl", 2446 | ] 2447 | 2448 | [[package]] 2449 | name = "tar" 2450 | version = "0.4.38" 2451 | source = "registry+https://github.com/rust-lang/crates.io-index" 2452 | checksum = "4b55807c0344e1e6c04d7c965f5289c39a8d94ae23ed5c0b57aabac549f871c6" 2453 | dependencies = [ 2454 | "filetime", 2455 | "libc", 2456 | "xattr", 2457 | ] 2458 | 2459 | [[package]] 2460 | name = "tauri" 2461 | version = "1.0.5" 2462 | source = "registry+https://github.com/rust-lang/crates.io-index" 2463 | checksum = "e1a56a8b125069c2682bd31610109b4436c050c74447bee1078217a0325c1add" 2464 | dependencies = [ 2465 | "anyhow", 2466 | "cocoa", 2467 | "dirs-next", 2468 | "embed_plist", 2469 | "flate2", 2470 | "futures", 2471 | "futures-lite", 2472 | "glib", 2473 | "glob", 2474 | "gtk", 2475 | "heck 0.4.0", 2476 | "http", 2477 | "ignore", 2478 | "objc", 2479 | "once_cell", 2480 | "os_pipe", 2481 | "percent-encoding", 2482 | "rand 0.8.5", 2483 | "raw-window-handle", 2484 | "regex", 2485 | "semver 1.0.13", 2486 | "serde", 2487 | "serde_json", 2488 | "serde_repr", 2489 | "serialize-to-javascript", 2490 | "shared_child", 2491 | "state", 2492 | "tar", 2493 | "tauri-macros", 2494 | "tauri-runtime", 2495 | "tauri-runtime-wry", 2496 | "tauri-utils", 2497 | "tempfile", 2498 | "thiserror", 2499 | "tokio", 2500 | "url", 2501 | "uuid 1.1.2", 2502 | "webkit2gtk", 2503 | "webview2-com", 2504 | "windows 0.37.0", 2505 | ] 2506 | 2507 | [[package]] 2508 | name = "tauri-build" 2509 | version = "1.0.4" 2510 | source = "registry+https://github.com/rust-lang/crates.io-index" 2511 | checksum = "acafb1c515c5d14234a294461bd43c723639a84891a45f6a250fd3441ad2e8ed" 2512 | dependencies = [ 2513 | "anyhow", 2514 | "cargo_toml", 2515 | "heck 0.4.0", 2516 | "json-patch", 2517 | "semver 1.0.13", 2518 | "serde_json", 2519 | "tauri-utils", 2520 | "winres", 2521 | ] 2522 | 2523 | [[package]] 2524 | name = "tauri-codegen" 2525 | version = "1.0.4" 2526 | source = "registry+https://github.com/rust-lang/crates.io-index" 2527 | checksum = "16d62a3c8790d6cba686cea6e3f7f569d12c662c3274c2d165a4fd33e3871b72" 2528 | dependencies = [ 2529 | "base64", 2530 | "brotli", 2531 | "ico", 2532 | "json-patch", 2533 | "plist", 2534 | "png 0.17.6", 2535 | "proc-macro2", 2536 | "quote", 2537 | "regex", 2538 | "semver 1.0.13", 2539 | "serde", 2540 | "serde_json", 2541 | "sha2", 2542 | "tauri-utils", 2543 | "thiserror", 2544 | "time", 2545 | "uuid 1.1.2", 2546 | "walkdir", 2547 | ] 2548 | 2549 | [[package]] 2550 | name = "tauri-macros" 2551 | version = "1.0.4" 2552 | source = "registry+https://github.com/rust-lang/crates.io-index" 2553 | checksum = "7296fa17996629f43081e1c66d554703900187ed900c5bf46f97f0bcfb069278" 2554 | dependencies = [ 2555 | "heck 0.4.0", 2556 | "proc-macro2", 2557 | "quote", 2558 | "syn", 2559 | "tauri-codegen", 2560 | "tauri-utils", 2561 | ] 2562 | 2563 | [[package]] 2564 | name = "tauri-runtime" 2565 | version = "0.10.2" 2566 | source = "registry+https://github.com/rust-lang/crates.io-index" 2567 | checksum = "4e4cff3b4d9469727fa2107c4b3d2eda110df1ba45103fb420178e536362fae4" 2568 | dependencies = [ 2569 | "gtk", 2570 | "http", 2571 | "http-range", 2572 | "infer", 2573 | "raw-window-handle", 2574 | "serde", 2575 | "serde_json", 2576 | "tauri-utils", 2577 | "thiserror", 2578 | "uuid 1.1.2", 2579 | "webview2-com", 2580 | "windows 0.37.0", 2581 | ] 2582 | 2583 | [[package]] 2584 | name = "tauri-runtime-wry" 2585 | version = "0.10.2" 2586 | source = "registry+https://github.com/rust-lang/crates.io-index" 2587 | checksum = "3fa8c4edaf01d8b556e7172c844b1b4dd3399adcd1a606bd520fc3e65f698546" 2588 | dependencies = [ 2589 | "cocoa", 2590 | "gtk", 2591 | "percent-encoding", 2592 | "rand 0.8.5", 2593 | "raw-window-handle", 2594 | "tauri-runtime", 2595 | "tauri-utils", 2596 | "uuid 1.1.2", 2597 | "webkit2gtk", 2598 | "webview2-com", 2599 | "windows 0.37.0", 2600 | "wry", 2601 | ] 2602 | 2603 | [[package]] 2604 | name = "tauri-utils" 2605 | version = "1.0.3" 2606 | source = "registry+https://github.com/rust-lang/crates.io-index" 2607 | checksum = "12ff4b68d9faeb57c9c727bf58c9c9768d2b67d8e84e62ce6146e7859a2e9c6b" 2608 | dependencies = [ 2609 | "brotli", 2610 | "ctor", 2611 | "glob", 2612 | "heck 0.4.0", 2613 | "html5ever", 2614 | "json-patch", 2615 | "kuchiki", 2616 | "memchr", 2617 | "phf 0.10.1", 2618 | "proc-macro2", 2619 | "quote", 2620 | "semver 1.0.13", 2621 | "serde", 2622 | "serde_json", 2623 | "serde_with", 2624 | "thiserror", 2625 | "url", 2626 | "walkdir", 2627 | "windows 0.37.0", 2628 | ] 2629 | 2630 | [[package]] 2631 | name = "tempfile" 2632 | version = "3.3.0" 2633 | source = "registry+https://github.com/rust-lang/crates.io-index" 2634 | checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4" 2635 | dependencies = [ 2636 | "cfg-if", 2637 | "fastrand", 2638 | "libc", 2639 | "redox_syscall", 2640 | "remove_dir_all", 2641 | "winapi", 2642 | ] 2643 | 2644 | [[package]] 2645 | name = "tendril" 2646 | version = "0.4.3" 2647 | source = "registry+https://github.com/rust-lang/crates.io-index" 2648 | checksum = "d24a120c5fc464a3458240ee02c299ebcb9d67b5249c8848b09d639dca8d7bb0" 2649 | dependencies = [ 2650 | "futf", 2651 | "mac", 2652 | "utf-8", 2653 | ] 2654 | 2655 | [[package]] 2656 | name = "thin-slice" 2657 | version = "0.1.1" 2658 | source = "registry+https://github.com/rust-lang/crates.io-index" 2659 | checksum = "8eaa81235c7058867fa8c0e7314f33dcce9c215f535d1913822a2b3f5e289f3c" 2660 | 2661 | [[package]] 2662 | name = "thiserror" 2663 | version = "1.0.34" 2664 | source = "registry+https://github.com/rust-lang/crates.io-index" 2665 | checksum = "8c1b05ca9d106ba7d2e31a9dab4a64e7be2cce415321966ea3132c49a656e252" 2666 | dependencies = [ 2667 | "thiserror-impl", 2668 | ] 2669 | 2670 | [[package]] 2671 | name = "thiserror-impl" 2672 | version = "1.0.34" 2673 | source = "registry+https://github.com/rust-lang/crates.io-index" 2674 | checksum = "e8f2591983642de85c921015f3f070c665a197ed69e417af436115e3a1407487" 2675 | dependencies = [ 2676 | "proc-macro2", 2677 | "quote", 2678 | "syn", 2679 | ] 2680 | 2681 | [[package]] 2682 | name = "thread_local" 2683 | version = "1.1.4" 2684 | source = "registry+https://github.com/rust-lang/crates.io-index" 2685 | checksum = "5516c27b78311c50bf42c071425c560ac799b11c30b31f87e3081965fe5e0180" 2686 | dependencies = [ 2687 | "once_cell", 2688 | ] 2689 | 2690 | [[package]] 2691 | name = "time" 2692 | version = "0.3.14" 2693 | source = "registry+https://github.com/rust-lang/crates.io-index" 2694 | checksum = "3c3f9a28b618c3a6b9251b6908e9c99e04b9e5c02e6581ccbb67d59c34ef7f9b" 2695 | dependencies = [ 2696 | "itoa 1.0.3", 2697 | "libc", 2698 | "num_threads", 2699 | ] 2700 | 2701 | [[package]] 2702 | name = "tinyvec" 2703 | version = "1.6.0" 2704 | source = "registry+https://github.com/rust-lang/crates.io-index" 2705 | checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" 2706 | dependencies = [ 2707 | "tinyvec_macros", 2708 | ] 2709 | 2710 | [[package]] 2711 | name = "tinyvec_macros" 2712 | version = "0.1.0" 2713 | source = "registry+https://github.com/rust-lang/crates.io-index" 2714 | checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" 2715 | 2716 | [[package]] 2717 | name = "tokio" 2718 | version = "1.21.0" 2719 | source = "registry+https://github.com/rust-lang/crates.io-index" 2720 | checksum = "89797afd69d206ccd11fb0ea560a44bbb87731d020670e79416d442919257d42" 2721 | dependencies = [ 2722 | "autocfg", 2723 | "bytes", 2724 | "libc", 2725 | "memchr", 2726 | "mio", 2727 | "num_cpus", 2728 | "once_cell", 2729 | "parking_lot", 2730 | "pin-project-lite", 2731 | "signal-hook-registry", 2732 | "socket2", 2733 | "tokio-macros", 2734 | "winapi", 2735 | ] 2736 | 2737 | [[package]] 2738 | name = "tokio-macros" 2739 | version = "1.8.0" 2740 | source = "registry+https://github.com/rust-lang/crates.io-index" 2741 | checksum = "9724f9a975fb987ef7a3cd9be0350edcbe130698af5b8f7a631e23d42d052484" 2742 | dependencies = [ 2743 | "proc-macro2", 2744 | "quote", 2745 | "syn", 2746 | ] 2747 | 2748 | [[package]] 2749 | name = "toml" 2750 | version = "0.5.9" 2751 | source = "registry+https://github.com/rust-lang/crates.io-index" 2752 | checksum = "8d82e1a7758622a465f8cee077614c73484dac5b836c02ff6a40d5d1010324d7" 2753 | dependencies = [ 2754 | "serde", 2755 | ] 2756 | 2757 | [[package]] 2758 | name = "tracing" 2759 | version = "0.1.36" 2760 | source = "registry+https://github.com/rust-lang/crates.io-index" 2761 | checksum = "2fce9567bd60a67d08a16488756721ba392f24f29006402881e43b19aac64307" 2762 | dependencies = [ 2763 | "cfg-if", 2764 | "pin-project-lite", 2765 | "tracing-attributes", 2766 | "tracing-core", 2767 | ] 2768 | 2769 | [[package]] 2770 | name = "tracing-attributes" 2771 | version = "0.1.22" 2772 | source = "registry+https://github.com/rust-lang/crates.io-index" 2773 | checksum = "11c75893af559bc8e10716548bdef5cb2b983f8e637db9d0e15126b61b484ee2" 2774 | dependencies = [ 2775 | "proc-macro2", 2776 | "quote", 2777 | "syn", 2778 | ] 2779 | 2780 | [[package]] 2781 | name = "tracing-core" 2782 | version = "0.1.29" 2783 | source = "registry+https://github.com/rust-lang/crates.io-index" 2784 | checksum = "5aeea4303076558a00714b823f9ad67d58a3bbda1df83d8827d21193156e22f7" 2785 | dependencies = [ 2786 | "once_cell", 2787 | "valuable", 2788 | ] 2789 | 2790 | [[package]] 2791 | name = "tracing-log" 2792 | version = "0.1.3" 2793 | source = "registry+https://github.com/rust-lang/crates.io-index" 2794 | checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922" 2795 | dependencies = [ 2796 | "lazy_static", 2797 | "log", 2798 | "tracing-core", 2799 | ] 2800 | 2801 | [[package]] 2802 | name = "tracing-subscriber" 2803 | version = "0.3.15" 2804 | source = "registry+https://github.com/rust-lang/crates.io-index" 2805 | checksum = "60db860322da191b40952ad9affe65ea23e7dd6a5c442c2c42865810c6ab8e6b" 2806 | dependencies = [ 2807 | "ansi_term", 2808 | "matchers", 2809 | "once_cell", 2810 | "regex", 2811 | "sharded-slab", 2812 | "smallvec", 2813 | "thread_local", 2814 | "tracing", 2815 | "tracing-core", 2816 | "tracing-log", 2817 | ] 2818 | 2819 | [[package]] 2820 | name = "treediff" 2821 | version = "3.0.2" 2822 | source = "registry+https://github.com/rust-lang/crates.io-index" 2823 | checksum = "761e8d5ad7ce14bb82b7e61ccc0ca961005a275a060b9644a2431aa11553c2ff" 2824 | dependencies = [ 2825 | "serde_json", 2826 | ] 2827 | 2828 | [[package]] 2829 | name = "typenum" 2830 | version = "1.15.0" 2831 | source = "registry+https://github.com/rust-lang/crates.io-index" 2832 | checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" 2833 | 2834 | [[package]] 2835 | name = "ucd-trie" 2836 | version = "0.1.5" 2837 | source = "registry+https://github.com/rust-lang/crates.io-index" 2838 | checksum = "9e79c4d996edb816c91e4308506774452e55e95c3c9de07b6729e17e15a5ef81" 2839 | 2840 | [[package]] 2841 | name = "unicode-bidi" 2842 | version = "0.3.8" 2843 | source = "registry+https://github.com/rust-lang/crates.io-index" 2844 | checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992" 2845 | 2846 | [[package]] 2847 | name = "unicode-ident" 2848 | version = "1.0.3" 2849 | source = "registry+https://github.com/rust-lang/crates.io-index" 2850 | checksum = "c4f5b37a154999a8f3f98cc23a628d850e154479cd94decf3414696e12e31aaf" 2851 | 2852 | [[package]] 2853 | name = "unicode-normalization" 2854 | version = "0.1.21" 2855 | source = "registry+https://github.com/rust-lang/crates.io-index" 2856 | checksum = "854cbdc4f7bc6ae19c820d44abdc3277ac3e1b2b93db20a636825d9322fb60e6" 2857 | dependencies = [ 2858 | "tinyvec", 2859 | ] 2860 | 2861 | [[package]] 2862 | name = "unicode-segmentation" 2863 | version = "1.9.0" 2864 | source = "registry+https://github.com/rust-lang/crates.io-index" 2865 | checksum = "7e8820f5d777f6224dc4be3632222971ac30164d4a258d595640799554ebfd99" 2866 | 2867 | [[package]] 2868 | name = "url" 2869 | version = "2.2.2" 2870 | source = "registry+https://github.com/rust-lang/crates.io-index" 2871 | checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c" 2872 | dependencies = [ 2873 | "form_urlencoded", 2874 | "idna", 2875 | "matches", 2876 | "percent-encoding", 2877 | "serde", 2878 | ] 2879 | 2880 | [[package]] 2881 | name = "utf-8" 2882 | version = "0.7.6" 2883 | source = "registry+https://github.com/rust-lang/crates.io-index" 2884 | checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" 2885 | 2886 | [[package]] 2887 | name = "uuid" 2888 | version = "0.8.2" 2889 | source = "registry+https://github.com/rust-lang/crates.io-index" 2890 | checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" 2891 | 2892 | [[package]] 2893 | name = "uuid" 2894 | version = "1.1.2" 2895 | source = "registry+https://github.com/rust-lang/crates.io-index" 2896 | checksum = "dd6469f4314d5f1ffec476e05f17cc9a78bc7a27a6a857842170bdf8d6f98d2f" 2897 | dependencies = [ 2898 | "getrandom 0.2.7", 2899 | ] 2900 | 2901 | [[package]] 2902 | name = "valuable" 2903 | version = "0.1.0" 2904 | source = "registry+https://github.com/rust-lang/crates.io-index" 2905 | checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" 2906 | 2907 | [[package]] 2908 | name = "version-compare" 2909 | version = "0.0.11" 2910 | source = "registry+https://github.com/rust-lang/crates.io-index" 2911 | checksum = "1c18c859eead79d8b95d09e4678566e8d70105c4e7b251f707a03df32442661b" 2912 | 2913 | [[package]] 2914 | name = "version-compare" 2915 | version = "0.1.0" 2916 | source = "registry+https://github.com/rust-lang/crates.io-index" 2917 | checksum = "fe88247b92c1df6b6de80ddc290f3976dbdf2f5f5d3fd049a9fb598c6dd5ca73" 2918 | 2919 | [[package]] 2920 | name = "version_check" 2921 | version = "0.9.4" 2922 | source = "registry+https://github.com/rust-lang/crates.io-index" 2923 | checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" 2924 | 2925 | [[package]] 2926 | name = "waker-fn" 2927 | version = "1.1.0" 2928 | source = "registry+https://github.com/rust-lang/crates.io-index" 2929 | checksum = "9d5b2c62b4012a3e1eca5a7e077d13b3bf498c4073e33ccd58626607748ceeca" 2930 | 2931 | [[package]] 2932 | name = "walkdir" 2933 | version = "2.3.2" 2934 | source = "registry+https://github.com/rust-lang/crates.io-index" 2935 | checksum = "808cf2735cd4b6866113f648b791c6adc5714537bc222d9347bb203386ffda56" 2936 | dependencies = [ 2937 | "same-file", 2938 | "winapi", 2939 | "winapi-util", 2940 | ] 2941 | 2942 | [[package]] 2943 | name = "wasi" 2944 | version = "0.9.0+wasi-snapshot-preview1" 2945 | source = "registry+https://github.com/rust-lang/crates.io-index" 2946 | checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" 2947 | 2948 | [[package]] 2949 | name = "wasi" 2950 | version = "0.11.0+wasi-snapshot-preview1" 2951 | source = "registry+https://github.com/rust-lang/crates.io-index" 2952 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 2953 | 2954 | [[package]] 2955 | name = "webkit2gtk" 2956 | version = "0.18.0" 2957 | source = "registry+https://github.com/rust-lang/crates.io-index" 2958 | checksum = "29952969fb5e10fe834a52eb29ad0814ccdfd8387159b0933edf1344a1c9cdcc" 2959 | dependencies = [ 2960 | "bitflags", 2961 | "cairo-rs", 2962 | "gdk", 2963 | "gdk-sys", 2964 | "gio", 2965 | "gio-sys", 2966 | "glib", 2967 | "glib-sys", 2968 | "gobject-sys", 2969 | "gtk", 2970 | "gtk-sys", 2971 | "javascriptcore-rs", 2972 | "libc", 2973 | "once_cell", 2974 | "soup2", 2975 | "webkit2gtk-sys", 2976 | ] 2977 | 2978 | [[package]] 2979 | name = "webkit2gtk-sys" 2980 | version = "0.18.0" 2981 | source = "registry+https://github.com/rust-lang/crates.io-index" 2982 | checksum = "4d76ca6ecc47aeba01ec61e480139dda143796abcae6f83bcddf50d6b5b1dcf3" 2983 | dependencies = [ 2984 | "atk-sys", 2985 | "bitflags", 2986 | "cairo-sys-rs", 2987 | "gdk-pixbuf-sys", 2988 | "gdk-sys", 2989 | "gio-sys", 2990 | "glib-sys", 2991 | "gobject-sys", 2992 | "gtk-sys", 2993 | "javascriptcore-rs-sys", 2994 | "libc", 2995 | "pango-sys", 2996 | "pkg-config", 2997 | "soup2-sys", 2998 | "system-deps 6.0.2", 2999 | ] 3000 | 3001 | [[package]] 3002 | name = "webview2-com" 3003 | version = "0.16.0" 3004 | source = "registry+https://github.com/rust-lang/crates.io-index" 3005 | checksum = "a489a9420acabb3c2ed0434b6f71f6b56b9485ec32665a28dec1ee186d716e0f" 3006 | dependencies = [ 3007 | "webview2-com-macros", 3008 | "webview2-com-sys", 3009 | "windows 0.37.0", 3010 | "windows-implement", 3011 | ] 3012 | 3013 | [[package]] 3014 | name = "webview2-com-macros" 3015 | version = "0.6.0" 3016 | source = "registry+https://github.com/rust-lang/crates.io-index" 3017 | checksum = "eaebe196c01691db62e9e4ca52c5ef1e4fd837dcae27dae3ada599b5a8fd05ac" 3018 | dependencies = [ 3019 | "proc-macro2", 3020 | "quote", 3021 | "syn", 3022 | ] 3023 | 3024 | [[package]] 3025 | name = "webview2-com-sys" 3026 | version = "0.16.0" 3027 | source = "registry+https://github.com/rust-lang/crates.io-index" 3028 | checksum = "0258c53ee9adc0a4f8ba1c8c317588f7a58c7048a55b621d469ba75ab3709ca1" 3029 | dependencies = [ 3030 | "regex", 3031 | "serde", 3032 | "serde_json", 3033 | "thiserror", 3034 | "windows 0.37.0", 3035 | "windows-bindgen", 3036 | ] 3037 | 3038 | [[package]] 3039 | name = "winapi" 3040 | version = "0.3.9" 3041 | source = "registry+https://github.com/rust-lang/crates.io-index" 3042 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 3043 | dependencies = [ 3044 | "winapi-i686-pc-windows-gnu", 3045 | "winapi-x86_64-pc-windows-gnu", 3046 | ] 3047 | 3048 | [[package]] 3049 | name = "winapi-i686-pc-windows-gnu" 3050 | version = "0.4.0" 3051 | source = "registry+https://github.com/rust-lang/crates.io-index" 3052 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 3053 | 3054 | [[package]] 3055 | name = "winapi-util" 3056 | version = "0.1.5" 3057 | source = "registry+https://github.com/rust-lang/crates.io-index" 3058 | checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" 3059 | dependencies = [ 3060 | "winapi", 3061 | ] 3062 | 3063 | [[package]] 3064 | name = "winapi-x86_64-pc-windows-gnu" 3065 | version = "0.4.0" 3066 | source = "registry+https://github.com/rust-lang/crates.io-index" 3067 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 3068 | 3069 | [[package]] 3070 | name = "windows" 3071 | version = "0.32.0" 3072 | source = "registry+https://github.com/rust-lang/crates.io-index" 3073 | checksum = "fbedf6db9096bc2364adce0ae0aa636dcd89f3c3f2cd67947062aaf0ca2a10ec" 3074 | dependencies = [ 3075 | "windows_aarch64_msvc 0.32.0", 3076 | "windows_i686_gnu 0.32.0", 3077 | "windows_i686_msvc 0.32.0", 3078 | "windows_x86_64_gnu 0.32.0", 3079 | "windows_x86_64_msvc 0.32.0", 3080 | ] 3081 | 3082 | [[package]] 3083 | name = "windows" 3084 | version = "0.37.0" 3085 | source = "registry+https://github.com/rust-lang/crates.io-index" 3086 | checksum = "57b543186b344cc61c85b5aab0d2e3adf4e0f99bc076eff9aa5927bcc0b8a647" 3087 | dependencies = [ 3088 | "windows-implement", 3089 | "windows_aarch64_msvc 0.37.0", 3090 | "windows_i686_gnu 0.37.0", 3091 | "windows_i686_msvc 0.37.0", 3092 | "windows_x86_64_gnu 0.37.0", 3093 | "windows_x86_64_msvc 0.37.0", 3094 | ] 3095 | 3096 | [[package]] 3097 | name = "windows-bindgen" 3098 | version = "0.37.0" 3099 | source = "registry+https://github.com/rust-lang/crates.io-index" 3100 | checksum = "0bed7be31ade0af08fec9b5343e9edcc005d22b1f11859b8a59b24797f5858e8" 3101 | dependencies = [ 3102 | "windows-metadata", 3103 | "windows-tokens", 3104 | ] 3105 | 3106 | [[package]] 3107 | name = "windows-implement" 3108 | version = "0.37.0" 3109 | source = "registry+https://github.com/rust-lang/crates.io-index" 3110 | checksum = "67a1062e555f7d9d66fd1130ed4f7c6ec41a47529ee0850cd0e926d95b26bb14" 3111 | dependencies = [ 3112 | "syn", 3113 | "windows-tokens", 3114 | ] 3115 | 3116 | [[package]] 3117 | name = "windows-metadata" 3118 | version = "0.37.0" 3119 | source = "registry+https://github.com/rust-lang/crates.io-index" 3120 | checksum = "4f33f2b90a6664e369c41ab5ff262d06f048fc9685d9bf8a0e99a47750bb0463" 3121 | 3122 | [[package]] 3123 | name = "windows-sys" 3124 | version = "0.36.1" 3125 | source = "registry+https://github.com/rust-lang/crates.io-index" 3126 | checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2" 3127 | dependencies = [ 3128 | "windows_aarch64_msvc 0.36.1", 3129 | "windows_i686_gnu 0.36.1", 3130 | "windows_i686_msvc 0.36.1", 3131 | "windows_x86_64_gnu 0.36.1", 3132 | "windows_x86_64_msvc 0.36.1", 3133 | ] 3134 | 3135 | [[package]] 3136 | name = "windows-tokens" 3137 | version = "0.37.0" 3138 | source = "registry+https://github.com/rust-lang/crates.io-index" 3139 | checksum = "3263d25f1170419995b78ff10c06b949e8a986c35c208dc24333c64753a87169" 3140 | 3141 | [[package]] 3142 | name = "windows_aarch64_msvc" 3143 | version = "0.32.0" 3144 | source = "registry+https://github.com/rust-lang/crates.io-index" 3145 | checksum = "d8e92753b1c443191654ec532f14c199742964a061be25d77d7a96f09db20bf5" 3146 | 3147 | [[package]] 3148 | name = "windows_aarch64_msvc" 3149 | version = "0.36.1" 3150 | source = "registry+https://github.com/rust-lang/crates.io-index" 3151 | checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47" 3152 | 3153 | [[package]] 3154 | name = "windows_aarch64_msvc" 3155 | version = "0.37.0" 3156 | source = "registry+https://github.com/rust-lang/crates.io-index" 3157 | checksum = "2623277cb2d1c216ba3b578c0f3cf9cdebeddb6e66b1b218bb33596ea7769c3a" 3158 | 3159 | [[package]] 3160 | name = "windows_i686_gnu" 3161 | version = "0.32.0" 3162 | source = "registry+https://github.com/rust-lang/crates.io-index" 3163 | checksum = "6a711c68811799e017b6038e0922cb27a5e2f43a2ddb609fe0b6f3eeda9de615" 3164 | 3165 | [[package]] 3166 | name = "windows_i686_gnu" 3167 | version = "0.36.1" 3168 | source = "registry+https://github.com/rust-lang/crates.io-index" 3169 | checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6" 3170 | 3171 | [[package]] 3172 | name = "windows_i686_gnu" 3173 | version = "0.37.0" 3174 | source = "registry+https://github.com/rust-lang/crates.io-index" 3175 | checksum = "d3925fd0b0b804730d44d4b6278c50f9699703ec49bcd628020f46f4ba07d9e1" 3176 | 3177 | [[package]] 3178 | name = "windows_i686_msvc" 3179 | version = "0.32.0" 3180 | source = "registry+https://github.com/rust-lang/crates.io-index" 3181 | checksum = "146c11bb1a02615db74680b32a68e2d61f553cc24c4eb5b4ca10311740e44172" 3182 | 3183 | [[package]] 3184 | name = "windows_i686_msvc" 3185 | version = "0.36.1" 3186 | source = "registry+https://github.com/rust-lang/crates.io-index" 3187 | checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024" 3188 | 3189 | [[package]] 3190 | name = "windows_i686_msvc" 3191 | version = "0.37.0" 3192 | source = "registry+https://github.com/rust-lang/crates.io-index" 3193 | checksum = "ce907ac74fe331b524c1298683efbf598bb031bc84d5e274db2083696d07c57c" 3194 | 3195 | [[package]] 3196 | name = "windows_x86_64_gnu" 3197 | version = "0.32.0" 3198 | source = "registry+https://github.com/rust-lang/crates.io-index" 3199 | checksum = "c912b12f7454c6620635bbff3450962753834be2a594819bd5e945af18ec64bc" 3200 | 3201 | [[package]] 3202 | name = "windows_x86_64_gnu" 3203 | version = "0.36.1" 3204 | source = "registry+https://github.com/rust-lang/crates.io-index" 3205 | checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1" 3206 | 3207 | [[package]] 3208 | name = "windows_x86_64_gnu" 3209 | version = "0.37.0" 3210 | source = "registry+https://github.com/rust-lang/crates.io-index" 3211 | checksum = "2babfba0828f2e6b32457d5341427dcbb577ceef556273229959ac23a10af33d" 3212 | 3213 | [[package]] 3214 | name = "windows_x86_64_msvc" 3215 | version = "0.32.0" 3216 | source = "registry+https://github.com/rust-lang/crates.io-index" 3217 | checksum = "504a2476202769977a040c6364301a3f65d0cc9e3fb08600b2bda150a0488316" 3218 | 3219 | [[package]] 3220 | name = "windows_x86_64_msvc" 3221 | version = "0.36.1" 3222 | source = "registry+https://github.com/rust-lang/crates.io-index" 3223 | checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" 3224 | 3225 | [[package]] 3226 | name = "windows_x86_64_msvc" 3227 | version = "0.37.0" 3228 | source = "registry+https://github.com/rust-lang/crates.io-index" 3229 | checksum = "f4dd6dc7df2d84cf7b33822ed5b86318fb1781948e9663bacd047fc9dd52259d" 3230 | 3231 | [[package]] 3232 | name = "winres" 3233 | version = "0.1.12" 3234 | source = "registry+https://github.com/rust-lang/crates.io-index" 3235 | checksum = "b68db261ef59e9e52806f688020631e987592bd83619edccda9c47d42cde4f6c" 3236 | dependencies = [ 3237 | "toml", 3238 | ] 3239 | 3240 | [[package]] 3241 | name = "wry" 3242 | version = "0.19.0" 3243 | source = "registry+https://github.com/rust-lang/crates.io-index" 3244 | checksum = "ce19dddbd3ce01dc8f14eb6d4c8f914123bf8379aaa838f6da4f981ff7104a3f" 3245 | dependencies = [ 3246 | "block", 3247 | "cocoa", 3248 | "core-graphics", 3249 | "gdk", 3250 | "gio", 3251 | "glib", 3252 | "gtk", 3253 | "http", 3254 | "jni 0.18.0", 3255 | "libc", 3256 | "log", 3257 | "objc", 3258 | "objc_id", 3259 | "once_cell", 3260 | "serde", 3261 | "serde_json", 3262 | "tao", 3263 | "thiserror", 3264 | "url", 3265 | "webkit2gtk", 3266 | "webkit2gtk-sys", 3267 | "webview2-com", 3268 | "windows 0.37.0", 3269 | "windows-implement", 3270 | ] 3271 | 3272 | [[package]] 3273 | name = "x11" 3274 | version = "2.20.0" 3275 | source = "registry+https://github.com/rust-lang/crates.io-index" 3276 | checksum = "f7ae97874a928d821b061fce3d1fc52f08071dd53c89a6102bc06efcac3b2908" 3277 | dependencies = [ 3278 | "libc", 3279 | "pkg-config", 3280 | ] 3281 | 3282 | [[package]] 3283 | name = "x11-dl" 3284 | version = "2.20.0" 3285 | source = "registry+https://github.com/rust-lang/crates.io-index" 3286 | checksum = "0c83627bc137605acc00bb399c7b908ef460b621fc37c953db2b09f88c449ea6" 3287 | dependencies = [ 3288 | "lazy_static", 3289 | "libc", 3290 | "pkg-config", 3291 | ] 3292 | 3293 | [[package]] 3294 | name = "xattr" 3295 | version = "0.2.3" 3296 | source = "registry+https://github.com/rust-lang/crates.io-index" 3297 | checksum = "6d1526bbe5aaeb5eb06885f4d987bcdfa5e23187055de9b83fe00156a821fabc" 3298 | dependencies = [ 3299 | "libc", 3300 | ] 3301 | 3302 | [[package]] 3303 | name = "xml-rs" 3304 | version = "0.8.4" 3305 | source = "registry+https://github.com/rust-lang/crates.io-index" 3306 | checksum = "d2d7d3948613f75c98fd9328cfdcc45acc4d360655289d0a7d4ec931392200a3" 3307 | -------------------------------------------------------------------------------- /mfer-safe-desktop-app/src-tauri/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "app" 3 | version = "0.1.0" 4 | description = "MferSafe Desktop App" 5 | authors = ["dynm"] 6 | license = "" 7 | repository = "" 8 | default-run = "app" 9 | edition = "2021" 10 | rust-version = "1.57" 11 | 12 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 13 | 14 | [build-dependencies] 15 | tauri-build = { version = "1.0.2", features = [] } 16 | 17 | [dependencies] 18 | serde_json = "1.0" 19 | serde = { version = "1.0", features = ["derive"] } 20 | tauri = { version = "1.0.2", features = ["shell-sidecar"] } 21 | tokio = { version = "1", features = ["full"] } 22 | 23 | 24 | [features] 25 | # by default Tauri runs in production mode 26 | # when `tauri dev` runs it is executed with `cargo run --no-default-features` if `devPath` is an URL 27 | default = [ "custom-protocol" ] 28 | # this feature is used used for production builds where `devPath` points to the filesystem 29 | # DO NOT remove this 30 | custom-protocol = [ "tauri/custom-protocol" ] 31 | -------------------------------------------------------------------------------- /mfer-safe-desktop-app/src-tauri/build.rs: -------------------------------------------------------------------------------- 1 | fn main() { 2 | tauri_build::build() 3 | } 4 | -------------------------------------------------------------------------------- /mfer-safe-desktop-app/src-tauri/icons/128x128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sec-bit/mfer-safe/6584897af725796128315715a6877ecabb0e8b27/mfer-safe-desktop-app/src-tauri/icons/128x128.png -------------------------------------------------------------------------------- /mfer-safe-desktop-app/src-tauri/icons/128x128@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sec-bit/mfer-safe/6584897af725796128315715a6877ecabb0e8b27/mfer-safe-desktop-app/src-tauri/icons/128x128@2x.png -------------------------------------------------------------------------------- /mfer-safe-desktop-app/src-tauri/icons/32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sec-bit/mfer-safe/6584897af725796128315715a6877ecabb0e8b27/mfer-safe-desktop-app/src-tauri/icons/32x32.png -------------------------------------------------------------------------------- /mfer-safe-desktop-app/src-tauri/icons/Square107x107Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sec-bit/mfer-safe/6584897af725796128315715a6877ecabb0e8b27/mfer-safe-desktop-app/src-tauri/icons/Square107x107Logo.png -------------------------------------------------------------------------------- /mfer-safe-desktop-app/src-tauri/icons/Square142x142Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sec-bit/mfer-safe/6584897af725796128315715a6877ecabb0e8b27/mfer-safe-desktop-app/src-tauri/icons/Square142x142Logo.png -------------------------------------------------------------------------------- /mfer-safe-desktop-app/src-tauri/icons/Square150x150Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sec-bit/mfer-safe/6584897af725796128315715a6877ecabb0e8b27/mfer-safe-desktop-app/src-tauri/icons/Square150x150Logo.png -------------------------------------------------------------------------------- /mfer-safe-desktop-app/src-tauri/icons/Square284x284Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sec-bit/mfer-safe/6584897af725796128315715a6877ecabb0e8b27/mfer-safe-desktop-app/src-tauri/icons/Square284x284Logo.png -------------------------------------------------------------------------------- /mfer-safe-desktop-app/src-tauri/icons/Square30x30Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sec-bit/mfer-safe/6584897af725796128315715a6877ecabb0e8b27/mfer-safe-desktop-app/src-tauri/icons/Square30x30Logo.png -------------------------------------------------------------------------------- /mfer-safe-desktop-app/src-tauri/icons/Square310x310Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sec-bit/mfer-safe/6584897af725796128315715a6877ecabb0e8b27/mfer-safe-desktop-app/src-tauri/icons/Square310x310Logo.png -------------------------------------------------------------------------------- /mfer-safe-desktop-app/src-tauri/icons/Square44x44Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sec-bit/mfer-safe/6584897af725796128315715a6877ecabb0e8b27/mfer-safe-desktop-app/src-tauri/icons/Square44x44Logo.png -------------------------------------------------------------------------------- /mfer-safe-desktop-app/src-tauri/icons/Square71x71Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sec-bit/mfer-safe/6584897af725796128315715a6877ecabb0e8b27/mfer-safe-desktop-app/src-tauri/icons/Square71x71Logo.png -------------------------------------------------------------------------------- /mfer-safe-desktop-app/src-tauri/icons/Square89x89Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sec-bit/mfer-safe/6584897af725796128315715a6877ecabb0e8b27/mfer-safe-desktop-app/src-tauri/icons/Square89x89Logo.png -------------------------------------------------------------------------------- /mfer-safe-desktop-app/src-tauri/icons/StoreLogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sec-bit/mfer-safe/6584897af725796128315715a6877ecabb0e8b27/mfer-safe-desktop-app/src-tauri/icons/StoreLogo.png -------------------------------------------------------------------------------- /mfer-safe-desktop-app/src-tauri/icons/icon.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sec-bit/mfer-safe/6584897af725796128315715a6877ecabb0e8b27/mfer-safe-desktop-app/src-tauri/icons/icon.icns -------------------------------------------------------------------------------- /mfer-safe-desktop-app/src-tauri/icons/icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sec-bit/mfer-safe/6584897af725796128315715a6877ecabb0e8b27/mfer-safe-desktop-app/src-tauri/icons/icon.ico -------------------------------------------------------------------------------- /mfer-safe-desktop-app/src-tauri/icons/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sec-bit/mfer-safe/6584897af725796128315715a6877ecabb0e8b27/mfer-safe-desktop-app/src-tauri/icons/icon.png -------------------------------------------------------------------------------- /mfer-safe-desktop-app/src-tauri/src/main.rs: -------------------------------------------------------------------------------- 1 | #![cfg_attr( 2 | all(not(debug_assertions), target_os = "windows"), 3 | windows_subsystem = "windows" 4 | )] 5 | 6 | use serde::{Deserialize, Serialize}; 7 | use std::fs; 8 | use std::path::PathBuf; 9 | use std::sync::Mutex; 10 | use tauri::api::path::resolve_path; 11 | use tauri::api::path::BaseDirectory; 12 | use tauri::api::process::Command; 13 | use tauri::api::process::CommandChild; 14 | use tauri::api::process::CommandEvent; 15 | use tauri::Env; 16 | use tauri::Manager; 17 | use tokio::sync::mpsc; 18 | use tokio::sync::mpsc::Sender; 19 | 20 | #[derive(Debug)] 21 | struct SpawnApeNode { 22 | args: Mutex, 23 | child: Mutex>, 24 | tx: Sender, 25 | config_path: PathBuf, 26 | } 27 | 28 | impl SpawnApeNode { 29 | fn new( 30 | binary_path: String, 31 | args: ApeNodeArgs, 32 | tx: Sender, 33 | config_path: PathBuf, 34 | ) -> SpawnApeNode { 35 | let (mut rx, child) = Command::new_sidecar(&binary_path) 36 | .expect("failed to load sidecar binary") 37 | .args(args.to_args()) 38 | .spawn() 39 | .expect("failed to execute process"); 40 | let tx2 = tx.clone(); 41 | tauri::async_runtime::spawn(async move { 42 | while let Some(event) = rx.recv().await { 43 | tx2.send(event).await.unwrap(); 44 | } 45 | }); 46 | SpawnApeNode { 47 | child: Mutex::new(Some(child)), 48 | args: Mutex::new(args), 49 | tx, 50 | config_path, 51 | } 52 | } 53 | } 54 | 55 | #[derive(Serialize, Deserialize, Debug, Clone, Default)] 56 | struct ApeNodeArgs { 57 | impersonated_account: String, 58 | web3_rpc: String, 59 | listen_host_port: String, 60 | key_cache_file_path: String, 61 | log_file_path: String, 62 | batch_size: i64, 63 | } 64 | 65 | impl ApeNodeArgs { 66 | fn new(config_path: PathBuf) -> ApeNodeArgs { 67 | let args = ApeNodeArgs::default(); 68 | args.load_config(config_path) 69 | } 70 | 71 | fn to_args(&self) -> Vec { 72 | let mut args = Vec::new(); 73 | args.push("-account".to_string()); 74 | args.push(self.impersonated_account.clone()); 75 | args.push("-logpath".to_string()); 76 | args.push(self.log_file_path.clone()); 77 | args.push("-upstream".to_string()); 78 | args.push(self.web3_rpc.to_string()); 79 | args.push("-listen".to_string()); 80 | args.push(self.listen_host_port.to_string()); 81 | if !self.key_cache_file_path.is_empty() { 82 | args.push("-keycache".to_string()); 83 | args.push(self.key_cache_file_path.to_string()); 84 | } 85 | args.push("-batchsize".to_string()); 86 | args.push(self.batch_size.to_string()); 87 | args 88 | } 89 | 90 | fn load_config(&self, config_path: PathBuf) -> ApeNodeArgs { 91 | let default_config = ApeNodeArgs { 92 | impersonated_account: "0x0000000000000000000000000000000000000000".to_string(), 93 | web3_rpc: "https://rpc.ankr.com/eth".to_string(), 94 | listen_host_port: "127.0.0.1:10545".to_string(), 95 | key_cache_file_path: "".to_string(), 96 | log_file_path: "".to_string(), 97 | batch_size: 100, 98 | }; 99 | 100 | // let config_path = self.get_config_path(context); 101 | let config_str = std::fs::read_to_string(&config_path).unwrap_or_default(); 102 | let decoded: ApeNodeArgs = 103 | serde_json::from_str(config_str.as_str()).unwrap_or(default_config); 104 | decoded 105 | } 106 | 107 | fn save_config(&self, config_path: PathBuf) { 108 | if let Some(p) = config_path.parent() { 109 | match fs::create_dir_all(p) { 110 | Ok(_) => {} 111 | Err(e) => { 112 | println!("failed to create config directory: {}", e); 113 | } 114 | } 115 | }; 116 | let config = serde_json::to_string_pretty(&self).unwrap(); 117 | match fs::write(config_path, config) { 118 | Ok(_) => (), 119 | Err(e) => { 120 | println!("failed to write config: {}", e); 121 | } 122 | } 123 | } 124 | } 125 | 126 | const BIN_PATH: &'static str = "mfer-node"; 127 | 128 | #[tauri::command] 129 | fn restart_mfer_node( 130 | mfer_node_args: ApeNodeArgs, 131 | state: tauri::State<'_, SpawnApeNode>, 132 | app: tauri::AppHandle, 133 | ) -> bool { 134 | // println!("{:#?}, {:#?}", mfer_node_args, state); 135 | let child = state.child.lock().unwrap().take(); 136 | child.unwrap().kill().unwrap(); 137 | 138 | let args = mfer_node_args.to_args(); 139 | let (mut rx, child) = Command::new_sidecar(BIN_PATH.to_string()) 140 | .expect("failed to load sidecar binary") 141 | .args(args.clone()) 142 | .spawn() 143 | .expect("failed to execute process"); 144 | tauri::async_runtime::spawn(async move { 145 | while let Some(event) = rx.recv().await { 146 | let app_state = app.state::(); 147 | app_state.tx.clone().send(event).await.unwrap(); 148 | } 149 | }); 150 | mfer_node_args.save_config(state.config_path.clone()); 151 | *state.args.lock().unwrap() = mfer_node_args; 152 | *state.child.lock().unwrap() = Some(child); 153 | true 154 | } 155 | 156 | #[tauri::command] 157 | fn get_mfer_node_args(state: tauri::State<'_, SpawnApeNode>) -> ApeNodeArgs { 158 | state.args.lock().unwrap().clone() 159 | } 160 | 161 | fn main() { 162 | let (tx, mut rx) = mpsc::channel(1000); 163 | 164 | let context = tauri::generate_context!(); 165 | let config_path = resolve_path( 166 | context.config(), 167 | context.package_info(), 168 | &Env::default(), 169 | ".config/mfersafe.json", 170 | Some(BaseDirectory::Home), 171 | ) 172 | .expect("resolve path failed"); 173 | println!("config path: {:?}", config_path); 174 | 175 | let mfer_node_args = ApeNodeArgs::new(config_path.clone()); 176 | let mfer_node = SpawnApeNode::new( 177 | BIN_PATH.to_string(), 178 | mfer_node_args, 179 | tx.clone(), 180 | config_path.clone(), // just for saving config path 181 | ); 182 | 183 | tauri::Builder::default() 184 | .setup(|app| { 185 | let main_window = app.get_window("main").unwrap(); 186 | tauri::async_runtime::spawn(async move { 187 | while let Some(event) = rx.recv().await { 188 | match event { 189 | CommandEvent::Stdout(line) => { 190 | main_window 191 | .emit("mfernode-event", Some(format!("{:?}", line))) 192 | .expect("failed to emit event"); 193 | } 194 | CommandEvent::Stderr(line) => { 195 | main_window 196 | .emit("mfernode-event", Some(format!("StdErr: {:?}", line))) 197 | .expect("failed to emit event"); 198 | } 199 | unhandeled_line => { 200 | println!("unhandeled line: {:#?}", unhandeled_line); 201 | } 202 | } 203 | } 204 | }); 205 | Ok(()) 206 | }) 207 | .menu(if cfg!(target_os = "macos") { 208 | tauri::Menu::os_default(&context.package_info().name) 209 | } else { 210 | tauri::Menu::default() 211 | }) 212 | .manage(mfer_node) 213 | .invoke_handler(tauri::generate_handler![ 214 | restart_mfer_node, 215 | get_mfer_node_args, 216 | ]) 217 | .run(context) 218 | .expect("error while running tauri application"); 219 | } 220 | -------------------------------------------------------------------------------- /mfer-safe-desktop-app/src-tauri/tauri.conf.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "../node_modules/@tauri-apps/cli/schema.json", 3 | "build": { 4 | "beforeBuildCommand": "npm run build", 5 | "beforeDevCommand": "npm run start", 6 | "devPath": "http://localhost:3000", 7 | "distDir": "../build" 8 | }, 9 | "package": { 10 | "productName": "MferSafe", 11 | "version": "0.1.6" 12 | }, 13 | "tauri": { 14 | "allowlist": { 15 | "shell": { 16 | "sidecar": true, 17 | "scope": [ 18 | { 19 | "name": "bin/mfer-node", 20 | "sidecar": true 21 | } 22 | ] 23 | } 24 | }, 25 | "bundle": { 26 | "active": true, 27 | "category": "DeveloperTool", 28 | "copyright": "", 29 | "deb": { 30 | "depends": [] 31 | }, 32 | "externalBin": [ 33 | "bin/mfer-node" 34 | ], 35 | "icon": [ 36 | "icons/32x32.png", 37 | "icons/128x128.png", 38 | "icons/128x128@2x.png", 39 | "icons/icon.icns", 40 | "icons/icon.ico" 41 | ], 42 | "identifier": "xyz.donttrustverify.mfersafe", 43 | "longDescription": "", 44 | "macOS": { 45 | "entitlements": null, 46 | "exceptionDomain": "", 47 | "frameworks": [], 48 | "providerShortName": null, 49 | "signingIdentity": null 50 | }, 51 | "resources": [], 52 | "shortDescription": "", 53 | "targets": "all", 54 | "windows": { 55 | "certificateThumbprint": null, 56 | "digestAlgorithm": "sha256", 57 | "timestampUrl": "" 58 | } 59 | }, 60 | "security": { 61 | "csp": null 62 | }, 63 | "updater": { 64 | "active": false 65 | }, 66 | "windows": [ 67 | { 68 | "fullscreen": false, 69 | "height": 700, 70 | "resizable": true, 71 | "title": "MferSafe", 72 | "width": 800 73 | } 74 | ] 75 | } 76 | } -------------------------------------------------------------------------------- /mfer-safe-desktop-app/src/AbiEventForm.js: -------------------------------------------------------------------------------- 1 | import "./EventForm.css"; 2 | export default function AbiEventForm(props) { 3 | const event = props.event; 4 | return ( 5 |
6 |
7 |
Address
8 |
{event.address}
9 |
Name
10 |
{event.name}
11 |
Topics
12 |
13 |
    14 |
  1. 15 | {event.topics[0]} 16 |
  2. 17 | {event.topics.slice(1).map((topic) => { 18 | return
  3. {topic}
  4. ; 19 | })} 20 |
21 |
22 |
Data
23 |
24 |
31 | {event.data} 32 |
33 |
34 |
35 |
36 | ); 37 | } 38 | -------------------------------------------------------------------------------- /mfer-safe-desktop-app/src/App.css: -------------------------------------------------------------------------------- 1 | .App { 2 | text-align: center; 3 | } 4 | 5 | .App-logo { 6 | height: 40vmin; 7 | pointer-events: none; 8 | } 9 | 10 | @media (prefers-reduced-motion: no-preference) { 11 | .App-logo { 12 | animation: App-logo-spin infinite 20s linear; 13 | } 14 | } 15 | 16 | .App-header { 17 | background-color: #282c34; 18 | min-height: 100vh; 19 | display: flex; 20 | flex-direction: column; 21 | align-items: center; 22 | justify-content: center; 23 | font-size: calc(10px + 2vmin); 24 | color: white; 25 | } 26 | 27 | .App-link { 28 | color: #61dafb; 29 | } 30 | 31 | @keyframes App-logo-spin { 32 | from { 33 | transform: rotate(0deg); 34 | } 35 | to { 36 | transform: rotate(360deg); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /mfer-safe-desktop-app/src/App.js: -------------------------------------------------------------------------------- 1 | import "./App.css"; 2 | import * as React from "react"; 3 | import {useState, useEffect} from "react" 4 | 5 | import NavTabs from "./NavTabs"; 6 | import SimulateView from "./SimulateView"; 7 | import LogsView from "./LogsView"; 8 | import SettingsView from "./SettingsView"; 9 | import TxDataOverview from "./TxDataOverview"; 10 | import TraceView from "./TraceView"; 11 | import { BrowserRouter as Router, Routes, Route } from "react-router-dom"; 12 | import { listen } from "@tauri-apps/api/event"; 13 | 14 | function App() { 15 | const [log, setLog] = useState("") 16 | useEffect(() => { 17 | console.log("init tauri event listener") 18 | listen("mfernode-event", (event) => { 19 | if (event.payload !== undefined) { 20 | setLog((log) => { 21 | var logLines = log.split("\n").slice(0, 500); 22 | log = logLines.join("\n"); 23 | return event.payload + "\n" + log 24 | }); 25 | } 26 | }); 27 | }, []); 28 | return ( 29 | 30 |
31 | 32 | 33 | } /> 34 | } /> 35 | } /> 36 | } /> 37 | } /> 38 | 39 |
40 |
41 | ); 42 | } 43 | 44 | export default App; 45 | -------------------------------------------------------------------------------- /mfer-safe-desktop-app/src/App.test.js: -------------------------------------------------------------------------------- 1 | import { render, screen } from '@testing-library/react'; 2 | import App from './App'; 3 | 4 | test('renders learn react link', () => { 5 | render(); 6 | const linkElement = screen.getByText(/learn react/i); 7 | expect(linkElement).toBeInTheDocument(); 8 | }); 9 | -------------------------------------------------------------------------------- /mfer-safe-desktop-app/src/BalanceOverview.css: -------------------------------------------------------------------------------- 1 | /* Take from ethtx 2 | https://github.com/EthTx/ethtx_ce/blob/1c4eec6a4631fbc24029c1cc6633fdff3a3e9f73/ethtx_ce/app/frontend/static/ethtx.new.css#L59-L81 3 | */ 4 | 5 | h3 { 6 | margin: 11px; 7 | } 8 | 9 | .table { 10 | font-family: monospace; 11 | margin-left: 11px; 12 | border: solid 1px #bbbbbb; 13 | border-collapse: collapse; 14 | border-spacing: 0; 15 | } 16 | 17 | .table thead th { 18 | background-color: #ddd; 19 | border: solid 1px #bbbbbb; 20 | color: #444444; 21 | padding: 3px 10px 3px 10px; 22 | text-align: left; 23 | text-shadow: 1px 1px 1px #fff; 24 | } 25 | 26 | .table tbody td { 27 | border: solid 1px #bbbbbb; 28 | color: #333; 29 | padding: 3px 10px 3px 10px; 30 | text-shadow: 1px 1px 1px #fff; 31 | white-space: nowrap; 32 | } 33 | -------------------------------------------------------------------------------- /mfer-safe-desktop-app/src/BalanceOverview.js: -------------------------------------------------------------------------------- 1 | import * as React from "react"; 2 | import Box from "@mui/material/Box"; 3 | import { processEvents, convertToDecimalFormat } from "./processTokenTransfers.js" 4 | import "./BalanceOverview.css"; 5 | 6 | function makeBalanceChangeTable(balanceChange, tokenList) { 7 | const rows = []; 8 | var prevAccount = ""; 9 | for (const [account, tokenBalance] of Object.entries(balanceChange)) { 10 | for (const [token, balance] of Object.entries(tokenBalance)) { 11 | var addressOrSymbol = tokenList[token.toLocaleLowerCase()] ? tokenList[token.toLocaleLowerCase()].symbol : token; 12 | var balanceStr = tokenList[token.toLocaleLowerCase()] ? convertToDecimalFormat(balance, tokenList[token.toLocaleLowerCase()].decimals) : balance.toString(); 13 | rows.push( 14 | 15 | {account === prevAccount ? null : {account}} 16 | {addressOrSymbol} 17 | {balanceStr} 18 | 19 | ) 20 | prevAccount = account; 21 | } 22 | } 23 | return rows; 24 | } 25 | 26 | function Table(props) { 27 | const { columnNames, events, columnDictKeys, tokenList } = props; 28 | return ( 29 | 30 | 31 | 32 | {columnNames.map((name) => )} 33 | 34 | 35 | 36 | {events ? events.map((event) => { 37 | return ( 38 | 39 | { 40 | columnDictKeys.map((key) => { 41 | var tokenInfo = tokenList[event["token"].toLocaleLowerCase()]; 42 | switch (key) { 43 | case "token": 44 | var addressOrSymbol = tokenInfo ? tokenInfo.symbol : event[key]; 45 | return 46 | case "amount": 47 | if (event[key] === "infinite") { 48 | return 49 | } 50 | var balanceStr = tokenInfo ? convertToDecimalFormat(event[key], tokenInfo.decimals) : event[key].toString(); 51 | return 52 | default: 53 | return 54 | } 55 | }) 56 | } 57 | 58 | ) 59 | }) : null} 60 | 61 |
{name}
{addressOrSymbol}{event[key]}{balanceStr}{event[key]}
62 | ) 63 | } 64 | 65 | export default function BalanceOverview(props) { 66 | const events = processEvents(props.events); 67 | return ( 68 | 69 |
70 |

Balance Changes:

71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | {events.userTokenBalance ? makeBalanceChangeTable(events.userTokenBalance, props.tokenList) : null} 81 | 82 |
AccountTokenBalance
83 |
84 |
85 |

Token Transfers:

86 | 92 | 93 |
94 |

Token Approvals:

95 |
101 | 102 |
103 |

[NFT] Set Approval For All: ⚠️⚠️

104 |
110 | 111 |
112 |

[NFT] Transfers:

113 |
119 | 120 |
121 |

[NFT] Approvals:

122 |
128 | 129 | 130 | ); 131 | } 132 | -------------------------------------------------------------------------------- /mfer-safe-desktop-app/src/EventForm.css: -------------------------------------------------------------------------------- 1 | * { 2 | box-sizing: border-box; 3 | } 4 | 5 | body { 6 | margin: 0; 7 | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 8 | 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', 9 | sans-serif; 10 | -webkit-font-smoothing: antialiased; 11 | -moz-osx-font-smoothing: grayscale; 12 | } 13 | 14 | code { 15 | font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', 16 | monospace; 17 | } 18 | 19 | main { 20 | display: block; 21 | padding: 2rem; 22 | } 23 | 24 | section { 25 | display: block; 26 | margin-bottom: 2rem; 27 | } 28 | 29 | form { 30 | display: block; 31 | } 32 | 33 | label { 34 | display: block; 35 | } 36 | 37 | input[type='text'], 38 | textarea { 39 | width: 100%; 40 | } 41 | 42 | input[type='text']:read-only, 43 | textarea:read-only { 44 | background: #f4f4f4; 45 | } 46 | 47 | textarea { 48 | height: 200px; 49 | } 50 | 51 | pre { 52 | width: 100%; 53 | white-space: break-spaces; 54 | word-break: break-all; 55 | } 56 | 57 | footer { 58 | display: block; 59 | } 60 | 61 | fieldset { 62 | border: 1px solid black; 63 | margin-bottom: 1rem; 64 | } 65 | 66 | details { 67 | position: relative; 68 | min-height: 50px; 69 | } 70 | 71 | details .close { 72 | display: none; 73 | background: white; 74 | } 75 | 76 | details[open] .open { 77 | display: none; 78 | } 79 | 80 | details[open] .close { 81 | display: inline-block; 82 | } 83 | 84 | details > summary { 85 | width: 100%; 86 | list-style: none; 87 | cursor: pointer; 88 | position: absolute; 89 | min-height: 25px; 90 | } 91 | 92 | details > summary::marker { 93 | display: none; 94 | } 95 | 96 | dl { 97 | width: 100%; 98 | overflow: hidden; 99 | /* background: #ff0; */ 100 | padding: 0; 101 | margin: 10; 102 | font-family: monospace; 103 | } 104 | dt { 105 | text-align: right; 106 | float: left; 107 | width: 10%; 108 | /* adjust the width; make sure the total of both is 100% */ 109 | /* background: #cc0; */ 110 | padding: 0; 111 | padding-right:7.5px; 112 | margin: 0 113 | } 114 | dd { 115 | float: left; 116 | width: 90%; 117 | padding-left:7.5px; 118 | /* adjust the width; make sure the total of both is 100% */ 119 | /* background: #dd0; */ 120 | /* padding: 0; */ 121 | margin: 0; 122 | } 123 | ol{ 124 | margin-top: 0px; 125 | padding-left: 24px; 126 | margin-bottom: 0px; 127 | } -------------------------------------------------------------------------------- /mfer-safe-desktop-app/src/FieldSet.js: -------------------------------------------------------------------------------- 1 | export default function Fieldset(props) { 2 | const { legend, children } = props; 3 | return ( 4 |
5 | 6 | 7 | {legend} {"▾"} 8 | 9 | 10 |
11 | 12 | {legend} {"▴"} 13 | 14 | {children} 15 |
16 |
17 | ); 18 | } 19 | -------------------------------------------------------------------------------- /mfer-safe-desktop-app/src/LogsView.js: -------------------------------------------------------------------------------- 1 | import * as React from "react"; 2 | import TextareaAutosize from "@mui/material/TextareaAutosize"; 3 | 4 | export default function LogView(props) { 5 | const { log } = props; 6 | return ( 7 | 13 | ); 14 | } 15 | -------------------------------------------------------------------------------- /mfer-safe-desktop-app/src/NavTabs.js: -------------------------------------------------------------------------------- 1 | import * as React from "react"; 2 | import Box from "@mui/material/Box"; 3 | import Tabs from "@mui/material/Tabs"; 4 | import Tab from "@mui/material/Tab"; 5 | import { Link } from "react-router-dom"; 6 | import { docall } from "./utils.js"; 7 | 8 | import SettingsIcon from "@mui/icons-material/Settings"; 9 | import ListIcon from "@mui/icons-material/List"; 10 | import AccountBalanceWalletIcon from "@mui/icons-material/AccountBalanceWallet"; 11 | import SpeedDial from "@mui/material/SpeedDial"; 12 | import SpeedDialIcon from "@mui/material/SpeedDialIcon"; 13 | import SpeedDialAction from "@mui/material/SpeedDialAction"; 14 | // import ReplayIcon from "@mui/icons-material/Replay"; 15 | import AccountTreeIcon from '@mui/icons-material/AccountTree'; 16 | import DeleteForeverIcon from "@mui/icons-material/DeleteForever"; 17 | import ClearIcon from '@mui/icons-material/Clear'; 18 | import TerminalIcon from "@mui/icons-material/Terminal"; 19 | 20 | const actions = [ 21 | { 22 | icon: , 23 | name: "Rebase onto Latest State", 24 | onClick: () => { 25 | docall("mfer_reExecTxPool", []); 26 | }, 27 | }, 28 | { 29 | icon: , 30 | name: "Clear TxPool", 31 | onClick: () => { 32 | docall("mfer_clearTxPool", []); 33 | }, 34 | }, 35 | { 36 | icon: , 37 | name: "Clear Key Cache", 38 | onClick: () => { 39 | docall("mfer_clearKeyCache", []); 40 | }, 41 | }, 42 | ]; 43 | export default function NavTabs() { 44 | const [value, setValue] = React.useState(0); 45 | const handleChange = (event, newValue) => { 46 | setValue(newValue); 47 | }; 48 | 49 | return ( 50 | 51 | } 55 | direction="down" 56 | > 57 | {actions.map((action) => ( 58 | 64 | ))} 65 | 66 | 72 | } 74 | label="Settings" 75 | component={Link} 76 | to={"/"} 77 | /> 78 | } 80 | label="Transactions" 81 | component={Link} 82 | to={"/txs"} 83 | /> 84 | } 86 | label="Gnosis Safe" 87 | component={Link} 88 | to={"/safemultisend"} 89 | /> 90 | } 92 | label="Logs" 93 | component={Link} 94 | to={"/logs"} 95 | /> 96 | 97 | 98 | ); 99 | } 100 | -------------------------------------------------------------------------------- /mfer-safe-desktop-app/src/SettingsView.js: -------------------------------------------------------------------------------- 1 | import { React, useState, useCallback, useEffect, useMemo } from "react"; 2 | import Box from "@mui/material/Box"; 3 | import Stack from "@mui/material/Stack"; 4 | import TextField from "@mui/material/TextField"; 5 | import FormGroup from '@mui/material/FormGroup'; 6 | import FormControlLabel from '@mui/material/FormControlLabel'; 7 | import Checkbox from '@mui/material/Checkbox'; 8 | import { getMferNodeArgs, docall } from "./utils.js"; 9 | import SaveIcon from "@mui/icons-material/Save"; 10 | import ViewModuleIcon from "@mui/icons-material/ViewModule"; 11 | import FaceRetouchingNaturalIcon from "@mui/icons-material/FaceRetouchingNatural"; 12 | import PrintIcon from "@mui/icons-material/Print"; 13 | import InputAdornment from "@mui/material/InputAdornment"; 14 | import IconButton from "@mui/material/IconButton"; 15 | import LanIcon from "@mui/icons-material/Lan"; 16 | import MapIcon from "@mui/icons-material/Map"; 17 | import ConfirmationNumberIcon from "@mui/icons-material/ConfirmationNumber"; 18 | import MoreTimeIcon from "@mui/icons-material/MoreTime"; 19 | import FingerprintIcon from '@mui/icons-material/Fingerprint'; 20 | import { ethers } from "ethers"; 21 | import { invoke } from "@tauri-apps/api/tauri"; 22 | 23 | function IconButtonTextField(props) { 24 | return ( 25 | props.setState(e.target.value)} 29 | onKeyPress={(e) => { 30 | if (e.key === "Enter") { props.onClick() } 31 | } 32 | } 33 | label={props.label} 34 | InputProps={{ 35 | endAdornment: ( 36 | 37 | 38 | 39 | 40 | 41 | ), 42 | }} 43 | /> 44 | ); 45 | } 46 | 47 | export default function SettingsView() { 48 | const [impersonatedAccount, setImpersonatedAccount] = useState( 49 | "0x0000000000000000000000000000000000000000" 50 | ); 51 | const [faucetReceiver, setFaucetReceiver] = useState(""); 52 | 53 | const [web3Rpc, setWeb3RPC] = useState("ws://127.0.0.1:8546"); 54 | const [listenHostPort, setListenHostPort] = useState("127.0.0.1:10545"); 55 | const [batchSize, setBatchSize] = useState(100); 56 | const [blockNumberDelta, setBlockNumberDelta] = useState(0); 57 | const [blockTimeDelta, setBlockTimeDelta] = useState(0); 58 | const [chainID, setChainID] = useState("0x0"); 59 | const [keyCacheFilePath, setKeyCacheFilePath] = useState(""); 60 | const [addrRandomize, setAddrRandomize] = useState(false); 61 | const [passthrough, setPassthrough] = useState(true); 62 | 63 | useEffect(() => { 64 | getMferNodeArgs().then((args) => { 65 | // avoid Safari: "Fetch API cannot load due to access control checks" fill init arg 66 | setImpersonatedAccount(args.impersonated_account); 67 | 68 | setWeb3RPC(args.web3_rpc); 69 | setListenHostPort(args.listen_host_port); 70 | setKeyCacheFilePath(args.key_cache_file_path); 71 | setBatchSize(args.batch_size); 72 | }); 73 | 74 | // avoid Safari: "Fetch API cannot load due to access control checks" override after mfer-node is started 75 | docall("mfer_impersonatedAccount", []) 76 | .then((res) => res.json()) 77 | .then((result) => { 78 | setImpersonatedAccount(ethers.utils.getAddress(result.result)); 79 | }); 80 | 81 | docall("mfer_getBlockNumberDelta", []) 82 | .then((res) => res.json()) 83 | .then((result) => { 84 | setBlockNumberDelta(result.result); 85 | }); 86 | 87 | docall("mfer_getTimeDelta", []) 88 | .then((res) => res.json()) 89 | .then((result) => { 90 | setBlockTimeDelta(result.result); 91 | }); 92 | docall("eth_chainId", []) 93 | .then((res) => res.json()) 94 | .then((result) => { 95 | setChainID(result.result); 96 | }); 97 | 98 | docall("mfer_randAddrEnabled", []) 99 | .then((res) => res.json()) 100 | .then((result) => { 101 | setAddrRandomize(result.result); 102 | }); 103 | 104 | docall("mfer_passthroughEnabled", []) 105 | .then((res) => res.json()) 106 | .then((result) => { 107 | setPassthrough(result.result); 108 | }); 109 | }, []); 110 | 111 | const saveRPCSettings = useCallback(() => { 112 | let args = { 113 | mferNodeArgs: { 114 | impersonated_account: impersonatedAccount, 115 | web3_rpc: web3Rpc, 116 | listen_host_port: listenHostPort, 117 | key_cache_file_path: keyCacheFilePath, 118 | log_file_path: "", //empty string means stdout 119 | batch_size: Number(batchSize), 120 | }, 121 | }; 122 | console.log(args); 123 | invoke("restart_mfer_node", args); 124 | }, [ 125 | impersonatedAccount, 126 | web3Rpc, 127 | listenHostPort, 128 | keyCacheFilePath, 129 | batchSize, 130 | ]); 131 | 132 | const provider = useMemo(() => new ethers.providers.JsonRpcProvider("http://" + listenHostPort), [listenHostPort]) 133 | 134 | const impersonate = useCallback(() => { 135 | if (impersonatedAccount.endsWith(".eth")) { 136 | provider.resolveName(impersonatedAccount).then(address => { 137 | setImpersonatedAccount(address) 138 | docall("mfer_impersonate", [address]); 139 | }) 140 | } else { 141 | setImpersonatedAccount(impersonatedAccount) 142 | docall("mfer_impersonate", [impersonatedAccount]); 143 | } 144 | }, [impersonatedAccount, provider]); 145 | 146 | const printMoney = useCallback(() => { 147 | docall("mfer_printMoney", [faucetReceiver]); 148 | }, [faucetReceiver]); 149 | 150 | const setBatch = useCallback(() => { 151 | docall("mfer_setBatchSize", [Number(batchSize)]); 152 | }, [batchSize]); 153 | 154 | const setBNDelta = useCallback(() => { 155 | docall("mfer_setBlockNumberDelta", [Number(blockNumberDelta)]); 156 | }, [blockNumberDelta]); 157 | 158 | const setBTDelta = useCallback(() => { 159 | docall("mfer_setTimeDelta", [Number(blockTimeDelta)]); 160 | }, [blockTimeDelta]); 161 | 162 | const setCID = useCallback(() => { 163 | docall("mfer_overrideChainID", [chainID]); 164 | }, [chainID]); 165 | 166 | const setEnableRandAddr = (e) => { 167 | docall("mfer_toggleRandAddr", [e.target.checked]); 168 | setAddrRandomize(e.target.checked); 169 | }; 170 | 171 | const setPassthroughFunc = (e) => { 172 | docall("mfer_togglePassthrough", [e.target.checked]); 173 | setPassthrough(e.target.checked); 174 | }; 175 | 176 | return ( 177 | 188 | 196 | 197 | } label="Passthrough" /> 202 | } label="Randomize Address For Dapps" /> 207 | 208 | impersonate()} 214 | /> 215 | printMoney()} 221 | /> 222 | 223 | setBatch()} 229 | /> 230 | setCID()} 236 | /> 237 | 238 | 239 | setBNDelta()} 245 | /> 246 | setBTDelta()} 252 | /> 253 | 254 | 255 | saveRPCSettings()} 261 | /> 262 | 263 | saveRPCSettings()} 269 | /> 270 | saveRPCSettings()} 276 | /> 277 | 278 | 279 | ); 280 | } 281 | -------------------------------------------------------------------------------- /mfer-safe-desktop-app/src/SimulateView.js: -------------------------------------------------------------------------------- 1 | import { useState, useEffect } from "react"; 2 | import Button from "@mui/material/Button"; 3 | import Box from "@mui/material/Box"; 4 | import Stack from "@mui/material/Stack"; 5 | import TextField from "@mui/material/TextField"; 6 | import Checkbox from "@mui/material/Checkbox"; 7 | import FormGroup from "@mui/material/FormGroup"; 8 | import FormControl from "@mui/material/FormControl"; 9 | import FormLabel from "@mui/material/FormLabel"; 10 | import FormControlLabel from "@mui/material/FormControlLabel"; 11 | 12 | import ReactJson from "react-json-view"; 13 | import { docall } from "./utils.js"; 14 | 15 | import AbiEventForm from "./AbiEventForm.js"; 16 | import Fieldset from "./FieldSet.js"; 17 | 18 | import eventSignatures from "./eventSignatures.json"; 19 | 20 | import BalanceOverview from "./BalanceOverview.js"; 21 | import { loadTokenList } from "./processTokenTransfers.js" 22 | 23 | 24 | const simulate = (setTrace, participants) => { 25 | docall("mfer_simulateSafeExec", [participants]) 26 | .then((res) => res.json()) 27 | .then( 28 | (result) => { 29 | if (result.hasOwnProperty("result")) { 30 | if (result.result.hasOwnProperty("debugTrace")) { 31 | setTrace({ 32 | calltrace: result.result.debugTrace, 33 | approveInfo: { 34 | safeAddr: result.result.to, 35 | approveHashCalldata: result.result.approveHashCallData, 36 | dataHash: result.result.dataHash, 37 | execCalldata: result.result.multisendCalldata, 38 | revertError: result.result.revertError, 39 | }, 40 | eventLogs: result.result.eventLogs, 41 | }); 42 | } 43 | } 44 | }, 45 | (error) => { 46 | setTrace({ 47 | error, 48 | }); 49 | } 50 | ); 51 | }; 52 | 53 | function SimulateView() { 54 | const [callTrace, setCallTrace] = useState({ 55 | addresses: ["0x0000000000000000000000000000000000000000"], 56 | calltrace: {}, 57 | approveInfo: {}, 58 | owners: [], 59 | eventLogs: [], 60 | }); 61 | 62 | const [owners, setOwners] = useState({ owners: [], threshold: 0 }); 63 | const [checked, setChecked] = useState({}); 64 | const [participants, setParticipants] = useState([]); 65 | const [overrideSignature, setOverrideSignature] = useState({}); 66 | const [overridedExecCallData, setOverridedExecCallData] = useState(""); 67 | const [tokenList, setTokenList] = useState({}); 68 | 69 | useEffect(() => { 70 | docall("mfer_getSafeOwnersAndThreshold", []) 71 | .then((res) => res.json()) 72 | .then((result) => { 73 | console.log(result); 74 | setOwners(result.result); 75 | var checked = {}; 76 | result.result.owners.map((owner) => ( 77 | checked[owner] = false 78 | )); 79 | setChecked(checked); 80 | }) 81 | .catch((error) => { 82 | setOwners({ owners: [], threshold: -1 }); 83 | console.log(error); 84 | }); 85 | }, []); 86 | 87 | useEffect(() => { 88 | setTokenList(loadTokenList()); 89 | }, []); 90 | 91 | const handleChange = (event) => { 92 | var postState = { 93 | ...checked, 94 | [event.target.name]: event.target.checked, 95 | }; 96 | setChecked(postState); 97 | var p = []; 98 | for (const [key, value] of Object.entries(postState)) { 99 | if (value) { 100 | p.push(key); 101 | } 102 | } 103 | setParticipants(p); 104 | }; 105 | 106 | const error = participants.length !== owners.threshold; 107 | 108 | return ( 109 |
110 | 121 | 122 | 136 | 142 | 143 | Select {owners.threshold} Participants 144 | 145 | 146 | {owners.owners.map((owner, idx) => { 147 | return ( 148 | 156 | } 157 | label={owner} 158 | /> 159 | ); 160 | })} 161 | 162 | 163 | 164 |
165 | 173 |
174 | 182 | 193 | {participants.map((participant, idx) => { 194 | // console.log(participant); 195 | return { 201 | var sig = e.target.value; 202 | var newOverridedSig = { ...overrideSignature, [participant]: sig }; 203 | setOverrideSignature(newOverridedSig) 204 | // console.log("new overrided sig:",newOverridedSig); 205 | var toBeReplaced = callTrace.approveInfo.execCalldata 206 | for (const [p, sig] of Object.entries(newOverridedSig)) { 207 | if (!sig.startsWith("0x")) { 208 | setOverridedExecCallData(""); 209 | continue; 210 | } 211 | if (sig.length !== 132) { 212 | setOverridedExecCallData(""); 213 | continue; 214 | } 215 | // console.log("sig:",sig, "p:",p); 216 | // TODO: replace start at the end of the calldata 217 | var searchString = "000000000000000000000000" + p.slice(2) + "000000000000000000000000000000000000000000000000000000000000000001" 218 | toBeReplaced = toBeReplaced.replace(searchString, sig.slice(2)) 219 | } 220 | setOverridedExecCallData(toBeReplaced); 221 | } 222 | } 223 | size="small" />; 224 | })} 225 | 235 | 245 | 254 |
255 |
256 | 257 |
258 | {callTrace.eventLogs.map((event, idx) => { 259 | var eventName = eventSignatures[event.topics[0].slice(2)]; 260 | if (eventName === undefined) { 261 | eventName = "Topic Name Not Found"; 262 | } 263 | event.name = eventName; 264 | return ; 265 | })} 266 |
267 | 272 |
273 | ); 274 | } 275 | 276 | export default SimulateView; 277 | -------------------------------------------------------------------------------- /mfer-safe-desktop-app/src/TraceView.js: -------------------------------------------------------------------------------- 1 | import { useState, useEffect } from "react"; 2 | import { Buffer } from "buffer"; 3 | import ReactJson from "react-json-view"; 4 | 5 | import { docall } from "./utils.js"; 6 | import eventSignatures from "./eventSignatures.json"; 7 | import { useParams } from "react-router-dom"; 8 | 9 | import AbiEventForm from "./AbiEventForm.js"; 10 | import Fieldset from "./FieldSet.js"; 11 | 12 | function TraceView() { 13 | const [callTrace, setCallTrace] = useState({}); 14 | const [events, setEvents] = useState([{ name: "x", topics: [] }]); 15 | // const [fullTrace, setFullTrace] = useState({}); 16 | let { txHash } = useParams(); 17 | useEffect(() => { 18 | docall("eth_getTransactionReceipt", [txHash]) 19 | .then((res) => res.json()) 20 | .then( 21 | (result) => { 22 | if (result.hasOwnProperty("result")) { 23 | const logs = result.result.logs; 24 | const traceLog = logs[logs.length - 1]; 25 | const txEvents = logs.slice(0, logs.length - 1).map((log) => { 26 | var eventName = ""; 27 | if (log.topics.length > 0) { 28 | eventName = eventSignatures[log.topics[0].slice(2)]; 29 | if (eventName === undefined) { 30 | eventName = "Topic Name Not Found"; 31 | } 32 | } 33 | return { 34 | address: log.address, 35 | name: eventName, 36 | topics: log.topics, 37 | data: log.data, 38 | }; 39 | }); 40 | setEvents(txEvents); 41 | if ( 42 | !traceLog || 43 | traceLog.address !== "0x3fe75afe000000003fe75afe000000003fe75afe" 44 | ) { 45 | console.log("trace not found"); 46 | setCallTrace({ err: "Trace not found" }); 47 | } else { 48 | const traceJSON = Buffer.from( 49 | traceLog.data.replace("0x", ""), 50 | "hex" 51 | ).toString(); 52 | setCallTrace(JSON.parse(traceJSON)); 53 | } 54 | } else { 55 | setCallTrace({ err: "Trace not found" }); 56 | } 57 | }, 58 | (error) => { 59 | console.log(error); 60 | } 61 | ); 62 | }, [txHash]); 63 | 64 | return ( 65 |
66 |
67 | {events.map((event, idx) => { 68 | return ; 69 | })} 70 |
71 | 76 |
77 | ); 78 | } 79 | 80 | export default TraceView; 81 | -------------------------------------------------------------------------------- /mfer-safe-desktop-app/src/TxDataOverview.js: -------------------------------------------------------------------------------- 1 | import { React, useState, useEffect } from "react"; 2 | import { Link } from "react-router-dom"; 3 | import { docall } from "./utils.js"; 4 | import Box from "@mui/material/Box"; 5 | import { DataGrid } from "@mui/x-data-grid"; 6 | import functionSignatures from "./functionSignatures.json"; 7 | import BalanceOverview from "./BalanceOverview.js"; 8 | import { loadTokenList } from "./processTokenTransfers.js" 9 | 10 | 11 | const columns = [ 12 | { field: "id", headerName: "Index", width: 60 }, 13 | { 14 | field: "pseudoTxHash", 15 | headerName: "Pseudo Tx Hash", 16 | width: 300, 17 | renderCell: function (params) { 18 | return {params.value}; 19 | }, 20 | }, 21 | { field: "method", headerName: "Method (Guessed)", width: 200 }, 22 | { field: "selector", headerName: "Selector", width: 100 }, 23 | { field: "from", headerName: "From", width: 300 }, 24 | { field: "to", headerName: "To", width: 300 }, 25 | { field: "execResult", headerName: "Result", width: 500 }, 26 | ]; 27 | 28 | const genRows = function (txs, abiDict) { 29 | // debugger; 30 | if (txs.length === 0) { 31 | return []; 32 | } 33 | var rows = txs.map((txdata) => ({ 34 | id: txdata.idx, 35 | pseudoTxHash: txdata.pseudoTxHash, 36 | selector:txdata.calldata.slice(0,10), 37 | method: abiDict[txdata.calldata.slice(2,10)], 38 | from: txdata.from, 39 | to: txdata.to, 40 | execResult: txdata.execResult, 41 | })); 42 | return rows; 43 | }; 44 | 45 | const updateTxList = function (setRows, setEvents) { 46 | docall("mfer_getTxs", []) 47 | .then((res) => res.json()) 48 | .then( 49 | (result) => { 50 | var rows = genRows(result.result, functionSignatures); 51 | setRows(rows); 52 | }, 53 | (error) => { 54 | console.log(error); 55 | } 56 | ); 57 | docall("eth_getLogs", [{"blockhash":"0x445fd31bd4f3b47d5248cda491b447af5a0c4ed91b6dcd83ba0fb5e69526876d"}]) 58 | .then((res) => res.json()) 59 | .then( 60 | (result) => { 61 | setEvents(result.result); 62 | }, 63 | (error) => { 64 | console.log(error); 65 | } 66 | ); 67 | }; 68 | 69 | export default function TxDataOverview() { 70 | const [rows, setRows] = useState([]); 71 | const [events, setEvents] = useState([]); 72 | const [tokenList, setTokenList] = useState({}); 73 | useEffect(() => { 74 | updateTxList(setRows, setEvents); 75 | const interval = setInterval(() => { 76 | updateTxList(setRows,setEvents); 77 | }, 1000); 78 | return () => clearInterval(interval); 79 | }, []); 80 | 81 | useEffect(() => { 82 | setTokenList(loadTokenList()); 83 | }, []); 84 | 85 | return ( 86 | 87 | 95 | 96 | 97 | ); 98 | } 99 | -------------------------------------------------------------------------------- /mfer-safe-desktop-app/src/index.css: -------------------------------------------------------------------------------- 1 | body { 2 | margin: 0; 3 | font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", 4 | "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", 5 | sans-serif; 6 | -webkit-font-smoothing: antialiased; 7 | -moz-osx-font-smoothing: grayscale; 8 | } 9 | 10 | code { 11 | font-family: source-code-pro, Menlo, Monaco, Consolas, "Courier New", 12 | monospace; 13 | } 14 | 15 | html, 16 | body { 17 | /* width: 230px; */ 18 | } 19 | -------------------------------------------------------------------------------- /mfer-safe-desktop-app/src/index.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { createRoot } from "react-dom/client"; 3 | import "./index.css"; 4 | import App from "./App"; 5 | import reportWebVitals from "./reportWebVitals"; 6 | const container = document.getElementById("root"); 7 | const root = createRoot(container); // createRoot(container!) if you use TypeScript 8 | root.render(); 9 | 10 | // If you want to start measuring performance in your app, pass a function 11 | // to log results (for example: reportWebVitals(console.log)) 12 | // or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals 13 | reportWebVitals(); 14 | -------------------------------------------------------------------------------- /mfer-safe-desktop-app/src/logo.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /mfer-safe-desktop-app/src/processTokenTransfers.js: -------------------------------------------------------------------------------- 1 | import { ethers } from "ethers"; 2 | import sushiTokenList from "./sushi_token_list.json"; 3 | 4 | export function loadTokenList() { 5 | var tokenDict = {}; 6 | sushiTokenList.tokens.forEach(token => { 7 | tokenDict[token.address.toLowerCase()] = { 8 | "symbol": token.symbol, 9 | "name": token.name, 10 | "decimals": token.decimals 11 | }; 12 | }) 13 | return tokenDict; 14 | } 15 | 16 | export function convertToDecimalFormat(amount, decimals) { 17 | return ethers.utils.formatUnits(amount, decimals); 18 | } 19 | 20 | export function processEvents(events) { 21 | var obj; 22 | var amount; 23 | var tokenID; 24 | var approvalERC20Events = []; 25 | var approvalERC721Events = []; 26 | var approvalForAllEvents = []; 27 | var transferERC20Events = []; 28 | var transferERC721Events = []; 29 | var userTokenBalance = {}; 30 | // var callValue = []; 31 | var processedEvents = { 32 | "approvalERC20Events": approvalERC20Events, 33 | "approvalERC721Events": approvalERC721Events, 34 | "approvalForAllEvents": approvalForAllEvents, 35 | "transferERC20Events": transferERC20Events, 36 | "transferERC721Events": transferERC721Events, 37 | "userTokenBalance": userTokenBalance, 38 | }; 39 | 40 | const namedtopics = { 41 | "Approval": "0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925", 42 | "Transfer": "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", 43 | "ApprovalForAll": "0x17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31", 44 | } 45 | 46 | for (var i = 0; i < events.length; i++) { 47 | var event = events[i]; 48 | if (event.topics === undefined || event.topics.length < 1) { 49 | continue 50 | } 51 | 52 | switch (event.topics[0]) { 53 | case namedtopics.Transfer: 54 | obj = { 55 | "token": event.address, 56 | "from": "0x" + event.topics[1].slice(-40), 57 | "to": "0x" + event.topics[2].slice(-40), 58 | } 59 | switch (event.topics.length) { 60 | // ERC20 61 | case 3: 62 | amount = ethers.BigNumber.from(event.data); 63 | obj["amount"] = ethers.BigNumber.from(event.data).toString(); 64 | transferERC20Events.push(obj); 65 | userTokenBalance[obj.from] = userTokenBalance[obj.from] || {}; 66 | userTokenBalance[obj.to] = userTokenBalance[obj.to] || {}; 67 | userTokenBalance[obj.from][obj.token] = userTokenBalance[obj.from][obj.token] || ethers.BigNumber.from(0); 68 | userTokenBalance[obj.to][obj.token] = userTokenBalance[obj.to][obj.token] || ethers.BigNumber.from(0); 69 | userTokenBalance[obj.from][obj.token] = userTokenBalance[obj.from][obj.token].sub(amount); 70 | userTokenBalance[obj.to][obj.token] = userTokenBalance[obj.to][obj.token].add(amount); 71 | break; 72 | // ERC721 73 | case 4: 74 | tokenID = ethers.BigNumber.from(event.topics[3]) 75 | // assume token id is hash, use hex format 76 | obj["tokenID"] = tokenID.shr(128).eq(0) ? tokenID.toString() : event.topics[3] 77 | transferERC721Events.push(obj); 78 | break; 79 | default: 80 | } 81 | break; 82 | case namedtopics.Approval: 83 | obj = { 84 | "token": event.address, 85 | "owner": "0x" + event.topics[1].slice(-40), 86 | "spender": "0x" + event.topics[2].slice(-40), 87 | } 88 | switch (event.topics.length) { 89 | // ERC20 90 | case 3: 91 | amount = ethers.BigNumber.from(event.data); 92 | // assume above 2**254 is infinite 93 | obj["amount"] = amount.shr(254).eq(0) ? ethers.BigNumber.from(event.data).toString() : "infinite"; 94 | approvalERC20Events.push(obj); 95 | break; 96 | // ERC721 97 | case 4: 98 | tokenID = ethers.BigNumber.from(event.topics[3]) 99 | // assume token id is hash, use hex format 100 | obj["tokenID"] = tokenID.shr(128).eq(0) ? tokenID.toString() : event.topics[3] 101 | approvalERC721Events.push(obj); 102 | break; 103 | default: 104 | } 105 | break; 106 | case namedtopics.ApprovalForAll: 107 | obj = { 108 | "token": event.address, 109 | "owner": "0x" + event.topics[1].slice(-40), 110 | "operator": "0x" + event.topics[2].slice(-40), 111 | "approved": event.data !== "0x0000000000000000000000000000000000000000000000000000000000000000"? "YES" : "NO", 112 | } 113 | approvalForAllEvents.push(obj); 114 | break; 115 | default: 116 | } 117 | } 118 | return processedEvents; 119 | } -------------------------------------------------------------------------------- /mfer-safe-desktop-app/src/react-app-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /mfer-safe-desktop-app/src/reportWebVitals.js: -------------------------------------------------------------------------------- 1 | const reportWebVitals = onPerfEntry => { 2 | if (onPerfEntry && onPerfEntry instanceof Function) { 3 | import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => { 4 | getCLS(onPerfEntry); 5 | getFID(onPerfEntry); 6 | getFCP(onPerfEntry); 7 | getLCP(onPerfEntry); 8 | getTTFB(onPerfEntry); 9 | }); 10 | } 11 | }; 12 | 13 | export default reportWebVitals; 14 | -------------------------------------------------------------------------------- /mfer-safe-desktop-app/src/setupTests.js: -------------------------------------------------------------------------------- 1 | // jest-dom adds custom jest matchers for asserting on DOM nodes. 2 | // allows you to do things like: 3 | // expect(element).toHaveTextContent(/react/i) 4 | // learn more: https://github.com/testing-library/jest-dom 5 | import '@testing-library/jest-dom'; 6 | -------------------------------------------------------------------------------- /mfer-safe-desktop-app/src/utils.js: -------------------------------------------------------------------------------- 1 | // import { fetch } from '@tauri-apps/api/http'; 2 | 3 | import { invoke } from "@tauri-apps/api/tauri"; 4 | 5 | export async function getMferNodeArgs() { 6 | const args = await invoke("get_mfer_node_args"); 7 | return args; 8 | } 9 | export async function docall(cmd, params) { 10 | var body = { 11 | jsonrpc: "2.0", 12 | id: 123, 13 | method: cmd, 14 | params: params, 15 | }; 16 | var args = await getMferNodeArgs(); 17 | console.log("RPC:", args.listen_host_port); 18 | var rpcURL = "http://" + args.listen_host_port; 19 | var ret = fetch(rpcURL, { 20 | headers: { 21 | accept: "*/*", 22 | "content-type": "application/json", 23 | }, 24 | body: JSON.stringify(body), 25 | method: "POST", 26 | }); 27 | return ret; 28 | } 29 | -------------------------------------------------------------------------------- /preprocess_4bytes.js: -------------------------------------------------------------------------------- 1 | const fs = require("fs"); 2 | const path = require("path"); 3 | const sigFolder = "4bytes/signatures"; 4 | const sigHashes = fs.readdirSync(sigFolder); 5 | var processedSignature = {}; 6 | process.stdout.write("Processing signatures...\n"); 7 | sigHashes.forEach((name,idx) => { 8 | var result = fs.readFileSync(path.join(sigFolder, name)); 9 | processedSignature[name] = result.toString().replace("\n", ";"); 10 | process.stdout.write("("+idx+"/"+sigHashes.length+")"+"\r"); 11 | }); 12 | process.stdout.write("\nDone\n"); 13 | 14 | fs.writeFileSync( 15 | path.join("mfer-safe-desktop-app", "src", "functionSignatures.json"), 16 | JSON.stringify(processedSignature) 17 | ); 18 | -------------------------------------------------------------------------------- /preprocess_topic0.js: -------------------------------------------------------------------------------- 1 | const fs = require("fs"); 2 | const path = require("path"); 3 | const sigFolder = "topic0/signatures"; 4 | const sigHashes = fs.readdirSync(sigFolder); 5 | var processedSignature = {}; 6 | sigHashes.forEach((name) => { 7 | var result = fs.readFileSync(path.join(sigFolder, name)); 8 | processedSignature[name] = result.toString().replace("\n", ""); 9 | }); 10 | 11 | fs.writeFileSync( 12 | path.join("mfer-safe-desktop-app", "src", "eventSignatures.json"), 13 | JSON.stringify(processedSignature) 14 | ); 15 | --------------------------------------------------------------------------------