@@ -816,7 +816,12 @@ def _unwrap_contract_metadata_payload(raw: Any, symbol: Any) -> Dict[str, Any]:
816816 return _flatten_contract_metadata_payload (data )
817817
818818
819- def _normalise_exchange_commission_rate (key : str , value : Any ) -> Optional [float ]:
819+ def _normalise_exchange_commission_rate (
820+ key : str ,
821+ value : Any ,
822+ * ,
823+ okx_fee_sign : bool = False ,
824+ ) -> Optional [float ]:
820825 number = _coerce_float (value , None )
821826 if number is None :
822827 return None
@@ -825,13 +830,26 @@ def _normalise_exchange_commission_rate(key: str, value: Any) -> Optional[float]
825830 return number / 10000.0
826831 if key_lower in {"makercommissionrate" , "takercommissionrate" } and abs (number ) > 1 :
827832 return number / 10000.0
828- if key_lower in {"makeru" , "takeru" }:
833+ if key_lower in {"makeru" , "takeru" } or (
834+ okx_fee_sign and key_lower in {"maker" , "taker" }
835+ ):
829836 return - number
830837 if abs (number ) > 1 :
831838 return number / 100.0
832839 return number
833840
834841
842+ def _first_metadata_item (metadata : Dict [str , Any ], * keys : str ) -> Tuple [str , Any ]:
843+ for key in keys :
844+ if key not in metadata :
845+ continue
846+ value = metadata .get (key )
847+ if value in (None , "" ):
848+ continue
849+ return key , value
850+ return "" , None
851+
852+
835853def _normalise_contract_metadata (raw : Any , symbol : Any , * , source : str = "" ) -> Dict [str , Any ]:
836854 data = _unwrap_contract_metadata_payload (raw , symbol )
837855 if not data :
@@ -883,23 +901,46 @@ def _normalise_contract_metadata(raw: Any, symbol: Any, *, source: str = "") ->
883901 metadata ["multiplier" ] = 1.0
884902 metadata ["contract_size" ] = 1.0
885903
886- maker_rate = _normalise_exchange_commission_rate (
904+ okx_fee_sign = "okx" in " " .join (
905+ str (metadata .get (key ) or "" )
906+ for key in ("source" , "fee_source" , "exchange" , "exchange_id" )
907+ ).lower () or any (
908+ key in metadata
909+ for key in (
910+ "makerU" ,
911+ "takerU" ,
912+ "makerUSDC" ,
913+ "takerUSDC" ,
914+ "feeGroup" ,
915+ )
916+ )
917+ maker_key , maker_value = _first_metadata_item (
918+ metadata ,
919+ "maker_commission_rate" ,
920+ "maker_fee_rate" ,
887921 "makerCommissionRate" ,
888- metadata .get ("maker_commission_rate" )
889- or metadata .get ("maker_fee_rate" )
890- or metadata .get ("makerCommissionRate" )
891- or metadata .get ("makerCommission" )
892- or metadata .get ("makerU" )
893- or metadata .get ("maker" ),
922+ "makerCommission" ,
923+ "makerU" ,
924+ "maker" ,
894925 )
895- taker_rate = _normalise_exchange_commission_rate (
926+ taker_key , taker_value = _first_metadata_item (
927+ metadata ,
928+ "taker_commission_rate" ,
929+ "taker_fee_rate" ,
896930 "takerCommissionRate" ,
897- metadata .get ("taker_commission_rate" )
898- or metadata .get ("taker_fee_rate" )
899- or metadata .get ("takerCommissionRate" )
900- or metadata .get ("takerCommission" )
901- or metadata .get ("takerU" )
902- or metadata .get ("taker" ),
931+ "takerCommission" ,
932+ "takerU" ,
933+ "taker" ,
934+ )
935+ maker_rate = _normalise_exchange_commission_rate (
936+ maker_key ,
937+ maker_value ,
938+ okx_fee_sign = okx_fee_sign ,
939+ )
940+ taker_rate = _normalise_exchange_commission_rate (
941+ taker_key ,
942+ taker_value ,
943+ okx_fee_sign = okx_fee_sign ,
903944 )
904945 if maker_rate is not None :
905946 metadata ["maker_commission_rate" ] = maker_rate
0 commit comments