mirror of
https://github.com/comit-network/xmr-btc-swap.git
synced 2025-04-24 17:59:20 -04:00
Compare commits
No commits in common. "master" and "0.13.4" have entirely different histories.
@ -1,6 +1,2 @@
|
|||||||
[target.armv7-unknown-linux-gnueabihf]
|
[target.armv7-unknown-linux-gnueabihf]
|
||||||
linker = "arm-linux-gnueabihf-gcc"
|
linker = "arm-linux-gnueabihf-gcc"
|
||||||
|
|
||||||
# windows defaults to smaller stack sizes which isn't enough
|
|
||||||
[target.'cfg(windows)']
|
|
||||||
rustflags = ["-C", "link-args=/STACK:8388608"]
|
|
||||||
|
4
.github/workflows/build-release-binaries.yml
vendored
4
.github/workflows/build-release-binaries.yml
vendored
@ -54,12 +54,12 @@ jobs:
|
|||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout tagged commit
|
- name: Checkout tagged commit
|
||||||
uses: actions/checkout@v4.2.1
|
uses: actions/checkout@v4.1.7
|
||||||
with:
|
with:
|
||||||
ref: ${{ github.event.release.target_commitish }}
|
ref: ${{ github.event.release.target_commitish }}
|
||||||
token: ${{ secrets.BOTTY_GITHUB_TOKEN }}
|
token: ${{ secrets.BOTTY_GITHUB_TOKEN }}
|
||||||
|
|
||||||
- uses: Swatinem/rust-cache@v2.7.5
|
- uses: Swatinem/rust-cache@v2.7.3
|
||||||
|
|
||||||
- uses: dtolnay/rust-toolchain@master
|
- uses: dtolnay/rust-toolchain@master
|
||||||
with:
|
with:
|
||||||
|
32
.github/workflows/ci.yml
vendored
32
.github/workflows/ci.yml
vendored
@ -11,14 +11,14 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout sources
|
- name: Checkout sources
|
||||||
uses: actions/checkout@v4.2.1
|
uses: actions/checkout@v4.1.7
|
||||||
|
|
||||||
- uses: dtolnay/rust-toolchain@master
|
- uses: dtolnay/rust-toolchain@master
|
||||||
with:
|
with:
|
||||||
toolchain: "1.74"
|
toolchain: "1.74"
|
||||||
components: clippy,rustfmt
|
components: clippy,rustfmt
|
||||||
|
|
||||||
- uses: Swatinem/rust-cache@v2.7.5
|
- uses: Swatinem/rust-cache@v2.7.3
|
||||||
|
|
||||||
- name: Check formatting
|
- name: Check formatting
|
||||||
uses: dprint/check@v2.2
|
uses: dprint/check@v2.2
|
||||||
@ -35,9 +35,9 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout sources
|
- 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
|
- name: Build swap
|
||||||
run: cargo build --bin swap
|
run: cargo build --bin swap
|
||||||
@ -49,9 +49,9 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout sources
|
- 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
|
- name: Install sqlx-cli
|
||||||
run: cargo install --locked --version 0.6.3 sqlx-cli
|
run: cargo install --locked --version 0.6.3 sqlx-cli
|
||||||
@ -78,9 +78,9 @@ jobs:
|
|||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout sources
|
- 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
|
- uses: dtolnay/rust-toolchain@master
|
||||||
with:
|
with:
|
||||||
@ -131,9 +131,9 @@ jobs:
|
|||||||
tool-cache: false
|
tool-cache: false
|
||||||
|
|
||||||
- name: Checkout sources
|
- 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
|
- name: Build tests
|
||||||
run: cargo build --tests --workspace --all-features
|
run: cargo build --tests --workspace --all-features
|
||||||
@ -171,9 +171,9 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout sources
|
- 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 }}
|
- name: Run test ${{ matrix.test_name }}
|
||||||
run: cargo test --package swap --all-features --test ${{ matrix.test_name }} -- --nocapture
|
run: cargo test --package swap --all-features --test ${{ matrix.test_name }} -- --nocapture
|
||||||
@ -182,9 +182,9 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout sources
|
- 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
|
- name: Run RPC server tests
|
||||||
run: cargo test --package swap --all-features --test rpc -- --nocapture
|
run: cargo test --package swap --all-features --test rpc -- --nocapture
|
||||||
@ -193,11 +193,11 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout sources
|
- name: Checkout sources
|
||||||
uses: actions/checkout@v4.2.1
|
uses: actions/checkout@v4.1.7
|
||||||
|
|
||||||
- uses: dtolnay/rust-toolchain@stable
|
- 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
|
- name: Run cargo check on stable rust
|
||||||
run: cargo check --all-targets
|
run: cargo check --all-targets
|
||||||
|
2
.github/workflows/create-release.yml
vendored
2
.github/workflows/create-release.yml
vendored
@ -11,7 +11,7 @@ jobs:
|
|||||||
if: github.event.pull_request.merged == true && startsWith(github.event.pull_request.head.ref, 'release/')
|
if: github.event.pull_request.merged == true && startsWith(github.event.pull_request.head.ref, 'release/')
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4.2.1
|
- uses: actions/checkout@v4.1.7
|
||||||
|
|
||||||
- name: Extract version from branch name
|
- name: Extract version from branch name
|
||||||
id: extract-version
|
id: extract-version
|
||||||
|
4
.github/workflows/draft-new-release.yml
vendored
4
.github/workflows/draft-new-release.yml
vendored
@ -12,7 +12,7 @@ jobs:
|
|||||||
name: "Draft a new release"
|
name: "Draft a new release"
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4.2.1
|
- uses: actions/checkout@v4.1.7
|
||||||
with:
|
with:
|
||||||
token: ${{ secrets.BOTTY_GITHUB_TOKEN }}
|
token: ${{ secrets.BOTTY_GITHUB_TOKEN }}
|
||||||
|
|
||||||
@ -20,7 +20,7 @@ jobs:
|
|||||||
run: git checkout -b release/${{ github.event.inputs.version }}
|
run: git checkout -b release/${{ github.event.inputs.version }}
|
||||||
|
|
||||||
- name: Update changelog
|
- name: Update changelog
|
||||||
uses: thomaseizinger/keep-a-changelog-new-release@3.1.0
|
uses: thomaseizinger/keep-a-changelog-new-release@3.0.0
|
||||||
with:
|
with:
|
||||||
version: ${{ github.event.inputs.version }}
|
version: ${{ github.event.inputs.version }}
|
||||||
changelogPath: CHANGELOG.md
|
changelogPath: CHANGELOG.md
|
||||||
|
2
.github/workflows/preview-release.yml
vendored
2
.github/workflows/preview-release.yml
vendored
@ -10,7 +10,7 @@ jobs:
|
|||||||
name: Create preview release
|
name: Create preview release
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4.2.1
|
- uses: actions/checkout@v4.1.7
|
||||||
|
|
||||||
- name: Delete 'preview' release
|
- name: Delete 'preview' release
|
||||||
uses: larryjoelane/delete-release-action@v1.0.24
|
uses: larryjoelane/delete-release-action@v1.0.24
|
||||||
|
@ -7,9 +7,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
|
|
||||||
## [Unreleased]
|
## [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
|
## [0.13.4] - 2024-07-25
|
||||||
|
|
||||||
- ASB: The `history` command can now be used while the asb is running.
|
- ASB: The `history` command can now be used while the asb is running.
|
||||||
|
344
Cargo.lock
generated
344
Cargo.lock
generated
@ -78,15 +78,6 @@ dependencies = [
|
|||||||
"memchr",
|
"memchr",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "aho-corasick"
|
|
||||||
version = "1.1.3"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916"
|
|
||||||
dependencies = [
|
|
||||||
"memchr",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ansi_term"
|
name = "ansi_term"
|
||||||
version = "0.11.0"
|
version = "0.11.0"
|
||||||
@ -107,9 +98,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "anyhow"
|
name = "anyhow"
|
||||||
version = "1.0.91"
|
version = "1.0.86"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "c042108f3ed77fd83760a5fd79b53be043192bb3b9dba91d8c574c0ada7850c8"
|
checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "arrayref"
|
name = "arrayref"
|
||||||
@ -163,13 +154,13 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "async-trait"
|
name = "async-trait"
|
||||||
version = "0.1.83"
|
version = "0.1.81"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd"
|
checksum = "6e0c28dcc82d7c8ead5cb13beb15405b57b8546e93215673ff8ca0349a028107"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
"syn 2.0.79",
|
"syn 2.0.46",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -752,7 +743,7 @@ dependencies = [
|
|||||||
"nom",
|
"nom",
|
||||||
"pathdiff",
|
"pathdiff",
|
||||||
"serde",
|
"serde",
|
||||||
"toml 0.8.19",
|
"toml 0.8.15",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -1224,9 +1215,9 @@ checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "fastrand"
|
name = "fastrand"
|
||||||
version = "2.1.1"
|
version = "2.0.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6"
|
checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "filetime"
|
name = "filetime"
|
||||||
@ -1310,9 +1301,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "futures"
|
name = "futures"
|
||||||
version = "0.3.31"
|
version = "0.3.30"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876"
|
checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"futures-channel",
|
"futures-channel",
|
||||||
"futures-core",
|
"futures-core",
|
||||||
@ -1325,9 +1316,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "futures-channel"
|
name = "futures-channel"
|
||||||
version = "0.3.31"
|
version = "0.3.30"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10"
|
checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"futures-core",
|
"futures-core",
|
||||||
"futures-sink",
|
"futures-sink",
|
||||||
@ -1335,15 +1326,15 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "futures-core"
|
name = "futures-core"
|
||||||
version = "0.3.31"
|
version = "0.3.30"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e"
|
checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "futures-executor"
|
name = "futures-executor"
|
||||||
version = "0.3.31"
|
version = "0.3.30"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f"
|
checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"futures-core",
|
"futures-core",
|
||||||
"futures-task",
|
"futures-task",
|
||||||
@ -1364,19 +1355,19 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "futures-io"
|
name = "futures-io"
|
||||||
version = "0.3.31"
|
version = "0.3.30"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6"
|
checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "futures-macro"
|
name = "futures-macro"
|
||||||
version = "0.3.31"
|
version = "0.3.30"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650"
|
checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
"syn 2.0.79",
|
"syn 2.0.46",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -1392,15 +1383,15 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "futures-sink"
|
name = "futures-sink"
|
||||||
version = "0.3.31"
|
version = "0.3.30"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7"
|
checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "futures-task"
|
name = "futures-task"
|
||||||
version = "0.3.31"
|
version = "0.3.30"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988"
|
checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "futures-timer"
|
name = "futures-timer"
|
||||||
@ -1410,9 +1401,9 @@ checksum = "e64b03909df88034c26dc1547e8970b91f98bdb65165d6a4e9110d94263dbb2c"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "futures-util"
|
name = "futures-util"
|
||||||
version = "0.3.31"
|
version = "0.3.30"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81"
|
checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"futures-channel",
|
"futures-channel",
|
||||||
"futures-core",
|
"futures-core",
|
||||||
@ -1509,7 +1500,7 @@ version = "0.4.10"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "029d74589adefde59de1a0c4f4732695c32805624aec7b68d91503d4dba79afc"
|
checksum = "029d74589adefde59de1a0c4f4732695c32805624aec7b68d91503d4dba79afc"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"aho-corasick 0.7.18",
|
"aho-corasick",
|
||||||
"bstr",
|
"bstr",
|
||||||
"fnv",
|
"fnv",
|
||||||
"log",
|
"log",
|
||||||
@ -1772,9 +1763,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "hyper"
|
name = "hyper"
|
||||||
version = "1.5.0"
|
version = "1.4.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "bbbff0a806a4728c99295b254c8838933b5b082d75e3cb70c8dab21fdfbcfa9a"
|
checksum = "50dfd22e0e76d0f662d429a5f80fcaf3855009297eab6a0a9f8543834744ba05"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bytes",
|
"bytes",
|
||||||
"futures-channel",
|
"futures-channel",
|
||||||
@ -1783,7 +1774,6 @@ dependencies = [
|
|||||||
"http 1.0.0",
|
"http 1.0.0",
|
||||||
"http-body 1.0.0",
|
"http-body 1.0.0",
|
||||||
"httparse",
|
"httparse",
|
||||||
"httpdate",
|
|
||||||
"itoa",
|
"itoa",
|
||||||
"pin-project-lite 0.2.13",
|
"pin-project-lite 0.2.13",
|
||||||
"smallvec",
|
"smallvec",
|
||||||
@ -1799,7 +1789,7 @@ checksum = "5ee4be2c948921a1a5320b629c4193916ed787a7f7f293fd3f7f5a6c9de74155"
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"futures-util",
|
"futures-util",
|
||||||
"http 1.0.0",
|
"http 1.0.0",
|
||||||
"hyper 1.5.0",
|
"hyper 1.4.1",
|
||||||
"hyper-util",
|
"hyper-util",
|
||||||
"rustls 0.23.10",
|
"rustls 0.23.10",
|
||||||
"rustls-pki-types",
|
"rustls-pki-types",
|
||||||
@ -1820,7 +1810,7 @@ dependencies = [
|
|||||||
"futures-util",
|
"futures-util",
|
||||||
"http 1.0.0",
|
"http 1.0.0",
|
||||||
"http-body 1.0.0",
|
"http-body 1.0.0",
|
||||||
"hyper 1.5.0",
|
"hyper 1.4.1",
|
||||||
"pin-project-lite 0.2.13",
|
"pin-project-lite 0.2.13",
|
||||||
"socket2 0.5.5",
|
"socket2 0.5.5",
|
||||||
"tokio",
|
"tokio",
|
||||||
@ -1915,7 +1905,7 @@ dependencies = [
|
|||||||
"socket2 0.3.19",
|
"socket2 0.3.19",
|
||||||
"widestring",
|
"widestring",
|
||||||
"winapi",
|
"winapi",
|
||||||
"winreg",
|
"winreg 0.6.2",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -2132,9 +2122,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "libc"
|
name = "libc"
|
||||||
version = "0.2.159"
|
version = "0.2.153"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "561d97a539a36e26a9a5fad1ea11a3039a67714694aaa379433e580854bc3dc5"
|
checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "libgit2-sys"
|
name = "libgit2-sys"
|
||||||
@ -2468,9 +2458,9 @@ checksum = "7fb9b38af92608140b86b693604b9ffcc5824240a484d1ecd4795bacb2fe88f3"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "linux-raw-sys"
|
name = "linux-raw-sys"
|
||||||
version = "0.4.14"
|
version = "0.4.12"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89"
|
checksum = "c4cd1a83af159aa67994778be9070f0ae1bd732942279cabb14f86f986a21456"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "lock_api"
|
name = "lock_api"
|
||||||
@ -2517,7 +2507,7 @@ version = "0.0.1"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "f099785f7595cc4b4553a174ce30dd7589ef93391ff414dbb67f62392b9e0ce1"
|
checksum = "f099785f7595cc4b4553a174ce30dd7589ef93391ff414dbb67f62392b9e0ce1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"regex-automata 0.1.9",
|
"regex-automata",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -2526,7 +2516,7 @@ version = "0.1.0"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558"
|
checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"regex-automata 0.1.9",
|
"regex-automata",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -2603,19 +2593,14 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "mockito"
|
name = "mockito"
|
||||||
version = "1.5.0"
|
version = "1.4.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "09b34bd91b9e5c5b06338d392463e1318d683cf82ec3d3af4014609be6e2108d"
|
checksum = "d2f6e023aa5bdf392aa06c78e4a4e6d498baab5138d0c993503350ebbc37bf1e"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"assert-json-diff",
|
"assert-json-diff",
|
||||||
"bytes",
|
|
||||||
"colored",
|
"colored",
|
||||||
"futures-util",
|
"futures-core",
|
||||||
"http 1.0.0",
|
"hyper 0.14.28",
|
||||||
"http-body 1.0.0",
|
|
||||||
"http-body-util",
|
|
||||||
"hyper 1.5.0",
|
|
||||||
"hyper-util",
|
|
||||||
"log",
|
"log",
|
||||||
"rand 0.8.3",
|
"rand 0.8.3",
|
||||||
"regex",
|
"regex",
|
||||||
@ -2662,7 +2647,7 @@ dependencies = [
|
|||||||
"testcontainers",
|
"testcontainers",
|
||||||
"tokio",
|
"tokio",
|
||||||
"tracing",
|
"tracing",
|
||||||
"tracing-subscriber 0.3.18",
|
"tracing-subscriber 0.2.25",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -2848,9 +2833,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "once_cell"
|
name = "once_cell"
|
||||||
version = "1.20.2"
|
version = "1.19.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775"
|
checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "opaque-debug"
|
name = "opaque-debug"
|
||||||
@ -3156,9 +3141,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "proc-macro2"
|
name = "proc-macro2"
|
||||||
version = "1.0.87"
|
version = "1.0.74"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "b3e4daa0dcf6feba26f985457cdf104d4b4256fc5a09547140f3631bb076b19a"
|
checksum = "2de98502f212cfcea8d0bb305bd0f49d7ebdd75b64ba0a68f937d888f4e0d6db"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"unicode-ident",
|
"unicode-ident",
|
||||||
]
|
]
|
||||||
@ -3177,7 +3162,7 @@ dependencies = [
|
|||||||
"rand 0.8.3",
|
"rand 0.8.3",
|
||||||
"rand_chacha 0.3.1",
|
"rand_chacha 0.3.1",
|
||||||
"rand_xorshift",
|
"rand_xorshift",
|
||||||
"regex-syntax 0.8.5",
|
"regex-syntax 0.8.2",
|
||||||
"rusty-fork",
|
"rusty-fork",
|
||||||
"tempfile",
|
"tempfile",
|
||||||
"unarray",
|
"unarray",
|
||||||
@ -3458,14 +3443,13 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "regex"
|
name = "regex"
|
||||||
version = "1.11.0"
|
version = "1.7.3"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "38200e5ee88914975b69f657f0801b6f6dccafd44fd9326302a4aaeecfacb1d8"
|
checksum = "8b1f693b24f6ac912f4893ef08244d70b6067480d2f1a46e950c9691e6749d1d"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"aho-corasick 1.1.3",
|
"aho-corasick",
|
||||||
"memchr",
|
"memchr",
|
||||||
"regex-automata 0.4.8",
|
"regex-syntax 0.6.29",
|
||||||
"regex-syntax 0.8.5",
|
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -3478,17 +3462,6 @@ dependencies = [
|
|||||||
"regex-syntax 0.6.29",
|
"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]]
|
[[package]]
|
||||||
name = "regex-syntax"
|
name = "regex-syntax"
|
||||||
version = "0.6.29"
|
version = "0.6.29"
|
||||||
@ -3497,9 +3470,9 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "regex-syntax"
|
name = "regex-syntax"
|
||||||
version = "0.8.5"
|
version = "0.8.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c"
|
checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rend"
|
name = "rend"
|
||||||
@ -3512,9 +3485,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "reqwest"
|
name = "reqwest"
|
||||||
version = "0.12.8"
|
version = "0.12.5"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "f713147fbe92361e52392c73b8c9e48c04c6625bce969ef54dc901e58e042a7b"
|
checksum = "c7d6d2a27d57148378eb5e111173f4276ad26340ecc5c49a4a2152167a2d6a37"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"base64 0.22.1",
|
"base64 0.22.1",
|
||||||
"bytes",
|
"bytes",
|
||||||
@ -3524,7 +3497,7 @@ dependencies = [
|
|||||||
"http 1.0.0",
|
"http 1.0.0",
|
||||||
"http-body 1.0.0",
|
"http-body 1.0.0",
|
||||||
"http-body-util",
|
"http-body-util",
|
||||||
"hyper 1.5.0",
|
"hyper 1.4.1",
|
||||||
"hyper-rustls",
|
"hyper-rustls",
|
||||||
"hyper-util",
|
"hyper-util",
|
||||||
"ipnet",
|
"ipnet",
|
||||||
@ -3553,7 +3526,7 @@ dependencies = [
|
|||||||
"wasm-streams",
|
"wasm-streams",
|
||||||
"web-sys",
|
"web-sys",
|
||||||
"webpki-roots 0.26.1",
|
"webpki-roots 0.26.1",
|
||||||
"windows-registry",
|
"winreg 0.52.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -3677,9 +3650,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rustix"
|
name = "rustix"
|
||||||
version = "0.38.37"
|
version = "0.38.31"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "8acb788b847c24f28525660c4d7758620a7210875711f79e7f663cc152726811"
|
checksum = "6ea3e1a662af26cd7a3ba09c0297a31af215563ecf42817c98df621387f4e949"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bitflags 2.4.0",
|
"bitflags 2.4.0",
|
||||||
"errno",
|
"errno",
|
||||||
@ -4022,9 +3995,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "serde"
|
name = "serde"
|
||||||
version = "1.0.210"
|
version = "1.0.204"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a"
|
checksum = "bc76f558e0cbb2a839d37354c575f1dc3fdc6546b5be373ba43d95f231bf7c12"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"serde_derive",
|
"serde_derive",
|
||||||
]
|
]
|
||||||
@ -4051,32 +4024,31 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "serde_derive"
|
name = "serde_derive"
|
||||||
version = "1.0.210"
|
version = "1.0.204"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f"
|
checksum = "e0cd7e117be63d3c3678776753929474f3b04a43a080c744d6b0ae2a8c28e222"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
"syn 2.0.79",
|
"syn 2.0.46",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "serde_json"
|
name = "serde_json"
|
||||||
version = "1.0.132"
|
version = "1.0.118"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03"
|
checksum = "d947f6b3163d8857ea16c4fa0dd4840d52f3041039a85decd46867eb1abef2e4"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"itoa",
|
"itoa",
|
||||||
"memchr",
|
|
||||||
"ryu",
|
"ryu",
|
||||||
"serde",
|
"serde",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "serde_spanned"
|
name = "serde_spanned"
|
||||||
version = "0.6.7"
|
version = "0.6.6"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "eb5b1b31579f3811bf615c144393417496f152e12ac8b7663bf664f4a815306d"
|
checksum = "79e674e01f999af37c49f70a6ede167a8a60b2503e56c5599532a65baa5969a0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"serde",
|
"serde",
|
||||||
]
|
]
|
||||||
@ -4137,7 +4109,7 @@ checksum = "82fe9db325bcef1fbcde82e078a5cc4efdf787e96b3b9cf45b50b529f2083d67"
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
"syn 2.0.79",
|
"syn 2.0.46",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -4526,7 +4498,7 @@ dependencies = [
|
|||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
"rustversion",
|
"rustversion",
|
||||||
"syn 2.0.79",
|
"syn 2.0.46",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -4569,7 +4541,7 @@ dependencies = [
|
|||||||
"futures",
|
"futures",
|
||||||
"get-port",
|
"get-port",
|
||||||
"hex",
|
"hex",
|
||||||
"hyper 1.5.0",
|
"hyper 1.4.1",
|
||||||
"itertools 0.13.0",
|
"itertools 0.13.0",
|
||||||
"jsonrpsee",
|
"jsonrpsee",
|
||||||
"jsonrpsee-core",
|
"jsonrpsee-core",
|
||||||
@ -4578,14 +4550,12 @@ dependencies = [
|
|||||||
"monero",
|
"monero",
|
||||||
"monero-harness",
|
"monero-harness",
|
||||||
"monero-rpc",
|
"monero-rpc",
|
||||||
"once_cell",
|
|
||||||
"pem",
|
"pem",
|
||||||
"port_check",
|
"port_check",
|
||||||
"proptest",
|
"proptest",
|
||||||
"qrcode",
|
"qrcode",
|
||||||
"rand 0.8.3",
|
"rand 0.8.3",
|
||||||
"rand_chacha 0.3.1",
|
"rand_chacha 0.3.1",
|
||||||
"regex",
|
|
||||||
"reqwest",
|
"reqwest",
|
||||||
"rust_decimal",
|
"rust_decimal",
|
||||||
"rust_decimal_macros",
|
"rust_decimal_macros",
|
||||||
@ -4609,7 +4579,7 @@ dependencies = [
|
|||||||
"tokio-tar",
|
"tokio-tar",
|
||||||
"tokio-tungstenite",
|
"tokio-tungstenite",
|
||||||
"tokio-util",
|
"tokio-util",
|
||||||
"toml 0.8.19",
|
"toml 0.8.15",
|
||||||
"torut",
|
"torut",
|
||||||
"tracing",
|
"tracing",
|
||||||
"tracing-appender",
|
"tracing-appender",
|
||||||
@ -4635,9 +4605,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "syn"
|
name = "syn"
|
||||||
version = "2.0.79"
|
version = "2.0.46"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "89132cd0bf050864e1d38dc3bbc07a0eb8e7530af26344d3d2bbbef83499f590"
|
checksum = "89456b690ff72fddcecf231caedbe615c59480c93358a93dfae7fc29e3ebbf0e"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
@ -4649,9 +4619,6 @@ name = "sync_wrapper"
|
|||||||
version = "1.0.1"
|
version = "1.0.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394"
|
checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394"
|
||||||
dependencies = [
|
|
||||||
"futures-core",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "synstructure"
|
name = "synstructure"
|
||||||
@ -4667,15 +4634,14 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tempfile"
|
name = "tempfile"
|
||||||
version = "3.13.0"
|
version = "3.10.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "f0f2c9fc62d0beef6951ccffd757e241266a2c833136efbe35af6cd2567dca5b"
|
checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cfg-if 1.0.0",
|
"cfg-if 1.0.0",
|
||||||
"fastrand",
|
"fastrand",
|
||||||
"once_cell",
|
|
||||||
"rustix",
|
"rustix",
|
||||||
"windows-sys 0.59.0",
|
"windows-sys 0.52.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -4716,22 +4682,22 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "thiserror"
|
name = "thiserror"
|
||||||
version = "1.0.65"
|
version = "1.0.63"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "5d11abd9594d9b38965ef50805c5e469ca9cc6f197f883f717e0269a3057b3d5"
|
checksum = "c0342370b38b6a11b6cc11d6a805569958d54cfa061a29969c3b5ce2ea405724"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"thiserror-impl",
|
"thiserror-impl",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "thiserror-impl"
|
name = "thiserror-impl"
|
||||||
version = "1.0.65"
|
version = "1.0.63"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "ae71770322cbd277e69d762a16c444af02aa0575ac0d174f0b9562d3b37f8602"
|
checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
"syn 2.0.79",
|
"syn 2.0.46",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -4837,7 +4803,7 @@ checksum = "5f5ae998a069d4b5aba8ee9dad856af7d520c3699e6159b185c2acd48155d39a"
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
"syn 2.0.79",
|
"syn 2.0.46",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -4875,9 +4841,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tokio-socks"
|
name = "tokio-socks"
|
||||||
version = "0.5.2"
|
version = "0.5.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "0d4770b8024672c1101b3f6733eab95b18007dbe0847a8afe341fcf79e06043f"
|
checksum = "51165dfa029d2a65969413a6cc96f354b86b464498702f174a4efa13608fd8c0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"either",
|
"either",
|
||||||
"futures-util",
|
"futures-util",
|
||||||
@ -4930,9 +4896,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tokio-util"
|
name = "tokio-util"
|
||||||
version = "0.7.12"
|
version = "0.7.11"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "61e7c3654c13bcd040d4a03abee2c75b1d14a37b423cf5a813ceae1cc903ec6a"
|
checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bytes",
|
"bytes",
|
||||||
"futures-core",
|
"futures-core",
|
||||||
@ -4953,9 +4919,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "toml"
|
name = "toml"
|
||||||
version = "0.8.19"
|
version = "0.8.15"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e"
|
checksum = "ac2caab0bf757388c6c0ae23b3293fdb463fee59434529014f85e3263b995c28"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"serde",
|
"serde",
|
||||||
"serde_spanned",
|
"serde_spanned",
|
||||||
@ -4965,18 +4931,18 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "toml_datetime"
|
name = "toml_datetime"
|
||||||
version = "0.6.8"
|
version = "0.6.6"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41"
|
checksum = "4badfd56924ae69bcc9039335b2e017639ce3f9b001c393c1b2d1ef846ce2cbf"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"serde",
|
"serde",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "toml_edit"
|
name = "toml_edit"
|
||||||
version = "0.22.20"
|
version = "0.22.16"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "583c44c02ad26b0c3f3066fe629275e50627026c51ac2e595cca4c230ce1ce1d"
|
checksum = "278f3d518e152219c994ce877758516bca5e118eaed6996192a774fb9fbf0788"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"indexmap 2.1.0",
|
"indexmap 2.1.0",
|
||||||
"serde",
|
"serde",
|
||||||
@ -5063,7 +5029,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7"
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
"syn 2.0.79",
|
"syn 2.0.46",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -5361,9 +5327,9 @@ checksum = "05e42f7c18b8f902290b009cde6d651262f956c98bc51bca4cd1d511c9cd85c7"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "uuid"
|
name = "uuid"
|
||||||
version = "1.11.0"
|
version = "1.10.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a"
|
checksum = "81dfa00651efa65069b0b6b651f4aaa31ba9e3c3ce0137aaad053604ee7e0314"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"getrandom 0.2.11",
|
"getrandom 0.2.11",
|
||||||
"serde",
|
"serde",
|
||||||
@ -5470,7 +5436,7 @@ dependencies = [
|
|||||||
"once_cell",
|
"once_cell",
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
"syn 2.0.79",
|
"syn 2.0.46",
|
||||||
"wasm-bindgen-shared",
|
"wasm-bindgen-shared",
|
||||||
]
|
]
|
||||||
|
|
||||||
@ -5504,7 +5470,7 @@ checksum = "bae1abb6806dc1ad9e560ed242107c0f6c84335f1749dd4e8ddb012ebd5e25a7"
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
"syn 2.0.79",
|
"syn 2.0.46",
|
||||||
"wasm-bindgen-backend",
|
"wasm-bindgen-backend",
|
||||||
"wasm-bindgen-shared",
|
"wasm-bindgen-shared",
|
||||||
]
|
]
|
||||||
@ -5623,36 +5589,6 @@ version = "0.4.0"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
|
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]]
|
[[package]]
|
||||||
name = "windows-sys"
|
name = "windows-sys"
|
||||||
version = "0.32.0"
|
version = "0.32.0"
|
||||||
@ -5681,16 +5617,7 @@ version = "0.52.0"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
|
checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"windows-targets 0.52.6",
|
"windows-targets 0.52.0",
|
||||||
]
|
|
||||||
|
|
||||||
[[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",
|
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -5710,18 +5637,17 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "windows-targets"
|
name = "windows-targets"
|
||||||
version = "0.52.6"
|
version = "0.52.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
|
checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"windows_aarch64_gnullvm 0.52.6",
|
"windows_aarch64_gnullvm 0.52.0",
|
||||||
"windows_aarch64_msvc 0.52.6",
|
"windows_aarch64_msvc 0.52.0",
|
||||||
"windows_i686_gnu 0.52.6",
|
"windows_i686_gnu 0.52.0",
|
||||||
"windows_i686_gnullvm",
|
"windows_i686_msvc 0.52.0",
|
||||||
"windows_i686_msvc 0.52.6",
|
"windows_x86_64_gnu 0.52.0",
|
||||||
"windows_x86_64_gnu 0.52.6",
|
"windows_x86_64_gnullvm 0.52.0",
|
||||||
"windows_x86_64_gnullvm 0.52.6",
|
"windows_x86_64_msvc 0.52.0",
|
||||||
"windows_x86_64_msvc 0.52.6",
|
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -5732,9 +5658,9 @@ checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "windows_aarch64_gnullvm"
|
name = "windows_aarch64_gnullvm"
|
||||||
version = "0.52.6"
|
version = "0.52.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
|
checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "windows_aarch64_msvc"
|
name = "windows_aarch64_msvc"
|
||||||
@ -5750,9 +5676,9 @@ checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "windows_aarch64_msvc"
|
name = "windows_aarch64_msvc"
|
||||||
version = "0.52.6"
|
version = "0.52.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
|
checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "windows_i686_gnu"
|
name = "windows_i686_gnu"
|
||||||
@ -5768,15 +5694,9 @@ checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "windows_i686_gnu"
|
name = "windows_i686_gnu"
|
||||||
version = "0.52.6"
|
version = "0.52.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
|
checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313"
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "windows_i686_gnullvm"
|
|
||||||
version = "0.52.6"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "windows_i686_msvc"
|
name = "windows_i686_msvc"
|
||||||
@ -5792,9 +5712,9 @@ checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "windows_i686_msvc"
|
name = "windows_i686_msvc"
|
||||||
version = "0.52.6"
|
version = "0.52.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
|
checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "windows_x86_64_gnu"
|
name = "windows_x86_64_gnu"
|
||||||
@ -5810,9 +5730,9 @@ checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "windows_x86_64_gnu"
|
name = "windows_x86_64_gnu"
|
||||||
version = "0.52.6"
|
version = "0.52.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
|
checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "windows_x86_64_gnullvm"
|
name = "windows_x86_64_gnullvm"
|
||||||
@ -5822,9 +5742,9 @@ checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "windows_x86_64_gnullvm"
|
name = "windows_x86_64_gnullvm"
|
||||||
version = "0.52.6"
|
version = "0.52.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
|
checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "windows_x86_64_msvc"
|
name = "windows_x86_64_msvc"
|
||||||
@ -5840,15 +5760,15 @@ checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "windows_x86_64_msvc"
|
name = "windows_x86_64_msvc"
|
||||||
version = "0.52.6"
|
version = "0.52.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
|
checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "winnow"
|
name = "winnow"
|
||||||
version = "0.6.18"
|
version = "0.6.5"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "68a9bda4691f099d435ad181000724da8e5899daa10713c2d432552b9ccd3a6f"
|
checksum = "dffa400e67ed5a4dd237983829e66475f0a4a26938c4b04c21baede6262215b8"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"memchr",
|
"memchr",
|
||||||
]
|
]
|
||||||
@ -5862,6 +5782,16 @@ dependencies = [
|
|||||||
"winapi",
|
"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]]
|
[[package]]
|
||||||
name = "x25519-dalek"
|
name = "x25519-dalek"
|
||||||
version = "1.1.0"
|
version = "1.1.0"
|
||||||
@ -5915,7 +5845,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69"
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
"syn 2.0.79",
|
"syn 2.0.46",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
22
Dockerfile
22
Dockerfile
@ -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"]
|
|
@ -9,10 +9,6 @@ Currently, swaps are only offered in one direction with the `swap` CLI on the bu
|
|||||||
We are working on implementing a protocol where XMR moves first, but are currently blocked by advances on Monero itself.
|
We are working on implementing a protocol where XMR moves first, but are currently blocked by advances on Monero itself.
|
||||||
You can read [this blogpost](https://comit.network/blog/2021/07/02/transaction-presigning) for more information.
|
You can read [this blogpost](https://comit.network/blog/2021/07/02/transaction-presigning) for more information.
|
||||||
|
|
||||||
## Maintenance
|
|
||||||
|
|
||||||
**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.
|
|
||||||
|
|
||||||
## Quick Start
|
## Quick Start
|
||||||
|
|
||||||
1. Download the [latest `swap` binary release](https://github.com/comit-network/xmr-btc-swap/releases/latest) for your operating system.
|
1. Download the [latest `swap` binary release](https://github.com/comit-network/xmr-btc-swap/releases/latest) for your operating system.
|
||||||
|
@ -13,4 +13,4 @@ rand = "0.7"
|
|||||||
testcontainers = "0.15"
|
testcontainers = "0.15"
|
||||||
tokio = { version = "1", default-features = false, features = [ "rt-multi-thread", "time", "macros" ] }
|
tokio = { version = "1", default-features = false, features = [ "rt-multi-thread", "time", "macros" ] }
|
||||||
tracing = "0.1"
|
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" ] }
|
||||||
|
@ -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" ] }
|
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 = { version = "0.12", features = [ "serde_support" ] }
|
||||||
monero-rpc = { path = "../monero-rpc" }
|
monero-rpc = { path = "../monero-rpc" }
|
||||||
once_cell = "1.20"
|
|
||||||
pem = "3.0"
|
pem = "3.0"
|
||||||
proptest = "1"
|
proptest = "1"
|
||||||
qrcode = "0.14"
|
qrcode = "0.14"
|
||||||
rand = "0.8"
|
rand = "0.8"
|
||||||
rand_chacha = "0.3"
|
rand_chacha = "0.3"
|
||||||
regex = "1.11"
|
|
||||||
reqwest = { version = "0.12", features = [ "http2", "rustls-tls", "stream", "socks" ], default-features = false }
|
reqwest = { version = "0.12", features = [ "http2", "rustls-tls", "stream", "socks" ], default-features = false }
|
||||||
rust_decimal = { version = "1", features = [ "serde-float" ] }
|
rust_decimal = { version = "1", features = [ "serde-float" ] }
|
||||||
rust_decimal_macros = "1"
|
rust_decimal_macros = "1"
|
||||||
@ -69,7 +67,7 @@ tracing-appender = "0.2"
|
|||||||
tracing-futures = { version = "0.2", features = [ "std-future", "futures-03" ] }
|
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" ] }
|
tracing-subscriber = { version = "0.3", default-features = false, features = [ "fmt", "ansi", "env-filter", "time", "tracing-log", "json" ] }
|
||||||
url = { version = "2", features = [ "serde" ] }
|
url = { version = "2", features = [ "serde" ] }
|
||||||
uuid = { version = "1.11", features = [ "serde", "v4" ] }
|
uuid = { version = "1.10", features = [ "serde", "v4" ] }
|
||||||
void = "1"
|
void = "1"
|
||||||
|
|
||||||
[target.'cfg(not(windows))'.dependencies]
|
[target.'cfg(not(windows))'.dependencies]
|
||||||
@ -81,9 +79,9 @@ zip = "0.5"
|
|||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
bitcoin-harness = { git = "https://github.com/delta1/bitcoin-harness-rs.git", rev = "80cc8d05db2610d8531011be505b7bee2b5cdf9f" }
|
bitcoin-harness = { git = "https://github.com/delta1/bitcoin-harness-rs.git", rev = "80cc8d05db2610d8531011be505b7bee2b5cdf9f" }
|
||||||
get-port = "3"
|
get-port = "3"
|
||||||
hyper = "1.5"
|
hyper = "1.4"
|
||||||
jsonrpsee = { version = "0.16.2", features = [ "ws-client" ] }
|
jsonrpsee = { version = "0.16.2", features = [ "ws-client" ] }
|
||||||
mockito = "1.5"
|
mockito = "1.4"
|
||||||
monero-harness = { path = "../monero-harness" }
|
monero-harness = { path = "../monero-harness" }
|
||||||
port_check = "0.2"
|
port_check = "0.2"
|
||||||
proptest = "1"
|
proptest = "1"
|
||||||
|
@ -1,13 +1,12 @@
|
|||||||
pub mod request;
|
pub mod request;
|
||||||
use crate::cli::command::{Bitcoin, Monero, Tor};
|
use crate::cli::command::{Bitcoin, Monero, Tor};
|
||||||
use crate::common::tracing_util::Format;
|
|
||||||
use crate::database::{open_db, AccessMode};
|
use crate::database::{open_db, AccessMode};
|
||||||
use crate::env::{Config as EnvConfig, GetConfig, Mainnet, Testnet};
|
use crate::env::{Config as EnvConfig, GetConfig, Mainnet, Testnet};
|
||||||
use crate::fs::system_data_dir;
|
use crate::fs::system_data_dir;
|
||||||
use crate::network::rendezvous::XmrBtcNamespace;
|
use crate::network::rendezvous::XmrBtcNamespace;
|
||||||
use crate::protocol::Database;
|
use crate::protocol::Database;
|
||||||
use crate::seed::Seed;
|
use crate::seed::Seed;
|
||||||
use crate::{bitcoin, common, monero};
|
use crate::{bitcoin, cli, monero};
|
||||||
use anyhow::{bail, Context as AnyContext, Error, Result};
|
use anyhow::{bail, Context as AnyContext, Error, Result};
|
||||||
use futures::future::try_join_all;
|
use futures::future::try_join_all;
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
@ -17,8 +16,6 @@ use std::path::PathBuf;
|
|||||||
use std::sync::{Arc, Once};
|
use std::sync::{Arc, Once};
|
||||||
use tokio::sync::{broadcast, broadcast::Sender, Mutex, RwLock};
|
use tokio::sync::{broadcast, broadcast::Sender, Mutex, RwLock};
|
||||||
use tokio::task::JoinHandle;
|
use tokio::task::JoinHandle;
|
||||||
use tracing::level_filters::LevelFilter;
|
|
||||||
use tracing::Level;
|
|
||||||
use url::Url;
|
use url::Url;
|
||||||
|
|
||||||
static START: Once = Once::new();
|
static START: Once = Once::new();
|
||||||
@ -170,7 +167,6 @@ pub struct Context {
|
|||||||
pub swap_lock: Arc<SwapLock>,
|
pub swap_lock: Arc<SwapLock>,
|
||||||
pub config: Config,
|
pub config: Config,
|
||||||
pub tasks: Arc<PendingTaskList>,
|
pub tasks: Arc<PendingTaskList>,
|
||||||
pub is_daemon: bool,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[allow(clippy::too_many_arguments)]
|
#[allow(clippy::too_many_arguments)]
|
||||||
@ -184,20 +180,12 @@ impl Context {
|
|||||||
debug: bool,
|
debug: bool,
|
||||||
json: bool,
|
json: bool,
|
||||||
server_address: Option<SocketAddr>,
|
server_address: Option<SocketAddr>,
|
||||||
is_daemon: bool,
|
|
||||||
) -> Result<Context> {
|
) -> Result<Context> {
|
||||||
let data_dir = data::data_dir_from(data, is_testnet)?;
|
let data_dir = data::data_dir_from(data, is_testnet)?;
|
||||||
let env_config = env_config_from(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(|| {
|
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())
|
let seed = Seed::from_file_or_generate(data_dir.as_path())
|
||||||
@ -253,7 +241,6 @@ impl Context {
|
|||||||
},
|
},
|
||||||
swap_lock: Arc::new(SwapLock::new()),
|
swap_lock: Arc::new(SwapLock::new()),
|
||||||
tasks: Arc::new(PendingTaskList::default()),
|
tasks: Arc::new(PendingTaskList::default()),
|
||||||
is_daemon,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
Ok(context)
|
Ok(context)
|
||||||
@ -278,7 +265,6 @@ impl Context {
|
|||||||
monero_rpc_process: None,
|
monero_rpc_process: None,
|
||||||
swap_lock: Arc::new(SwapLock::new()),
|
swap_lock: Arc::new(SwapLock::new()),
|
||||||
tasks: Arc::new(PendingTaskList::default()),
|
tasks: Arc::new(PendingTaskList::default()),
|
||||||
is_daemon: true,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
use crate::api::Context;
|
use crate::api::Context;
|
||||||
use crate::bitcoin::{Amount, ExpiredTimelocks, TxLock};
|
use crate::bitcoin::{Amount, ExpiredTimelocks, TxLock};
|
||||||
use crate::cli::{list_sellers, EventLoop, SellerStatus};
|
use crate::cli::{list_sellers, EventLoop, SellerStatus};
|
||||||
use crate::common::get_logs;
|
|
||||||
use crate::libp2p_ext::MultiAddrExt;
|
use crate::libp2p_ext::MultiAddrExt;
|
||||||
use crate::network::quote::{BidQuote, ZeroQuoteReceived};
|
use crate::network::quote::{BidQuote, ZeroQuoteReceived};
|
||||||
use crate::network::swarm;
|
use crate::network::swarm;
|
||||||
@ -9,18 +8,14 @@ use crate::protocol::bob::{BobState, Swap};
|
|||||||
use crate::protocol::{bob, State};
|
use crate::protocol::{bob, State};
|
||||||
use crate::{bitcoin, cli, monero, rpc};
|
use crate::{bitcoin, cli, monero, rpc};
|
||||||
use anyhow::{bail, Context as AnyContext, Result};
|
use anyhow::{bail, Context as AnyContext, Result};
|
||||||
use comfy_table::Table;
|
|
||||||
use libp2p::core::Multiaddr;
|
use libp2p::core::Multiaddr;
|
||||||
use qrcode::render::unicode;
|
use qrcode::render::unicode;
|
||||||
use qrcode::QrCode;
|
use qrcode::QrCode;
|
||||||
use rust_decimal::prelude::FromPrimitive;
|
|
||||||
use rust_decimal::Decimal;
|
|
||||||
use serde_json::json;
|
use serde_json::json;
|
||||||
use std::cmp::min;
|
use std::cmp::min;
|
||||||
use std::convert::TryInto;
|
use std::convert::TryInto;
|
||||||
use std::future::Future;
|
use std::future::Future;
|
||||||
use std::net::SocketAddr;
|
use std::net::SocketAddr;
|
||||||
use std::path::PathBuf;
|
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
use tracing::{debug_span, field, Instrument, Span};
|
use tracing::{debug_span, field, Instrument, Span};
|
||||||
@ -50,11 +45,6 @@ pub enum Method {
|
|||||||
swap_id: Uuid,
|
swap_id: Uuid,
|
||||||
},
|
},
|
||||||
History,
|
History,
|
||||||
Logs {
|
|
||||||
logs_dir: Option<PathBuf>,
|
|
||||||
redact: bool,
|
|
||||||
swap_id: Option<Uuid>,
|
|
||||||
},
|
|
||||||
Config,
|
Config,
|
||||||
WithdrawBtc {
|
WithdrawBtc {
|
||||||
amount: Option<Amount>,
|
amount: Option<Amount>,
|
||||||
@ -132,13 +122,6 @@ impl Method {
|
|||||||
log_reference_id = field::Empty
|
log_reference_id = field::Empty
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
Method::Logs { .. } => {
|
|
||||||
debug_span!(
|
|
||||||
"method",
|
|
||||||
method_name = "Logs",
|
|
||||||
log_reference_id = field::Empty
|
|
||||||
)
|
|
||||||
}
|
|
||||||
Method::ListSellers { .. } => {
|
Method::ListSellers { .. } => {
|
||||||
debug_span!(
|
debug_span!(
|
||||||
"method",
|
"method",
|
||||||
@ -655,111 +638,14 @@ impl Request {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
Method::History => {
|
Method::History => {
|
||||||
let mut table = Table::new();
|
let swaps = context.db.all().await?;
|
||||||
table.set_header(vec![
|
let mut vec: Vec<(Uuid, String)> = Vec::new();
|
||||||
"Swap ID",
|
for (swap_id, state) in swaps {
|
||||||
"Start Date",
|
let state: BobState = state.try_into()?;
|
||||||
"State",
|
vec.push((swap_id, state.to_string()));
|
||||||
"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")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if !context.config.json && !context.is_daemon {
|
Ok(json!({ "swaps": vec }))
|
||||||
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 }))
|
|
||||||
}
|
}
|
||||||
Method::GetRawStates => {
|
Method::GetRawStates => {
|
||||||
let raw_history = context.db.raw_all().await?;
|
let raw_history = context.db.raw_all().await?;
|
||||||
|
@ -4,6 +4,7 @@ mod event_loop;
|
|||||||
mod network;
|
mod network;
|
||||||
mod rate;
|
mod rate;
|
||||||
mod recovery;
|
mod recovery;
|
||||||
|
pub mod tracing;
|
||||||
|
|
||||||
pub use event_loop::{EventLoop, EventLoopHandle, FixedRate, KrakenRate, LatestRate};
|
pub use event_loop::{EventLoop, EventLoopHandle, FixedRate, KrakenRate, LatestRate};
|
||||||
pub use network::behaviour::{Behaviour, OutEvent};
|
pub use network::behaviour::{Behaviour, OutEvent};
|
||||||
|
@ -19,6 +19,7 @@ where
|
|||||||
let args = RawArguments::from_clap(&matches);
|
let args = RawArguments::from_clap(&matches);
|
||||||
|
|
||||||
let json = args.json;
|
let json = args.json;
|
||||||
|
let disable_timestamp = args.disable_timestamp;
|
||||||
let testnet = args.testnet;
|
let testnet = args.testnet;
|
||||||
let config = args.config;
|
let config = args.config;
|
||||||
let command: RawCommand = args.cmd;
|
let command: RawCommand = args.cmd;
|
||||||
@ -27,35 +28,23 @@ where
|
|||||||
RawCommand::Start { resume_only } => Arguments {
|
RawCommand::Start { resume_only } => Arguments {
|
||||||
testnet,
|
testnet,
|
||||||
json,
|
json,
|
||||||
|
disable_timestamp,
|
||||||
config_path: config_path(config, testnet)?,
|
config_path: config_path(config, testnet)?,
|
||||||
env_config: env_config(testnet),
|
env_config: env_config(testnet),
|
||||||
cmd: Command::Start { resume_only },
|
cmd: Command::Start { resume_only },
|
||||||
},
|
},
|
||||||
RawCommand::History { only_unfinished } => Arguments {
|
RawCommand::History => Arguments {
|
||||||
testnet,
|
testnet,
|
||||||
json,
|
json,
|
||||||
|
disable_timestamp,
|
||||||
config_path: config_path(config, testnet)?,
|
config_path: config_path(config, testnet)?,
|
||||||
env_config: env_config(testnet),
|
env_config: env_config(testnet),
|
||||||
cmd: Command::History { only_unfinished },
|
cmd: Command::History,
|
||||||
},
|
|
||||||
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,
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
RawCommand::WithdrawBtc { amount, address } => Arguments {
|
RawCommand::WithdrawBtc { amount, address } => Arguments {
|
||||||
testnet,
|
testnet,
|
||||||
json,
|
json,
|
||||||
|
disable_timestamp,
|
||||||
config_path: config_path(config, testnet)?,
|
config_path: config_path(config, testnet)?,
|
||||||
env_config: env_config(testnet),
|
env_config: env_config(testnet),
|
||||||
cmd: Command::WithdrawBtc {
|
cmd: Command::WithdrawBtc {
|
||||||
@ -66,6 +55,7 @@ where
|
|||||||
RawCommand::Balance => Arguments {
|
RawCommand::Balance => Arguments {
|
||||||
testnet,
|
testnet,
|
||||||
json,
|
json,
|
||||||
|
disable_timestamp,
|
||||||
config_path: config_path(config, testnet)?,
|
config_path: config_path(config, testnet)?,
|
||||||
env_config: env_config(testnet),
|
env_config: env_config(testnet),
|
||||||
cmd: Command::Balance,
|
cmd: Command::Balance,
|
||||||
@ -73,6 +63,7 @@ where
|
|||||||
RawCommand::Config => Arguments {
|
RawCommand::Config => Arguments {
|
||||||
testnet,
|
testnet,
|
||||||
json,
|
json,
|
||||||
|
disable_timestamp,
|
||||||
config_path: config_path(config, testnet)?,
|
config_path: config_path(config, testnet)?,
|
||||||
env_config: env_config(testnet),
|
env_config: env_config(testnet),
|
||||||
cmd: Command::Config,
|
cmd: Command::Config,
|
||||||
@ -80,6 +71,7 @@ where
|
|||||||
RawCommand::ExportBitcoinWallet => Arguments {
|
RawCommand::ExportBitcoinWallet => Arguments {
|
||||||
testnet,
|
testnet,
|
||||||
json,
|
json,
|
||||||
|
disable_timestamp,
|
||||||
config_path: config_path(config, testnet)?,
|
config_path: config_path(config, testnet)?,
|
||||||
env_config: env_config(testnet),
|
env_config: env_config(testnet),
|
||||||
cmd: Command::ExportBitcoinWallet,
|
cmd: Command::ExportBitcoinWallet,
|
||||||
@ -90,6 +82,7 @@ where
|
|||||||
}) => Arguments {
|
}) => Arguments {
|
||||||
testnet,
|
testnet,
|
||||||
json,
|
json,
|
||||||
|
disable_timestamp,
|
||||||
config_path: config_path(config, testnet)?,
|
config_path: config_path(config, testnet)?,
|
||||||
env_config: env_config(testnet),
|
env_config: env_config(testnet),
|
||||||
cmd: Command::Redeem {
|
cmd: Command::Redeem {
|
||||||
@ -103,6 +96,7 @@ where
|
|||||||
}) => Arguments {
|
}) => Arguments {
|
||||||
testnet,
|
testnet,
|
||||||
json,
|
json,
|
||||||
|
disable_timestamp,
|
||||||
config_path: config_path(config, testnet)?,
|
config_path: config_path(config, testnet)?,
|
||||||
env_config: env_config(testnet),
|
env_config: env_config(testnet),
|
||||||
cmd: Command::Cancel { swap_id },
|
cmd: Command::Cancel { swap_id },
|
||||||
@ -112,6 +106,7 @@ where
|
|||||||
}) => Arguments {
|
}) => Arguments {
|
||||||
testnet,
|
testnet,
|
||||||
json,
|
json,
|
||||||
|
disable_timestamp,
|
||||||
config_path: config_path(config, testnet)?,
|
config_path: config_path(config, testnet)?,
|
||||||
env_config: env_config(testnet),
|
env_config: env_config(testnet),
|
||||||
cmd: Command::Refund { swap_id },
|
cmd: Command::Refund { swap_id },
|
||||||
@ -121,6 +116,7 @@ where
|
|||||||
}) => Arguments {
|
}) => Arguments {
|
||||||
testnet,
|
testnet,
|
||||||
json,
|
json,
|
||||||
|
disable_timestamp,
|
||||||
config_path: config_path(config, testnet)?,
|
config_path: config_path(config, testnet)?,
|
||||||
env_config: env_config(testnet),
|
env_config: env_config(testnet),
|
||||||
cmd: Command::Punish { swap_id },
|
cmd: Command::Punish { swap_id },
|
||||||
@ -128,6 +124,7 @@ where
|
|||||||
RawCommand::ManualRecovery(ManualRecovery::SafelyAbort { swap_id }) => Arguments {
|
RawCommand::ManualRecovery(ManualRecovery::SafelyAbort { swap_id }) => Arguments {
|
||||||
testnet,
|
testnet,
|
||||||
json,
|
json,
|
||||||
|
disable_timestamp,
|
||||||
config_path: config_path(config, testnet)?,
|
config_path: config_path(config, testnet)?,
|
||||||
env_config: env_config(testnet),
|
env_config: env_config(testnet),
|
||||||
cmd: Command::SafelyAbort { swap_id },
|
cmd: Command::SafelyAbort { swap_id },
|
||||||
@ -187,6 +184,7 @@ pub struct BitcoinAddressNetworkMismatch {
|
|||||||
pub struct Arguments {
|
pub struct Arguments {
|
||||||
pub testnet: bool,
|
pub testnet: bool,
|
||||||
pub json: bool,
|
pub json: bool,
|
||||||
|
pub disable_timestamp: bool,
|
||||||
pub config_path: PathBuf,
|
pub config_path: PathBuf,
|
||||||
pub env_config: env::Config,
|
pub env_config: env::Config,
|
||||||
pub cmd: Command,
|
pub cmd: Command,
|
||||||
@ -197,15 +195,8 @@ pub enum Command {
|
|||||||
Start {
|
Start {
|
||||||
resume_only: bool,
|
resume_only: bool,
|
||||||
},
|
},
|
||||||
History {
|
History,
|
||||||
only_unfinished: bool,
|
|
||||||
},
|
|
||||||
Config,
|
Config,
|
||||||
Logs {
|
|
||||||
logs_dir: Option<PathBuf>,
|
|
||||||
swap_id: Option<Uuid>,
|
|
||||||
redact: bool,
|
|
||||||
},
|
|
||||||
WithdrawBtc {
|
WithdrawBtc {
|
||||||
amount: Option<Amount>,
|
amount: Option<Amount>,
|
||||||
address: Address,
|
address: Address,
|
||||||
@ -277,33 +268,8 @@ pub enum RawCommand {
|
|||||||
)]
|
)]
|
||||||
resume_only: bool,
|
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<PathBuf>,
|
|
||||||
#[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<Uuid>,
|
|
||||||
},
|
|
||||||
#[structopt(about = "Prints swap-id and the state of each swap ever made.")]
|
#[structopt(about = "Prints swap-id and the state of each swap ever made.")]
|
||||||
History {
|
History,
|
||||||
#[structopt(
|
|
||||||
long = "only-unfinished",
|
|
||||||
help = "If set, only unfinished swaps will be printed."
|
|
||||||
)]
|
|
||||||
only_unfinished: bool,
|
|
||||||
},
|
|
||||||
#[structopt(about = "Prints the current config")]
|
#[structopt(about = "Prints the current config")]
|
||||||
Config,
|
Config,
|
||||||
#[structopt(about = "Allows withdrawing BTC from the internal Bitcoin wallet.")]
|
#[structopt(about = "Allows withdrawing BTC from the internal Bitcoin wallet.")]
|
||||||
@ -400,6 +366,7 @@ mod tests {
|
|||||||
let expected_args = Arguments {
|
let expected_args = Arguments {
|
||||||
testnet: false,
|
testnet: false,
|
||||||
json: false,
|
json: false,
|
||||||
|
disable_timestamp: false,
|
||||||
config_path: default_mainnet_conf_path,
|
config_path: default_mainnet_conf_path,
|
||||||
env_config: mainnet_env_config,
|
env_config: mainnet_env_config,
|
||||||
cmd: Command::Start { resume_only: false },
|
cmd: Command::Start { resume_only: false },
|
||||||
@ -417,11 +384,10 @@ mod tests {
|
|||||||
let expected_args = Arguments {
|
let expected_args = Arguments {
|
||||||
testnet: false,
|
testnet: false,
|
||||||
json: false,
|
json: false,
|
||||||
|
disable_timestamp: false,
|
||||||
config_path: default_mainnet_conf_path,
|
config_path: default_mainnet_conf_path,
|
||||||
env_config: mainnet_env_config,
|
env_config: mainnet_env_config,
|
||||||
cmd: Command::History {
|
cmd: Command::History,
|
||||||
only_unfinished: false,
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
let args = parse_args(raw_ars).unwrap();
|
let args = parse_args(raw_ars).unwrap();
|
||||||
assert_eq!(expected_args, args);
|
assert_eq!(expected_args, args);
|
||||||
@ -436,6 +402,7 @@ mod tests {
|
|||||||
let expected_args = Arguments {
|
let expected_args = Arguments {
|
||||||
testnet: false,
|
testnet: false,
|
||||||
json: false,
|
json: false,
|
||||||
|
disable_timestamp: false,
|
||||||
config_path: default_mainnet_conf_path,
|
config_path: default_mainnet_conf_path,
|
||||||
env_config: mainnet_env_config,
|
env_config: mainnet_env_config,
|
||||||
cmd: Command::Balance,
|
cmd: Command::Balance,
|
||||||
@ -457,6 +424,7 @@ mod tests {
|
|||||||
let expected_args = Arguments {
|
let expected_args = Arguments {
|
||||||
testnet: false,
|
testnet: false,
|
||||||
json: false,
|
json: false,
|
||||||
|
disable_timestamp: false,
|
||||||
config_path: default_mainnet_conf_path,
|
config_path: default_mainnet_conf_path,
|
||||||
env_config: mainnet_env_config,
|
env_config: mainnet_env_config,
|
||||||
cmd: Command::WithdrawBtc {
|
cmd: Command::WithdrawBtc {
|
||||||
@ -483,6 +451,7 @@ mod tests {
|
|||||||
let expected_args = Arguments {
|
let expected_args = Arguments {
|
||||||
testnet: false,
|
testnet: false,
|
||||||
json: false,
|
json: false,
|
||||||
|
disable_timestamp: false,
|
||||||
config_path: default_mainnet_conf_path,
|
config_path: default_mainnet_conf_path,
|
||||||
env_config: mainnet_env_config,
|
env_config: mainnet_env_config,
|
||||||
cmd: Command::Cancel {
|
cmd: Command::Cancel {
|
||||||
@ -508,6 +477,7 @@ mod tests {
|
|||||||
let expected_args = Arguments {
|
let expected_args = Arguments {
|
||||||
testnet: false,
|
testnet: false,
|
||||||
json: false,
|
json: false,
|
||||||
|
disable_timestamp: false,
|
||||||
config_path: default_mainnet_conf_path,
|
config_path: default_mainnet_conf_path,
|
||||||
env_config: mainnet_env_config,
|
env_config: mainnet_env_config,
|
||||||
cmd: Command::Refund {
|
cmd: Command::Refund {
|
||||||
@ -533,6 +503,7 @@ mod tests {
|
|||||||
let expected_args = Arguments {
|
let expected_args = Arguments {
|
||||||
testnet: false,
|
testnet: false,
|
||||||
json: false,
|
json: false,
|
||||||
|
disable_timestamp: false,
|
||||||
config_path: default_mainnet_conf_path,
|
config_path: default_mainnet_conf_path,
|
||||||
env_config: mainnet_env_config,
|
env_config: mainnet_env_config,
|
||||||
cmd: Command::Punish {
|
cmd: Command::Punish {
|
||||||
@ -558,6 +529,7 @@ mod tests {
|
|||||||
let expected_args = Arguments {
|
let expected_args = Arguments {
|
||||||
testnet: false,
|
testnet: false,
|
||||||
json: false,
|
json: false,
|
||||||
|
disable_timestamp: false,
|
||||||
config_path: default_mainnet_conf_path,
|
config_path: default_mainnet_conf_path,
|
||||||
env_config: mainnet_env_config,
|
env_config: mainnet_env_config,
|
||||||
cmd: Command::SafelyAbort {
|
cmd: Command::SafelyAbort {
|
||||||
@ -577,6 +549,7 @@ mod tests {
|
|||||||
let expected_args = Arguments {
|
let expected_args = Arguments {
|
||||||
testnet: true,
|
testnet: true,
|
||||||
json: false,
|
json: false,
|
||||||
|
disable_timestamp: false,
|
||||||
config_path: default_testnet_conf_path,
|
config_path: default_testnet_conf_path,
|
||||||
env_config: testnet_env_config,
|
env_config: testnet_env_config,
|
||||||
cmd: Command::Start { resume_only: false },
|
cmd: Command::Start { resume_only: false },
|
||||||
@ -594,11 +567,10 @@ mod tests {
|
|||||||
let expected_args = Arguments {
|
let expected_args = Arguments {
|
||||||
testnet: true,
|
testnet: true,
|
||||||
json: false,
|
json: false,
|
||||||
|
disable_timestamp: false,
|
||||||
config_path: default_testnet_conf_path,
|
config_path: default_testnet_conf_path,
|
||||||
env_config: testnet_env_config,
|
env_config: testnet_env_config,
|
||||||
cmd: Command::History {
|
cmd: Command::History,
|
||||||
only_unfinished: false,
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
let args = parse_args(raw_ars).unwrap();
|
let args = parse_args(raw_ars).unwrap();
|
||||||
assert_eq!(expected_args, args);
|
assert_eq!(expected_args, args);
|
||||||
@ -613,6 +585,7 @@ mod tests {
|
|||||||
let expected_args = Arguments {
|
let expected_args = Arguments {
|
||||||
testnet: true,
|
testnet: true,
|
||||||
json: false,
|
json: false,
|
||||||
|
disable_timestamp: false,
|
||||||
config_path: default_testnet_conf_path,
|
config_path: default_testnet_conf_path,
|
||||||
env_config: testnet_env_config,
|
env_config: testnet_env_config,
|
||||||
cmd: Command::Balance,
|
cmd: Command::Balance,
|
||||||
@ -636,6 +609,7 @@ mod tests {
|
|||||||
let expected_args = Arguments {
|
let expected_args = Arguments {
|
||||||
testnet: true,
|
testnet: true,
|
||||||
json: false,
|
json: false,
|
||||||
|
disable_timestamp: false,
|
||||||
config_path: default_testnet_conf_path,
|
config_path: default_testnet_conf_path,
|
||||||
env_config: testnet_env_config,
|
env_config: testnet_env_config,
|
||||||
cmd: Command::WithdrawBtc {
|
cmd: Command::WithdrawBtc {
|
||||||
@ -662,6 +636,7 @@ mod tests {
|
|||||||
let expected_args = Arguments {
|
let expected_args = Arguments {
|
||||||
testnet: true,
|
testnet: true,
|
||||||
json: false,
|
json: false,
|
||||||
|
disable_timestamp: false,
|
||||||
config_path: default_testnet_conf_path,
|
config_path: default_testnet_conf_path,
|
||||||
env_config: testnet_env_config,
|
env_config: testnet_env_config,
|
||||||
cmd: Command::Cancel {
|
cmd: Command::Cancel {
|
||||||
@ -688,6 +663,7 @@ mod tests {
|
|||||||
let expected_args = Arguments {
|
let expected_args = Arguments {
|
||||||
testnet: true,
|
testnet: true,
|
||||||
json: false,
|
json: false,
|
||||||
|
disable_timestamp: false,
|
||||||
config_path: default_testnet_conf_path,
|
config_path: default_testnet_conf_path,
|
||||||
env_config: testnet_env_config,
|
env_config: testnet_env_config,
|
||||||
cmd: Command::Refund {
|
cmd: Command::Refund {
|
||||||
@ -714,6 +690,7 @@ mod tests {
|
|||||||
let expected_args = Arguments {
|
let expected_args = Arguments {
|
||||||
testnet: true,
|
testnet: true,
|
||||||
json: false,
|
json: false,
|
||||||
|
disable_timestamp: false,
|
||||||
config_path: default_testnet_conf_path,
|
config_path: default_testnet_conf_path,
|
||||||
env_config: testnet_env_config,
|
env_config: testnet_env_config,
|
||||||
cmd: Command::Punish {
|
cmd: Command::Punish {
|
||||||
@ -740,6 +717,7 @@ mod tests {
|
|||||||
let expected_args = Arguments {
|
let expected_args = Arguments {
|
||||||
testnet: true,
|
testnet: true,
|
||||||
json: false,
|
json: false,
|
||||||
|
disable_timestamp: false,
|
||||||
config_path: default_testnet_conf_path,
|
config_path: default_testnet_conf_path,
|
||||||
env_config: testnet_env_config,
|
env_config: testnet_env_config,
|
||||||
cmd: Command::SafelyAbort {
|
cmd: Command::SafelyAbort {
|
||||||
@ -759,6 +737,7 @@ mod tests {
|
|||||||
let expected_args = Arguments {
|
let expected_args = Arguments {
|
||||||
testnet: false,
|
testnet: false,
|
||||||
json: false,
|
json: false,
|
||||||
|
disable_timestamp: true,
|
||||||
config_path: default_mainnet_conf_path,
|
config_path: default_mainnet_conf_path,
|
||||||
env_config: mainnet_env_config,
|
env_config: mainnet_env_config,
|
||||||
cmd: Command::Start { resume_only: false },
|
cmd: Command::Start { resume_only: false },
|
||||||
|
30
swap/src/asb/tracing.rs
Normal file
30
swap/src/asb/tracing.rs
Normal file
@ -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(())
|
||||||
|
}
|
@ -18,8 +18,6 @@ use libp2p::core::multiaddr::Protocol;
|
|||||||
use libp2p::core::Multiaddr;
|
use libp2p::core::Multiaddr;
|
||||||
use libp2p::swarm::AddressScore;
|
use libp2p::swarm::AddressScore;
|
||||||
use libp2p::Swarm;
|
use libp2p::Swarm;
|
||||||
use rust_decimal::prelude::FromPrimitive;
|
|
||||||
use rust_decimal::Decimal;
|
|
||||||
use std::convert::TryInto;
|
use std::convert::TryInto;
|
||||||
use std::env;
|
use std::env;
|
||||||
use std::net::{IpAddr, Ipv4Addr, SocketAddr};
|
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,
|
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::asb::{cancel, punish, redeem, refund, safely_abort, EventLoop, Finality, KrakenRate};
|
||||||
use swap::common::tracing_util::Format;
|
use swap::common::check_latest_version;
|
||||||
use swap::common::{self, check_latest_version, get_logs};
|
|
||||||
use swap::database::{open_db, AccessMode};
|
use swap::database::{open_db, AccessMode};
|
||||||
use swap::network::rendezvous::XmrBtcNamespace;
|
use swap::network::rendezvous::XmrBtcNamespace;
|
||||||
use swap::network::swarm;
|
use swap::network::swarm;
|
||||||
use swap::protocol::alice::swap::is_complete;
|
|
||||||
use swap::protocol::alice::{run, AliceState};
|
use swap::protocol::alice::{run, AliceState};
|
||||||
use swap::protocol::State;
|
|
||||||
use swap::seed::Seed;
|
use swap::seed::Seed;
|
||||||
use swap::tor::AuthenticatedClient;
|
use swap::tor::AuthenticatedClient;
|
||||||
use swap::{bitcoin, kraken, monero, tor};
|
use swap::{asb, bitcoin, kraken, monero, tor};
|
||||||
use tracing_subscriber::filter::LevelFilter;
|
use tracing_subscriber::filter::LevelFilter;
|
||||||
|
|
||||||
const DEFAULT_WALLET_NAME: &str = "asb-wallet";
|
const DEFAULT_WALLET_NAME: &str = "asb-wallet";
|
||||||
|
|
||||||
#[tokio::main]
|
#[tokio::main]
|
||||||
async fn main() -> Result<()> {
|
async fn main() -> Result<()> {
|
||||||
// parse cli arguments
|
|
||||||
let Arguments {
|
let Arguments {
|
||||||
testnet,
|
testnet,
|
||||||
json,
|
json,
|
||||||
|
disable_timestamp,
|
||||||
config_path,
|
config_path,
|
||||||
env_config,
|
env_config,
|
||||||
cmd,
|
cmd,
|
||||||
} = match parse_args(env::args_os()) {
|
} = match parse_args(env::args_os()) {
|
||||||
Ok(args) => args,
|
Ok(args) => args,
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
// make sure to display the clap error message it exists
|
|
||||||
if let Some(clap_err) = e.downcast_ref::<clap::Error>() {
|
if let Some(clap_err) = e.downcast_ref::<clap::Error>() {
|
||||||
if let ErrorKind::HelpDisplayed | ErrorKind::VersionDisplayed = clap_err.kind {
|
match clap_err.kind {
|
||||||
println!("{}", clap_err.message);
|
ErrorKind::HelpDisplayed | ErrorKind::VersionDisplayed => {
|
||||||
std::process::exit(0);
|
println!("{}", clap_err.message);
|
||||||
|
std::process::exit(0);
|
||||||
|
}
|
||||||
|
_ => {
|
||||||
|
bail!(e);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
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 {
|
if let Err(e) = check_latest_version(env!("CARGO_PKG_VERSION")).await {
|
||||||
eprintln!("{}", e);
|
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())? {
|
let config = match read_config(config_path.clone())? {
|
||||||
Ok(config) => config,
|
Ok(config) => config,
|
||||||
Err(ConfigNotInitialized {}) => {
|
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 {
|
if config.monero.network != env_config.monero_network {
|
||||||
bail!(format!(
|
bail!(format!(
|
||||||
"Expected monero network in config file to be {:?} but was {:?}",
|
"Expected monero network in config file to be {:?} but was {:?}",
|
||||||
@ -115,7 +108,6 @@ async fn main() -> Result<()> {
|
|||||||
rendezvous_addrs.sort();
|
rendezvous_addrs.sort();
|
||||||
rendezvous_addrs.dedup();
|
rendezvous_addrs.dedup();
|
||||||
let new_len = rendezvous_addrs.len();
|
let new_len = rendezvous_addrs.len();
|
||||||
|
|
||||||
if new_len < prev_len {
|
if new_len < prev_len {
|
||||||
tracing::warn!(
|
tracing::warn!(
|
||||||
"`rendezvous_point` config has {} duplicate entries, they are being ignored.",
|
"`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_wallet = init_monero_wallet(&config, env_config).await?;
|
||||||
let monero_address = monero_wallet.get_main_address();
|
let monero_address = monero_wallet.get_main_address();
|
||||||
tracing::info!(%monero_address, "Monero wallet address");
|
tracing::info!(%monero_address, "Monero wallet address");
|
||||||
|
|
||||||
// check monero balance
|
|
||||||
let monero = monero_wallet.get_balance().await?;
|
let monero = monero_wallet.get_balance().await?;
|
||||||
match (monero.balance, monero.unlocked_balance) {
|
match (monero.balance, monero.unlocked_balance) {
|
||||||
(0, _) => {
|
(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_wallet = init_bitcoin_wallet(&config, &seed, env_config).await?;
|
||||||
let bitcoin_balance = bitcoin_wallet.balance().await?;
|
let bitcoin_balance = bitcoin_wallet.balance().await?;
|
||||||
tracing::info!(%bitcoin_balance, "Bitcoin wallet balance");
|
tracing::info!(%bitcoin_balance, "Bitcoin wallet balance");
|
||||||
@ -236,105 +224,24 @@ async fn main() -> Result<()> {
|
|||||||
|
|
||||||
event_loop.run().await;
|
event_loop.run().await;
|
||||||
}
|
}
|
||||||
Command::History { only_unfinished } => {
|
Command::History => {
|
||||||
let db = open_db(config.data.dir.join("sqlite"), AccessMode::ReadOnly).await?;
|
let db = open_db(config.data.dir.join("sqlite"), AccessMode::ReadOnly).await?;
|
||||||
let mut table: Table = Table::new();
|
|
||||||
|
|
||||||
table.set_header(vec![
|
let mut table = Table::new();
|
||||||
"Swap ID",
|
|
||||||
"Start Date",
|
|
||||||
"State",
|
|
||||||
"BTC Amount",
|
|
||||||
"XMR Amount",
|
|
||||||
"Exchange Rate",
|
|
||||||
"Trading Partner Peer ID",
|
|
||||||
"Completed",
|
|
||||||
]);
|
|
||||||
|
|
||||||
let all_swaps = db.all().await?;
|
table.set_header(vec!["SWAP ID", "STATE"]);
|
||||||
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);
|
|
||||||
|
|
||||||
if only_unfinished && is_completed {
|
for (swap_id, state) in db.all().await? {
|
||||||
return Ok::<_, anyhow::Error>(());
|
let state: AliceState = state.try_into()?;
|
||||||
}
|
table.add_row(vec![swap_id.to_string(), state.to_string()]);
|
||||||
|
|
||||||
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");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if !json {
|
println!("{}", table);
|
||||||
println!("{}", table);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
Command::Config => {
|
Command::Config => {
|
||||||
let config_json = serde_json::to_string_pretty(&config)?;
|
let config_json = serde_json::to_string_pretty(&config)?;
|
||||||
println!("{}", config_json);
|
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 } => {
|
Command::WithdrawBtc { amount, address } => {
|
||||||
let bitcoin_wallet = init_bitcoin_wallet(&config, &seed, env_config).await?;
|
let bitcoin_wallet = init_bitcoin_wallet(&config, &seed, env_config).await?;
|
||||||
|
|
||||||
|
@ -468,7 +468,6 @@ where
|
|||||||
) -> Result<bitcoin::Amount> {
|
) -> Result<bitcoin::Amount> {
|
||||||
let client = self.client.lock().await;
|
let client = self.client.lock().await;
|
||||||
let fee_rate = client.estimate_feerate(self.target_block)?;
|
let fee_rate = client.estimate_feerate(self.target_block)?;
|
||||||
|
|
||||||
let min_relay_fee = client.min_relay_fee()?;
|
let min_relay_fee = client.min_relay_fee()?;
|
||||||
|
|
||||||
estimate_fee(weight, transfer_amount, fee_rate, 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
|
// https://github.com/romanz/electrs/blob/f9cf5386d1b5de6769ee271df5eef324aa9491bc/src/rpc.rs#L213
|
||||||
// Returned estimated fees are per BTC/kb.
|
// Returned estimated fees are per BTC/kb.
|
||||||
let fee_per_byte = self.electrum.estimate_fee(target_block)?;
|
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.
|
// we do not expect fees being that high.
|
||||||
#[allow(clippy::cast_possible_truncation)]
|
#[allow(clippy::cast_possible_truncation)]
|
||||||
Ok(FeeRate::from_btc_per_kvb(fee_per_byte as f32))
|
Ok(FeeRate::from_btc_per_kvb(fee_per_byte as f32))
|
||||||
|
@ -3,6 +3,7 @@ pub mod cancel_and_refund;
|
|||||||
pub mod command;
|
pub mod command;
|
||||||
mod event_loop;
|
mod event_loop;
|
||||||
mod list_sellers;
|
mod list_sellers;
|
||||||
|
pub mod tracing;
|
||||||
pub mod transport;
|
pub mod transport;
|
||||||
|
|
||||||
pub use behaviour::{Behaviour, OutEvent};
|
pub use behaviour::{Behaviour, OutEvent};
|
||||||
|
@ -78,7 +78,6 @@ where
|
|||||||
debug,
|
debug,
|
||||||
json,
|
json,
|
||||||
None,
|
None,
|
||||||
false,
|
|
||||||
)
|
)
|
||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
@ -101,32 +100,14 @@ where
|
|||||||
let request = Request::new(Method::History);
|
let request = Request::new(Method::History);
|
||||||
|
|
||||||
let context =
|
let context =
|
||||||
Context::build(None, None, None, data, is_testnet, debug, json, None, false)
|
Context::build(None, None, None, data, is_testnet, debug, json, None).await?;
|
||||||
.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, request)
|
(context, request)
|
||||||
}
|
}
|
||||||
CliCommand::Config => {
|
CliCommand::Config => {
|
||||||
let request = Request::new(Method::Config);
|
let request = Request::new(Method::Config);
|
||||||
|
|
||||||
let context =
|
let context =
|
||||||
Context::build(None, None, None, data, is_testnet, debug, json, None, false)
|
Context::build(None, None, None, data, is_testnet, debug, json, None).await?;
|
||||||
.await?;
|
|
||||||
(context, request)
|
(context, request)
|
||||||
}
|
}
|
||||||
CliCommand::Balance { bitcoin } => {
|
CliCommand::Balance { bitcoin } => {
|
||||||
@ -143,7 +124,6 @@ where
|
|||||||
debug,
|
debug,
|
||||||
json,
|
json,
|
||||||
None,
|
None,
|
||||||
false,
|
|
||||||
)
|
)
|
||||||
.await?;
|
.await?;
|
||||||
(context, request)
|
(context, request)
|
||||||
@ -165,7 +145,6 @@ where
|
|||||||
debug,
|
debug,
|
||||||
json,
|
json,
|
||||||
server_address,
|
server_address,
|
||||||
true,
|
|
||||||
)
|
)
|
||||||
.await?;
|
.await?;
|
||||||
(context, request)
|
(context, request)
|
||||||
@ -187,7 +166,6 @@ where
|
|||||||
debug,
|
debug,
|
||||||
json,
|
json,
|
||||||
None,
|
None,
|
||||||
false,
|
|
||||||
)
|
)
|
||||||
.await?;
|
.await?;
|
||||||
(context, request)
|
(context, request)
|
||||||
@ -209,7 +187,6 @@ where
|
|||||||
debug,
|
debug,
|
||||||
json,
|
json,
|
||||||
None,
|
None,
|
||||||
false,
|
|
||||||
)
|
)
|
||||||
.await?;
|
.await?;
|
||||||
(context, request)
|
(context, request)
|
||||||
@ -230,7 +207,6 @@ where
|
|||||||
debug,
|
debug,
|
||||||
json,
|
json,
|
||||||
None,
|
None,
|
||||||
false,
|
|
||||||
)
|
)
|
||||||
.await?;
|
.await?;
|
||||||
(context, request)
|
(context, request)
|
||||||
@ -241,18 +217,8 @@ where
|
|||||||
} => {
|
} => {
|
||||||
let request = Request::new(Method::ListSellers { rendezvous_point });
|
let request = Request::new(Method::ListSellers { rendezvous_point });
|
||||||
|
|
||||||
let context = Context::build(
|
let context =
|
||||||
None,
|
Context::build(None, None, Some(tor), data, is_testnet, debug, json, None).await?;
|
||||||
None,
|
|
||||||
Some(tor),
|
|
||||||
data,
|
|
||||||
is_testnet,
|
|
||||||
debug,
|
|
||||||
json,
|
|
||||||
None,
|
|
||||||
false,
|
|
||||||
)
|
|
||||||
.await?;
|
|
||||||
|
|
||||||
(context, request)
|
(context, request)
|
||||||
}
|
}
|
||||||
@ -268,7 +234,6 @@ where
|
|||||||
debug,
|
debug,
|
||||||
json,
|
json,
|
||||||
None,
|
None,
|
||||||
false,
|
|
||||||
)
|
)
|
||||||
.await?;
|
.await?;
|
||||||
(context, request)
|
(context, request)
|
||||||
@ -279,8 +244,7 @@ where
|
|||||||
let request = Request::new(Method::MoneroRecovery { swap_id });
|
let request = Request::new(Method::MoneroRecovery { swap_id });
|
||||||
|
|
||||||
let context =
|
let context =
|
||||||
Context::build(None, None, None, data, is_testnet, debug, json, None, false)
|
Context::build(None, None, None, data, is_testnet, debug, json, None).await?;
|
||||||
.await?;
|
|
||||||
|
|
||||||
(context, request)
|
(context, request)
|
||||||
}
|
}
|
||||||
@ -357,25 +321,6 @@ enum CliCommand {
|
|||||||
},
|
},
|
||||||
/// Show a list of past, ongoing and completed swaps
|
/// Show a list of past, ongoing and completed swaps
|
||||||
History,
|
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<PathBuf>,
|
|
||||||
#[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<Uuid>,
|
|
||||||
},
|
|
||||||
#[structopt(about = "Prints the current config")]
|
#[structopt(about = "Prints the current config")]
|
||||||
Config,
|
Config,
|
||||||
#[structopt(about = "Allows withdrawing BTC from the internal Bitcoin wallet.")]
|
#[structopt(about = "Allows withdrawing BTC from the internal Bitcoin wallet.")]
|
||||||
|
112
swap/src/cli/tracing.rs
Normal file
112
swap/src/cli/tracing.rs
Normal file
@ -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<Path>) -> 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<L> {
|
||||||
|
inner: L,
|
||||||
|
level: Level,
|
||||||
|
}
|
||||||
|
|
||||||
|
type StdErrLayer<S, T> =
|
||||||
|
fmt::Layer<S, DefaultFields, Format<fmt::format::Full, T>, fn() -> std::io::Stderr>;
|
||||||
|
|
||||||
|
type StdErrJsonLayer<S, T> =
|
||||||
|
fmt::Layer<S, JsonFields, Format<fmt::format::Json, T>, fn() -> std::io::Stderr>;
|
||||||
|
|
||||||
|
fn debug_terminal_printer<S>() -> StdErrPrinter<StdErrLayer<S, UtcTime<Rfc3339>>> {
|
||||||
|
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<S>() -> StdErrPrinter<StdErrJsonLayer<S, UtcTime<Rfc3339>>> {
|
||||||
|
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<S>() -> StdErrPrinter<StdErrLayer<S, ()>> {
|
||||||
|
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<S>() -> StdErrPrinter<StdErrJsonLayer<S, ()>> {
|
||||||
|
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<L, S> Layer<S> for StdErrPrinter<L>
|
||||||
|
where
|
||||||
|
L: 'static + Layer<S>,
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
56
swap/src/common.rs
Normal file
56
swap/src/common.rs
Normal file
@ -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<Version> {
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
@ -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<Version> {
|
|
||||||
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<regex::Regex> = 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<Uuid>,
|
|
||||||
redact_addresses: bool,
|
|
||||||
) -> anyhow::Result<Vec<String>> {
|
|
||||||
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, "<swap_id_0>");
|
|
||||||
/// ```
|
|
||||||
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, String>) -> 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!("<monero_address_{count}>"),
|
|
||||||
replacements,
|
|
||||||
input
|
|
||||||
);
|
|
||||||
regex_find_placeholders!(
|
|
||||||
BITCOIN_ADDR_REGEX,
|
|
||||||
|count| format!("<bitcoin_address_{count}>"),
|
|
||||||
replacements,
|
|
||||||
input
|
|
||||||
);
|
|
||||||
regex_find_placeholders!(
|
|
||||||
TX_ID_REGEX,
|
|
||||||
|count| format!("<tx_id_{count}>"),
|
|
||||||
replacements,
|
|
||||||
input
|
|
||||||
);
|
|
||||||
regex_find_placeholders!(
|
|
||||||
SWAP_ID_REGEX,
|
|
||||||
|count| format!("<swap_id_{count}>"),
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
@ -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<Path>) -> 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(())
|
|
||||||
}
|
|
@ -5,7 +5,7 @@ use anyhow::{anyhow, Context, Result};
|
|||||||
use async_trait::async_trait;
|
use async_trait::async_trait;
|
||||||
use libp2p::{Multiaddr, PeerId};
|
use libp2p::{Multiaddr, PeerId};
|
||||||
use sqlx::sqlite::{Sqlite, SqliteConnectOptions};
|
use sqlx::sqlite::{Sqlite, SqliteConnectOptions};
|
||||||
use sqlx::{ConnectOptions, Pool, SqlitePool};
|
use sqlx::{Pool, SqlitePool};
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
use std::str::FromStr;
|
use std::str::FromStr;
|
||||||
@ -26,8 +26,7 @@ impl SqliteDatabase {
|
|||||||
let read_only = matches!(access_mode, AccessMode::ReadOnly);
|
let read_only = matches!(access_mode, AccessMode::ReadOnly);
|
||||||
|
|
||||||
let path_str = format!("sqlite:{}", path.as_ref().display());
|
let path_str = format!("sqlite:{}", path.as_ref().display());
|
||||||
let mut options = SqliteConnectOptions::from_str(&path_str)?.read_only(read_only);
|
let options = SqliteConnectOptions::from_str(&path_str)?.read_only(read_only);
|
||||||
options.disable_statement_logging();
|
|
||||||
|
|
||||||
let pool = SqlitePool::connect_with(options).await?;
|
let pool = SqlitePool::connect_with(options).await?;
|
||||||
let mut sqlite = Self { pool };
|
let mut sqlite = Self { pool };
|
||||||
|
@ -142,14 +142,6 @@ impl Amount {
|
|||||||
Decimal::from(self.as_piconero())
|
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<Self> {
|
fn from_decimal(amount: Decimal) -> Result<Self> {
|
||||||
let piconeros_dec =
|
let piconeros_dec =
|
||||||
amount.mul(Decimal::from_u64(PICONERO_OFFSET).expect("constant to fit into u64"));
|
amount.mul(Decimal::from_u64(PICONERO_OFFSET).expect("constant to fit into u64"));
|
||||||
@ -192,8 +184,11 @@ impl From<Amount> for u64 {
|
|||||||
|
|
||||||
impl fmt::Display for Amount {
|
impl fmt::Display for Amount {
|
||||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||||
let xmr_value = self.as_xmr();
|
let mut decimal = Decimal::from(self.0);
|
||||||
write!(f, "{} XMR", xmr_value)
|
decimal
|
||||||
|
.set_scale(12)
|
||||||
|
.expect("12 is smaller than max precision of 28");
|
||||||
|
write!(f, "{} XMR", decimal)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -384,8 +384,8 @@ pub struct State3 {
|
|||||||
S_b_bitcoin: bitcoin::PublicKey,
|
S_b_bitcoin: bitcoin::PublicKey,
|
||||||
pub v: monero::PrivateViewKey,
|
pub v: monero::PrivateViewKey,
|
||||||
#[serde(with = "::bitcoin::util::amount::serde::as_sat")]
|
#[serde(with = "::bitcoin::util::amount::serde::as_sat")]
|
||||||
pub btc: bitcoin::Amount,
|
btc: bitcoin::Amount,
|
||||||
pub xmr: monero::Amount,
|
xmr: monero::Amount,
|
||||||
pub cancel_timelock: CancelTimelock,
|
pub cancel_timelock: CancelTimelock,
|
||||||
pub punish_timelock: PunishTimelock,
|
pub punish_timelock: PunishTimelock,
|
||||||
refund_address: bitcoin::Address,
|
refund_address: bitcoin::Address,
|
||||||
|
@ -440,7 +440,7 @@ where
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn is_complete(state: &AliceState) -> bool {
|
pub(crate) fn is_complete(state: &AliceState) -> bool {
|
||||||
matches!(
|
matches!(
|
||||||
state,
|
state,
|
||||||
AliceState::XmrRefunded
|
AliceState::XmrRefunded
|
||||||
|
@ -369,7 +369,7 @@ pub struct State3 {
|
|||||||
S_a_monero: monero::PublicKey,
|
S_a_monero: monero::PublicKey,
|
||||||
S_a_bitcoin: bitcoin::PublicKey,
|
S_a_bitcoin: bitcoin::PublicKey,
|
||||||
v: monero::PrivateViewKey,
|
v: monero::PrivateViewKey,
|
||||||
pub xmr: monero::Amount,
|
xmr: monero::Amount,
|
||||||
pub cancel_timelock: CancelTimelock,
|
pub cancel_timelock: CancelTimelock,
|
||||||
punish_timelock: PunishTimelock,
|
punish_timelock: PunishTimelock,
|
||||||
refund_address: bitcoin::Address,
|
refund_address: bitcoin::Address,
|
||||||
|
@ -7,9 +7,7 @@ use anyhow::Result;
|
|||||||
use jsonrpsee::server::RpcModule;
|
use jsonrpsee::server::RpcModule;
|
||||||
use jsonrpsee::types::Params;
|
use jsonrpsee::types::Params;
|
||||||
use libp2p::core::Multiaddr;
|
use libp2p::core::Multiaddr;
|
||||||
use serde::Deserialize;
|
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::path::PathBuf;
|
|
||||||
use std::str::FromStr;
|
use std::str::FromStr;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use uuid::Uuid;
|
use uuid::Uuid;
|
||||||
@ -50,30 +48,8 @@ pub fn register_modules(context: Arc<Context>) -> Result<RpcModule<Arc<Context>>
|
|||||||
execute_request(params_raw, Method::Balance { force_refresh }, &context).await
|
execute_request(params_raw, Method::Balance { force_refresh }, &context).await
|
||||||
})?;
|
})?;
|
||||||
|
|
||||||
module.register_async_method("get_history", |params_raw, context| async move {
|
module.register_async_method("get_history", |params, context| async move {
|
||||||
execute_request(params_raw, Method::History, &context).await
|
execute_request(params, Method::History, &context).await
|
||||||
})?;
|
|
||||||
|
|
||||||
module.register_async_method("get_logs", |params_raw, context| async move {
|
|
||||||
#[derive(Debug, Clone, Deserialize)]
|
|
||||||
struct Params {
|
|
||||||
swap_id: Option<Uuid>,
|
|
||||||
logs_dir: Option<PathBuf>,
|
|
||||||
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_raw_states", |params, context| async move {
|
module.register_async_method("get_raw_states", |params, context| async move {
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
use crate::fs::ensure_directory_exists;
|
use crate::fs::ensure_directory_exists;
|
||||||
|
use ::bitcoin::secp256k1::constants::SECRET_KEY_SIZE;
|
||||||
|
use ::bitcoin::secp256k1::{self, SecretKey};
|
||||||
use anyhow::{Context, Result};
|
use anyhow::{Context, Result};
|
||||||
use bdk::bitcoin::util::bip32::ExtendedPrivKey;
|
use bdk::bitcoin::util::bip32::ExtendedPrivKey;
|
||||||
use bitcoin::hashes::{sha256, Hash, HashEngine};
|
use bitcoin::hashes::{sha256, Hash, HashEngine};
|
||||||
use bitcoin::secp256k1::constants::SECRET_KEY_SIZE;
|
|
||||||
use bitcoin::secp256k1::{self, SecretKey};
|
|
||||||
use libp2p::identity;
|
use libp2p::identity;
|
||||||
use pem::{encode, Pem};
|
use pem::{encode, Pem};
|
||||||
use rand::prelude::*;
|
use rand::prelude::*;
|
||||||
|
@ -103,26 +103,13 @@ mod test {
|
|||||||
|
|
||||||
let (client, _, _) = setup_daemon(harness_ctx).await;
|
let (client, _, _) = setup_daemon(harness_ctx).await;
|
||||||
|
|
||||||
let response: HashMap<String, Vec<Value>> = client
|
let response: HashMap<String, Vec<(Uuid, String)>> = client
|
||||||
.request("get_history", ObjectParams::new())
|
.request("get_history", ObjectParams::new())
|
||||||
.await
|
.await
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
let swaps: Vec<(Uuid, String)> = vec![(bob_swap_id, "btc is locked".to_string())];
|
||||||
|
|
||||||
let swaps = response.get("swaps").unwrap();
|
assert_eq!(response, HashMap::from([("swaps".to_string(), swaps)]));
|
||||||
assert_eq!(swaps.len(), 1);
|
|
||||||
|
|
||||||
assert_has_keys_serde(
|
|
||||||
swaps[0].as_object().unwrap(),
|
|
||||||
&[
|
|
||||||
"swapId",
|
|
||||||
"startDate",
|
|
||||||
"state",
|
|
||||||
"btcAmount",
|
|
||||||
"xmrAmount",
|
|
||||||
"exchangeRate",
|
|
||||||
"tradingPartnerPeerId",
|
|
||||||
],
|
|
||||||
);
|
|
||||||
|
|
||||||
let response: HashMap<String, HashMap<Uuid, Vec<Value>>> = client
|
let response: HashMap<String, HashMap<Uuid, Vec<Value>>> = client
|
||||||
.request("get_raw_states", ObjectParams::new())
|
.request("get_raw_states", ObjectParams::new())
|
||||||
|
Loading…
x
Reference in New Issue
Block a user