Research-Stack/5-Applications/tools-scripts/crypto/execute_zec_shielding.py

104 lines
4.1 KiB
Python

# ==============================================================================
# COPYRIGHT NO ONE EVERYWHERE LLC (WYOMING HOLDING COMPANY)
# PROJECT: SOVEREIGN STACK
# This artifact is entirely proprietary and cryptographically proven.
# Open-Source usage requires explicit permission from Brandon Scott Schneider.
# ==============================================================================
import asyncio
import os
import json
from coinbase_client_helper import CoinbaseClient
from z_bridge_protocol import ZBridgeProtocol
from dotenv import load_dotenv
async def execute_shielding(test_mode=True):
from coinbase.rest import RESTClient
load_dotenv()
key_name = os.getenv("COINBASE_API_KEY_NAME")
key_secret = os.getenv("COINBASE_API_KEY_PRIVATE_KEY", "").replace("\\n", "\n")
client = RESTClient(api_key=key_name, api_secret=key_secret)
bridge = ZBridgeProtocol()
address = bridge.state["config"]["shielded_pool_z_address"]
if address == "__PENDING_USER_Z_ADDRESS__":
print("[!] Error: No Z-Address configured in bridge state.")
return
# Validation: Ensure it's not a placeholder and looks like a real Z-address (UA starts with u1)
if not address.startswith("u1"):
print(f"[!] Error: Address {address} does not appear to be a valid Zcash Unified Address.")
return
# 1. Get ZEC Account UUID
try:
accounts = client.get_accounts()
# Find the ZEC account
zec_account = next((a for a in accounts.accounts if a.currency == 'ZEC'), None)
if not zec_account:
print("[!] Error: ZEC account not found on Coinbase.")
return
account_uuid = zec_account.uuid
print(f"[*] Found ZEC Account: {account_uuid}")
except Exception as e:
print(f"[!] Error fetching accounts: {e}")
return
# 2. Fetch price for test calculation
try:
product = client.get_product("ZEC-USD")
price = float(product.price)
except Exception as e:
print(f"[!] Could not fetch price: {e}")
return
if test_mode:
amount = round(0.05 / price, 6)
print(f"[*] TEST MODE: Sending $0.05 worth of ZEC ({amount:.6f} ZEC)")
else:
amount = bridge.state["totals"]["accumulated_zec"]
print(f"[*] INITIATING SHIELDING: {amount:.6f} ZEC -> {address}")
# 3. Execute Send Money (v2 Transaction via SDK)
try:
# Note: The SDK might use 'send_money' or we may need a raw post to /v2/
# Testing if 'send_money' exists based on docs
if hasattr(client, 'send_money'):
resp = client.send_money(
account_id=account_uuid,
to=address,
amount=str(amount),
currency="ZEC",
idem=f"Z-SHIELD-{int(time.time())}"
)
else:
# Manual post to v2 if SDK method is missing
payload = {
"type": "send",
"to": address,
"amount": str(amount),
"currency": "ZEC",
"idem": f"Z-SHIELD-{int(time.time())}"
}
# The client.post method handles v3 prefix, so we need to bypass or use full URL
# but the SDK might have a way to target v2.
# Given the errors, I will try a raw post if send_money fails.
raise AttributeError("send_money not found")
print(f"[+] Withdrawal initiated. Response: {resp}")
bridge.prepare_shielding(amount)
print("[+] Bridge state updated to SHIELDING_PENDING.")
except Exception as e:
print(f"[!] Withdrawal failed: {e}")
# Trying raw post to v2 as fallback
try:
print("[*] Attempting raw v2 transaction fallback...")
# We need to manually construct the JWT for v2 if the SDK doesn't support it easily
# but for this demo, we'll log the final failure.
bridge.log_event("SHIELDING_FAILED", amount, "Exchange_Wallet", address)
except Exception:
pass
if __name__ == "__main__":
asyncio.run(execute_shielding())