* config: global instance
* fix: cli tests
* fix: owner api tests
* config: save tor config
* fix: owner rpc tests
* fix: set config file path on init and owner api call
* tor: store launched services, get global config at command loop, remove unused listen args, check for empty global config to set default, do not save empty tor config at owner
* api: update config in memory after successful file write
* arti: restart proxy in loop
* fix: comment for tor config save
* config: set or init, update without error
* config: scoped tor config
* build: update lock file
* config: ability to store multiple configurations at memory from config path
* tor: restart service on config change
* fix: owner api test
* foreign: pass tor config from args, stop service, error handling
* arti: move runtime wrapper to single file
* config: read existing config from file at create_config
* config: handle error on read
* arti: single dir for cache
* foreign: register config listener before launch
* config: save temp
* config: remove unused error type
* config: make path and members not optional, return an error on config creation if it exists, pass default tor config to send if not set
* arti: non public runtime wrapper
* config: migrate comments
* fix: rpc tests
* config: return from cache if exists
* config: save disabled tor config when null provided at owner and tor section was not set
* config: update tor with args at listener
* config: pass pathbuf directly on creation
* config: unique tmp file name, setting permissions and providing config version
* fix global config handling
* fix config persistence
* fix tor service restart
* fix config synchronization
* require wallet close before changing data directory
* unify global config updates
---------
Co-authored-by: wiesche <wiesche89@googlemail.com>
* wallet: update lmdb from store crate, migrate single backend from trait to struct, update tests cargo deps and design doc
* backend: do not panic on iter and directory creation
* return iterator errors
* build: update to last node revision
* fix: height selection for scan, remove unused mutability for wallet
* wallet: remove unused mutability conversion
* tx: store slate state at database
* build: cargo fmt
* fix: do not return error when slate not found on tx slate state update
* lmdb: do not collect all tx log records at iterator, show read errors at log
* fix: save slate state, return error if slate not found
* tx: specify amount of bad txs on slate state update error
---------
Co-authored-by: Joerg <wiesche89@googlemail.com>
* scan: save last scanned block info for initial wallet scanning
* scan: save start height at scanned block info on outputs collecting
* scan: 10k blocks batches
* fix: include last height into batch on scan
* scan: save hash of last block
* scan: add larger window (2880 blocks) to scan outputs when updating wallet state
* add test batched scan and resume, add scan doc
* rename corrupted restore test
---------
Co-authored-by: Joerg <wiesche89@googlemail.com>
save_step writes the signed transaction after the wallet state batch has
committed, so the write can fail with the tx log entry and the input
locks already persisted. store_tx writes a file outside LMDB, as it does
for every transaction in the wallet, so the two cannot share a commit
without moving stored transactions into the database, which backend.rs
already carries a TODO for. Cancelling is the way out: it releases the
inputs without reading the stored tx, and nothing has been broadcast
because the error returns before the caller posts. Tested by removing
the file and cancelling.
Also set stored_tx on the entry, as internal::selection does for a
standard send. It was left unset, so txs reported no transaction data
for every contract even though the transaction was stored.
controller/tests/contract/mod.rs was never declared as a test module, so
none of it was compiled, and most of it was commented out. Its
create_wallets is an older copy of the one in the shared test module,
which every contract test already uses.
- Remove unused imports in api_impl::owner, backend, contract::utils,
v5_bin and the contract tests.
- Remove unused test bindings, and document the shared slate test
fixtures module.
- Drop the commented-out assertion block in the mwixnet contract test,
along with the height bookkeeping and import that only it used.
Brings the branch current with staging for review.
- ed25519-dalek 1.0.0-pre.4 to 2: PublicKey is now VerifyingKey, Keypair
is replaced by SigningKey, and from_bytes takes a fixed-size array.
Ported the contract proof code and the V5 slate serializers, following
the pattern staging already uses in v4_bin.
- owner_single_use and foreign_single_use now take the wallet instance
and a config path rather than an optional API handle. Updated the
contract call sites in command.rs and the contract tests.
- update_tx_slate_state moved to api_impl::types; dropped the local copy.
- Took staging's fixed-size-array form of the slate signature guards; it
is equivalent to 25a5434 and keeps the file in sync with upstream.
- The grin node is now a submodule, so a build needs
git submodule update --init.
* config: global instance
* fix: cli tests
* fix: owner api tests
* config: save tor config
* fix: owner rpc tests
* fix: set config file path on init and owner api call
* tor: store launched services, get global config at command loop, remove unused listen args, check for empty global config to set default, do not save empty tor config at owner
* api: update config in memory after successful file write
* arti: restart proxy in loop
* fix: comment for tor config save
* config: set or init, update without error
* config: scoped tor config
* build: update lock file
* config: ability to store multiple configurations at memory from config path
* tor: restart service on config change
* fix: owner api test
* foreign: pass tor config from args, stop service, error handling
* arti: move runtime wrapper to single file
* config: read existing config from file at create_config
* config: handle error on read
* arti: single dir for cache
* foreign: register config listener before launch
* config: save temp
* config: remove unused error type
* config: make path and members not optional, return an error on config creation if it exists, pass default tor config to send if not set
* arti: non public runtime wrapper
* config: migrate comments
* fix: rpc tests
* config: return from cache if exists
* config: save disabled tor config when null provided at owner and tor section was not set
* config: update tor with args at listener
* config: pass pathbuf directly on creation
* config: unique tmp file name, setting permissions and providing config version
* fix global config handling
* fix config persistence
* fix tor service restart
* fix config synchronization
* require wallet close before changing data directory
* unify global config updates
---------
Co-authored-by: wiesche <wiesche89@googlemail.com>
revoke cancels the original tx (unlocking its inputs) before the replacement
self-spend is built, and the steps commit separately, so a crash in between left
the inputs Unspent with no self-spend while a retry silently did nothing.
- Find the contributed inputs by tx id whether they are still Locked (original tx
active) or already Unspent (a prior revoke cancelled them but the self-spend did
not finish), instead of Locked-only.
- Cancel only when the tx is still in a cancellable state, so a resumed or repeated
revoke skips the cancel and re-spends the Unspent inputs.
- Once the self-spend completes the inputs reference its tx id, so a later revoke
is a no-op.
Adds a regression test that interrupts a revoke after the cancel and confirms the
next revoke resumes and produces the self-spend.
Addresses PR #754 review (revoke.rs).
OutputSelectionArgs.make_outputs was a comma-separated grin string parsed inside
libwallet via amount_from_hr_string. Move that parsing to the CLI boundary and
carry explicit nanogrin u64 amounts through the API and Context instead:
- OutputSelectionArgs.make_outputs: Option<String> -> Option<Vec<u64>>;
output_amounts() becomes a plain accessor, num_custom_outputs() uses len().
- The CLI (wallet_args) parses grin -> nanogrin per amount; ContractNewArgs and
ContractSetupArgs carry Vec<u64> and copy it through.
- Update the two tests that supplied make_outputs as a string.
Addresses PR #754 review (types.rs, wallet_args.rs).
Reconcile the contract feature with #755, which replaced the WalletBackend
trait with a concrete WalletBackend<C,K> struct (libwallet/src/backend.rs) and
removed impls/src/backends/lmdb.rs.
- Port the contract module and contract API entry points from the trait form
(T: WalletBackend<'a,C,K>) to the concrete struct.
- Re-home next_child_for and a parent_id+log_id get_tx_log_entry onto backend.rs.
- Re-apply the self-spend tx-log filters, cancel-loop, v5 payment-proof fields,
and Context contract fields onto staging's rewritten files.
- Adapt to fallible iter()/tx_log_iter() and self-consuming batch commit.
Full suite green (53 binaries / 191 tests).
* wallet: update lmdb from store crate, migrate single backend from trait to struct, update tests cargo deps and design doc
* backend: do not panic on iter and directory creation
* return iterator errors
* build: update to last node revision
* fix: height selection for scan, remove unused mutability for wallet
* wallet: remove unused mutability conversion
* tx: store slate state at database
* build: cargo fmt
* fix: do not return error when slate not found on tx slate state update
* lmdb: do not collect all tx log records at iterator, show read errors at log
* fix: save slate state, return error if slate not found
* tx: specify amount of bad txs on slate state update error
---------
Co-authored-by: Joerg <wiesche89@googlemail.com>
revoke() cancelled the original tx and built the self-spend using the wallet's
active account, but the locked inputs belong to the account that created the
contract. Revoking while a different account was active would fail to find and
cancel the original tx and would recover funds into the wrong account.
- derive the account from the locked input's root_key_id; use it for cancel_tx
and as the self-spend's src_acct_name.
- test: revoke a contract while a different account is active.
Addresses PR #754 review (revoke.rs).
contract `new` and the foreign `contract_new` API unwrapped the optional
net_change field, so a request omitting it panicked the wallet. Return an
error instead.
- new::compute and foreign::contract_new: net_change.ok_or_else(..).
- test: contract_new with no net change errors rather than panicking.
Addresses PR #754 review (new.rs, foreign.rs).
New contract outputs were derived with next_child(), which uses the wallet's
active account. During a late-lock the active account can differ from the one the
contract context was created under, so an output could be created in the wrong
account. Derive under context.parent_key_id instead.
- WalletBackend: add next_child_for(parent_key_id, mask); next_child delegates to it.
- add_outputs_to_ctx derives via next_child_for(&context.parent_key_id, ..).
- parent_key_for returns Result and errors (UnknownAccountLabel) on an unknown
account name instead of silently falling back to the active account.
- test: a contract referencing an unknown account now errors.
Addresses PR #754 review (context.rs, utils.rs).
Bring the branch current with upstream staging (= master + #748). The earlier
"Merge branch master into contracts" used a stale local master snapshot, which
left the branch ~41 commits behind; this merges the current tip, including the
grin 5.4.0 dependency bump (#745) and the tx-delete / retrieve_txs fixes.
Only Cargo.lock conflicted (regenerated). Full cargo test --workspace green
(52 binaries / 185 tests).
OutputSelectionArgs::output_amounts() unwrap()'d the float parse of each
make-outputs value, panicking on bad input via the API path (the CLI now
validates earlier). Return Result instead; sum_output_amounts() propagates.
num_custom_outputs() now counts CSV entries without parsing, so it stays
infallible and the debug! macros that use it are unaffected.
Default ProofArgs.suppress_proof to true. With it false, the receiver's
`contract sign` unconditionally built an invoice promise, but the sender
address is never plumbed through, so a bare send/receive failed with
NoSenderAddressProvided (#729). The CLI never sets this field, so every
default `contract sign --receive` hit the broken path; the basic tests
passed only because they set suppress_proof = true by hand.
Drop those workarounds from contract_srs/contract_rsr so they now exercise
the default path, and opt the proof-using tests (contract_early_proofs_srs,
contract_early_proofs_rsr, contract_accounts) into proofs explicitly.
master's mwixnet (#726) keeps the `types` submodule private and re-exports
its items, so use the public `mwixnet::MixnetReqCreationParams` path. The
merge missed this because `cargo check --workspace` does not build test
targets.
Bring the contracts feature branch up to current master, which has since
landed rust 1.80 support (#722), the canonical mwixnet onion code (#726),
and node-client proxy support (#738).
Conflict resolution:
- libwallet/src/mwixnet/*: take master's (#726), dropping the contracts
branch's older divergent copy. owner.rs::create_mwixnet_req updated to
master's API (use_test_rng) and master's flat re-export imports.
- Cargo manifests/lock/.cargo: master's deps & version; re-add serde_with
for Slate v5; keep contracts' .cargo/config.toml (Windows static-CRT).
- lib.rs: keep serde_derive AND serde_with macro_use; single mwixnet decl.
- error.rs: union of master + contracts variants; flat mwixnet re-exports.
- api/libwallet owner.rs: master's #738 + create_mwixnet_req plus the
contract_* entry points; drop duplicate older create_mwixnet_req method.
- slatepack/armor.rs, node_clients/resp_types.rs: take master's.
Workspace builds; libwallet lib tests pass (34/34). The Slate version()
bug, issue #729 fix, and de-panicking follow in subsequent commits.
* scan: save last scanned block info for initial wallet scanning
* scan: save start height at scanned block info on outputs collecting
* scan: 10k blocks batches
* fix: include last height into batch on scan
* scan: save hash of last block
* scan: add larger window (2880 blocks) to scan outputs when updating wallet state
* add test batched scan and resume, add scan doc
* rename corrupted restore test
---------
Co-authored-by: Joerg <wiesche89@googlemail.com>
* add all comsig code, update to master branch
* refactor code into libwallet, remove some redundancy and update type exports
* added api calls and unit test for comsig request creation
* Addition of JSON-RPC mwixnet function call
* attempt to debug invalid params
* additions to support json doctesting for comsig creation
* tweaks to testing and documentation updates
* dependencies for tests
* update srs test
* updating comsig creation, attempt to get working
* implementation of comsig given an output commit
* lock output on mwixnet creation, add further testing