Compare commits

...

93 commits

Author SHA1 Message Date
Byron Hambly
4db069b02c
Update README.md 2025-05-26 11:14:21 +02:00
binarybaron
81b89d63c2
docs: Add notice about breaking backwards compatability 2024-11-20 15:24:06 +01:00
Binarybaron
a2cc3591b1 fix: do not panic if electrum server does not support fee estimation 2024-11-11 16:43:43 +01:00
Binarybaron
44fafc792e feat(asb): Add Dockerfile 2024-11-11 16:02:55 +01:00
Byron Hambly
050d4f5f48
Merge pull request #1801 from comit-network/dependabot/cargo/anyhow-1.0.91
build(deps): bump anyhow from 1.0.90 to 1.0.91
2024-10-24 08:26:23 +02:00
Byron Hambly
0fb411c8a6
Merge pull request #1803 from comit-network/dependabot/cargo/thiserror-1.0.65
build(deps): bump thiserror from 1.0.64 to 1.0.65
2024-10-24 08:25:50 +02:00
Byron Hambly
d69cf30efe
Merge pull request #1794 from comit-network/dependabot/cargo/uuid-1.11.0
build(deps): bump uuid from 1.10.0 to 1.11.0
2024-10-24 08:25:41 +02:00
dependabot[bot]
fac5df93fa
build(deps): bump thiserror from 1.0.64 to 1.0.65
Bumps [thiserror](https://github.com/dtolnay/thiserror) from 1.0.64 to 1.0.65.
- [Release notes](https://github.com/dtolnay/thiserror/releases)
- [Commits](https://github.com/dtolnay/thiserror/compare/1.0.64...1.0.65)

---
updated-dependencies:
- dependency-name: thiserror
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-23 11:46:56 +00:00
dependabot[bot]
02a3711cc9
build(deps): bump anyhow from 1.0.90 to 1.0.91
Bumps [anyhow](https://github.com/dtolnay/anyhow) from 1.0.90 to 1.0.91.
- [Release notes](https://github.com/dtolnay/anyhow/releases)
- [Commits](https://github.com/dtolnay/anyhow/compare/1.0.90...1.0.91)

---
updated-dependencies:
- dependency-name: anyhow
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-23 11:45:51 +00:00
Byron Hambly
4afd8a44e4
Merge pull request #1793 from comit-network/dependabot/cargo/futures-0.3.31
build(deps): bump futures from 0.3.30 to 0.3.31
2024-10-22 09:44:27 +02:00
Byron Hambly
8e6327a2e6
Merge pull request #1795 from comit-network/dependabot/cargo/hyper-1.5.0
build(deps): bump hyper from 1.4.1 to 1.5.0
2024-10-22 09:43:57 +02:00
Byron Hambly
cb42f7ae27
Merge pull request #1799 from comit-network/dependabot/cargo/serde_json-1.0.132
build(deps): bump serde_json from 1.0.128 to 1.0.132
2024-10-22 09:43:26 +02:00
Byron Hambly
d5d2663442
Merge pull request #1798 from comit-network/dependabot/cargo/anyhow-1.0.90
build(deps): bump anyhow from 1.0.89 to 1.0.90
2024-10-22 09:43:16 +02:00
dependabot[bot]
7b1b5ec3a5
build(deps): bump serde_json from 1.0.128 to 1.0.132
Bumps [serde_json](https://github.com/serde-rs/json) from 1.0.128 to 1.0.132.
- [Release notes](https://github.com/serde-rs/json/releases)
- [Commits](https://github.com/serde-rs/json/compare/1.0.128...1.0.132)

---
updated-dependencies:
- dependency-name: serde_json
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-21 11:45:16 +00:00
dependabot[bot]
de7c8aec0a
build(deps): bump anyhow from 1.0.89 to 1.0.90
Bumps [anyhow](https://github.com/dtolnay/anyhow) from 1.0.89 to 1.0.90.
- [Release notes](https://github.com/dtolnay/anyhow/releases)
- [Commits](https://github.com/dtolnay/anyhow/compare/1.0.89...1.0.90)

---
updated-dependencies:
- dependency-name: anyhow
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-21 11:44:43 +00:00
dependabot[bot]
d521815e91
build(deps): bump hyper from 1.4.1 to 1.5.0
Bumps [hyper](https://github.com/hyperium/hyper) from 1.4.1 to 1.5.0.
- [Release notes](https://github.com/hyperium/hyper/releases)
- [Changelog](https://github.com/hyperium/hyper/blob/master/CHANGELOG.md)
- [Commits](https://github.com/hyperium/hyper/compare/v1.4.1...v1.5.0)

---
updated-dependencies:
- dependency-name: hyper
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-16 11:58:25 +00:00
dependabot[bot]
ec567ccba1
build(deps): bump uuid from 1.10.0 to 1.11.0
Bumps [uuid](https://github.com/uuid-rs/uuid) from 1.10.0 to 1.11.0.
- [Release notes](https://github.com/uuid-rs/uuid/releases)
- [Commits](https://github.com/uuid-rs/uuid/compare/1.10.0...1.11.0)

---
updated-dependencies:
- dependency-name: uuid
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-16 11:55:59 +00:00
dependabot[bot]
61c7afb358
build(deps): bump futures from 0.3.30 to 0.3.31
Bumps [futures](https://github.com/rust-lang/futures-rs) from 0.3.30 to 0.3.31.
- [Release notes](https://github.com/rust-lang/futures-rs/releases)
- [Changelog](https://github.com/rust-lang/futures-rs/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rust-lang/futures-rs/compare/0.3.30...0.3.31)

---
updated-dependencies:
- dependency-name: futures
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-15 11:32:11 +00:00
Byron Hambly
d841741d3c
Merge pull request #1779 from comit-network/dependabot/cargo/async-trait-0.1.83
build(deps): bump async-trait from 0.1.82 to 0.1.83
2024-10-14 13:52:16 +02:00
Byron Hambly
f2ee1004e1
Merge pull request #1783 from comit-network/dependabot/cargo/regex-1.11.0
build(deps): bump regex from 1.10.6 to 1.11.0
2024-10-14 13:52:06 +02:00
Byron Hambly
f151653c65
Merge pull request #1785 from comit-network/dependabot/cargo/tempfile-3.13.0
build(deps): bump tempfile from 3.12.0 to 3.13.0
2024-10-14 13:51:56 +02:00
Byron Hambly
9e68fd0d9f
Merge pull request #1786 from comit-network/dependabot/cargo/reqwest-0.12.8
build(deps): bump reqwest from 0.12.7 to 0.12.8
2024-10-14 13:51:49 +02:00
Byron Hambly
5d88d33243
Merge pull request #1787 from comit-network/dependabot/cargo/once_cell-1.20.2
build(deps): bump once_cell from 1.20.0 to 1.20.2
2024-10-14 13:51:39 +02:00
Byron Hambly
23980df163
Merge pull request #1789 from comit-network/dependabot/github_actions/actions/checkout-4.2.1
build(deps): bump actions/checkout from 4.1.7 to 4.2.1
2024-10-14 13:51:30 +02:00
Byron Hambly
a837d1c22b
Merge pull request #1792 from comit-network/dependabot/github_actions/Swatinem/rust-cache-2.7.5
build(deps): bump Swatinem/rust-cache from 2.7.3 to 2.7.5
2024-10-14 13:51:01 +02:00
dependabot[bot]
3d4bc971a2
build(deps): bump Swatinem/rust-cache from 2.7.3 to 2.7.5
Bumps [Swatinem/rust-cache](https://github.com/swatinem/rust-cache) from 2.7.3 to 2.7.5.
- [Release notes](https://github.com/swatinem/rust-cache/releases)
- [Changelog](https://github.com/Swatinem/rust-cache/blob/master/CHANGELOG.md)
- [Commits](https://github.com/swatinem/rust-cache/compare/v2.7.3...v2.7.5)

---
updated-dependencies:
- dependency-name: Swatinem/rust-cache
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-14 11:07:29 +00:00
binarybaron
19710e296d
docs: Add notice to ReadMe about status of maintenance (#1790)
docs: Add notice to ReadMe about status of maintenance and reference community fork at UnstoppableSwap/core
2024-10-09 14:58:27 +02:00
dependabot[bot]
851086c5a2
build(deps): bump actions/checkout from 4.1.7 to 4.2.1
Bumps [actions/checkout](https://github.com/actions/checkout) from 4.1.7 to 4.2.1.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v4.1.7...v4.2.1)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-08 11:47:11 +00:00
dependabot[bot]
88e6112736
build(deps): bump once_cell from 1.20.0 to 1.20.2
Bumps [once_cell](https://github.com/matklad/once_cell) from 1.20.0 to 1.20.2.
- [Changelog](https://github.com/matklad/once_cell/blob/master/CHANGELOG.md)
- [Commits](https://github.com/matklad/once_cell/compare/v1.20.0...v1.20.2)

---
updated-dependencies:
- dependency-name: once_cell
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-07 11:39:41 +00:00
dependabot[bot]
a3ffd35fc0
build(deps): bump reqwest from 0.12.7 to 0.12.8
Bumps [reqwest](https://github.com/seanmonstar/reqwest) from 0.12.7 to 0.12.8.
- [Release notes](https://github.com/seanmonstar/reqwest/releases)
- [Changelog](https://github.com/seanmonstar/reqwest/blob/master/CHANGELOG.md)
- [Commits](https://github.com/seanmonstar/reqwest/compare/v0.12.7...v0.12.8)

---
updated-dependencies:
- dependency-name: reqwest
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-01 11:09:42 +00:00
dependabot[bot]
12c6974458
build(deps): bump tempfile from 3.12.0 to 3.13.0
Bumps [tempfile](https://github.com/Stebalien/tempfile) from 3.12.0 to 3.13.0.
- [Changelog](https://github.com/Stebalien/tempfile/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Stebalien/tempfile/compare/v3.12.0...v3.13.0)

---
updated-dependencies:
- dependency-name: tempfile
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-30 11:37:04 +00:00
dependabot[bot]
6abd951b46
build(deps): bump regex from 1.10.6 to 1.11.0
Bumps [regex](https://github.com/rust-lang/regex) from 1.10.6 to 1.11.0.
- [Release notes](https://github.com/rust-lang/regex/releases)
- [Changelog](https://github.com/rust-lang/regex/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rust-lang/regex/compare/1.10.6...1.11.0)

---
updated-dependencies:
- dependency-name: regex
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-30 11:36:32 +00:00
Byron Hambly
bfb0053919
Merge pull request #1778 from comit-network/dependabot/cargo/thiserror-1.0.64
build(deps): bump thiserror from 1.0.63 to 1.0.64
2024-09-25 14:34:15 +02:00
Byron Hambly
c78ffa7351
Merge pull request #1776 from comit-network/dependabot/cargo/once_cell-1.20.0
build(deps): bump once_cell from 1.19.0 to 1.20.0
2024-09-25 14:34:06 +02:00
dependabot[bot]
523adc6d26
build(deps): bump async-trait from 0.1.82 to 0.1.83
Bumps [async-trait](https://github.com/dtolnay/async-trait) from 0.1.82 to 0.1.83.
- [Release notes](https://github.com/dtolnay/async-trait/releases)
- [Commits](https://github.com/dtolnay/async-trait/compare/0.1.82...0.1.83)

---
updated-dependencies:
- dependency-name: async-trait
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-25 11:18:25 +00:00
dependabot[bot]
e01986bb50
build(deps): bump thiserror from 1.0.63 to 1.0.64
Bumps [thiserror](https://github.com/dtolnay/thiserror) from 1.0.63 to 1.0.64.
- [Release notes](https://github.com/dtolnay/thiserror/releases)
- [Commits](https://github.com/dtolnay/thiserror/compare/1.0.63...1.0.64)

---
updated-dependencies:
- dependency-name: thiserror
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-23 11:42:15 +00:00
Byron Hambly
a979871610
Merge pull request #1775 from comit-network/dependabot/cargo/anyhow-1.0.89
build(deps): bump anyhow from 1.0.88 to 1.0.89
2024-09-16 13:30:09 +02:00
dependabot[bot]
e3f31af88a
build(deps): bump once_cell from 1.19.0 to 1.20.0
Bumps [once_cell](https://github.com/matklad/once_cell) from 1.19.0 to 1.20.0.
- [Changelog](https://github.com/matklad/once_cell/blob/master/CHANGELOG.md)
- [Commits](https://github.com/matklad/once_cell/compare/v1.19.0...v1.20.0)

---
updated-dependencies:
- dependency-name: once_cell
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-16 11:15:38 +00:00
dependabot[bot]
fe77b5af95
build(deps): bump anyhow from 1.0.88 to 1.0.89
Bumps [anyhow](https://github.com/dtolnay/anyhow) from 1.0.88 to 1.0.89.
- [Release notes](https://github.com/dtolnay/anyhow/releases)
- [Commits](https://github.com/dtolnay/anyhow/compare/1.0.88...1.0.89)

---
updated-dependencies:
- dependency-name: anyhow
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-16 11:14:20 +00:00
Byron Hambly
f20d71f74b
Merge pull request #1771 from comit-network/dependabot/cargo/serde-1.0.210
build(deps): bump serde from 1.0.208 to 1.0.210
2024-09-12 13:55:19 +02:00
Byron Hambly
0584256622
Merge pull request #1768 from comit-network/dependabot/cargo/tokio-util-0.7.12
build(deps): bump tokio-util from 0.7.11 to 0.7.12
2024-09-12 13:55:09 +02:00
Byron Hambly
dcb4d02988
Merge pull request #1767 from comit-network/dependabot/cargo/serde_json-1.0.128
build(deps): bump serde_json from 1.0.124 to 1.0.128
2024-09-12 13:54:57 +02:00
Byron Hambly
545ef8fb30
Merge pull request #1766 from comit-network/dependabot/cargo/async-trait-0.1.82
build(deps): bump async-trait from 0.1.81 to 0.1.82
2024-09-12 13:54:47 +02:00
Byron Hambly
433ed87263
Merge pull request #1773 from comit-network/dependabot/cargo/anyhow-1.0.88
build(deps): bump anyhow from 1.0.86 to 1.0.88
2024-09-12 13:53:46 +02:00
dependabot[bot]
8022d8b423
build(deps): bump anyhow from 1.0.86 to 1.0.88
Bumps [anyhow](https://github.com/dtolnay/anyhow) from 1.0.86 to 1.0.88.
- [Release notes](https://github.com/dtolnay/anyhow/releases)
- [Commits](https://github.com/dtolnay/anyhow/compare/1.0.86...1.0.88)

---
updated-dependencies:
- dependency-name: anyhow
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-12 11:08:00 +00:00
dependabot[bot]
4114772bb7
build(deps): bump serde from 1.0.208 to 1.0.210
Bumps [serde](https://github.com/serde-rs/serde) from 1.0.208 to 1.0.210.
- [Release notes](https://github.com/serde-rs/serde/releases)
- [Commits](https://github.com/serde-rs/serde/compare/v1.0.208...v1.0.210)

---
updated-dependencies:
- dependency-name: serde
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-09 12:02:58 +00:00
dependabot[bot]
ff9f349889
build(deps): bump tokio-util from 0.7.11 to 0.7.12
Bumps [tokio-util](https://github.com/tokio-rs/tokio) from 0.7.11 to 0.7.12.
- [Release notes](https://github.com/tokio-rs/tokio/releases)
- [Commits](https://github.com/tokio-rs/tokio/compare/tokio-util-0.7.11...tokio-util-0.7.12)

---
updated-dependencies:
- dependency-name: tokio-util
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-05 11:47:31 +00:00
dependabot[bot]
a8a99db738
build(deps): bump serde_json from 1.0.124 to 1.0.128
Bumps [serde_json](https://github.com/serde-rs/json) from 1.0.124 to 1.0.128.
- [Release notes](https://github.com/serde-rs/json/releases)
- [Commits](https://github.com/serde-rs/json/compare/v1.0.124...1.0.128)

---
updated-dependencies:
- dependency-name: serde_json
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-05 11:47:01 +00:00
dependabot[bot]
29ee6acb95
build(deps): bump async-trait from 0.1.81 to 0.1.82
Bumps [async-trait](https://github.com/dtolnay/async-trait) from 0.1.81 to 0.1.82.
- [Release notes](https://github.com/dtolnay/async-trait/releases)
- [Commits](https://github.com/dtolnay/async-trait/compare/0.1.81...0.1.82)

---
updated-dependencies:
- dependency-name: async-trait
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-02 11:31:16 +00:00
Byron Hambly
aef729331f
Merge pull request #1760 from comit-network/dependabot/cargo/regex-1.10.6
build(deps): bump regex from 1.10.5 to 1.10.6
2024-08-22 15:18:09 +02:00
dependabot[bot]
2faf7561bd
build(deps): bump regex from 1.10.5 to 1.10.6
Bumps [regex](https://github.com/rust-lang/regex) from 1.10.5 to 1.10.6.
- [Release notes](https://github.com/rust-lang/regex/releases)
- [Changelog](https://github.com/rust-lang/regex/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rust-lang/regex/compare/1.10.5...1.10.6)

---
updated-dependencies:
- dependency-name: regex
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-08-22 11:57:24 +00:00
Einliterflasche
7871cf256b
feat(asb + cli): Redact logs + unify tracing infrastructure (#1733) 2024-08-21 16:33:04 +02:00
Byron Hambly
55bfd95694
Merge pull request #1759 from comit-network/dependabot/cargo/reqwest-0.12.7
build(deps): bump reqwest from 0.12.5 to 0.12.7
2024-08-20 15:43:11 +02:00
dependabot[bot]
3cebddf593
build(deps): bump reqwest from 0.12.5 to 0.12.7
Bumps [reqwest](https://github.com/seanmonstar/reqwest) from 0.12.5 to 0.12.7.
- [Release notes](https://github.com/seanmonstar/reqwest/releases)
- [Changelog](https://github.com/seanmonstar/reqwest/blob/master/CHANGELOG.md)
- [Commits](https://github.com/seanmonstar/reqwest/compare/v0.12.5...v0.12.7)

---
updated-dependencies:
- dependency-name: reqwest
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-08-20 11:31:40 +00:00
Byron Hambly
c3831e93cc
Merge pull request #1758 from comit-network/dependabot/cargo/serde-1.0.208
build(deps): bump serde from 1.0.206 to 1.0.208
2024-08-16 13:50:10 +02:00
dependabot[bot]
4eff6fe503
build(deps): bump serde from 1.0.206 to 1.0.208
Bumps [serde](https://github.com/serde-rs/serde) from 1.0.206 to 1.0.208.
- [Release notes](https://github.com/serde-rs/serde/releases)
- [Commits](https://github.com/serde-rs/serde/compare/v1.0.206...v1.0.208)

---
updated-dependencies:
- dependency-name: serde
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-08-16 11:04:29 +00:00
Byron Hambly
018e803f88
Merge pull request #1754 from comit-network/dependabot/cargo/serde-1.0.206
build(deps): bump serde from 1.0.205 to 1.0.206
2024-08-12 15:19:57 +02:00
Byron Hambly
504d05bfad
Merge pull request #1753 from comit-network/dependabot/cargo/serde_json-1.0.124
build(deps): bump serde_json from 1.0.122 to 1.0.124
2024-08-12 15:19:47 +02:00
dependabot[bot]
33901a2ea9
build(deps): bump serde from 1.0.205 to 1.0.206
Bumps [serde](https://github.com/serde-rs/serde) from 1.0.205 to 1.0.206.
- [Release notes](https://github.com/serde-rs/serde/releases)
- [Commits](https://github.com/serde-rs/serde/compare/v1.0.205...v1.0.206)

---
updated-dependencies:
- dependency-name: serde
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-08-12 11:07:58 +00:00
dependabot[bot]
c8cbd27b79
build(deps): bump serde_json from 1.0.122 to 1.0.124
Bumps [serde_json](https://github.com/serde-rs/json) from 1.0.122 to 1.0.124.
- [Release notes](https://github.com/serde-rs/json/releases)
- [Commits](https://github.com/serde-rs/json/compare/v1.0.122...v1.0.124)

---
updated-dependencies:
- dependency-name: serde_json
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-08-12 11:07:36 +00:00
Byron Hambly
f755993fc6
Merge pull request #1748 from comit-network/dependabot/cargo/tempfile-3.12.0
build(deps): bump tempfile from 3.11.0 to 3.12.0
2024-08-08 15:08:23 +02:00
Byron Hambly
ae614b5567
Merge pull request #1750 from comit-network/dependabot/cargo/serde-1.0.205
build(deps): bump serde from 1.0.204 to 1.0.205
2024-08-08 15:07:57 +02:00
dependabot[bot]
f799da5203
build(deps): bump serde from 1.0.204 to 1.0.205
Bumps [serde](https://github.com/serde-rs/serde) from 1.0.204 to 1.0.205.
- [Release notes](https://github.com/serde-rs/serde/releases)
- [Commits](https://github.com/serde-rs/serde/compare/v1.0.204...v1.0.205)

---
updated-dependencies:
- dependency-name: serde
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-08-08 11:50:16 +00:00
dependabot[bot]
952fb71a6a
build(deps): bump tempfile from 3.11.0 to 3.12.0
Bumps [tempfile](https://github.com/Stebalien/tempfile) from 3.11.0 to 3.12.0.
- [Changelog](https://github.com/Stebalien/tempfile/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Stebalien/tempfile/commits)

---
updated-dependencies:
- dependency-name: tempfile
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-08-07 11:15:11 +00:00
Byron Hambly
180458d587
Merge pull request #1746 from comit-network/dependabot/cargo/tempfile-3.11.0
build(deps): bump tempfile from 3.10.1 to 3.11.0
2024-08-05 14:15:21 +02:00
dependabot[bot]
6a76e9efbe
build(deps): bump tempfile from 3.10.1 to 3.11.0
Bumps [tempfile](https://github.com/Stebalien/tempfile) from 3.10.1 to 3.11.0.
- [Changelog](https://github.com/Stebalien/tempfile/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Stebalien/tempfile/compare/v3.10.1...v3.11.0)

---
updated-dependencies:
- dependency-name: tempfile
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-08-05 11:18:44 +00:00
Byron Hambly
7634fe1702
Merge pull request #1744 from comit-network/dependabot/cargo/serde_json-1.0.122
build(deps): bump serde_json from 1.0.121 to 1.0.122
2024-08-05 09:47:37 +02:00
dependabot[bot]
9aaa7d358f
build(deps): bump serde_json from 1.0.121 to 1.0.122
Bumps [serde_json](https://github.com/serde-rs/json) from 1.0.121 to 1.0.122.
- [Release notes](https://github.com/serde-rs/json/releases)
- [Commits](https://github.com/serde-rs/json/compare/v1.0.121...v1.0.122)

---
updated-dependencies:
- dependency-name: serde_json
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-08-02 11:39:10 +00:00
Byron Hambly
204aa85e59
Merge pull request #1741 from comit-network/dependabot/cargo/mockito-1.5.0
build(deps): bump mockito from 1.4.0 to 1.5.0
2024-08-01 20:26:23 +02:00
Byron Hambly
7c509d3ea3
Merge pull request #1742 from comit-network/dependabot/cargo/toml-0.8.19
build(deps): bump toml from 0.8.17 to 0.8.19
2024-08-01 20:24:43 +02:00
binarybaron
cc854be8f4
feat: Enhance history command with more swap details (#1725) 2024-08-01 18:35:03 +02:00
dependabot[bot]
af6bc47ed3
build(deps): bump toml from 0.8.17 to 0.8.19
Bumps [toml](https://github.com/toml-rs/toml) from 0.8.17 to 0.8.19.
- [Commits](https://github.com/toml-rs/toml/compare/toml-v0.8.17...toml-v0.8.19)

---
updated-dependencies:
- dependency-name: toml
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-08-01 11:39:35 +00:00
dependabot[bot]
587212abc7
build(deps): bump mockito from 1.4.0 to 1.5.0
Bumps [mockito](https://github.com/lipanski/mockito) from 1.4.0 to 1.5.0.
- [Release notes](https://github.com/lipanski/mockito/releases)
- [Commits](https://github.com/lipanski/mockito/compare/1.4.0...1.5.0)

---
updated-dependencies:
- dependency-name: mockito
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-08-01 11:38:09 +00:00
Byron Hambly
b18ba95e8c
Merge pull request #1740 from comit-network/dependabot/cargo/toml-0.8.17
build(deps): bump toml from 0.8.16 to 0.8.17
2024-07-31 17:40:25 +02:00
dependabot[bot]
6e09c73cf3
build(deps): bump toml from 0.8.16 to 0.8.17
Bumps [toml](https://github.com/toml-rs/toml) from 0.8.16 to 0.8.17.
- [Commits](https://github.com/toml-rs/toml/compare/toml-v0.8.16...toml-v0.8.17)

---
updated-dependencies:
- dependency-name: toml
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-07-31 11:39:26 +00:00
Byron Hambly
132cfe782c
Merge pull request #1736 from comit-network/dependabot/github_actions/thomaseizinger/keep-a-changelog-new-release-3.1.0
build(deps): bump thomaseizinger/keep-a-changelog-new-release from 3.0.0 to 3.1.0
2024-07-29 19:38:20 +02:00
Byron Hambly
3611a1aced
Merge pull request #1737 from comit-network/dependabot/cargo/serde_json-1.0.121
build(deps): bump serde_json from 1.0.118 to 1.0.121
2024-07-29 19:37:51 +02:00
Byron Hambly
21f26a5b44
Merge pull request #1738 from comit-network/dependabot/cargo/tokio-socks-0.5.2
build(deps): bump tokio-socks from 0.5.1 to 0.5.2
2024-07-29 19:37:28 +02:00
dependabot[bot]
9700d192b2
build(deps): bump tokio-socks from 0.5.1 to 0.5.2
Bumps [tokio-socks](https://github.com/sticnarf/tokio-socks) from 0.5.1 to 0.5.2.
- [Release notes](https://github.com/sticnarf/tokio-socks/releases)
- [Changelog](https://github.com/sticnarf/tokio-socks/blob/master/CHANGELOG.md)
- [Commits](https://github.com/sticnarf/tokio-socks/compare/v0.5.1...v0.5.2)

---
updated-dependencies:
- dependency-name: tokio-socks
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-07-29 12:02:43 +00:00
dependabot[bot]
254874276c
build(deps): bump serde_json from 1.0.118 to 1.0.121
Bumps [serde_json](https://github.com/serde-rs/json) from 1.0.118 to 1.0.121.
- [Release notes](https://github.com/serde-rs/json/releases)
- [Commits](https://github.com/serde-rs/json/compare/v1.0.118...v1.0.121)

---
updated-dependencies:
- dependency-name: serde_json
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-07-29 12:00:29 +00:00
dependabot[bot]
011aa0cb9c
build(deps): bump thomaseizinger/keep-a-changelog-new-release
Bumps [thomaseizinger/keep-a-changelog-new-release](https://github.com/thomaseizinger/keep-a-changelog-new-release) from 3.0.0 to 3.1.0.
- [Release notes](https://github.com/thomaseizinger/keep-a-changelog-new-release/releases)
- [Changelog](https://github.com/thomaseizinger/keep-a-changelog-new-release/blob/master/CHANGELOG.md)
- [Commits](https://github.com/thomaseizinger/keep-a-changelog-new-release/compare/3.0.0...3.1.0)

---
updated-dependencies:
- dependency-name: thomaseizinger/keep-a-changelog-new-release
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-07-29 11:25:26 +00:00
Byron Hambly
8bf4ea08be
Merge pull request #1735 from comit-network/dependabot/cargo/toml-0.8.16
build(deps): bump toml from 0.8.15 to 0.8.16
2024-07-26 14:57:26 +02:00
dependabot[bot]
f3640aceb2
build(deps): bump toml from 0.8.15 to 0.8.16
Bumps [toml](https://github.com/toml-rs/toml) from 0.8.15 to 0.8.16.
- [Commits](https://github.com/toml-rs/toml/compare/toml-v0.8.15...toml-v0.8.16)

---
updated-dependencies:
- dependency-name: toml
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-07-26 12:23:43 +00:00
binarybaron
45e14c5a1e
Revert: 8284bea778 2024-07-26 11:51:33 +02:00
binarybaron
f29bf20e8d
Revert "fix: Reintroduce Dockerfile"
This reverts commit 77a43ba28c.
2024-07-26 11:46:27 +02:00
binarybaron
b52e07ace9
Revert "fix: Reintroduce docker build action"
This reverts commit 49cae19059.
2024-07-26 11:46:19 +02:00
binarybaron
77a43ba28c
fix: Reintroduce Dockerfile 2024-07-26 11:45:48 +02:00
binarybaron
49cae19059
fix: Reintroduce docker build action 2024-07-26 11:45:22 +02:00
binarybaron
7b5929deb5
Merge pull request #9 from UnstoppableSwap/release/0.13.4
Release version 0.13.4
2024-07-26 00:38:02 +02:00
UnstoppableSwap Botty
8284bea778 Prepare release 0.13.4 2024-07-25 22:31:14 +00:00
binarybaron
0ad78e4f30
revert: Update CHANGELOG.md 2024-07-26 00:20:17 +02:00
binarybaron
fc6bb336c8
Merge branch 'comit-network:master' into master 2024-07-26 00:19:41 +02:00
binarybaron
aaa52e9559
Merge pull request #8 from comit-network/master
Merge parent repository
2024-07-25 14:04:14 +02:00
33 changed files with 987 additions and 450 deletions

View file

@ -1,2 +1,6 @@
[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"]

View file

@ -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.1.7 uses: actions/checkout@v4.2.1
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.3 - uses: Swatinem/rust-cache@v2.7.5
- uses: dtolnay/rust-toolchain@master - uses: dtolnay/rust-toolchain@master
with: with:

View file

@ -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.1.7 uses: actions/checkout@v4.2.1
- 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.3 - uses: Swatinem/rust-cache@v2.7.5
- 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.1.7 uses: actions/checkout@v4.2.1
- uses: Swatinem/rust-cache@v2.7.3 - uses: Swatinem/rust-cache@v2.7.5
- 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.1.7 uses: actions/checkout@v4.2.1
- uses: Swatinem/rust-cache@v2.7.3 - uses: Swatinem/rust-cache@v2.7.5
- 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.1.7 uses: actions/checkout@v4.2.1
- uses: Swatinem/rust-cache@v2.7.3 - uses: Swatinem/rust-cache@v2.7.5
- 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.1.7 uses: actions/checkout@v4.2.1
- uses: Swatinem/rust-cache@v2.7.3 - uses: Swatinem/rust-cache@v2.7.5
- 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.1.7 uses: actions/checkout@v4.2.1
- uses: Swatinem/rust-cache@v2.7.3 - uses: Swatinem/rust-cache@v2.7.5
- 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.1.7 uses: actions/checkout@v4.2.1
- uses: Swatinem/rust-cache@v2.7.3 - uses: Swatinem/rust-cache@v2.7.5
- 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.1.7 uses: actions/checkout@v4.2.1
- uses: dtolnay/rust-toolchain@stable - uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2.7.3 - uses: Swatinem/rust-cache@v2.7.5
- name: Run cargo check on stable rust - name: Run cargo check on stable rust
run: cargo check --all-targets run: cargo check --all-targets

View file

@ -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.1.7 - uses: actions/checkout@v4.2.1
- name: Extract version from branch name - name: Extract version from branch name
id: extract-version id: extract-version

View file

@ -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.1.7 - uses: actions/checkout@v4.2.1
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.0.0 uses: thomaseizinger/keep-a-changelog-new-release@3.1.0
with: with:
version: ${{ github.event.inputs.version }} version: ${{ github.event.inputs.version }}
changelogPath: CHANGELOG.md changelogPath: CHANGELOG.md

View file

@ -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.1.7 - uses: actions/checkout@v4.2.1
- name: Delete 'preview' release - name: Delete 'preview' release
uses: larryjoelane/delete-release-action@v1.0.24 uses: larryjoelane/delete-release-action@v1.0.24

View file

@ -7,6 +7,9 @@ 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
View file

@ -78,6 +78,15 @@ 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"
@ -98,9 +107,9 @@ dependencies = [
[[package]] [[package]]
name = "anyhow" name = "anyhow"
version = "1.0.86" version = "1.0.91"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" checksum = "c042108f3ed77fd83760a5fd79b53be043192bb3b9dba91d8c574c0ada7850c8"
[[package]] [[package]]
name = "arrayref" name = "arrayref"
@ -154,13 +163,13 @@ dependencies = [
[[package]] [[package]]
name = "async-trait" name = "async-trait"
version = "0.1.81" version = "0.1.83"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6e0c28dcc82d7c8ead5cb13beb15405b57b8546e93215673ff8ca0349a028107" checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.46", "syn 2.0.79",
] ]
[[package]] [[package]]
@ -743,7 +752,7 @@ dependencies = [
"nom", "nom",
"pathdiff", "pathdiff",
"serde", "serde",
"toml 0.8.15", "toml 0.8.19",
] ]
[[package]] [[package]]
@ -1215,9 +1224,9 @@ checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0"
[[package]] [[package]]
name = "fastrand" name = "fastrand"
version = "2.0.1" version = "2.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6"
[[package]] [[package]]
name = "filetime" name = "filetime"
@ -1301,9 +1310,9 @@ dependencies = [
[[package]] [[package]]
name = "futures" name = "futures"
version = "0.3.30" version = "0.3.31"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876"
dependencies = [ dependencies = [
"futures-channel", "futures-channel",
"futures-core", "futures-core",
@ -1316,9 +1325,9 @@ dependencies = [
[[package]] [[package]]
name = "futures-channel" name = "futures-channel"
version = "0.3.30" version = "0.3.31"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10"
dependencies = [ dependencies = [
"futures-core", "futures-core",
"futures-sink", "futures-sink",
@ -1326,15 +1335,15 @@ dependencies = [
[[package]] [[package]]
name = "futures-core" name = "futures-core"
version = "0.3.30" version = "0.3.31"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e"
[[package]] [[package]]
name = "futures-executor" name = "futures-executor"
version = "0.3.30" version = "0.3.31"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f"
dependencies = [ dependencies = [
"futures-core", "futures-core",
"futures-task", "futures-task",
@ -1355,19 +1364,19 @@ dependencies = [
[[package]] [[package]]
name = "futures-io" name = "futures-io"
version = "0.3.30" version = "0.3.31"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6"
[[package]] [[package]]
name = "futures-macro" name = "futures-macro"
version = "0.3.30" version = "0.3.31"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.46", "syn 2.0.79",
] ]
[[package]] [[package]]
@ -1383,15 +1392,15 @@ dependencies = [
[[package]] [[package]]
name = "futures-sink" name = "futures-sink"
version = "0.3.30" version = "0.3.31"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7"
[[package]] [[package]]
name = "futures-task" name = "futures-task"
version = "0.3.30" version = "0.3.31"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988"
[[package]] [[package]]
name = "futures-timer" name = "futures-timer"
@ -1401,9 +1410,9 @@ checksum = "e64b03909df88034c26dc1547e8970b91f98bdb65165d6a4e9110d94263dbb2c"
[[package]] [[package]]
name = "futures-util" name = "futures-util"
version = "0.3.30" version = "0.3.31"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81"
dependencies = [ dependencies = [
"futures-channel", "futures-channel",
"futures-core", "futures-core",
@ -1500,7 +1509,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", "aho-corasick 0.7.18",
"bstr", "bstr",
"fnv", "fnv",
"log", "log",
@ -1763,9 +1772,9 @@ dependencies = [
[[package]] [[package]]
name = "hyper" name = "hyper"
version = "1.4.1" version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "50dfd22e0e76d0f662d429a5f80fcaf3855009297eab6a0a9f8543834744ba05" checksum = "bbbff0a806a4728c99295b254c8838933b5b082d75e3cb70c8dab21fdfbcfa9a"
dependencies = [ dependencies = [
"bytes", "bytes",
"futures-channel", "futures-channel",
@ -1774,6 +1783,7 @@ 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",
@ -1789,7 +1799,7 @@ checksum = "5ee4be2c948921a1a5320b629c4193916ed787a7f7f293fd3f7f5a6c9de74155"
dependencies = [ dependencies = [
"futures-util", "futures-util",
"http 1.0.0", "http 1.0.0",
"hyper 1.4.1", "hyper 1.5.0",
"hyper-util", "hyper-util",
"rustls 0.23.10", "rustls 0.23.10",
"rustls-pki-types", "rustls-pki-types",
@ -1810,7 +1820,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.4.1", "hyper 1.5.0",
"pin-project-lite 0.2.13", "pin-project-lite 0.2.13",
"socket2 0.5.5", "socket2 0.5.5",
"tokio", "tokio",
@ -1905,7 +1915,7 @@ dependencies = [
"socket2 0.3.19", "socket2 0.3.19",
"widestring", "widestring",
"winapi", "winapi",
"winreg 0.6.2", "winreg",
] ]
[[package]] [[package]]
@ -2122,9 +2132,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
[[package]] [[package]]
name = "libc" name = "libc"
version = "0.2.153" version = "0.2.159"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" checksum = "561d97a539a36e26a9a5fad1ea11a3039a67714694aaa379433e580854bc3dc5"
[[package]] [[package]]
name = "libgit2-sys" name = "libgit2-sys"
@ -2458,9 +2468,9 @@ checksum = "7fb9b38af92608140b86b693604b9ffcc5824240a484d1ecd4795bacb2fe88f3"
[[package]] [[package]]
name = "linux-raw-sys" name = "linux-raw-sys"
version = "0.4.12" version = "0.4.14"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c4cd1a83af159aa67994778be9070f0ae1bd732942279cabb14f86f986a21456" checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89"
[[package]] [[package]]
name = "lock_api" name = "lock_api"
@ -2507,7 +2517,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", "regex-automata 0.1.9",
] ]
[[package]] [[package]]
@ -2516,7 +2526,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", "regex-automata 0.1.9",
] ]
[[package]] [[package]]
@ -2593,14 +2603,19 @@ dependencies = [
[[package]] [[package]]
name = "mockito" name = "mockito"
version = "1.4.0" version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d2f6e023aa5bdf392aa06c78e4a4e6d498baab5138d0c993503350ebbc37bf1e" checksum = "09b34bd91b9e5c5b06338d392463e1318d683cf82ec3d3af4014609be6e2108d"
dependencies = [ dependencies = [
"assert-json-diff", "assert-json-diff",
"bytes",
"colored", "colored",
"futures-core", "futures-util",
"hyper 0.14.28", "http 1.0.0",
"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",
@ -2647,7 +2662,7 @@ dependencies = [
"testcontainers", "testcontainers",
"tokio", "tokio",
"tracing", "tracing",
"tracing-subscriber 0.2.25", "tracing-subscriber 0.3.18",
] ]
[[package]] [[package]]
@ -2833,9 +2848,9 @@ dependencies = [
[[package]] [[package]]
name = "once_cell" name = "once_cell"
version = "1.19.0" version = "1.20.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775"
[[package]] [[package]]
name = "opaque-debug" name = "opaque-debug"
@ -3141,9 +3156,9 @@ dependencies = [
[[package]] [[package]]
name = "proc-macro2" name = "proc-macro2"
version = "1.0.74" version = "1.0.87"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2de98502f212cfcea8d0bb305bd0f49d7ebdd75b64ba0a68f937d888f4e0d6db" checksum = "b3e4daa0dcf6feba26f985457cdf104d4b4256fc5a09547140f3631bb076b19a"
dependencies = [ dependencies = [
"unicode-ident", "unicode-ident",
] ]
@ -3162,7 +3177,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.2", "regex-syntax 0.8.5",
"rusty-fork", "rusty-fork",
"tempfile", "tempfile",
"unarray", "unarray",
@ -3443,13 +3458,14 @@ dependencies = [
[[package]] [[package]]
name = "regex" name = "regex"
version = "1.7.3" version = "1.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8b1f693b24f6ac912f4893ef08244d70b6067480d2f1a46e950c9691e6749d1d" checksum = "38200e5ee88914975b69f657f0801b6f6dccafd44fd9326302a4aaeecfacb1d8"
dependencies = [ dependencies = [
"aho-corasick", "aho-corasick 1.1.3",
"memchr", "memchr",
"regex-syntax 0.6.29", "regex-automata 0.4.8",
"regex-syntax 0.8.5",
] ]
[[package]] [[package]]
@ -3462,6 +3478,17 @@ 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"
@ -3470,9 +3497,9 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1"
[[package]] [[package]]
name = "regex-syntax" name = "regex-syntax"
version = "0.8.2" version = "0.8.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c"
[[package]] [[package]]
name = "rend" name = "rend"
@ -3485,9 +3512,9 @@ dependencies = [
[[package]] [[package]]
name = "reqwest" name = "reqwest"
version = "0.12.5" version = "0.12.8"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c7d6d2a27d57148378eb5e111173f4276ad26340ecc5c49a4a2152167a2d6a37" checksum = "f713147fbe92361e52392c73b8c9e48c04c6625bce969ef54dc901e58e042a7b"
dependencies = [ dependencies = [
"base64 0.22.1", "base64 0.22.1",
"bytes", "bytes",
@ -3497,7 +3524,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.4.1", "hyper 1.5.0",
"hyper-rustls", "hyper-rustls",
"hyper-util", "hyper-util",
"ipnet", "ipnet",
@ -3526,7 +3553,7 @@ dependencies = [
"wasm-streams", "wasm-streams",
"web-sys", "web-sys",
"webpki-roots 0.26.1", "webpki-roots 0.26.1",
"winreg 0.52.0", "windows-registry",
] ]
[[package]] [[package]]
@ -3650,9 +3677,9 @@ dependencies = [
[[package]] [[package]]
name = "rustix" name = "rustix"
version = "0.38.31" version = "0.38.37"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6ea3e1a662af26cd7a3ba09c0297a31af215563ecf42817c98df621387f4e949" checksum = "8acb788b847c24f28525660c4d7758620a7210875711f79e7f663cc152726811"
dependencies = [ dependencies = [
"bitflags 2.4.0", "bitflags 2.4.0",
"errno", "errno",
@ -3995,9 +4022,9 @@ dependencies = [
[[package]] [[package]]
name = "serde" name = "serde"
version = "1.0.204" version = "1.0.210"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bc76f558e0cbb2a839d37354c575f1dc3fdc6546b5be373ba43d95f231bf7c12" checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a"
dependencies = [ dependencies = [
"serde_derive", "serde_derive",
] ]
@ -4024,31 +4051,32 @@ dependencies = [
[[package]] [[package]]
name = "serde_derive" name = "serde_derive"
version = "1.0.204" version = "1.0.210"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e0cd7e117be63d3c3678776753929474f3b04a43a080c744d6b0ae2a8c28e222" checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.46", "syn 2.0.79",
] ]
[[package]] [[package]]
name = "serde_json" name = "serde_json"
version = "1.0.118" version = "1.0.132"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d947f6b3163d8857ea16c4fa0dd4840d52f3041039a85decd46867eb1abef2e4" checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03"
dependencies = [ dependencies = [
"itoa", "itoa",
"memchr",
"ryu", "ryu",
"serde", "serde",
] ]
[[package]] [[package]]
name = "serde_spanned" name = "serde_spanned"
version = "0.6.6" version = "0.6.7"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "79e674e01f999af37c49f70a6ede167a8a60b2503e56c5599532a65baa5969a0" checksum = "eb5b1b31579f3811bf615c144393417496f152e12ac8b7663bf664f4a815306d"
dependencies = [ dependencies = [
"serde", "serde",
] ]
@ -4109,7 +4137,7 @@ checksum = "82fe9db325bcef1fbcde82e078a5cc4efdf787e96b3b9cf45b50b529f2083d67"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.46", "syn 2.0.79",
] ]
[[package]] [[package]]
@ -4498,7 +4526,7 @@ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"rustversion", "rustversion",
"syn 2.0.46", "syn 2.0.79",
] ]
[[package]] [[package]]
@ -4541,7 +4569,7 @@ dependencies = [
"futures", "futures",
"get-port", "get-port",
"hex", "hex",
"hyper 1.4.1", "hyper 1.5.0",
"itertools 0.13.0", "itertools 0.13.0",
"jsonrpsee", "jsonrpsee",
"jsonrpsee-core", "jsonrpsee-core",
@ -4550,12 +4578,14 @@ 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",
@ -4579,7 +4609,7 @@ dependencies = [
"tokio-tar", "tokio-tar",
"tokio-tungstenite", "tokio-tungstenite",
"tokio-util", "tokio-util",
"toml 0.8.15", "toml 0.8.19",
"torut", "torut",
"tracing", "tracing",
"tracing-appender", "tracing-appender",
@ -4605,9 +4635,9 @@ dependencies = [
[[package]] [[package]]
name = "syn" name = "syn"
version = "2.0.46" version = "2.0.79"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "89456b690ff72fddcecf231caedbe615c59480c93358a93dfae7fc29e3ebbf0e" checksum = "89132cd0bf050864e1d38dc3bbc07a0eb8e7530af26344d3d2bbbef83499f590"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@ -4619,6 +4649,9 @@ 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"
@ -4634,14 +4667,15 @@ dependencies = [
[[package]] [[package]]
name = "tempfile" name = "tempfile"
version = "3.10.1" version = "3.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" checksum = "f0f2c9fc62d0beef6951ccffd757e241266a2c833136efbe35af6cd2567dca5b"
dependencies = [ dependencies = [
"cfg-if 1.0.0", "cfg-if 1.0.0",
"fastrand", "fastrand",
"once_cell",
"rustix", "rustix",
"windows-sys 0.52.0", "windows-sys 0.59.0",
] ]
[[package]] [[package]]
@ -4682,22 +4716,22 @@ dependencies = [
[[package]] [[package]]
name = "thiserror" name = "thiserror"
version = "1.0.63" version = "1.0.65"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c0342370b38b6a11b6cc11d6a805569958d54cfa061a29969c3b5ce2ea405724" checksum = "5d11abd9594d9b38965ef50805c5e469ca9cc6f197f883f717e0269a3057b3d5"
dependencies = [ dependencies = [
"thiserror-impl", "thiserror-impl",
] ]
[[package]] [[package]]
name = "thiserror-impl" name = "thiserror-impl"
version = "1.0.63" version = "1.0.65"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" checksum = "ae71770322cbd277e69d762a16c444af02aa0575ac0d174f0b9562d3b37f8602"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.46", "syn 2.0.79",
] ]
[[package]] [[package]]
@ -4803,7 +4837,7 @@ checksum = "5f5ae998a069d4b5aba8ee9dad856af7d520c3699e6159b185c2acd48155d39a"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.46", "syn 2.0.79",
] ]
[[package]] [[package]]
@ -4841,9 +4875,9 @@ dependencies = [
[[package]] [[package]]
name = "tokio-socks" name = "tokio-socks"
version = "0.5.1" version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "51165dfa029d2a65969413a6cc96f354b86b464498702f174a4efa13608fd8c0" checksum = "0d4770b8024672c1101b3f6733eab95b18007dbe0847a8afe341fcf79e06043f"
dependencies = [ dependencies = [
"either", "either",
"futures-util", "futures-util",
@ -4896,9 +4930,9 @@ dependencies = [
[[package]] [[package]]
name = "tokio-util" name = "tokio-util"
version = "0.7.11" version = "0.7.12"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" checksum = "61e7c3654c13bcd040d4a03abee2c75b1d14a37b423cf5a813ceae1cc903ec6a"
dependencies = [ dependencies = [
"bytes", "bytes",
"futures-core", "futures-core",
@ -4919,9 +4953,9 @@ dependencies = [
[[package]] [[package]]
name = "toml" name = "toml"
version = "0.8.15" version = "0.8.19"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ac2caab0bf757388c6c0ae23b3293fdb463fee59434529014f85e3263b995c28" checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e"
dependencies = [ dependencies = [
"serde", "serde",
"serde_spanned", "serde_spanned",
@ -4931,18 +4965,18 @@ dependencies = [
[[package]] [[package]]
name = "toml_datetime" name = "toml_datetime"
version = "0.6.6" version = "0.6.8"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4badfd56924ae69bcc9039335b2e017639ce3f9b001c393c1b2d1ef846ce2cbf" checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41"
dependencies = [ dependencies = [
"serde", "serde",
] ]
[[package]] [[package]]
name = "toml_edit" name = "toml_edit"
version = "0.22.16" version = "0.22.20"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "278f3d518e152219c994ce877758516bca5e118eaed6996192a774fb9fbf0788" checksum = "583c44c02ad26b0c3f3066fe629275e50627026c51ac2e595cca4c230ce1ce1d"
dependencies = [ dependencies = [
"indexmap 2.1.0", "indexmap 2.1.0",
"serde", "serde",
@ -5029,7 +5063,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.46", "syn 2.0.79",
] ]
[[package]] [[package]]
@ -5327,9 +5361,9 @@ checksum = "05e42f7c18b8f902290b009cde6d651262f956c98bc51bca4cd1d511c9cd85c7"
[[package]] [[package]]
name = "uuid" name = "uuid"
version = "1.10.0" version = "1.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "81dfa00651efa65069b0b6b651f4aaa31ba9e3c3ce0137aaad053604ee7e0314" checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a"
dependencies = [ dependencies = [
"getrandom 0.2.11", "getrandom 0.2.11",
"serde", "serde",
@ -5436,7 +5470,7 @@ dependencies = [
"once_cell", "once_cell",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.46", "syn 2.0.79",
"wasm-bindgen-shared", "wasm-bindgen-shared",
] ]
@ -5470,7 +5504,7 @@ checksum = "bae1abb6806dc1ad9e560ed242107c0f6c84335f1749dd4e8ddb012ebd5e25a7"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.46", "syn 2.0.79",
"wasm-bindgen-backend", "wasm-bindgen-backend",
"wasm-bindgen-shared", "wasm-bindgen-shared",
] ]
@ -5589,6 +5623,36 @@ 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"
@ -5617,7 +5681,16 @@ 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.0", "windows-targets 0.52.6",
]
[[package]]
name = "windows-sys"
version = "0.59.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b"
dependencies = [
"windows-targets 0.52.6",
] ]
[[package]] [[package]]
@ -5637,17 +5710,18 @@ dependencies = [
[[package]] [[package]]
name = "windows-targets" name = "windows-targets"
version = "0.52.0" version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
dependencies = [ dependencies = [
"windows_aarch64_gnullvm 0.52.0", "windows_aarch64_gnullvm 0.52.6",
"windows_aarch64_msvc 0.52.0", "windows_aarch64_msvc 0.52.6",
"windows_i686_gnu 0.52.0", "windows_i686_gnu 0.52.6",
"windows_i686_msvc 0.52.0", "windows_i686_gnullvm",
"windows_x86_64_gnu 0.52.0", "windows_i686_msvc 0.52.6",
"windows_x86_64_gnullvm 0.52.0", "windows_x86_64_gnu 0.52.6",
"windows_x86_64_msvc 0.52.0", "windows_x86_64_gnullvm 0.52.6",
"windows_x86_64_msvc 0.52.6",
] ]
[[package]] [[package]]
@ -5658,9 +5732,9 @@ checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc"
[[package]] [[package]]
name = "windows_aarch64_gnullvm" name = "windows_aarch64_gnullvm"
version = "0.52.0" version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
[[package]] [[package]]
name = "windows_aarch64_msvc" name = "windows_aarch64_msvc"
@ -5676,9 +5750,9 @@ checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3"
[[package]] [[package]]
name = "windows_aarch64_msvc" name = "windows_aarch64_msvc"
version = "0.52.0" version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
[[package]] [[package]]
name = "windows_i686_gnu" name = "windows_i686_gnu"
@ -5694,9 +5768,15 @@ checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241"
[[package]] [[package]]
name = "windows_i686_gnu" name = "windows_i686_gnu"
version = "0.52.0" version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
[[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"
@ -5712,9 +5792,9 @@ checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00"
[[package]] [[package]]
name = "windows_i686_msvc" name = "windows_i686_msvc"
version = "0.52.0" version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
[[package]] [[package]]
name = "windows_x86_64_gnu" name = "windows_x86_64_gnu"
@ -5730,9 +5810,9 @@ checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1"
[[package]] [[package]]
name = "windows_x86_64_gnu" name = "windows_x86_64_gnu"
version = "0.52.0" version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
[[package]] [[package]]
name = "windows_x86_64_gnullvm" name = "windows_x86_64_gnullvm"
@ -5742,9 +5822,9 @@ checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953"
[[package]] [[package]]
name = "windows_x86_64_gnullvm" name = "windows_x86_64_gnullvm"
version = "0.52.0" version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
[[package]] [[package]]
name = "windows_x86_64_msvc" name = "windows_x86_64_msvc"
@ -5760,15 +5840,15 @@ checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a"
[[package]] [[package]]
name = "windows_x86_64_msvc" name = "windows_x86_64_msvc"
version = "0.52.0" version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
[[package]] [[package]]
name = "winnow" name = "winnow"
version = "0.6.5" version = "0.6.18"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dffa400e67ed5a4dd237983829e66475f0a4a26938c4b04c21baede6262215b8" checksum = "68a9bda4691f099d435ad181000724da8e5899daa10713c2d432552b9ccd3a6f"
dependencies = [ dependencies = [
"memchr", "memchr",
] ]
@ -5782,16 +5862,6 @@ 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"
@ -5845,7 +5915,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.46", "syn 2.0.79",
] ]
[[package]] [[package]]

22
Dockerfile Normal file
View file

@ -0,0 +1,22 @@
# 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"]

View file

@ -1,3 +1,8 @@
> [!CAUTION]
> # THIS REPO IS UNMAINTAINED <br>PLEASE USE [UNSTOPPABLESWAP]([url](https://github.com/UnstoppableSwap/core)) INSTEAD
**This repository is unmaintained**. The original developers (@comit-network) have moved on to other projects. Community volunteers are continuing development at [UnstoppableSwap/core](https://github.com/UnstoppableSwap/core), which includes a graphical user interface. Please note that the fork has introduced network-level breaking changes, making it incompatible with peers running this repository - you will not be able to initiate swaps with them.
# XMR to BTC Atomic Swap # XMR to BTC Atomic Swap
This repository hosts an MVP for atomically swapping BTC to XMR. This repository hosts an MVP for atomically swapping BTC to XMR.

View file

@ -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.2", default-features = false, features = [ "fmt", "ansi", "env-filter", "tracing-log" ] } tracing-subscriber = { version = "0.3", default-features = false, features = [ "fmt", "ansi", "env-filter", "tracing-log" ] }

View file

@ -37,11 +37,13 @@ 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"
@ -67,7 +69,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.10", features = [ "serde", "v4" ] } uuid = { version = "1.11", features = [ "serde", "v4" ] }
void = "1" void = "1"
[target.'cfg(not(windows))'.dependencies] [target.'cfg(not(windows))'.dependencies]
@ -79,9 +81,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.4" hyper = "1.5"
jsonrpsee = { version = "0.16.2", features = [ "ws-client" ] } jsonrpsee = { version = "0.16.2", features = [ "ws-client" ] }
mockito = "1.4" mockito = "1.5"
monero-harness = { path = "../monero-harness" } monero-harness = { path = "../monero-harness" }
port_check = "0.2" port_check = "0.2"
proptest = "1" proptest = "1"

View file

@ -1,12 +1,13 @@
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, cli, monero}; use crate::{bitcoin, common, 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;
@ -16,6 +17,8 @@ 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();
@ -167,6 +170,7 @@ 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)]
@ -180,12 +184,20 @@ 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 _ = cli::tracing::init(debug, json, data_dir.join("logs")); let _ = common::tracing_util::init(level_filter, format, 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())
@ -241,6 +253,7 @@ 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)
@ -265,6 +278,7 @@ 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,
} }
} }

View file

@ -1,6 +1,7 @@
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;
@ -8,14 +9,18 @@ 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};
@ -45,6 +50,11 @@ 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>,
@ -122,6 +132,13 @@ 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",
@ -638,14 +655,111 @@ impl Request {
}) })
} }
Method::History => { Method::History => {
let swaps = context.db.all().await?; let mut table = Table::new();
let mut vec: Vec<(Uuid, String)> = Vec::new(); table.set_header(vec![
for (swap_id, state) in swaps { "Swap ID",
let state: BobState = state.try_into()?; "Start Date",
vec.push((swap_id, state.to_string())); "State",
"BTC Amount",
"XMR Amount",
"Exchange Rate",
"Trading Partner Peer ID",
]);
let all_swaps = context.db.all().await?;
let mut json_results = Vec::new();
for (swap_id, state) in all_swaps {
let result: Result<_> = async {
let latest_state: BobState = state.try_into()?;
let all_states = context.db.get_states(swap_id).await?;
let state3 = all_states
.iter()
.find_map(|s| {
if let State::Bob(BobState::BtcLocked { state3, .. }) = s {
Some(state3)
} else {
None
}
})
.context("Failed to get \"BtcLocked\" state")?;
let swap_start_date = context.db.get_swap_start_date(swap_id).await?;
let peer_id = context.db.get_peer_id(swap_id).await?;
let btc_amount = state3.tx_lock.lock_amount();
let xmr_amount = state3.xmr;
let exchange_rate = Decimal::from_f64(btc_amount.to_btc())
.ok_or_else(|| {
anyhow::anyhow!("Failed to convert BTC amount to Decimal")
})?
.checked_div(xmr_amount.as_xmr())
.ok_or_else(|| anyhow::anyhow!("Division by zero or overflow"))?;
let exchange_rate = format!("{} XMR/BTC", exchange_rate.round_dp(8));
let swap_data = json!({
"swapId": swap_id.to_string(),
"startDate": swap_start_date.to_string(),
"state": latest_state.to_string(),
"btcAmount": btc_amount.to_string(),
"xmrAmount": xmr_amount.to_string(),
"exchangeRate": exchange_rate,
"tradingPartnerPeerId": peer_id.to_string()
});
if context.config.json {
tracing::info!(
swap_id = %swap_id,
swap_start_date = %swap_start_date,
latest_state = %latest_state,
btc_amount = %btc_amount,
xmr_amount = %xmr_amount,
exchange_rate = %exchange_rate,
trading_partner_peer_id = %peer_id,
"Found swap in database"
);
} else {
table.add_row(vec![
swap_id.to_string(),
swap_start_date.to_string(),
latest_state.to_string(),
btc_amount.to_string(),
xmr_amount.to_string(),
exchange_rate,
peer_id.to_string(),
]);
}
Ok(swap_data)
}
.await;
match result {
Ok(swap_data) => json_results.push(swap_data),
Err(e) => {
tracing::error!(swap_id = %swap_id, error = %e, "Failed to get swap details")
}
}
} }
Ok(json!({ "swaps": vec })) if !context.config.json && !context.is_daemon {
println!("{}", table);
}
Ok(json!({"swaps": json_results}))
}
Method::Logs {
logs_dir,
redact,
swap_id,
} => {
let dir = logs_dir.unwrap_or(context.config.data_dir.join("logs"));
let logs = get_logs(dir, swap_id, redact).await?;
for msg in &logs {
println!("{msg}");
}
Ok(json!({ "logs": logs }))
} }
Method::GetRawStates => { Method::GetRawStates => {
let raw_history = context.db.raw_all().await?; let raw_history = context.db.raw_all().await?;

View file

@ -4,7 +4,6 @@ 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};

View file

@ -19,7 +19,6 @@ 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;
@ -28,23 +27,35 @@ 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 => Arguments { RawCommand::History { only_unfinished } => 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, cmd: Command::History { only_unfinished },
},
RawCommand::Logs {
logs_dir: dir_path,
swap_id,
redact,
} => Arguments {
testnet,
json,
config_path: config_path(config, testnet)?,
env_config: env_config(testnet),
cmd: Command::Logs {
logs_dir: dir_path,
swap_id,
redact,
},
}, },
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 {
@ -55,7 +66,6 @@ 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,
@ -63,7 +73,6 @@ 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,
@ -71,7 +80,6 @@ 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,
@ -82,7 +90,6 @@ 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 {
@ -96,7 +103,6 @@ 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 },
@ -106,7 +112,6 @@ 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 },
@ -116,7 +121,6 @@ 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 },
@ -124,7 +128,6 @@ 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 },
@ -184,7 +187,6 @@ 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,
@ -195,8 +197,15 @@ 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,
@ -268,8 +277,33 @@ 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.")]
@ -366,7 +400,6 @@ 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 },
@ -384,10 +417,11 @@ 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);
@ -402,7 +436,6 @@ 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,
@ -424,7 +457,6 @@ 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 {
@ -451,7 +483,6 @@ 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 {
@ -477,7 +508,6 @@ 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 {
@ -503,7 +533,6 @@ 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 {
@ -529,7 +558,6 @@ 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 {
@ -549,7 +577,6 @@ 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 },
@ -567,10 +594,11 @@ 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);
@ -585,7 +613,6 @@ 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,
@ -609,7 +636,6 @@ 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 {
@ -636,7 +662,6 @@ 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 {
@ -663,7 +688,6 @@ 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 {
@ -690,7 +714,6 @@ 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 {
@ -717,7 +740,6 @@ 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 {
@ -737,7 +759,6 @@ 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 },

View file

@ -1,30 +0,0 @@
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(())
}

View file

@ -18,6 +18,8 @@ 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};
@ -29,51 +31,50 @@ 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::check_latest_version; use swap::common::tracing_util::Format;
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::{asb, bitcoin, kraken, monero, tor}; use swap::{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>() {
match clap_err.kind { if let ErrorKind::HelpDisplayed | ErrorKind::VersionDisplayed = clap_err.kind {
ErrorKind::HelpDisplayed | ErrorKind::VersionDisplayed => { println!("{}", clap_err.message);
println!("{}", clap_err.message); std::process::exit(0);
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);
} }
asb::tracing::init(LevelFilter::DEBUG, json, !disable_timestamp).expect("initialize tracing"); // read config from the specified path
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 {}) => {
@ -82,6 +83,12 @@ 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 {:?}",
@ -108,6 +115,7 @@ 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.",
@ -115,9 +123,12 @@ 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, _) => {
@ -140,6 +151,7 @@ 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");
@ -224,24 +236,105 @@ async fn main() -> Result<()> {
event_loop.run().await; event_loop.run().await;
} }
Command::History => { Command::History { only_unfinished } => {
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();
let mut table = Table::new(); table.set_header(vec![
"Swap ID",
"Start Date",
"State",
"BTC Amount",
"XMR Amount",
"Exchange Rate",
"Trading Partner Peer ID",
"Completed",
]);
table.set_header(vec!["SWAP ID", "STATE"]); let all_swaps = db.all().await?;
for (swap_id, state) in all_swaps {
if let Err(e) = async {
let latest_state: AliceState = state.try_into()?;
let is_completed = is_complete(&latest_state);
for (swap_id, state) in db.all().await? { if only_unfinished && is_completed {
let state: AliceState = state.try_into()?; return Ok::<_, anyhow::Error>(());
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");
}
} }
println!("{}", table); if !json {
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?;

View file

@ -468,6 +468,7 @@ 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)
@ -871,6 +872,11 @@ 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))

View file

@ -3,7 +3,6 @@ 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};

View file

@ -78,6 +78,7 @@ where
debug, debug,
json, json,
None, None,
false,
) )
.await?; .await?;
@ -100,14 +101,32 @@ 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).await?; Context::build(None, None, None, data, is_testnet, debug, json, None, false)
.await?;
(context, request)
}
CliCommand::Logs {
logs_dir,
redact,
swap_id,
} => {
let request = Request::new(Method::Logs {
logs_dir,
redact,
swap_id,
});
let context =
Context::build(None, None, None, data, is_testnet, debug, json, None, false)
.await?;
(context, 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).await?; Context::build(None, None, None, data, is_testnet, debug, json, None, false)
.await?;
(context, request) (context, request)
} }
CliCommand::Balance { bitcoin } => { CliCommand::Balance { bitcoin } => {
@ -124,6 +143,7 @@ where
debug, debug,
json, json,
None, None,
false,
) )
.await?; .await?;
(context, request) (context, request)
@ -145,6 +165,7 @@ where
debug, debug,
json, json,
server_address, server_address,
true,
) )
.await?; .await?;
(context, request) (context, request)
@ -166,6 +187,7 @@ where
debug, debug,
json, json,
None, None,
false,
) )
.await?; .await?;
(context, request) (context, request)
@ -187,6 +209,7 @@ where
debug, debug,
json, json,
None, None,
false,
) )
.await?; .await?;
(context, request) (context, request)
@ -207,6 +230,7 @@ where
debug, debug,
json, json,
None, None,
false,
) )
.await?; .await?;
(context, request) (context, request)
@ -217,8 +241,18 @@ where
} => { } => {
let request = Request::new(Method::ListSellers { rendezvous_point }); let request = Request::new(Method::ListSellers { rendezvous_point });
let context = let context = Context::build(
Context::build(None, None, Some(tor), data, is_testnet, debug, json, None).await?; None,
None,
Some(tor),
data,
is_testnet,
debug,
json,
None,
false,
)
.await?;
(context, request) (context, request)
} }
@ -234,6 +268,7 @@ where
debug, debug,
json, json,
None, None,
false,
) )
.await?; .await?;
(context, request) (context, request)
@ -244,7 +279,8 @@ 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).await?; Context::build(None, None, None, data, is_testnet, debug, json, None, false)
.await?;
(context, request) (context, request)
} }
@ -321,6 +357,25 @@ 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.")]

View file

@ -1,112 +0,0 @@
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);
}
}
}

View file

@ -1,56 +0,0 @@
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);
}
}

221
swap/src/common/mod.rs Normal file
View file

@ -0,0 +1,221 @@
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);
}
}

View file

@ -0,0 +1,64 @@
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(())
}

View file

@ -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::{Pool, SqlitePool}; use sqlx::{ConnectOptions, 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,7 +26,8 @@ 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 options = SqliteConnectOptions::from_str(&path_str)?.read_only(read_only); let mut 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 };

View file

@ -142,6 +142,14 @@ 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"));
@ -184,11 +192,8 @@ 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 mut decimal = Decimal::from(self.0); let xmr_value = self.as_xmr();
decimal write!(f, "{} XMR", xmr_value)
.set_scale(12)
.expect("12 is smaller than max precision of 28");
write!(f, "{} XMR", decimal)
} }
} }

View file

@ -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")]
btc: bitcoin::Amount, pub btc: bitcoin::Amount,
xmr: monero::Amount, pub 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,

View file

@ -440,7 +440,7 @@ where
}) })
} }
pub(crate) fn is_complete(state: &AliceState) -> bool { pub fn is_complete(state: &AliceState) -> bool {
matches!( matches!(
state, state,
AliceState::XmrRefunded AliceState::XmrRefunded

View file

@ -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,
xmr: monero::Amount, pub 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,

View file

@ -7,7 +7,9 @@ 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;
@ -48,8 +50,30 @@ 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, context| async move { module.register_async_method("get_history", |params_raw, context| async move {
execute_request(params, Method::History, &context).await execute_request(params_raw, Method::History, &context).await
})?;
module.register_async_method("get_logs", |params_raw, context| async move {
#[derive(Debug, Clone, Deserialize)]
struct Params {
swap_id: Option<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 {

View file

@ -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::*;

View file

@ -103,13 +103,26 @@ mod test {
let (client, _, _) = setup_daemon(harness_ctx).await; let (client, _, _) = setup_daemon(harness_ctx).await;
let response: HashMap<String, Vec<(Uuid, String)>> = client let response: HashMap<String, Vec<Value>> = 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())];
assert_eq!(response, HashMap::from([("swaps".to_string(), swaps)])); let swaps = response.get("swaps").unwrap();
assert_eq!(swaps.len(), 1);
assert_has_keys_serde(
swaps[0].as_object().unwrap(),
&[
"swapId",
"startDate",
"state",
"btcAmount",
"xmrAmount",
"exchangeRate",
"tradingPartnerPeerId",
],
);
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())