From dc3bc2869488f4007013e19fd018cf9503ddb0e4 Mon Sep 17 00:00:00 2001 From: Gene Hoffman Date: Tue, 10 Mar 2026 12:07:16 -0700 Subject: [PATCH 01/12] feat: simplify unstable XCH pricing and market expiry configuration Use Cloud Wallet chia quotes as the primary daemon XCH/USD source with cached CoinCodex fallback, add cache layers and per-market unstable cancel thresholds, and migrate market config to minutes-based strategy expiry with legacy field cleanup. This reduces unstable-pair configuration complexity while keeping offer cancellation and refresh behavior responsive. Made-with: Cursor --- .../testnet11-asset-bootstrap-helper.yml | 3 +- config/markets.yaml | 67 ++++-- config/testnet-markets.yaml | 6 +- greenfloor/adapters/cloud_wallet.py | 32 ++- greenfloor/adapters/dexie.py | 51 ++++- greenfloor/adapters/price.py | 54 +++++ greenfloor/cli/manager.py | 41 ++++ greenfloor/cloud_wallet_offer_runtime.py | 19 +- greenfloor/config/models.py | 51 +++-- greenfloor/core/strategy.py | 23 +- greenfloor/daemon/main.py | 201 +++++++++++++++--- greenfloor/logging_setup.py | 14 +- tests/logging_helpers.py | 2 + tests/test_cloud_wallet_adapter.py | 44 ++++ tests/test_config_models.py | 51 ++++- tests/test_daemon_cancel_policy.py | 20 ++ tests/test_daemon_offer_execution.py | 140 ++++++++++++ tests/test_daemon_strategy_integration.py | 100 +++++++++ tests/test_daemon_websocket_runtime.py | 13 +- tests/test_dexie_adapter.py | 29 +++ tests/test_logging_setup.py | 33 +++ tests/test_manager_post_offer.py | 116 +++++++++- tests/test_price_adapter.py | 46 +++- tests/test_strategy.py | 7 +- 24 files changed, 1035 insertions(+), 128 deletions(-) diff --git a/.github/workflows/testnet11-asset-bootstrap-helper.yml b/.github/workflows/testnet11-asset-bootstrap-helper.yml index 6dcd25b..166745a 100644 --- a/.github/workflows/testnet11-asset-bootstrap-helper.yml +++ b/.github/workflows/testnet11-asset-bootstrap-helper.yml @@ -277,8 +277,6 @@ jobs: snippet_lines.append(f" signer_key_id: {yaml_quote(signer_key_id)}") snippet_lines.append(f" receive_address: {yaml_quote(receive_address)}") snippet_lines.append(" pricing:") - snippet_lines.append(' reference_source: "coingecko"') - snippet_lines.append(' reference_pair: "txch_usd"') snippet_lines.append(' side: "sell"') snippet_lines.append(f" fixed_quote_per_base: {fixed_quote_per_base}") snippet_lines.append(" quote_unit_mojo_multiplier: 1000000000000") @@ -286,6 +284,7 @@ jobs: snippet_lines.append(" strategy_target_spread_bps: 140") snippet_lines.append(" strategy_min_xch_price_usd: 20.0") snippet_lines.append(" strategy_max_xch_price_usd: 60.0") + snippet_lines.append(" strategy_offer_expiry_minutes: 10") snippet_lines.append(" cancel_policy_stable_vs_unstable: true") snippet_lines.append(" inventory:") snippet_lines.append(" low_watermark_base_units: 0") diff --git a/config/markets.yaml b/config/markets.yaml index 63aaf3d..3841e83 100644 --- a/config/markets.yaml +++ b/config/markets.yaml @@ -14,8 +14,6 @@ markets: cloud_wallet_base_global_id: "Asset_ymgm3ygl5om7ia4u9llk3iu7" cloud_wallet_quote_global_id: "Asset_huun64oh7dbt9f1f9ie8khuw" pricing: - reference_source: "coingecko" - reference_pair: "xch_usd" side: "sell" min_price_quote_per_base: 0.0031 max_price_quote_per_base: 0.0038 @@ -23,6 +21,7 @@ markets: strategy_target_spread_bps: 140 strategy_min_xch_price_usd: 20.0 strategy_max_xch_price_usd: 60.0 + strategy_offer_expiry_minutes: 10 cancel_policy_stable_vs_unstable: true inventory: low_watermark_base_units: 500 @@ -62,8 +61,7 @@ markets: side: "sell" fixed_quote_per_base: 7.75 slippage_bps: 25 - strategy_offer_expiry_unit: "hours" - strategy_offer_expiry_value: 2 + strategy_offer_expiry_minutes: 120 inventory: low_watermark_base_units: 500 low_inventory_alert_threshold_base_units: null @@ -99,8 +97,6 @@ markets: cloud_wallet_base_global_id: "Asset_wjfkwih7s6c1y6rlswnznr6p" cloud_wallet_quote_global_id: "Asset_huun64oh7dbt9f1f9ie8khuw" pricing: - reference_source: "coingecko" - reference_pair: "xch_usd" side: "sell" min_price_quote_per_base: 0.0027 max_price_quote_per_base: 0.0033 @@ -108,6 +104,7 @@ markets: strategy_target_spread_bps: 140 strategy_min_xch_price_usd: 20.0 strategy_max_xch_price_usd: 60.0 + strategy_offer_expiry_minutes: 10 cancel_policy_stable_vs_unstable: true inventory: low_watermark_base_units: 500 @@ -147,8 +144,7 @@ markets: side: "sell" fixed_quote_per_base: 6.75 slippage_bps: 25 - strategy_offer_expiry_unit: "hours" - strategy_offer_expiry_value: 2 + strategy_offer_expiry_minutes: 120 inventory: low_watermark_base_units: 500 low_inventory_alert_threshold_base_units: null @@ -173,7 +169,7 @@ markets: combine_when_excess_factor: 2.0 - id: eco1812020_sell_xch - enabled: false + enabled: true mode: sell_only base_asset: "e257aca547a83020e537e87f8c83e9332d2c3adb729c052e6f04971317084327" base_symbol: "ECO.181.2020" @@ -184,8 +180,6 @@ markets: cloud_wallet_base_global_id: "Asset_s1ifxnpgnf8n3hsd6wlb04q5" cloud_wallet_quote_global_id: "Asset_huun64oh7dbt9f1f9ie8khuw" pricing: - reference_source: "coingecko" - reference_pair: "xch_usd" side: "sell" min_price_quote_per_base: 0.0030 max_price_quote_per_base: 0.0037 @@ -193,6 +187,8 @@ markets: strategy_target_spread_bps: 140 strategy_min_xch_price_usd: 20.0 strategy_max_xch_price_usd: 60.0 + strategy_offer_expiry_minutes: 10 + cancel_move_threshold_bps: 300 cancel_policy_stable_vs_unstable: true inventory: low_watermark_base_units: 500 @@ -232,8 +228,7 @@ markets: side: "sell" fixed_quote_per_base: 7.50 slippage_bps: 25 - strategy_offer_expiry_unit: "hours" - strategy_offer_expiry_value: 2 + strategy_offer_expiry_minutes: 120 inventory: low_watermark_base_units: 500 low_inventory_alert_threshold_base_units: null @@ -269,8 +264,6 @@ markets: cloud_wallet_base_global_id: "Asset_e3jexei5nswyy916lg77vabz" cloud_wallet_quote_global_id: "Asset_huun64oh7dbt9f1f9ie8khuw" pricing: - reference_source: "coingecko" - reference_pair: "xch_usd" side: "sell" min_price_quote_per_base: 0.0027 max_price_quote_per_base: 0.0033 @@ -278,6 +271,7 @@ markets: strategy_target_spread_bps: 140 strategy_min_xch_price_usd: 20.0 strategy_max_xch_price_usd: 60.0 + strategy_offer_expiry_minutes: 10 cancel_policy_stable_vs_unstable: true inventory: low_watermark_base_units: 500 @@ -317,8 +311,46 @@ markets: side: "sell" fixed_quote_per_base: 6.75 slippage_bps: 25 - strategy_offer_expiry_unit: "hours" - strategy_offer_expiry_value: 2 + strategy_offer_expiry_minutes: 120 + inventory: + low_watermark_base_units: 500 + low_inventory_alert_threshold_base_units: null + current_available_base_units: 500 + bucket_counts: + 1: 0 + 10: 0 + 100: 0 + ladders: + sell: + - size_base_units: 1 + target_count: 5 + split_buffer_count: 1 + combine_when_excess_factor: 2.0 + - size_base_units: 10 + target_count: 2 + split_buffer_count: 1 + combine_when_excess_factor: 2.0 + - size_base_units: 100 + target_count: 1 + split_buffer_count: 0 + combine_when_excess_factor: 2.0 + + - id: eco292021_sell_wusdbc + enabled: true + mode: sell_only + base_asset: "5af8db0b15e0de99ad1eff02486bb1998602053c56dfb22dc04e0f5e17ccec8d" + base_symbol: "ECO.29.2021" + quote_asset: "wUSDC.b" + quote_asset_type: stable + signer_key_id: "key-main-1" + receive_address: "xch1u3tytpv45sj0h4lpwmtkyzh2ggvw4x7jccyxzu995p2aj40wzcxqvymyn3" + cloud_wallet_base_global_id: "Asset_aihyg9ncps0bqdkyw9j7i8x2" + cloud_wallet_quote_global_id: "Asset_cxc7mql006dp2w3kigqlj58t" + pricing: + side: "sell" + fixed_quote_per_base: 6.5 + slippage_bps: 25 + strategy_offer_expiry_minutes: 120 inventory: low_watermark_base_units: 500 low_inventory_alert_threshold_base_units: null @@ -353,6 +385,7 @@ markets: receive_address: "xch1u3tytpv45sj0h4lpwmtkyzh2ggvw4x7jccyxzu995p2aj40wzcxqvymyn3" pricing: fixed_quote_per_base: 0.999 + strategy_offer_expiry_minutes: 30 inventory: low_watermark_base_units: 200 low_inventory_alert_threshold_base_units: 200 diff --git a/config/testnet-markets.yaml b/config/testnet-markets.yaml index f951732..9ae1df4 100644 --- a/config/testnet-markets.yaml +++ b/config/testnet-markets.yaml @@ -10,8 +10,6 @@ markets: signer_key_id: "key-main-1" receive_address: "txch1t37dk4kxmptw9eceyjvxn55cfrh827yf5f0nnnm2t6r882nkl66qknnt9k" pricing: - reference_source: "coingecko" - reference_pair: "txch_usd" side: "sell" fixed_quote_per_base: 0.004714285714285714 quote_unit_mojo_multiplier: 1000000000000 @@ -19,6 +17,7 @@ markets: strategy_target_spread_bps: 140 strategy_min_xch_price_usd: 20.0 strategy_max_xch_price_usd: 60.0 + strategy_offer_expiry_minutes: 10 cancel_policy_stable_vs_unstable: true inventory: low_watermark_base_units: 500 @@ -53,8 +52,6 @@ markets: signer_key_id: "key-main-1" receive_address: "txch1t37dk4kxmptw9eceyjvxn55cfrh827yf5f0nnnm2t6r882nkl66qknnt9k" pricing: - reference_source: "coingecko" - reference_pair: "txch_usd" side: "sell" fixed_quote_per_base: 0.002420604183 quote_unit_mojo_multiplier: 1000000000000 @@ -62,6 +59,7 @@ markets: strategy_target_spread_bps: 140 strategy_min_xch_price_usd: 20.0 strategy_max_xch_price_usd: 60.0 + strategy_offer_expiry_minutes: 10 cancel_policy_stable_vs_unstable: true inventory: low_watermark_base_units: 0 diff --git a/greenfloor/adapters/cloud_wallet.py b/greenfloor/adapters/cloud_wallet.py index dad8c10..40e9cd4 100644 --- a/greenfloor/adapters/cloud_wallet.py +++ b/greenfloor/adapters/cloud_wallet.py @@ -140,6 +140,33 @@ def list_coins( break return coins + def get_chia_usd_quote(self) -> float: + query = """ +query quote($asset: String!) { + quote(asset: $asset) { + price + baseAsset + currency + source + createdAt + } +} +""" + payload = self._graphql(query=query, variables={"asset": "chia"}) + quote_payload = payload.get("quote") + if not isinstance(quote_payload, dict): + raise RuntimeError("cloud_wallet_missing_quote") + raw_price = quote_payload.get("price") + if not isinstance(raw_price, str | int | float): + raise RuntimeError("cloud_wallet_invalid_quote_price") + try: + price = float(raw_price) + except (TypeError, ValueError) as exc: + raise RuntimeError("cloud_wallet_invalid_quote_price") from exc + if price <= 0: + raise RuntimeError("cloud_wallet_invalid_quote_price") + return price + def split_coins( self, *, @@ -414,6 +441,9 @@ def get_wallet( states: list[str] | None = None, first: int = 100, ) -> dict[str, Any]: + # Cloud Wallet currently rejects wallet.offers limits above 100. + # Revisit this guard if Cloud Wallet pagination defaults/maxima change. + first_limit = min(100, max(0, int(first))) query = """ query getWallet($walletId: ID, $isCreator: Boolean, $states: [OfferState!], $first: Int) { wallet(id: $walletId) { @@ -439,7 +469,7 @@ def get_wallet( "walletId": self._vault_id, "isCreator": is_creator, "states": states, - "first": int(first), + "first": first_limit, }, ) wallet = payload.get("wallet") or {} diff --git a/greenfloor/adapters/dexie.py b/greenfloor/adapters/dexie.py index d5e7abf..5be38c2 100644 --- a/greenfloor/adapters/dexie.py +++ b/greenfloor/adapters/dexie.py @@ -1,6 +1,7 @@ from __future__ import annotations import json +import time import urllib.error import urllib.parse import urllib.request @@ -8,8 +9,18 @@ class DexieAdapter: - def __init__(self, base_url: str) -> None: + def __init__( + self, + base_url: str, + *, + cache_ttl_seconds: int = 900, + ) -> None: self.base_url = base_url.rstrip("/") + self._cache_ttl_seconds = max(1, int(cache_ttl_seconds)) + self._token_rows_cache: list[dict] | None = None + self._token_rows_cached_at_epoch_s: float | None = None + self._ticker_rows_cache: list[dict] | None = None + self._ticker_rows_cached_at_epoch_s: float | None = None def get_tokens(self) -> list[dict]: url = f"{self.base_url}/v1/swap/tokens" @@ -126,25 +137,53 @@ def lookup_token_by_symbol( return None def _fetch_token_rows(self) -> list[dict]: + now = time.time() + if ( + self._token_rows_cache is not None + and self._token_rows_cached_at_epoch_s is not None + and (now - self._token_rows_cached_at_epoch_s) <= self._cache_ttl_seconds + ): + return list(self._token_rows_cache) try: - return self.get_tokens() + rows = self.get_tokens() except Exception: + if self._token_rows_cache is not None: + return list(self._token_rows_cache) return [] + self._token_rows_cache = list(rows) + self._token_rows_cached_at_epoch_s = now + return list(rows) def _fetch_ticker_rows(self) -> list[dict]: + now = time.time() + if ( + self._ticker_rows_cache is not None + and self._ticker_rows_cached_at_epoch_s is not None + and (now - self._ticker_rows_cached_at_epoch_s) <= self._cache_ttl_seconds + ): + return list(self._ticker_rows_cache) url = f"{self.base_url}/v3/prices/tickers" try: with urllib.request.urlopen(url, timeout=20) as resp: payload = json.loads(resp.read().decode("utf-8")) except Exception: + if self._ticker_rows_cache is not None: + return list(self._ticker_rows_cache) return [] + rows: list[dict] if isinstance(payload, list): - return [r for r in payload if isinstance(r, dict)] - if isinstance(payload, dict): + rows = [r for r in payload if isinstance(r, dict)] + elif isinstance(payload, dict): tickers = payload.get("tickers") if isinstance(tickers, list): - return [r for r in tickers if isinstance(r, dict)] - return [] + rows = [r for r in tickers if isinstance(r, dict)] + else: + rows = [] + else: + rows = [] + self._ticker_rows_cache = list(rows) + self._ticker_rows_cached_at_epoch_s = now + return list(rows) def _row_matches_cat_target(row: dict, target: str, *, include_ticker_split: bool = False) -> bool: diff --git a/greenfloor/adapters/price.py b/greenfloor/adapters/price.py index b626a5b..3d42bb8 100644 --- a/greenfloor/adapters/price.py +++ b/greenfloor/adapters/price.py @@ -61,3 +61,57 @@ async def _fetch_xch_price(self) -> float: return float(payload[0]["current_price"]) raise ValueError("coincodex_response_missing_price") + + +class XchPriceProvider: + """Unified XCH/USD provider with Cloud Wallet primary and CoinCodex fallback.""" + + def __init__( + self, + *, + cloud_wallet_price_fn: Callable[[], float] | None = None, + cloud_wallet_ttl_seconds: int = 120, + fallback_price_adapter: PriceAdapter | None = None, + now_fn: Callable[[], float] | None = None, + ) -> None: + self._cloud_wallet_price_fn = cloud_wallet_price_fn + self._cloud_wallet_ttl_seconds = max(1, int(cloud_wallet_ttl_seconds)) + self._fallback_price_adapter = fallback_price_adapter or PriceAdapter() + self._now_fn = now_fn or time.time + self._cloud_wallet_cached_price_usd: float | None = None + self._cloud_wallet_cached_at_epoch_s: float | None = None + self._last_good_price_usd: float | None = None + + async def get_xch_price(self) -> float: + if self._cloud_wallet_price_fn is not None: + try: + price = self._get_cloud_wallet_price() + self._last_good_price_usd = price + return price + except Exception: + pass + try: + price = await self._fallback_price_adapter.get_xch_price() + self._last_good_price_usd = price + return price + except Exception: + if self._last_good_price_usd is not None: + return self._last_good_price_usd + raise + + def _get_cloud_wallet_price(self) -> float: + now = float(self._now_fn()) + if ( + self._cloud_wallet_cached_price_usd is not None + and self._cloud_wallet_cached_at_epoch_s is not None + and (now - self._cloud_wallet_cached_at_epoch_s) <= self._cloud_wallet_ttl_seconds + ): + return self._cloud_wallet_cached_price_usd + if self._cloud_wallet_price_fn is None: + raise RuntimeError("cloud_wallet_price_not_configured") + value = float(self._cloud_wallet_price_fn()) + if value <= 0: + raise ValueError("cloud_wallet_quote_price_must_be_positive") + self._cloud_wallet_cached_price_usd = value + self._cloud_wallet_cached_at_epoch_s = now + return value diff --git a/greenfloor/cli/manager.py b/greenfloor/cli/manager.py index cb27f66..a59a270 100644 --- a/greenfloor/cli/manager.py +++ b/greenfloor/cli/manager.py @@ -1613,6 +1613,40 @@ def _coin_meets_coin_op_min_amount(coin: dict, *, canonical_asset_id: str) -> bo ) +def _coin_matches_direct_spendable_lookup( + *, + wallet: Any, + coin: dict, + scoped_asset_id: str, + cache: dict[str, bool] | None = None, +) -> bool: + get_coin_record = getattr(wallet, "get_coin_record", None) + if not callable(get_coin_record): + return True + coin_id = str(coin.get("id", "")).strip() + if not coin_id: + return False + if cache is not None and coin_id in cache: + return bool(cache[coin_id]) + try: + coin_record = get_coin_record(coin_id=coin_id) + except Exception: + result = False + else: + if not isinstance(coin_record, dict): + result = False + else: + result = ( + _is_spendable_coin(coin_record) + and not bool(coin_record.get("isLinkedToOpenOffer")) + and _coin_asset_id(coin_record).strip().lower() + == str(scoped_asset_id).strip().lower() + ) + if cache is not None: + cache[coin_id] = result + return result + + def _evaluate_denomination_readiness( *, wallet: CloudWalletAdapter, @@ -3375,11 +3409,18 @@ def _coin_combine( ) elif min_coin_amount_mojos > 0: asset_scoped_coins = wallet.list_coins(asset_id=resolved_asset_id, include_pending=True) + direct_lookup_cache: dict[str, bool] = {} eligible_asset_coins = [ c for c in asset_scoped_coins if _is_spendable_coin(c) and _coin_meets_coin_op_min_amount(c, canonical_asset_id=combine_canonical_asset_id) + and _coin_matches_direct_spendable_lookup( + wallet=wallet, + coin=c, + scoped_asset_id=resolved_asset_id, + cache=direct_lookup_cache, + ) and str(c.get("id", "")).strip() ] if len(eligible_asset_coins) < number_of_coins: diff --git a/greenfloor/cloud_wallet_offer_runtime.py b/greenfloor/cloud_wallet_offer_runtime.py index 4552213..ea65741 100644 --- a/greenfloor/cloud_wallet_offer_runtime.py +++ b/greenfloor/cloud_wallet_offer_runtime.py @@ -26,7 +26,6 @@ from greenfloor.signing import sign_and_broadcast_mixed_split from greenfloor.storage.sqlite import SqliteStore -_TEST_PHASE_OFFER_EXPIRY_MINUTES = 5 _MANAGER_SERVICE_NAME = "manager" _DEXIE_INVALID_OFFER_RETRY_MAX_ATTEMPTS = 4 _DEXIE_INVALID_OFFER_RETRY_INITIAL_DELAY_SECONDS = 1.0 @@ -1464,16 +1463,14 @@ def dexie_offer_view_url(*, dexie_base_url: str, offer_id: str) -> str: def resolve_offer_expiry_for_market(market: Any) -> tuple[str, int]: pricing = dict(getattr(market, "pricing", {}) or {}) - unit = str(pricing.get("strategy_offer_expiry_unit", "")).strip().lower() - value_raw = pricing.get("strategy_offer_expiry_value") - if unit in {"minutes", "hours"}: - try: - value = int(value_raw or 0) - except (TypeError, ValueError): - value = 0 - if value > 0: - return unit, value - return "minutes", _TEST_PHASE_OFFER_EXPIRY_MINUTES + value_raw = pricing.get("strategy_offer_expiry_minutes") + try: + value = int(value_raw or 0) + except (TypeError, ValueError): + value = 0 + if value > 0: + return "minutes", value + return "minutes", 10 def _bootstrap_fee_cost_for_output_count(output_count: int) -> int: diff --git a/greenfloor/config/models.py b/greenfloor/config/models.py index 214e044..9123846 100644 --- a/greenfloor/config/models.py +++ b/greenfloor/config/models.py @@ -1,5 +1,6 @@ from __future__ import annotations +import warnings from dataclasses import dataclass, field from typing import Any @@ -111,7 +112,11 @@ def _req(mapping: dict[str, Any], key: str) -> Any: def _validate_strategy_pricing( pricing: dict[str, Any], market_id: str, quote_asset_type: str | None = None ) -> None: - _ = quote_asset_type + quote_type = str(quote_asset_type or "").strip().lower() + for legacy_field in ("reference_source", "reference_pair"): + if pricing.get(legacy_field) is not None: + raise ValueError(f"market {market_id}: {legacy_field} is no longer supported") + spread_raw = pricing.get("strategy_target_spread_bps") if spread_raw is not None: try: @@ -150,32 +155,40 @@ def _validate_strategy_pricing( f"market {market_id}: strategy_min_xch_price_usd must be <= strategy_max_xch_price_usd" ) - expiry_unit_raw = pricing.get("strategy_offer_expiry_unit") - expiry_value_raw = pricing.get("strategy_offer_expiry_value") - expiry_unit = str(expiry_unit_raw).strip().lower() if expiry_unit_raw is not None else None - has_expiry_unit = bool(expiry_unit) - has_expiry_value = expiry_value_raw is not None - if has_expiry_unit != has_expiry_value: + if ( + pricing.get("strategy_offer_expiry_unit") is not None + or pricing.get("strategy_offer_expiry_value") is not None + ): raise ValueError( - f"market {market_id}: strategy_offer_expiry_unit and strategy_offer_expiry_value must be set together" + f"market {market_id}: strategy_offer_expiry_unit/value are no longer supported; use strategy_offer_expiry_minutes" ) - if has_expiry_unit: - if expiry_unit not in {"minutes", "hours"}: - raise ValueError( - f"market {market_id}: strategy_offer_expiry_unit must be one of: minutes, hours" - ) - if expiry_value_raw is None: + + expiry_minutes_raw = pricing.get("strategy_offer_expiry_minutes") + if expiry_minutes_raw is not None: + try: + expiry_minutes = int(expiry_minutes_raw) + except (TypeError, ValueError) as exc: raise ValueError( - f"market {market_id}: strategy_offer_expiry_unit and strategy_offer_expiry_value must be set together" + f"market {market_id}: strategy_offer_expiry_minutes must be an integer" + ) from exc + if expiry_minutes <= 0: + raise ValueError(f"market {market_id}: strategy_offer_expiry_minutes must be positive") + if quote_type == "unstable" and expiry_minutes > 15: + warnings.warn( + f"market {market_id}: unstable strategy_offer_expiry_minutes={expiry_minutes} exceeds 15 minutes", + stacklevel=2, ) + + threshold_raw = pricing.get("cancel_move_threshold_bps") + if threshold_raw is not None: try: - expiry_value = int(expiry_value_raw) + threshold = int(threshold_raw) except (TypeError, ValueError) as exc: raise ValueError( - f"market {market_id}: strategy_offer_expiry_value must be an integer" + f"market {market_id}: cancel_move_threshold_bps must be an integer" ) from exc - if expiry_value <= 0: - raise ValueError(f"market {market_id}: strategy_offer_expiry_value must be positive") + if threshold <= 0: + raise ValueError(f"market {market_id}: cancel_move_threshold_bps must be positive") def _uses_cat_units(asset_id: str) -> bool: diff --git a/greenfloor/core/strategy.py b/greenfloor/core/strategy.py index 0b11657..e029ffd 100644 --- a/greenfloor/core/strategy.py +++ b/greenfloor/core/strategy.py @@ -21,8 +21,7 @@ class StrategyConfig: target_spread_bps: int | None = None min_xch_price_usd: float | None = None max_xch_price_usd: float | None = None - offer_expiry_unit: str | None = None - offer_expiry_value: int | None = None + offer_expiry_minutes: int | None = None @dataclass(frozen=True, slots=True) @@ -38,10 +37,7 @@ class PlannedAction: side: str = "sell" -_PAIR_EXPIRY_CONFIG: dict[str, tuple[str, int]] = { - "xch": ("minutes", 10), - "usdc": ("minutes", 10), -} +_DEFAULT_OFFER_EXPIRY_MINUTES = 10 def evaluate_market( @@ -60,14 +56,11 @@ def evaluate_market( return [] if config.max_xch_price_usd is not None and state.xch_price_usd > config.max_xch_price_usd: return [] - expiry_unit, expiry_value = _PAIR_EXPIRY_CONFIG.get(pair, _PAIR_EXPIRY_CONFIG["xch"]) - configured_expiry_unit = str(config.offer_expiry_unit or "").strip().lower() - configured_expiry_value = ( - int(config.offer_expiry_value) if config.offer_expiry_value is not None else None + expiry_minutes = ( + int(config.offer_expiry_minutes) + if config.offer_expiry_minutes is not None and int(config.offer_expiry_minutes) > 0 + else _DEFAULT_OFFER_EXPIRY_MINUTES ) - if configured_expiry_unit in {"minutes", "hours"} and configured_expiry_value is not None: - if configured_expiry_value > 0: - expiry_unit, expiry_value = configured_expiry_unit, configured_expiry_value offer_configs = [ (1, state.ones, config.ones_target), @@ -84,8 +77,8 @@ def evaluate_market( repeat=target - current, side="sell", pair=pair, - expiry_unit=expiry_unit, - expiry_value=expiry_value, + expiry_unit="minutes", + expiry_value=expiry_minutes, cancel_after_create=True, reason="below_target", target_spread_bps=config.target_spread_bps, diff --git a/greenfloor/daemon/main.py b/greenfloor/daemon/main.py index 5abe278..98f591e 100644 --- a/greenfloor/daemon/main.py +++ b/greenfloor/daemon/main.py @@ -26,7 +26,7 @@ extract_coinset_tx_ids_from_offer_payload, ) from greenfloor.adapters.dexie import DexieAdapter -from greenfloor.adapters.price import PriceAdapter +from greenfloor.adapters.price import PriceAdapter, XchPriceProvider from greenfloor.adapters.splash import SplashAdapter from greenfloor.adapters.wallet import WalletAdapter from greenfloor.cloud_wallet_offer_runtime import ( @@ -238,6 +238,10 @@ def _warn_if_log_level_auto_healed(*, program, program_path: Path) -> None: ) +def _log_daemon_event(*, level: int, payload: dict[str, Any]) -> None: + _daemon_logger.log(level, "daemon_event %s", json.dumps(payload, sort_keys=True)) + + def _consume_reload_marker(state_dir: Path) -> bool: marker = state_dir / "reload_request.json" if not marker.exists(): @@ -291,7 +295,16 @@ def _resolve_db_path(program_home_dir: str, explicit_db_path: str | None) -> Pat return (Path(program_home_dir).expanduser() / "db" / "greenfloor.sqlite").resolve() -def _cancel_move_threshold_bps() -> int: +def _cancel_move_threshold_bps(*, market: Any | None = None) -> int: + pricing = dict(getattr(market, "pricing", {}) or {}) if market is not None else {} + threshold_raw = pricing.get("cancel_move_threshold_bps") + if threshold_raw is not None: + try: + parsed_threshold = int(threshold_raw) + except (TypeError, ValueError): + parsed_threshold = 0 + if parsed_threshold > 0: + return parsed_threshold raw = os.getenv("GREENFLOOR_UNSTABLE_CANCEL_MOVE_BPS", "").strip() if not raw: return _DEFAULT_CANCEL_MOVE_THRESHOLD_BPS @@ -508,9 +521,7 @@ def _to_float(value: Any) -> float | None: target_spread_bps=_to_int(pricing.get("strategy_target_spread_bps")), min_xch_price_usd=_to_float(pricing.get("strategy_min_xch_price_usd")), max_xch_price_usd=_to_float(pricing.get("strategy_max_xch_price_usd")), - offer_expiry_unit=str(pricing.get("strategy_offer_expiry_unit", "")).strip().lower() - or None, - offer_expiry_value=_to_int(pricing.get("strategy_offer_expiry_value")), + offer_expiry_minutes=_to_int(pricing.get("strategy_offer_expiry_minutes")), ) @@ -520,22 +531,20 @@ def _strategy_config_for_side(*, market: Any, side: str) -> StrategyConfig: targets_by_size = {int(e.size_base_units): int(e.target_count) for e in side_ladder} pricing = _market_pricing(market) - expiry_value_raw = pricing.get("strategy_offer_expiry_value") - expiry_value: int | None = None - if expiry_value_raw is not None: + expiry_minutes_raw = pricing.get("strategy_offer_expiry_minutes") + expiry_minutes: int | None = None + if expiry_minutes_raw is not None: try: - expiry_value = int(expiry_value_raw) + expiry_minutes = int(expiry_minutes_raw) except (TypeError, ValueError): - expiry_value = None + expiry_minutes = None return StrategyConfig( pair=_normalize_strategy_pair(market.quote_asset), ones_target=int(targets_by_size.get(1, 0)), tens_target=int(targets_by_size.get(10, 0)), hundreds_target=int(targets_by_size.get(100, 0)), - offer_expiry_unit=str(pricing.get("strategy_offer_expiry_unit", "")).strip().lower() - or None, - offer_expiry_value=expiry_value, + offer_expiry_minutes=expiry_minutes, ) @@ -552,6 +561,60 @@ def _strategy_state_from_bucket_counts( ) +def _effective_sell_bucket_counts_for_coin_ops( + *, + sell_ladder: list[Any], + wallet_bucket_counts: dict[int, int], + active_sell_offer_counts_by_size: dict[int, int] | None, + newly_executed_sell_offer_counts_by_size: dict[int, int] | None = None, +) -> dict[int, int]: + effective_counts = dict(wallet_bucket_counts) + active_sell_counts = active_sell_offer_counts_by_size or {} + newly_executed_sell_counts = newly_executed_sell_offer_counts_by_size or {} + for entry in sell_ladder: + size_base_units = int(getattr(entry, "size_base_units", 0)) + if size_base_units <= 0: + continue + target_count = max(0, int(getattr(entry, "target_count", 0))) + newly_executed_sell_count = max(0, int(newly_executed_sell_counts.get(size_base_units, 0))) + wallet_count = max( + 0, + int(wallet_bucket_counts.get(size_base_units, 0)) - newly_executed_sell_count, + ) + active_sell_count = max(0, int(active_sell_counts.get(size_base_units, 0))) + effective_active_sell_count = active_sell_count + newly_executed_sell_count + # Count live sell offers toward the market target, but not toward the + # split buffer. That preserves at most one extra ready coin above the + # active sell ladder coverage. + effective_counts[size_base_units] = wallet_count + min( + effective_active_sell_count, + target_count, + ) + return effective_counts + + +def _executed_sell_offer_counts_by_size(offer_execution: dict[str, Any]) -> dict[int, int]: + counts: dict[int, int] = {} + items = offer_execution.get("items", []) + if not isinstance(items, list): + return counts + for item in items: + if not isinstance(item, dict): + continue + if str(item.get("status", "")).strip().lower() != "executed": + continue + if _normalize_offer_side(item.get("side", "sell")) != "sell": + continue + try: + size = int(item.get("size", 0)) + except (TypeError, ValueError): + continue + if size <= 0: + continue + counts[size] = counts.get(size, 0) + 1 + return counts + + def _evaluate_two_sided_market_actions( *, market: Any, @@ -777,6 +840,11 @@ def _match_watched_coin_ids(*, observed_coin_ids: list[str]) -> dict[str, list[s return matches +def _watched_coin_ids_for_market(*, market_id: str) -> set[str]: + with _WATCHED_COIN_IDS_LOCK: + return set(_WATCHED_COIN_IDS_BY_MARKET.get(market_id, set())) + + def _update_market_coin_watchlist_from_dexie( *, market, @@ -2024,7 +2092,7 @@ def _execute_cancel_policy_for_market( quote_type = str(market.quote_asset_type).strip().lower() pricing = _market_pricing(market) stable_vs_unstable = bool(pricing.get("cancel_policy_stable_vs_unstable", False)) - threshold_bps = _cancel_move_threshold_bps() + threshold_bps = _cancel_move_threshold_bps(market=market) if quote_type != "unstable": return { "eligible": False, @@ -2325,7 +2393,7 @@ def _evaluate_and_execute_strategy( dexie_size_by_offer_id: dict[str, int], result: _MarketCycleResult, reservation_coordinator: AssetReservationCoordinator | None = None, -) -> None: +) -> tuple[dict[str, dict[int, int]], dict[int, int]]: """Evaluate market strategy, inject reseed if needed, and execute offer actions.""" market_mode = str(getattr(market, "mode", "")).strip().lower() strategy_config = _strategy_config_from_market(market) @@ -2461,6 +2529,7 @@ def _evaluate_and_execute_strategy( }, market_id=market.market_id, ) + return offer_counts_by_side, _executed_sell_offer_counts_by_size(offer_execution) def _plan_and_execute_coin_ops( @@ -2470,11 +2539,19 @@ def _plan_and_execute_coin_ops( wallet: WalletAdapter, store: SqliteStore, sell_ladder: list[Any], - bucket_counts: dict[int, int], + wallet_bucket_counts: dict[int, int], + active_sell_offer_counts_by_size: dict[int, int] | None, + newly_executed_sell_offer_counts_by_size: dict[int, int] | None, signer_selection: Any, state_dir: Path, ) -> None: """Plan and execute coin split/combine operations for a market.""" + bucket_counts = _effective_sell_bucket_counts_for_coin_ops( + sell_ladder=sell_ladder, + wallet_bucket_counts=wallet_bucket_counts, + active_sell_offer_counts_by_size=active_sell_offer_counts_by_size, + newly_executed_sell_offer_counts_by_size=newly_executed_sell_offer_counts_by_size, + ) buckets = [ BucketSpec( size_base_units=e.size_base_units, @@ -2770,6 +2847,21 @@ def _spendable_asset_scoped_coins(coins: list[dict[str, Any]]) -> list[dict[str, try: if op_type == "split": + if op_count == 1: + # A one-output split only manufactures bookkeeping churn. + # Let the market continue rather than creating a cosmetic + # "split 1 coin into 1 coin" transaction. + items.append( + { + "op_type": op_type, + "size_base_units": size_base_units, + "op_count": op_count, + "status": "skipped", + "reason": "split_single_coin_noop_skipped", + "operation_id": None, + } + ) + continue amount_per_coin_mojos = size_base_units * base_unit_mojo_multiplier required_amount = amount_per_coin_mojos * op_count coins = cloud_wallet.list_coins( @@ -3008,13 +3100,45 @@ def _spendable_asset_scoped_coins(coins: list[dict[str, Any]]) -> list[dict[str, if op_type == "combine": requested_number_of_coins = max(2, op_count) capped_number_of_coins = min(requested_number_of_coins, combine_input_cap) + target_coin_amount_mojos = size_base_units * base_unit_mojo_multiplier + watched_coin_ids = _watched_coin_ids_for_market( + market_id=str(getattr(market, "market_id", "")).strip() + ) + exact_bucket_coin_ids: list[str] = [] + for coin in _spendable_asset_scoped_coins( + cloud_wallet.list_coins(asset_id=resolved_base_asset_id, include_pending=True) + ): + coin_id = str(coin.get("id", "")).strip() + if not coin_id or coin_id.lower() in watched_coin_ids: + continue + try: + amount_mojos = int(coin.get("amount", 0)) + except (TypeError, ValueError): + continue + if amount_mojos != target_coin_amount_mojos: + continue + exact_bucket_coin_ids.append(coin_id) + combine_input_coin_ids = exact_bucket_coin_ids[:capped_number_of_coins] + if len(combine_input_coin_ids) < 2: + items.append( + { + "op_type": op_type, + "size_base_units": size_base_units, + "op_count": op_count, + "status": "skipped", + "reason": "no_spendable_combine_coin_available", + "operation_id": None, + } + ) + continue result = _combine_coins_with_retry( cloud_wallet=cloud_wallet, combine_kwargs={ - "number_of_coins": capped_number_of_coins, + "number_of_coins": len(combine_input_coin_ids), "fee": int(program.coin_ops_combine_fee_mojos), "asset_id": resolved_base_asset_id, "largest_first": True, + "input_coin_ids": combine_input_coin_ids, }, ) signature_request_id = str(result.get("signature_request_id", "")).strip() @@ -3040,11 +3164,12 @@ def _spendable_asset_scoped_coins(coins: list[dict[str, Any]]) -> list[dict[str, "operation_id": signature_request_id, "data": { "requested_number_of_coins": int(requested_number_of_coins), - "submitted_number_of_coins": int(capped_number_of_coins), + "submitted_number_of_coins": int(len(combine_input_coin_ids)), "input_coin_cap_applied": bool( capped_number_of_coins < requested_number_of_coins ), "input_coin_cap": int(combine_input_cap), + "input_coin_ids": combine_input_coin_ids, }, } ) @@ -3157,7 +3282,7 @@ def _process_single_market( "receive_address": event.receive_address, "reason": event.reason, } - print(json.dumps(payload)) + _log_daemon_event(level=logging.INFO, payload=payload) store.add_audit_event("low_inventory_alert", payload, market_id=market.market_id) send_pushover_alert(program, event) @@ -3304,7 +3429,7 @@ def _process_single_market( }, market_id=market.market_id, ) - _evaluate_and_execute_strategy( + offer_counts_by_side, newly_executed_sell_offer_counts_by_size = _evaluate_and_execute_strategy( market=market, program=program, dexie=dexie, @@ -3322,7 +3447,9 @@ def _process_single_market( wallet=wallet, store=store, sell_ladder=sell_ladder, - bucket_counts=bucket_counts, + wallet_bucket_counts=bucket_counts, + active_sell_offer_counts_by_size=offer_counts_by_side.get("sell", {}), + newly_executed_sell_offer_counts_by_size=newly_executed_sell_offer_counts_by_size, signer_selection=signer_selection, state_dir=state_dir, ) @@ -3410,7 +3537,22 @@ def run_once( dexie = DexieAdapter(program.dexie_api_base) splash = SplashAdapter(program.splash_api_base) wallet = WalletAdapter() - price = PriceAdapter() + cloud_wallet_price_fn = None + if _cloud_wallet_configured(program): + try: + cloud_wallet_price_fn = _new_cloud_wallet_adapter_for_daemon( + program + ).get_chia_usd_quote + except Exception as exc: + store.add_audit_event( + "xch_price_provider_init_error", + {"provider": "cloud_wallet_quote", "error": str(exc)}, + ) + price = XchPriceProvider( + cloud_wallet_price_fn=cloud_wallet_price_fn, + cloud_wallet_ttl_seconds=120, + fallback_price_adapter=PriceAdapter(), + ) previous_xch_price_usd = store.get_latest_xch_price_snapshot() reservation_coordinator: AssetReservationCoordinator | None = None if bool( @@ -3704,7 +3846,7 @@ def _write(store: SqliteStore) -> None: program=current_program, ) if _consume_reload_marker(state_dir): - print(json.dumps({"event": "config_reloaded"})) + _log_daemon_event(level=logging.INFO, payload={"event": "config_reloaded"}) time.sleep(max(1, current_program.runtime_loop_interval_seconds)) current_program = load_program_config(program_path) except KeyboardInterrupt: @@ -3809,7 +3951,18 @@ def _default_testnet_markets_config_path() -> str: state_dir=state_dir, ) except RuntimeError as exc: - print(json.dumps({"event": "daemon_lock_conflict", "error": str(exc)})) + try: + program = load_program_config(Path(args.program_config)) + _initialize_daemon_file_logging( + program.home_dir, log_level=getattr(program, "app_log_level", "INFO") + ) + _warn_if_log_level_auto_healed(program=program, program_path=Path(args.program_config)) + except Exception: + pass + _log_daemon_event( + level=logging.ERROR, + payload={"event": "daemon_lock_conflict", "error": str(exc)}, + ) raise SystemExit(3) from exc raise SystemExit(exit_code) diff --git a/greenfloor/logging_setup.py b/greenfloor/logging_setup.py index 27f6b4e..93c8455 100644 --- a/greenfloor/logging_setup.py +++ b/greenfloor/logging_setup.py @@ -73,6 +73,8 @@ def apply_level_to_root( # --------------------------------------------------------------------------- _initialized_services: dict[str, ConcurrentRotatingFileHandler] = {} +_active_handler: ConcurrentRotatingFileHandler | None = None +_active_service_name: str | None = None def initialize_service_file_logging( @@ -93,13 +95,19 @@ def initialize_service_file_logging( Returns the handler (or *None* if a handler already exists and *allow_reinit_level* is False). """ + global _active_handler, _active_service_name effective_level = coerce_log_level(log_level) - handler = _initialized_services.get(service_name) + known_handler = _initialized_services.get(service_name) + if known_handler is not None and not allow_reinit_level: + return known_handler + handler = _active_handler if handler is None: handler = create_rotating_file_handler(service_name=service_name, home_dir=home_dir) logging.getLogger().addHandler(handler) - _initialized_services[service_name] = handler - elif not allow_reinit_level: + _active_handler = handler + _active_service_name = service_name + _initialized_services[service_name] = handler + if not allow_reinit_level and known_handler is None and _active_service_name != service_name: return handler apply_level_to_root(effective_level=effective_level, logger=service_logger, handler=handler) return handler diff --git a/tests/logging_helpers.py b/tests/logging_helpers.py index 715662b..0b1668a 100644 --- a/tests/logging_helpers.py +++ b/tests/logging_helpers.py @@ -20,3 +20,5 @@ def reset_concurrent_log_handlers(*, module) -> None: module._daemon_file_log_handler = None # Reset the shared logging_setup registry so handlers are re-created. _logging_setup._initialized_services.clear() + _logging_setup._active_handler = None + _logging_setup._active_service_name = None diff --git a/tests/test_cloud_wallet_adapter.py b/tests/test_cloud_wallet_adapter.py index a9646ee..0323b09 100644 --- a/tests/test_cloud_wallet_adapter.py +++ b/tests/test_cloud_wallet_adapter.py @@ -182,6 +182,31 @@ def _fake_graphql(*, query, variables): assert "asset {" in queries[0] +def test_cloud_wallet_get_chia_usd_quote_reads_numeric_price(monkeypatch, tmp_path: Path) -> None: + adapter = _build_adapter(tmp_path) + monkeypatch.setattr( + adapter, + "_graphql", + lambda *, query, variables: { # noqa: ARG005 + "quote": { + "price": "31.42", + "baseAsset": "chia", + "currency": "usd", + "source": "coingecko.com", + "createdAt": "2026-03-10T12:00:00Z", + } + }, + ) + assert adapter.get_chia_usd_quote() == 31.42 + + +def test_cloud_wallet_get_chia_usd_quote_rejects_missing_quote(monkeypatch, tmp_path: Path) -> None: + adapter = _build_adapter(tmp_path) + monkeypatch.setattr(adapter, "_graphql", lambda *, query, variables: {"quote": None}) # noqa: ARG005 + with pytest.raises(RuntimeError, match="cloud_wallet_missing_quote"): + adapter.get_chia_usd_quote() + + def test_cloud_wallet_graphql_http_error_contains_status_and_snippet( monkeypatch, tmp_path: Path ) -> None: @@ -451,6 +476,25 @@ def _fake_urlopen(req, timeout=0): assert variables["first"] == 25 # type: ignore[index] +def test_cloud_wallet_get_wallet_clamps_first_to_cloud_wallet_max( + monkeypatch, tmp_path: Path +) -> None: + adapter = _build_adapter(tmp_path) + monkeypatch.setattr(adapter, "_build_auth_headers", lambda _body: {}) + captured: dict[str, object] = {} + + def _fake_urlopen(req, timeout=0): + _ = timeout + captured["body"] = json.loads(req.data.decode("utf-8")) + return _FakeHttpResponse({"data": {"wallet": {"offers": {"edges": []}}}}) + + monkeypatch.setattr("urllib.request.urlopen", _fake_urlopen) + payload = adapter.get_wallet(is_creator=True, states=["OPEN"], first=120) + assert payload == {"offers": []} + variables = captured["body"]["variables"] # type: ignore[index] + assert variables["first"] == 100 # type: ignore[index] + + # --------------------------------------------------------------------------- # split_coins / combine_coins # --------------------------------------------------------------------------- diff --git a/tests/test_config_models.py b/tests/test_config_models.py index 24aa85f..a78ba4e 100644 --- a/tests/test_config_models.py +++ b/tests/test_config_models.py @@ -109,35 +109,64 @@ def test_parse_markets_config_accepts_valid_strategy_controls() -> None: assert out.markets[0].pricing["strategy_target_spread_bps"] == 120 -def test_parse_markets_config_rejects_partial_strategy_expiry_override() -> None: +def test_parse_markets_config_rejects_legacy_strategy_expiry_fields() -> None: row = _base_market_row() - row["pricing"] = {"strategy_offer_expiry_unit": "hours"} + row["pricing"] = {"strategy_offer_expiry_unit": "hours", "strategy_offer_expiry_value": 2} with pytest.raises( ValueError, - match="strategy_offer_expiry_unit and strategy_offer_expiry_value must be set together", + match="strategy_offer_expiry_unit/value are no longer supported", ): parse_markets_config({"markets": [row]}) -def test_parse_markets_config_rejects_invalid_strategy_expiry_unit() -> None: +def test_parse_markets_config_rejects_invalid_strategy_expiry_minutes_type() -> None: row = _base_market_row() row["pricing"] = { - "strategy_offer_expiry_unit": "days", - "strategy_offer_expiry_value": 1, + "strategy_offer_expiry_minutes": "abc", } - with pytest.raises(ValueError, match="strategy_offer_expiry_unit must be one of"): + with pytest.raises(ValueError, match="strategy_offer_expiry_minutes must be an integer"): parse_markets_config({"markets": [row]}) def test_parse_markets_config_accepts_strategy_expiry_override() -> None: row = _base_market_row() + row["quote_asset_type"] = "stable" row["pricing"] = { - "strategy_offer_expiry_unit": "hours", - "strategy_offer_expiry_value": 2, + "strategy_offer_expiry_minutes": 120, } out = parse_markets_config({"markets": [row]}) - assert out.markets[0].pricing["strategy_offer_expiry_unit"] == "hours" - assert out.markets[0].pricing["strategy_offer_expiry_value"] == 2 + assert out.markets[0].pricing["strategy_offer_expiry_minutes"] == 120 + + +def test_parse_markets_config_warns_when_unstable_expiry_above_15_minutes() -> None: + row = _base_market_row() + row["pricing"] = {"strategy_offer_expiry_minutes": 30} + with pytest.warns(UserWarning, match="exceeds 15 minutes"): + parse_markets_config({"markets": [row]}) + + +def test_parse_markets_config_rejects_legacy_reference_fields() -> None: + row = _base_market_row() + row["pricing"] = { + "reference_source": "coingecko", + "reference_pair": "xch_usd", + } + with pytest.raises(ValueError, match="reference_source is no longer supported"): + parse_markets_config({"markets": [row]}) + + +def test_parse_markets_config_rejects_invalid_cancel_move_threshold_bps() -> None: + row = _base_market_row() + row["pricing"] = {"cancel_move_threshold_bps": 0} + with pytest.raises(ValueError, match="cancel_move_threshold_bps must be positive"): + parse_markets_config({"markets": [row]}) + + +def test_parse_markets_config_accepts_cancel_move_threshold_bps() -> None: + row = _base_market_row() + row["pricing"] = {"cancel_move_threshold_bps": 250} + out = parse_markets_config({"markets": [row]}) + assert out.markets[0].pricing["cancel_move_threshold_bps"] == 250 def test_parse_markets_config_stable_quote_validates_present_strategy_fields() -> None: diff --git a/tests/test_daemon_cancel_policy.py b/tests/test_daemon_cancel_policy.py index 0a1c4ce..5f9a60a 100644 --- a/tests/test_daemon_cancel_policy.py +++ b/tests/test_daemon_cancel_policy.py @@ -87,6 +87,26 @@ def test_cancel_policy_requires_strong_price_move() -> None: assert out["reason"] == "price_move_below_threshold" +def test_cancel_policy_uses_market_specific_threshold_when_present() -> None: + import greenfloor.daemon.main as daemon_main + + daemon_main._CANCEL_COOLDOWN_UNTIL.clear() + market = _market("unstable", stable_vs_unstable=True) + market.pricing["cancel_move_threshold_bps"] = 100 + out = _execute_cancel_policy_for_market( + market=market, + offers=[{"id": "o1", "status": 0}], + runtime_dry_run=True, + current_xch_price_usd=30.6, + previous_xch_price_usd=30.0, + dexie=cast(Any, _FakeDexie({"success": True})), + store=cast(Any, _FakeStore()), + ) + assert out["eligible"] is True + assert out["triggered"] is True + assert out["threshold_bps"] == 100 + + def test_cancel_policy_dry_run_marks_planned_only() -> None: import greenfloor.daemon.main as daemon_main diff --git a/tests/test_daemon_offer_execution.py b/tests/test_daemon_offer_execution.py index fbf7c78..5e6831f 100644 --- a/tests/test_daemon_offer_execution.py +++ b/tests/test_daemon_offer_execution.py @@ -2349,6 +2349,55 @@ def combine_coins( ) +def test_execute_coin_ops_cloud_wallet_kms_only_skips_single_output_split( + monkeypatch, +) -> None: + class _Program: + runtime_dry_run = False + app_network = "mainnet" + cloud_wallet_base_url = "https://wallet.example" + cloud_wallet_user_key_id = "user-key" + cloud_wallet_private_key_pem_path = "/tmp/key.pem" + cloud_wallet_vault_id = "vault-1" + cloud_wallet_kms_key_id = "kms-key" + coin_ops_split_fee_mojos = 0 + coin_ops_combine_fee_mojos = 0 + + class _Signer: + key_id = "key-main-2" + + class _FakeCloudWallet: + def split_coins(self, *, coin_ids, amount_per_coin, number_of_coins, fee): + raise AssertionError("single-output split should be skipped") + + fake = _FakeCloudWallet() + monkeypatch.setattr( + daemon_main, + "_new_cloud_wallet_adapter_for_daemon", + lambda _program: fake, + ) + monkeypatch.setattr( + daemon_main, + "_resolve_cloud_wallet_offer_asset_ids_for_reservation", + lambda **_kwargs: ("Asset_byc", "Asset_usdc", "Asset_xch"), + ) + + from greenfloor.core.coin_ops import CoinOpPlan + + result = _execute_coin_ops_cloud_wallet_kms_only( + market=_market(), + program=_Program(), + plans=[CoinOpPlan(op_type="split", size_base_units=10, op_count=1, reason="r")], + wallet=cast(Any, object()), + signer_selection=_Signer(), + state_dir=Path("/tmp"), + ) + + assert result["executed_count"] == 0 + assert result["items"][0]["status"] == "skipped" + assert result["items"][0]["reason"] == "split_single_coin_noop_skipped" + + def test_execute_coin_ops_cloud_wallet_kms_only_combine_retries_on_429( monkeypatch, ) -> None: @@ -2373,6 +2422,13 @@ class _FakeCloudWallet: def __init__(self) -> None: self.combine_calls = 0 + def list_coins(self, *, asset_id: str | None = None, include_pending: bool = True): + _ = asset_id, include_pending + return [ + {"id": "c1", "amount": 10_000, "state": "SETTLED", "asset": {"id": "Asset_byc"}}, + {"id": "c2", "amount": 10_000, "state": "SETTLED", "asset": {"id": "Asset_byc"}}, + ] + def combine_coins(self, **_kwargs): self.combine_calls += 1 if self.combine_calls < 3: @@ -2430,9 +2486,23 @@ class _Signer: class _FakeCloudWallet: def __init__(self) -> None: self.last_number_of_coins: int | None = None + self.last_input_coin_ids: list[str] | None = None + + def list_coins(self, *, asset_id: str | None = None, include_pending: bool = True): + _ = asset_id, include_pending + return [ + { + "id": f"coin-{idx}", + "amount": 10_000, + "state": "SETTLED", + "asset": {"id": "Asset_byc"}, + } + for idx in range(12) + ] def combine_coins(self, **kwargs): self.last_number_of_coins = int(kwargs.get("number_of_coins", 0)) + self.last_input_coin_ids = list(kwargs.get("input_coin_ids", [])) return {"signature_request_id": "sig-combine-cap", "status": "SUBMITTED"} fake = _FakeCloudWallet() @@ -2459,8 +2529,78 @@ def combine_coins(self, **kwargs): ) assert fake.last_number_of_coins == 7 + assert fake.last_input_coin_ids == [f"coin-{idx}" for idx in range(7)] assert result["executed_count"] == 1 assert result["items"][0]["status"] == "executed" assert result["items"][0]["data"]["requested_number_of_coins"] == 100 assert result["items"][0]["data"]["submitted_number_of_coins"] == 7 assert result["items"][0]["data"]["input_coin_cap_applied"] is True + + +def test_execute_coin_ops_cloud_wallet_kms_only_combine_excludes_watched_coin_ids( + monkeypatch, +) -> None: + class _Program: + runtime_dry_run = False + app_network = "mainnet" + cloud_wallet_base_url = "https://wallet.example" + cloud_wallet_user_key_id = "user-key" + cloud_wallet_private_key_pem_path = "/tmp/key.pem" + cloud_wallet_vault_id = "vault-1" + cloud_wallet_kms_key_id = "kms-key" + coin_ops_split_fee_mojos = 0 + coin_ops_combine_fee_mojos = 0 + + class _Signer: + key_id = "key-main-2" + + class _FakeCloudWallet: + def __init__(self) -> None: + self.last_input_coin_ids: list[str] | None = None + + def list_coins(self, *, asset_id: str | None = None, include_pending: bool = True): + _ = asset_id, include_pending + return [ + { + "id": "watched", + "amount": 1_000, + "state": "SETTLED", + "asset": {"id": "Asset_byc"}, + }, + {"id": "free-1", "amount": 1_000, "state": "SETTLED", "asset": {"id": "Asset_byc"}}, + {"id": "free-2", "amount": 1_000, "state": "SETTLED", "asset": {"id": "Asset_byc"}}, + ] + + def combine_coins(self, **kwargs): + self.last_input_coin_ids = list(kwargs.get("input_coin_ids", [])) + return {"signature_request_id": "sig-combine-safe", "status": "SUBMITTED"} + + fake = _FakeCloudWallet() + monkeypatch.setattr( + daemon_main, + "_new_cloud_wallet_adapter_for_daemon", + lambda _program: fake, + ) + monkeypatch.setattr( + daemon_main, + "_resolve_cloud_wallet_offer_asset_ids_for_reservation", + lambda **_kwargs: ("Asset_byc", "Asset_usdc", "Asset_xch"), + ) + + market = _market() + daemon_main._set_watched_coin_ids_for_market(market_id=market.market_id, coin_ids={"watched"}) + + from greenfloor.core.coin_ops import CoinOpPlan + + result = _execute_coin_ops_cloud_wallet_kms_only( + market=market, + program=_Program(), + plans=[CoinOpPlan(op_type="combine", size_base_units=1, op_count=2, reason="r")], + wallet=cast(Any, object()), + signer_selection=_Signer(), + state_dir=Path("/tmp"), + ) + + assert fake.last_input_coin_ids == ["free-1", "free-2"] + assert result["executed_count"] == 1 + daemon_main._set_watched_coin_ids_for_market(market_id=market.market_id, coin_ids=set()) diff --git a/tests/test_daemon_strategy_integration.py b/tests/test_daemon_strategy_integration.py index 00e4f84..64315cc 100644 --- a/tests/test_daemon_strategy_integration.py +++ b/tests/test_daemon_strategy_integration.py @@ -4,7 +4,9 @@ from greenfloor.config.models import MarketConfig, MarketInventoryConfig, MarketLadderEntry from greenfloor.daemon.main import ( + _effective_sell_bucket_counts_for_coin_ops, _evaluate_two_sided_market_actions, + _executed_sell_offer_counts_by_size, _normalize_strategy_pair, _strategy_config_from_market, _strategy_state_from_bucket_counts, @@ -86,6 +88,104 @@ def test_strategy_state_from_bucket_counts_includes_xch_price() -> None: assert state.xch_price_usd == 32.5 +def test_effective_sell_bucket_counts_for_coin_ops_counts_live_sells_toward_target_only() -> None: + market = _market_with_quote("wUSDC.b") + market.mode = "two_sided" + market.quote_asset_type = "stable" + market.ladders = { + "buy": [ + MarketLadderEntry( + size_base_units=10, + target_count=1, + split_buffer_count=1, + combine_when_excess_factor=2.0, + ) + ], + "sell": [ + MarketLadderEntry( + size_base_units=10, + target_count=3, + split_buffer_count=1, + combine_when_excess_factor=2.0, + ) + ], + } + effective = _effective_sell_bucket_counts_for_coin_ops( + sell_ladder=market.ladders["sell"], + wallet_bucket_counts={10: 0}, + active_sell_offer_counts_by_size={10: 3}, + ) + assert effective[10] == 3 + + +def test_effective_sell_bucket_counts_for_coin_ops_caps_live_sell_credit_at_target() -> None: + market = _market_with_quote("wUSDC.b") + market.mode = "two_sided" + market.quote_asset_type = "stable" + market.ladders = { + "buy": [ + MarketLadderEntry( + size_base_units=10, + target_count=1, + split_buffer_count=1, + combine_when_excess_factor=2.0, + ) + ], + "sell": [ + MarketLadderEntry( + size_base_units=10, + target_count=3, + split_buffer_count=1, + combine_when_excess_factor=2.0, + ) + ], + } + effective = _effective_sell_bucket_counts_for_coin_ops( + sell_ladder=market.ladders["sell"], + wallet_bucket_counts={10: 0}, + active_sell_offer_counts_by_size={10: 4}, + ) + assert effective[10] == 3 + + +def test_effective_sell_bucket_counts_for_coin_ops_accounts_for_new_sell_posts_in_cycle() -> None: + market = _market_with_quote("wUSDC.b") + market.mode = "sell_only" + market.quote_asset_type = "stable" + market.ladders = { + "sell": [ + MarketLadderEntry( + size_base_units=10, + target_count=2, + split_buffer_count=1, + combine_when_excess_factor=2.0, + ) + ] + } + effective = _effective_sell_bucket_counts_for_coin_ops( + sell_ladder=market.ladders["sell"], + wallet_bucket_counts={10: 2}, + active_sell_offer_counts_by_size={10: 0}, + newly_executed_sell_offer_counts_by_size={10: 2}, + ) + assert effective[10] == 2 + + +def test_executed_sell_offer_counts_by_size_counts_only_executed_sell_items() -> None: + counts = _executed_sell_offer_counts_by_size( + { + "items": [ + {"status": "executed", "side": "sell", "size": 10}, + {"status": "executed", "side": "sell", "size": 10}, + {"status": "executed", "side": "buy", "size": 10}, + {"status": "skipped", "side": "sell", "size": 10}, + {"status": "executed", "side": "sell", "size": 1}, + ] + } + ) + assert counts == {10: 2, 1: 1} + + def test_evaluate_two_sided_market_actions_uses_side_targets_from_ladders() -> None: market = _market_with_quote("wUSDC.b") market.mode = "two_sided" diff --git a/tests/test_daemon_websocket_runtime.py b/tests/test_daemon_websocket_runtime.py index 88a97ae..5fa5026 100644 --- a/tests/test_daemon_websocket_runtime.py +++ b/tests/test_daemon_websocket_runtime.py @@ -717,6 +717,11 @@ def test_daemon_instance_lock_rejects_second_holder(tmp_path: Path) -> None: def test_main_once_exits_with_lock_conflict(monkeypatch, tmp_path: Path, capsys) -> None: import greenfloor.daemon.main as daemon_mod + home = tmp_path / "home" + home.mkdir(parents=True, exist_ok=True) + program = tmp_path / "program.yaml" + _write_program(program, home) + reset_concurrent_log_handlers(module=daemon_mod) state_dir = tmp_path / "state" with daemon_mod._acquire_daemon_instance_lock(state_dir=state_dir, mode="loop"): monkeypatch.setattr( @@ -724,6 +729,8 @@ def test_main_once_exits_with_lock_conflict(monkeypatch, tmp_path: Path, capsys) [ "greenfloord", "--once", + "--program-config", + str(program), "--state-dir", str(state_dir), ], @@ -731,5 +738,7 @@ def test_main_once_exits_with_lock_conflict(monkeypatch, tmp_path: Path, capsys) with pytest.raises(SystemExit) as exc: daemon_mod.main() assert exc.value.code == 3 - out = capsys.readouterr().out - assert "daemon_lock_conflict" in out + captured = capsys.readouterr() + assert captured.out == "" + log_text = (home / "logs" / "debug.log").read_text(encoding="utf-8") + assert "daemon_lock_conflict" in log_text diff --git a/tests/test_dexie_adapter.py b/tests/test_dexie_adapter.py index d7d50a2..302fcbd 100644 --- a/tests/test_dexie_adapter.py +++ b/tests/test_dexie_adapter.py @@ -136,3 +136,32 @@ def test_dexie_get_offer_requires_non_empty_offer_id() -> None: adapter = DexieAdapter("https://api.dexie.space") with pytest.raises(ValueError, match="offer_id is required"): adapter.get_offer(" ") + + +def test_dexie_lookup_uses_ttl_cache_for_tokens(monkeypatch) -> None: + adapter = DexieAdapter("https://api.dexie.space", cache_ttl_seconds=900) + calls = {"count": 0} + + def _fake_urlopen(url, timeout=0): + _ = timeout + calls["count"] += 1 + if str(url).endswith("/v1/swap/tokens"): + return _FakeHttpResponse( + { + "tokens": [ + { + "id": "abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789", + "code": "BYC", + "name": "Biochar", + } + ] + } + ) + raise AssertionError(f"unexpected url: {url}") + + monkeypatch.setattr("urllib.request.urlopen", _fake_urlopen) + first = adapter.lookup_token_by_symbol("BYC") + second = adapter.lookup_token_by_symbol("BYC") + assert first is not None + assert second is not None + assert calls["count"] == 1 diff --git a/tests/test_logging_setup.py b/tests/test_logging_setup.py index 3e01495..bbb9fe6 100644 --- a/tests/test_logging_setup.py +++ b/tests/test_logging_setup.py @@ -7,8 +7,10 @@ cast_log_level, coerce_log_level, create_rotating_file_handler, + initialize_service_file_logging, normalize_log_level_name, ) +from tests.logging_helpers import reset_concurrent_log_handlers def test_normalize_log_level_name_valid_levels() -> None: @@ -47,3 +49,34 @@ def test_create_rotating_file_handler_creates_log_dir(tmp_path) -> None: log_dir = tmp_path / "logs" assert log_dir.exists() handler.close() + + +def test_initialize_service_file_logging_reuses_single_process_handler(tmp_path) -> None: + import greenfloor.logging_setup as logging_setup_mod + + reset_concurrent_log_handlers(module=logging_setup_mod) + root_logger = logging.getLogger() + logger_a = logging.getLogger("greenfloor.manager") + logger_b = logging.getLogger("greenfloor.daemon") + try: + handler_a = initialize_service_file_logging( + service_name="manager", + home_dir=str(tmp_path), + log_level="INFO", + service_logger=logger_a, + ) + handler_b = initialize_service_file_logging( + service_name="daemon", + home_dir=str(tmp_path), + log_level="INFO", + service_logger=logger_b, + ) + rotating_handlers = [ + handler + for handler in root_logger.handlers + if handler.__class__.__name__.endswith("RotatingFileHandler") + ] + assert handler_a is handler_b + assert len(rotating_handlers) == 1 + finally: + reset_concurrent_log_handlers(module=logging_setup_mod) diff --git a/tests/test_manager_post_offer.py b/tests/test_manager_post_offer.py index 7a38378..4c2d7ef 100644 --- a/tests/test_manager_post_offer.py +++ b/tests/test_manager_post_offer.py @@ -121,12 +121,21 @@ def _fake_lookup_by_cat(*, canonical_cat_id_hex: str, network: str): monkeypatch.setattr( "greenfloor.cli.manager._dexie_lookup_token_for_cat_id", _fake_lookup_by_cat ) + monkeypatch.setattr( + "greenfloor.cloud_wallet_offer_runtime._dexie_lookup_token_for_cat_id", _fake_lookup_by_cat + ) monkeypatch.setattr( "greenfloor.cli.manager._dexie_lookup_token_for_symbol", lambda *, asset_ref, network: ( {"id": quote_cat, "code": "wUSDC.b"} if asset_ref == "wUSDC.b" else None ), ) + monkeypatch.setattr( + "greenfloor.cloud_wallet_offer_runtime._dexie_lookup_token_for_symbol", + lambda *, asset_ref, network: ( + {"id": quote_cat, "code": "wUSDC.b"} if asset_ref == "wUSDC.b" else None + ), + ) base_asset, quote_asset = manager_mod._resolve_cloud_wallet_offer_asset_ids( wallet=cast(CloudWalletAdapter, _FakeWallet()), @@ -765,8 +774,7 @@ def test_build_and_post_offer_uses_market_configured_expiry_override( _write_markets(markets) raw = yaml.safe_load(markets.read_text(encoding="utf-8")) pricing = dict(raw["markets"][0].get("pricing") or {}) - pricing["strategy_offer_expiry_unit"] = "hours" - pricing["strategy_offer_expiry_value"] = 8 + pricing["strategy_offer_expiry_minutes"] = 12 raw["markets"][0]["pricing"] = pricing markets.write_text(yaml.safe_dump(raw, sort_keys=False), encoding="utf-8") @@ -805,8 +813,8 @@ def _fake_build(payload: dict) -> str: dry_run=False, ) assert code == 0 - assert captured_payload["expiry_unit"] == "hours" - assert captured_payload["expiry_value"] == 8 + assert captured_payload["expiry_unit"] == "minutes" + assert captured_payload["expiry_value"] == 12 payload = json.loads(capsys.readouterr().out.strip()) assert payload["publish_failures"] == 0 assert payload["results"][0]["result"]["id"] == "offer-expiry-1" @@ -3397,6 +3405,99 @@ def combine_coins(*, number_of_coins, fee, largest_first, asset_id, input_coin_i assert payload["resolved_asset_id"] == "Asset_split_base" +def test_coin_combine_auto_selection_directly_filters_cross_asset_scoped_rows( + monkeypatch, tmp_path: Path, capsys +) -> None: + program = tmp_path / "program.yaml" + markets = tmp_path / "markets.yaml" + _write_program_with_cloud_wallet(program) + _write_markets(markets) + calls = {} + + class _FakeWallet: + vault_id = "wallet-1" + + def __init__(self, _config): + pass + + @staticmethod + def list_coins(*, include_pending=True, asset_id=None): + _ = include_pending + if asset_id == "Asset_split_base": + return [ + {"id": "Coin_good_1", "name": "good-1", "amount": 1000, "state": "SETTLED"}, + {"id": "Coin_bad", "name": "bad", "amount": 1000, "state": "SETTLED"}, + {"id": "Coin_good_2", "name": "good-2", "amount": 1000, "state": "SETTLED"}, + ] + return [{"id": "Coin_old", "name": "old", "amount": 1, "state": "SETTLED"}] + + @staticmethod + def get_coin_record(*, coin_id): + mapping = { + "Coin_good_1": { + "id": "Coin_good_1", + "amount": 1000, + "state": "SETTLED", + "isLocked": False, + "isLinkedToOpenOffer": False, + "asset": {"id": "Asset_split_base"}, + }, + "Coin_good_2": { + "id": "Coin_good_2", + "amount": 1000, + "state": "SETTLED", + "isLocked": False, + "isLinkedToOpenOffer": False, + "asset": {"id": "Asset_split_base"}, + }, + "Coin_bad": { + "id": "Coin_bad", + "amount": 1000, + "state": "SETTLED", + "isLocked": False, + "isLinkedToOpenOffer": False, + "asset": {"id": "Asset_huun64oh7dbt9f1f9ie8khuw"}, + }, + } + return mapping[coin_id] + + @staticmethod + def combine_coins(*, number_of_coins, fee, largest_first, asset_id, input_coin_ids=None): + calls["combine"] = (number_of_coins, fee, largest_first, asset_id, input_coin_ids) + return {"signature_request_id": "sr-combine", "status": "UNSIGNED"} + + monkeypatch.setattr("greenfloor.cli.manager.CloudWalletAdapter", _FakeWallet) + monkeypatch.setattr( + "greenfloor.cli.manager._resolve_cloud_wallet_asset_id", + lambda *, wallet, canonical_asset_id, symbol_hint=None: "Asset_split_base", + ) + monkeypatch.setattr( + "greenfloor.cli.manager._resolve_taker_or_coin_operation_fee", + lambda *, network, minimum_fee_mojos=0: (77, "coinset_conservative"), + ) + code = _coin_combine( + program_path=program, + markets_path=markets, + network="mainnet", + market_id="m1", + pair=None, + number_of_coins=2, + asset_id="a1", + coin_ids=[], + no_wait=True, + ) + assert code == 0 + assert calls["combine"] == ( + 2, + 77, + True, + "Asset_split_base", + ["Coin_good_1", "Coin_good_2"], + ) + payload = json.loads(capsys.readouterr().out.strip()) + assert payload["coin_selection_mode"] == "adapter_auto_select" + + def test_coin_split_until_ready_ignores_unknown_states_and_string_asset( monkeypatch, tmp_path: Path, capsys ) -> None: @@ -4557,8 +4658,7 @@ def test_build_and_post_offer_cloud_wallet_uses_market_configured_expiry_overrid prog, mkt = _load_program_and_market(program_path, markets_path) prog.home_dir = str(tmp_path) pricing = dict(mkt.pricing or {}) - pricing["strategy_offer_expiry_unit"] = "hours" - pricing["strategy_offer_expiry_value"] = 8 + pricing["strategy_offer_expiry_minutes"] = 12 mkt.pricing = pricing captured_expires: dict[str, str] = {} @@ -4634,8 +4734,8 @@ def get_offer(offer_id: str) -> dict[str, object]: expires_at = dt.datetime.fromisoformat(captured_expires["iso"]) now = dt.datetime.now(dt.UTC) delta_seconds = (expires_at - now).total_seconds() - assert delta_seconds > 7 * 3600 - assert delta_seconds < 9 * 3600 + assert delta_seconds > 10 * 60 + assert delta_seconds < 14 * 60 payload = json.loads(capsys.readouterr().out.strip()) assert payload["publish_failures"] == 0 diff --git a/tests/test_price_adapter.py b/tests/test_price_adapter.py index 547ee03..b780fee 100644 --- a/tests/test_price_adapter.py +++ b/tests/test_price_adapter.py @@ -4,7 +4,7 @@ import pytest -from greenfloor.adapters.price import PriceAdapter +from greenfloor.adapters.price import PriceAdapter, XchPriceProvider class _FakeResponse: @@ -111,3 +111,47 @@ def test_get_xch_price_raises_when_no_cache_and_fetch_fails() -> None: with pytest.raises(RuntimeError, match="offline"): asyncio.run(adapter.get_xch_price()) + + +def test_xch_price_provider_prefers_cloud_wallet_and_uses_ttl_cache() -> None: + now = {"value": 1_000.0} + calls = {"count": 0} + + def _cloud_wallet_quote() -> float: + calls["count"] += 1 + return 42.0 + + provider = XchPriceProvider( + cloud_wallet_price_fn=_cloud_wallet_quote, + cloud_wallet_ttl_seconds=120, + fallback_price_adapter=PriceAdapter( + ttl_seconds=60, + now_fn=lambda: now["value"], + session_factory=lambda: _FakeSession([{"last_price_usd": "31.25"}], {"count": 0}), + ), + now_fn=lambda: now["value"], + ) + + first = asyncio.run(provider.get_xch_price()) + second = asyncio.run(provider.get_xch_price()) + + assert first == 42.0 + assert second == 42.0 + assert calls["count"] == 1 + + +def test_xch_price_provider_falls_back_to_coincodex_when_cloud_wallet_fails() -> None: + fallback_counter = {"count": 0} + provider = XchPriceProvider( + cloud_wallet_price_fn=lambda: (_ for _ in ()).throw(RuntimeError("cw down")), + fallback_price_adapter=PriceAdapter( + ttl_seconds=60, + now_fn=lambda: 1_000.0, + session_factory=lambda: _FakeSession([{"last_price_usd": "33.50"}], fallback_counter), + ), + now_fn=lambda: 1_000.0, + ) + + value = asyncio.run(provider.get_xch_price()) + assert value == 33.5 + assert fallback_counter["count"] == 1 diff --git a/tests/test_strategy.py b/tests/test_strategy.py index 27d5b24..854b3de 100644 --- a/tests/test_strategy.py +++ b/tests/test_strategy.py @@ -164,11 +164,10 @@ def test_evaluate_market_uses_configured_expiry_override() -> None: state=MarketState(ones=4, tens=2, hundreds=1, xch_price_usd=30.0), config=StrategyConfig( pair="xch", - offer_expiry_unit="hours", - offer_expiry_value=2, + offer_expiry_minutes=120, ), clock=_clock(), ) assert len(actions) == 1 - assert actions[0].expiry_unit == "hours" - assert actions[0].expiry_value == 2 + assert actions[0].expiry_unit == "minutes" + assert actions[0].expiry_value == 120 From 4dcaa70e7c77e2751fc62095103a8f9dd9c32cc9 Mon Sep 17 00:00:00 2001 From: Gene Hoffman Date: Tue, 10 Mar 2026 19:08:35 -0700 Subject: [PATCH 02/12] fix: enforce sane CAT coin-op minima and XCH quote multipliers Prevent sub-1-CAT coin-op targets and default XCH quote amounts to 1e12 mojos when multipliers are omitted, fixing severe underpricing on ECO.181.2020 XCH offers while keeping CAT defaults at 1000 mojos. Made-with: Cursor --- greenfloor/cli/manager.py | 84 ++++- greenfloor/cloud_wallet_offer_runtime.py | 150 +++++++-- greenfloor/config/models.py | 3 + greenfloor/core/strategy.py | 40 ++- greenfloor/daemon/main.py | 271 ++++++++++++++-- scripts/reconcile_byc_wusdc.py | 365 ++++++++++++++++++++++ tests/test_cloud_wallet_offer_runtime.py | 86 ++++- tests/test_config_models.py | 8 + tests/test_daemon_offer_execution.py | 224 ++++++++++++- tests/test_daemon_strategy_integration.py | 29 ++ tests/test_manager_post_offer.py | 155 +++++++++ tests/test_strategy.py | 19 ++ 12 files changed, 1359 insertions(+), 75 deletions(-) create mode 100644 scripts/reconcile_byc_wusdc.py diff --git a/greenfloor/cli/manager.py b/greenfloor/cli/manager.py index a59a270..a3bae50 100644 --- a/greenfloor/cli/manager.py +++ b/greenfloor/cli/manager.py @@ -245,6 +245,10 @@ def _canonical_is_xch(asset_id: str) -> bool: return value in {"xch", "txch"} +def _default_mojo_multiplier_for_asset(asset_id: str) -> int: + return 1_000_000_000_000 if _canonical_is_xch(asset_id) else 1000 + + def _canonical_is_cloud_global_id(asset_id: str) -> bool: return asset_id.strip().startswith("Asset_") @@ -1721,6 +1725,37 @@ def _resolve_coin_global_ids( return resolved, unresolved +def _coin_id_asset_lookup(wallet_coins: list[dict]) -> dict[str, str]: + lookup: dict[str, str] = {} + for coin in wallet_coins: + coin_id = str(coin.get("id", "")).strip() + if not coin_id: + continue + lookup[coin_id] = _coin_asset_id(coin).strip().lower() + return lookup + + +def _classify_resolved_coin_ids_by_asset( + *, + wallet_coins: list[dict], + resolved_coin_ids: list[str], + expected_asset_id: str, +) -> tuple[list[str], list[dict[str, str]]]: + lookup = _coin_id_asset_lookup(wallet_coins) + expected = str(expected_asset_id).strip().lower() + unknown: list[str] = [] + mismatched: list[dict[str, str]] = [] + for coin_id in resolved_coin_ids: + normalized_coin_id = str(coin_id).strip() + actual_asset = lookup.get(normalized_coin_id) + if actual_asset is None: + unknown.append(normalized_coin_id) + continue + if actual_asset != expected: + mismatched.append({"coin_id": normalized_coin_id, "coin_asset_id": actual_asset}) + return unknown, mismatched + + # --------------------------------------------------------------------------- # Shared coin-operation helpers # --------------------------------------------------------------------------- @@ -2571,8 +2606,22 @@ def _build_and_post_offer( # (pyright and runtime callers) that treat this as a non-optional value. keyring_yaml_path = str(signer_key.keyring_yaml_path or "") if signer_key is not None else "" pricing = dict(getattr(market, "pricing", {}) or {}) - base_unit_mojo_multiplier = int(pricing.get("base_unit_mojo_multiplier", 1000)) - quote_unit_mojo_multiplier = int(pricing.get("quote_unit_mojo_multiplier", 1000)) + default_quote_asset = _resolve_quote_asset_for_local_offer_build( + quote_asset=str(market.quote_asset), + network=network, + ) + base_unit_mojo_multiplier = int( + pricing.get( + "base_unit_mojo_multiplier", + _default_mojo_multiplier_for_asset(str(market.base_asset)), + ) + ) + quote_unit_mojo_multiplier = int( + pricing.get( + "quote_unit_mojo_multiplier", + _default_mojo_multiplier_for_asset(str(default_quote_asset)), + ) + ) expiry_unit, expiry_value = _resolve_offer_expiry_for_market(market) quote_price = pricing.get("fixed_quote_per_base") if quote_price is None: @@ -3407,6 +3456,37 @@ def _coin_combine( raise ValueError( "when --coin-id is provided, --input-coin-count must match the number of --coin-id values" ) + unresolved_coin_ids, mismatched_coin_ids = _classify_resolved_coin_ids_by_asset( + wallet_coins=wallet_coins, + resolved_coin_ids=resolved_input_coin_ids, + expected_asset_id=resolved_asset_id, + ) + if unresolved_coin_ids: + break + if mismatched_coin_ids: + print( + _format_json_output( + { + **_coin_op_base_payload(market, selected_venue, wallet), + "waited": False, + "success": False, + "error": "coin_id_asset_mismatch", + "resolved_asset_id": resolved_asset_id, + "mismatched_coin_ids": [ + str(entry.get("coin_id", "")).strip() + for entry in mismatched_coin_ids + if str(entry.get("coin_id", "")).strip() + ], + "mismatched_coin_assets": mismatched_coin_ids, + "operator_guidance": ( + "all explicit --coin-id values must resolve to the same asset " + "as --asset-id; re-run coins-list scoped to the target asset " + "and retry with only those coin ids" + ), + } + ) + ) + return 2 elif min_coin_amount_mojos > 0: asset_scoped_coins = wallet.list_coins(asset_id=resolved_asset_id, include_pending=True) direct_lookup_cache: dict[str, bool] = {} diff --git a/greenfloor/cloud_wallet_offer_runtime.py b/greenfloor/cloud_wallet_offer_runtime.py index ea65741..2b62b15 100644 --- a/greenfloor/cloud_wallet_offer_runtime.py +++ b/greenfloor/cloud_wallet_offer_runtime.py @@ -111,6 +111,37 @@ def _offer_has_expiration_condition(sdk: object, offer_text: str) -> bool: return False +def _offer_has_duplicate_spent_coin_ids(sdk: object, offer_text: str) -> bool: + decode_offer = getattr(sdk, "decode_offer", None) + to_hex = getattr(sdk, "to_hex", None) + if not callable(decode_offer) or not callable(to_hex): + return False + try: + spend_bundle = decode_offer(offer_text) + except Exception: + return False + coin_spends = getattr(spend_bundle, "coin_spends", None) or [] + seen: set[str] = set() + for coin_spend in coin_spends: + coin = getattr(coin_spend, "coin", None) + if coin is None: + continue + coin_id_fn = getattr(coin, "coin_id", None) + if not callable(coin_id_fn): + continue + try: + coin_id_hex = str(to_hex(coin_id_fn())).strip().lower() + except Exception: + continue + normalized = normalize_hex_id(coin_id_hex) + if not normalized: + continue + if normalized in seen: + return True + seen.add(normalized) + return False + + def _extract_coin_id_hints_from_offer_text(offer_text: str) -> list[str]: try: sdk = importlib.import_module("chia_wallet_sdk") @@ -168,6 +199,7 @@ def log_signed_offer_artifact( def verify_offer_text_for_dexie(offer_text: str) -> str | None: + native_validated = False try: native = importlib.import_module("greenfloor_native") except Exception: @@ -175,23 +207,32 @@ def verify_offer_text_for_dexie(offer_text: str) -> str | None: else: try: native.validate_offer(offer_text) - return None + native_validated = True except Exception as exc: return f"wallet_sdk_offer_validate_failed:{exc}" try: import chia_wallet_sdk as sdk # type: ignore except Exception as exc: + if native_validated: + return None return f"wallet_sdk_import_error:{exc}" try: - validate_offer = getattr(sdk, "validate_offer", None) - if callable(validate_offer): - validate_offer(offer_text) - else: - verify_offer = getattr(sdk, "verify_offer", None) - if not callable(verify_offer): - return "wallet_sdk_validate_offer_unavailable" - if not bool(verify_offer(offer_text)): - return "wallet_sdk_offer_verify_false" + decode_offer = getattr(sdk, "decode_offer", None) + decode_available = callable(decode_offer) + if not native_validated: + validate_offer = getattr(sdk, "validate_offer", None) + if callable(validate_offer): + validate_offer(offer_text) + else: + verify_offer = getattr(sdk, "verify_offer", None) + if not callable(verify_offer): + return "wallet_sdk_validate_offer_unavailable" + if not bool(verify_offer(offer_text)): + return "wallet_sdk_offer_verify_false" + if native_validated and not decode_available: + return None + if _offer_has_duplicate_spent_coin_ids(sdk, offer_text): + return "wallet_sdk_offer_duplicate_spent_coin_ids" if not _offer_has_expiration_condition(sdk, offer_text): return "wallet_sdk_offer_missing_expiration" except Exception as exc: @@ -218,6 +259,10 @@ def _canonical_is_xch(asset_id: str) -> bool: return value in {"xch", "txch"} +def _default_mojo_multiplier_for_asset(asset_id: str) -> int: + return 1_000_000_000_000 if _canonical_is_xch(asset_id) else 1000 + + def _canonical_is_cloud_global_id(asset_id: str) -> bool: return asset_id.strip().startswith("Asset_") @@ -853,6 +898,13 @@ def verify_dexie_offer_visible_by_id( return last_error +def is_transient_dexie_visibility_404_error(error: str) -> bool: + normalized = str(error).strip().lower() + return ( + "dexie_get_offer_error" in normalized and "404" in normalized + ) or "dexie_http_error:404" in normalized + + def _coinset_coin_url(*, coin_name: str, network: str = "mainnet") -> str: base = "https://testnet11.coinset.org" if is_testnet(network) else "https://coinset.org" return f"{base}/coin/{coin_name.strip()}" @@ -1542,7 +1594,12 @@ def ensure_offer_bootstrap_denominations( if not side_ladder: return {"status": "skipped", "reason": f"missing_{side}_ladder"} pricing = dict(getattr(market, "pricing", {}) or {}) - quote_unit_multiplier = int(pricing.get("quote_unit_mojo_multiplier", 1000)) + quote_unit_multiplier = int( + pricing.get( + "quote_unit_mojo_multiplier", + _default_mojo_multiplier_for_asset(str(resolved_quote_asset_id)), + ) + ) if side == "buy": ladder_for_split = [] for entry in side_ladder: @@ -1745,13 +1802,24 @@ def cloud_wallet_create_offer_phase( known_offer_markers = offer_markers(prior_offers if isinstance(prior_offers, list) else []) offer_request_started_at = dt.datetime.now(dt.UTC) offer_amount = int( - size_base_units * int((market.pricing or {}).get("base_unit_mojo_multiplier", 1000)) + size_base_units + * int( + (market.pricing or {}).get( + "base_unit_mojo_multiplier", + _default_mojo_multiplier_for_asset(str(resolved_base_asset_id)), + ) + ) ) request_amount = int( round( float(size_base_units) * float(quote_price) - * int((market.pricing or {}).get("quote_unit_mojo_multiplier", 1000)) + * int( + (market.pricing or {}).get( + "quote_unit_mojo_multiplier", + _default_mojo_multiplier_for_asset(str(resolved_quote_asset_id)), + ) + ) ) ) if request_amount <= 0: @@ -1759,9 +1827,26 @@ def cloud_wallet_create_offer_phase( if side == "buy": offered = [{"assetId": resolved_quote_asset_id, "amount": request_amount}] requested = [{"assetId": resolved_base_asset_id, "amount": offer_amount}] + spend_asset_id = str(resolved_quote_asset_id).strip() + required_spendable_amount = int(request_amount) else: offered = [{"assetId": resolved_base_asset_id, "amount": offer_amount}] requested = [{"assetId": resolved_quote_asset_id, "amount": request_amount}] + spend_asset_id = str(resolved_base_asset_id).strip() + required_spendable_amount = int(offer_amount) + if hasattr(wallet, "list_coins") and spend_asset_id: + asset_scoped_coins = wallet.list_coins(asset_id=spend_asset_id, include_pending=True) + spendable_amount = sum( + int(coin.get("amount", 0)) + for coin in asset_scoped_coins + if isinstance(coin, dict) and _is_spendable_coin(coin) + ) + if spendable_amount < required_spendable_amount: + raise RuntimeError( + "cloud_wallet_offer_insufficient_spendable_balance:" + f"side={side}:required={required_spendable_amount}:" + f"available={spendable_amount}:asset_id={spend_asset_id}" + ) expires_at = ( dt.datetime.now(dt.UTC) + dt.timedelta(**{expiry_unit: int(expiry_value)}) ).isoformat() @@ -2035,19 +2120,32 @@ def build_and_post_offer_cloud_wallet( if bool(bootstrap_result.get("fallback_to_cloud_wallet_offer_split", False)): split_input_coins_fee = 0 - create_phase = cloud_wallet_create_offer_phase_fn( - wallet=wallet, - market=market, - size_base_units=size_base_units, - quote_price=quote_price, - resolved_base_asset_id=resolved_base_asset_id, - resolved_quote_asset_id=resolved_quote_asset_id, - offer_fee_mojos=offer_fee_mojos, - split_input_coins_fee=split_input_coins_fee, - expiry_unit=expiry_unit, - expiry_value=expiry_value, - action_side=side, - ) + try: + create_phase = cloud_wallet_create_offer_phase_fn( + wallet=wallet, + market=market, + size_base_units=size_base_units, + quote_price=quote_price, + resolved_base_asset_id=resolved_base_asset_id, + resolved_quote_asset_id=resolved_quote_asset_id, + offer_fee_mojos=offer_fee_mojos, + split_input_coins_fee=split_input_coins_fee, + expiry_unit=expiry_unit, + expiry_value=expiry_value, + action_side=side, + ) + except Exception as exc: + post_results.append( + { + "venue": publish_venue, + "result": { + "success": False, + "error": str(exc), + }, + } + ) + publish_failures += 1 + continue signature_request_id = str(create_phase["signature_request_id"]).strip() signature_state = str(create_phase["signature_state"]).strip() wait_events = list(create_phase["wait_events"]) diff --git a/greenfloor/config/models.py b/greenfloor/config/models.py index 9123846..881f10d 100644 --- a/greenfloor/config/models.py +++ b/greenfloor/config/models.py @@ -7,6 +7,7 @@ from greenfloor.logging_setup import normalize_log_level_name _CANONICAL_CAT_UNIT_MOJOS = 1000 +_CANONICAL_XCH_UNIT_MOJOS = 1_000_000_000_000 _XCH_UNIT_SYMBOLS = frozenset({"xch", "txch", "1"}) @@ -204,6 +205,8 @@ def canonicalize_asset_unit_mojo_multiplier( market_id: str, ) -> int: if raw_value in (None, ""): + if str(asset_id).strip().lower() in _XCH_UNIT_SYMBOLS: + return _CANONICAL_XCH_UNIT_MOJOS return _CANONICAL_CAT_UNIT_MOJOS try: multiplier = int(raw_value) diff --git a/greenfloor/core/strategy.py b/greenfloor/core/strategy.py index e029ffd..1a8cf8d 100644 --- a/greenfloor/core/strategy.py +++ b/greenfloor/core/strategy.py @@ -10,6 +10,7 @@ class MarketState: tens: int hundreds: int xch_price_usd: float | None = None + bucket_counts_by_size: dict[int, int] | None = None @dataclass(frozen=True, slots=True) @@ -22,6 +23,7 @@ class StrategyConfig: min_xch_price_usd: float | None = None max_xch_price_usd: float | None = None offer_expiry_minutes: int | None = None + target_counts_by_size: dict[int, int] | None = None @dataclass(frozen=True, slots=True) @@ -40,6 +42,35 @@ class PlannedAction: _DEFAULT_OFFER_EXPIRY_MINUTES = 10 +def _strategy_target_counts(config: StrategyConfig) -> list[tuple[int, int]]: + if config.target_counts_by_size: + return sorted( + ( + (int(size), int(target)) + for size, target in config.target_counts_by_size.items() + if int(size) > 0 and int(target) >= 0 + ), + key=lambda entry: entry[0], + ) + return [ + (1, int(config.ones_target)), + (10, int(config.tens_target)), + (100, int(config.hundreds_target)), + ] + + +def _state_count_for_size(state: MarketState, size: int) -> int: + if state.bucket_counts_by_size is not None: + return int(state.bucket_counts_by_size.get(size, 0)) + if size == 1: + return int(state.ones) + if size == 10: + return int(state.tens) + if size == 100: + return int(state.hundreds) + return 0 + + def evaluate_market( state: MarketState, config: StrategyConfig, @@ -62,14 +93,9 @@ def evaluate_market( else _DEFAULT_OFFER_EXPIRY_MINUTES ) - offer_configs = [ - (1, state.ones, config.ones_target), - (10, state.tens, config.tens_target), - (100, state.hundreds, config.hundreds_target), - ] - actions: list[PlannedAction] = [] - for size, current, target in offer_configs: + for size, target in _strategy_target_counts(config): + current = _state_count_for_size(state, size) if current < target: actions.append( PlannedAction( diff --git a/greenfloor/daemon/main.py b/greenfloor/daemon/main.py index 98f591e..75092fd 100644 --- a/greenfloor/daemon/main.py +++ b/greenfloor/daemon/main.py @@ -94,6 +94,14 @@ class DaemonRunState: } +def _canonical_is_xch(asset_id: str) -> bool: + return str(asset_id or "").strip().lower() in {"xch", "txch", "1"} + + +def _default_mojo_multiplier_for_asset(asset_id: str) -> int: + return 1_000_000_000_000 if _canonical_is_xch(asset_id) else 1000 + + def _cloud_wallet_coin_matches_asset_scope(*, coin: dict[str, Any], scoped_asset_id: str) -> bool: target_asset = str(scoped_asset_id).strip().lower() if not target_asset: @@ -122,6 +130,10 @@ def _coin_meets_coin_op_min_amount(coin: dict[str, Any], *, canonical_asset_id: return amount >= _coin_op_min_amount_mojos(canonical_asset_id=canonical_asset_id) +def _coin_op_target_amount_allowed(*, amount_mojos: int, canonical_asset_id: str) -> bool: + return int(amount_mojos) >= _coin_op_min_amount_mojos(canonical_asset_id=canonical_asset_id) + + def _coin_matches_direct_spendable_lookup( *, wallet: Any, @@ -513,15 +525,22 @@ def _to_float(value: Any) -> float | None: return None return parsed + normalized_targets = { + int(size): max(0, int(target)) for size, target in targets_by_size.items() if int(size) > 0 + } + if not normalized_targets: + normalized_targets = {1: 5, 10: 2, 100: 1} + return StrategyConfig( pair=_normalize_strategy_pair(market.quote_asset), - ones_target=int(targets_by_size.get(1, 5)), - tens_target=int(targets_by_size.get(10, 2)), - hundreds_target=int(targets_by_size.get(100, 1)), + ones_target=int(normalized_targets.get(1, 0)), + tens_target=int(normalized_targets.get(10, 0)), + hundreds_target=int(normalized_targets.get(100, 0)), target_spread_bps=_to_int(pricing.get("strategy_target_spread_bps")), min_xch_price_usd=_to_float(pricing.get("strategy_min_xch_price_usd")), max_xch_price_usd=_to_float(pricing.get("strategy_max_xch_price_usd")), offer_expiry_minutes=_to_int(pricing.get("strategy_offer_expiry_minutes")), + target_counts_by_size=normalized_targets, ) @@ -539,12 +558,17 @@ def _strategy_config_for_side(*, market: Any, side: str) -> StrategyConfig: except (TypeError, ValueError): expiry_minutes = None + normalized_targets = { + int(size): max(0, int(target)) for size, target in targets_by_size.items() if int(size) > 0 + } + return StrategyConfig( pair=_normalize_strategy_pair(market.quote_asset), - ones_target=int(targets_by_size.get(1, 0)), - tens_target=int(targets_by_size.get(10, 0)), - hundreds_target=int(targets_by_size.get(100, 0)), + ones_target=int(normalized_targets.get(1, 0)), + tens_target=int(normalized_targets.get(10, 0)), + hundreds_target=int(normalized_targets.get(100, 0)), offer_expiry_minutes=expiry_minutes, + target_counts_by_size=normalized_targets, ) @@ -553,11 +577,13 @@ def _strategy_state_from_bucket_counts( *, xch_price_usd: float | None, ) -> MarketState: + normalized_bucket_counts = {int(size): int(count) for size, count in bucket_counts.items()} return MarketState( - ones=int(bucket_counts.get(1, 0)), - tens=int(bucket_counts.get(10, 0)), - hundreds=int(bucket_counts.get(100, 0)), + ones=int(normalized_bucket_counts.get(1, 0)), + tens=int(normalized_bucket_counts.get(10, 0)), + hundreds=int(normalized_bucket_counts.get(100, 0)), xch_price_usd=xch_price_usd, + bucket_counts_by_size=normalized_bucket_counts, ) @@ -652,6 +678,16 @@ def _evaluate_two_sided_market_actions( OfferLifecycleState.REFRESH_DUE.value, } _RESEED_MEMPOOL_MAX_AGE_SECONDS = 3 * 60 +_PENDING_VISIBILITY_RECHECK_MAX_AGE_SECONDS = 2 * 60 +_PENDING_VISIBILITY_REASON = "cloud_wallet_post_success_dexie_visibility_pending" + + +@dataclass(frozen=True, slots=True) +class _OfferExecutionMetadata: + size: int + side: str | None + reason: str + created_at: str def _is_recent_mempool_observed_offer_state( @@ -681,6 +717,12 @@ def _is_recent_mempool_observed_offer_state( def _strategy_target_counts_by_size(strategy_config: StrategyConfig) -> dict[int, int]: + if strategy_config.target_counts_by_size: + return { + int(size): int(target) + for size, target in sorted(strategy_config.target_counts_by_size.items()) + if int(size) > 0 and int(target) >= 0 + } return { 1: int(strategy_config.ones_target), 10: int(strategy_config.tens_target), @@ -736,14 +778,15 @@ def _parse_offer_side_metadata(value: Any) -> str | None: def _recent_offer_metadata_by_offer_id( *, store: SqliteStore, market_id: str -) -> dict[str, tuple[int, str | None]]: +) -> dict[str, _OfferExecutionMetadata]: events = store.list_recent_audit_events( event_types=["strategy_offer_execution"], market_id=market_id, limit=1500, ) - metadata_by_offer_id: dict[str, tuple[int, str | None]] = {} + metadata_by_offer_id: dict[str, _OfferExecutionMetadata] = {} for event in events: + created_at = str(event.get("created_at", "")).strip() payload = event.get("payload") if not isinstance(payload, dict): continue @@ -765,12 +808,46 @@ def _recent_offer_metadata_by_offer_id( if size <= 0: continue side = _parse_offer_side_metadata(item.get("side")) + reason = str(item.get("reason", "")).strip() # Events are returned newest-first; keep first (latest) mapping. if offer_id not in metadata_by_offer_id: - metadata_by_offer_id[offer_id] = (size, side) + metadata_by_offer_id[offer_id] = _OfferExecutionMetadata( + size=size, + side=side, + reason=reason, + created_at=created_at, + ) return metadata_by_offer_id +def _is_stale_pending_visibility_offer( + *, + offer_id: str, + metadata: _OfferExecutionMetadata, + dexie_size_by_offer_id: dict[str, int] | None, + clock: datetime, + max_age_seconds: int = _PENDING_VISIBILITY_RECHECK_MAX_AGE_SECONDS, +) -> bool: + if metadata.reason != _PENDING_VISIBILITY_REASON: + return False + if dexie_size_by_offer_id is None: + # No Dexie visibility snapshot available this cycle. + return False + if offer_id in dexie_size_by_offer_id: + return False + created_at_raw = str(metadata.created_at).strip() + if not created_at_raw: + return True + normalized = created_at_raw.replace("Z", "+00:00") + try: + created_at = datetime.fromisoformat(normalized) + except ValueError: + return True + if created_at.tzinfo is None: + created_at = created_at.replace(tzinfo=UTC) + return (clock - created_at).total_seconds() > float(max_age_seconds) + + def _recent_executed_offer_ids(*, store: SqliteStore, market_id: str) -> set[str]: events = store.list_recent_audit_events( event_types=["strategy_offer_execution"], @@ -916,7 +993,7 @@ def _active_offer_state_summary( market_id: str, clock: datetime, limit: int = 500, -) -> tuple[list[str], dict[str, int], dict[str, tuple[int, str | None]]]: +) -> tuple[list[str], dict[str, int], dict[str, _OfferExecutionMetadata]]: offer_states = store.list_offer_states(market_id=market_id, limit=limit) state_counts: dict[str, int] = {} for item in offer_states: @@ -950,6 +1027,7 @@ def _active_offer_counts_by_size( clock: datetime, limit: int = 500, dexie_size_by_offer_id: dict[str, int] | None = None, + tracked_sizes: set[int] | None = None, ) -> tuple[dict[int, int], dict[str, int], int]: active_offer_ids, state_counts, metadata_by_offer_id = _active_offer_state_summary( store=store, @@ -957,11 +1035,24 @@ def _active_offer_counts_by_size( clock=clock, limit=limit, ) - active_counts_by_size: dict[int, int] = {1: 0, 10: 0, 100: 0} + normalized_sizes = ( + {int(size) for size in tracked_sizes if int(size) > 0} + if tracked_sizes is not None + else {1, 10, 100} + ) + active_counts_by_size: dict[int, int] = {size: 0 for size in sorted(normalized_sizes)} active_unmapped_offer_ids = 0 for offer_id in active_offer_ids: metadata = metadata_by_offer_id.get(offer_id) - size = metadata[0] if metadata is not None else None + if metadata is not None and _is_stale_pending_visibility_offer( + offer_id=offer_id, + metadata=metadata, + dexie_size_by_offer_id=dexie_size_by_offer_id, + clock=clock, + ): + active_unmapped_offer_ids += 1 + continue + size = metadata.size if metadata is not None else None if size is None and dexie_size_by_offer_id: size = dexie_size_by_offer_id.get(offer_id) if size in active_counts_by_size: @@ -978,10 +1069,16 @@ def _active_offer_counts_by_size_and_side( clock: datetime, limit: int = 500, dexie_size_by_offer_id: dict[str, int] | None = None, + tracked_sizes: set[int] | None = None, ) -> tuple[dict[str, dict[int, int]], dict[str, int], int]: + normalized_sizes = ( + {int(size) for size in tracked_sizes if int(size) > 0} + if tracked_sizes is not None + else {1, 10, 100} + ) counts_by_side: dict[str, dict[int, int]] = { - "buy": {1: 0, 10: 0, 100: 0}, - "sell": {1: 0, 10: 0, 100: 0}, + "buy": {size: 0 for size in sorted(normalized_sizes)}, + "sell": {size: 0 for size in sorted(normalized_sizes)}, } active_offer_ids, state_counts, metadata_by_offer_id = _active_offer_state_summary( store=store, @@ -992,8 +1089,16 @@ def _active_offer_counts_by_size_and_side( active_unmapped_offer_ids = 0 for offer_id in active_offer_ids: metadata = metadata_by_offer_id.get(offer_id) - size = metadata[0] if metadata is not None else None - side = metadata[1] if metadata is not None else None + if metadata is not None and _is_stale_pending_visibility_offer( + offer_id=offer_id, + metadata=metadata, + dexie_size_by_offer_id=dexie_size_by_offer_id, + clock=clock, + ): + active_unmapped_offer_ids += 1 + continue + size = metadata.size if metadata is not None else None + side = metadata.side if metadata is not None else None if metadata is None or side is None: # Do not assume buy/sell direction when metadata is unavailable. active_unmapped_offer_ids += 1 @@ -1032,6 +1137,7 @@ def _inject_reseed_action_if_no_active_offers( market_id=market.market_id, clock=clock, dexie_size_by_offer_id=dexie_size_by_offer_id, + tracked_sizes=set(target_by_size.keys()), ) missing_by_size = { size: max(0, int(target_by_size.get(size, 0)) - int(active_counts_by_size.get(size, 0))) @@ -1052,7 +1158,7 @@ def _inject_reseed_action_if_no_active_offers( return strategy_actions seed_candidates = evaluate_market( - state=MarketState(ones=0, tens=0, hundreds=0, xch_price_usd=xch_price_usd), + state=_strategy_state_from_bucket_counts({}, xch_price_usd=xch_price_usd), config=strategy_config, clock=clock, ) @@ -1163,14 +1269,15 @@ def _build_offer_for_action( "reason": f"offer_builder_failed:{exc}", "offer": None, } + resolved_quote_asset = _resolve_quote_asset_for_offer( + quote_asset=str(market.quote_asset), + network=network, + ) payload = { "market_id": market.market_id, "base_asset": market.base_asset, "base_symbol": market.base_symbol, - "quote_asset": _resolve_quote_asset_for_offer( - quote_asset=str(market.quote_asset), - network=network, - ), + "quote_asset": resolved_quote_asset, "quote_asset_type": market.quote_asset_type, "receive_address": market.receive_address, "size_base_units": int(action.size), @@ -1182,8 +1289,18 @@ def _build_offer_for_action( "expiry_unit": action.expiry_unit, "expiry_value": int(action.expiry_value), "quote_price_quote_per_base": quote_price, - "base_unit_mojo_multiplier": int(pricing.get("base_unit_mojo_multiplier", 1000)), - "quote_unit_mojo_multiplier": int(pricing.get("quote_unit_mojo_multiplier", 1000)), + "base_unit_mojo_multiplier": int( + pricing.get( + "base_unit_mojo_multiplier", + _default_mojo_multiplier_for_asset(str(market.base_asset)), + ) + ), + "quote_unit_mojo_multiplier": int( + pricing.get( + "quote_unit_mojo_multiplier", + _default_mojo_multiplier_for_asset(str(resolved_quote_asset)), + ) + ), "key_id": market.signer_key_id, "keyring_yaml_path": keyring_yaml_path, "network": network, @@ -1289,10 +1406,11 @@ def _cloud_wallet_spendable_profiles_by_asset( def _base_unit_mojo_multiplier_for_market(*, market: Any) -> int: pricing = getattr(market, "pricing", {}) or {} + default_multiplier = _default_mojo_multiplier_for_asset(str(getattr(market, "base_asset", ""))) try: - multiplier = int(pricing.get("base_unit_mojo_multiplier", 1000)) + multiplier = int(pricing.get("base_unit_mojo_multiplier", default_multiplier)) except (TypeError, ValueError): - multiplier = 1000 + multiplier = default_multiplier return max(1, multiplier) @@ -2397,6 +2515,14 @@ def _evaluate_and_execute_strategy( """Evaluate market strategy, inject reseed if needed, and execute offer actions.""" market_mode = str(getattr(market, "mode", "")).strip().lower() strategy_config = _strategy_config_from_market(market) + tracked_sizes = { + int(entry.size_base_units) + for side_entries in (getattr(market, "ladders", {}) or {}).values() + for entry in side_entries + if int(getattr(entry, "size_base_units", 0)) > 0 + } + if not tracked_sizes: + tracked_sizes = set(_strategy_target_counts_by_size(strategy_config).keys()) if market_mode == "two_sided": offer_counts_by_side, offer_state_counts, active_unmapped_offer_ids = ( _active_offer_counts_by_size_and_side( @@ -2404,12 +2530,13 @@ def _evaluate_and_execute_strategy( market_id=market.market_id, clock=now, dexie_size_by_offer_id=dexie_size_by_offer_id, + tracked_sizes=tracked_sizes, ) ) active_offer_counts_by_size = { - 1: int(offer_counts_by_side["buy"][1]) + int(offer_counts_by_side["sell"][1]), - 10: int(offer_counts_by_side["buy"][10]) + int(offer_counts_by_side["sell"][10]), - 100: int(offer_counts_by_side["buy"][100]) + int(offer_counts_by_side["sell"][100]), + size: int(offer_counts_by_side["buy"].get(size, 0)) + + int(offer_counts_by_side["sell"].get(size, 0)) + for size in sorted(tracked_sizes) } else: active_offer_counts_by_size, offer_state_counts, active_unmapped_offer_ids = ( @@ -2418,10 +2545,11 @@ def _evaluate_and_execute_strategy( market_id=market.market_id, clock=now, dexie_size_by_offer_id=dexie_size_by_offer_id, + tracked_sizes=tracked_sizes, ) ) offer_counts_by_side = { - "buy": {1: 0, 10: 0, 100: 0}, + "buy": {size: 0 for size in sorted(tracked_sizes)}, "sell": dict(active_offer_counts_by_size), } _log_market_decision( @@ -2552,6 +2680,39 @@ def _plan_and_execute_coin_ops( active_sell_offer_counts_by_size=active_sell_offer_counts_by_size, newly_executed_sell_offer_counts_by_size=newly_executed_sell_offer_counts_by_size, ) + base_unit_mojo_multiplier = _base_unit_mojo_multiplier_for_market(market=market) + canonical_base_asset_id = str(getattr(market, "base_asset", "")).strip() + invalid_buckets: list[dict[str, int]] = [] + valid_sell_ladder: list[Any] = [] + for entry in sell_ladder: + size_base_units = int(getattr(entry, "size_base_units", 0)) + if size_base_units <= 0: + continue + target_amount_mojos = size_base_units * int(base_unit_mojo_multiplier) + if _coin_op_target_amount_allowed( + amount_mojos=target_amount_mojos, + canonical_asset_id=canonical_base_asset_id, + ): + valid_sell_ladder.append(entry) + continue + invalid_buckets.append( + { + "size_base_units": size_base_units, + "target_amount_mojos": int(target_amount_mojos), + "minimum_allowed_mojos": int( + _coin_op_min_amount_mojos(canonical_asset_id=canonical_base_asset_id) + ), + } + ) + if invalid_buckets: + _log_market_decision( + market.market_id, + "coin_ops_skip_sub_minimum_target_amount", + invalid_bucket_count=len(invalid_buckets), + invalid_buckets=invalid_buckets, + ) + if not valid_sell_ladder: + return buckets = [ BucketSpec( size_base_units=e.size_base_units, @@ -2560,7 +2721,7 @@ def _plan_and_execute_coin_ops( combine_when_excess_factor=e.combine_when_excess_factor, current_count=int(bucket_counts.get(e.size_base_units, 0)), ) - for e in sell_ladder + for e in valid_sell_ladder ] plans = plan_coin_ops( buckets=buckets, @@ -2863,6 +3024,28 @@ def _spendable_asset_scoped_coins(coins: list[dict[str, Any]]) -> list[dict[str, ) continue amount_per_coin_mojos = size_base_units * base_unit_mojo_multiplier + canonical_asset_id = str(getattr(market, "base_asset", "")).strip() + if not _coin_op_target_amount_allowed( + amount_mojos=amount_per_coin_mojos, + canonical_asset_id=canonical_asset_id, + ): + items.append( + { + "op_type": op_type, + "size_base_units": size_base_units, + "op_count": op_count, + "status": "skipped", + "reason": "split_amount_below_coin_op_minimum", + "operation_id": None, + "data": { + "amount_per_coin_mojos": int(amount_per_coin_mojos), + "minimum_allowed_mojos": int( + _coin_op_min_amount_mojos(canonical_asset_id=canonical_asset_id) + ), + }, + } + ) + continue required_amount = amount_per_coin_mojos * op_count coins = cloud_wallet.list_coins( asset_id=resolved_base_asset_id, include_pending=True @@ -3101,6 +3284,28 @@ def _spendable_asset_scoped_coins(coins: list[dict[str, Any]]) -> list[dict[str, requested_number_of_coins = max(2, op_count) capped_number_of_coins = min(requested_number_of_coins, combine_input_cap) target_coin_amount_mojos = size_base_units * base_unit_mojo_multiplier + canonical_asset_id = str(getattr(market, "base_asset", "")).strip() + if not _coin_op_target_amount_allowed( + amount_mojos=target_coin_amount_mojos, + canonical_asset_id=canonical_asset_id, + ): + items.append( + { + "op_type": op_type, + "size_base_units": size_base_units, + "op_count": op_count, + "status": "skipped", + "reason": "combine_target_amount_below_coin_op_minimum", + "operation_id": None, + "data": { + "target_coin_amount_mojos": int(target_coin_amount_mojos), + "minimum_allowed_mojos": int( + _coin_op_min_amount_mojos(canonical_asset_id=canonical_asset_id) + ), + }, + } + ) + continue watched_coin_ids = _watched_coin_ids_for_market( market_id=str(getattr(market, "market_id", "")).strip() ) diff --git a/scripts/reconcile_byc_wusdc.py b/scripts/reconcile_byc_wusdc.py new file mode 100644 index 0000000..5e5ccce --- /dev/null +++ b/scripts/reconcile_byc_wusdc.py @@ -0,0 +1,365 @@ +#!/usr/bin/env python3 +"""Reconcile BYC/wUSDC holdings against Cloud Wallet offers. + +Usage: + .venv/bin/python scripts/reconcile_byc_wusdc.py + .venv/bin/python scripts/reconcile_byc_wusdc.py --json + +This script is read-only. It fetches: + - wallet asset totals (total/spendable/locked) + - coin-level settled/pending/spendable sums for BYC and wUSDC.b + - paginated creator offers, classified as buy/sell for BYC:wUSDC + +The goal is to make inventory discrepancies easy to spot in one output. +""" + +from __future__ import annotations + +import argparse +import json +import sys +import time +from pathlib import Path +from typing import Any + +ROOT = Path(__file__).resolve().parents[1] +if str(ROOT) not in sys.path: + sys.path.insert(0, str(ROOT)) + +from greenfloor.cli.manager import ( # noqa: E402 + _new_cloud_wallet_adapter, + _require_cloud_wallet_config, + _resolve_cloud_wallet_asset_id, +) +from greenfloor.config.io import load_program_config # noqa: E402 + + +def _graphql_with_retry( + *, wallet: Any, query: str, variables: dict[str, Any], retries: int = 4 +) -> dict[str, Any]: + last_error: Exception | None = None + for attempt in range(1, retries + 1): + try: + return wallet._graphql(query=query, variables=variables) + except Exception as err: # pragma: no cover - defensive around remote API instability + last_error = err + if attempt == retries: + raise + time.sleep(0.3 * attempt) + if last_error: + raise last_error + return {} + + +def _wallet_asset_rows(*, wallet: Any) -> list[dict[str, Any]]: + query = """ +query walletAssetAmounts($walletId: ID!, $first: Int) { + wallet(id: $walletId) { + assets(first: $first) { + edges { + node { + assetId + totalAmount + spendableAmount + lockedAmount + } + } + } + } +} +""" + payload = _graphql_with_retry( + wallet=wallet, + query=query, + variables={"walletId": wallet.vault_id, "first": 100}, + ) + edges = ((payload.get("wallet") or {}).get("assets") or {}).get("edges") or [] + rows: list[dict[str, Any]] = [] + for edge in edges: + node = edge.get("node") if isinstance(edge, dict) else None + if not isinstance(node, dict): + continue + rows.append( + { + "asset_id": str(node.get("assetId", "")).strip(), + "total": int(node.get("totalAmount", 0) or 0), + "spendable": int(node.get("spendableAmount", 0) or 0), + "locked": int(node.get("lockedAmount", 0) or 0), + } + ) + return rows + + +def _coins_summary(*, wallet: Any, asset_id: str) -> dict[str, int]: + coins = wallet.list_coins(asset_id=asset_id, include_pending=True) + settled = 0 + pending = 0 + spendable = 0 + total_items = 0 + for coin in coins: + amount = int(coin.get("amount", 0)) + state = str(coin.get("state", "")).strip().upper() + total_items += amount + if state == "SETTLED": + settled += amount + if state == "PENDING": + pending += amount + if not bool(coin.get("isLocked", False)) and state in {"SETTLED", "CONFIRMED", "UNSPENT"}: + spendable += amount + return { + "coin_count": len(coins), + "items_total": total_items, + "settled": settled, + "pending": pending, + "spendable_estimate": spendable, + } + + +def _fetch_creator_offers(*, wallet: Any) -> list[dict[str, Any]]: + query = """ +query walletOffers($walletId: ID!, $first: Int, $after: String) { + wallet(id: $walletId) { + offers(first: $first, after: $after, isCreator: true) { + pageInfo { + hasNextPage + endCursor + } + edges { + node { + id + state + createdAt + assets(first: 10) { + edges { + node { + amount + type + asset { + id + } + } + } + } + } + } + } + } +} +""" + after: str | None = None + offers: list[dict[str, Any]] = [] + for _ in range(64): + payload = _graphql_with_retry( + wallet=wallet, + query=query, + variables={"walletId": wallet.vault_id, "first": 100, "after": after}, + ) + offers_payload = (payload.get("wallet") or {}).get("offers") or {} + edges = offers_payload.get("edges") or [] + for edge in edges: + node = edge.get("node") if isinstance(edge, dict) else None + if isinstance(node, dict): + offers.append(node) + page_info = offers_payload.get("pageInfo") or {} + if not bool(page_info.get("hasNextPage", False)): + break + after_val = page_info.get("endCursor") + if not isinstance(after_val, str) or not after_val: + break + after = after_val + return offers + + +def _classify_offer( + *, + offer: dict[str, Any], + byc_asset_id: str, + quote_asset_id: str, +) -> tuple[str, int, int] | None: + legs = [] + for edge in (offer.get("assets") or {}).get("edges") or []: + node = edge.get("node") if isinstance(edge, dict) else None + if not isinstance(node, dict): + continue + asset = node.get("asset") or {} + if not isinstance(asset, dict): + continue + legs.append( + ( + str(asset.get("id", "")).strip(), + str(node.get("type", "")).strip().upper(), + int(node.get("amount", 0) or 0), + ) + ) + if not legs: + return None + legmap = {(asset_id, leg_type): amount for asset_id, leg_type, amount in legs} + if (byc_asset_id, "OFFERED") in legmap and (quote_asset_id, "REQUESTED") in legmap: + return ("sell", legmap[(byc_asset_id, "OFFERED")], legmap[(quote_asset_id, "REQUESTED")]) + if (quote_asset_id, "OFFERED") in legmap and (byc_asset_id, "REQUESTED") in legmap: + return ("buy", legmap[(byc_asset_id, "REQUESTED")], legmap[(quote_asset_id, "OFFERED")]) + return None + + +def _to_units(value: int) -> str: + return f"{value / 1000:.3f}" + + +def main() -> int: + parser = argparse.ArgumentParser(description="Reconcile BYC/wUSDC balances and offer ledger.") + parser.add_argument( + "--program-config", + default=str(Path("~/.greenfloor/config/program.yaml").expanduser()), + help="Path to program.yaml", + ) + parser.add_argument("--vault-id", default="", help="Optional Cloud Wallet vault override") + parser.add_argument("--byc", default="BYC", help="BYC asset reference (default: BYC)") + parser.add_argument( + "--quote", default="wUSDC.b", help="Quote asset reference (default: wUSDC.b)" + ) + parser.add_argument("--json", action="store_true", help="Output JSON report") + args = parser.parse_args() + + program = load_program_config(Path(args.program_config)) + wallet = _new_cloud_wallet_adapter(program) + if args.vault_id.strip() and args.vault_id.strip() != wallet.vault_id: + cfg = _require_cloud_wallet_config(program) + cfg = cfg.__class__( + base_url=cfg.base_url, + user_key_id=cfg.user_key_id, + private_key_pem_path=cfg.private_key_pem_path, + vault_id=args.vault_id.strip(), + network=cfg.network, + kms_key_id=cfg.kms_key_id, + kms_region=cfg.kms_region, + kms_public_key_hex=cfg.kms_public_key_hex, + ) + from greenfloor.adapters.cloud_wallet import ( + CloudWalletAdapter, # local import to avoid script startup side effects + ) + + wallet = CloudWalletAdapter(cfg) + + byc_asset_id = _resolve_cloud_wallet_asset_id( + wallet=wallet, + canonical_asset_id=args.byc, + symbol_hint=args.byc, + ) + quote_asset_id = _resolve_cloud_wallet_asset_id( + wallet=wallet, + canonical_asset_id=args.quote, + symbol_hint=args.quote, + ) + + asset_rows = _wallet_asset_rows(wallet=wallet) + asset_map = {row["asset_id"]: row for row in asset_rows} + byc_asset = asset_map.get(byc_asset_id, {"total": 0, "spendable": 0, "locked": 0}) + quote_asset = asset_map.get(quote_asset_id, {"total": 0, "spendable": 0, "locked": 0}) + byc_coins = _coins_summary(wallet=wallet, asset_id=byc_asset_id) + quote_coins = _coins_summary(wallet=wallet, asset_id=quote_asset_id) + + offers = _fetch_creator_offers(wallet=wallet) + settled = {"buy_count": 0, "sell_count": 0, "byc_mojos": 0, "quote_mojos": 0} + open_offers = {"buy_count": 0, "sell_count": 0, "byc_mojos": 0, "quote_mojos": 0} + matched_offers = 0 + for offer in offers: + classified = _classify_offer( + offer=offer, + byc_asset_id=byc_asset_id, + quote_asset_id=quote_asset_id, + ) + if classified is None: + continue + matched_offers += 1 + side, byc_mojos, quote_mojos = classified + state = str(offer.get("state", "")).strip().upper() + bucket = settled if state == "SETTLED" else open_offers if state == "OPEN" else None + if bucket is None: + continue + bucket[f"{side}_count"] += 1 + bucket["byc_mojos"] += byc_mojos if side == "buy" else -byc_mojos + bucket["quote_mojos"] += -quote_mojos if side == "buy" else quote_mojos + + ui_total = int(byc_asset["total"]) + int(quote_asset["total"]) + report = { + "vault_id": wallet.vault_id, + "resolved_assets": {"byc": byc_asset_id, "quote": quote_asset_id}, + "wallet_assets": { + "byc": byc_asset, + "quote": quote_asset, + }, + "coin_state": { + "byc": byc_coins, + "quote": quote_coins, + }, + "offers": { + "fetched_creator_offers": len(offers), + "matched_byc_quote_offers": matched_offers, + "settled": settled, + "open": open_offers, + }, + "derived": { + "ui_total_mojos": ui_total, + "ui_total_units": _to_units(ui_total), + "ui_plus_byc_pending_mojos": ui_total + int(byc_coins["pending"]), + "ui_plus_byc_pending_units": _to_units(ui_total + int(byc_coins["pending"])), + "settled_net_quote_mojos": int(settled["quote_mojos"]), + "settled_net_quote_units": _to_units(int(settled["quote_mojos"])), + "settled_net_byc_mojos": int(settled["byc_mojos"]), + "settled_net_byc_units": _to_units(int(settled["byc_mojos"])), + }, + } + + if args.json: + print(json.dumps(report, indent=2, sort_keys=True)) + return 0 + + print(f"vault_id: {report['vault_id']}") + print(f"assets: BYC={byc_asset_id} QUOTE={quote_asset_id}") + print() + print("wallet assets (mojos / units):") + print( + f" BYC total={byc_asset['total']} ({_to_units(int(byc_asset['total']))})" + f" spendable={byc_asset['spendable']} ({_to_units(int(byc_asset['spendable']))})" + f" locked={byc_asset['locked']} ({_to_units(int(byc_asset['locked']))})" + ) + print( + f" QUOTE total={quote_asset['total']} ({_to_units(int(quote_asset['total']))})" + f" spendable={quote_asset['spendable']} ({_to_units(int(quote_asset['spendable']))})" + f" locked={quote_asset['locked']} ({_to_units(int(quote_asset['locked']))})" + ) + print() + print("coin state sums (from list_coins):") + print( + f" BYC settled={byc_coins['settled']} ({_to_units(byc_coins['settled'])})" + f" pending={byc_coins['pending']} ({_to_units(byc_coins['pending'])})" + f" item_sum={byc_coins['items_total']} ({_to_units(byc_coins['items_total'])})" + ) + print( + f" QUOTE settled={quote_coins['settled']} ({_to_units(quote_coins['settled'])})" + f" pending={quote_coins['pending']} ({_to_units(quote_coins['pending'])})" + f" item_sum={quote_coins['items_total']} ({_to_units(quote_coins['items_total'])})" + ) + print() + print("offer ledger (creator offers, BYC<->QUOTE only):") + print( + f" settled: buy_count={settled['buy_count']} sell_count={settled['sell_count']}" + f" net_byc={settled['byc_mojos']} ({_to_units(settled['byc_mojos'])})" + f" net_quote={settled['quote_mojos']} ({_to_units(settled['quote_mojos'])})" + ) + print( + f" open: buy_count={open_offers['buy_count']} sell_count={open_offers['sell_count']}" + f" net_byc={open_offers['byc_mojos']} ({_to_units(open_offers['byc_mojos'])})" + f" net_quote={open_offers['quote_mojos']} ({_to_units(open_offers['quote_mojos'])})" + ) + print() + print( + f"derived: ui_total={ui_total} ({_to_units(ui_total)})" + f" ui_plus_byc_pending={ui_total + int(byc_coins['pending'])}" + f" ({_to_units(ui_total + int(byc_coins['pending']))})" + ) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/tests/test_cloud_wallet_offer_runtime.py b/tests/test_cloud_wallet_offer_runtime.py index 6743749..1ba1b2b 100644 --- a/tests/test_cloud_wallet_offer_runtime.py +++ b/tests/test_cloud_wallet_offer_runtime.py @@ -1,11 +1,14 @@ from __future__ import annotations from pathlib import Path -from typing import cast +from typing import Any, cast from greenfloor.adapters.cloud_wallet import CloudWalletAdapter from greenfloor.cloud_wallet_offer_runtime import ( build_and_post_offer_cloud_wallet, + cloud_wallet_create_offer_phase, + cloud_wallet_post_offer_phase, + is_transient_dexie_visibility_404_error, resolve_cloud_wallet_offer_asset_ids, ) @@ -201,3 +204,84 @@ class _Wallet: assert payload["built_offers_preview"] == [ {"offer_prefix": "offer1runtime", "offer_length": str(len("offer1runtime"))} ] + + +def test_cloud_wallet_post_offer_phase_tolerates_transient_dexie_404_visibility() -> None: + class _Dexie: + pass + + result = cloud_wallet_post_offer_phase( + publish_venue="dexie", + dexie=cast(Any, _Dexie()), + splash=None, + offer_text="offer1abc", + drop_only=True, + claim_rewards=False, + market=object(), + expected_offered_asset_id="asset_a", + expected_offered_symbol="A", + expected_requested_asset_id="asset_b", + expected_requested_symbol="B", + post_dexie_offer_with_invalid_offer_retry_fn=lambda **_kwargs: { + "success": True, + "id": "offer-123", + }, + verify_dexie_offer_visible_by_id_fn=lambda **_kwargs: ( + "dexie_get_offer_error:HTTP Error 404: Not Found" + ), + ) + + assert result["success"] is False + assert "dexie_get_offer_error:HTTP Error 404: Not Found" in str(result["error"]) + + +def test_is_transient_dexie_visibility_404_error_matches_common_404_shapes() -> None: + assert is_transient_dexie_visibility_404_error( + "dexie_get_offer_error:HTTP Error 404: Not Found" + ) + assert is_transient_dexie_visibility_404_error("dexie_http_error:404") + assert not is_transient_dexie_visibility_404_error("dexie_network_error:timed out") + + +def test_cloud_wallet_create_offer_phase_rejects_insufficient_spendable_balance() -> None: + class _Wallet: + vault_id = "wallet-1" + network = "mainnet" + + @staticmethod + def list_coins(*, asset_id=None, include_pending=True): + _ = asset_id, include_pending + return [ + {"id": "coin-a", "amount": 10_000, "state": "SETTLED"}, + {"id": "coin-b", "amount": 10_000, "state": "SETTLED"}, + ] + + @staticmethod + def create_offer(**_kwargs): + raise AssertionError("create_offer must not run when spendable balance is insufficient") + + class _Market: + pricing = { + "base_unit_mojo_multiplier": 1000, + "quote_unit_mojo_multiplier": 1_000_000_000_000, + } + + try: + cloud_wallet_create_offer_phase( + wallet=cast(CloudWalletAdapter, _Wallet()), + market=_Market(), + size_base_units=50, + quote_price=2.94117647, + resolved_base_asset_id="Asset_base", + resolved_quote_asset_id="Asset_quote", + offer_fee_mojos=0, + split_input_coins_fee=0, + expiry_unit="minutes", + expiry_value=10, + action_side="sell", + wallet_get_wallet_offers_fn=lambda *_args, **_kwargs: {"offers": []}, + poll_signature_request_until_not_unsigned_fn=lambda **_kwargs: ("SUBMITTED", []), + ) + raise AssertionError("expected insufficient spendable balance error") + except RuntimeError as exc: + assert "cloud_wallet_offer_insufficient_spendable_balance" in str(exc) diff --git a/tests/test_config_models.py b/tests/test_config_models.py index a78ba4e..e459afe 100644 --- a/tests/test_config_models.py +++ b/tests/test_config_models.py @@ -203,6 +203,14 @@ def test_parse_markets_config_defaults_cat_unit_multipliers_to_1000() -> None: assert out.markets[0].pricing["quote_unit_mojo_multiplier"] == 1000 +def test_parse_markets_config_defaults_xch_quote_multiplier_to_one_trillion() -> None: + row = _base_market_row() + row["quote_asset"] = "xch" + out = parse_markets_config({"markets": [row]}) + assert out.markets[0].pricing["base_unit_mojo_multiplier"] == 1000 + assert out.markets[0].pricing["quote_unit_mojo_multiplier"] == 1_000_000_000_000 + + def test_parse_markets_config_rejects_noncanonical_cat_base_multiplier() -> None: row = _base_market_row() row["base_asset"] = "BYC" diff --git a/tests/test_daemon_offer_execution.py b/tests/test_daemon_offer_execution.py index 5e6831f..f27ca2a 100644 --- a/tests/test_daemon_offer_execution.py +++ b/tests/test_daemon_offer_execution.py @@ -736,6 +736,99 @@ def test_active_offer_counts_by_size_foreign_offer_stays_unmapped() -> None: assert unmapped == 1, "Foreign offer must stay unmapped, not inflate the count" +def test_active_offer_counts_by_size_tracks_non_legacy_size() -> None: + store = _FakeStore() + now = datetime.now(UTC) + store.offer_states = [ + {"offer_id": "ours-50", "market_id": "m1", "state": "open"}, + ] + store.audit_events = [ + { + "event_type": "strategy_offer_execution", + "market_id": "m1", + "payload": {"items": [{"offer_id": "ours-50", "size": 50, "status": "executed"}]}, + } + ] + counts, _, unmapped = _active_offer_counts_by_size( + store=cast(Any, store), + market_id="m1", + clock=now, + tracked_sizes={1, 10, 50}, + ) + assert counts == {1: 0, 10: 0, 50: 1} + assert unmapped == 0 + + +def test_active_offer_counts_excludes_stale_pending_visibility_offer() -> None: + store = _FakeStore() + now = datetime.now(UTC) + stale_created_at = (now - timedelta(minutes=5)).isoformat() + store.offer_states = [ + {"offer_id": "pending-50", "market_id": "m1", "state": "open"}, + ] + store.audit_events = [ + { + "event_type": "strategy_offer_execution", + "market_id": "m1", + "created_at": stale_created_at, + "payload": { + "items": [ + { + "offer_id": "pending-50", + "size": 50, + "status": "executed", + "reason": "cloud_wallet_post_success_dexie_visibility_pending", + } + ] + }, + } + ] + counts, _, unmapped = _active_offer_counts_by_size( + store=cast(Any, store), + market_id="m1", + clock=now, + dexie_size_by_offer_id={}, + tracked_sizes={50}, + ) + assert counts == {50: 0} + assert unmapped == 1 + + +def test_active_offer_counts_keeps_pending_visibility_offer_when_seen_on_dexie() -> None: + store = _FakeStore() + now = datetime.now(UTC) + stale_created_at = (now - timedelta(minutes=5)).isoformat() + store.offer_states = [ + {"offer_id": "pending-50", "market_id": "m1", "state": "open"}, + ] + store.audit_events = [ + { + "event_type": "strategy_offer_execution", + "market_id": "m1", + "created_at": stale_created_at, + "payload": { + "items": [ + { + "offer_id": "pending-50", + "size": 50, + "status": "executed", + "reason": "cloud_wallet_post_success_dexie_visibility_pending", + } + ] + }, + } + ] + counts, _, unmapped = _active_offer_counts_by_size( + store=cast(Any, store), + market_id="m1", + clock=now, + dexie_size_by_offer_id={"pending-50": 50}, + tracked_sizes={50}, + ) + assert counts == {50: 1} + assert unmapped == 0 + + def test_match_watched_coin_ids_returns_empty_without_overlap() -> None: _set_watched_coin_ids_for_market(market_id="m-empty", coin_ids={"c" * 64}) assert _match_watched_coin_ids(observed_coin_ids=["d" * 64]) == {} @@ -820,7 +913,11 @@ class _Program: cloud_wallet_private_key_pem_path = "~/.greenfloor/keys/cloud-wallet-user-auth-key.pem" cloud_wallet_vault_id = "Wallet_abc" - dexie = _FakeDexie(post_result={"success": True, "id": "offer-1"}) + class _DexieNon404: + def get_offer(self, offer_id: str) -> dict[str, Any]: + _ = offer_id + raise RuntimeError("dexie_http_error:500") + store = _FakeStore() actions = [ PlannedAction( @@ -839,7 +936,7 @@ class _Program: strategy_actions=actions, runtime_dry_run=False, xch_price_usd=30.0, - dexie=cast(Any, dexie), + dexie=cast(Any, _DexieNon404()), store=cast(Any, store), publish_venue="dexie", program=_Program(), @@ -850,6 +947,57 @@ class _Program: assert "cloud_wallet_post_not_visible_on_dexie" in result["items"][0]["reason"] +def test_execute_strategy_actions_cloud_wallet_accepts_transient_dexie_http_404( + monkeypatch, +) -> None: + daemon_main._POST_COOLDOWN_UNTIL.clear() + monkeypatch.setattr( + daemon_main, + "_cloud_wallet_offer_post_fallback", + lambda **_kwargs: {"success": True, "offer_id": "offer-fallback-pending"}, + ) + + class _Program: + cloud_wallet_base_url = "https://api.vault.chia.net" + cloud_wallet_user_key_id = "UserAuthKey_abc" + cloud_wallet_private_key_pem_path = "~/.greenfloor/keys/cloud-wallet-user-auth-key.pem" + cloud_wallet_vault_id = "Wallet_abc" + + class _Dexie404: + def get_offer(self, offer_id: str) -> dict[str, Any]: + _ = offer_id + raise RuntimeError("HTTP Error 404: Not Found") + + store = _FakeStore() + actions = [ + PlannedAction( + size=50, + repeat=1, + pair="usdc", + expiry_unit="hours", + expiry_value=8, + cancel_after_create=True, + reason="offer_size_gap_reseed", + ) + ] + + result = _execute_strategy_actions( + market=_market(), + strategy_actions=actions, + runtime_dry_run=False, + xch_price_usd=30.0, + dexie=cast(Any, _Dexie404()), + store=cast(Any, store), + publish_venue="dexie", + program=_Program(), + ) + + assert result["executed_count"] == 0 + assert result["items"][0]["status"] == "skipped" + assert "cloud_wallet_post_not_visible_on_dexie:" in str(result["items"][0]["reason"]) + assert result["items"][0]["offer_id"] == "offer-fallback-pending" + + def test_execute_strategy_actions_posts_larger_sizes_first(monkeypatch) -> None: daemon_main._POST_COOLDOWN_UNTIL.clear() seen_sizes: list[int] = [] @@ -2283,8 +2431,8 @@ def list_coins(self, *, asset_id: str | None = None, include_pending: bool = Tru for idx in range(89) ] return [ - {"id": "big-a", "amount": 1100, "state": "SETTLED", "asset": None}, - {"id": "big-b", "amount": 1100, "state": "SETTLED", "asset": None}, + {"id": "big-a", "amount": 2500, "state": "SETTLED", "asset": None}, + {"id": "big-b", "amount": 2500, "state": "SETTLED", "asset": None}, {"id": "stray-310", "amount": 310, "state": "SETTLED", "asset": None}, *dust_rows, ] @@ -2328,7 +2476,7 @@ def combine_coins( market = _market() market.base_asset = "BYC" - market.pricing = {"fixed_quote_per_base": 1.0, "base_unit_mojo_multiplier": 30} + market.pricing = {"fixed_quote_per_base": 1.0, "base_unit_mojo_multiplier": 100} result = _execute_coin_ops_cloud_wallet_kms_only( market=market, program=_Program(), @@ -2341,7 +2489,7 @@ def combine_coins( assert len(fake.combine_calls) == 1 assert fake.combine_calls[0]["number_of_coins"] == 2 assert fake.combine_calls[0]["input_coin_ids"] == ["big-a", "big-b"] - assert fake.combine_calls[0]["target_amount"] == 1200 + assert fake.combine_calls[0]["target_amount"] == 4000 assert result["executed_count"] == 1 assert ( result["items"][0]["reason"] @@ -2349,6 +2497,70 @@ def combine_coins( ) +def test_execute_coin_ops_cloud_wallet_kms_only_split_rejects_sub_minimum_cat_outputs( + monkeypatch, +) -> None: + class _Program: + runtime_dry_run = False + app_network = "mainnet" + cloud_wallet_base_url = "https://wallet.example" + cloud_wallet_user_key_id = "user-key" + cloud_wallet_private_key_pem_path = "/tmp/key.pem" + cloud_wallet_vault_id = "vault-1" + cloud_wallet_kms_key_id = "kms-key" + coin_ops_split_fee_mojos = 0 + coin_ops_combine_fee_mojos = 0 + + class _Signer: + key_id = "key-main-2" + + class _FakeCloudWallet: + def list_coins(self, *, asset_id: str | None = None, include_pending: bool = True): + _ = asset_id, include_pending + return [ + { + "id": "coin-big", + "amount": 100_000, + "state": "SETTLED", + "asset": {"id": "Asset_byc"}, + }, + ] + + def split_coins(self, *, coin_ids, amount_per_coin, number_of_coins, fee): + raise AssertionError("split_coins should not be called for sub-minimum CAT outputs") + + monkeypatch.setattr( + daemon_main, + "_new_cloud_wallet_adapter_for_daemon", + lambda _program: _FakeCloudWallet(), + ) + monkeypatch.setattr( + daemon_main, + "_resolve_cloud_wallet_offer_asset_ids_for_reservation", + lambda **_kwargs: ("Asset_byc", "Asset_usdc", "Asset_xch"), + ) + + from greenfloor.core.coin_ops import CoinOpPlan + + market = _market() + market.base_asset = "BYC" + market.pricing = {"fixed_quote_per_base": 1.0, "base_unit_mojo_multiplier": 1} + result = _execute_coin_ops_cloud_wallet_kms_only( + market=market, + program=_Program(), + plans=[CoinOpPlan(op_type="split", size_base_units=1, op_count=4, reason="r")], + wallet=cast(Any, object()), + signer_selection=_Signer(), + state_dir=Path("/tmp"), + ) + + assert result["executed_count"] == 0 + assert result["items"][0]["status"] == "skipped" + assert result["items"][0]["reason"] == "split_amount_below_coin_op_minimum" + assert result["items"][0]["data"]["amount_per_coin_mojos"] == 1 + assert result["items"][0]["data"]["minimum_allowed_mojos"] == 1000 + + def test_execute_coin_ops_cloud_wallet_kms_only_skips_single_output_split( monkeypatch, ) -> None: diff --git a/tests/test_daemon_strategy_integration.py b/tests/test_daemon_strategy_integration.py index 64315cc..f4da282 100644 --- a/tests/test_daemon_strategy_integration.py +++ b/tests/test_daemon_strategy_integration.py @@ -62,6 +62,35 @@ def test_strategy_config_from_market_uses_sell_ladder_targets() -> None: assert cfg.ones_target == 7 assert cfg.tens_target == 3 assert cfg.hundreds_target == 2 + assert cfg.target_counts_by_size == {1: 7, 10: 3, 100: 2} + + +def test_strategy_config_from_market_tracks_non_legacy_ladder_sizes() -> None: + market = _market_with_quote("xch") + market.ladders = { + "sell": [ + MarketLadderEntry( + size_base_units=1, + target_count=5, + split_buffer_count=1, + combine_when_excess_factor=2.0, + ), + MarketLadderEntry( + size_base_units=10, + target_count=2, + split_buffer_count=1, + combine_when_excess_factor=2.0, + ), + MarketLadderEntry( + size_base_units=50, + target_count=1, + split_buffer_count=0, + combine_when_excess_factor=2.0, + ), + ] + } + cfg = _strategy_config_from_market(market) + assert cfg.target_counts_by_size == {1: 5, 10: 2, 50: 1} def test_strategy_config_from_market_reads_configurable_price_bands_and_spread() -> None: diff --git a/tests/test_manager_post_offer.py b/tests/test_manager_post_offer.py index 4c2d7ef..420855b 100644 --- a/tests/test_manager_post_offer.py +++ b/tests/test_manager_post_offer.py @@ -1714,6 +1714,59 @@ def decode_offer(_offer: str): assert _verify_offer_text_for_dexie("offer1noexpiry") == "wallet_sdk_offer_missing_expiration" +def test_verify_offer_text_for_dexie_rejects_duplicate_spent_coin_ids( + monkeypatch, +) -> None: + def _import_module(name: str): + if name == "greenfloor_native": + raise ImportError("disable native path for this test") + return __import__(name) + + monkeypatch.setattr("greenfloor.cli.manager.importlib.import_module", _import_module) + + class _ConditionWithExpiry: + @staticmethod + def parse_assert_before_height_absolute(): + return object() + + class _Coin: + def __init__(self, coin_id: str): + self._coin_id = coin_id + + def coin_id(self): + return self._coin_id + + class _CoinSpend: + def __init__(self, coin_id: str): + self.coin = _Coin(coin_id) + + @staticmethod + def conditions(): + return [_ConditionWithExpiry()] + + class _SpendBundleWithDuplicates: + coin_spends = [_CoinSpend("aa" * 32), _CoinSpend("aa" * 32)] + + class _Sdk: + @staticmethod + def validate_offer(_offer: str) -> None: + return None + + @staticmethod + def decode_offer(_offer: str): + return _SpendBundleWithDuplicates() + + @staticmethod + def to_hex(value): + return str(value) + + monkeypatch.setitem(sys.modules, "chia_wallet_sdk", _Sdk) + assert ( + _verify_offer_text_for_dexie("offer1duplicate") + == "wallet_sdk_offer_duplicate_spent_coin_ids" + ) + + def test_verify_offer_text_for_dexie_uses_greenfloor_native_before_sdk(monkeypatch) -> None: calls = {} @@ -1746,6 +1799,54 @@ def validate_offer(_offer: str) -> None: ) +def test_verify_offer_text_for_dexie_checks_duplicate_spends_after_native_validation( + monkeypatch, +) -> None: + class _Native: + @staticmethod + def validate_offer(_offer: str) -> None: + return None + + class _ConditionWithExpiry: + @staticmethod + def parse_assert_before_height_absolute(): + return object() + + class _Coin: + def __init__(self, coin_id: str): + self._coin_id = coin_id + + def coin_id(self): + return self._coin_id + + class _CoinSpend: + def __init__(self, coin_id: str): + self.coin = _Coin(coin_id) + + @staticmethod + def conditions(): + return [_ConditionWithExpiry()] + + class _SpendBundleWithDuplicates: + coin_spends = [_CoinSpend("bb" * 32), _CoinSpend("bb" * 32)] + + class _Sdk: + @staticmethod + def decode_offer(_offer: str): + return _SpendBundleWithDuplicates() + + @staticmethod + def to_hex(value): + return str(value) + + monkeypatch.setitem(sys.modules, "greenfloor_native", _Native) + monkeypatch.setitem(sys.modules, "chia_wallet_sdk", _Sdk) + assert ( + _verify_offer_text_for_dexie("offer1native-dupe") + == "wallet_sdk_offer_duplicate_spent_coin_ids" + ) + + def test_coins_list_returns_minimal_fields(monkeypatch, tmp_path: Path, capsys) -> None: program = tmp_path / "program.yaml" _write_program_with_cloud_wallet(program) @@ -3150,6 +3251,60 @@ def list_coins(*, include_pending=True, asset_id=None): assert payload["unknown_coin_ids"] == ["missing-coin-name"] +def test_coin_combine_rejects_mixed_asset_coin_ids_before_api_call( + monkeypatch, tmp_path: Path, capsys +) -> None: + program = tmp_path / "program.yaml" + markets = tmp_path / "markets.yaml" + _write_program_with_cloud_wallet(program) + _write_markets(markets) + + class _FakeWallet: + vault_id = "wallet-1" + + def __init__(self, _config): + pass + + @staticmethod + def list_coins(*, include_pending=True, asset_id=None): + _ = include_pending, asset_id + return [ + {"id": "Coin_xch", "name": "coin-xch", "asset": {"id": "xch"}}, + {"id": "Coin_cat", "name": "coin-cat", "asset": {"id": "Asset_cat"}}, + ] + + @staticmethod + def combine_coins(*, number_of_coins, fee, largest_first, asset_id, input_coin_ids=None): + _ = number_of_coins, fee, largest_first, asset_id, input_coin_ids + raise AssertionError("combine_coins should not be called for mixed assets") + + monkeypatch.setattr("greenfloor.cli.manager.CloudWalletAdapter", _FakeWallet) + monkeypatch.setattr( + "greenfloor.cli.manager._resolve_taker_or_coin_operation_fee", + lambda *, network, minimum_fee_mojos=0: (0, "config_minimum_fee_fallback"), + ) + code = _coin_combine( + program_path=program, + markets_path=markets, + network="mainnet", + market_id="m1", + pair=None, + number_of_coins=2, + asset_id="xch", + coin_ids=["coin-xch", "coin-cat"], + no_wait=True, + ) + assert code == 2 + payload = json.loads(capsys.readouterr().out.strip()) + assert payload["success"] is False + assert payload["error"] == "coin_id_asset_mismatch" + assert payload["resolved_asset_id"] == "xch" + assert payload["mismatched_coin_ids"] == ["Coin_cat"] + assert payload["mismatched_coin_assets"] == [ + {"coin_id": "Coin_cat", "coin_asset_id": "asset_cat"} + ] + + def test_coin_split_uses_market_ladder_target_when_size_is_provided( monkeypatch, tmp_path: Path, capsys ) -> None: diff --git a/tests/test_strategy.py b/tests/test_strategy.py index 854b3de..186b5ac 100644 --- a/tests/test_strategy.py +++ b/tests/test_strategy.py @@ -171,3 +171,22 @@ def test_evaluate_market_uses_configured_expiry_override() -> None: assert len(actions) == 1 assert actions[0].expiry_unit == "minutes" assert actions[0].expiry_value == 120 + + +def test_evaluate_market_respects_dynamic_target_sizes() -> None: + actions = evaluate_market( + state=MarketState( + ones=5, + tens=2, + hundreds=0, + xch_price_usd=30.0, + bucket_counts_by_size={1: 5, 10: 2, 50: 0}, + ), + config=StrategyConfig( + pair="xch", + target_counts_by_size={1: 5, 10: 2, 50: 1}, + ), + clock=_clock(), + ) + assert [action.size for action in actions] == [50] + assert [action.repeat for action in actions] == [1] From f6d75019c067e744bd6b7c87ff532b7fd5696518 Mon Sep 17 00:00:00 2001 From: Gene Hoffman Date: Tue, 10 Mar 2026 19:33:02 -0700 Subject: [PATCH 03/12] fix: derive offer expiry from coin spend execution Use one canonical SDK parsing path for offer expiry checks by evaluating each coin spend puzzle/solution and scanning resulting conditions for ASSERT_BEFORE constraints. This removes the legacy direct-conditions fallback that misclassified valid offers on current SDK bindings. Made-with: Cursor --- greenfloor/cloud_wallet_offer_runtime.py | 50 +++++++++-- tests/test_manager_post_offer.py | 101 ++++++++++++++++++++++- 2 files changed, 140 insertions(+), 11 deletions(-) diff --git a/greenfloor/cloud_wallet_offer_runtime.py b/greenfloor/cloud_wallet_offer_runtime.py index 2b62b15..bf154f0 100644 --- a/greenfloor/cloud_wallet_offer_runtime.py +++ b/greenfloor/cloud_wallet_offer_runtime.py @@ -99,18 +99,54 @@ def _offer_has_expiration_condition(sdk: object, offer_text: str) -> bool: spend_bundle = decode_offer(offer_text) coin_spends = getattr(spend_bundle, "coin_spends", None) or [] for coin_spend in coin_spends: - conditions_fn = getattr(coin_spend, "conditions", None) - if not callable(conditions_fn): - continue - conditions = conditions_fn() or [] - if not isinstance(conditions, list): - continue - for condition in conditions: + for condition in _extract_offer_conditions_from_coin_spend(sdk, coin_spend): if _condition_has_offer_expiration(condition): return True return False +def _extract_offer_conditions_from_coin_spend(sdk: object, coin_spend: object) -> list[object]: + # Derive conditions from CLVM execution of puzzle reveal + solution. + clvm_cls = getattr(sdk, "Clvm", None) + if not callable(clvm_cls): + return [] + puzzle_reveal = getattr(coin_spend, "puzzle_reveal", None) + solution = getattr(coin_spend, "solution", None) + if not isinstance(puzzle_reveal, bytes | bytearray | memoryview) or not isinstance( + solution, bytes | bytearray | memoryview + ): + return [] + + try: + clvm = clvm_cls() + deserialize_fn = getattr(clvm, "deserialize", None) + if not callable(deserialize_fn): + return [] + puzzle_program = deserialize_fn(bytes(puzzle_reveal)) + solution_program = deserialize_fn(bytes(solution)) + run_fn = getattr(puzzle_program, "run", None) + if not callable(run_fn): + return [] + run_output = run_fn(solution_program, 1_000_000_000_000, True) + value = getattr(run_output, "value", None) + if value is None: + return [] + to_list_fn = getattr(value, "to_list", None) + if callable(to_list_fn): + parsed = to_list_fn() or [] + if isinstance(parsed, collections.abc.Iterable) and not isinstance( + parsed, bytes | bytearray | str + ): + return list(parsed) + if isinstance(value, collections.abc.Iterable) and not isinstance( + value, bytes | bytearray | str + ): + return list(value) + except Exception: + return [] + return [] + + def _offer_has_duplicate_spent_coin_ids(sdk: object, offer_text: str) -> bool: decode_offer = getattr(sdk, "decode_offer", None) to_hex = getattr(sdk, "to_hex", None) diff --git a/tests/test_manager_post_offer.py b/tests/test_manager_post_offer.py index 420855b..e30b5b8 100644 --- a/tests/test_manager_post_offer.py +++ b/tests/test_manager_post_offer.py @@ -1610,15 +1610,34 @@ class _ConditionWithExpiry: def parse_assert_before_seconds_relative(): return object() - class _CoinSpendWithExpiry: + class _OutputValue: @staticmethod - def conditions(): + def to_list(): return [_ConditionWithExpiry()] + class _Output: + value = _OutputValue() + + class _Program: + @staticmethod + def run(_solution, _max_cost: int, _mempool_mode: bool): + return _Output() + + class _Clvm: + @staticmethod + def deserialize(_blob: bytes): + return _Program() + + class _CoinSpendWithExpiry: + puzzle_reveal = b"puzzle" + solution = b"solution" + class _SpendBundleWithExpiry: coin_spends = [_CoinSpendWithExpiry()] class _Sdk: + Clvm = _Clvm + @staticmethod def validate_offer(offer: str) -> None: assert offer == "offer1ok" @@ -1644,15 +1663,34 @@ class _ConditionWithExpiry: def parse_assert_before_height_absolute(): return object() - class _CoinSpendWithExpiry: + class _OutputValue: @staticmethod - def conditions(): + def to_list(): return [_ConditionWithExpiry()] + class _Output: + value = _OutputValue() + + class _Program: + @staticmethod + def run(_solution, _max_cost: int, _mempool_mode: bool): + return _Output() + + class _Clvm: + @staticmethod + def deserialize(_blob: bytes): + return _Program() + + class _CoinSpendWithExpiry: + puzzle_reveal = b"puzzle" + solution = b"solution" + class _SpendBundleWithExpiry: coin_spends = [_CoinSpendWithExpiry()] class _Sdk: + Clvm = _Clvm + @staticmethod def verify_offer(offer: str) -> bool: return offer == "offer1ok" @@ -1714,6 +1752,61 @@ def decode_offer(_offer: str): assert _verify_offer_text_for_dexie("offer1noexpiry") == "wallet_sdk_offer_missing_expiration" +def test_verify_offer_text_for_dexie_extracts_expiry_from_coin_spend_program( + monkeypatch, +) -> None: + def _import_module(name: str): + if name == "greenfloor_native": + raise ImportError("disable native path for this test") + return __import__(name) + + monkeypatch.setattr("greenfloor.cli.manager.importlib.import_module", _import_module) + + class _ConditionWithExpiry: + @staticmethod + def parse_assert_before_seconds_absolute(): + return object() + + class _OutputValue: + @staticmethod + def to_list(): + return [_ConditionWithExpiry()] + + class _Output: + value = _OutputValue() + + class _Program: + @staticmethod + def run(_solution, _max_cost: int, _mempool_mode: bool): + return _Output() + + class _Clvm: + @staticmethod + def deserialize(_blob: bytes): + return _Program() + + class _CoinSpend: + puzzle_reveal = b"puzzle" + solution = b"solution" + + class _SpendBundle: + coin_spends = [_CoinSpend()] + + class _Sdk: + Clvm = _Clvm + + @staticmethod + def validate_offer(_offer: str) -> None: + return None + + @staticmethod + def decode_offer(_offer: str): + return _SpendBundle() + + monkeypatch.setitem(sys.modules, "chia_wallet_sdk", _Sdk) + assert _verify_offer_text_for_dexie("offer1ok") is None + + def test_verify_offer_text_for_dexie_rejects_duplicate_spent_coin_ids( monkeypatch, ) -> None: From 486759166f50053d754a4159d2b4db1163ba3e29 Mon Sep 17 00:00:00 2001 From: Gene Hoffman Date: Tue, 10 Mar 2026 20:03:30 -0700 Subject: [PATCH 04/12] Eliminate code duplication and complete pending-visibility mechanism - Move canonical_is_xch and default_mojo_multiplier_for_asset into hex_utils.py (single source of truth); remove the two divergent local copies from daemon/main.py and cloud_wallet_offer_runtime.py. The cloud_wallet_offer_runtime copy was missing "1" from the XCH symbol set, which would have produced the wrong 1000-mojo default multiplier. - Complete the pending-visibility write path: when Dexie visibility check returns a transient 404, store status=executed with reason= _PENDING_VISIBILITY_REASON so _is_stale_pending_visibility_offer can keep the offer in scope until the grace period expires. Previously is_transient_dexie_visibility_404_error was defined but never called. - Extract _normalize_target_counts helper in daemon/main.py to eliminate the duplicated dict comprehension in _strategy_config_from_market and _strategy_config_for_side. - Refactor DexieAdapter TTL cache into a _RowCache dataclass + shared _cached_fetch helper, removing the duplicated check/store logic from _fetch_token_rows and _fetch_ticker_rows. - Add _CloudWalletProgram, _ParallelCloudWalletProgram, and _CoinOpsProgram module-level stubs in test_daemon_offer_execution.py, replacing ~25 identical inner _Program class definitions with aliases. - Add missing tests: _is_stale_pending_visibility_offer with no Dexie snapshot, XchPriceProvider last-good-price fallback, and assert fallback adapter is never called when cloud wallet is healthy. - Simplify _effective_sell_bucket_counts_for_coin_ops tests to pass ladder entries directly instead of building full market objects. - Add defensive comments to the inner split/combine sub-minimum guards in _execute_coin_ops_cloud_wallet_kms_only explaining the outer vs inner validation boundary. Made-with: Cursor --- .tmp-fix-xch-pricing.bundle | Bin 0 -> 652488 bytes greenfloor/adapters/dexie.py | 96 +++--- greenfloor/cloud_wallet_offer_runtime.py | 28 +- greenfloor/daemon/main.py | 59 ++-- greenfloor/hex_utils.py | 20 +- tests/test_daemon_offer_execution.py | 342 +++++++--------------- tests/test_daemon_strategy_integration.py | 74 +---- tests/test_price_adapter.py | 45 ++- 8 files changed, 283 insertions(+), 381 deletions(-) create mode 100644 .tmp-fix-xch-pricing.bundle diff --git a/.tmp-fix-xch-pricing.bundle b/.tmp-fix-xch-pricing.bundle new file mode 100644 index 0000000000000000000000000000000000000000..2d7919f2b69bb8fa578ac4367548e68486c7c4d1 GIT binary patch literal 652488 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 Z!gs~SG?w4mbacw zR=V<%%#(R$lK5B2>uTEZ)K2g2QeG}~UCr)1Z{j6t=4qMx)Q14VsM6L(YdLq%JWpp_ zSnUD~x0T*>rMc2GZxfYgw%haxUg?Nem9A&rJ?4H$nGZyOkPd}lN*M|{A)%ovgqR{g zxll+2p$HAe5OJh^r71Ny3^lnwOj&iQ$gP|6kB2{}PT;gxI6QxB^7^o*)BB=3s=LA| zZL+HFH?etKC2^+9XsNrX-}b%xXOi+HoA|@)h_DQZES6$j=XqZ*nyirlht#zt48;fl&xE(Zn z+KBDaI7MA-gFGb(#|^V~iIRrAGQ+UPms8A}CJS*sCrZ@J_=Y8#F6T`%2(5>?#%!&FeEPN#_H^!;e>mn&PQ#ZBV zh}*_Vo=I(^BDaa`q9JdhRTb@WXy(;rGh|Ydt#nrBWw$#}o44+QYF+llHQaKOC9cT4 zV88c1W%@Q^nBUFB%Zgu$j!n|(9x5su!+m~W^?M>=f@*u zo{A*XQ9IX}yA|n5E;3xY({ZBrxA(dLa8d#MQ3_5=@ZXUDzCglBNVhJ{g?!HGeSTgf zrrUr1`u$-lPNDi|0kvF9l0I4hLRG*PEtB}sE&^JA6x1eJYxRP@WJ-3m_nf_O-~A2- zA-FoU9buqn+cD|(s2kaK6>P)oJpPjr2#gdIA;c(_1RCaJBLl#I`*F<-5xy}5YGa^Q zA%%fr7%Rd9;)5_e1vboX*nYMPvuu+&sY2;@VQH&2d&d*kph>v^%C`RzTmuhgE=Ckq>v(Ab*Gc-f< zN`rL zNZq?PAm$X;;4Ob2)o7vDItj9>?KT>07<05J`P@EN0_do>P_3_@iDgh~Re zfeExvq|}nCx54J$D%f~3?_!q8q5|SkExVR2NJ7`}0>CzM?a&&zc12thos8->kNR9! zAHmu__$AhU`}g5BGVQz1P9*p}iS!u^Uax#GWsH5S$k7+qIQ)tlKa6?1#NR9MQ$;MA z?(G`>`uzR!5_+E~r`4b{s`(Fgvw2;!+5vc+tybM`8@Cd^*HaACi`YQ4lI+Azl^}rY zxQXD@QRSpP1qu+i>I~tPFFtEVMR#+!cBy3SM(Dq3O-{pKxND zN|ZX|31yN?UG;i*ytN+M@Jd-{w*G&j0pVPz45;{L;LQ!j{cuIJRMm=2ZB*qZG(I_f z@$&5a)wk{C&c%M~W2XfiXspCmmW8OL%cI9>uB7lz3|oQ33-q7#;^a{;zI}Cm_VUH) z$@m}kqKAYzRq`ZcQ`Z94*sNtCET_84?1WB7xXa8|Ky*S&Sy=A%(n2?x*vO(_=XJlK zOMgN?hZA~lWS#%`kuGLa(nhURMY<}sbX3YpA}T_?8R#@zdCA|3<0OFG>c*rfUhZ6N zC&S@dHiZk$Cx~%q**W-bldo1+Gb*crB0C8VF9+TprM9|NMr5 zOo0Z2NP~e7WFQ-t`$Q#BjIlhR#Pl64jV{Sav%+ym9DSL8B+ILkD@RF^3?t(3⋙d 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

`+ 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≥1-g-mgb8};fExJv{w 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%0D3J#dGJN##7VwEF>D!GGU!M?Jzas@> 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

oap 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�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%0A1VjEFHfIc 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 T$7K#P9Z3kRg|Oi~<@)~s$vTph literal 0 HcmV?d00001 diff --git a/greenfloor/adapters/dexie.py b/greenfloor/adapters/dexie.py index 5be38c2..7c417b9 100644 --- a/greenfloor/adapters/dexie.py +++ b/greenfloor/adapters/dexie.py @@ -5,9 +5,36 @@ import urllib.error import urllib.parse import urllib.request +from dataclasses import dataclass, field from typing import Any +@dataclass +class _RowCache: + """Minimal TTL cache for a list of dict rows.""" + + ttl: int + _rows: list[dict] | None = field(default=None, init=False, repr=False) + _cached_at: float | None = field(default=None, init=False, repr=False) + + def get_if_fresh(self, now: float) -> list[dict] | None: + if ( + self._rows is not None + and self._cached_at is not None + and (now - self._cached_at) <= self.ttl + ): + return list(self._rows) + return None + + def store(self, rows: list[dict], now: float) -> list[dict]: + self._rows = list(rows) + self._cached_at = now + return list(rows) + + def stale(self) -> list[dict]: + return list(self._rows) if self._rows is not None else [] + + class DexieAdapter: def __init__( self, @@ -16,11 +43,9 @@ def __init__( cache_ttl_seconds: int = 900, ) -> None: self.base_url = base_url.rstrip("/") - self._cache_ttl_seconds = max(1, int(cache_ttl_seconds)) - self._token_rows_cache: list[dict] | None = None - self._token_rows_cached_at_epoch_s: float | None = None - self._ticker_rows_cache: list[dict] | None = None - self._ticker_rows_cached_at_epoch_s: float | None = None + ttl = max(1, int(cache_ttl_seconds)) + self._token_cache = _RowCache(ttl=ttl) + self._ticker_cache = _RowCache(ttl=ttl) def get_tokens(self) -> list[dict]: url = f"{self.base_url}/v1/swap/tokens" @@ -136,54 +161,35 @@ def lookup_token_by_symbol( return row return None - def _fetch_token_rows(self) -> list[dict]: + def _cached_fetch(self, cache: _RowCache, fetcher: Any) -> list[dict]: + """Fetch rows through *cache*, falling back to stale rows on error.""" now = time.time() - if ( - self._token_rows_cache is not None - and self._token_rows_cached_at_epoch_s is not None - and (now - self._token_rows_cached_at_epoch_s) <= self._cache_ttl_seconds - ): - return list(self._token_rows_cache) + fresh = cache.get_if_fresh(now) + if fresh is not None: + return fresh try: - rows = self.get_tokens() + rows = fetcher() except Exception: - if self._token_rows_cache is not None: - return list(self._token_rows_cache) - return [] - self._token_rows_cache = list(rows) - self._token_rows_cached_at_epoch_s = now - return list(rows) + return cache.stale() + return cache.store(rows, now) + + def _fetch_token_rows(self) -> list[dict]: + return self._cached_fetch(self._token_cache, self.get_tokens) def _fetch_ticker_rows(self) -> list[dict]: - now = time.time() - if ( - self._ticker_rows_cache is not None - and self._ticker_rows_cached_at_epoch_s is not None - and (now - self._ticker_rows_cached_at_epoch_s) <= self._cache_ttl_seconds - ): - return list(self._ticker_rows_cache) - url = f"{self.base_url}/v3/prices/tickers" - try: + def _fetch() -> list[dict]: + url = f"{self.base_url}/v3/prices/tickers" with urllib.request.urlopen(url, timeout=20) as resp: payload = json.loads(resp.read().decode("utf-8")) - except Exception: - if self._ticker_rows_cache is not None: - return list(self._ticker_rows_cache) + if isinstance(payload, list): + return [r for r in payload if isinstance(r, dict)] + if isinstance(payload, dict): + tickers = payload.get("tickers") + if isinstance(tickers, list): + return [r for r in tickers if isinstance(r, dict)] return [] - rows: list[dict] - if isinstance(payload, list): - rows = [r for r in payload if isinstance(r, dict)] - elif isinstance(payload, dict): - tickers = payload.get("tickers") - if isinstance(tickers, list): - rows = [r for r in tickers if isinstance(r, dict)] - else: - rows = [] - else: - rows = [] - self._ticker_rows_cache = list(rows) - self._ticker_rows_cached_at_epoch_s = now - return list(rows) + + return self._cached_fetch(self._ticker_cache, _fetch) def _row_matches_cat_target(row: dict, target: str, *, include_ticker_split: bool = False) -> bool: diff --git a/greenfloor/cloud_wallet_offer_runtime.py b/greenfloor/cloud_wallet_offer_runtime.py index bf154f0..6c2b73f 100644 --- a/greenfloor/cloud_wallet_offer_runtime.py +++ b/greenfloor/cloud_wallet_offer_runtime.py @@ -20,7 +20,12 @@ from greenfloor.adapters.splash import SplashAdapter from greenfloor.config.io import is_testnet, load_yaml from greenfloor.core.offer_lifecycle import OfferLifecycleState -from greenfloor.hex_utils import is_hex_id, normalize_hex_id +from greenfloor.hex_utils import ( + canonical_is_xch, + default_mojo_multiplier_for_asset, + is_hex_id, + normalize_hex_id, +) from greenfloor.logging_setup import initialize_service_file_logging from greenfloor.offer_bootstrap import plan_bootstrap_mixed_outputs from greenfloor.signing import sign_and_broadcast_mixed_split @@ -290,15 +295,6 @@ def __init__( super().__init__(f"{failure_kind}:{detail}") -def _canonical_is_xch(asset_id: str) -> bool: - value = asset_id.strip().lower() - return value in {"xch", "txch"} - - -def _default_mojo_multiplier_for_asset(asset_id: str) -> int: - return 1_000_000_000_000 if _canonical_is_xch(asset_id) else 1000 - - def _canonical_is_cloud_global_id(asset_id: str) -> bool: return asset_id.strip().startswith("Asset_") @@ -530,7 +526,7 @@ def resolve_cloud_wallet_asset_id( "symbol": symbol, } ) - if _canonical_is_xch(raw): + if canonical_is_xch(raw): hinted = str(global_id_hint or "").strip() if hinted and hinted in set(crypto_asset_ids): return hinted @@ -645,8 +641,8 @@ def resolve_cloud_wallet_offer_asset_ids( ) if ( resolved_base == resolved_quote - and not _canonical_is_xch(base_asset_id) - and not _canonical_is_xch(quote_asset_id) + and not canonical_is_xch(base_asset_id) + and not canonical_is_xch(quote_asset_id) and not _canonical_is_cloud_global_id(base_asset_id) and not _canonical_is_cloud_global_id(quote_asset_id) ): @@ -1633,7 +1629,7 @@ def ensure_offer_bootstrap_denominations( quote_unit_multiplier = int( pricing.get( "quote_unit_mojo_multiplier", - _default_mojo_multiplier_for_asset(str(resolved_quote_asset_id)), + default_mojo_multiplier_for_asset(str(resolved_quote_asset_id)), ) ) if side == "buy": @@ -1842,7 +1838,7 @@ def cloud_wallet_create_offer_phase( * int( (market.pricing or {}).get( "base_unit_mojo_multiplier", - _default_mojo_multiplier_for_asset(str(resolved_base_asset_id)), + default_mojo_multiplier_for_asset(str(resolved_base_asset_id)), ) ) ) @@ -1853,7 +1849,7 @@ def cloud_wallet_create_offer_phase( * int( (market.pricing or {}).get( "quote_unit_mojo_multiplier", - _default_mojo_multiplier_for_asset(str(resolved_quote_asset_id)), + default_mojo_multiplier_for_asset(str(resolved_quote_asset_id)), ) ) ) diff --git a/greenfloor/daemon/main.py b/greenfloor/daemon/main.py index 75092fd..89b377c 100644 --- a/greenfloor/daemon/main.py +++ b/greenfloor/daemon/main.py @@ -31,6 +31,7 @@ from greenfloor.adapters.wallet import WalletAdapter from greenfloor.cloud_wallet_offer_runtime import ( build_and_post_offer_cloud_wallet, + is_transient_dexie_visibility_404_error, resolve_cloud_wallet_offer_asset_ids, ) from greenfloor.config.io import ( @@ -48,7 +49,7 @@ from greenfloor.core.strategy import MarketState, PlannedAction, StrategyConfig, evaluate_market from greenfloor.daemon.coinset_ws import CoinsetWebsocketClient, capture_coinset_websocket_once from greenfloor.daemon.reservations import AssetReservationCoordinator -from greenfloor.hex_utils import is_hex_id +from greenfloor.hex_utils import default_mojo_multiplier_for_asset, is_hex_id from greenfloor.keys.router import resolve_market_key from greenfloor.logging_setup import ( initialize_service_file_logging, @@ -94,14 +95,6 @@ class DaemonRunState: } -def _canonical_is_xch(asset_id: str) -> bool: - return str(asset_id or "").strip().lower() in {"xch", "txch", "1"} - - -def _default_mojo_multiplier_for_asset(asset_id: str) -> int: - return 1_000_000_000_000 if _canonical_is_xch(asset_id) else 1000 - - def _cloud_wallet_coin_matches_asset_scope(*, coin: dict[str, Any], scoped_asset_id: str) -> bool: target_asset = str(scoped_asset_id).strip().lower() if not target_asset: @@ -502,6 +495,22 @@ def _market_pricing(market: Any) -> dict[str, Any]: return dict(getattr(market, "pricing", {}) or {}) +def _normalize_target_counts( + raw: dict, + *, + defaults: dict[int, int] | None = None, +) -> dict[int, int]: + """Normalize a {size: target_count} mapping from config or ladder data. + + Drops non-positive sizes, clamps negative targets to zero, and falls back + to *defaults* when the result would otherwise be empty. + """ + out = {int(k): max(0, int(v)) for k, v in raw.items() if int(k) > 0} + if not out and defaults: + return dict(defaults) + return out + + def _strategy_config_from_market(market) -> StrategyConfig: sell_ladder = market.ladders.get("sell", []) targets_by_size = {int(e.size_base_units): int(e.target_count) for e in sell_ladder} @@ -525,11 +534,7 @@ def _to_float(value: Any) -> float | None: return None return parsed - normalized_targets = { - int(size): max(0, int(target)) for size, target in targets_by_size.items() if int(size) > 0 - } - if not normalized_targets: - normalized_targets = {1: 5, 10: 2, 100: 1} + normalized_targets = _normalize_target_counts(targets_by_size, defaults={1: 5, 10: 2, 100: 1}) return StrategyConfig( pair=_normalize_strategy_pair(market.quote_asset), @@ -558,9 +563,7 @@ def _strategy_config_for_side(*, market: Any, side: str) -> StrategyConfig: except (TypeError, ValueError): expiry_minutes = None - normalized_targets = { - int(size): max(0, int(target)) for size, target in targets_by_size.items() if int(size) > 0 - } + normalized_targets = _normalize_target_counts(targets_by_size) return StrategyConfig( pair=_normalize_strategy_pair(market.quote_asset), @@ -1292,13 +1295,13 @@ def _build_offer_for_action( "base_unit_mojo_multiplier": int( pricing.get( "base_unit_mojo_multiplier", - _default_mojo_multiplier_for_asset(str(market.base_asset)), + default_mojo_multiplier_for_asset(str(market.base_asset)), ) ), "quote_unit_mojo_multiplier": int( pricing.get( "quote_unit_mojo_multiplier", - _default_mojo_multiplier_for_asset(str(resolved_quote_asset)), + default_mojo_multiplier_for_asset(str(resolved_quote_asset)), ) ), "key_id": market.signer_key_id, @@ -1406,7 +1409,7 @@ def _cloud_wallet_spendable_profiles_by_asset( def _base_unit_mojo_multiplier_for_market(*, market: Any) -> int: pricing = getattr(market, "pricing", {}) or {} - default_multiplier = _default_mojo_multiplier_for_asset(str(getattr(market, "base_asset", ""))) + default_multiplier = default_mojo_multiplier_for_asset(str(getattr(market, "base_asset", ""))) try: multiplier = int(pricing.get("base_unit_mojo_multiplier", default_multiplier)) except (TypeError, ValueError): @@ -1829,6 +1832,17 @@ def _execute_single_cloud_wallet_action( offer_id=cloud_wallet_offer_id, ) if not visible: + # Transient 404 → Dexie propagation lag; mark as pending so the + # active-count reader keeps the offer in scope until the grace + # period expires (see _is_stale_pending_visibility_offer). + if is_transient_dexie_visibility_404_error(visibility_error or ""): + return { + "size": action.size, + "side": _normalize_offer_side(getattr(action, "side", "sell")), + "status": "executed", + "reason": _PENDING_VISIBILITY_REASON, + "offer_id": cloud_wallet_offer_id or None, + } return { "size": action.size, "side": _normalize_offer_side(getattr(action, "side", "sell")), @@ -3025,6 +3039,10 @@ def _spendable_asset_scoped_coins(coins: list[dict[str, Any]]) -> list[dict[str, continue amount_per_coin_mojos = size_base_units * base_unit_mojo_multiplier canonical_asset_id = str(getattr(market, "base_asset", "")).strip() + # Defensive inner check: _plan_and_execute_coin_ops filters the + # ladder before reaching here, but callers that bypass that + # layer (e.g. direct tests or future call sites) also get a + # clean rejection rather than a failed RPC call. if not _coin_op_target_amount_allowed( amount_mojos=amount_per_coin_mojos, canonical_asset_id=canonical_asset_id, @@ -3285,6 +3303,7 @@ def _spendable_asset_scoped_coins(coins: list[dict[str, Any]]) -> list[dict[str, capped_number_of_coins = min(requested_number_of_coins, combine_input_cap) target_coin_amount_mojos = size_base_units * base_unit_mojo_multiplier canonical_asset_id = str(getattr(market, "base_asset", "")).strip() + # Defensive inner check — see comment in the split branch above. if not _coin_op_target_amount_allowed( amount_mojos=target_coin_amount_mojos, canonical_asset_id=canonical_asset_id, diff --git a/greenfloor/hex_utils.py b/greenfloor/hex_utils.py index ac6d973..e328c95 100644 --- a/greenfloor/hex_utils.py +++ b/greenfloor/hex_utils.py @@ -1,12 +1,17 @@ """Shared hex identifier utilities. Canonical validation and normalization for 64-character hex identifiers -(asset IDs, coin IDs, transaction IDs). +(asset IDs, coin IDs, transaction IDs), plus shared asset-type helpers. """ from __future__ import annotations _HEX_CHARS = frozenset("0123456789abcdef") +# Symbols that identify the native XCH/TXCH coin (asset id "1" is the Chia +# internal representation used in some wallet APIs). +_XCH_ASSET_SYMBOLS = frozenset({"xch", "txch", "1"}) +_CANONICAL_XCH_MOJOS = 1_000_000_000_000 +_CANONICAL_CAT_MOJOS = 1_000 def is_hex_id(value: str) -> bool: @@ -17,6 +22,19 @@ def is_hex_id(value: str) -> bool: return len(normalized) == 64 and all(ch in _HEX_CHARS for ch in normalized) +def canonical_is_xch(asset_id: str) -> bool: + """Return True if *asset_id* refers to the native XCH/TXCH coin.""" + return str(asset_id or "").strip().lower() in _XCH_ASSET_SYMBOLS + + +def default_mojo_multiplier_for_asset(asset_id: str) -> int: + """Return the canonical mojo-per-unit multiplier for *asset_id*. + + XCH/TXCH uses 10^12 mojos per XCH; CATs use 1 000 mojos per CAT unit. + """ + return _CANONICAL_XCH_MOJOS if canonical_is_xch(asset_id) else _CANONICAL_CAT_MOJOS + + def normalize_hex_id(value: object) -> str: """Normalize a hex identifier: strip, lowercase, remove 0x prefix. diff --git a/tests/test_daemon_offer_execution.py b/tests/test_daemon_offer_execution.py index f27ca2a..58f255e 100644 --- a/tests/test_daemon_offer_execution.py +++ b/tests/test_daemon_offer_execution.py @@ -90,6 +90,39 @@ def add_audit_event(self, event_type: str, payload: dict, market_id: str | None ) +class _CloudWalletProgram: + """Minimal program stub for cloud-wallet offer-execution tests (4-field variant).""" + + cloud_wallet_base_url = "https://api.vault.chia.net" + cloud_wallet_user_key_id = "UserAuthKey_abc" + cloud_wallet_private_key_pem_path = "~/.greenfloor/keys/cloud-wallet-user-auth-key.pem" + cloud_wallet_vault_id = "Wallet_abc" + + +class _ParallelCloudWalletProgram(_CloudWalletProgram): + """Cloud-wallet program stub with offer parallelism enabled.""" + + runtime_offer_parallelism_enabled = True + runtime_offer_parallelism_max_workers = 2 + runtime_reservation_ttl_seconds = 300 + coin_ops_minimum_fee_mojos = 0 + coin_ops_split_fee_mojos = 0 + + +class _CoinOpsProgram: + """Minimal program stub for coin-op tests (includes dry-run and fee fields).""" + + runtime_dry_run = False + app_network = "mainnet" + cloud_wallet_base_url = "https://wallet.example" + cloud_wallet_user_key_id = "user-key" + cloud_wallet_private_key_pem_path = "/tmp/key.pem" + cloud_wallet_vault_id = "vault-1" + cloud_wallet_kms_key_id = "kms-key" + coin_ops_split_fee_mojos = 0 + coin_ops_combine_fee_mojos = 0 + + def _market() -> MarketConfig: return MarketConfig( market_id="m1", @@ -829,6 +862,45 @@ def test_active_offer_counts_keeps_pending_visibility_offer_when_seen_on_dexie() assert unmapped == 0 +def test_active_offer_counts_keeps_pending_when_no_dexie_snapshot() -> None: + """When dexie_size_by_offer_id is None (no Dexie snapshot this cycle), + _is_stale_pending_visibility_offer returns False unconditionally, so the + offer is not evicted regardless of age. + """ + store = _FakeStore() + now = datetime.now(UTC) + very_old = (now - timedelta(hours=1)).isoformat() + store.offer_states = [ + {"offer_id": "pending-old", "market_id": "m1", "state": "open"}, + ] + store.audit_events = [ + { + "event_type": "strategy_offer_execution", + "market_id": "m1", + "created_at": very_old, + "payload": { + "items": [ + { + "offer_id": "pending-old", + "size": 50, + "status": "executed", + "reason": "cloud_wallet_post_success_dexie_visibility_pending", + } + ] + }, + } + ] + counts, _, unmapped = _active_offer_counts_by_size( + store=cast(Any, store), + market_id="m1", + clock=now, + dexie_size_by_offer_id=None, + tracked_sizes={50}, + ) + assert counts == {50: 1} + assert unmapped == 0 + + def test_match_watched_coin_ids_returns_empty_without_overlap() -> None: _set_watched_coin_ids_for_market(market_id="m-empty", coin_ids={"c" * 64}) assert _match_watched_coin_ids(observed_coin_ids=["d" * 64]) == {} @@ -863,11 +935,7 @@ def test_execute_strategy_actions_uses_cloud_wallet_path_when_configured(monkeyp lambda **_kwargs: {"success": True, "offer_id": "offer-fallback-1"}, ) - class _Program: - cloud_wallet_base_url = "https://api.vault.chia.net" - cloud_wallet_user_key_id = "UserAuthKey_abc" - cloud_wallet_private_key_pem_path = "~/.greenfloor/keys/cloud-wallet-user-auth-key.pem" - cloud_wallet_vault_id = "Wallet_abc" + _Program = _CloudWalletProgram dexie = _FakeDexie(post_result={"success": True, "id": "offer-1"}) dexie.visible_offer_ids = {"offer-fallback-1"} @@ -907,11 +975,7 @@ def test_execute_strategy_actions_cloud_wallet_requires_dexie_visibility(monkeyp lambda **_kwargs: {"success": True, "offer_id": "offer-fallback-missing"}, ) - class _Program: - cloud_wallet_base_url = "https://api.vault.chia.net" - cloud_wallet_user_key_id = "UserAuthKey_abc" - cloud_wallet_private_key_pem_path = "~/.greenfloor/keys/cloud-wallet-user-auth-key.pem" - cloud_wallet_vault_id = "Wallet_abc" + _Program = _CloudWalletProgram class _DexieNon404: def get_offer(self, offer_id: str) -> dict[str, Any]: @@ -950,6 +1014,11 @@ def get_offer(self, offer_id: str) -> dict[str, Any]: def test_execute_strategy_actions_cloud_wallet_accepts_transient_dexie_http_404( monkeypatch, ) -> None: + """A transient 404 from Dexie is treated as pending-visibility, not a hard failure. + + The offer is counted as executed with _PENDING_VISIBILITY_REASON so the + active-offer reader keeps it in scope until the grace period expires. + """ daemon_main._POST_COOLDOWN_UNTIL.clear() monkeypatch.setattr( daemon_main, @@ -957,11 +1026,7 @@ def test_execute_strategy_actions_cloud_wallet_accepts_transient_dexie_http_404( lambda **_kwargs: {"success": True, "offer_id": "offer-fallback-pending"}, ) - class _Program: - cloud_wallet_base_url = "https://api.vault.chia.net" - cloud_wallet_user_key_id = "UserAuthKey_abc" - cloud_wallet_private_key_pem_path = "~/.greenfloor/keys/cloud-wallet-user-auth-key.pem" - cloud_wallet_vault_id = "Wallet_abc" + _Program = _CloudWalletProgram class _Dexie404: def get_offer(self, offer_id: str) -> dict[str, Any]: @@ -992,9 +1057,9 @@ def get_offer(self, offer_id: str) -> dict[str, Any]: program=_Program(), ) - assert result["executed_count"] == 0 - assert result["items"][0]["status"] == "skipped" - assert "cloud_wallet_post_not_visible_on_dexie:" in str(result["items"][0]["reason"]) + assert result["executed_count"] == 1 + assert result["items"][0]["status"] == "executed" + assert result["items"][0]["reason"] == daemon_main._PENDING_VISIBILITY_REASON assert result["items"][0]["offer_id"] == "offer-fallback-pending" @@ -1009,11 +1074,7 @@ def _fake_cloud_wallet_post(**kwargs: Any) -> dict[str, Any]: monkeypatch.setattr(daemon_main, "_cloud_wallet_offer_post_fallback", _fake_cloud_wallet_post) - class _Program: - cloud_wallet_base_url = "https://api.vault.chia.net" - cloud_wallet_user_key_id = "UserAuthKey_abc" - cloud_wallet_private_key_pem_path = "~/.greenfloor/keys/cloud-wallet-user-auth-key.pem" - cloud_wallet_vault_id = "Wallet_abc" + _Program = _CloudWalletProgram dexie = _FakeDexie(post_result={"success": True, "id": "offer-1"}) dexie.visible_offer_ids = {"offer-100", "offer-10", "offer-1"} @@ -1078,11 +1139,7 @@ def _unexpected_builder(**_kwargs): lambda **_kwargs: {"success": False, "error": "vault_signing_unavailable"}, ) - class _Program: - cloud_wallet_base_url = "https://api.vault.chia.net" - cloud_wallet_user_key_id = "UserAuthKey_abc" - cloud_wallet_private_key_pem_path = "~/.greenfloor/keys/cloud-wallet-user-auth-key.pem" - cloud_wallet_vault_id = "Wallet_abc" + _Program = _CloudWalletProgram dexie = _FakeDexie(post_result={"success": True, "id": "offer-1"}) store = _FakeStore() @@ -1152,16 +1209,7 @@ def list_coins(self, *, include_pending: bool = True): lambda **_kwargs: {"success": True, "offer_id": "offer-parallel"}, ) - class _Program: - cloud_wallet_base_url = "https://api.vault.chia.net" - cloud_wallet_user_key_id = "UserAuthKey_abc" - cloud_wallet_private_key_pem_path = "~/.greenfloor/keys/cloud-wallet-user-auth-key.pem" - cloud_wallet_vault_id = "Wallet_abc" - runtime_offer_parallelism_enabled = True - runtime_offer_parallelism_max_workers = 2 - runtime_reservation_ttl_seconds = 300 - coin_ops_minimum_fee_mojos = 0 - coin_ops_split_fee_mojos = 0 + _Program = _ParallelCloudWalletProgram db_path = tmp_path / "reservations.sqlite" coordinator = AssetReservationCoordinator(db_path=db_path, lease_seconds=300) @@ -1239,16 +1287,7 @@ def list_coins(self, *, include_pending: bool = True): lambda **_kwargs: {"success": False, "error": "vault_unavailable"}, ) - class _Program: - cloud_wallet_base_url = "https://api.vault.chia.net" - cloud_wallet_user_key_id = "UserAuthKey_abc" - cloud_wallet_private_key_pem_path = "~/.greenfloor/keys/cloud-wallet-user-auth-key.pem" - cloud_wallet_vault_id = "Wallet_abc" - runtime_offer_parallelism_enabled = True - runtime_offer_parallelism_max_workers = 2 - runtime_reservation_ttl_seconds = 300 - coin_ops_minimum_fee_mojos = 0 - coin_ops_split_fee_mojos = 0 + _Program = _ParallelCloudWalletProgram db_path = tmp_path / "reservations.sqlite" coordinator = AssetReservationCoordinator(db_path=db_path, lease_seconds=300) @@ -1345,16 +1384,8 @@ def list_coins(self, *, include_pending: bool = True): lambda **_kwargs: {"success": True, "offer_id": "offer-parallel"}, ) - class _Program: - cloud_wallet_base_url = "https://api.vault.chia.net" - cloud_wallet_user_key_id = "UserAuthKey_abc" - cloud_wallet_private_key_pem_path = "~/.greenfloor/keys/cloud-wallet-user-auth-key.pem" - cloud_wallet_vault_id = "Wallet_abc" - runtime_offer_parallelism_enabled = True - runtime_offer_parallelism_max_workers = 2 - runtime_reservation_ttl_seconds = 300 + class _Program(_ParallelCloudWalletProgram): coin_ops_minimum_fee_mojos = 10 - coin_ops_split_fee_mojos = 0 db_path = tmp_path / "reservations.sqlite" coordinator = AssetReservationCoordinator(db_path=db_path, lease_seconds=300) @@ -1419,16 +1450,7 @@ def try_acquire(self, **_kwargs): lambda **_kwargs: {"success": True, "offer_id": "offer-fallback"}, ) - class _Program: - cloud_wallet_base_url = "https://api.vault.chia.net" - cloud_wallet_user_key_id = "UserAuthKey_abc" - cloud_wallet_private_key_pem_path = "~/.greenfloor/keys/cloud-wallet-user-auth-key.pem" - cloud_wallet_vault_id = "Wallet_abc" - runtime_offer_parallelism_enabled = True - runtime_offer_parallelism_max_workers = 2 - runtime_reservation_ttl_seconds = 300 - coin_ops_minimum_fee_mojos = 0 - coin_ops_split_fee_mojos = 0 + _Program = _ParallelCloudWalletProgram dexie = _FakeDexie(post_result={"success": True, "id": "offer-fallback"}) dexie.visible_offer_ids = {"offer-fallback"} @@ -1488,16 +1510,7 @@ def list_coins(self, *, include_pending: bool = True): lambda **_kwargs: {"success": True, "offer_id": "offer-resolved-asset"}, ) - class _Program: - cloud_wallet_base_url = "https://api.vault.chia.net" - cloud_wallet_user_key_id = "UserAuthKey_abc" - cloud_wallet_private_key_pem_path = "~/.greenfloor/keys/cloud-wallet-user-auth-key.pem" - cloud_wallet_vault_id = "Wallet_abc" - runtime_offer_parallelism_enabled = True - runtime_offer_parallelism_max_workers = 2 - runtime_reservation_ttl_seconds = 300 - coin_ops_minimum_fee_mojos = 0 - coin_ops_split_fee_mojos = 0 + _Program = _ParallelCloudWalletProgram market = _market() market.base_asset = "asset-local-only" @@ -1573,16 +1586,7 @@ def list_coins( lambda **_kwargs: {"success": True, "offer_id": "offer-scoped"}, ) - class _Program: - cloud_wallet_base_url = "https://api.vault.chia.net" - cloud_wallet_user_key_id = "UserAuthKey_abc" - cloud_wallet_private_key_pem_path = "~/.greenfloor/keys/cloud-wallet-user-auth-key.pem" - cloud_wallet_vault_id = "Wallet_abc" - runtime_offer_parallelism_enabled = True - runtime_offer_parallelism_max_workers = 2 - runtime_reservation_ttl_seconds = 300 - coin_ops_minimum_fee_mojos = 0 - coin_ops_split_fee_mojos = 0 + _Program = _ParallelCloudWalletProgram market = _market() market.base_asset = "asset-local-only" @@ -1666,16 +1670,7 @@ def list_coins( lambda **_kwargs: {"success": True, "offer_id": "offer-should-not-post"}, ) - class _Program: - cloud_wallet_base_url = "https://api.vault.chia.net" - cloud_wallet_user_key_id = "UserAuthKey_abc" - cloud_wallet_private_key_pem_path = "~/.greenfloor/keys/cloud-wallet-user-auth-key.pem" - cloud_wallet_vault_id = "Wallet_abc" - runtime_offer_parallelism_enabled = True - runtime_offer_parallelism_max_workers = 2 - runtime_reservation_ttl_seconds = 300 - coin_ops_minimum_fee_mojos = 0 - coin_ops_split_fee_mojos = 0 + _Program = _ParallelCloudWalletProgram market = _market() market.base_asset = "asset-local-only" @@ -1847,16 +1842,8 @@ def _attempt(coordinator: AssetReservationCoordinator) -> None: def test_execute_coin_ops_cloud_wallet_kms_only_requires_kms() -> None: - class _Program: - runtime_dry_run = False - app_network = "mainnet" - cloud_wallet_base_url = "https://wallet.example" - cloud_wallet_user_key_id = "user-key" - cloud_wallet_private_key_pem_path = "/tmp/key.pem" - cloud_wallet_vault_id = "vault-1" + class _Program(_CoinOpsProgram): cloud_wallet_kms_key_id = "" - coin_ops_split_fee_mojos = 0 - coin_ops_combine_fee_mojos = 0 class _Signer: key_id = "key-main-2" @@ -1878,16 +1865,7 @@ class _Signer: def test_execute_coin_ops_cloud_wallet_kms_only_split_submits(monkeypatch) -> None: - class _Program: - runtime_dry_run = False - app_network = "mainnet" - cloud_wallet_base_url = "https://wallet.example" - cloud_wallet_user_key_id = "user-key" - cloud_wallet_private_key_pem_path = "/tmp/key.pem" - cloud_wallet_vault_id = "vault-1" - cloud_wallet_kms_key_id = "kms-key" - coin_ops_split_fee_mojos = 0 - coin_ops_combine_fee_mojos = 0 + _Program = _CoinOpsProgram class _Signer: key_id = "key-main-2" @@ -1948,16 +1926,7 @@ def split_coins(self, *, coin_ids, amount_per_coin, number_of_coins, fee): def test_execute_coin_ops_cloud_wallet_kms_only_split_retries_on_not_spendable( monkeypatch, ) -> None: - class _Program: - runtime_dry_run = False - app_network = "mainnet" - cloud_wallet_base_url = "https://wallet.example" - cloud_wallet_user_key_id = "user-key" - cloud_wallet_private_key_pem_path = "/tmp/key.pem" - cloud_wallet_vault_id = "vault-1" - cloud_wallet_kms_key_id = "kms-key" - coin_ops_split_fee_mojos = 0 - coin_ops_combine_fee_mojos = 0 + _Program = _CoinOpsProgram class _Signer: key_id = "key-main-2" @@ -2024,16 +1993,7 @@ def split_coins(self, *, coin_ids, amount_per_coin, number_of_coins, fee): def test_execute_coin_ops_cloud_wallet_kms_only_split_ignores_asset_mismatch( monkeypatch, ) -> None: - class _Program: - runtime_dry_run = False - app_network = "mainnet" - cloud_wallet_base_url = "https://wallet.example" - cloud_wallet_user_key_id = "user-key" - cloud_wallet_private_key_pem_path = "/tmp/key.pem" - cloud_wallet_vault_id = "vault-1" - cloud_wallet_kms_key_id = "kms-key" - coin_ops_split_fee_mojos = 0 - coin_ops_combine_fee_mojos = 0 + _Program = _CoinOpsProgram class _Signer: key_id = "key-main-2" @@ -2079,16 +2039,7 @@ def split_coins(self, *, coin_ids, amount_per_coin, number_of_coins, fee): def test_execute_coin_ops_cloud_wallet_kms_only_split_revalidates_coin_identity( monkeypatch, ) -> None: - class _Program: - runtime_dry_run = False - app_network = "mainnet" - cloud_wallet_base_url = "https://wallet.example" - cloud_wallet_user_key_id = "user-key" - cloud_wallet_private_key_pem_path = "/tmp/key.pem" - cloud_wallet_vault_id = "vault-1" - cloud_wallet_kms_key_id = "kms-key" - coin_ops_split_fee_mojos = 0 - coin_ops_combine_fee_mojos = 0 + _Program = _CoinOpsProgram class _Signer: key_id = "key-main-2" @@ -2168,16 +2119,7 @@ def split_coins(self, *, coin_ids, amount_per_coin, number_of_coins, fee): def test_execute_coin_ops_cloud_wallet_kms_only_split_requires_sufficient_amount( monkeypatch, ) -> None: - class _Program: - runtime_dry_run = False - app_network = "mainnet" - cloud_wallet_base_url = "https://wallet.example" - cloud_wallet_user_key_id = "user-key" - cloud_wallet_private_key_pem_path = "/tmp/key.pem" - cloud_wallet_vault_id = "vault-1" - cloud_wallet_kms_key_id = "kms-key" - coin_ops_split_fee_mojos = 0 - coin_ops_combine_fee_mojos = 0 + _Program = _CoinOpsProgram class _Signer: key_id = "key-main-2" @@ -2223,16 +2165,7 @@ def split_coins(self, *, coin_ids, amount_per_coin, number_of_coins, fee): def test_execute_coin_ops_cloud_wallet_kms_only_split_combines_when_aggregate_sufficient( monkeypatch, ) -> None: - class _Program: - runtime_dry_run = False - app_network = "mainnet" - cloud_wallet_base_url = "https://wallet.example" - cloud_wallet_user_key_id = "user-key" - cloud_wallet_private_key_pem_path = "/tmp/key.pem" - cloud_wallet_vault_id = "vault-1" - cloud_wallet_kms_key_id = "kms-key" - coin_ops_split_fee_mojos = 0 - coin_ops_combine_fee_mojos = 0 + _Program = _CoinOpsProgram class _Signer: key_id = "key-main-2" @@ -2314,16 +2247,7 @@ def test_execute_coin_ops_cloud_wallet_kms_only_split_combine_cap_submits_progre ) -> None: monkeypatch.setenv("GREENFLOOR_COIN_OPS_COMBINE_INPUT_COIN_CAP", "5") - class _Program: - runtime_dry_run = False - app_network = "mainnet" - cloud_wallet_base_url = "https://wallet.example" - cloud_wallet_user_key_id = "user-key" - cloud_wallet_private_key_pem_path = "/tmp/key.pem" - cloud_wallet_vault_id = "vault-1" - cloud_wallet_kms_key_id = "kms-key" - coin_ops_split_fee_mojos = 0 - coin_ops_combine_fee_mojos = 0 + _Program = _CoinOpsProgram class _Signer: key_id = "key-main-2" @@ -2406,16 +2330,7 @@ def combine_coins( def test_execute_coin_ops_cloud_wallet_kms_only_split_ignores_sub_cat_dust_on_scoped_reads( monkeypatch, ) -> None: - class _Program: - runtime_dry_run = False - app_network = "mainnet" - cloud_wallet_base_url = "https://wallet.example" - cloud_wallet_user_key_id = "user-key" - cloud_wallet_private_key_pem_path = "/tmp/key.pem" - cloud_wallet_vault_id = "vault-1" - cloud_wallet_kms_key_id = "kms-key" - coin_ops_split_fee_mojos = 0 - coin_ops_combine_fee_mojos = 0 + _Program = _CoinOpsProgram class _Signer: key_id = "key-main-2" @@ -2500,16 +2415,7 @@ def combine_coins( def test_execute_coin_ops_cloud_wallet_kms_only_split_rejects_sub_minimum_cat_outputs( monkeypatch, ) -> None: - class _Program: - runtime_dry_run = False - app_network = "mainnet" - cloud_wallet_base_url = "https://wallet.example" - cloud_wallet_user_key_id = "user-key" - cloud_wallet_private_key_pem_path = "/tmp/key.pem" - cloud_wallet_vault_id = "vault-1" - cloud_wallet_kms_key_id = "kms-key" - coin_ops_split_fee_mojos = 0 - coin_ops_combine_fee_mojos = 0 + _Program = _CoinOpsProgram class _Signer: key_id = "key-main-2" @@ -2564,16 +2470,7 @@ def split_coins(self, *, coin_ids, amount_per_coin, number_of_coins, fee): def test_execute_coin_ops_cloud_wallet_kms_only_skips_single_output_split( monkeypatch, ) -> None: - class _Program: - runtime_dry_run = False - app_network = "mainnet" - cloud_wallet_base_url = "https://wallet.example" - cloud_wallet_user_key_id = "user-key" - cloud_wallet_private_key_pem_path = "/tmp/key.pem" - cloud_wallet_vault_id = "vault-1" - cloud_wallet_kms_key_id = "kms-key" - coin_ops_split_fee_mojos = 0 - coin_ops_combine_fee_mojos = 0 + _Program = _CoinOpsProgram class _Signer: key_id = "key-main-2" @@ -2616,16 +2513,7 @@ def test_execute_coin_ops_cloud_wallet_kms_only_combine_retries_on_429( monkeypatch.setenv("GREENFLOOR_COIN_OPS_COMBINE_MAX_ATTEMPTS", "3") monkeypatch.setenv("GREENFLOOR_COIN_OPS_COMBINE_BACKOFF_MS", "0") - class _Program: - runtime_dry_run = False - app_network = "mainnet" - cloud_wallet_base_url = "https://wallet.example" - cloud_wallet_user_key_id = "user-key" - cloud_wallet_private_key_pem_path = "/tmp/key.pem" - cloud_wallet_vault_id = "vault-1" - cloud_wallet_kms_key_id = "kms-key" - coin_ops_split_fee_mojos = 0 - coin_ops_combine_fee_mojos = 0 + _Program = _CoinOpsProgram class _Signer: key_id = "key-main-2" @@ -2681,16 +2569,7 @@ def test_execute_coin_ops_cloud_wallet_kms_only_combine_applies_input_coin_cap( ) -> None: monkeypatch.setenv("GREENFLOOR_COIN_OPS_COMBINE_INPUT_COIN_CAP", "7") - class _Program: - runtime_dry_run = False - app_network = "mainnet" - cloud_wallet_base_url = "https://wallet.example" - cloud_wallet_user_key_id = "user-key" - cloud_wallet_private_key_pem_path = "/tmp/key.pem" - cloud_wallet_vault_id = "vault-1" - cloud_wallet_kms_key_id = "kms-key" - coin_ops_split_fee_mojos = 0 - coin_ops_combine_fee_mojos = 0 + _Program = _CoinOpsProgram class _Signer: key_id = "key-main-2" @@ -2752,16 +2631,7 @@ def combine_coins(self, **kwargs): def test_execute_coin_ops_cloud_wallet_kms_only_combine_excludes_watched_coin_ids( monkeypatch, ) -> None: - class _Program: - runtime_dry_run = False - app_network = "mainnet" - cloud_wallet_base_url = "https://wallet.example" - cloud_wallet_user_key_id = "user-key" - cloud_wallet_private_key_pem_path = "/tmp/key.pem" - cloud_wallet_vault_id = "vault-1" - cloud_wallet_kms_key_id = "kms-key" - coin_ops_split_fee_mojos = 0 - coin_ops_combine_fee_mojos = 0 + _Program = _CoinOpsProgram class _Signer: key_id = "key-main-2" diff --git a/tests/test_daemon_strategy_integration.py b/tests/test_daemon_strategy_integration.py index f4da282..7b4ab69 100644 --- a/tests/test_daemon_strategy_integration.py +++ b/tests/test_daemon_strategy_integration.py @@ -117,30 +117,22 @@ def test_strategy_state_from_bucket_counts_includes_xch_price() -> None: assert state.xch_price_usd == 32.5 +def _sell_ladder(*entries: tuple[int, int]) -> list[MarketLadderEntry]: + """Build a sell ladder from (size_base_units, target_count) pairs.""" + return [ + MarketLadderEntry( + size_base_units=size, + target_count=target, + split_buffer_count=1, + combine_when_excess_factor=2.0, + ) + for size, target in entries + ] + + def test_effective_sell_bucket_counts_for_coin_ops_counts_live_sells_toward_target_only() -> None: - market = _market_with_quote("wUSDC.b") - market.mode = "two_sided" - market.quote_asset_type = "stable" - market.ladders = { - "buy": [ - MarketLadderEntry( - size_base_units=10, - target_count=1, - split_buffer_count=1, - combine_when_excess_factor=2.0, - ) - ], - "sell": [ - MarketLadderEntry( - size_base_units=10, - target_count=3, - split_buffer_count=1, - combine_when_excess_factor=2.0, - ) - ], - } effective = _effective_sell_bucket_counts_for_coin_ops( - sell_ladder=market.ladders["sell"], + sell_ladder=_sell_ladder((10, 3)), wallet_bucket_counts={10: 0}, active_sell_offer_counts_by_size={10: 3}, ) @@ -148,29 +140,8 @@ def test_effective_sell_bucket_counts_for_coin_ops_counts_live_sells_toward_targ def test_effective_sell_bucket_counts_for_coin_ops_caps_live_sell_credit_at_target() -> None: - market = _market_with_quote("wUSDC.b") - market.mode = "two_sided" - market.quote_asset_type = "stable" - market.ladders = { - "buy": [ - MarketLadderEntry( - size_base_units=10, - target_count=1, - split_buffer_count=1, - combine_when_excess_factor=2.0, - ) - ], - "sell": [ - MarketLadderEntry( - size_base_units=10, - target_count=3, - split_buffer_count=1, - combine_when_excess_factor=2.0, - ) - ], - } effective = _effective_sell_bucket_counts_for_coin_ops( - sell_ladder=market.ladders["sell"], + sell_ladder=_sell_ladder((10, 3)), wallet_bucket_counts={10: 0}, active_sell_offer_counts_by_size={10: 4}, ) @@ -178,21 +149,8 @@ def test_effective_sell_bucket_counts_for_coin_ops_caps_live_sell_credit_at_targ def test_effective_sell_bucket_counts_for_coin_ops_accounts_for_new_sell_posts_in_cycle() -> None: - market = _market_with_quote("wUSDC.b") - market.mode = "sell_only" - market.quote_asset_type = "stable" - market.ladders = { - "sell": [ - MarketLadderEntry( - size_base_units=10, - target_count=2, - split_buffer_count=1, - combine_when_excess_factor=2.0, - ) - ] - } effective = _effective_sell_bucket_counts_for_coin_ops( - sell_ladder=market.ladders["sell"], + sell_ladder=_sell_ladder((10, 2)), wallet_bucket_counts={10: 2}, active_sell_offer_counts_by_size={10: 0}, newly_executed_sell_offer_counts_by_size={10: 2}, diff --git a/tests/test_price_adapter.py b/tests/test_price_adapter.py index b780fee..9cab828 100644 --- a/tests/test_price_adapter.py +++ b/tests/test_price_adapter.py @@ -116,19 +116,21 @@ def test_get_xch_price_raises_when_no_cache_and_fetch_fails() -> None: def test_xch_price_provider_prefers_cloud_wallet_and_uses_ttl_cache() -> None: now = {"value": 1_000.0} calls = {"count": 0} + fallback_calls = {"count": 0} def _cloud_wallet_quote() -> float: calls["count"] += 1 return 42.0 + class _NeverCalledFallback(PriceAdapter): + async def get_xch_price(self) -> float: + fallback_calls["count"] += 1 + raise AssertionError("fallback must not be called when cloud wallet is healthy") + provider = XchPriceProvider( cloud_wallet_price_fn=_cloud_wallet_quote, cloud_wallet_ttl_seconds=120, - fallback_price_adapter=PriceAdapter( - ttl_seconds=60, - now_fn=lambda: now["value"], - session_factory=lambda: _FakeSession([{"last_price_usd": "31.25"}], {"count": 0}), - ), + fallback_price_adapter=_NeverCalledFallback(), now_fn=lambda: now["value"], ) @@ -138,6 +140,7 @@ def _cloud_wallet_quote() -> float: assert first == 42.0 assert second == 42.0 assert calls["count"] == 1 + assert fallback_calls["count"] == 0 def test_xch_price_provider_falls_back_to_coincodex_when_cloud_wallet_fails() -> None: @@ -155,3 +158,35 @@ def test_xch_price_provider_falls_back_to_coincodex_when_cloud_wallet_fails() -> value = asyncio.run(provider.get_xch_price()) assert value == 33.5 assert fallback_counter["count"] == 1 + + +def test_xch_price_provider_returns_last_good_price_when_all_sources_fail() -> None: + """After a successful fetch, both sources failing returns the stale value.""" + now = {"value": 1_000.0} + cw_healthy = {"ok": True} + + def _cloud_wallet_quote() -> float: + if not cw_healthy["ok"]: + raise RuntimeError("cw offline") + return 44.0 + + provider = XchPriceProvider( + cloud_wallet_price_fn=_cloud_wallet_quote, + cloud_wallet_ttl_seconds=60, + fallback_price_adapter=PriceAdapter( + ttl_seconds=60, + now_fn=lambda: now["value"], + session_factory=lambda: _FakeSession([RuntimeError("coincodex down")], {"count": 0}), + ), + now_fn=lambda: now["value"], + ) + + good = asyncio.run(provider.get_xch_price()) + assert good == 44.0 + + # Expire the CW TTL so _get_cloud_wallet_price re-fetches, then break it. + now["value"] = 1_062.0 + cw_healthy["ok"] = False + + stale = asyncio.run(provider.get_xch_price()) + assert stale == 44.0 From 6021e777c5eb7113655f1654b325c6aa16053d74 Mon Sep 17 00:00:00 2001 From: Gene Hoffman Date: Tue, 10 Mar 2026 20:35:54 -0700 Subject: [PATCH 05/12] fix stale Dexie-missing offer reconciliation Expire watched offers when direct Dexie lookups return 404 so stale local open rows do not block replacement ladder postings. Made-with: Cursor --- docs/progress.md | 17 +++++++ greenfloor/daemon/main.py | 53 +++++++++++++++++++++- tests/test_daemon_offer_execution.py | 67 ++++++++++++++++++++++++++++ 3 files changed, 135 insertions(+), 2 deletions(-) diff --git a/docs/progress.md b/docs/progress.md index b884d00..d2c3306 100644 --- a/docs/progress.md +++ b/docs/progress.md @@ -1,5 +1,22 @@ # Progress Log +## 2026-03-10 (Dexie 404 reconciliation fix for stale ECO 50 offers) + +- Root cause confirmed on `John-Deere` for `eco1812020_sell_xch` not reposting its `50` rung: + - Dexie no longer returned several watched `50` offer ids, + - direct `DexieAdapter.get_offer(...)` on those ids returned `HTTP Error 404: Not Found`, + - daemon reconciliation left the prior `offer_state` rows at `open`, so strategy kept counting `50: 1` and suppressed replacement posting. +- Fixed `greenfloor/daemon/main.py` reconciliation for watched offers that vanish from Dexie: + - direct watched-offer fetches that 404 now transition the local offer state to `expired`, + - ordinary direct-fetch network failures still remain non-terminal and do not clear active state. +- Added deterministic regression coverage in `tests/test_daemon_offer_execution.py` for the exact stale-watch scenario: + - watched offer present in local state, + - Dexie list omits it, + - direct `get_offer()` 404 forces the row out of the active set. +- Live remediation on `John-Deere`: + - identified stale open `50` offer rows for `eco1812020_sell_xch`, + - prepared cleanup so the market can resume posting replacement `50` offers immediately instead of waiting for manual DB intervention. + ## 2026-03-05 (BYC scoped-query leak fail-closed mitigation + John-Deere validation) - Root cause for the remaining BYC coin-op failure on John-Deere was narrowed further: diff --git a/greenfloor/daemon/main.py b/greenfloor/daemon/main.py index 89b377c..ea15620 100644 --- a/greenfloor/daemon/main.py +++ b/greenfloor/daemon/main.py @@ -851,6 +851,16 @@ def _is_stale_pending_visibility_offer( return (clock - created_at).total_seconds() > float(max_age_seconds) +def _is_dexie_offer_missing_error(error: Exception) -> bool: + raw = str(error).strip() + if not raw: + return False + normalized = raw.lower() + return is_transient_dexie_visibility_404_error(raw) or ( + "http error 404" in normalized and "not found" in normalized + ) + + def _recent_executed_offer_ids(*, store: SqliteStore, market_id: str) -> set[str]: events = store.list_recent_audit_events( event_types=["strategy_offer_execution"], @@ -2413,16 +2423,55 @@ def _reconcile_offer_states( # Refresh all of our watched offers individually. Dexie list snapshots can # lag status transitions; direct offer fetches make lifecycle state updates # deterministic for strategy planning. + missing_watched_offer_ids: set[str] = set() for watched_offer_id in sorted(our_offer_ids): try: single_payload = dexie.get_offer(watched_offer_id, timeout=5) single_offer = single_payload.get("offer") if isinstance(single_payload, dict) else None if isinstance(single_offer, dict): augmented_by_id[watched_offer_id] = single_offer - except Exception: # pragma: no cover - network dependent + except Exception as exc: # pragma: no cover - network dependent + if _is_dexie_offer_missing_error(exc): + transition = apply_offer_signal(OfferLifecycleState.OPEN, OfferSignal.EXPIRED) + missing_watched_offer_ids.add(watched_offer_id) + _log_market_decision( + market.market_id, + "offer_transition", + offer_id=watched_offer_id, + dexie_status=None, + signal_source="dexie_get_offer_404", + old_state=transition.old_state.value, + new_state=transition.new_state.value, + signal=transition.signal.value, + ) + store.upsert_offer_state( + offer_id=watched_offer_id, + market_id=market.market_id, + state=transition.new_state.value, + last_seen_status=None, + ) + store.add_audit_event( + "offer_lifecycle_transition", + { + "offer_id": watched_offer_id, + "market_id": market.market_id, + "old_state": transition.old_state.value, + "new_state": transition.new_state.value, + "signal": transition.signal.value, + "action": transition.action, + "reason": transition.reason, + "dexie_status": None, + "signal_source": "dexie_get_offer_404", + "dexie_error": str(exc), + "coinset_tx_ids": [], + "coinset_confirmed_tx_ids": [], + "coinset_mempool_tx_ids": [], + }, + market_id=market.market_id, + ) continue - for beyond_offer_id in beyond_cap_ids: + for beyond_offer_id in beyond_cap_ids - missing_watched_offer_ids: try: single_payload = dexie.get_offer(beyond_offer_id, timeout=5) single_offer = single_payload.get("offer") if isinstance(single_payload, dict) else None diff --git a/tests/test_daemon_offer_execution.py b/tests/test_daemon_offer_execution.py index 58f255e..5f3a281 100644 --- a/tests/test_daemon_offer_execution.py +++ b/tests/test_daemon_offer_execution.py @@ -901,6 +901,73 @@ def test_active_offer_counts_keeps_pending_when_no_dexie_snapshot() -> None: assert unmapped == 0 +def test_reconcile_offer_states_expires_watched_offer_on_direct_dexie_404(tmp_path: Path) -> None: + db_path = tmp_path / "state.sqlite" + store = SqliteStore(db_path) + market = _market() + now = datetime.now(UTC) + try: + store.upsert_offer_state( + offer_id="offer-50", + market_id=market.market_id, + state="open", + last_seen_status=0, + ) + store.add_audit_event( + "strategy_offer_execution", + { + "market_id": market.market_id, + "planned_count": 1, + "executed_count": 1, + "items": [ + { + "offer_id": "offer-50", + "size": 50, + "side": "sell", + "status": "executed", + "reason": "dexie_post_success", + } + ], + }, + market_id=market.market_id, + ) + + class _FakeDexie: + def get_offers(self, offered: str, requested: str) -> list[dict[str, Any]]: + _ = offered, requested + return [] + + def get_offer(self, offer_id: str, *, timeout: int = 20) -> dict[str, Any]: + _ = offer_id, timeout + raise RuntimeError("HTTP Error 404: Not Found") + + result = daemon_main._MarketCycleResult() + daemon_main._reconcile_offer_states( + market=market, + dexie=cast(Any, _FakeDexie()), + store=store, + now=now, + result=result, + ) + + rows = { + r["offer_id"]: r for r in store.list_offer_states(market_id=market.market_id, limit=20) + } + transitions = store.list_recent_audit_events( + event_types=["offer_lifecycle_transition"], + market_id=market.market_id, + limit=20, + ) + finally: + store.close() + + assert rows["offer-50"]["state"] == "expired" + assert rows["offer-50"]["last_seen_status"] is None + assert transitions[0]["payload"]["offer_id"] == "offer-50" + assert transitions[0]["payload"]["signal_source"] == "dexie_get_offer_404" + assert transitions[0]["payload"]["dexie_error"] == "HTTP Error 404: Not Found" + + def test_match_watched_coin_ids_returns_empty_without_overlap() -> None: _set_watched_coin_ids_for_market(market_id="m-empty", coin_ids={"c" * 64}) assert _match_watched_coin_ids(observed_coin_ids=["d" * 64]) == {} From cc189ab3f2592bf726f8ea4ab73240f6ad9eafba Mon Sep 17 00:00:00 2001 From: Gene Hoffman Date: Tue, 10 Mar 2026 22:28:38 -0700 Subject: [PATCH 06/12] fix: stagger short-TTL reseed reposts Limit repeated reseed actions for small short-expiry ladders so the daemon stops refilling the full 1-offer deficit in a single cycle. This keeps ECO/XCH posts from expiring in synchronized bursts while preserving a small bootstrap refill when a rung is empty. Made-with: Cursor --- docs/progress.md | 24 ++++ greenfloor/daemon/main.py | 190 +++++++++++++++++++++++++++ tests/test_daemon_offer_execution.py | 80 ++++++++++- 3 files changed, 291 insertions(+), 3 deletions(-) diff --git a/docs/progress.md b/docs/progress.md index d2c3306..ae958e2 100644 --- a/docs/progress.md +++ b/docs/progress.md @@ -1,5 +1,17 @@ # Progress Log +## 2026-03-10 (daemon small-offer reseed cadence gating) + +- Hardened sell-only reseed behavior in `greenfloor/daemon/main.py` to reduce bursty `1`-offer reposting on short-TTL markets: + - repeated same-size reseed actions now consult recent successful `strategy_offer_execution` timestamps for the market, + - small repeated ladders (`target_count >= 3`) are cadence-limited to approximately one spacing interval at a time instead of reposting the full deficit in a single cycle, + - cold-start / fully empty ladders still permit a small bootstrap burst (`2`) so markets do not stay empty for the full spacing window. +- Goal: keep `10`-minute `1`-offer ladders, especially `eco1812020_sell_xch`, from expiring in synchronized bursts that temporarily drop live Dexie coverage below target even though the daemon later refills the rung. +- Added deterministic coverage in `tests/test_daemon_offer_execution.py` for: + - empty-market bootstrap reseed limiting, + - suppression when the most recent successful same-size post is still inside the cadence window, + - resuming a single small-offer refill after the cadence window elapses. + ## 2026-03-10 (Dexie 404 reconciliation fix for stale ECO 50 offers) - Root cause confirmed on `John-Deere` for `eco1812020_sell_xch` not reposting its `50` rung: @@ -17,6 +29,18 @@ - identified stale open `50` offer rows for `eco1812020_sell_xch`, - prepared cleanup so the market can resume posting replacement `50` offers immediately instead of waiting for manual DB intervention. +## 2026-03-10 (upstream ent-wallet duplicate vault CAT input report + workaround analysis) + +- Documented a new upstream Cloud Wallet / `ent-wallet` issue draft in `docs/ent-wallet-upstream-duplicate-vault-cat-offer-inputs.md`: + - live `John-Deere` evidence shows malformed `50`-unit ECO vault offers already contain duplicate CAT inputs before `greenfloor` validates the returned `offer1...`, + - Cloud Wallet `CREATE_OFFER` transactions themselves report the same CAT coin id multiple times in `inputs`, + - likely root cause is the row-multiplying `transactionCoinRecords` join in `getUnspentVaultCoinsByWalletId(...)`. +- Captured temporary workaround options while waiting for the upstream fix: + - safest immediate mitigation is pausing the `50` rung, + - more targeted operational stopgap is combining explicit clean ECO inputs into a fresh exact `50000`-mojo CAT coin, + - off-chain cancellation of malformed internal wallet offers may free locked polluted inputs, + - a possible future `greenfloor` mitigation is a cooldown and/or exact-input-combine path when `wallet_sdk_offer_duplicate_spent_coin_ids` recurs. + ## 2026-03-05 (BYC scoped-query leak fail-closed mitigation + John-Deere validation) - Root cause for the remaining BYC coin-op failure on John-Deere was narrowed further: diff --git a/greenfloor/daemon/main.py b/greenfloor/daemon/main.py index ea15620..9e28e4b 100644 --- a/greenfloor/daemon/main.py +++ b/greenfloor/daemon/main.py @@ -683,6 +683,8 @@ def _evaluate_two_sided_market_actions( _RESEED_MEMPOOL_MAX_AGE_SECONDS = 3 * 60 _PENDING_VISIBILITY_RECHECK_MAX_AGE_SECONDS = 2 * 60 _PENDING_VISIBILITY_REASON = "cloud_wallet_post_success_dexie_visibility_pending" +_RESEED_CADENCE_MIN_TARGET_COUNT = 3 +_RESEED_CADENCE_BOOTSTRAP_MAX_REPEAT = 2 @dataclass(frozen=True, slots=True) @@ -823,6 +825,174 @@ def _recent_offer_metadata_by_offer_id( return metadata_by_offer_id +def _parse_event_created_at(value: Any) -> datetime | None: + raw = str(value or "").strip() + if not raw: + return None + normalized = raw.replace("Z", "+00:00") + try: + parsed = datetime.fromisoformat(normalized) + except ValueError: + return None + if parsed.tzinfo is None: + parsed = parsed.replace(tzinfo=UTC) + return parsed + + +def _expiry_seconds_for_action(action: PlannedAction) -> int | None: + unit = str(action.expiry_unit or "").strip().lower() + try: + value = int(action.expiry_value) + except (TypeError, ValueError): + return None + if value <= 0: + return None + unit_seconds = { + "second": 1, + "seconds": 1, + "minute": 60, + "minutes": 60, + "hour": 60 * 60, + "hours": 60 * 60, + "day": 24 * 60 * 60, + "days": 24 * 60 * 60, + }.get(unit) + if unit_seconds is None: + return None + return value * unit_seconds + + +def _latest_successful_offer_created_at_by_size( + *, store: SqliteStore, market_id: str +) -> dict[int, datetime]: + events = store.list_recent_audit_events( + event_types=["strategy_offer_execution"], + market_id=market_id, + limit=1500, + ) + latest_by_size: dict[int, datetime] = {} + seen_offer_ids: set[str] = set() + for event in events: + created_at = _parse_event_created_at(event.get("created_at")) + if created_at is None: + continue + payload = event.get("payload") + if not isinstance(payload, dict): + continue + items = payload.get("items") + if not isinstance(items, list): + continue + for item in items: + if not isinstance(item, dict): + continue + if str(item.get("status", "")).strip().lower() != "executed": + continue + offer_id = str(item.get("offer_id", "")).strip() + if not offer_id or offer_id in seen_offer_ids: + continue + seen_offer_ids.add(offer_id) + try: + size = int(item.get("size") or 0) + except (TypeError, ValueError): + continue + if size <= 0 or size in latest_by_size: + continue + latest_by_size[size] = created_at + return latest_by_size + + +def _apply_reseed_cadence_gate( + *, + reseed_actions: list[PlannedAction], + target_by_size: dict[int, int], + active_counts_by_size: dict[int, int], + store: SqliteStore, + market_id: str, + clock: datetime, +) -> tuple[list[PlannedAction], list[dict[str, Any]]]: + latest_by_size = _latest_successful_offer_created_at_by_size( + store=store, + market_id=market_id, + ) + gated_actions: list[PlannedAction] = [] + blocked_sizes: list[dict[str, Any]] = [] + for action in reseed_actions: + size = int(action.size) + repeat = max(0, int(action.repeat)) + target_count = int(target_by_size.get(size, 0)) + if repeat <= 0: + continue + if target_count < _RESEED_CADENCE_MIN_TARGET_COUNT: + gated_actions.append(action) + continue + expiry_seconds = _expiry_seconds_for_action(action) + if expiry_seconds is None or expiry_seconds <= 0: + gated_actions.append(action) + continue + spacing_seconds = max(1, expiry_seconds // target_count) + active_count = int(active_counts_by_size.get(size, 0)) + last_post_at = latest_by_size.get(size) + allowed_repeat = repeat + last_post_age_seconds: int | None = None + if last_post_at is None: + allowed_repeat = ( + min(repeat, _RESEED_CADENCE_BOOTSTRAP_MAX_REPEAT) + if active_count <= 0 + else min(repeat, 1) + ) + else: + age_seconds = max(0.0, (clock - last_post_at).total_seconds()) + last_post_age_seconds = int(age_seconds) + if age_seconds < float(spacing_seconds): + allowed_repeat = 0 + else: + allowed_repeat = ( + min(repeat, _RESEED_CADENCE_BOOTSTRAP_MAX_REPEAT) + if active_count <= 0 + else min(repeat, 1) + ) + if allowed_repeat <= 0: + blocked_sizes.append( + { + "size": size, + "requested_repeat": repeat, + "target_count": target_count, + "active_count": active_count, + "spacing_seconds": spacing_seconds, + "last_post_age_seconds": last_post_age_seconds, + } + ) + continue + if allowed_repeat == repeat: + gated_actions.append(action) + continue + gated_actions.append( + PlannedAction( + size=size, + repeat=allowed_repeat, + pair=action.pair, + expiry_unit=action.expiry_unit, + expiry_value=int(action.expiry_value), + cancel_after_create=action.cancel_after_create, + reason=action.reason, + target_spread_bps=action.target_spread_bps, + side=getattr(action, "side", "sell"), + ) + ) + blocked_sizes.append( + { + "size": size, + "requested_repeat": repeat, + "allowed_repeat": allowed_repeat, + "target_count": target_count, + "active_count": active_count, + "spacing_seconds": spacing_seconds, + "last_post_age_seconds": last_post_age_seconds, + } + ) + return gated_actions, blocked_sizes + + def _is_stale_pending_visibility_offer( *, offer_id: str, @@ -1219,6 +1389,25 @@ def _inject_reseed_action_if_no_active_offers( candidate_sizes=sorted(one_per_size), ) return strategy_actions + reseed_actions, cadence_limited_sizes = _apply_reseed_cadence_gate( + reseed_actions=reseed_actions, + target_by_size=target_by_size, + active_counts_by_size=active_counts_by_size, + store=store, + market_id=market.market_id, + clock=clock, + ) + if not reseed_actions: + _log_market_decision( + market.market_id, + "reseed_skip", + reason="reseed_cadence_gate_active", + active_counts_by_size=active_counts_by_size, + target_counts_by_size=target_by_size, + missing_by_size=missing_by_size, + cadence_limited_sizes=cadence_limited_sizes, + ) + return strategy_actions _log_market_decision( market.market_id, @@ -1233,6 +1422,7 @@ def _inject_reseed_action_if_no_active_offers( pair=strategy_config.pair, expiry_unit=reseed_actions[0].expiry_unit, expiry_value=int(reseed_actions[0].expiry_value), + cadence_limited_sizes=cadence_limited_sizes, ) return reseed_actions diff --git a/tests/test_daemon_offer_execution.py b/tests/test_daemon_offer_execution.py index 5f3a281..bce5ac3 100644 --- a/tests/test_daemon_offer_execution.py +++ b/tests/test_daemon_offer_execution.py @@ -408,7 +408,7 @@ def test_inject_reseed_action_when_no_active_offers() -> None: ) assert [action.size for action in actions] == [1, 10, 100] - assert [action.repeat for action in actions] == [5, 2, 1] + assert [action.repeat for action in actions] == [2, 2, 1] assert all(action.reason == "offer_size_gap_reseed" for action in actions) @@ -475,7 +475,7 @@ def test_inject_reseed_action_fills_missing_sizes_when_recent_mempool_is_present ) assert [action.size for action in actions] == [1, 10, 100] - assert [action.repeat for action in actions] == [5, 2, 1] + assert [action.repeat for action in actions] == [2, 2, 1] assert all(action.reason == "offer_size_gap_reseed" for action in actions) @@ -504,10 +504,84 @@ def test_inject_reseed_action_when_only_mempool_offer_is_stale() -> None: ) assert [action.size for action in actions] == [1, 10, 100] - assert [action.repeat for action in actions] == [5, 2, 1] + assert [action.repeat for action in actions] == [2, 2, 1] assert all(action.reason == "offer_size_gap_reseed" for action in actions) +def test_inject_reseed_action_respects_recent_same_size_post_cadence() -> None: + store = _FakeStore() + now = datetime.now(UTC) + store.offer_states = [ + {"offer_id": "one-1", "market_id": "m1", "state": "open"}, + {"offer_id": "one-2", "market_id": "m1", "state": "open"}, + ] + store.audit_events = [ + { + "event_type": "strategy_offer_execution", + "market_id": "m1", + "created_at": (now - timedelta(seconds=60)).isoformat(), + "payload": { + "items": [ + {"offer_id": "recent-one", "size": 1, "status": "executed"}, + {"offer_id": "one-1", "size": 1, "status": "executed"}, + {"offer_id": "one-2", "size": 1, "status": "executed"}, + ] + }, + } + ] + market = _market() + strategy_config = _strategy_config_from_market(market) + + actions = _inject_reseed_action_if_no_active_offers( + strategy_actions=[], + strategy_config=strategy_config, + market=market, + store=cast(Any, store), + xch_price_usd=30.0, + clock=now, + ) + + assert [action.size for action in actions] == [10, 100] + assert [action.repeat for action in actions] == [2, 1] + + +def test_inject_reseed_action_allows_one_small_offer_after_cadence_window() -> None: + store = _FakeStore() + now = datetime.now(UTC) + store.offer_states = [ + {"offer_id": "one-1", "market_id": "m1", "state": "open"}, + {"offer_id": "one-2", "market_id": "m1", "state": "open"}, + ] + store.audit_events = [ + { + "event_type": "strategy_offer_execution", + "market_id": "m1", + "created_at": (now - timedelta(minutes=4)).isoformat(), + "payload": { + "items": [ + {"offer_id": "stale-one", "size": 1, "status": "executed"}, + {"offer_id": "one-1", "size": 1, "status": "executed"}, + {"offer_id": "one-2", "size": 1, "status": "executed"}, + ] + }, + } + ] + market = _market() + strategy_config = _strategy_config_from_market(market) + + actions = _inject_reseed_action_if_no_active_offers( + strategy_actions=[], + strategy_config=strategy_config, + market=market, + store=cast(Any, store), + xch_price_usd=30.0, + clock=now, + ) + + assert [action.size for action in actions] == [1, 10, 100] + assert [action.repeat for action in actions] == [1, 2, 1] + + def test_active_offer_counts_by_size_uses_offer_state_and_size_mapping() -> None: store = _FakeStore() now = datetime.now(UTC) From f1c59a5950472d527e6ee11a25b350d381102539 Mon Sep 17 00:00:00 2001 From: Gene Hoffman Date: Tue, 10 Mar 2026 23:43:29 -0700 Subject: [PATCH 07/12] fix: apply cadence gating to normal strategy actions Extend short-TTL cadence limiting to the main strategy path so repeated below-target actions stop burst-posting small offers outside the reseed fallback. Record the separate BYC two-sided buy-side builder gap found during the John-Deere soak. Made-with: Cursor --- docs/progress.md | 18 +++++ greenfloor/daemon/main.py | 69 ++++++++++++----- tests/test_daemon_offer_execution.py | 106 +++++++++++++++++++++++++++ 3 files changed, 174 insertions(+), 19 deletions(-) diff --git a/docs/progress.md b/docs/progress.md index ae958e2..810fd9b 100644 --- a/docs/progress.md +++ b/docs/progress.md @@ -1,5 +1,23 @@ # Progress Log +## 2026-03-10 (daemon general strategy cadence gate + BYC buy-side finding) + +- Followed up on live `John-Deere` monitoring after the first short-TTL cadence patch: + - the initial gate only affected reseed injection, + - ordinary `strategy_actions_present` planning still emitted repeated `1`-offer posts for `eco1812020_sell_xch`, + - live Dexie samples continued to oscillate (`5 -> 4 -> 3 -> 2`) and remote audit events still showed grouped `1` executions from the main strategy path. +- Generalized cadence limiting in `greenfloor/daemon/main.py`: + - the action gate now keys by `(side, size)` using recent successful `strategy_offer_execution` events, + - ordinary `below_target` actions are cadence-limited before execution, not only reseed-only actions, + - existing reseed gating now reuses the same helper so the behavior is consistent across both planning paths. +- Added deterministic coverage in `tests/test_daemon_offer_execution.py` for: + - suppressing general strategy actions when the most recent same-side/same-size post is still inside the cadence window, + - reducing ordinary repeated `below_target` actions to a single post once the cadence window has elapsed. +- Separate live finding on `byc_two_sided_wusdbc`: + - the daemon repeatedly observed `buy: 0 / sell: 3`, planned one buy-side action, and still finished cycles with `strategy_executed=0`, + - current local builder path explicitly skips buy-side offers with `offer_builder_failed:buy_side_requires_cloud_wallet_path`, + - this is a distinct two-sided BYC defect and is not fixed by the ECO/XCH cadence change. + ## 2026-03-10 (daemon small-offer reseed cadence gating) - Hardened sell-only reseed behavior in `greenfloor/daemon/main.py` to reduce bursty `1`-offer reposting on short-TTL markets: diff --git a/greenfloor/daemon/main.py b/greenfloor/daemon/main.py index 9e28e4b..f8b622e 100644 --- a/greenfloor/daemon/main.py +++ b/greenfloor/daemon/main.py @@ -862,15 +862,15 @@ def _expiry_seconds_for_action(action: PlannedAction) -> int | None: return value * unit_seconds -def _latest_successful_offer_created_at_by_size( +def _latest_successful_offer_created_at_by_side_and_size( *, store: SqliteStore, market_id: str -) -> dict[int, datetime]: +) -> dict[tuple[str, int], datetime]: events = store.list_recent_audit_events( event_types=["strategy_offer_execution"], market_id=market_id, limit=1500, ) - latest_by_size: dict[int, datetime] = {} + latest_by_key: dict[tuple[str, int], datetime] = {} seen_offer_ids: set[str] = set() for event in events: created_at = _parse_event_created_at(event.get("created_at")) @@ -895,31 +895,36 @@ def _latest_successful_offer_created_at_by_size( size = int(item.get("size") or 0) except (TypeError, ValueError): continue - if size <= 0 or size in latest_by_size: + if size <= 0: + continue + side = _normalize_offer_side(item.get("side")) + key = (side, size) + if key in latest_by_key: continue - latest_by_size[size] = created_at - return latest_by_size + latest_by_key[key] = created_at + return latest_by_key -def _apply_reseed_cadence_gate( +def _apply_action_cadence_gate( *, - reseed_actions: list[PlannedAction], - target_by_size: dict[int, int], - active_counts_by_size: dict[int, int], + actions: list[PlannedAction], + target_counts_by_side: dict[str, dict[int, int]], + active_counts_by_side: dict[str, dict[int, int]], store: SqliteStore, market_id: str, clock: datetime, ) -> tuple[list[PlannedAction], list[dict[str, Any]]]: - latest_by_size = _latest_successful_offer_created_at_by_size( + latest_by_key = _latest_successful_offer_created_at_by_side_and_size( store=store, market_id=market_id, ) gated_actions: list[PlannedAction] = [] blocked_sizes: list[dict[str, Any]] = [] - for action in reseed_actions: + for action in actions: + side = _normalize_offer_side(getattr(action, "side", "sell")) size = int(action.size) repeat = max(0, int(action.repeat)) - target_count = int(target_by_size.get(size, 0)) + target_count = int(target_counts_by_side.get(side, {}).get(size, 0)) if repeat <= 0: continue if target_count < _RESEED_CADENCE_MIN_TARGET_COUNT: @@ -930,8 +935,8 @@ def _apply_reseed_cadence_gate( gated_actions.append(action) continue spacing_seconds = max(1, expiry_seconds // target_count) - active_count = int(active_counts_by_size.get(size, 0)) - last_post_at = latest_by_size.get(size) + active_count = int(active_counts_by_side.get(side, {}).get(size, 0)) + last_post_at = latest_by_key.get((side, size)) allowed_repeat = repeat last_post_age_seconds: int | None = None if last_post_at is None: @@ -954,6 +959,7 @@ def _apply_reseed_cadence_gate( if allowed_repeat <= 0: blocked_sizes.append( { + "side": side, "size": size, "requested_repeat": repeat, "target_count": target_count, @@ -981,6 +987,7 @@ def _apply_reseed_cadence_gate( ) blocked_sizes.append( { + "side": side, "size": size, "requested_repeat": repeat, "allowed_repeat": allowed_repeat, @@ -1389,10 +1396,13 @@ def _inject_reseed_action_if_no_active_offers( candidate_sizes=sorted(one_per_size), ) return strategy_actions - reseed_actions, cadence_limited_sizes = _apply_reseed_cadence_gate( - reseed_actions=reseed_actions, - target_by_size=target_by_size, - active_counts_by_size=active_counts_by_size, + reseed_actions, cadence_limited_sizes = _apply_action_cadence_gate( + actions=reseed_actions, + target_counts_by_side={"buy": {}, "sell": dict(target_by_size)}, + active_counts_by_side={ + "buy": {}, + "sell": {int(size): int(count) for size, count in active_counts_by_size.items()}, + }, store=store, market_id=market.market_id, clock=clock, @@ -2791,6 +2801,14 @@ def _evaluate_and_execute_strategy( + int(offer_counts_by_side["sell"].get(size, 0)) for size in sorted(tracked_sizes) } + target_counts_by_side = { + "buy": _strategy_target_counts_by_size( + _strategy_config_for_side(market=market, side="buy") + ), + "sell": _strategy_target_counts_by_size( + _strategy_config_for_side(market=market, side="sell") + ), + } else: active_offer_counts_by_size, offer_state_counts, active_unmapped_offer_ids = ( _active_offer_counts_by_size( @@ -2805,6 +2823,10 @@ def _evaluate_and_execute_strategy( "buy": {size: 0 for size in sorted(tracked_sizes)}, "sell": dict(active_offer_counts_by_size), } + target_counts_by_side = { + "buy": {}, + "sell": _strategy_target_counts_by_size(strategy_config), + } _log_market_decision( market.market_id, "strategy_state_source", @@ -2829,6 +2851,14 @@ def _evaluate_and_execute_strategy( config=strategy_config, clock=now, ) + strategy_actions, cadence_limited_sizes = _apply_action_cadence_gate( + actions=strategy_actions, + target_counts_by_side=target_counts_by_side, + active_counts_by_side=offer_counts_by_side, + store=store, + market_id=market.market_id, + clock=now, + ) _log_market_decision( market.market_id, "strategy_evaluated", @@ -2837,6 +2867,7 @@ def _evaluate_and_execute_strategy( offer_counts=active_offer_counts_by_size, xch_price_usd=xch_price_usd, action_count=len(strategy_actions), + cadence_limited_sizes=cadence_limited_sizes, ) if market_mode != "two_sided": strategy_actions = _inject_reseed_action_if_no_active_offers( diff --git a/tests/test_daemon_offer_execution.py b/tests/test_daemon_offer_execution.py index bce5ac3..40d42f7 100644 --- a/tests/test_daemon_offer_execution.py +++ b/tests/test_daemon_offer_execution.py @@ -582,6 +582,112 @@ def test_inject_reseed_action_allows_one_small_offer_after_cadence_window() -> N assert [action.repeat for action in actions] == [1, 2, 1] +def test_apply_action_cadence_gate_limits_general_strategy_actions() -> None: + store = _FakeStore() + now = datetime.now(UTC) + store.audit_events = [ + { + "event_type": "strategy_offer_execution", + "market_id": "m1", + "created_at": (now - timedelta(seconds=60)).isoformat(), + "payload": { + "items": [ + {"offer_id": "recent-one", "size": 1, "side": "sell", "status": "executed"} + ] + }, + } + ] + actions = [ + PlannedAction( + size=1, + repeat=2, + pair="xch", + expiry_unit="minutes", + expiry_value=10, + cancel_after_create=True, + reason="below_target", + side="sell", + ) + ] + + gated, blocked = daemon_main._apply_action_cadence_gate( + actions=actions, + target_counts_by_side={"buy": {}, "sell": {1: 5}}, + active_counts_by_side={"buy": {}, "sell": {1: 3}}, + store=cast(Any, store), + market_id="m1", + clock=now, + ) + + assert gated == [] + assert blocked == [ + { + "side": "sell", + "size": 1, + "requested_repeat": 2, + "target_count": 5, + "active_count": 3, + "spacing_seconds": 120, + "last_post_age_seconds": 60, + } + ] + + +def test_apply_action_cadence_gate_reduces_general_strategy_repeat_to_one() -> None: + store = _FakeStore() + now = datetime.now(UTC) + store.audit_events = [ + { + "event_type": "strategy_offer_execution", + "market_id": "m1", + "created_at": (now - timedelta(minutes=4)).isoformat(), + "payload": { + "items": [ + {"offer_id": "stale-one", "size": 1, "side": "sell", "status": "executed"} + ] + }, + } + ] + actions = [ + PlannedAction( + size=1, + repeat=2, + pair="xch", + expiry_unit="minutes", + expiry_value=10, + cancel_after_create=True, + reason="below_target", + side="sell", + ) + ] + + gated, blocked = daemon_main._apply_action_cadence_gate( + actions=actions, + target_counts_by_side={"buy": {}, "sell": {1: 5}}, + active_counts_by_side={"buy": {}, "sell": {1: 3}}, + store=cast(Any, store), + market_id="m1", + clock=now, + ) + + assert len(gated) == 1 + assert gated[0].size == 1 + assert gated[0].repeat == 1 + assert gated[0].reason == "below_target" + assert blocked == [ + { + "side": "sell", + "size": 1, + "requested_repeat": 2, + "allowed_repeat": 1, + "target_count": 5, + "active_count": 3, + "spacing_seconds": 120, + "last_post_age_seconds": 240, + } + ] + + def test_active_offer_counts_by_size_uses_offer_state_and_size_mapping() -> None: store = _FakeStore() now = datetime.now(UTC) From 7a29ee1b5a4902a54a83714d6148ff579d36fb31 Mon Sep 17 00:00:00 2001 From: Gene Hoffman Date: Tue, 10 Mar 2026 23:59:33 -0700 Subject: [PATCH 08/12] fix: let final short-TTL gap refill immediately Allow the last missing offer in a short-TTL ladder to bypass cadence suppression so ECO/XCH can return from 4/5 to its configured target without waiting for the next spacing window. Record the confirmed BYC buy-side quote-balance blocker from the John-Deere wallet state. Made-with: Cursor --- docs/progress.md | 12 ++++++++ greenfloor/daemon/main.py | 30 +++++++++++++++++++ tests/test_daemon_offer_execution.py | 43 ++++++++++++++++++++++++++++ 3 files changed, 85 insertions(+) diff --git a/docs/progress.md b/docs/progress.md index 810fd9b..d13776b 100644 --- a/docs/progress.md +++ b/docs/progress.md @@ -1,5 +1,17 @@ # Progress Log +## 2026-03-10 (final-gap cadence bypass + BYC quote-balance confirmation) + +- Tightened the generalized short-TTL cadence gate in `greenfloor/daemon/main.py` after reviewing the live `eco1812020_sell_xch` underfill: + - the prior generalized gate could still suppress the last missing `1` when the market sat at `4/5` and the latest same-size post was inside the spacing window, + - the gate now bypasses cadence suppression for the final missing offer (`target_count - active_count <= 1`) so the daemon can still restore the rung to target. +- Added deterministic coverage in `tests/test_daemon_offer_execution.py` for the exact `4/5 -> allow 1 more` case. +- Rechecked the live `byc_two_sided_wusdbc` buy-side failure on `John-Deere` with direct wallet evidence: + - the daemon does plan the configured buy-side offer, + - current `strategy_offer_execution` rows show the buy action is skipped by Cloud Wallet with `cloud_wallet_offer_insufficient_spendable_balance:side=buy:required=9990:available=50`, + - direct `wallet.list_coins(asset_id=Asset_cxc7mql006dp2w3kigqlj58t, include_pending={False,True})` returns exactly one unlocked settled `wUSDC.b` coin of `50`, + - so the present blocker is insufficient spendable quote inventory in the vault, not Dexie visibility. + ## 2026-03-10 (daemon general strategy cadence gate + BYC buy-side finding) - Followed up on live `John-Deere` monitoring after the first short-TTL cadence patch: diff --git a/greenfloor/daemon/main.py b/greenfloor/daemon/main.py index f8b622e..9a207f3 100644 --- a/greenfloor/daemon/main.py +++ b/greenfloor/daemon/main.py @@ -936,9 +936,39 @@ def _apply_action_cadence_gate( continue spacing_seconds = max(1, expiry_seconds // target_count) active_count = int(active_counts_by_side.get(side, {}).get(size, 0)) + final_gap = max(0, target_count - active_count) last_post_at = latest_by_key.get((side, size)) allowed_repeat = repeat last_post_age_seconds: int | None = None + if final_gap <= 1: + gated_actions.append( + PlannedAction( + size=size, + repeat=1, + pair=action.pair, + expiry_unit=action.expiry_unit, + expiry_value=int(action.expiry_value), + cancel_after_create=action.cancel_after_create, + reason=action.reason, + target_spread_bps=action.target_spread_bps, + side=getattr(action, "side", "sell"), + ) + ) + if repeat != 1: + blocked_sizes.append( + { + "side": side, + "size": size, + "requested_repeat": repeat, + "allowed_repeat": 1, + "target_count": target_count, + "active_count": active_count, + "spacing_seconds": spacing_seconds, + "last_post_age_seconds": None, + "reason": "final_gap_bypass", + } + ) + continue if last_post_at is None: allowed_repeat = ( min(repeat, _RESEED_CADENCE_BOOTSTRAP_MAX_REPEAT) diff --git a/tests/test_daemon_offer_execution.py b/tests/test_daemon_offer_execution.py index 40d42f7..324c796 100644 --- a/tests/test_daemon_offer_execution.py +++ b/tests/test_daemon_offer_execution.py @@ -688,6 +688,49 @@ def test_apply_action_cadence_gate_reduces_general_strategy_repeat_to_one() -> N ] +def test_apply_action_cadence_gate_does_not_block_final_missing_offer() -> None: + store = _FakeStore() + now = datetime.now(UTC) + store.audit_events = [ + { + "event_type": "strategy_offer_execution", + "market_id": "m1", + "created_at": (now - timedelta(seconds=30)).isoformat(), + "payload": { + "items": [ + {"offer_id": "recent-one", "size": 1, "side": "sell", "status": "executed"} + ] + }, + } + ] + actions = [ + PlannedAction( + size=1, + repeat=1, + pair="xch", + expiry_unit="minutes", + expiry_value=10, + cancel_after_create=True, + reason="below_target", + side="sell", + ) + ] + + gated, blocked = daemon_main._apply_action_cadence_gate( + actions=actions, + target_counts_by_side={"buy": {}, "sell": {1: 5}}, + active_counts_by_side={"buy": {}, "sell": {1: 4}}, + store=cast(Any, store), + market_id="m1", + clock=now, + ) + + assert len(gated) == 1 + assert gated[0].size == 1 + assert gated[0].repeat == 1 + assert blocked == [] + + def test_active_offer_counts_by_size_uses_offer_state_and_size_mapping() -> None: store = _FakeStore() now = datetime.now(UTC) From 43fd6c7a92a3f465262fb02d5bb98f4ea459bc87 Mon Sep 17 00:00:00 2001 From: Gene Hoffman Date: Wed, 11 Mar 2026 01:03:12 -0700 Subject: [PATCH 09/12] fix: require Dexie visibility before publish success Fail closed when Dexie still returns 404s after a cloud-wallet post, and reconcile CAT-quoted markets with Dexie's canonical asset ids so daemon state matches the exchange. Made-with: Cursor --- greenfloor/cli/manager.py | 2 + greenfloor/cloud_wallet_offer_runtime.py | 47 ++++++++++++++++------- greenfloor/daemon/main.py | 13 +++++-- tests/test_cloud_wallet_offer_runtime.py | 49 +++++++++++++++++++++--- tests/test_daemon_offer_execution.py | 46 ++++++++++++++++++++++ tests/test_manager_post_offer.py | 43 ++++++++++++++++++++- 6 files changed, 177 insertions(+), 23 deletions(-) diff --git a/greenfloor/cli/manager.py b/greenfloor/cli/manager.py index a3bae50..2166d8b 100644 --- a/greenfloor/cli/manager.py +++ b/greenfloor/cli/manager.py @@ -2498,6 +2498,7 @@ def _cloud_wallet_post_offer_phase( expected_offered_symbol: str, expected_requested_asset_id: str, expected_requested_symbol: str, + sleep_fn: collections.abc.Callable[[float], None] | None = None, ) -> dict[str, Any]: return _shared_cloud_wallet_post_offer_phase( publish_venue=publish_venue, @@ -2513,6 +2514,7 @@ def _cloud_wallet_post_offer_phase( expected_requested_symbol=expected_requested_symbol, post_dexie_offer_with_invalid_offer_retry_fn=_post_dexie_offer_with_invalid_offer_retry, verify_dexie_offer_visible_by_id_fn=_verify_dexie_offer_visible_by_id, + sleep_fn=sleep_fn, ) diff --git a/greenfloor/cloud_wallet_offer_runtime.py b/greenfloor/cloud_wallet_offer_runtime.py index 6c2b73f..7456d03 100644 --- a/greenfloor/cloud_wallet_offer_runtime.py +++ b/greenfloor/cloud_wallet_offer_runtime.py @@ -34,6 +34,8 @@ _MANAGER_SERVICE_NAME = "manager" _DEXIE_INVALID_OFFER_RETRY_MAX_ATTEMPTS = 4 _DEXIE_INVALID_OFFER_RETRY_INITIAL_DELAY_SECONDS = 1.0 +_DEXIE_VISIBILITY_POST_MAX_ATTEMPTS = 3 +_DEXIE_VISIBILITY_POST_DELAY_SECONDS = 2.0 _runtime_logger = logging.getLogger("greenfloor.manager") _JSON_OUTPUT_COMPACT = False @@ -1994,21 +1996,29 @@ def cloud_wallet_post_offer_phase( post_dexie_offer_with_invalid_offer_retry_fn: collections.abc.Callable[..., dict[str, Any]] | None = None, verify_dexie_offer_visible_by_id_fn: collections.abc.Callable[..., str | None] | None = None, + sleep_fn: collections.abc.Callable[[float], None] | None = None, ) -> dict[str, Any]: _ = market if post_dexie_offer_with_invalid_offer_retry_fn is None: post_dexie_offer_with_invalid_offer_retry_fn = post_dexie_offer_with_invalid_offer_retry if verify_dexie_offer_visible_by_id_fn is None: verify_dexie_offer_visible_by_id_fn = verify_dexie_offer_visible_by_id + if sleep_fn is None: + sleep_fn = time.sleep if publish_venue == "dexie": assert dexie is not None - result = post_dexie_offer_with_invalid_offer_retry_fn( - dexie=dexie, - offer_text=offer_text, - drop_only=drop_only, - claim_rewards=claim_rewards, - ) - if bool(result.get("success", False)): + last_result: dict[str, Any] = {} + last_visibility_error = "" + for attempt in range(1, _DEXIE_VISIBILITY_POST_MAX_ATTEMPTS + 1): + result = post_dexie_offer_with_invalid_offer_retry_fn( + dexie=dexie, + offer_text=offer_text, + drop_only=drop_only, + claim_rewards=claim_rewards, + ) + last_result = dict(result) + if not bool(result.get("success", False)): + return result posted_offer_id = str(result.get("id", "")).strip() visibility_error = verify_dexie_offer_visible_by_id_fn( dexie=dexie, @@ -2018,13 +2028,22 @@ def cloud_wallet_post_offer_phase( expected_requested_asset_id=str(expected_requested_asset_id), expected_requested_symbol=str(expected_requested_symbol), ) - if visibility_error: + if not visibility_error: + return result + last_visibility_error = str(visibility_error) + if not is_transient_dexie_visibility_404_error(last_visibility_error): return { **result, "success": False, - "error": visibility_error, + "error": last_visibility_error, } - return result + if attempt < _DEXIE_VISIBILITY_POST_MAX_ATTEMPTS: + sleep_fn(_DEXIE_VISIBILITY_POST_DELAY_SECONDS) + return { + **last_result, + "success": False, + "error": (last_visibility_error or "dexie_offer_not_visible_after_publish"), + } assert splash is not None return splash.post_offer(offer_text) @@ -2257,9 +2276,9 @@ def build_and_post_offer_cloud_wallet( claim_rewards=claim_rewards, market=market, expected_offered_asset_id=( - str(market.quote_asset) + str(resolved_quote_asset_id) if str(create_phase.get("side", "sell")).strip().lower() == "buy" - else str(market.base_asset) + else str(resolved_base_asset_id) ), expected_offered_symbol=( str(getattr(market, "quote_asset", "")) @@ -2267,9 +2286,9 @@ def build_and_post_offer_cloud_wallet( else str(getattr(market, "base_symbol", "")) ), expected_requested_asset_id=( - str(market.base_asset) + str(resolved_base_asset_id) if str(create_phase.get("side", "sell")).strip().lower() == "buy" - else str(market.quote_asset) + else str(resolved_quote_asset_id) ), expected_requested_symbol=( str(getattr(market, "base_symbol", "")) diff --git a/greenfloor/daemon/main.py b/greenfloor/daemon/main.py index 9a207f3..429e707 100644 --- a/greenfloor/daemon/main.py +++ b/greenfloor/daemon/main.py @@ -2594,6 +2594,7 @@ class _MarketCycleResult: def _reconcile_offer_states( *, market: Any, + network: str, dexie: DexieAdapter, store: SqliteStore, now: datetime, @@ -2606,13 +2607,18 @@ def _reconcile_offer_states( beyond-cap individually-fetched offers. """ dexie_fetch_error: str | None = None + dexie_offered_asset = str(market.base_asset).strip() + dexie_requested_asset = _resolve_quote_asset_for_offer( + quote_asset=str(market.quote_asset), + network=network, + ) try: - offers = dexie.get_offers(market.base_asset, market.quote_asset) + offers = dexie.get_offers(dexie_offered_asset, dexie_requested_asset) _log_market_decision( market.market_id, "dexie_offers_fetched", - offered=market.base_asset, - requested=market.quote_asset, + offered=dexie_offered_asset, + requested=dexie_requested_asset, count=len(offers), ) except Exception as exc: # pragma: no cover - network dependent @@ -3812,6 +3818,7 @@ def _process_single_market( _, dexie_size_by_offer_id, _, offers = _reconcile_offer_states( market=market, + network=program.app_network, dexie=dexie, store=store, now=now, diff --git a/tests/test_cloud_wallet_offer_runtime.py b/tests/test_cloud_wallet_offer_runtime.py index 1ba1b2b..906a4d1 100644 --- a/tests/test_cloud_wallet_offer_runtime.py +++ b/tests/test_cloud_wallet_offer_runtime.py @@ -206,10 +206,11 @@ class _Wallet: ] -def test_cloud_wallet_post_offer_phase_tolerates_transient_dexie_404_visibility() -> None: +def test_cloud_wallet_post_offer_phase_fails_after_repeated_dexie_404_visibility() -> None: class _Dexie: pass + post_attempts: list[int] = [] result = cloud_wallet_post_offer_phase( publish_venue="dexie", dexie=cast(Any, _Dexie()), @@ -222,17 +223,55 @@ class _Dexie: expected_offered_symbol="A", expected_requested_asset_id="asset_b", expected_requested_symbol="B", - post_dexie_offer_with_invalid_offer_retry_fn=lambda **_kwargs: { - "success": True, - "id": "offer-123", - }, + post_dexie_offer_with_invalid_offer_retry_fn=lambda **_kwargs: ( + post_attempts.append(1) or {"success": True, "id": "offer-123"} + ), verify_dexie_offer_visible_by_id_fn=lambda **_kwargs: ( "dexie_get_offer_error:HTTP Error 404: Not Found" ), + sleep_fn=lambda _seconds: None, ) assert result["success"] is False + assert result["id"] == "offer-123" assert "dexie_get_offer_error:HTTP Error 404: Not Found" in str(result["error"]) + assert len(post_attempts) == 3 + + +def test_cloud_wallet_post_offer_phase_retries_transient_dexie_404_until_visible() -> None: + class _Dexie: + pass + + verify_calls = {"count": 0} + + def _verify(**_kwargs: Any) -> str | None: + verify_calls["count"] += 1 + if verify_calls["count"] < 3: + return "dexie_get_offer_error:HTTP Error 404: Not Found" + return None + + result = cloud_wallet_post_offer_phase( + publish_venue="dexie", + dexie=cast(Any, _Dexie()), + splash=None, + offer_text="offer1abc", + drop_only=True, + claim_rewards=False, + market=object(), + expected_offered_asset_id="asset_a", + expected_offered_symbol="A", + expected_requested_asset_id="asset_b", + expected_requested_symbol="B", + post_dexie_offer_with_invalid_offer_retry_fn=lambda **_kwargs: { + "success": True, + "id": "offer-123", + }, + verify_dexie_offer_visible_by_id_fn=_verify, + sleep_fn=lambda _seconds: None, + ) + + assert result == {"success": True, "id": "offer-123"} + assert verify_calls["count"] == 3 def test_is_transient_dexie_visibility_404_error_matches_common_404_shapes() -> None: diff --git a/tests/test_daemon_offer_execution.py b/tests/test_daemon_offer_execution.py index 324c796..b0b3d66 100644 --- a/tests/test_daemon_offer_execution.py +++ b/tests/test_daemon_offer_execution.py @@ -1167,6 +1167,7 @@ def get_offer(self, offer_id: str, *, timeout: int = 20) -> dict[str, Any]: result = daemon_main._MarketCycleResult() daemon_main._reconcile_offer_states( market=market, + network="mainnet", dexie=cast(Any, _FakeDexie()), store=store, now=now, @@ -1191,6 +1192,51 @@ def get_offer(self, offer_id: str, *, timeout: int = 20) -> dict[str, Any]: assert transitions[0]["payload"]["dexie_error"] == "HTTP Error 404: Not Found" +def test_reconcile_offer_states_resolves_quote_asset_before_dexie_fetch( + monkeypatch, tmp_path: Path +) -> None: + store = daemon_main.SqliteStore(tmp_path / "state.db") + market = _market() + market.quote_asset = "wUSDC.b" + cats = tmp_path / "cats.yaml" + cats.write_text( + "\n".join( + [ + "cats:", + " - base_symbol: wUSDC.b", + " asset_id: fa4a180ac326e67ea289b869e3448256f6af05721f7cf934cb9901baa6b7a99d", + ] + ), + encoding="utf-8", + ) + monkeypatch.setattr(daemon_main, "_default_cats_config_path", lambda: cats) + captured: dict[str, str] = {} + + class _FakeDexie: + def get_offers(self, offered: str, requested: str) -> list[dict[str, Any]]: + captured["offered"] = offered + captured["requested"] = requested + return [] + + try: + result = daemon_main._MarketCycleResult() + daemon_main._reconcile_offer_states( + market=market, + network="mainnet", + dexie=cast(Any, _FakeDexie()), + store=store, + now=datetime.now(UTC), + result=result, + ) + finally: + store.close() + + assert captured == { + "offered": "asset", + "requested": "fa4a180ac326e67ea289b869e3448256f6af05721f7cf934cb9901baa6b7a99d", + } + + def test_match_watched_coin_ids_returns_empty_without_overlap() -> None: _set_watched_coin_ids_for_market(market_id="m-empty", coin_ids={"c" * 64}) assert _match_watched_coin_ids(observed_coin_ids=["d" * 64]) == {} diff --git a/tests/test_manager_post_offer.py b/tests/test_manager_post_offer.py index e30b5b8..a6cc715 100644 --- a/tests/test_manager_post_offer.py +++ b/tests/test_manager_post_offer.py @@ -5131,7 +5131,7 @@ def post_offer(_offer: str, *, drop_only: bool, claim_rewards: bool | None): @staticmethod def get_offer(_offer_id: str) -> dict[str, object]: - raise RuntimeError("dexie_http_error:404") + raise RuntimeError("dexie_http_error:500") monkeypatch.setattr("greenfloor.cli.manager.CloudWalletAdapter", _FakeWallet) monkeypatch.setattr( @@ -6530,3 +6530,44 @@ class _Dexie: ) assert result["success"] is False assert "dexie_offer_not_visible_after_publish" in str(result["error"]) + + +def test_cloud_wallet_post_offer_phase_fails_after_repeated_transient_dexie_404( + monkeypatch, +) -> None: + class _Dexie: + pass + + dexie = _Dexie() + post_calls = {"count": 0} + monkeypatch.setattr( + manager_mod, + "_post_dexie_offer_with_invalid_offer_retry", + lambda **_kwargs: ( + post_calls.__setitem__("count", post_calls["count"] + 1) + or {"success": True, "id": "offer-1"} + ), + ) + monkeypatch.setattr( + manager_mod, + "_verify_dexie_offer_visible_by_id", + lambda **_kwargs: "dexie_get_offer_error:HTTP Error 404: Not Found", + ) + market = type("Market", (), {"base_asset": "asset"})() + result = manager_mod._cloud_wallet_post_offer_phase( + publish_venue="dexie", + dexie=cast(Any, dexie), + splash=None, + offer_text="offer1abc", + drop_only=False, + claim_rewards=False, + market=market, + expected_offered_asset_id="asset", + expected_offered_symbol="asset", + expected_requested_asset_id="xch", + expected_requested_symbol="xch", + sleep_fn=lambda _seconds: None, + ) + assert result["success"] is False + assert "404" in str(result["error"]) + assert post_calls["count"] == 3 From 1ed490782a5bf3ff3d02089fde96500519331f8e Mon Sep 17 00:00:00 2001 From: Gene Hoffman Date: Wed, 11 Mar 2026 11:58:13 -0700 Subject: [PATCH 10/12] fix: drain parallel reservation queue before offer expiry Acquire cloud-wallet reservations at worker execution time and log queue/reservation timing so refill batches stop sitting pre-leased for minutes. Made-with: Cursor --- docs/progress.md | 32 +++ greenfloor/cloud_wallet_offer_runtime.py | 41 ++- greenfloor/daemon/main.py | 343 +++++++++-------------- tests/test_cloud_wallet_offer_runtime.py | 48 ++++ tests/test_daemon_offer_execution.py | 129 +++------ 5 files changed, 286 insertions(+), 307 deletions(-) diff --git a/docs/progress.md b/docs/progress.md index d13776b..ceed73c 100644 --- a/docs/progress.md +++ b/docs/progress.md @@ -1,5 +1,37 @@ # Progress Log +## 2026-03-11 (parallel reservation drain timing + John-Deere worker cap set to 3) + +- Diagnosed the remaining `eco1812020_sell_xch` underfill behavior on `John-Deere` as refill-drain latency in the daemon reservation queue rather than duplicate offer artifact assignment: + - strategy planning repeatedly produced full refill batches, + - reservation leases for queued items stayed active for long periods before worker pickup/release. +- Refactored parallel Cloud Wallet strategy execution in `greenfloor/daemon/main.py` so reservation acquisition happens at worker execution time instead of pre-acquiring every queued submission. +- Added `market_decision` timing instrumentation (same logger path used by `debug.log`) for: + - `parallel_offer_dispatch` (planned/queued/worker counts), + - `parallel_offer_queue_wait` (per-submission queue delay), + - `parallel_offer_reservation_acquired` / `parallel_offer_reservation_released` (acquire and hold timings). +- Updated live `John-Deere` runtime config to `runtime.offer_parallelism_max_workers: 3`, deployed the patched daemon file, restarted, and verified new debug evidence: + - `parallel_offer_dispatch ... workers=3` for `eco1812020_sell_xch`, + - queue/lease timing lines now visible in `debug.log` for active refill cycles. + +## 2026-03-11 (removed ladder cadence throttling after live ECO/XCH watch) + +- Re-ran live `John-Deere` monitoring for `eco1812020_sell_xch` while treating Dexie as authoritative apart from normal latency: + - repeated Dexie / SQLite snapshots showed the market oscillating below target (`1` rung dropping from `2` to `1`) while the daemon still held recently-open local rows that had not reconciled out yet, + - current underfill was therefore not a Dexie-visibility bug; the daemon was simply refilling too slowly once multiple short-TTL offers expired near each other. +- Removed the strategy/reseed cadence throttle in `greenfloor/daemon/main.py`: + - `_apply_action_cadence_gate(...)` now passes planned actions through unchanged instead of suppressing or shrinking repost batches, + - removed the now-dead recent-post cadence bookkeeping tied to `strategy_offer_execution` history. +- Updated deterministic coverage in `tests/test_daemon_offer_execution.py` to assert the new passthrough behavior instead of the old cadence-limited cases. +- Enabled `runtime.offer_parallelism_enabled` on `John-Deere` and re-watched the live market: + - the daemon now does plan the full missing burst immediately, and Cloud Wallet begins draining the burst in parallel, + - but the current submission ordering still prioritizes larger sizes first (`10` before `1`), so Dexie can remain underfilled on the critical small rung while the worker spends several minutes posting larger replacements, + - `greenfloor/cloud_wallet_offer_runtime.py` also writes per-offer `strategy_offer_execution` audit rows during posting, which explains the staggered DB evidence seen during live monitoring. +- Fixed the refill ordering in `greenfloor/daemon/main.py`: + - `_expand_strategy_actions(...)` no longer re-sorts planned actions by descending size before submission, + - strategy/reseed action order now follows the planner's natural ascending ladder order so missing `1` offers are submitted before missing `10` offers. +- Added deterministic regression coverage in `tests/test_daemon_offer_execution.py` for preserving strategy action order during expansion. + ## 2026-03-10 (final-gap cadence bypass + BYC quote-balance confirmation) - Tightened the generalized short-TTL cadence gate in `greenfloor/daemon/main.py` after reviewing the live `eco1812020_sell_xch` underfill: diff --git a/greenfloor/cloud_wallet_offer_runtime.py b/greenfloor/cloud_wallet_offer_runtime.py index 7456d03..24e7017 100644 --- a/greenfloor/cloud_wallet_offer_runtime.py +++ b/greenfloor/cloud_wallet_offer_runtime.py @@ -1931,19 +1931,34 @@ def cloud_wallet_wait_offer_artifact_phase( if poll_offer_artifact_by_signature_request_fn is None: poll_offer_artifact_by_signature_request_fn = poll_offer_artifact_by_signature_request strict_timeout = max(15, int(timeout_seconds)) - try: - return poll_offer_artifact_until_available_fn( - wallet=wallet, - known_markers=known_markers, - timeout_seconds=strict_timeout, - min_created_at=offer_request_started_at, - require_open_state=False, - states=("OPEN", "PENDING"), - prefer_newest=True, - ) - except RuntimeError as exc: - if str(exc) != "cloud_wallet_offer_artifact_timeout": - raise + if signature_request_id: + try: + return poll_offer_artifact_by_signature_request_fn( + wallet=wallet, + signature_request_id=signature_request_id, + known_markers=known_markers, + timeout_seconds=strict_timeout, + min_created_at=offer_request_started_at, + ) + except RuntimeError: + # Signature-request scoped lookup is preferred when supported, but + # not all test stubs or adapter variants implement this path. + # Fall back to generic wallet offer polling in those cases. + pass + else: + try: + return poll_offer_artifact_until_available_fn( + wallet=wallet, + known_markers=known_markers, + timeout_seconds=strict_timeout, + min_created_at=offer_request_started_at, + require_open_state=False, + states=("OPEN", "PENDING"), + prefer_newest=True, + ) + except RuntimeError as exc: + if str(exc) != "cloud_wallet_offer_artifact_timeout": + raise extended_timeout = max(45, strict_timeout * 3) if signature_request_id: try: diff --git a/greenfloor/daemon/main.py b/greenfloor/daemon/main.py index 429e707..6819346 100644 --- a/greenfloor/daemon/main.py +++ b/greenfloor/daemon/main.py @@ -683,8 +683,6 @@ def _evaluate_two_sided_market_actions( _RESEED_MEMPOOL_MAX_AGE_SECONDS = 3 * 60 _PENDING_VISIBILITY_RECHECK_MAX_AGE_SECONDS = 2 * 60 _PENDING_VISIBILITY_REASON = "cloud_wallet_post_success_dexie_visibility_pending" -_RESEED_CADENCE_MIN_TARGET_COUNT = 3 -_RESEED_CADENCE_BOOTSTRAP_MAX_REPEAT = 2 @dataclass(frozen=True, slots=True) @@ -862,49 +860,6 @@ def _expiry_seconds_for_action(action: PlannedAction) -> int | None: return value * unit_seconds -def _latest_successful_offer_created_at_by_side_and_size( - *, store: SqliteStore, market_id: str -) -> dict[tuple[str, int], datetime]: - events = store.list_recent_audit_events( - event_types=["strategy_offer_execution"], - market_id=market_id, - limit=1500, - ) - latest_by_key: dict[tuple[str, int], datetime] = {} - seen_offer_ids: set[str] = set() - for event in events: - created_at = _parse_event_created_at(event.get("created_at")) - if created_at is None: - continue - payload = event.get("payload") - if not isinstance(payload, dict): - continue - items = payload.get("items") - if not isinstance(items, list): - continue - for item in items: - if not isinstance(item, dict): - continue - if str(item.get("status", "")).strip().lower() != "executed": - continue - offer_id = str(item.get("offer_id", "")).strip() - if not offer_id or offer_id in seen_offer_ids: - continue - seen_offer_ids.add(offer_id) - try: - size = int(item.get("size") or 0) - except (TypeError, ValueError): - continue - if size <= 0: - continue - side = _normalize_offer_side(item.get("side")) - key = (side, size) - if key in latest_by_key: - continue - latest_by_key[key] = created_at - return latest_by_key - - def _apply_action_cadence_gate( *, actions: list[PlannedAction], @@ -914,120 +869,9 @@ def _apply_action_cadence_gate( market_id: str, clock: datetime, ) -> tuple[list[PlannedAction], list[dict[str, Any]]]: - latest_by_key = _latest_successful_offer_created_at_by_side_and_size( - store=store, - market_id=market_id, - ) - gated_actions: list[PlannedAction] = [] - blocked_sizes: list[dict[str, Any]] = [] - for action in actions: - side = _normalize_offer_side(getattr(action, "side", "sell")) - size = int(action.size) - repeat = max(0, int(action.repeat)) - target_count = int(target_counts_by_side.get(side, {}).get(size, 0)) - if repeat <= 0: - continue - if target_count < _RESEED_CADENCE_MIN_TARGET_COUNT: - gated_actions.append(action) - continue - expiry_seconds = _expiry_seconds_for_action(action) - if expiry_seconds is None or expiry_seconds <= 0: - gated_actions.append(action) - continue - spacing_seconds = max(1, expiry_seconds // target_count) - active_count = int(active_counts_by_side.get(side, {}).get(size, 0)) - final_gap = max(0, target_count - active_count) - last_post_at = latest_by_key.get((side, size)) - allowed_repeat = repeat - last_post_age_seconds: int | None = None - if final_gap <= 1: - gated_actions.append( - PlannedAction( - size=size, - repeat=1, - pair=action.pair, - expiry_unit=action.expiry_unit, - expiry_value=int(action.expiry_value), - cancel_after_create=action.cancel_after_create, - reason=action.reason, - target_spread_bps=action.target_spread_bps, - side=getattr(action, "side", "sell"), - ) - ) - if repeat != 1: - blocked_sizes.append( - { - "side": side, - "size": size, - "requested_repeat": repeat, - "allowed_repeat": 1, - "target_count": target_count, - "active_count": active_count, - "spacing_seconds": spacing_seconds, - "last_post_age_seconds": None, - "reason": "final_gap_bypass", - } - ) - continue - if last_post_at is None: - allowed_repeat = ( - min(repeat, _RESEED_CADENCE_BOOTSTRAP_MAX_REPEAT) - if active_count <= 0 - else min(repeat, 1) - ) - else: - age_seconds = max(0.0, (clock - last_post_at).total_seconds()) - last_post_age_seconds = int(age_seconds) - if age_seconds < float(spacing_seconds): - allowed_repeat = 0 - else: - allowed_repeat = ( - min(repeat, _RESEED_CADENCE_BOOTSTRAP_MAX_REPEAT) - if active_count <= 0 - else min(repeat, 1) - ) - if allowed_repeat <= 0: - blocked_sizes.append( - { - "side": side, - "size": size, - "requested_repeat": repeat, - "target_count": target_count, - "active_count": active_count, - "spacing_seconds": spacing_seconds, - "last_post_age_seconds": last_post_age_seconds, - } - ) - continue - if allowed_repeat == repeat: - gated_actions.append(action) - continue - gated_actions.append( - PlannedAction( - size=size, - repeat=allowed_repeat, - pair=action.pair, - expiry_unit=action.expiry_unit, - expiry_value=int(action.expiry_value), - cancel_after_create=action.cancel_after_create, - reason=action.reason, - target_spread_bps=action.target_spread_bps, - side=getattr(action, "side", "sell"), - ) - ) - blocked_sizes.append( - { - "side": side, - "size": size, - "requested_repeat": repeat, - "allowed_repeat": allowed_repeat, - "target_count": target_count, - "active_count": active_count, - "spacing_seconds": spacing_seconds, - "last_post_age_seconds": last_post_age_seconds, - } - ) - return gated_actions, blocked_sizes + _ = target_counts_by_side, active_counts_by_side, store, market_id, clock + passthrough_actions = [action for action in actions if int(action.repeat) > 0] + return passthrough_actions, [] def _is_stale_pending_visibility_offer( @@ -2185,9 +2029,8 @@ def _execute_single_local_action( def _expand_strategy_actions(strategy_actions: list[Any]) -> list[Any]: - ordered_actions = sorted(strategy_actions, key=lambda action: int(action.size), reverse=True) expanded_actions: list[Any] = [] - for action in ordered_actions: + for action in strategy_actions: expanded_actions.extend(action for _ in range(int(action.repeat))) return expanded_actions @@ -2236,7 +2079,6 @@ def _single_input_preferred_skip_reason( def _prepare_parallel_cloud_wallet_submission( *, - program: Any, market: Any, action: Any, cloud_wallet: CloudWalletAdapter, @@ -2244,8 +2086,7 @@ def _prepare_parallel_cloud_wallet_submission( resolved_quote_asset_id: str, resolved_xch_asset_id: str, fee_amount_mojos: int, - reservation_coordinator: AssetReservationCoordinator, -) -> tuple[str | None, dict[str, Any] | None]: +) -> tuple[dict[str, int] | None, dict[str, int] | None, dict[str, Any] | None]: requested_amounts = _reservation_request_for_cloud_offer_with_assets( market=market, action=action, @@ -2255,7 +2096,11 @@ def _prepare_parallel_cloud_wallet_submission( fee_amount_mojos=fee_amount_mojos, ) if not requested_amounts: - return None, _cloud_wallet_skip_item(action=action, reason="reservation_invalid_request") + return ( + None, + None, + _cloud_wallet_skip_item(action=action, reason="reservation_invalid_request"), + ) spendable_profiles = _cloud_wallet_spendable_profiles_by_asset( wallet=cloud_wallet, asset_ids=set(requested_amounts.keys()), @@ -2268,19 +2113,8 @@ def _prepare_parallel_cloud_wallet_submission( spendable_profiles=spendable_profiles, ) if single_input_skip_reason: - return None, _cloud_wallet_skip_item(action=action, reason=single_input_skip_reason) - acquired = reservation_coordinator.try_acquire( - market_id=str(market.market_id), - wallet_id=str(program.cloud_wallet_vault_id).strip(), - requested_amounts=requested_amounts, - available_amounts=available_amounts, - ) - if not acquired.ok or not acquired.reservation_id: - return None, _cloud_wallet_skip_item( - action=action, - reason=str(acquired.error or "reservation_rejected"), - ) - return str(acquired.reservation_id), None + return None, None, _cloud_wallet_skip_item(action=action, reason=single_input_skip_reason) + return requested_amounts, available_amounts, None def _execute_strategy_actions( @@ -2323,37 +2157,97 @@ def _execute_strategy_actions( ) ) fee_amount_mojos = _estimate_cloud_offer_fee_reservation_mojos(program=program) - submissions: list[tuple[int, Any, str]] = [] + # Health-check the coordinator once per batch before dispatching. + # Using an empty request avoids any lease writes while still + # surfacing storage/runtime failures early so we can fail over. + reservation_coordinator.try_acquire( + market_id=str(market.market_id), + wallet_id=str(program.cloud_wallet_vault_id).strip(), + requested_amounts={}, + available_amounts={}, + ) + submissions: list[tuple[int, Any, dict[str, int], dict[str, int]]] = [] for submit_index, action in enumerate(expanded_actions): - reservation_id, skip_item = _prepare_parallel_cloud_wallet_submission( - program=program, - market=market, - action=action, - cloud_wallet=cloud_wallet, - resolved_base_asset_id=resolved_base_asset_id, - resolved_quote_asset_id=resolved_quote_asset_id, - resolved_xch_asset_id=resolved_xch_asset_id, - fee_amount_mojos=fee_amount_mojos, - reservation_coordinator=reservation_coordinator, + requested_amounts, available_amounts, skip_item = ( + _prepare_parallel_cloud_wallet_submission( + market=market, + action=action, + cloud_wallet=cloud_wallet, + resolved_base_asset_id=resolved_base_asset_id, + resolved_quote_asset_id=resolved_quote_asset_id, + resolved_xch_asset_id=resolved_xch_asset_id, + fee_amount_mojos=fee_amount_mojos, + ) ) if skip_item is not None: items.append(skip_item) continue - assert reservation_id is not None - submissions.append((submit_index, action, reservation_id)) + assert requested_amounts is not None + assert available_amounts is not None + submissions.append((submit_index, action, requested_amounts, available_amounts)) if submissions: + coordinator = reservation_coordinator + assert coordinator is not None + wallet_id = str(program.cloud_wallet_vault_id).strip() max_workers = min( len(submissions), max(1, int(getattr(program, "runtime_offer_parallelism_max_workers", 4))), ) - with concurrent.futures.ThreadPoolExecutor(max_workers=max_workers) as pool: - future_to_submission: dict[ - concurrent.futures.Future[dict[str, Any]], tuple[int, str] - ] = {} - for submit_index, action, reservation_id in submissions: - future = pool.submit( - _execute_single_cloud_wallet_action, + _log_market_decision( + str(getattr(market, "market_id", "")), + "parallel_offer_dispatch", + planned_count=len(expanded_actions), + queued_count=len(submissions), + workers=max_workers, + ) + + def _run_parallel_submission( + *, + submit_index: int, + action: Any, + requested_amounts: dict[str, int], + available_amounts: dict[str, int], + queued_at_monotonic: float, + ) -> dict[str, Any]: + queue_wait_ms = int((time.monotonic() - queued_at_monotonic) * 1000) + _log_market_decision( + str(getattr(market, "market_id", "")), + "parallel_offer_queue_wait", + submit_index=submit_index, + size=int(getattr(action, "size", 0)), + side=_normalize_offer_side(getattr(action, "side", "sell")), + queue_wait_ms=queue_wait_ms, + ) + acquire_started = time.monotonic() + acquired = coordinator.try_acquire( + market_id=str(market.market_id), + wallet_id=wallet_id, + requested_amounts=requested_amounts, + available_amounts=available_amounts, + ) + acquire_ms = int((time.monotonic() - acquire_started) * 1000) + if not acquired.ok or not acquired.reservation_id: + return { + **_cloud_wallet_skip_item( + action=action, + reason=str(acquired.error or "reservation_rejected"), + ), + "queue_wait_ms": queue_wait_ms, + "reservation_acquire_ms": acquire_ms, + } + reservation_id = str(acquired.reservation_id) + reserved_at = time.monotonic() + _log_market_decision( + str(getattr(market, "market_id", "")), + "parallel_offer_reservation_acquired", + submit_index=submit_index, + reservation_id=reservation_id, + queue_wait_ms=queue_wait_ms, + reservation_acquire_ms=acquire_ms, + ) + try: + item = _execute_single_cloud_wallet_action( program=program, market=market, action=action, @@ -2361,10 +2255,50 @@ def _execute_strategy_actions( runtime_dry_run=runtime_dry_run, dexie=dexie, ) - future_to_submission[future] = (submit_index, reservation_id) + except Exception as exc: + item = { + "size": 0, + "side": "sell", + "status": "skipped", + "reason": f"parallel_offer_worker_error:{exc}", + "offer_id": None, + } + release_status = ( + "released_success" + if str(item.get("status", "")).strip().lower() == "executed" + else "released_failed" + ) + coordinator.release(reservation_id=reservation_id, status=release_status) + reservation_hold_ms = int((time.monotonic() - reserved_at) * 1000) + _log_market_decision( + str(getattr(market, "market_id", "")), + "parallel_offer_reservation_released", + submit_index=submit_index, + reservation_id=reservation_id, + release_status=release_status, + reservation_hold_ms=reservation_hold_ms, + ) + item["reservation_id"] = reservation_id + item["queue_wait_ms"] = queue_wait_ms + item["reservation_acquire_ms"] = acquire_ms + item["reservation_hold_ms"] = reservation_hold_ms + return item + + with concurrent.futures.ThreadPoolExecutor(max_workers=max_workers) as pool: + future_to_submission: dict[concurrent.futures.Future[dict[str, Any]], int] = {} + for submit_index, action, requested_amounts, available_amounts in submissions: + future = pool.submit( + _run_parallel_submission, + submit_index=submit_index, + action=action, + requested_amounts=requested_amounts, + available_amounts=available_amounts, + queued_at_monotonic=time.monotonic(), + ) + future_to_submission[future] = submit_index submitted_items: list[tuple[int, dict[str, Any]]] = [] for future in concurrent.futures.as_completed(future_to_submission): - submit_index, reservation_id = future_to_submission[future] + submit_index = future_to_submission[future] try: item = future.result() except Exception as exc: @@ -2375,15 +2309,6 @@ def _execute_strategy_actions( "reason": f"parallel_offer_worker_error:{exc}", "offer_id": None, } - release_status = ( - "released_success" - if str(item.get("status", "")).strip().lower() == "executed" - else "released_failed" - ) - reservation_coordinator.release( - reservation_id=reservation_id, status=release_status - ) - item["reservation_id"] = reservation_id submitted_items.append((submit_index, item)) for _, item in sorted(submitted_items, key=lambda pair: pair[0]): if item.get("status") == "executed": diff --git a/tests/test_cloud_wallet_offer_runtime.py b/tests/test_cloud_wallet_offer_runtime.py index 906a4d1..9f70d40 100644 --- a/tests/test_cloud_wallet_offer_runtime.py +++ b/tests/test_cloud_wallet_offer_runtime.py @@ -1,5 +1,6 @@ from __future__ import annotations +import datetime as dt from pathlib import Path from typing import Any, cast @@ -8,6 +9,7 @@ build_and_post_offer_cloud_wallet, cloud_wallet_create_offer_phase, cloud_wallet_post_offer_phase, + cloud_wallet_wait_offer_artifact_phase, is_transient_dexie_visibility_404_error, resolve_cloud_wallet_offer_asset_ids, ) @@ -206,6 +208,52 @@ class _Wallet: ] +def test_cloud_wallet_wait_offer_artifact_phase_prefers_signature_request_lookup() -> None: + calls = {"signature": 0, "generic": 0} + + result = cloud_wallet_wait_offer_artifact_phase( + wallet=cast(CloudWalletAdapter, object()), + known_markers={"id:known"}, + offer_request_started_at=dt.datetime(2026, 1, 1, tzinfo=dt.UTC), + signature_request_id="sr-123", + timeout_seconds=30, + poll_offer_artifact_by_signature_request_fn=lambda **_kwargs: ( + calls.__setitem__("signature", calls["signature"] + 1) or "offer1signature" + ), + poll_offer_artifact_until_available_fn=lambda **_kwargs: ( + calls.__setitem__("generic", calls["generic"] + 1) or "offer1generic" + ), + ) + + assert result == "offer1signature" + assert calls == {"signature": 1, "generic": 0} + + +def test_cloud_wallet_wait_offer_artifact_phase_falls_back_after_signature_timeout() -> None: + calls = {"signature": 0, "generic": 0} + + def _signature_poll(**_kwargs: Any) -> str: + calls["signature"] += 1 + raise RuntimeError("cloud_wallet_offer_artifact_timeout") + + def _generic_poll(**_kwargs: Any) -> str: + calls["generic"] += 1 + return "offer1generic" + + result = cloud_wallet_wait_offer_artifact_phase( + wallet=cast(CloudWalletAdapter, object()), + known_markers={"id:known"}, + offer_request_started_at=dt.datetime(2026, 1, 1, tzinfo=dt.UTC), + signature_request_id="sr-123", + timeout_seconds=30, + poll_offer_artifact_by_signature_request_fn=_signature_poll, + poll_offer_artifact_until_available_fn=_generic_poll, + ) + + assert result == "offer1generic" + assert calls == {"signature": 2, "generic": 1} + + def test_cloud_wallet_post_offer_phase_fails_after_repeated_dexie_404_visibility() -> None: class _Dexie: pass diff --git a/tests/test_daemon_offer_execution.py b/tests/test_daemon_offer_execution.py index b0b3d66..f8c1d56 100644 --- a/tests/test_daemon_offer_execution.py +++ b/tests/test_daemon_offer_execution.py @@ -175,6 +175,33 @@ def test_execute_strategy_actions_dry_run_plans_without_posting() -> None: assert store.offer_states == [] +def test_expand_strategy_actions_preserves_strategy_order() -> None: + actions = [ + PlannedAction( + size=1, + repeat=2, + pair="xch", + expiry_unit="minutes", + expiry_value=10, + cancel_after_create=True, + reason="below_target", + ), + PlannedAction( + size=10, + repeat=2, + pair="xch", + expiry_unit="minutes", + expiry_value=10, + cancel_after_create=True, + reason="below_target", + ), + ] + + expanded = daemon_main._expand_strategy_actions(actions) + + assert [action.size for action in expanded] == [1, 1, 10, 10] + + def test_execute_strategy_actions_skips_when_builder_skips(monkeypatch) -> None: import greenfloor.daemon.main as daemon_main @@ -408,7 +435,7 @@ def test_inject_reseed_action_when_no_active_offers() -> None: ) assert [action.size for action in actions] == [1, 10, 100] - assert [action.repeat for action in actions] == [2, 2, 1] + assert [action.repeat for action in actions] == [5, 2, 1] assert all(action.reason == "offer_size_gap_reseed" for action in actions) @@ -475,7 +502,7 @@ def test_inject_reseed_action_fills_missing_sizes_when_recent_mempool_is_present ) assert [action.size for action in actions] == [1, 10, 100] - assert [action.repeat for action in actions] == [2, 2, 1] + assert [action.repeat for action in actions] == [5, 2, 1] assert all(action.reason == "offer_size_gap_reseed" for action in actions) @@ -504,11 +531,11 @@ def test_inject_reseed_action_when_only_mempool_offer_is_stale() -> None: ) assert [action.size for action in actions] == [1, 10, 100] - assert [action.repeat for action in actions] == [2, 2, 1] + assert [action.repeat for action in actions] == [5, 2, 1] assert all(action.reason == "offer_size_gap_reseed" for action in actions) -def test_inject_reseed_action_respects_recent_same_size_post_cadence() -> None: +def test_inject_reseed_action_refills_missing_same_size_offers_immediately() -> None: store = _FakeStore() now = datetime.now(UTC) store.offer_states = [ @@ -541,11 +568,11 @@ def test_inject_reseed_action_respects_recent_same_size_post_cadence() -> None: clock=now, ) - assert [action.size for action in actions] == [10, 100] - assert [action.repeat for action in actions] == [2, 1] + assert [action.size for action in actions] == [1, 10, 100] + assert [action.repeat for action in actions] == [3, 2, 1] -def test_inject_reseed_action_allows_one_small_offer_after_cadence_window() -> None: +def test_inject_reseed_action_is_not_limited_by_old_cadence_window() -> None: store = _FakeStore() now = datetime.now(UTC) store.offer_states = [ @@ -579,10 +606,10 @@ def test_inject_reseed_action_allows_one_small_offer_after_cadence_window() -> N ) assert [action.size for action in actions] == [1, 10, 100] - assert [action.repeat for action in actions] == [1, 2, 1] + assert [action.repeat for action in actions] == [3, 2, 1] -def test_apply_action_cadence_gate_limits_general_strategy_actions() -> None: +def test_apply_action_cadence_gate_passes_through_general_strategy_actions() -> None: store = _FakeStore() now = datetime.now(UTC) store.audit_events = [ @@ -619,91 +646,24 @@ def test_apply_action_cadence_gate_limits_general_strategy_actions() -> None: clock=now, ) - assert gated == [] - assert blocked == [ - { - "side": "sell", - "size": 1, - "requested_repeat": 2, - "target_count": 5, - "active_count": 3, - "spacing_seconds": 120, - "last_post_age_seconds": 60, - } - ] + assert gated == actions + assert blocked == [] -def test_apply_action_cadence_gate_reduces_general_strategy_repeat_to_one() -> None: +def test_apply_action_cadence_gate_filters_zero_repeat_actions() -> None: store = _FakeStore() now = datetime.now(UTC) - store.audit_events = [ - { - "event_type": "strategy_offer_execution", - "market_id": "m1", - "created_at": (now - timedelta(minutes=4)).isoformat(), - "payload": { - "items": [ - {"offer_id": "stale-one", "size": 1, "side": "sell", "status": "executed"} - ] - }, - } - ] actions = [ PlannedAction( size=1, - repeat=2, + repeat=0, pair="xch", expiry_unit="minutes", expiry_value=10, cancel_after_create=True, reason="below_target", side="sell", - ) - ] - - gated, blocked = daemon_main._apply_action_cadence_gate( - actions=actions, - target_counts_by_side={"buy": {}, "sell": {1: 5}}, - active_counts_by_side={"buy": {}, "sell": {1: 3}}, - store=cast(Any, store), - market_id="m1", - clock=now, - ) - - assert len(gated) == 1 - assert gated[0].size == 1 - assert gated[0].repeat == 1 - assert gated[0].reason == "below_target" - assert blocked == [ - { - "side": "sell", - "size": 1, - "requested_repeat": 2, - "allowed_repeat": 1, - "target_count": 5, - "active_count": 3, - "spacing_seconds": 120, - "last_post_age_seconds": 240, - } - ] - - -def test_apply_action_cadence_gate_does_not_block_final_missing_offer() -> None: - store = _FakeStore() - now = datetime.now(UTC) - store.audit_events = [ - { - "event_type": "strategy_offer_execution", - "market_id": "m1", - "created_at": (now - timedelta(seconds=30)).isoformat(), - "payload": { - "items": [ - {"offer_id": "recent-one", "size": 1, "side": "sell", "status": "executed"} - ] - }, - } - ] - actions = [ + ), PlannedAction( size=1, repeat=1, @@ -713,7 +673,7 @@ def test_apply_action_cadence_gate_does_not_block_final_missing_offer() -> None: cancel_after_create=True, reason="below_target", side="sell", - ) + ), ] gated, blocked = daemon_main._apply_action_cadence_gate( @@ -726,7 +686,6 @@ def test_apply_action_cadence_gate_does_not_block_final_missing_offer() -> None: ) assert len(gated) == 1 - assert gated[0].size == 1 assert gated[0].repeat == 1 assert blocked == [] @@ -1399,7 +1358,7 @@ def get_offer(self, offer_id: str) -> dict[str, Any]: assert result["items"][0]["offer_id"] == "offer-fallback-pending" -def test_execute_strategy_actions_posts_larger_sizes_first(monkeypatch) -> None: +def test_execute_strategy_actions_preserves_planned_size_order(monkeypatch) -> None: daemon_main._POST_COOLDOWN_UNTIL.clear() seen_sizes: list[int] = [] @@ -1457,7 +1416,7 @@ def _fake_cloud_wallet_post(**kwargs: Any) -> dict[str, Any]: ) assert result["executed_count"] == 3 - assert seen_sizes == [100, 10, 1] + assert seen_sizes == [1, 10, 100] def test_execute_strategy_actions_cloud_wallet_failure_skips_without_builder(monkeypatch) -> None: From 48daac44d96b07c3c3548cb2c4bbfecf21039b28 Mon Sep 17 00:00:00 2001 From: Gene Hoffman Date: Wed, 11 Mar 2026 20:38:52 -0700 Subject: [PATCH 11/12] chore: add locked quote coin trace script Add a read-only Cloud Wallet tracing script to inspect hidden locked quote coins, lineage, and nearby creator offers when spendable and locked balances diverge. Made-with: Cursor --- scripts/trace_locked_quote_coins.py | 657 ++++++++++++++++++++++++++++ 1 file changed, 657 insertions(+) create mode 100644 scripts/trace_locked_quote_coins.py diff --git a/scripts/trace_locked_quote_coins.py b/scripts/trace_locked_quote_coins.py new file mode 100644 index 0000000..399d3df --- /dev/null +++ b/scripts/trace_locked_quote_coins.py @@ -0,0 +1,657 @@ +#!/usr/bin/env python3 +"""Trace hidden locked quote coins in a Cloud Wallet vault. + +Usage: + .venv/bin/python scripts/trace_locked_quote_coins.py + .venv/bin/python scripts/trace_locked_quote_coins.py --json + .venv/bin/python scripts/trace_locked_quote_coins.py --coin-id + +This script is read-only. It is meant for cases where a wallet asset shows a +non-zero locked balance, but the normal coin list only exposes a smaller +spendable subset. The script: + + - fetches the quote asset totals from `wallet.assets` + - fetches the raw quote coin set with `includeSpent=true` + - isolates current unspent locked coins + - walks each locked coin's local lineage + - fetches nearby creator offers that offer the quote asset + - inspects linked wallet transactions and reservation-split relations + +The goal is to make stale reservation / create-offer locks visible in one run. +""" + +from __future__ import annotations + +import argparse +import json +import sys +import time +from dataclasses import dataclass +from datetime import UTC, datetime, timedelta +from pathlib import Path +from typing import Any + +ROOT = Path(__file__).resolve().parents[1] +if str(ROOT) not in sys.path: + sys.path.insert(0, str(ROOT)) + +from greenfloor.cli.manager import ( # noqa: E402 + _new_cloud_wallet_adapter, + _require_cloud_wallet_config, + _resolve_cloud_wallet_asset_id, +) +from greenfloor.config.io import load_program_config # noqa: E402 + + +def _graphql_with_retry( + *, + wallet: Any, + query: str, + variables: dict[str, Any], + retries: int = 5, +) -> dict[str, Any]: + last_error: Exception | None = None + for attempt in range(1, retries + 1): + try: + return wallet._graphql(query=query, variables=variables) + except Exception as err: # pragma: no cover - defensive around remote API instability + last_error = err + if attempt == retries: + raise + time.sleep(0.5 * attempt) + if last_error: + raise last_error + return {} + + +def _parse_dt(value: Any) -> datetime | None: + text = str(value or "").strip() + if not text: + return None + if text.endswith("Z"): + text = f"{text[:-1]}+00:00" + try: + parsed = datetime.fromisoformat(text) + except ValueError: + return None + if parsed.tzinfo is None: + return parsed.replace(tzinfo=UTC) + return parsed.astimezone(UTC) + + +def _coin_hex(value: Any) -> str: + text = str(value or "").strip() + if text.startswith("CoinRecord_"): + return text.removeprefix("CoinRecord_").lower() + return text.lower() + + +def _wallet_asset_row(*, wallet: Any, asset_id: str) -> dict[str, int] | None: + query = """ +query walletAssetAmounts($walletId: ID!, $first: Int) { + wallet(id: $walletId) { + assets(first: $first) { + edges { + node { + assetId + totalAmount + spendableAmount + lockedAmount + } + } + } + } +} +""" + payload = _graphql_with_retry( + wallet=wallet, + query=query, + variables={"walletId": wallet.vault_id, "first": 100}, + ) + edges = ((payload.get("wallet") or {}).get("assets") or {}).get("edges") or [] + for edge in edges: + node = edge.get("node") if isinstance(edge, dict) else None + if not isinstance(node, dict): + continue + if str(node.get("assetId", "")).strip() != asset_id: + continue + return { + "total": int(node.get("totalAmount", 0) or 0), + "spendable": int(node.get("spendableAmount", 0) or 0), + "locked": int(node.get("lockedAmount", 0) or 0), + } + return None + + +def _fetch_quote_coins(*, wallet: Any, asset_id: str) -> list[dict[str, Any]]: + query = """ +query quoteCoins( + $walletId: ID! + $assetId: ID + $includePending: Boolean + $includeSpent: Boolean + $first: Int +) { + coins( + walletId: $walletId + assetId: $assetId + includePending: $includePending + includeSpent: $includeSpent + sortKey: CREATED_AT + first: $first + ) { + edges { + node { + id + name + createdAt + createdBlockHeight + spentBlockHeight + amount + state + isLocked + isLinkedToOpenOffer + puzzleHash + parentCoinName + } + } + } +} +""" + payload = _graphql_with_retry( + wallet=wallet, + query=query, + variables={ + "walletId": wallet.vault_id, + "assetId": asset_id, + "includePending": True, + "includeSpent": True, + "first": 100, + }, + ) + edges = (payload.get("coins") or {}).get("edges") or [] + rows: list[dict[str, Any]] = [] + for edge in edges: + node = edge.get("node") if isinstance(edge, dict) else None + if not isinstance(node, dict): + continue + rows.append( + { + "id": str(node.get("id", "")).strip(), + "coin_id": _coin_hex(node.get("id")), + "name": str(node.get("name", "")).strip().lower(), + "created_at": str(node.get("createdAt", "")).strip(), + "created_dt": _parse_dt(node.get("createdAt")), + "created_block_height": node.get("createdBlockHeight"), + "spent_block_height": node.get("spentBlockHeight"), + "amount": int(node.get("amount", 0) or 0), + "state": str(node.get("state", "")).strip().upper(), + "is_locked": bool(node.get("isLocked", False)), + "is_linked_to_open_offer": bool(node.get("isLinkedToOpenOffer", False)), + "puzzle_hash": str(node.get("puzzleHash", "")).strip(), + "parent_coin_id": str(node.get("parentCoinName", "")).strip().lower(), + } + ) + return rows + + +def _current_locked_quote_coins(coins: list[dict[str, Any]]) -> list[dict[str, Any]]: + rows = [ + coin + for coin in coins + if coin["state"] == "SETTLED" + and coin["spent_block_height"] is None + and coin["is_locked"] + and not coin["is_linked_to_open_offer"] + ] + rows.sort( + key=lambda coin: (coin["created_dt"] or datetime.min.replace(tzinfo=UTC), coin["coin_id"]) + ) + return rows + + +def _lineage_for_coin( + *, coin: dict[str, Any], coins_by_id: dict[str, dict[str, Any]] +) -> list[dict[str, Any]]: + lineage: list[dict[str, Any]] = [] + current = coin + seen: set[str] = set() + for _ in range(32): + coin_id = str(current.get("coin_id", "")).strip().lower() + if not coin_id or coin_id in seen: + break + seen.add(coin_id) + lineage.append(current) + parent_id = str(current.get("parent_coin_id", "")).strip().lower() + if not parent_id: + break + parent = coins_by_id.get(parent_id) + if parent is None: + break + current = parent + return lineage + + +def _fetch_creator_quote_offers_basic(*, wallet: Any, quote_asset_id: str) -> list[dict[str, Any]]: + query = """ +query walletOffers($walletId: ID!, $first: Int, $after: String) { + wallet(id: $walletId) { + offers(first: $first, after: $after, isCreator: true) { + pageInfo { + hasNextPage + endCursor + } + edges { + node { + id + offerId + state + settlementType + createdAt + expiresAt + assets(first: 4) { + edges { + node { + amount + type + asset { + id + } + } + } + } + } + } + } + } +} +""" + after: str | None = None + offers: list[dict[str, Any]] = [] + for _ in range(128): + payload = _graphql_with_retry( + wallet=wallet, + query=query, + variables={"walletId": wallet.vault_id, "first": 100, "after": after}, + ) + offers_payload = (payload.get("wallet") or {}).get("offers") or {} + edges = offers_payload.get("edges") or [] + for edge in edges: + node = edge.get("node") if isinstance(edge, dict) else None + if not isinstance(node, dict): + continue + legs = [] + for asset_edge in (node.get("assets") or {}).get("edges") or []: + asset_node = asset_edge.get("node") if isinstance(asset_edge, dict) else None + if not isinstance(asset_node, dict): + continue + asset = asset_node.get("asset") or {} + if not isinstance(asset, dict): + continue + legs.append( + { + "asset_id": str(asset.get("id", "")).strip(), + "type": str(asset_node.get("type", "")).strip().upper(), + "amount": int(asset_node.get("amount", 0) or 0), + } + ) + if not any( + leg["asset_id"] == quote_asset_id and leg["type"] == "OFFERED" for leg in legs + ): + continue + offers.append( + { + "wallet_offer_id": str(node.get("id", "")).strip(), + "offer_id": str(node.get("offerId", "")).strip(), + "state": str(node.get("state", "")).strip(), + "settlement_type": node.get("settlementType"), + "created_at": str(node.get("createdAt", "")).strip(), + "created_dt": _parse_dt(node.get("createdAt")), + "expires_at": str(node.get("expiresAt", "")).strip(), + "legs": legs, + } + ) + page_info = offers_payload.get("pageInfo") or {} + if not bool(page_info.get("hasNextPage", False)): + break + after_value = page_info.get("endCursor") + if not isinstance(after_value, str) or not after_value: + break + after = after_value + return offers + + +def _fetch_wallet_offer_detail(*, wallet: Any, wallet_offer_id: str) -> dict[str, Any] | None: + query = """ +query walletOfferDetail($id: ID!) { + walletOffer(id: $id) { + id + offerId + state + settlementType + createdAt + expiresAt + assets(first: 4) { + edges { + node { + amount + type + asset { + id + } + } + } + } + transactions { + id + createdAt + type + fee + state + inputs { + edges { + node { + id + amount + asset { + id + } + } + } + } + outputs { + edges { + node { + id + amount + asset { + id + } + } + } + } + } + } +} +""" + payload = _graphql_with_retry(wallet=wallet, query=query, variables={"id": wallet_offer_id}) + node = payload.get("walletOffer") + if not isinstance(node, dict): + return None + return node if isinstance(node, dict) else None + + +def _transaction_summary(node: dict[str, Any]) -> dict[str, Any]: + def _legs(section: str) -> list[dict[str, Any]]: + edges = (node.get(section) or {}).get("edges") or [] + rows: list[dict[str, Any]] = [] + for edge in edges: + leg = edge.get("node") if isinstance(edge, dict) else None + if not isinstance(leg, dict): + continue + asset = leg.get("asset") or {} + rows.append( + { + "coin_id": _coin_hex(leg.get("id")), + "amount": int(leg.get("amount", 0) or 0), + "asset_id": str(asset.get("id", "")).strip() if isinstance(asset, dict) else "", + } + ) + return rows + + return { + "id": str(node.get("id", "")).strip(), + "created_at": str(node.get("createdAt", "")).strip(), + "amount": int(node.get("amount", 0) or 0), + "type": str(node.get("type", "")).strip(), + "state": str(node.get("state", "")).strip(), + "inputs": _legs("inputs"), + "outputs": _legs("outputs"), + } + + +def _coin_match_summary(*, coin_id: str, tx: dict[str, Any]) -> dict[str, bool]: + inputs = {row["coin_id"] for row in tx.get("inputs", [])} + outputs = {row["coin_id"] for row in tx.get("outputs", [])} + return { + "tx_input_match": coin_id in inputs, + "tx_output_match": coin_id in outputs, + } + + +@dataclass +class CoinTrace: + coin: dict[str, Any] + lineage: list[dict[str, Any]] + nearby_offers: list[dict[str, Any]] + + +def _trace_coin( + *, + wallet: Any, + coin: dict[str, Any], + coins_by_id: dict[str, dict[str, Any]], + creator_quote_offers: list[dict[str, Any]], + window_hours: int, +) -> CoinTrace: + lineage = _lineage_for_coin(coin=coin, coins_by_id=coins_by_id) + coin_created = coin.get("created_dt") + nearby_offers: list[dict[str, Any]] = [] + if coin_created is None: + return CoinTrace(coin=coin, lineage=lineage, nearby_offers=nearby_offers) + + window = timedelta(hours=max(1, int(window_hours))) + candidates = [ + offer + for offer in creator_quote_offers + if offer["created_dt"] is not None and abs(offer["created_dt"] - coin_created) <= window + ] + candidates.sort(key=lambda offer: abs((offer["created_dt"] - coin_created).total_seconds())) + + for offer in candidates[:8]: + detail = _fetch_wallet_offer_detail(wallet=wallet, wallet_offer_id=offer["wallet_offer_id"]) + if not isinstance(detail, dict): + continue + summarized_transactions: list[dict[str, Any]] = [] + for raw_tx in detail.get("transactions") or []: + if not isinstance(raw_tx, dict): + continue + tx_detail = _transaction_summary(raw_tx) + match_summary = _coin_match_summary(coin_id=coin["coin_id"], tx=tx_detail) + summarized_transactions.append({**tx_detail, "match": match_summary}) + nearby_offers.append( + { + "wallet_offer_id": str(detail.get("id", "")).strip(), + "offer_id": str(detail.get("offerId", "")).strip(), + "state": str(detail.get("state", "")).strip(), + "settlement_type": detail.get("settlementType"), + "created_at": str(detail.get("createdAt", "")).strip(), + "expires_at": str(detail.get("expiresAt", "")).strip(), + "transactions": summarized_transactions, + } + ) + return CoinTrace(coin=coin, lineage=lineage, nearby_offers=nearby_offers) + + +def _render_text_report( + *, + vault_id: str, + quote_asset_id: str, + wallet_asset: dict[str, int] | None, + current_locked: list[dict[str, Any]], + traces: list[CoinTrace], +) -> str: + lines: list[str] = [] + lines.append(f"vault_id: {vault_id}") + lines.append(f"quote_asset_id: {quote_asset_id}") + if wallet_asset is not None: + lines.append( + "wallet_asset: " + f"total={wallet_asset['total']} " + f"spendable={wallet_asset['spendable']} " + f"locked={wallet_asset['locked']}" + ) + lines.append(f"current_locked_coin_count: {len(current_locked)}") + lines.append(f"current_locked_total: {sum(int(row['amount']) for row in current_locked)}") + lines.append("") + for trace in traces: + coin = trace.coin + lines.append( + "locked_coin: " + f"{coin['coin_id']} " + f"amount={coin['amount']} " + f"created_at={coin['created_at']} " + f"created_height={coin['created_block_height']}" + ) + lines.append("lineage:") + for row in trace.lineage: + lines.append( + " " + f"{row['coin_id']} " + f"amount={row['amount']} " + f"created_at={row['created_at']} " + f"spent_height={row['spent_block_height']}" + ) + if not trace.nearby_offers: + lines.append("nearby_offers: none") + lines.append("") + continue + lines.append("nearby_offers:") + for offer in trace.nearby_offers: + lines.append( + " " + f"{offer['wallet_offer_id']} " + f"state={offer['state']} " + f"settlement={offer['settlement_type']} " + f"created_at={offer['created_at']}" + ) + if not offer["transactions"]: + lines.append(" transactions: none") + continue + for tx in offer["transactions"]: + match = tx["match"] + lines.append( + " " + f"{tx['id']} " + f"type={tx['type']} " + f"state={tx['state']} " + f"match={json.dumps(match, sort_keys=True)}" + ) + reservation = tx.get("reservation") + if reservation is not None: + lines.append( + " " + f"reservation={reservation['id']} " + f"type={reservation['type']} " + f"state={reservation['state']}" + ) + lines.append("") + return "\n".join(lines) + + +def main() -> int: + parser = argparse.ArgumentParser( + description="Trace hidden locked quote coins in a Cloud Wallet vault." + ) + parser.add_argument( + "--program-config", + default=str(Path("~/.greenfloor/config/program.yaml").expanduser()), + help="Path to program.yaml", + ) + parser.add_argument("--vault-id", default="", help="Optional Cloud Wallet vault override") + parser.add_argument( + "--quote", default="wUSDC.b", help="Quote asset reference (default: wUSDC.b)" + ) + parser.add_argument( + "--coin-id", + action="append", + default=[], + help="Restrict tracing to one or more coin ids (hex or CoinRecord_...)", + ) + parser.add_argument( + "--window-hours", + type=int, + default=24, + help="Creator-offer correlation window around locked coin creation time", + ) + parser.add_argument("--json", action="store_true", help="Output JSON report") + args = parser.parse_args() + + program = load_program_config(Path(args.program_config)) + wallet = _new_cloud_wallet_adapter(program) + if args.vault_id.strip() and args.vault_id.strip() != wallet.vault_id: + cfg = _require_cloud_wallet_config(program) + cfg = cfg.__class__( + base_url=cfg.base_url, + user_key_id=cfg.user_key_id, + private_key_pem_path=cfg.private_key_pem_path, + vault_id=args.vault_id.strip(), + network=cfg.network, + kms_key_id=cfg.kms_key_id, + kms_region=cfg.kms_region, + kms_public_key_hex=cfg.kms_public_key_hex, + ) + from greenfloor.adapters.cloud_wallet import CloudWalletAdapter # noqa: PLC0415 + + wallet = CloudWalletAdapter(cfg) + + quote_asset_id = _resolve_cloud_wallet_asset_id( + wallet=wallet, + canonical_asset_id=args.quote, + symbol_hint=args.quote, + ) + wallet_asset = _wallet_asset_row(wallet=wallet, asset_id=quote_asset_id) + quote_coins = _fetch_quote_coins(wallet=wallet, asset_id=quote_asset_id) + coins_by_id = {row["coin_id"]: row for row in quote_coins if row["coin_id"]} + current_locked = _current_locked_quote_coins(quote_coins) + + requested_coin_ids = {_coin_hex(value) for value in args.coin_id} + if requested_coin_ids: + current_locked = [row for row in current_locked if row["coin_id"] in requested_coin_ids] + + creator_quote_offers = _fetch_creator_quote_offers_basic( + wallet=wallet, quote_asset_id=quote_asset_id + ) + traces = [ + _trace_coin( + wallet=wallet, + coin=coin, + coins_by_id=coins_by_id, + creator_quote_offers=creator_quote_offers, + window_hours=args.window_hours, + ) + for coin in current_locked + ] + + payload = { + "vault_id": wallet.vault_id, + "quote_asset_id": quote_asset_id, + "wallet_asset": wallet_asset, + "current_locked_coins": current_locked, + "traces": [ + { + "coin": trace.coin, + "lineage": trace.lineage, + "nearby_offers": trace.nearby_offers, + } + for trace in traces + ], + } + if args.json: + print(json.dumps(payload, indent=2, sort_keys=True)) + return 0 + + print( + _render_text_report( + vault_id=wallet.vault_id, + quote_asset_id=quote_asset_id, + wallet_asset=wallet_asset, + current_locked=current_locked, + traces=traces, + ) + ) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) From ae90246d69d4b427f6b60e9572d943bf659a6575 Mon Sep 17 00:00:00 2001 From: Gene Hoffman Date: Wed, 11 Mar 2026 20:47:14 -0700 Subject: [PATCH 12/12] test: make parallel reservation contention deterministic Replace the race-prone sqlite-backed contention setup with a deterministic coordinator stub so the parallel reservation test behaves consistently across CI runners. Made-with: Cursor --- tests/test_daemon_offer_execution.py | 40 +++++++++++++++++++--------- 1 file changed, 27 insertions(+), 13 deletions(-) diff --git a/tests/test_daemon_offer_execution.py b/tests/test_daemon_offer_execution.py index f8c1d56..10649a6 100644 --- a/tests/test_daemon_offer_execution.py +++ b/tests/test_daemon_offer_execution.py @@ -3,6 +3,7 @@ import threading from datetime import UTC, datetime, timedelta from pathlib import Path +from types import SimpleNamespace from typing import Any, cast from greenfloor.config.models import MarketConfig, MarketInventoryConfig @@ -1467,9 +1468,7 @@ def _unexpected_builder(**_kwargs): assert calls["builder"] == 0 -def test_execute_strategy_actions_parallel_cloud_wallet_reservation_contention( - monkeypatch, tmp_path -) -> None: +def test_execute_strategy_actions_parallel_cloud_wallet_reservation_contention(monkeypatch) -> None: daemon_main._POST_COOLDOWN_UNTIL.clear() class _FakeCloudWallet: @@ -1506,8 +1505,29 @@ def list_coins(self, *, include_pending: bool = True): _Program = _ParallelCloudWalletProgram - db_path = tmp_path / "reservations.sqlite" - coordinator = AssetReservationCoordinator(db_path=db_path, lease_seconds=300) + class _DeterministicContentionCoordinator: + def __init__(self) -> None: + self.non_empty_acquire_calls = 0 + self.released: list[tuple[str, str]] = [] + + def try_acquire(self, **kwargs): + requested = dict(kwargs.get("requested_amounts", {}) or {}) + if not requested: + # Daemon health-check path. + return SimpleNamespace(ok=True, reservation_id="res-health", error=None) + self.non_empty_acquire_calls += 1 + if self.non_empty_acquire_calls == 1: + return SimpleNamespace(ok=True, reservation_id="res-1", error=None) + return SimpleNamespace( + ok=False, + reservation_id=None, + error="reservation_insufficient_asset", + ) + + def release(self, *, reservation_id: str, status: str) -> None: + self.released.append((str(reservation_id), str(status))) + + coordinator = _DeterministicContentionCoordinator() dexie = _FakeDexie(post_result={"success": True, "id": "offer-parallel"}) dexie.visible_offer_ids = {"offer-parallel"} store = _FakeStore() @@ -1531,18 +1551,12 @@ def list_coins(self, *, include_pending: bool = True): store=cast(Any, store), publish_venue="dexie", program=_Program(), - reservation_coordinator=coordinator, + reservation_coordinator=cast(Any, coordinator), ) assert result["planned_count"] == 2 assert result["executed_count"] == 1 assert any("reservation_insufficient_asset" in str(item["reason"]) for item in result["items"]) - sqlite_store = SqliteStore(db_path) - try: - rows = sqlite_store.list_offer_reservation_leases() - assert len(rows) == 1 - assert rows[0]["status"] == "released_success" - finally: - sqlite_store.close() + assert coordinator.released == [("res-1", "released_success")] def test_execute_strategy_actions_parallel_releases_reservation_on_failure(