2828from flask import Flask , g , jsonify , request , has_request_context
2929from flask_cors import CORS
3030
31- APP_VERSION = "1.9.0-tenancy-foundation "
31+ APP_VERSION = "1.9.1-webhook-ack-inline "
3232TRANSFER_TOPIC = "0xddf252ad00000000000000000000000000000000000000000000000000000000"
3333ZERO_EVM = "0x0000000000000000000000000000000000000000"
3434BASE58_ALPHABET = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"
@@ -2067,7 +2067,7 @@ def build_webhook_payload(record: Dict[str, Any], delivery: Dict[str, Any]) -> D
20672067def update_webhook_delivery_result (delivery_id : str , * , delivery_status : str , ack_status : Optional [str ] = None ,
20682068 next_attempt_at : str = "" , last_response_code : Optional [int ] = None ,
20692069 last_response_excerpt : str = "" , last_error : str = "" , delivered_at : str = "" ,
2070- increment_attempt : bool = False ) -> None :
2070+ acknowledged_at : str = "" , increment_attempt : bool = False ) -> None :
20712071 conn = get_db ()
20722072 try :
20732073 row = db_fetchone (conn , "SELECT attempt_count FROM webhook_deliveries WHERE delivery_id = ? LIMIT 1" , (delivery_id ,))
@@ -2084,6 +2084,7 @@ def update_webhook_delivery_result(delivery_id: str, *, delivery_status: str, ac
20842084 next_attempt_at = ?,
20852085 last_attempt_at = ?,
20862086 delivered_at = COALESCE(?, delivered_at),
2087+ acknowledged_at = COALESCE(?, acknowledged_at),
20872088 last_response_code = ?,
20882089 last_response_excerpt = ?,
20892090 last_error = ?
@@ -2097,6 +2098,7 @@ def update_webhook_delivery_result(delivery_id: str, *, delivery_status: str, ac
20972098 next_attempt_at ,
20982099 utc_now_iso (),
20992100 delivered_at or None ,
2101+ acknowledged_at or None ,
21002102 last_response_code ,
21012103 normalize_text (last_response_excerpt , 500 ),
21022104 normalize_text (last_error , 500 ),
@@ -2180,6 +2182,30 @@ def compute_retry_schedule(attempt_count: int) -> Tuple[bool, str]:
21802182 return False , ""
21812183
21822184
2185+ def should_mark_webhook_acknowledged (response : Any ) -> bool :
2186+ try :
2187+ status_code = int (getattr (response , "status_code" , 0 ) or 0 )
2188+ except Exception :
2189+ status_code = 0
2190+ if status_code < 200 or status_code >= 300 :
2191+ return False
2192+ text = str (getattr (response , "text" , "" ) or "" ).strip ()
2193+ if not text :
2194+ return True
2195+ try :
2196+ payload = response .json ()
2197+ except Exception :
2198+ lowered = text .lower ()
2199+ return lowered in {"ok" , "accepted" , "ack" , "acknowledged" , "received" }
2200+ if isinstance (payload , dict ):
2201+ if payload .get ("acknowledged" ) is True or payload .get ("ack" ) is True or payload .get ("ok" ) is True :
2202+ return True
2203+ status_value = str (payload .get ("status" ) or "" ).strip ().lower ()
2204+ if status_value in {"ok" , "accepted" , "acknowledged" , "received" }:
2205+ return True
2206+ return False
2207+
2208+
21832209def attempt_webhook_delivery (delivery : Dict [str , Any ]) -> None :
21842210 delivery_id = str (delivery .get ("delivery_id" ) or "" )
21852211 record_id = str (delivery .get ("record_id" ) or "" )
@@ -2206,17 +2232,20 @@ def attempt_webhook_delivery(delivery: Dict[str, Any]) -> None:
22062232 )
22072233 excerpt = normalize_text (response .text , 500 )
22082234 if 200 <= int (response .status_code ) < 300 :
2235+ delivered_at = utc_now_iso ()
2236+ acknowledged_at = delivered_at if should_mark_webhook_acknowledged (response ) else ""
22092237 update_webhook_delivery_result (
22102238 delivery_id ,
22112239 delivery_status = "delivered" ,
2212- ack_status = "http_accepted" ,
2240+ ack_status = "acknowledged" if acknowledged_at else " http_accepted" ,
22132241 last_response_code = int (response .status_code ),
22142242 last_response_excerpt = excerpt ,
22152243 last_error = "" ,
2216- delivered_at = utc_now_iso (),
2244+ delivered_at = delivered_at ,
2245+ acknowledged_at = acknowledged_at ,
22172246 increment_attempt = True ,
22182247 )
2219- emit_structured_log ("webhook_delivery_succeeded" , event_name = delivery .get ("event_name" ), delivery_id = delivery_id , record_id = record_id , status_code = int (response .status_code ))
2248+ emit_structured_log ("webhook_delivery_succeeded" , event_name = delivery .get ("event_name" ), delivery_id = delivery_id , record_id = record_id , status_code = int (response .status_code ), acknowledged = bool ( acknowledged_at ) )
22202249 return
22212250 should_retry , next_attempt_at = compute_retry_schedule (int (delivery .get ("attempt_count" ) or 0 ) + 1 )
22222251 update_webhook_delivery_result (
0 commit comments