diff --git a/.cargo/config.toml b/.cargo/config.toml index b707df9d..0c1c209f 100644 --- a/.cargo/config.toml +++ b/.cargo/config.toml @@ -1,6 +1,2 @@ [target.armv7-unknown-linux-gnueabihf] linker = "arm-linux-gnueabihf-gcc" - -# windows defaults to smaller stack sizes which isn't enough -[target.'cfg(windows)'] -rustflags = ["-C", "link-args=/STACK:8388608"] diff --git a/.github/workflows/build-release-binaries.yml b/.github/workflows/build-release-binaries.yml index 2fdaabdc..662e3a5e 100644 --- a/.github/workflows/build-release-binaries.yml +++ b/.github/workflows/build-release-binaries.yml @@ -54,12 +54,12 @@ jobs: runs-on: ${{ matrix.os }} steps: - name: Checkout tagged commit - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4.1.7 with: ref: ${{ github.event.release.target_commitish }} token: ${{ secrets.BOTTY_GITHUB_TOKEN }} - - uses: Swatinem/rust-cache@v2.7.5 + - uses: Swatinem/rust-cache@v2.7.3 - uses: dtolnay/rust-toolchain@master with: diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index eda55e3e..b3f742fc 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -11,14 +11,14 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout sources - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4.1.7 - uses: dtolnay/rust-toolchain@master with: toolchain: "1.74" components: clippy,rustfmt - - uses: Swatinem/rust-cache@v2.7.5 + - uses: Swatinem/rust-cache@v2.7.3 - name: Check formatting uses: dprint/check@v2.2 @@ -35,9 +35,9 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout sources - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4.1.7 - - uses: Swatinem/rust-cache@v2.7.5 + - uses: Swatinem/rust-cache@v2.7.3 - name: Build swap run: cargo build --bin swap @@ -49,9 +49,9 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout sources - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4.1.7 - - uses: Swatinem/rust-cache@v2.7.5 + - uses: Swatinem/rust-cache@v2.7.3 - name: Install sqlx-cli run: cargo install --locked --version 0.6.3 sqlx-cli @@ -78,9 +78,9 @@ jobs: runs-on: ${{ matrix.os }} steps: - name: Checkout sources - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4.1.7 - - uses: Swatinem/rust-cache@v2.7.5 + - uses: Swatinem/rust-cache@v2.7.3 - uses: dtolnay/rust-toolchain@master with: @@ -131,9 +131,9 @@ jobs: tool-cache: false - name: Checkout sources - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4.1.7 - - uses: Swatinem/rust-cache@v2.7.5 + - uses: Swatinem/rust-cache@v2.7.3 - name: Build tests run: cargo build --tests --workspace --all-features @@ -171,9 +171,9 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout sources - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4.1.7 - - uses: Swatinem/rust-cache@v2.7.5 + - uses: Swatinem/rust-cache@v2.7.3 - name: Run test ${{ matrix.test_name }} run: cargo test --package swap --all-features --test ${{ matrix.test_name }} -- --nocapture @@ -182,9 +182,9 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout sources - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4.1.7 - - uses: Swatinem/rust-cache@v2.7.5 + - uses: Swatinem/rust-cache@v2.7.3 - name: Run RPC server tests run: cargo test --package swap --all-features --test rpc -- --nocapture @@ -193,11 +193,11 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout sources - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4.1.7 - uses: dtolnay/rust-toolchain@stable - - uses: Swatinem/rust-cache@v2.7.5 + - uses: Swatinem/rust-cache@v2.7.3 - name: Run cargo check on stable rust run: cargo check --all-targets diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index 3dcd492d..443c4418 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -11,7 +11,7 @@ jobs: if: github.event.pull_request.merged == true && startsWith(github.event.pull_request.head.ref, 'release/') runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4.2.1 + - uses: actions/checkout@v4.1.7 - name: Extract version from branch name id: extract-version diff --git a/.github/workflows/draft-new-release.yml b/.github/workflows/draft-new-release.yml index bd926d53..74ff34ba 100644 --- a/.github/workflows/draft-new-release.yml +++ b/.github/workflows/draft-new-release.yml @@ -12,7 +12,7 @@ jobs: name: "Draft a new release" runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4.2.1 + - uses: actions/checkout@v4.1.7 with: token: ${{ secrets.BOTTY_GITHUB_TOKEN }} @@ -20,7 +20,7 @@ jobs: run: git checkout -b release/${{ github.event.inputs.version }} - name: Update changelog - uses: thomaseizinger/keep-a-changelog-new-release@3.1.0 + uses: thomaseizinger/keep-a-changelog-new-release@3.0.0 with: version: ${{ github.event.inputs.version }} changelogPath: CHANGELOG.md diff --git a/.github/workflows/preview-release.yml b/.github/workflows/preview-release.yml index b216d283..ccd7e641 100644 --- a/.github/workflows/preview-release.yml +++ b/.github/workflows/preview-release.yml @@ -10,7 +10,7 @@ jobs: name: Create preview release runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4.2.1 + - uses: actions/checkout@v4.1.7 - name: Delete 'preview' release uses: larryjoelane/delete-release-action@v1.0.24 diff --git a/CHANGELOG.md b/CHANGELOG.md index c22e533e..bb8e53e6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,9 +7,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] -- ASB + CLI: You can now use the `logs` command to retrieve logs stored in the past, redacting addresses and id's using `logs --redact`. -- ASB: The `--disable-timestamp` flag has been removed - ## [0.13.4] - 2024-07-25 - ASB: The `history` command can now be used while the asb is running. diff --git a/Cargo.lock b/Cargo.lock index c31fffba..6ef8e322 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -78,15 +78,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "aho-corasick" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" -dependencies = [ - "memchr", -] - [[package]] name = "ansi_term" version = "0.11.0" @@ -107,9 +98,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.91" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c042108f3ed77fd83760a5fd79b53be043192bb3b9dba91d8c574c0ada7850c8" +checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" [[package]] name = "arrayref" @@ -163,13 +154,13 @@ dependencies = [ [[package]] name = "async-trait" -version = "0.1.83" +version = "0.1.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" +checksum = "6e0c28dcc82d7c8ead5cb13beb15405b57b8546e93215673ff8ca0349a028107" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.46", ] [[package]] @@ -752,7 +743,7 @@ dependencies = [ "nom", "pathdiff", "serde", - "toml 0.8.19", + "toml 0.8.15", ] [[package]] @@ -1224,9 +1215,9 @@ checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" [[package]] name = "fastrand" -version = "2.1.1" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" +checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" [[package]] name = "filetime" @@ -1310,9 +1301,9 @@ dependencies = [ [[package]] name = "futures" -version = "0.3.31" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" dependencies = [ "futures-channel", "futures-core", @@ -1325,9 +1316,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.31" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" dependencies = [ "futures-core", "futures-sink", @@ -1335,15 +1326,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.31" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" +checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" [[package]] name = "futures-executor" -version = "0.3.31" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" dependencies = [ "futures-core", "futures-task", @@ -1364,19 +1355,19 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.31" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" +checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" [[package]] name = "futures-macro" -version = "0.3.31" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.46", ] [[package]] @@ -1392,15 +1383,15 @@ dependencies = [ [[package]] name = "futures-sink" -version = "0.3.31" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" +checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" [[package]] name = "futures-task" -version = "0.3.31" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" +checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" [[package]] name = "futures-timer" @@ -1410,9 +1401,9 @@ checksum = "e64b03909df88034c26dc1547e8970b91f98bdb65165d6a4e9110d94263dbb2c" [[package]] name = "futures-util" -version = "0.3.31" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" dependencies = [ "futures-channel", "futures-core", @@ -1509,7 +1500,7 @@ version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "029d74589adefde59de1a0c4f4732695c32805624aec7b68d91503d4dba79afc" dependencies = [ - "aho-corasick 0.7.18", + "aho-corasick", "bstr", "fnv", "log", @@ -1772,9 +1763,9 @@ dependencies = [ [[package]] name = "hyper" -version = "1.5.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbbff0a806a4728c99295b254c8838933b5b082d75e3cb70c8dab21fdfbcfa9a" +checksum = "50dfd22e0e76d0f662d429a5f80fcaf3855009297eab6a0a9f8543834744ba05" dependencies = [ "bytes", "futures-channel", @@ -1783,7 +1774,6 @@ dependencies = [ "http 1.0.0", "http-body 1.0.0", "httparse", - "httpdate", "itoa", "pin-project-lite 0.2.13", "smallvec", @@ -1799,7 +1789,7 @@ checksum = "5ee4be2c948921a1a5320b629c4193916ed787a7f7f293fd3f7f5a6c9de74155" dependencies = [ "futures-util", "http 1.0.0", - "hyper 1.5.0", + "hyper 1.4.1", "hyper-util", "rustls 0.23.10", "rustls-pki-types", @@ -1820,7 +1810,7 @@ dependencies = [ "futures-util", "http 1.0.0", "http-body 1.0.0", - "hyper 1.5.0", + "hyper 1.4.1", "pin-project-lite 0.2.13", "socket2 0.5.5", "tokio", @@ -1915,7 +1905,7 @@ dependencies = [ "socket2 0.3.19", "widestring", "winapi", - "winreg", + "winreg 0.6.2", ] [[package]] @@ -2132,9 +2122,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.159" +version = "0.2.153" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "561d97a539a36e26a9a5fad1ea11a3039a67714694aaa379433e580854bc3dc5" +checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" [[package]] name = "libgit2-sys" @@ -2468,9 +2458,9 @@ checksum = "7fb9b38af92608140b86b693604b9ffcc5824240a484d1ecd4795bacb2fe88f3" [[package]] name = "linux-raw-sys" -version = "0.4.14" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" +checksum = "c4cd1a83af159aa67994778be9070f0ae1bd732942279cabb14f86f986a21456" [[package]] name = "lock_api" @@ -2517,7 +2507,7 @@ version = "0.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f099785f7595cc4b4553a174ce30dd7589ef93391ff414dbb67f62392b9e0ce1" dependencies = [ - "regex-automata 0.1.9", + "regex-automata", ] [[package]] @@ -2526,7 +2516,7 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" dependencies = [ - "regex-automata 0.1.9", + "regex-automata", ] [[package]] @@ -2603,19 +2593,14 @@ dependencies = [ [[package]] name = "mockito" -version = "1.5.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09b34bd91b9e5c5b06338d392463e1318d683cf82ec3d3af4014609be6e2108d" +checksum = "d2f6e023aa5bdf392aa06c78e4a4e6d498baab5138d0c993503350ebbc37bf1e" dependencies = [ "assert-json-diff", - "bytes", "colored", - "futures-util", - "http 1.0.0", - "http-body 1.0.0", - "http-body-util", - "hyper 1.5.0", - "hyper-util", + "futures-core", + "hyper 0.14.28", "log", "rand 0.8.3", "regex", @@ -2662,7 +2647,7 @@ dependencies = [ "testcontainers", "tokio", "tracing", - "tracing-subscriber 0.3.18", + "tracing-subscriber 0.2.25", ] [[package]] @@ -2848,9 +2833,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.20.2" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "opaque-debug" @@ -3156,9 +3141,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.87" +version = "1.0.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3e4daa0dcf6feba26f985457cdf104d4b4256fc5a09547140f3631bb076b19a" +checksum = "2de98502f212cfcea8d0bb305bd0f49d7ebdd75b64ba0a68f937d888f4e0d6db" dependencies = [ "unicode-ident", ] @@ -3177,7 +3162,7 @@ dependencies = [ "rand 0.8.3", "rand_chacha 0.3.1", "rand_xorshift", - "regex-syntax 0.8.5", + "regex-syntax 0.8.2", "rusty-fork", "tempfile", "unarray", @@ -3458,14 +3443,13 @@ dependencies = [ [[package]] name = "regex" -version = "1.11.0" +version = "1.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38200e5ee88914975b69f657f0801b6f6dccafd44fd9326302a4aaeecfacb1d8" +checksum = "8b1f693b24f6ac912f4893ef08244d70b6067480d2f1a46e950c9691e6749d1d" dependencies = [ - "aho-corasick 1.1.3", + "aho-corasick", "memchr", - "regex-automata 0.4.8", - "regex-syntax 0.8.5", + "regex-syntax 0.6.29", ] [[package]] @@ -3478,17 +3462,6 @@ dependencies = [ "regex-syntax 0.6.29", ] -[[package]] -name = "regex-automata" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" -dependencies = [ - "aho-corasick 1.1.3", - "memchr", - "regex-syntax 0.8.5", -] - [[package]] name = "regex-syntax" version = "0.6.29" @@ -3497,9 +3470,9 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" -version = "0.8.5" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" +checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" [[package]] name = "rend" @@ -3512,9 +3485,9 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.12.8" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f713147fbe92361e52392c73b8c9e48c04c6625bce969ef54dc901e58e042a7b" +checksum = "c7d6d2a27d57148378eb5e111173f4276ad26340ecc5c49a4a2152167a2d6a37" dependencies = [ "base64 0.22.1", "bytes", @@ -3524,7 +3497,7 @@ dependencies = [ "http 1.0.0", "http-body 1.0.0", "http-body-util", - "hyper 1.5.0", + "hyper 1.4.1", "hyper-rustls", "hyper-util", "ipnet", @@ -3553,7 +3526,7 @@ dependencies = [ "wasm-streams", "web-sys", "webpki-roots 0.26.1", - "windows-registry", + "winreg 0.52.0", ] [[package]] @@ -3677,9 +3650,9 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.37" +version = "0.38.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8acb788b847c24f28525660c4d7758620a7210875711f79e7f663cc152726811" +checksum = "6ea3e1a662af26cd7a3ba09c0297a31af215563ecf42817c98df621387f4e949" dependencies = [ "bitflags 2.4.0", "errno", @@ -4022,9 +3995,9 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.210" +version = "1.0.204" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" +checksum = "bc76f558e0cbb2a839d37354c575f1dc3fdc6546b5be373ba43d95f231bf7c12" dependencies = [ "serde_derive", ] @@ -4051,32 +4024,31 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.210" +version = "1.0.204" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" +checksum = "e0cd7e117be63d3c3678776753929474f3b04a43a080c744d6b0ae2a8c28e222" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.46", ] [[package]] name = "serde_json" -version = "1.0.132" +version = "1.0.118" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03" +checksum = "d947f6b3163d8857ea16c4fa0dd4840d52f3041039a85decd46867eb1abef2e4" dependencies = [ "itoa", - "memchr", "ryu", "serde", ] [[package]] name = "serde_spanned" -version = "0.6.7" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb5b1b31579f3811bf615c144393417496f152e12ac8b7663bf664f4a815306d" +checksum = "79e674e01f999af37c49f70a6ede167a8a60b2503e56c5599532a65baa5969a0" dependencies = [ "serde", ] @@ -4137,7 +4109,7 @@ checksum = "82fe9db325bcef1fbcde82e078a5cc4efdf787e96b3b9cf45b50b529f2083d67" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.46", ] [[package]] @@ -4526,7 +4498,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.79", + "syn 2.0.46", ] [[package]] @@ -4569,7 +4541,7 @@ dependencies = [ "futures", "get-port", "hex", - "hyper 1.5.0", + "hyper 1.4.1", "itertools 0.13.0", "jsonrpsee", "jsonrpsee-core", @@ -4578,14 +4550,12 @@ dependencies = [ "monero", "monero-harness", "monero-rpc", - "once_cell", "pem", "port_check", "proptest", "qrcode", "rand 0.8.3", "rand_chacha 0.3.1", - "regex", "reqwest", "rust_decimal", "rust_decimal_macros", @@ -4609,7 +4579,7 @@ dependencies = [ "tokio-tar", "tokio-tungstenite", "tokio-util", - "toml 0.8.19", + "toml 0.8.15", "torut", "tracing", "tracing-appender", @@ -4635,9 +4605,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.79" +version = "2.0.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89132cd0bf050864e1d38dc3bbc07a0eb8e7530af26344d3d2bbbef83499f590" +checksum = "89456b690ff72fddcecf231caedbe615c59480c93358a93dfae7fc29e3ebbf0e" dependencies = [ "proc-macro2", "quote", @@ -4649,9 +4619,6 @@ name = "sync_wrapper" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" -dependencies = [ - "futures-core", -] [[package]] name = "synstructure" @@ -4667,15 +4634,14 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.13.0" +version = "3.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0f2c9fc62d0beef6951ccffd757e241266a2c833136efbe35af6cd2567dca5b" +checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" dependencies = [ "cfg-if 1.0.0", "fastrand", - "once_cell", "rustix", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] @@ -4716,22 +4682,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.65" +version = "1.0.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d11abd9594d9b38965ef50805c5e469ca9cc6f197f883f717e0269a3057b3d5" +checksum = "c0342370b38b6a11b6cc11d6a805569958d54cfa061a29969c3b5ce2ea405724" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.65" +version = "1.0.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae71770322cbd277e69d762a16c444af02aa0575ac0d174f0b9562d3b37f8602" +checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.46", ] [[package]] @@ -4837,7 +4803,7 @@ checksum = "5f5ae998a069d4b5aba8ee9dad856af7d520c3699e6159b185c2acd48155d39a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.46", ] [[package]] @@ -4875,9 +4841,9 @@ dependencies = [ [[package]] name = "tokio-socks" -version = "0.5.2" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d4770b8024672c1101b3f6733eab95b18007dbe0847a8afe341fcf79e06043f" +checksum = "51165dfa029d2a65969413a6cc96f354b86b464498702f174a4efa13608fd8c0" dependencies = [ "either", "futures-util", @@ -4930,9 +4896,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.12" +version = "0.7.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61e7c3654c13bcd040d4a03abee2c75b1d14a37b423cf5a813ceae1cc903ec6a" +checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" dependencies = [ "bytes", "futures-core", @@ -4953,9 +4919,9 @@ dependencies = [ [[package]] name = "toml" -version = "0.8.19" +version = "0.8.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" +checksum = "ac2caab0bf757388c6c0ae23b3293fdb463fee59434529014f85e3263b995c28" dependencies = [ "serde", "serde_spanned", @@ -4965,18 +4931,18 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.6.8" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" +checksum = "4badfd56924ae69bcc9039335b2e017639ce3f9b001c393c1b2d1ef846ce2cbf" dependencies = [ "serde", ] [[package]] name = "toml_edit" -version = "0.22.20" +version = "0.22.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "583c44c02ad26b0c3f3066fe629275e50627026c51ac2e595cca4c230ce1ce1d" +checksum = "278f3d518e152219c994ce877758516bca5e118eaed6996192a774fb9fbf0788" dependencies = [ "indexmap 2.1.0", "serde", @@ -5063,7 +5029,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.46", ] [[package]] @@ -5361,9 +5327,9 @@ checksum = "05e42f7c18b8f902290b009cde6d651262f956c98bc51bca4cd1d511c9cd85c7" [[package]] name = "uuid" -version = "1.11.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a" +checksum = "81dfa00651efa65069b0b6b651f4aaa31ba9e3c3ce0137aaad053604ee7e0314" dependencies = [ "getrandom 0.2.11", "serde", @@ -5470,7 +5436,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.46", "wasm-bindgen-shared", ] @@ -5504,7 +5470,7 @@ checksum = "bae1abb6806dc1ad9e560ed242107c0f6c84335f1749dd4e8ddb012ebd5e25a7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.46", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -5623,36 +5589,6 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -[[package]] -name = "windows-registry" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" -dependencies = [ - "windows-result", - "windows-strings", - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-result" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" -dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-strings" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" -dependencies = [ - "windows-result", - "windows-targets 0.52.6", -] - [[package]] name = "windows-sys" version = "0.32.0" @@ -5681,16 +5617,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-sys" -version = "0.59.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" -dependencies = [ - "windows-targets 0.52.6", + "windows-targets 0.52.0", ] [[package]] @@ -5710,18 +5637,17 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.52.6" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" dependencies = [ - "windows_aarch64_gnullvm 0.52.6", - "windows_aarch64_msvc 0.52.6", - "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm", - "windows_i686_msvc 0.52.6", - "windows_x86_64_gnu 0.52.6", - "windows_x86_64_gnullvm 0.52.6", - "windows_x86_64_msvc 0.52.6", + "windows_aarch64_gnullvm 0.52.0", + "windows_aarch64_msvc 0.52.0", + "windows_i686_gnu 0.52.0", + "windows_i686_msvc 0.52.0", + "windows_x86_64_gnu 0.52.0", + "windows_x86_64_gnullvm 0.52.0", + "windows_x86_64_msvc 0.52.0", ] [[package]] @@ -5732,9 +5658,9 @@ checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.6" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" +checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" [[package]] name = "windows_aarch64_msvc" @@ -5750,9 +5676,9 @@ checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" [[package]] name = "windows_aarch64_msvc" -version = "0.52.6" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" +checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" [[package]] name = "windows_i686_gnu" @@ -5768,15 +5694,9 @@ checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" [[package]] name = "windows_i686_gnu" -version = "0.52.6" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" +checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" [[package]] name = "windows_i686_msvc" @@ -5792,9 +5712,9 @@ checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" [[package]] name = "windows_i686_msvc" -version = "0.52.6" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" +checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" [[package]] name = "windows_x86_64_gnu" @@ -5810,9 +5730,9 @@ checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" [[package]] name = "windows_x86_64_gnu" -version = "0.52.6" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" +checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" [[package]] name = "windows_x86_64_gnullvm" @@ -5822,9 +5742,9 @@ checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.6" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" +checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" [[package]] name = "windows_x86_64_msvc" @@ -5840,15 +5760,15 @@ checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" [[package]] name = "windows_x86_64_msvc" -version = "0.52.6" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" +checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" [[package]] name = "winnow" -version = "0.6.18" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68a9bda4691f099d435ad181000724da8e5899daa10713c2d432552b9ccd3a6f" +checksum = "dffa400e67ed5a4dd237983829e66475f0a4a26938c4b04c21baede6262215b8" dependencies = [ "memchr", ] @@ -5862,6 +5782,16 @@ dependencies = [ "winapi", ] +[[package]] +name = "winreg" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" +dependencies = [ + "cfg-if 1.0.0", + "windows-sys 0.48.0", +] + [[package]] name = "x25519-dalek" version = "1.1.0" @@ -5915,7 +5845,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.46", ] [[package]] diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index 05e5d64c..00000000 --- a/Dockerfile +++ /dev/null @@ -1,22 +0,0 @@ -# This Dockerfile builds the asb binary - -FROM rust:1.79-slim AS builder - -WORKDIR /build - -RUN apt-get update -RUN apt-get install -y git clang cmake libsnappy-dev - -COPY . . - -WORKDIR /build/swap - -RUN cargo build --release --bin=asb - -FROM debian:bookworm-slim - -WORKDIR /data - -COPY --from=builder /build/target/release/asb /bin/asb - -ENTRYPOINT ["asb"] diff --git a/README.md b/README.md index 72130de7..35adc5f0 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,3 @@ -> [!CAUTION] -> # THIS REPO IS UNMAINTAINED
PLEASE USE [UNSTOPPABLESWAP]([url](https://github.com/UnstoppableSwap/core)) INSTEAD - -**This repository is unmaintained**. The original developers (@comit-network) have moved on to other projects. Community volunteers are continuing development at [UnstoppableSwap/core](https://github.com/UnstoppableSwap/core), which includes a graphical user interface. Please note that the fork has introduced network-level breaking changes, making it incompatible with peers running this repository - you will not be able to initiate swaps with them. - # XMR to BTC Atomic Swap This repository hosts an MVP for atomically swapping BTC to XMR. diff --git a/monero-harness/Cargo.toml b/monero-harness/Cargo.toml index e15c751d..1151f47a 100644 --- a/monero-harness/Cargo.toml +++ b/monero-harness/Cargo.toml @@ -13,4 +13,4 @@ rand = "0.7" testcontainers = "0.15" tokio = { version = "1", default-features = false, features = [ "rt-multi-thread", "time", "macros" ] } tracing = "0.1" -tracing-subscriber = { version = "0.3", default-features = false, features = [ "fmt", "ansi", "env-filter", "tracing-log" ] } +tracing-subscriber = { version = "0.2", default-features = false, features = [ "fmt", "ansi", "env-filter", "tracing-log" ] } diff --git a/swap/Cargo.toml b/swap/Cargo.toml index 678fdb8d..a75c29a7 100644 --- a/swap/Cargo.toml +++ b/swap/Cargo.toml @@ -37,13 +37,11 @@ jsonrpsee-core = "0.16.2" libp2p = { version = "0.42.2", default-features = false, features = [ "tcp-tokio", "yamux", "mplex", "dns-tokio", "noise", "request-response", "websocket", "ping", "rendezvous", "identify" ] } monero = { version = "0.12", features = [ "serde_support" ] } monero-rpc = { path = "../monero-rpc" } -once_cell = "1.20" pem = "3.0" proptest = "1" qrcode = "0.14" rand = "0.8" rand_chacha = "0.3" -regex = "1.11" reqwest = { version = "0.12", features = [ "http2", "rustls-tls", "stream", "socks" ], default-features = false } rust_decimal = { version = "1", features = [ "serde-float" ] } rust_decimal_macros = "1" @@ -69,7 +67,7 @@ tracing-appender = "0.2" tracing-futures = { version = "0.2", features = [ "std-future", "futures-03" ] } tracing-subscriber = { version = "0.3", default-features = false, features = [ "fmt", "ansi", "env-filter", "time", "tracing-log", "json" ] } url = { version = "2", features = [ "serde" ] } -uuid = { version = "1.11", features = [ "serde", "v4" ] } +uuid = { version = "1.10", features = [ "serde", "v4" ] } void = "1" [target.'cfg(not(windows))'.dependencies] @@ -81,9 +79,9 @@ zip = "0.5" [dev-dependencies] bitcoin-harness = { git = "https://github.com/delta1/bitcoin-harness-rs.git", rev = "80cc8d05db2610d8531011be505b7bee2b5cdf9f" } get-port = "3" -hyper = "1.5" +hyper = "1.4" jsonrpsee = { version = "0.16.2", features = [ "ws-client" ] } -mockito = "1.5" +mockito = "1.4" monero-harness = { path = "../monero-harness" } port_check = "0.2" proptest = "1" diff --git a/swap/src/api.rs b/swap/src/api.rs index ea87aae3..5640c833 100644 --- a/swap/src/api.rs +++ b/swap/src/api.rs @@ -1,13 +1,12 @@ pub mod request; use crate::cli::command::{Bitcoin, Monero, Tor}; -use crate::common::tracing_util::Format; use crate::database::{open_db, AccessMode}; use crate::env::{Config as EnvConfig, GetConfig, Mainnet, Testnet}; use crate::fs::system_data_dir; use crate::network::rendezvous::XmrBtcNamespace; use crate::protocol::Database; use crate::seed::Seed; -use crate::{bitcoin, common, monero}; +use crate::{bitcoin, cli, monero}; use anyhow::{bail, Context as AnyContext, Error, Result}; use futures::future::try_join_all; use std::fmt; @@ -17,8 +16,6 @@ use std::path::PathBuf; use std::sync::{Arc, Once}; use tokio::sync::{broadcast, broadcast::Sender, Mutex, RwLock}; use tokio::task::JoinHandle; -use tracing::level_filters::LevelFilter; -use tracing::Level; use url::Url; static START: Once = Once::new(); @@ -170,7 +167,6 @@ pub struct Context { pub swap_lock: Arc, pub config: Config, pub tasks: Arc, - pub is_daemon: bool, } #[allow(clippy::too_many_arguments)] @@ -184,20 +180,12 @@ impl Context { debug: bool, json: bool, server_address: Option, - is_daemon: bool, ) -> Result { let data_dir = data::data_dir_from(data, is_testnet)?; let env_config = env_config_from(is_testnet); - let format = if json { Format::Json } else { Format::Raw }; - let level_filter = if debug { - LevelFilter::from_level(Level::DEBUG) - } else { - LevelFilter::from_level(Level::INFO) - }; - START.call_once(|| { - let _ = common::tracing_util::init(level_filter, format, data_dir.join("logs")); + let _ = cli::tracing::init(debug, json, data_dir.join("logs")); }); let seed = Seed::from_file_or_generate(data_dir.as_path()) @@ -253,7 +241,6 @@ impl Context { }, swap_lock: Arc::new(SwapLock::new()), tasks: Arc::new(PendingTaskList::default()), - is_daemon, }; Ok(context) @@ -278,7 +265,6 @@ impl Context { monero_rpc_process: None, swap_lock: Arc::new(SwapLock::new()), tasks: Arc::new(PendingTaskList::default()), - is_daemon: true, } } diff --git a/swap/src/api/request.rs b/swap/src/api/request.rs index 33e261d3..b1e9c68c 100644 --- a/swap/src/api/request.rs +++ b/swap/src/api/request.rs @@ -1,7 +1,6 @@ use crate::api::Context; use crate::bitcoin::{Amount, ExpiredTimelocks, TxLock}; use crate::cli::{list_sellers, EventLoop, SellerStatus}; -use crate::common::get_logs; use crate::libp2p_ext::MultiAddrExt; use crate::network::quote::{BidQuote, ZeroQuoteReceived}; use crate::network::swarm; @@ -9,18 +8,14 @@ use crate::protocol::bob::{BobState, Swap}; use crate::protocol::{bob, State}; use crate::{bitcoin, cli, monero, rpc}; use anyhow::{bail, Context as AnyContext, Result}; -use comfy_table::Table; use libp2p::core::Multiaddr; use qrcode::render::unicode; use qrcode::QrCode; -use rust_decimal::prelude::FromPrimitive; -use rust_decimal::Decimal; use serde_json::json; use std::cmp::min; use std::convert::TryInto; use std::future::Future; use std::net::SocketAddr; -use std::path::PathBuf; use std::sync::Arc; use std::time::Duration; use tracing::{debug_span, field, Instrument, Span}; @@ -50,11 +45,6 @@ pub enum Method { swap_id: Uuid, }, History, - Logs { - logs_dir: Option, - redact: bool, - swap_id: Option, - }, Config, WithdrawBtc { amount: Option, @@ -132,13 +122,6 @@ impl Method { log_reference_id = field::Empty ) } - Method::Logs { .. } => { - debug_span!( - "method", - method_name = "Logs", - log_reference_id = field::Empty - ) - } Method::ListSellers { .. } => { debug_span!( "method", @@ -655,111 +638,14 @@ impl Request { }) } Method::History => { - let mut table = Table::new(); - table.set_header(vec![ - "Swap ID", - "Start Date", - "State", - "BTC Amount", - "XMR Amount", - "Exchange Rate", - "Trading Partner Peer ID", - ]); - - let all_swaps = context.db.all().await?; - let mut json_results = Vec::new(); - - for (swap_id, state) in all_swaps { - let result: Result<_> = async { - let latest_state: BobState = state.try_into()?; - let all_states = context.db.get_states(swap_id).await?; - let state3 = all_states - .iter() - .find_map(|s| { - if let State::Bob(BobState::BtcLocked { state3, .. }) = s { - Some(state3) - } else { - None - } - }) - .context("Failed to get \"BtcLocked\" state")?; - - let swap_start_date = context.db.get_swap_start_date(swap_id).await?; - let peer_id = context.db.get_peer_id(swap_id).await?; - let btc_amount = state3.tx_lock.lock_amount(); - let xmr_amount = state3.xmr; - let exchange_rate = Decimal::from_f64(btc_amount.to_btc()) - .ok_or_else(|| { - anyhow::anyhow!("Failed to convert BTC amount to Decimal") - })? - .checked_div(xmr_amount.as_xmr()) - .ok_or_else(|| anyhow::anyhow!("Division by zero or overflow"))?; - let exchange_rate = format!("{} XMR/BTC", exchange_rate.round_dp(8)); - - let swap_data = json!({ - "swapId": swap_id.to_string(), - "startDate": swap_start_date.to_string(), - "state": latest_state.to_string(), - "btcAmount": btc_amount.to_string(), - "xmrAmount": xmr_amount.to_string(), - "exchangeRate": exchange_rate, - "tradingPartnerPeerId": peer_id.to_string() - }); - - if context.config.json { - tracing::info!( - swap_id = %swap_id, - swap_start_date = %swap_start_date, - latest_state = %latest_state, - btc_amount = %btc_amount, - xmr_amount = %xmr_amount, - exchange_rate = %exchange_rate, - trading_partner_peer_id = %peer_id, - "Found swap in database" - ); - } else { - table.add_row(vec![ - swap_id.to_string(), - swap_start_date.to_string(), - latest_state.to_string(), - btc_amount.to_string(), - xmr_amount.to_string(), - exchange_rate, - peer_id.to_string(), - ]); - } - - Ok(swap_data) - } - .await; - - match result { - Ok(swap_data) => json_results.push(swap_data), - Err(e) => { - tracing::error!(swap_id = %swap_id, error = %e, "Failed to get swap details") - } - } + let swaps = context.db.all().await?; + let mut vec: Vec<(Uuid, String)> = Vec::new(); + for (swap_id, state) in swaps { + let state: BobState = state.try_into()?; + vec.push((swap_id, state.to_string())); } - if !context.config.json && !context.is_daemon { - println!("{}", table); - } - - Ok(json!({"swaps": json_results})) - } - Method::Logs { - logs_dir, - redact, - swap_id, - } => { - let dir = logs_dir.unwrap_or(context.config.data_dir.join("logs")); - let logs = get_logs(dir, swap_id, redact).await?; - - for msg in &logs { - println!("{msg}"); - } - - Ok(json!({ "logs": logs })) + Ok(json!({ "swaps": vec })) } Method::GetRawStates => { let raw_history = context.db.raw_all().await?; diff --git a/swap/src/asb.rs b/swap/src/asb.rs index 404a3b61..b5ed8ac1 100644 --- a/swap/src/asb.rs +++ b/swap/src/asb.rs @@ -4,6 +4,7 @@ mod event_loop; mod network; mod rate; mod recovery; +pub mod tracing; pub use event_loop::{EventLoop, EventLoopHandle, FixedRate, KrakenRate, LatestRate}; pub use network::behaviour::{Behaviour, OutEvent}; diff --git a/swap/src/asb/command.rs b/swap/src/asb/command.rs index 67565065..f22e1500 100644 --- a/swap/src/asb/command.rs +++ b/swap/src/asb/command.rs @@ -19,6 +19,7 @@ where let args = RawArguments::from_clap(&matches); let json = args.json; + let disable_timestamp = args.disable_timestamp; let testnet = args.testnet; let config = args.config; let command: RawCommand = args.cmd; @@ -27,35 +28,23 @@ where RawCommand::Start { resume_only } => Arguments { testnet, json, + disable_timestamp, config_path: config_path(config, testnet)?, env_config: env_config(testnet), cmd: Command::Start { resume_only }, }, - RawCommand::History { only_unfinished } => Arguments { + RawCommand::History => Arguments { testnet, json, + disable_timestamp, config_path: config_path(config, testnet)?, env_config: env_config(testnet), - cmd: Command::History { only_unfinished }, - }, - RawCommand::Logs { - logs_dir: dir_path, - swap_id, - redact, - } => Arguments { - testnet, - json, - config_path: config_path(config, testnet)?, - env_config: env_config(testnet), - cmd: Command::Logs { - logs_dir: dir_path, - swap_id, - redact, - }, + cmd: Command::History, }, RawCommand::WithdrawBtc { amount, address } => Arguments { testnet, json, + disable_timestamp, config_path: config_path(config, testnet)?, env_config: env_config(testnet), cmd: Command::WithdrawBtc { @@ -66,6 +55,7 @@ where RawCommand::Balance => Arguments { testnet, json, + disable_timestamp, config_path: config_path(config, testnet)?, env_config: env_config(testnet), cmd: Command::Balance, @@ -73,6 +63,7 @@ where RawCommand::Config => Arguments { testnet, json, + disable_timestamp, config_path: config_path(config, testnet)?, env_config: env_config(testnet), cmd: Command::Config, @@ -80,6 +71,7 @@ where RawCommand::ExportBitcoinWallet => Arguments { testnet, json, + disable_timestamp, config_path: config_path(config, testnet)?, env_config: env_config(testnet), cmd: Command::ExportBitcoinWallet, @@ -90,6 +82,7 @@ where }) => Arguments { testnet, json, + disable_timestamp, config_path: config_path(config, testnet)?, env_config: env_config(testnet), cmd: Command::Redeem { @@ -103,6 +96,7 @@ where }) => Arguments { testnet, json, + disable_timestamp, config_path: config_path(config, testnet)?, env_config: env_config(testnet), cmd: Command::Cancel { swap_id }, @@ -112,6 +106,7 @@ where }) => Arguments { testnet, json, + disable_timestamp, config_path: config_path(config, testnet)?, env_config: env_config(testnet), cmd: Command::Refund { swap_id }, @@ -121,6 +116,7 @@ where }) => Arguments { testnet, json, + disable_timestamp, config_path: config_path(config, testnet)?, env_config: env_config(testnet), cmd: Command::Punish { swap_id }, @@ -128,6 +124,7 @@ where RawCommand::ManualRecovery(ManualRecovery::SafelyAbort { swap_id }) => Arguments { testnet, json, + disable_timestamp, config_path: config_path(config, testnet)?, env_config: env_config(testnet), cmd: Command::SafelyAbort { swap_id }, @@ -187,6 +184,7 @@ pub struct BitcoinAddressNetworkMismatch { pub struct Arguments { pub testnet: bool, pub json: bool, + pub disable_timestamp: bool, pub config_path: PathBuf, pub env_config: env::Config, pub cmd: Command, @@ -197,15 +195,8 @@ pub enum Command { Start { resume_only: bool, }, - History { - only_unfinished: bool, - }, + History, Config, - Logs { - logs_dir: Option, - swap_id: Option, - redact: bool, - }, WithdrawBtc { amount: Option, address: Address, @@ -277,33 +268,8 @@ pub enum RawCommand { )] resume_only: bool, }, - #[structopt(about = "Prints all logging messages issued in the past.")] - Logs { - #[structopt( - short = "d", - help = "Print the logs from this directory instead of the default one." - )] - logs_dir: Option, - #[structopt( - help = "Redact swap-ids, Bitcoin and Monero addresses.", - long = "redact" - )] - redact: bool, - #[structopt( - long = "swap-id", - help = "Filter for logs concerning this swap.", - long_help = "This checks whether each logging message contains the swap id. Some messages might be skipped when they don't contain the swap id even though they're relevant." - )] - swap_id: Option, - }, #[structopt(about = "Prints swap-id and the state of each swap ever made.")] - History { - #[structopt( - long = "only-unfinished", - help = "If set, only unfinished swaps will be printed." - )] - only_unfinished: bool, - }, + History, #[structopt(about = "Prints the current config")] Config, #[structopt(about = "Allows withdrawing BTC from the internal Bitcoin wallet.")] @@ -400,6 +366,7 @@ mod tests { let expected_args = Arguments { testnet: false, json: false, + disable_timestamp: false, config_path: default_mainnet_conf_path, env_config: mainnet_env_config, cmd: Command::Start { resume_only: false }, @@ -417,11 +384,10 @@ mod tests { let expected_args = Arguments { testnet: false, json: false, + disable_timestamp: false, config_path: default_mainnet_conf_path, env_config: mainnet_env_config, - cmd: Command::History { - only_unfinished: false, - }, + cmd: Command::History, }; let args = parse_args(raw_ars).unwrap(); assert_eq!(expected_args, args); @@ -436,6 +402,7 @@ mod tests { let expected_args = Arguments { testnet: false, json: false, + disable_timestamp: false, config_path: default_mainnet_conf_path, env_config: mainnet_env_config, cmd: Command::Balance, @@ -457,6 +424,7 @@ mod tests { let expected_args = Arguments { testnet: false, json: false, + disable_timestamp: false, config_path: default_mainnet_conf_path, env_config: mainnet_env_config, cmd: Command::WithdrawBtc { @@ -483,6 +451,7 @@ mod tests { let expected_args = Arguments { testnet: false, json: false, + disable_timestamp: false, config_path: default_mainnet_conf_path, env_config: mainnet_env_config, cmd: Command::Cancel { @@ -508,6 +477,7 @@ mod tests { let expected_args = Arguments { testnet: false, json: false, + disable_timestamp: false, config_path: default_mainnet_conf_path, env_config: mainnet_env_config, cmd: Command::Refund { @@ -533,6 +503,7 @@ mod tests { let expected_args = Arguments { testnet: false, json: false, + disable_timestamp: false, config_path: default_mainnet_conf_path, env_config: mainnet_env_config, cmd: Command::Punish { @@ -558,6 +529,7 @@ mod tests { let expected_args = Arguments { testnet: false, json: false, + disable_timestamp: false, config_path: default_mainnet_conf_path, env_config: mainnet_env_config, cmd: Command::SafelyAbort { @@ -577,6 +549,7 @@ mod tests { let expected_args = Arguments { testnet: true, json: false, + disable_timestamp: false, config_path: default_testnet_conf_path, env_config: testnet_env_config, cmd: Command::Start { resume_only: false }, @@ -594,11 +567,10 @@ mod tests { let expected_args = Arguments { testnet: true, json: false, + disable_timestamp: false, config_path: default_testnet_conf_path, env_config: testnet_env_config, - cmd: Command::History { - only_unfinished: false, - }, + cmd: Command::History, }; let args = parse_args(raw_ars).unwrap(); assert_eq!(expected_args, args); @@ -613,6 +585,7 @@ mod tests { let expected_args = Arguments { testnet: true, json: false, + disable_timestamp: false, config_path: default_testnet_conf_path, env_config: testnet_env_config, cmd: Command::Balance, @@ -636,6 +609,7 @@ mod tests { let expected_args = Arguments { testnet: true, json: false, + disable_timestamp: false, config_path: default_testnet_conf_path, env_config: testnet_env_config, cmd: Command::WithdrawBtc { @@ -662,6 +636,7 @@ mod tests { let expected_args = Arguments { testnet: true, json: false, + disable_timestamp: false, config_path: default_testnet_conf_path, env_config: testnet_env_config, cmd: Command::Cancel { @@ -688,6 +663,7 @@ mod tests { let expected_args = Arguments { testnet: true, json: false, + disable_timestamp: false, config_path: default_testnet_conf_path, env_config: testnet_env_config, cmd: Command::Refund { @@ -714,6 +690,7 @@ mod tests { let expected_args = Arguments { testnet: true, json: false, + disable_timestamp: false, config_path: default_testnet_conf_path, env_config: testnet_env_config, cmd: Command::Punish { @@ -740,6 +717,7 @@ mod tests { let expected_args = Arguments { testnet: true, json: false, + disable_timestamp: false, config_path: default_testnet_conf_path, env_config: testnet_env_config, cmd: Command::SafelyAbort { @@ -759,6 +737,7 @@ mod tests { let expected_args = Arguments { testnet: false, json: false, + disable_timestamp: true, config_path: default_mainnet_conf_path, env_config: mainnet_env_config, cmd: Command::Start { resume_only: false }, diff --git a/swap/src/asb/tracing.rs b/swap/src/asb/tracing.rs new file mode 100644 index 00000000..c21c1e70 --- /dev/null +++ b/swap/src/asb/tracing.rs @@ -0,0 +1,30 @@ +use anyhow::Result; +use tracing_subscriber::filter::LevelFilter; +use tracing_subscriber::fmt::time::UtcTime; +use tracing_subscriber::FmtSubscriber; + +pub fn init(level: LevelFilter, json_format: bool, timestamp: bool) -> Result<()> { + if level == LevelFilter::OFF { + return Ok(()); + } + + let is_terminal = atty::is(atty::Stream::Stderr); + + let builder = FmtSubscriber::builder() + .with_env_filter(format!("asb={},swap={}", level, level)) + .with_writer(std::io::stderr) + .with_ansi(is_terminal) + .with_timer(UtcTime::rfc_3339()) + .with_target(false); + + match (json_format, timestamp) { + (true, true) => builder.json().init(), + (true, false) => builder.json().without_time().init(), + (false, true) => builder.init(), + (false, false) => builder.without_time().init(), + } + + tracing::info!(%level, "Initialized tracing"); + + Ok(()) +} diff --git a/swap/src/bin/asb.rs b/swap/src/bin/asb.rs index 3a0d2dd4..0f2f13b5 100644 --- a/swap/src/bin/asb.rs +++ b/swap/src/bin/asb.rs @@ -18,8 +18,6 @@ use libp2p::core::multiaddr::Protocol; use libp2p::core::Multiaddr; use libp2p::swarm::AddressScore; use libp2p::Swarm; -use rust_decimal::prelude::FromPrimitive; -use rust_decimal::Decimal; use std::convert::TryInto; use std::env; use std::net::{IpAddr, Ipv4Addr, SocketAddr}; @@ -31,50 +29,51 @@ use swap::asb::config::{ initial_setup, query_user_for_initial_config, read_config, Config, ConfigNotInitialized, }; use swap::asb::{cancel, punish, redeem, refund, safely_abort, EventLoop, Finality, KrakenRate}; -use swap::common::tracing_util::Format; -use swap::common::{self, check_latest_version, get_logs}; +use swap::common::check_latest_version; use swap::database::{open_db, AccessMode}; use swap::network::rendezvous::XmrBtcNamespace; use swap::network::swarm; -use swap::protocol::alice::swap::is_complete; use swap::protocol::alice::{run, AliceState}; -use swap::protocol::State; use swap::seed::Seed; use swap::tor::AuthenticatedClient; -use swap::{bitcoin, kraken, monero, tor}; +use swap::{asb, bitcoin, kraken, monero, tor}; use tracing_subscriber::filter::LevelFilter; const DEFAULT_WALLET_NAME: &str = "asb-wallet"; #[tokio::main] async fn main() -> Result<()> { - // parse cli arguments let Arguments { testnet, json, + disable_timestamp, config_path, env_config, cmd, } = match parse_args(env::args_os()) { Ok(args) => args, Err(e) => { - // make sure to display the clap error message it exists if let Some(clap_err) = e.downcast_ref::() { - if let ErrorKind::HelpDisplayed | ErrorKind::VersionDisplayed = clap_err.kind { - println!("{}", clap_err.message); - std::process::exit(0); + match clap_err.kind { + ErrorKind::HelpDisplayed | ErrorKind::VersionDisplayed => { + println!("{}", clap_err.message); + std::process::exit(0); + } + _ => { + bail!(e); + } } } bail!(e); } }; - // warn if we're not on the latest version if let Err(e) = check_latest_version(env!("CARGO_PKG_VERSION")).await { eprintln!("{}", e); } - // read config from the specified path + asb::tracing::init(LevelFilter::DEBUG, json, !disable_timestamp).expect("initialize tracing"); + let config = match read_config(config_path.clone())? { Ok(config) => config, Err(ConfigNotInitialized {}) => { @@ -83,12 +82,6 @@ async fn main() -> Result<()> { } }; - // initialize tracing - let format = if json { Format::Json } else { Format::Raw }; - let log_dir = config.data.dir.join("logs"); - common::tracing_util::init(LevelFilter::DEBUG, format, log_dir).expect("initialize tracing"); - - // check for conflicting env / config values if config.monero.network != env_config.monero_network { bail!(format!( "Expected monero network in config file to be {:?} but was {:?}", @@ -115,7 +108,6 @@ async fn main() -> Result<()> { rendezvous_addrs.sort(); rendezvous_addrs.dedup(); let new_len = rendezvous_addrs.len(); - if new_len < prev_len { tracing::warn!( "`rendezvous_point` config has {} duplicate entries, they are being ignored.", @@ -123,12 +115,9 @@ async fn main() -> Result<()> { ); } - // initialize monero wallet let monero_wallet = init_monero_wallet(&config, env_config).await?; let monero_address = monero_wallet.get_main_address(); tracing::info!(%monero_address, "Monero wallet address"); - - // check monero balance let monero = monero_wallet.get_balance().await?; match (monero.balance, monero.unlocked_balance) { (0, _) => { @@ -151,7 +140,6 @@ async fn main() -> Result<()> { } } - // init bitcoin wallet let bitcoin_wallet = init_bitcoin_wallet(&config, &seed, env_config).await?; let bitcoin_balance = bitcoin_wallet.balance().await?; tracing::info!(%bitcoin_balance, "Bitcoin wallet balance"); @@ -236,105 +224,24 @@ async fn main() -> Result<()> { event_loop.run().await; } - Command::History { only_unfinished } => { + Command::History => { let db = open_db(config.data.dir.join("sqlite"), AccessMode::ReadOnly).await?; - let mut table: Table = Table::new(); - table.set_header(vec![ - "Swap ID", - "Start Date", - "State", - "BTC Amount", - "XMR Amount", - "Exchange Rate", - "Trading Partner Peer ID", - "Completed", - ]); + let mut table = Table::new(); - let all_swaps = db.all().await?; - for (swap_id, state) in all_swaps { - if let Err(e) = async { - let latest_state: AliceState = state.try_into()?; - let is_completed = is_complete(&latest_state); + table.set_header(vec!["SWAP ID", "STATE"]); - if only_unfinished && is_completed { - return Ok::<_, anyhow::Error>(()); - } - - let all_states = db.get_states(swap_id).await?; - let state3 = all_states - .iter() - .find_map(|s| match s { - State::Alice(AliceState::BtcLockTransactionSeen { state3 }) => { - Some(state3) - } - _ => None, - }) - .context("Failed to get \"BtcLockTransactionSeen\" state")?; - - let swap_start_date = db.get_swap_start_date(swap_id).await?; - let peer_id = db.get_peer_id(swap_id).await?; - - let exchange_rate = Decimal::from_f64(state3.btc.to_btc()) - .ok_or_else(|| anyhow::anyhow!("Failed to convert BTC amount to Decimal"))? - .checked_div(state3.xmr.as_xmr()) - .ok_or_else(|| anyhow::anyhow!("Division by zero or overflow"))?; - let exchange_rate = format!("{} XMR/BTC", exchange_rate.round_dp(8)); - - if json { - tracing::info!( - swap_id = %swap_id, - swap_start_date = %swap_start_date, - latest_state = %latest_state, - btc_amount = %state3.btc, - xmr_amount = %state3.xmr, - exchange_rate = %exchange_rate, - trading_partner_peer_id = %peer_id, - completed = is_completed, - "Found swap in database" - ); - } else { - table.add_row(vec![ - swap_id.to_string(), - swap_start_date.to_string(), - latest_state.to_string(), - state3.btc.to_string(), - state3.xmr.to_string(), - exchange_rate, - peer_id.to_string(), - is_completed.to_string(), - ]); - } - - Ok::<_, anyhow::Error>(()) - } - .await - { - tracing::error!(swap_id = %swap_id, error = %e, "Failed to get swap details"); - } + for (swap_id, state) in db.all().await? { + let state: AliceState = state.try_into()?; + table.add_row(vec![swap_id.to_string(), state.to_string()]); } - if !json { - println!("{}", table); - } + println!("{}", table); } Command::Config => { let config_json = serde_json::to_string_pretty(&config)?; println!("{}", config_json); } - Command::Logs { - logs_dir, - swap_id, - redact, - } => { - let dir = logs_dir.unwrap_or(config.data.dir.join("logs")); - - let log_messages = get_logs(dir, swap_id, redact).await?; - - for msg in log_messages { - println!("{msg}"); - } - } Command::WithdrawBtc { amount, address } => { let bitcoin_wallet = init_bitcoin_wallet(&config, &seed, env_config).await?; diff --git a/swap/src/bitcoin/wallet.rs b/swap/src/bitcoin/wallet.rs index 55a05b73..9748d740 100644 --- a/swap/src/bitcoin/wallet.rs +++ b/swap/src/bitcoin/wallet.rs @@ -468,7 +468,6 @@ where ) -> Result { let client = self.client.lock().await; let fee_rate = client.estimate_feerate(self.target_block)?; - let min_relay_fee = client.min_relay_fee()?; estimate_fee(weight, transfer_amount, fee_rate, min_relay_fee) @@ -872,11 +871,6 @@ impl EstimateFeeRate for Client { // https://github.com/romanz/electrs/blob/f9cf5386d1b5de6769ee271df5eef324aa9491bc/src/rpc.rs#L213 // Returned estimated fees are per BTC/kb. let fee_per_byte = self.electrum.estimate_fee(target_block)?; - - if fee_per_byte < 0.0 { - bail!("Fee per byte returned by electrum server is negative: {}. This may indicate that fee estimation is not supported by this server", fee_per_byte); - } - // we do not expect fees being that high. #[allow(clippy::cast_possible_truncation)] Ok(FeeRate::from_btc_per_kvb(fee_per_byte as f32)) diff --git a/swap/src/cli.rs b/swap/src/cli.rs index 6085eca0..f0faf146 100644 --- a/swap/src/cli.rs +++ b/swap/src/cli.rs @@ -3,6 +3,7 @@ pub mod cancel_and_refund; pub mod command; mod event_loop; mod list_sellers; +pub mod tracing; pub mod transport; pub use behaviour::{Behaviour, OutEvent}; diff --git a/swap/src/cli/command.rs b/swap/src/cli/command.rs index acce7a50..4881d94e 100644 --- a/swap/src/cli/command.rs +++ b/swap/src/cli/command.rs @@ -78,7 +78,6 @@ where debug, json, None, - false, ) .await?; @@ -101,32 +100,14 @@ where let request = Request::new(Method::History); let context = - Context::build(None, None, None, data, is_testnet, debug, json, None, false) - .await?; - (context, request) - } - CliCommand::Logs { - logs_dir, - redact, - swap_id, - } => { - let request = Request::new(Method::Logs { - logs_dir, - redact, - swap_id, - }); - let context = - Context::build(None, None, None, data, is_testnet, debug, json, None, false) - .await?; - + Context::build(None, None, None, data, is_testnet, debug, json, None).await?; (context, request) } CliCommand::Config => { let request = Request::new(Method::Config); let context = - Context::build(None, None, None, data, is_testnet, debug, json, None, false) - .await?; + Context::build(None, None, None, data, is_testnet, debug, json, None).await?; (context, request) } CliCommand::Balance { bitcoin } => { @@ -143,7 +124,6 @@ where debug, json, None, - false, ) .await?; (context, request) @@ -165,7 +145,6 @@ where debug, json, server_address, - true, ) .await?; (context, request) @@ -187,7 +166,6 @@ where debug, json, None, - false, ) .await?; (context, request) @@ -209,7 +187,6 @@ where debug, json, None, - false, ) .await?; (context, request) @@ -230,7 +207,6 @@ where debug, json, None, - false, ) .await?; (context, request) @@ -241,18 +217,8 @@ where } => { let request = Request::new(Method::ListSellers { rendezvous_point }); - let context = Context::build( - None, - None, - Some(tor), - data, - is_testnet, - debug, - json, - None, - false, - ) - .await?; + let context = + Context::build(None, None, Some(tor), data, is_testnet, debug, json, None).await?; (context, request) } @@ -268,7 +234,6 @@ where debug, json, None, - false, ) .await?; (context, request) @@ -279,8 +244,7 @@ where let request = Request::new(Method::MoneroRecovery { swap_id }); let context = - Context::build(None, None, None, data, is_testnet, debug, json, None, false) - .await?; + Context::build(None, None, None, data, is_testnet, debug, json, None).await?; (context, request) } @@ -357,25 +321,6 @@ enum CliCommand { }, /// Show a list of past, ongoing and completed swaps History, - /// Output all logging messages that have been issued. - Logs { - #[structopt( - short = "d", - help = "Print the logs from this directory instead of the default one." - )] - logs_dir: Option, - #[structopt( - help = "Redact swap-ids, Bitcoin and Monero addresses.", - long = "redact" - )] - redact: bool, - #[structopt( - long = "swap-id", - help = "Filter for logs concerning this swap.", - long_help = "This checks whether each logging message contains the swap id. Some messages might be skipped when they don't contain the swap id even though they're relevant." - )] - swap_id: Option, - }, #[structopt(about = "Prints the current config")] Config, #[structopt(about = "Allows withdrawing BTC from the internal Bitcoin wallet.")] diff --git a/swap/src/cli/tracing.rs b/swap/src/cli/tracing.rs new file mode 100644 index 00000000..6b6de60f --- /dev/null +++ b/swap/src/cli/tracing.rs @@ -0,0 +1,112 @@ +use anyhow::Result; +use std::path::Path; +use time::format_description::well_known::Rfc3339; +use tracing::subscriber::set_global_default; +use tracing::{Event, Level, Subscriber}; +use tracing_subscriber::fmt::format::{DefaultFields, Format, JsonFields}; +use tracing_subscriber::fmt::time::UtcTime; +use tracing_subscriber::layer::{Context, SubscriberExt}; +use tracing_subscriber::{fmt, EnvFilter, Layer, Registry}; + +pub fn init(debug: bool, json: bool, dir: impl AsRef) -> Result<()> { + let level_filter = EnvFilter::try_new("swap=debug")?; + let registry = Registry::default().with(level_filter); + + let appender = tracing_appender::rolling::never(dir.as_ref(), "swap-all.log"); + + let file_logger = registry.with( + fmt::layer() + .with_ansi(false) + .with_target(false) + .json() + .with_writer(appender), + ); + + if json && debug { + set_global_default(file_logger.with(debug_json_terminal_printer()))?; + } else if json && !debug { + set_global_default(file_logger.with(info_json_terminal_printer()))?; + } else if !json && debug { + set_global_default(file_logger.with(debug_terminal_printer()))?; + } else { + set_global_default(file_logger.with(info_terminal_printer()))?; + } + + tracing::info!("Logging initialized to {}", dir.as_ref().display()); + Ok(()) +} + +pub struct StdErrPrinter { + inner: L, + level: Level, +} + +type StdErrLayer = + fmt::Layer, fn() -> std::io::Stderr>; + +type StdErrJsonLayer = + fmt::Layer, fn() -> std::io::Stderr>; + +fn debug_terminal_printer() -> StdErrPrinter>> { + let is_terminal = atty::is(atty::Stream::Stderr); + StdErrPrinter { + inner: fmt::layer() + .with_ansi(is_terminal) + .with_target(false) + .with_timer(UtcTime::rfc_3339()) + .with_writer(std::io::stderr), + level: Level::DEBUG, + } +} + +fn debug_json_terminal_printer() -> StdErrPrinter>> { + let is_terminal = atty::is(atty::Stream::Stderr); + StdErrPrinter { + inner: fmt::layer() + .with_ansi(is_terminal) + .with_target(false) + .with_timer(UtcTime::rfc_3339()) + .json() + .with_writer(std::io::stderr), + level: Level::DEBUG, + } +} + +fn info_terminal_printer() -> StdErrPrinter> { + let is_terminal = atty::is(atty::Stream::Stderr); + StdErrPrinter { + inner: fmt::layer() + .with_ansi(is_terminal) + .with_target(false) + .with_level(false) + .without_time() + .with_writer(std::io::stderr), + level: Level::INFO, + } +} + +fn info_json_terminal_printer() -> StdErrPrinter> { + let is_terminal = atty::is(atty::Stream::Stderr); + StdErrPrinter { + inner: fmt::layer() + .with_ansi(is_terminal) + .with_target(false) + .with_level(false) + .without_time() + .json() + .with_writer(std::io::stderr), + level: Level::INFO, + } +} + +impl Layer for StdErrPrinter +where + L: 'static + Layer, + S: Subscriber + for<'a> tracing_subscriber::registry::LookupSpan<'a>, +{ + fn on_event(&self, event: &Event<'_>, ctx: Context<'_, S>) { + if self.level.ge(event.metadata().level()) { + self.inner.on_event(event, ctx); + } + } +} diff --git a/swap/src/common.rs b/swap/src/common.rs new file mode 100644 index 00000000..98b9b99d --- /dev/null +++ b/swap/src/common.rs @@ -0,0 +1,56 @@ +use anyhow::anyhow; + +const LATEST_RELEASE_URL: &str = "https://github.com/comit-network/xmr-btc-swap/releases/latest"; + +#[derive(Clone, Debug, PartialEq, Eq)] +pub enum Version { + Current, + Available, +} + +/// Check the latest release from GitHub API. +pub async fn check_latest_version(current_version: &str) -> anyhow::Result { + let response = reqwest::get(LATEST_RELEASE_URL).await?; + let e = "Failed to get latest release."; + let download_url = response.url(); + let segments = download_url.path_segments().ok_or_else(|| anyhow!(e))?; + let latest_version = segments.last().ok_or_else(|| anyhow!(e))?; + + let result = if is_latest_version(current_version, latest_version) { + Version::Current + } else { + tracing::warn!(%current_version, %latest_version, %download_url, + "You are not on the latest version", + ); + Version::Available + }; + + Ok(result) +} + +// todo: naive implementation can be improved using semver +fn is_latest_version(current: &str, latest: &str) -> bool { + current == latest +} + +#[cfg(test)] +mod test { + use super::*; + + #[test] + fn it_compares_versions() { + assert!(is_latest_version("0.10.2", "0.10.2")); + assert!(!is_latest_version("0.10.2", "0.10.3")); + assert!(!is_latest_version("0.10.2", "0.11.0")); + } + + #[tokio::test] + #[ignore = "For local testing, makes http requests to github."] + async fn it_compares_with_github() { + let result = check_latest_version("0.11.0").await.unwrap(); + assert_eq!(result, Version::Available); + + let result = check_latest_version("0.11.1").await.unwrap(); + assert_eq!(result, Version::Current); + } +} diff --git a/swap/src/common/mod.rs b/swap/src/common/mod.rs deleted file mode 100644 index bae1c0f4..00000000 --- a/swap/src/common/mod.rs +++ /dev/null @@ -1,221 +0,0 @@ -pub mod tracing_util; - -use std::{collections::HashMap, path::PathBuf}; - -use anyhow::anyhow; -use tokio::{ - fs::{read_dir, File}, - io::{AsyncBufReadExt, BufReader}, -}; -use uuid::Uuid; - -const LATEST_RELEASE_URL: &str = "https://github.com/comit-network/xmr-btc-swap/releases/latest"; - -#[derive(Clone, Debug, PartialEq, Eq)] -pub enum Version { - Current, - Available, -} - -/// Check the latest release from GitHub API. -pub async fn check_latest_version(current_version: &str) -> anyhow::Result { - let response = reqwest::get(LATEST_RELEASE_URL).await?; - let e = "Failed to get latest release."; - let download_url = response.url(); - let segments = download_url.path_segments().ok_or_else(|| anyhow!(e))?; - let latest_version = segments.last().ok_or_else(|| anyhow!(e))?; - - let result = if is_latest_version(current_version, latest_version) { - Version::Current - } else { - tracing::warn!(%current_version, %latest_version, %download_url, - "You are not on the latest version", - ); - Version::Available - }; - - Ok(result) -} - -// todo: naive implementation can be improved using semver -fn is_latest_version(current: &str, latest: &str) -> bool { - current == latest -} - -/// helper macro for [`redact`]... eldrich sorcery -/// the macro does in essence the following: -/// 1. create a static regex automaton for the pattern -/// 2. find all matching patterns using regex -/// 3. create a placeholder for each distinct matching pattern -/// 4. add the placeholder to the hashmap -macro_rules! regex_find_placeholders { - ($pattern:expr, $create_placeholder:expr, $replacements:expr, $input:expr) => {{ - // compile the regex pattern - static REGEX: once_cell::sync::Lazy = once_cell::sync::Lazy::new(|| { - tracing::debug!("initializing regex"); - regex::Regex::new($pattern).expect("invalid regex pattern") - }); - - // keep count of count patterns to generate distinct placeholders - let mut counter: usize = 0; - - // for every matched address check whether we already found it - // and if we didn't, generate a placeholder for it - for address in REGEX.find_iter($input) { - if !$replacements.contains_key(address.as_str()) { - #[allow(clippy::redundant_closure_call)] - $replacements.insert(address.as_str().to_owned(), $create_placeholder(counter)); - counter += 1; - } - } - }}; -} - -/// Print the logs from the specified logs or from the default location -/// to the specified path or the terminal. -/// -/// If specified, filter by swap id or redact addresses. -pub async fn get_logs( - logs_dir: PathBuf, - swap_id: Option, - redact_addresses: bool, -) -> anyhow::Result> { - tracing::debug!("reading logfiles from {}", logs_dir.display()); - - // get all files in the directory - let mut log_files = read_dir(&logs_dir).await?; - - let mut log_messages = Vec::new(); - // when we redact we need to store the placeholder - let mut placeholders = HashMap::new(); - - // print all lines from every log file. TODO: sort files by date? - while let Some(entry) = log_files.next_entry().await? { - // get the file path - let file_path = entry.path(); - - // filter for .log files - let file_name = file_path - .file_name() - .and_then(|name| name.to_str()) - .unwrap_or(""); - - if !file_name.ends_with(".log") { - continue; - } - - // use BufReader to stay easy on memory and then read line by line - let buf_reader = BufReader::new(File::open(&file_path).await?); - let mut lines = buf_reader.lines(); - - // print each line, redacted if the flag is set - while let Some(line) = lines.next_line().await? { - // if we should filter by swap id, check if the line contains it - if let Some(swap_id) = swap_id { - // we only want lines which contain the swap id - if !line.contains(&swap_id.to_string()) { - continue; - } - } - - // redact if necessary - let line = if redact_addresses { - redact_with(&line, &mut placeholders) - } else { - line - }; - // save redacted message - log_messages.push(line); - } - } - - Ok(log_messages) -} - -/// Redact logs, etc. by replacing Bitcoin and Monero addresses -/// with generic placeholders. -/// -/// # Example -/// ```rust -/// use swap::common::redact; -/// -/// let redacted = redact("a9165a1e-d26d-4b56-bf6d-ca9658825c44"); -/// assert_eq!(redacted, ""); -/// ``` -pub fn redact(input: &str) -> String { - let mut replacements = HashMap::new(); - redact_with(input, &mut replacements) -} - -/// Same as [`redact`] but retrieves palceholders from and stores them -/// in a specified hashmap. -pub fn redact_with(input: &str, replacements: &mut HashMap) -> String { - // TODO: verify regex patterns - const MONERO_ADDR_REGEX: &str = r#"[48][1-9A-HJ-NP-Za-km-z]{94}"#; - const BITCOIN_ADDR_REGEX: &str = r#"\b[13][a-km-zA-HJ-NP-Z1-9]{25,34}\b"#; - // Both XMR and BTC transactions have - // a 64 bit hex id so they aren't distinguishible - const TX_ID_REGEX: &str = r#"\b[a-fA-F0-9]{64}\b"#; - const SWAP_ID_REGEX: &str = - r#"\b[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89aAbB][a-f0-9]{3}-[a-f0-9]{12}\b"#; - - // use the macro to find all addresses and generate placeholders - // has to be a macro in order to create the regex automata only once. - regex_find_placeholders!( - MONERO_ADDR_REGEX, - |count| format!(""), - replacements, - input - ); - regex_find_placeholders!( - BITCOIN_ADDR_REGEX, - |count| format!(""), - replacements, - input - ); - regex_find_placeholders!( - TX_ID_REGEX, - |count| format!(""), - replacements, - input - ); - regex_find_placeholders!( - SWAP_ID_REGEX, - |count| format!(""), - replacements, - input - ); - - // allocate string variable to operate on - let mut redacted = input.to_owned(); - - // Finally we go through the input string and replace each occurance of an - // address we want to redact with the corresponding placeholder - for (address, placeholder) in replacements.iter() { - redacted = redacted.replace(address, placeholder); - } - - redacted -} - -#[cfg(test)] -mod test { - use super::*; - - #[test] - fn it_compares_versions() { - assert!(is_latest_version("0.10.2", "0.10.2")); - assert!(!is_latest_version("0.10.2", "0.10.3")); - assert!(!is_latest_version("0.10.2", "0.11.0")); - } - - #[tokio::test] - #[ignore = "For local testing, makes http requests to github."] - async fn it_compares_with_github() { - let result = check_latest_version("0.11.0").await.unwrap(); - assert_eq!(result, Version::Available); - - let result = check_latest_version("0.11.1").await.unwrap(); - assert_eq!(result, Version::Current); - } -} diff --git a/swap/src/common/tracing_util.rs b/swap/src/common/tracing_util.rs deleted file mode 100644 index 191c43bf..00000000 --- a/swap/src/common/tracing_util.rs +++ /dev/null @@ -1,64 +0,0 @@ -use std::path::Path; -use std::str::FromStr; - -use anyhow::Result; -use tracing_subscriber::filter::{Directive, LevelFilter}; -use tracing_subscriber::fmt::time::UtcTime; -use tracing_subscriber::layer::SubscriberExt; -use tracing_subscriber::util::SubscriberInitExt; -use tracing_subscriber::{fmt, EnvFilter, Layer}; - -/// Output formats for logging messages. -pub enum Format { - /// Standard, human readable format. - Raw, - /// JSON, machine readable format. - Json, -} - -/// Initialize tracing and enable logging messages according to these options. -/// Besides printing to `stdout`, this will append to a log file. -/// Said file will contain JSON-formatted logs of all levels, -/// disregarding the arguments to this function. -pub fn init(level_filter: LevelFilter, format: Format, dir: impl AsRef) -> Result<()> { - let env_filter = EnvFilter::from_default_env() - .add_directive(Directive::from_str(&format!("asb={}", &level_filter))?) - .add_directive(Directive::from_str(&format!("swap={}", &level_filter))?); - - // file logger will always write in JSON format and with timestamps - let file_appender = tracing_appender::rolling::never(&dir, "swap-all.log"); - - let file_layer = fmt::layer() - .with_writer(file_appender) - .with_ansi(false) - .with_timer(UtcTime::rfc_3339()) - .with_target(false) - .json() - .with_filter(env_filter); - - // terminal logger - let is_terminal = atty::is(atty::Stream::Stderr); - let terminal_layer = fmt::layer() - .with_writer(std::io::stdout) - .with_ansi(is_terminal) - .with_timer(UtcTime::rfc_3339()) - .with_target(false); - - // combine the layers and start logging, format with json if specified - if let Format::Json = format { - tracing_subscriber::registry() - .with(file_layer) - .with(terminal_layer.json().with_filter(level_filter)) - .init(); - } else { - tracing_subscriber::registry() - .with(file_layer) - .with(terminal_layer.with_filter(level_filter)) - .init(); - } - - // now we can use the tracing macros to log messages - tracing::info!(%level_filter, logs_dir=%dir.as_ref().display(), "Initialized tracing"); - - Ok(()) -} diff --git a/swap/src/database/sqlite.rs b/swap/src/database/sqlite.rs index ce455b6c..eb013f66 100644 --- a/swap/src/database/sqlite.rs +++ b/swap/src/database/sqlite.rs @@ -5,7 +5,7 @@ use anyhow::{anyhow, Context, Result}; use async_trait::async_trait; use libp2p::{Multiaddr, PeerId}; use sqlx::sqlite::{Sqlite, SqliteConnectOptions}; -use sqlx::{ConnectOptions, Pool, SqlitePool}; +use sqlx::{Pool, SqlitePool}; use std::collections::HashMap; use std::path::Path; use std::str::FromStr; @@ -26,8 +26,7 @@ impl SqliteDatabase { let read_only = matches!(access_mode, AccessMode::ReadOnly); let path_str = format!("sqlite:{}", path.as_ref().display()); - let mut options = SqliteConnectOptions::from_str(&path_str)?.read_only(read_only); - options.disable_statement_logging(); + let options = SqliteConnectOptions::from_str(&path_str)?.read_only(read_only); let pool = SqlitePool::connect_with(options).await?; let mut sqlite = Self { pool }; diff --git a/swap/src/monero.rs b/swap/src/monero.rs index e5dd9e80..8205e75f 100644 --- a/swap/src/monero.rs +++ b/swap/src/monero.rs @@ -142,14 +142,6 @@ impl Amount { Decimal::from(self.as_piconero()) } - pub fn as_xmr(&self) -> Decimal { - let mut decimal = Decimal::from(self.0); - decimal - .set_scale(12) - .expect("12 is smaller than max precision of 28"); - decimal - } - fn from_decimal(amount: Decimal) -> Result { let piconeros_dec = amount.mul(Decimal::from_u64(PICONERO_OFFSET).expect("constant to fit into u64")); @@ -192,8 +184,11 @@ impl From for u64 { impl fmt::Display for Amount { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - let xmr_value = self.as_xmr(); - write!(f, "{} XMR", xmr_value) + let mut decimal = Decimal::from(self.0); + decimal + .set_scale(12) + .expect("12 is smaller than max precision of 28"); + write!(f, "{} XMR", decimal) } } diff --git a/swap/src/protocol/alice/state.rs b/swap/src/protocol/alice/state.rs index 7627a529..f0acab23 100644 --- a/swap/src/protocol/alice/state.rs +++ b/swap/src/protocol/alice/state.rs @@ -384,8 +384,8 @@ pub struct State3 { S_b_bitcoin: bitcoin::PublicKey, pub v: monero::PrivateViewKey, #[serde(with = "::bitcoin::util::amount::serde::as_sat")] - pub btc: bitcoin::Amount, - pub xmr: monero::Amount, + btc: bitcoin::Amount, + xmr: monero::Amount, pub cancel_timelock: CancelTimelock, pub punish_timelock: PunishTimelock, refund_address: bitcoin::Address, diff --git a/swap/src/protocol/alice/swap.rs b/swap/src/protocol/alice/swap.rs index 14f718d3..3848a2e1 100644 --- a/swap/src/protocol/alice/swap.rs +++ b/swap/src/protocol/alice/swap.rs @@ -440,7 +440,7 @@ where }) } -pub fn is_complete(state: &AliceState) -> bool { +pub(crate) fn is_complete(state: &AliceState) -> bool { matches!( state, AliceState::XmrRefunded diff --git a/swap/src/protocol/bob/state.rs b/swap/src/protocol/bob/state.rs index 04e7778e..8fe5ca32 100644 --- a/swap/src/protocol/bob/state.rs +++ b/swap/src/protocol/bob/state.rs @@ -369,7 +369,7 @@ pub struct State3 { S_a_monero: monero::PublicKey, S_a_bitcoin: bitcoin::PublicKey, v: monero::PrivateViewKey, - pub xmr: monero::Amount, + xmr: monero::Amount, pub cancel_timelock: CancelTimelock, punish_timelock: PunishTimelock, refund_address: bitcoin::Address, diff --git a/swap/src/rpc/methods.rs b/swap/src/rpc/methods.rs index dd3d9a62..f804e085 100644 --- a/swap/src/rpc/methods.rs +++ b/swap/src/rpc/methods.rs @@ -7,9 +7,7 @@ use anyhow::Result; use jsonrpsee::server::RpcModule; use jsonrpsee::types::Params; use libp2p::core::Multiaddr; -use serde::Deserialize; use std::collections::HashMap; -use std::path::PathBuf; use std::str::FromStr; use std::sync::Arc; use uuid::Uuid; @@ -50,30 +48,8 @@ pub fn register_modules(context: Arc) -> Result> execute_request(params_raw, Method::Balance { force_refresh }, &context).await })?; - module.register_async_method("get_history", |params_raw, context| async move { - execute_request(params_raw, Method::History, &context).await - })?; - - module.register_async_method("get_logs", |params_raw, context| async move { - #[derive(Debug, Clone, Deserialize)] - struct Params { - swap_id: Option, - logs_dir: Option, - redact: bool, - } - - let params: Params = params_raw.parse()?; - - execute_request( - params_raw, - Method::Logs { - swap_id: params.swap_id, - logs_dir: params.logs_dir, - redact: params.redact, - }, - &context, - ) - .await + module.register_async_method("get_history", |params, context| async move { + execute_request(params, Method::History, &context).await })?; module.register_async_method("get_raw_states", |params, context| async move { diff --git a/swap/src/seed.rs b/swap/src/seed.rs index a17a7964..aa363905 100644 --- a/swap/src/seed.rs +++ b/swap/src/seed.rs @@ -1,9 +1,9 @@ use crate::fs::ensure_directory_exists; +use ::bitcoin::secp256k1::constants::SECRET_KEY_SIZE; +use ::bitcoin::secp256k1::{self, SecretKey}; use anyhow::{Context, Result}; use bdk::bitcoin::util::bip32::ExtendedPrivKey; use bitcoin::hashes::{sha256, Hash, HashEngine}; -use bitcoin::secp256k1::constants::SECRET_KEY_SIZE; -use bitcoin::secp256k1::{self, SecretKey}; use libp2p::identity; use pem::{encode, Pem}; use rand::prelude::*; diff --git a/swap/tests/rpc.rs b/swap/tests/rpc.rs index 553ccf46..5dc640d4 100644 --- a/swap/tests/rpc.rs +++ b/swap/tests/rpc.rs @@ -103,26 +103,13 @@ mod test { let (client, _, _) = setup_daemon(harness_ctx).await; - let response: HashMap> = client + let response: HashMap> = client .request("get_history", ObjectParams::new()) .await .unwrap(); + let swaps: Vec<(Uuid, String)> = vec![(bob_swap_id, "btc is locked".to_string())]; - let swaps = response.get("swaps").unwrap(); - assert_eq!(swaps.len(), 1); - - assert_has_keys_serde( - swaps[0].as_object().unwrap(), - &[ - "swapId", - "startDate", - "state", - "btcAmount", - "xmrAmount", - "exchangeRate", - "tradingPartnerPeerId", - ], - ); + assert_eq!(response, HashMap::from([("swaps".to_string(), swaps)])); let response: HashMap>> = client .request("get_raw_states", ObjectParams::new())