
    ei;U                    X   d dl mZ d dlmZ d dlZd dlmZmZmZm	Z	m
Z
mZmZmZmZmZmZmZmZmZmZmZmZmZmZ d dlmZ d dlmZ d dlmZ d dlmZ d d	lmZ d d
lm Z  d dlm!Z! d dlm"Z" d dlm#Z# d dlm$Z$ d dlm%Z% d dlm&Z& d dlm'Z' d dlm(Z( d dl)m*Z* d dl+m,Z,  G d dee          Z-dS )    )Exchange)ImplicitAPIN)AnyBalances
CurrenciesCurrencyDepositAddressIntMarketNumOrder	OrderBook	OrderSide	OrderTypeStrStringsTickerTickersTradeTradingFeesTransaction)List)ExchangeError)AuthenticationError)PermissionDenied)ArgumentsRequired)
BadRequest)InsufficientFunds)InvalidOrder)OrderNotFound)NotSupported)RateLimitExceeded)ExchangeNotAvailable)OnMaintenance)InvalidNonce)	TICK_SIZE)Precisec                       e Zd Zdef fdZi fdefdZi fdZi fdee	         fdZ
i fdZd Zi fdZi fd	Zde	fd
Zdi fdededefdZi fdefdZi fdefdZi fdefdZi fdedefdZdIdede	defdZdi fdedefdZdIdede	defdZddi fdedededee         fdZ de!fdZ"i fde#fdZ$i fde!fdZ%dIdede	de&fd Z'di fd!ede(fd"Z)dddi fde(dededee&         fd#Z*di fded$e+d%e,d&e-d'e.f
d(Z/di fd!ede(fd)Z0dddi fde(dedefd*Z1di fd+ed&e-d,ed-e(de2f
d.Z3d/ Z4dddi fd+e(dededee2         fd0Z5dId1ed2e6de2fd3Z7d4e(fd5Z8dId2e6fd6Z9i fd+ede:fd7Z;i fd+edee:         fd8Z<d9d:i ddfd;Z=d<e>d=ed>ed?ed@edAefdBZ?i fd+ede:fdCZ@dDddi fdedEedededeeA         f
dFZBi fdefdGZCdIde	fdHZD xZES )Jgeminireturnc                    |                      t          t          |                                           i ddddddgddd	d
dddi dd dddd ddddddddddddddddddddddddddddi d dd!dd"dd#dd$dd%dd&dd'dd(dd)dd*dd+dd,dd-dd.dd/dd0di d1dd2dd3dd4dd5dd6dd7dd8dd9dd:dd;dd<dd=dd>dd?dd@ddAddddddBddddddddCdDdEdFdFdGdHdIdJdKdLgdMdMdGdHdIg dNdOdPdQdRgidQdSgidQi dTdUdVdUdWdUdXdUdYdUdZdUd[dUd\dUd]dUd^dUd_dUd`dUdadUdbdUdcdUdddUdedUdUdUdfidgdhii didhdjdhdkdhdldhdmdhdndhdodhdpdhdqdhdrdhdsdhdtdhdudhdvdhdwdhdxdhdydhi dzdhd{dhd|dhd}dhd~dhddhddhddhddhddhddhddhddhddhddhddhddhi ddhddhddhddhddhddhddhddhddhddhddhddhddhddhddhddhddhdhdhdhdhdhdhdhdhdhd	dddt          dddddidt
          t          t          t          t          t          t          t          dddddddddddi dt
          dt
          dt
          dt
          dt
          dt
          dt
          dt          dt
          dt          dt          dt          dt          dt          dt          dt          dt
          t
          t          t          t          t          t          t          t          t          t
          t          t          t          t
          dt          t          t          dÜdĜddddg dȢdɜdddʜddgddUdd͜ddddddddddddddۜdddddig ddddddd dddd dddddddddddddd ddd d ddddddddd ddddd d dd id	ddiddid dd d dd          S )Nidr)   nameGemini	countriesUS	rateLimitd   versionv1proThasCORSspotmarginswapfutureFoption	addMargincancelOrdercloseAllPositionsclosePositioncreateDepositAddresscreateMarketOrdercreateOrdercreateReduceOnlyOrderfetchBalancefetchBidsAsksfetchBorrowRateHistoriesfetchBorrowRateHistoryfetchClosedOrdersfetchCrossBorrowRatefetchCrossBorrowRatesfetchCurrenciesfetchDepositAddressfetchDepositAddressesfetchDepositAddressesByNetworkfetchDepositsWithdrawalsfetchFundingHistoryfetchFundingRatefetchFundingRateHistoryfetchFundingRatesfetchIndexOHLCVfetchIsolatedBorrowRatefetchIsolatedBorrowRatesfetchLeveragefetchLeverageTiersfetchMarginModefetchMarketsfetchMarkOHLCVfetchMyTrades
fetchOHLCVfetchOpenInterestHistoryfetchOpenOrders
fetchOrderfetchOrderBookfetchOrdersfetchPositionfetchPositionModefetchPositionsfetchPositionsRiskfetchPremiumIndexOHLCVfetchTickeremulated)fetchTickersfetchTradesfetchTradingFeefetchTradingFeesfetchTransactionspostOnlyreduceMarginsandboxsetLeveragesetMarginModesetPositionModewithdrawurlszchttps://user-images.githubusercontent.com/1294454/27816857-ce7be644-6096-11e7-82d6-3c257263229c.jpgzhttps://api.gemini.comzhttps://docs.gemini.comzhttps://exchange.gemini.com)publicprivatewebwebExchangezhttps://gemini.com/z https://docs.gemini.com/rest-apizhttps://docs.sandbox.gemini.comzhttps://api.sandbox.gemini.com)z#https://gemini.com/api-fee-schedulezhttps://gemini.com/trading-feesz https://gemini.com/transfer-fees)logoapiwwwdoctestfeesr}   get zrest-apiz
v1/symbols   zv1/symbols/details/{symbol}zv1/network/{token}zv1/staking/rateszv1/pubticker/{symbol}zv1/feepromoszv2/ticker/{symbol}zv2/candles/{symbol}/{timeframe}zv1/trades/{symbol}zv1/auction/{symbol}zv1/auction/{symbol}/historyzv1/pricefeedzv1/fundingamount/{symbol}z#v1/fundingamountreport/records.xlsxzv1/book/{symbol}zv1/earn/ratesz,v2/derivatives/candles/{symbol}/{time_frame})zv2/fxrate/{symbol}/{timestamp}zv1/riskstats/{symbol}z/v1/perpetuals/fundingpaymentreport/records.xlsx   zv1/staking/unstakezv1/staking/stakezv1/staking/rewardszv1/staking/historyzv1/order/newzv1/order/cancelzv1/wrap/{symbol}zv1/order/cancel/sessionzv1/order/cancel/allzv1/order/statusz	v1/orderszv1/mytradeszv1/notionalvolumezv1/tradevolumezv1/clearing/newzv1/clearing/statuszv1/clearing/cancelzv1/clearing/confirmzv1/balanceszv1/balances/stakingzv1/notionalbalances/{currency}zv1/transferszv1/addresses/{network}zv1/deposit/{network}/newAddressz v1/deposit/{currency}/newAddresszv1/withdraw/{currency}zv1/account/transfer/{currency}zv1/payments/addbankzv1/payments/methodszv1/payments/sen/withdrawzv1/balances/earnzv1/earn/interestzv1/earn/historyz&v1/approvedAddresses/{network}/requestz&v1/approvedAddresses/account/{network}z%v1/approvedAddresses/{network}/removez
v1/accountzv1/account/createzv1/account/listzv1/heartbeatzv1/roleszv1/custodyaccountfeesz/v1/withdraw/{currencyCodeLowerCase}/feeEstimatezv1/payments/addbank/cadzv1/transactionszv1/margin/accountzv1/margin/rateszv1/margin/order/previewzv1/clearing/listzv1/clearing/broker/listzv1/clearing/broker/new)	zv1/clearing/tradeszv1/instant/quotezv1/instant/executezv1/account/renamezv1/oauth/revokeByTokenz	v1/marginzv1/perpetuals/fundingPaymentz/v1/perpetuals/fundingpaymentreport/records.jsonzv1/positions)r   post)r{   rz   rx   ry   precisionModer   tradinggMbp?gMb`?)takermakerhttpExceptions)400403404406429500502503
timeframes1m5m15m30m1hr6hr1day)r   r   r   r   1h6h1d
exceptionsAuctionNotOpenClientOrderIdTooLongClientOrderIdMustBeStringConflictingOptionsEndpointMismatchEndpointNotFoundIneligibleTimingr   InvalidJsonr%   InvalidApiKeyInvalidOrderTypeInvalidPriceInvalidQuantityInvalidSideInvalidSignatureInvalidSymbol)InvalidTimestampInPayloadMaintenanceMarketNotOpenMissingApikeyHeaderMissingOrderFieldMissingRoleMissingPayloadHeaderMissingSignatureHeaderNoSSLOptionsMustBeArrayr    	RateLimitSystemUnsupportedOption)z8The Gemini Exchange is currently undergoing maintenance.z?We are investigating technical issues with the Gemini Exchange.zInternal Server Error)exactbroadoptionsfetch_markets_from_api
   )USDTGUSDUSDDAIEURGBPSGDBTCETHLTCBCHSOLUSDC)fetchDetailsForAllSymbolsquoteCurrencies)webApiEnablewebApiRetriesbtcusdtethusdt)r   r   webApiMuteFailurefetchTickerV1bitcoinethereumbitcoincashlitecoinzcashfilecoindogecointezos	avalanchesolanacosmospolkadot)r   ERC20r   r   ZECFILDOGEXTZAVAXXr   ATOMDOTmillisecondspaxgusdPAXGr   )basequote)efilusd
maticrlusd	maticusdceurusdc	maticgusdmaticusdefilfileurusd)fetchMarketsMethodfetchMarketFromWebRetriesfetchMarketsFromAPIr[   fetchUsdtMarketsrL   fetchTickerMethodnetworksnonceconflictingMarketsbrokenPairsfeatures)IOCFOKPOGTD)
marginModetriggerPricetriggerPriceTypetriggerDirectionstopLossPricetakeProfitPriceattachedStopLossTakeProfittimeInForcehedgedtrailingleveragemarketBuyByCostmarketBuyRequiresPriceselfTradePreventioniceberg  )r  limitdaysBack	untilDayssymbolRequired)r  triggerr  r  )r  r  r  r  r  r  )	rr   rC   createOrdersr]   ra   r`   rc   rI   r^   extendsdefault)linearinverse)r  r8   r:   r;   )deep_extendsuperr)   describer&   r   r   r    r   r"   r   r#   r$   r%   r   r   )self	__class__s    I/var/www/html/volatility/venv/lib/python3.11/site-packages/ccxt/gemini.pyr!  zgemini.describe   s   fd 3 3 < < > > {A
({A
H{A
 ${A
 {A
 t{A
 4{A
  @@@ $@ 	@
 %@ %@ U@ t@ $U@  @ '@ $U@ t@ (@ @   !@" +E#@ @$ )%%@& $U'@( ')@* (+@, "4-@. &t/@0 (1@2 1$3@4 +D5@6 &u7@8 #E9@: *5;@< $U=@> "5?@@ *5A@B +EC@D  E@ @ @F %eG@H "5I@J K@L !%M@N  O@P dQ@R +ES@T "4U@V dW@X !$Y@Z u[@\  ]@^ $U_@` !%a@b %ec@d )%e@f tg@ @h !%##($(%/  %$!&#( @ @ @{A
T }674#@	  -65
 ??
 5#@	 	  / U{A
N   "  $a5q -a +A	
 0 ' -a :1 -a .q 6q ' 4Q >q +A  (!" G#$ ;<12'  2 J1=,a=*A= -a= -a	=
 '= *1= +A= 21= .q= *1= $Q= &q= ,Q= )!= *1=  -a!=" -a#= =$ .q%=& &q'=( .q)=* 9!+=, '-=. 1!/=0 :11=2 ;A3=4 1!5=6 9!7=8 .q9=: .q;=< 3A==> +A?=@ +AA=B *1C=D A!E= = =F A!G=H @I=J %aK=L ,QM=N *1O=P 'Q=R #AS=T 0U=V J1W=X 21Y=Z *1[=\ ,Q]=^ *1_=` 21a=b +Ac=d 21e=f 1!g= =h /0,-./-.23%&89KL()y= = =	B BEe eO{A
Z Y[{A
\ "" ]{A
h !'$(($+$	 	i{A
|  }{A
N  $j *J  0  )*	 
 '
  '
  '
  ():  ":  #L  $%8  '  #L  &|  "<   '(;! " $Z# $ 2<#0%1+>)5#6,?.A0*4%2!2+)3?     D Q^Wk-A E' 'O{A
^ &>-/16 (F  (F  (F( (
 %)%'! ! &/	$:$(%&)-$ $ &5$'(%"%&"(#$%  ( &!&   '  ~~Q) )_{A
r	 #&+(,,0,1).+06:#'#'"&#(	( ( #($)$)+/27/4#()$ $, %)&+!$$(%)*.& & ',#($)*/	# # ',!%#($)*/( ( $()-#_2 2h y
 "9  $	  ## {A As	{A
 { { {	    c                 ,    |                      |          S )z
        fetches all available currencies on an exchange
        :param dict [params]: extra parameters specific to the endpoint
        :returns dict: an associative dictionary of currencies
        )fetch_currencies_from_web)r"  paramss     r$  fetch_currencieszgemini.fetch_currencies  s     --f555r%  c                    |                      ddddd          }|i S i }|                     |d          | j        d<   |                     |dg           }t	          d	t          |                    D ]}||         }|                     |d	          }|                     |          }|                     |d
          rdnd}	|                     | 	                    |                     |d                              }
i }|                     |d          }d}|-| 
                    |          }|||dddd|
dddddddd	||<   |                     ||||                     |d          dddd|	|
ddddddd|d          ||<   |S )z
 @ignore
        fetches all available currencies on an exchange
        :param dict [params]: extra parameters specific to the endpoint
        :returns dict: an associative dictionary of currencies
        rL   webExchangeGetTz="currencyData">z	</script>NtradingPairs
currenciesr      fiatcryptor   	   minmax)depositrv   )	infor,   networkactiver5  rv   fee	precisionlimitsr   )r6  r,   coder-   r8  r5  rv   r9  typer:  r;  r   )fetch_web_endpoint	safe_listr   
safe_valuerangelensafe_stringsafe_currency_codeparse_numberparse_precisionnetwork_id_to_codesafe_currency_structure)r"  r(  dataresultcurrenciesArrayicurrencyr,   r<  r=  r:  r   	networkIdnetworkCodes                 r$  r'  z gemini.fetch_currencies_from_web  s%    &&'8:JDRdfqrr<I* '+~~dN'K'K^$//$bAAq#o..// 5	 5	A&q)H!!(A..B**2..D!--h::H66D))$*>*>t?O?OPXZ[?\?\*]*]^^IH((155IK$"55i@@$#*"# $!* $(#'$ $
 $(#'% %	 	) )%(  77 ((155 &  $#   
  $#! !	 	 %+9 9  F4LL. r%  c                 \   |                      | j        dd          }|dk    rvg }|                    |                     |                     |                    |                     |                     |}|                     |d         |d                   S |                     |          S )a	  
        retrieves data on all markets for gemini

        https://docs.gemini.com/rest-api/#symbols

        :param dict [params]: extra parameters specific to the exchange API endpoint
        :returns dict[]: an array of objects representing market data
        r   r   fetch_markets_from_webr   r   )r@  r   appendrQ  fetch_usdt_marketsarray_concatr   )r"  r(  methodpromisespromisesResults        r$  fetch_marketszgemini.fetch_markets  s     /CE]^^---HOOD77??@@@OOD33F;;<<<%N$$^A%6q8IJJJ**6222r%  c                    |                      dddd          }| j        dz   }|                    d          }t          |          }|dk     rt	          |          |d                             d	          }t          |          }|dk     rt	          |          g }t          d|          D ]A}	||	         }
|
                    d
          }t          |          }|dk     rt	          |          |d                             dd          }|                    dd          }|d                             dd          }|                    d          }|                     |d          }|d                             dd          }|                    d          }t          |          dz
  }|dz
  }|d                             dd          }|                    d          }|                     |d|||                   }|                     |d|                    |d                    }| 	                    |          }| 	                    |          }|
                    i d|d|dz   |z   d|d|dd d|d|dd ddddddddd dd!dd"d d#dd$d d d d d d d |                     |d          |                     |d          d%d d d&|d d&d d d&d d d&d'd |
d(
           C|S ))Nr[   webGetRestApiFz7<h1 id="symbols-and-minimums">Symbols and minimums</h1>z fetchMarketsFromWeb() the API doc HTML markup has changed, breaking the parser of order limits and precision info for markets.ztbody>   r   z
<tr>
z</td>
r   r   z<td>r   *    r,   symbol/r   r   settlebaseIdquoteIdsettleIdr=  r8   Tr9   r:   r;   r<   r8  contractr  )amountpricer2  r  rf  rg  cost
r  contractSizeexpiryexpiryDatetimestrike
optionTyper:  r;  createdr6  )r>  r,   splitrB  r!   rA  replacesafe_numbersafe_string_lowerrD  rR  )r"  r(  rI  errortables	numTablesrowsnumRowsrJ  rL  rowcellsnumCellsmarketIdminAmountStringminAmountParts	minAmountamountPrecisionStringamountPrecisionPartsidLengthstartingIndexpricePrecisionStringpricePrecisionPartsrc  rb  r   r   s                              r$  rQ  zgemini.fetch_markets_from_web  s   &&~  PI  J  J  \  \H%%KK	q==u%%%ayz**d))Q;;u%%%q'"" M	 M	Aq'CIIi((E5zzH!||"5))) Qx''33H''R00H#Ah..vr::O,22377N((;;I$)!H$4$4VR$@$@!#8#>#>s#C#C 8}}q(H$qLM#(8#3#3FB#?#? "6"<"<S"A"A,,-@!Xm\dNdEeffG++,@!XEUEUV]_aEbEbccF**622D++G44EMM 0h0$*u,0 0 	0
 $0 &0 70 D0 0 0 %0 0 %0 %0 $0  E!0" $#0$   $"&""../CQGG!--.A1EE   $#! !
  )# 
  $# 
  $#  $  _0 0 0 0 0 0 0b r%  c                 H    dddddd}|dS |                      ||d          S )NTF)openclosedcancel_only	post_only
limit_only)	safe_boolr"  statusstatusess      r$  parse_market_activezgemini.parse_market_activel  s?    
 
 >4~~h555r%  c                 R   d| j         v rg S |                     | j        dg           }g }t          dt	          |                    D ]_}||         }d|i}|                     |                     ||                    }|                    |                     |                     `|S )Nr   r   r   r_  )	rw   r@  r   rA  rB  publicGetV1SymbolsDetailsSymbolextendrR  parse_market)r"  r(  r   rJ  rL  r}  requestrawResponses           r$  rS  zgemini.fetch_usdt_marketsx  s     TYI??4<9KRPPq#.//00 	: 	:A'*H(G >>t{{7TZ?[?[\\KMM$++K889999r%  c           	      X   |                      |          }g }|                     | j        di           }|                     | j        dg           }g }t	          dt          |                    D ]9}|                     ||         |          s|                    ||                    :|                     |dd          rg }t	          dt          |                    D ]J}||         }	d|	i}
|                    | 	                    | 
                    |
|                               K|}t	          dt          |                    D ]0}|                    |                     ||                              1n.|                     | j        d          }||                     |d          }t	          dt          |                    D ]r}||         }	|                     ||	                                          }|>|                     |	|          s(|                    |                     |                     snjt	          dt          |                    D ]L}|                     ||         |          s.|                    |                     ||                              M|S )Nr   r   r   r   Fr_  r,  )publicGetV1Symbols	safe_dictr   r?  rA  rB  in_arrayrR  r  r  r  r  index_byupper)r"  r(  marketIdsRawrJ  r   r   	marketIdsrL  rV  r}  r  	responsesr,  indexedTradingPairspairInfos                  r$  r   zgemini.fetch_markets_from_api  s   ..v66 ../DbIInnT\="EE	q#l++,, 	2 	2A==a+>> 2  a111>>'#>FF $	GH1c)nn-- d d$Q<h!  D DT[[QXZ`EaEa b bcccc !I1c)nn-- ? ?d//	!==>>>>?  >>$,GGL'&*mmL!&D&D#q#i..11 C CA(|H#~~.A8>>CSCSTTH+DMM(K4X4X+d&7&7&A&ABBB	C q#i..11 G GA==1{CC Gd&7&7	!&E&EFFFr%  c                     d }d }d }d }d }d }d }d }	d}
d }d }d }t          |t                    }t          |t                    }|s|s|                     |d          }|                     |d          }|                     |d          }|                     |d          }|                     |                     |d                    }	|                     |d          }|                     |d          }|                     |d	          }n|r|}n|                     |d
          }|                     |                     |                     |d                              }|                     |                     |                     |d                              }|                     |d          }|	                                }|
                    d          d
k    }|                    dd          }|                     | j        di           }|                                }||v r#||         }|d         }|d         }|r|d         }n|                     ddg           }t!          d
t#          |                    D ]V}||         }|                    |          r7|                     dt#          |          z            }|d
|         }|}|r|} nW|                     |          }|                     |          }|                     |          }|dz   |z   }||dz   |z   }d}
|}d}d}|
rdnd}i d|d|d|d|d|d|d|d|d |d|
 d!dd|
d"dd#dd$|	d%|
d&|||d d d d ||d'd d d(|d d(d d d(d d d(d)d |d*
S )+NFr_  	tick_sizequote_incrementmin_order_sizer  base_currencyquote_currencycontract_price_currencyr   r   r[  r^  PERPr   r   r   r   r   r   r`  :Tr:   r8   r,   ra  rb  rc  rd  r=  r9   r;   r<   r8  re  r  )rg  rf  r2  rh  rj  )
isinstancestrlistrt  rs  r  rC  rE  rF  r  findrr  r  r   lowerhandle_optionrA  rB  endswithparse_to_intrD  )r"  responser}  rb  rc  rd  tickSizeamountPrecisionminSizer  r:   rk  r  r  isStringisArraymarketIdUpperisPerpmarketIdWithoutPerpr   lowerCaseIdconflictingMarketr   rL  quoteCurrencyquoteLengthr   r   ra  r_  r=  s                                  r$  r  zgemini.parse_market  s   B x--h-- '	 '	--hAAH"..xEEO''2CDDH&&x1ABBG--d.>.>x.R.RSSF%%h@@F&&x1ABBG''2KLLHH  8#11(A>>,,T-A-A$BRBRS[]^B_B_-`-`aa"&"3"3D4H4HIYIYZbdeIfIf4g4g"h"h**8Q77$NN,,M#((00A5F"/"7"7"C"C!%>RTV!W!W-3355K000$6{$C!*62+G4 :09H"&"4"45JL]_a"b"bq#o"6"677  A$3A$6M*33MBB &*&7&7S=O=O8O&P&P!4Q{]!C"/! 5'4H &&v..''00((22e#c\F*FD#LFG)vv60
(0
f0
 D0
 U	0

 f0
 f0
 w0
 0
 D0
 H0
 e0
 D0
 e0
 e0
 f0
  !0
" f#0
$ ("!)    
 # 
   
    $ _0
 0
 0
 0	
r%  Nr_  r  c           	         |                                   |                     |          }d|d         i}|
||d<   ||d<   |                     |                     ||                    }|                     ||d         ddddd	          S )
a0  
        fetches information on open orders with bid(buy) and ask(sell) prices, volumes and other data

        https://docs.gemini.com/rest-api/#current-order-book

        :param str symbol: unified symbol of the market to fetch the order book for
        :param int [limit]: the maximum amount of order book entries to return
        :param dict [params]: extra parameters specific to the exchange API endpoint
        :returns dict: A dictionary of `order book structures <https://docs.ccxt.com/?id=order-book-structure>` indexed by market symbols
        r_  r,   N
limit_bids
limit_asksbidsasksrg  rf  )load_marketsmarketpublicGetV1BookSymbolr  parse_order_book)r"  r_  r  r(  r  r  r  s          r$  fetch_order_bookzgemini.fetch_order_bookT  s     	V$$fTl
 $)GL!$)GL!--dkk'6.J.JKK$$Xvh/?vvW^`hiiir%  c                     |                                   |                     |          }d|d         i}|                     |                     ||                    }|                     ||          S Nr_  r,   )r  r  publicGetV1PubtickerSymbolr  parse_tickerr"  r_  r(  r  r  r  s         r$  fetch_ticker_v1zgemini.fetch_ticker_v1j  sp    V$$fTl
 224;;w3O3OPP   6222r%  c                     |                                   |                     |          }d|d         i}|                     |                     ||                    }|                     ||          S r  )r  r  publicGetV2TickerSymbolr  r  r  s         r$  fetch_ticker_v2zgemini.fetch_ticker_v2  sp    V$$fTl
 //GV0L0LMM   6222r%  c                     |                      ||          }|                     ||          }||g\  }}|                     ||d         |d         |d         |d         |d         |d         |d         d          S )	Nr  highlowchange
percentageaverager6  )r  r  r  r  r  r  r6  )r  r  r  )r"  r_  r(  tickerPromiseAtickerPromiseBtickerAtickerBs          r$  fetch_ticker_v1_and_v2zgemini.fetch_ticker_v1_and_v2  s    --ff==--ff==*N;FOFO5>h'!,/y)FO*
 *
   	r%  c                     |                      | j        dd          }|dk    r|                     ||          S |dk    r|                     ||          S |                     ||          S )a  
        fetches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market

        https://docs.gemini.com/rest-api/#ticker
        https://docs.gemini.com/rest-api/#ticker-v2

        :param str symbol: unified symbol of the market to fetch the ticker for
        :param dict [params]: extra parameters specific to the exchange API endpoint
        :param dict [params.fetchTickerMethod]: 'fetchTickerV2', 'fetchTickerV1' or 'fetchTickerV1AndV2' - 'fetchTickerV1' for original ccxt.gemini.fetchTicker - 'fetchTickerV1AndV2' for 2 api calls to get the result of both fetchTicker methods - default = 'fetchTickerV1'
        :returns dict: a `ticker structure <https://docs.ccxt.com/?id=ticker-structure>`
        r   r   fetchTickerV2)r@  r   r  r  r  )r"  r_  r(  rU  s       r$  fetch_tickerzgemini.fetch_ticker  st     /BOTT_$$''777_$$''777**66:::r%  tickerr  c                    |                      |di           }|                     |d          }d }|                     |d          }|                     ||          }d }d }d }	d }
|u|st	          |          dz
  }|dk    r|dd         }|dd         }n|dd         }|dd         }|                     |          }	|                     |          }
|	d	z   |
z   }|6|4|d
         }|                     |d          }|                     |d          }|                     |d          }|                     |dd|          }|                     |d          }|                     |d          }|                     ||          }|                     ||          }| 	                    i d
|d|d| 
                    |          d|                     |d          d|                     |d          d|                     |d          dd d|                     |d          dd dd d|d|d|dd dd d|dd |||d|          S )Nvolume	timestamppairr   r.     r^     r`  r_  rb  rc  rg  lastclosepercentChange24hr  datetimer  r  bid	bidVolumeask	askVolumevwappreviousCloser  r  r  )
baseVolumequoteVolumer6  )r@  safe_integerrt  safe_marketrB  rD  safe_string_upperrC  safe_string_2safe_tickeriso8601)r"  r  r  r  r  r_  r}  rb  rc  r   r   r  rg  r  r  r  r  r  s                     r$  r  zgemini.parse_ticker  s   J 266%%fk::	))&&99!!(F33 v~8}}q(H1}}!!A#"1Q3-!!A#"1Q3-**622D++G44ECZ%'FN!3H%F++FH==F,,VY??G  11!!&&'5AA%%f.@AA
//%%ff55
&&vw77 !
f!
!
 Y//!
 D$$VV44	!

 4##FE22!
 4##FE22!
 !
 4##FE22!
 !
 D!
 D!
 T!
 D!
 T!
 d!
  *!!
" t#!
$ %&)!
 !
 !
* +  	r%  symbolsc                     |                                   |                     |          }|                     ||          }|                     | j        dg           }|                     ||          S )a  
        fetches price tickers for multiple markets, statistical information calculated over the past 24 hours for each market

        https://docs.gemini.com/rest-api/#price-feed

        :param str[]|None symbols: unified symbols of the markets to fetch the ticker for, all market tickers are returned if not assigned
        :param dict [params]: extra parameters specific to the exchange API endpoint
        :returns dict: a dictionary of `ticker structures <https://docs.ccxt.com/?id=ticker-structure>`
        r   )r  publicGetV1Pricefeedparse_tickersr?  r   remove_keys_from_dict)r"  r  r(  r  rJ  r   s         r$  fetch_tickerszgemini.fetch_tickers  sm     	,,V44 ##Hg66nnT\="EE))&+>>>r%  tradec                 ,   |                      |d          }|                     |d          }|                     |d          }|                     |d          }|                     |          }|                     |d          |d}|                     |d          }	|                     |d          }
|                     |d	          }|                     d |          }|                     |||||                     |          |d |d |	d |
|d
|          S )Ntimestampmstidorder_idfee_currency
fee_amountri  rM  rg  rf  r=  )r,   orderr6  r  r  r_  r=  sidetakerOrMakerrg  ri  rf  r9  )r  rC  rD  rt  safe_symbol
safe_trader  )r"  r  r  r  r,   orderIdfeeCurrencyIdfeeCurrencyCoder9  priceStringamountStringr  r_  s                r$  parse_tradezgemini.parse_trade.  s<   D %%e];;	eU++""5*55((??11-@@$$UL99'
 
 &&ug66''x88%%eV44!!$//"Y//  " 
  
   	r%  sincec                 "   |                                   |                     |          }d|d         i}|t          |d          |d<   |||d<   |                     |                     ||                    }|                     ||||          S )a  
        get the list of most recent trades for a particular symbol

        https://docs.gemini.com/rest-api/#trade-history

        :param str symbol: unified symbol of the market to fetch trades for
        :param int [since]: timestamp in ms of the earliest trade to fetch
        :param int [limit]: the maximum amount of trades to fetch
        :param dict [params]: extra parameters specific to the exchange API endpoint
        :returns Trade[]: a list of `trade structures <https://docs.ccxt.com/?id=public-trades>`
        r_  r,   Nr  limit_tradesr  )r  r  r3  publicGetV1TradesSymbolr  parse_tradesr"  r_  r  r  r(  r  r  r  s           r$  fetch_tradeszgemini.fetch_tradesm  s     	V$$fTl
 &)%ooGN##(GK //GV0L0LMM   65%@@@r%  c                 p   d|i}t          dt          |                    D ]}||         }|                     |d          }|                     |          }|                                 }|                     |d          |d<   |                     |d          |d<   |||<   |                     |          S )Nr6  r   rM  	availablefreerf  total)rA  rB  rC  rD  accountsafe_balance)r"  r  rJ  rL  balance
currencyIdr<  r   s           r$  parse_balancezgemini.parse_balance  s    )q#h--(( 	# 	#AqkG))':>>J**:66DllnnG"..wDDGFO#//BBGG"F4LL  (((r%  c                    |                                   |                     |          }|                     |d          }|                     |d          }t          j        |d          }t          j        |d          }|                     |          }|                     |          }i }	t          dt          | j                            D ]}
| j        |
         }||||ddd|	|<   |	S )aN  
        fetch the trading fees for multiple markets

        https://docs.gemini.com/rest-api/#get-notional-volume

        :param dict [params]: extra parameters specific to the exchange API endpoint
        :returns dict: a dictionary of `fee structures <https://docs.ccxt.com/?id=fee-structure>` indexed by market symbols
        api_maker_fee_bpsapi_taker_fee_bps10000r   T)r6  r_  r   r   r  	tierBased)	r  privatePostV1NotionalvolumerC  r'   
string_divrE  rA  rB  r  )r"  r(  r  makerBpstakerBpsmakerStringtakerStringr   r   rJ  rL  r_  s               r$  fetch_trading_feeszgemini.fetch_trading_fees  s     	33F;;: ##H.ABB##H.ABB(7;;(7;;!!+..!!+..q#dl++,, 		 		A\!_F  "! F6NN r%  c                 ~    |                                   |                     |          }|                     |          S )ab  
        query for balance and get the amount of funds available for trading or funds locked in orders

        https://docs.gemini.com/rest-api/#get-available-balances

        :param dict [params]: extra parameters specific to the exchange API endpoint
        :returns dict: a `balance structure <https://docs.ccxt.com/?id=balance-structure>`
        )r  privatePostV1Balancesr$  )r"  r(  r  s      r$  fetch_balancezgemini.fetch_balance  s=     	--f55!!(+++r%  r
  c                    |                      |d          }|                     |d          }|                     |d          }|                     |d          }d}|d         rd}|d         rd	}|                     |d
          }|                     |d          }	|                     |d          }
|
dk    rd}
n|
dk    s|
dk    rd}
n|d         }
d }|                     |d          }|                     ||          }|                     |d          }|                     |d          }|                     |d          }|                     |dg           }|                     |d          }d}d}||dk    rd}n|dk    rd}n
|dk    rd}d }|                     i d!|d"|d#|d$|d%|                     |          d&d d'|d|d|
d(|d)|d|d
|d*d d+|	d,d d-||||d d.|          S )/Nr  original_amountremaining_amountexecuted_amountr  is_liver  is_cancelledcanceledrg  avg_execution_pricer=  exchange limitr  z
market buyzmarket sellr  r_  r  r  client_order_idr   r   GTCFimmediate-or-cancelr  fill-or-killr  maker-or-cancelr  Tr,   clientOrderIdr6  r  r  lastTradeTimestampr  r  rp   r  r  ri  rf  )filled	remainingr9  trades)r  rC  r  rt  r@  
safe_orderr  )r"  r
  r  r  rf  rE  rD  r  rg  r  r=  r9  r}  r_  r,   r  rB  optionsArrayr<   r  rp   s                        r$  parse_orderzgemini.parse_order  s   F %%e];;	!!%):;;$$U,>??	!!%):;; 	F  	 F  00""5*?@@v..###DD\!!T]%:%:DD=D##E844!!(F33eZ00%%eV44((0ABBui<<!!,22...#>))#,,,"  
" 
] 
 E 
 	 

 Y// 
 !$ 
 f 
 f 
 D 
 ; 
  
 D 
 U 
 D 
 w 
  D! 
" f# 
$ "+ 
  
  
, -  	r%  r,   c                     |                                   d|i}|                     |                     ||                    }|                     |          S )a  
        fetches information on an order made by the user

        https://docs.gemini.com/rest-api/#order-status

        :param str id: order id
        :param str symbol: unified symbol of the market the order was made in
        :param dict [params]: extra parameters specific to the exchange API endpoint
        :returns dict: An `order structure <https://docs.ccxt.com/?id=order-structure>`
        r  )r  privatePostV1OrderStatusr  rI  r"  r,   r_  r(  r  r  s         r$  fetch_orderzgemini.fetch_order  s[     	
 00Wf1M1MNN0 )))r%  c                     |                                   |                     |          }d}||                     |          }|                     ||||          S )a  
        fetch all unfilled currently open orders

        https://docs.gemini.com/rest-api/#get-active-orders

        :param str symbol: unified market symbol
        :param int [since]: the earliest time in ms to fetch open orders for
        :param int [limit]: the maximum number of  open orders structures to retrieve
        :param dict [params]: extra parameters specific to the exchange API endpoint
        :returns Order[]: a list of `order structures <https://docs.ccxt.com/?id=order-structure>`
        N)r  privatePostV1Ordersr  parse_orders)r"  r_  r  r  r(  r  r  s          r$  fetch_open_orderszgemini.fetch_open_orders  sa     	++F334 [[((F  65%@@@r%  r=  r  rf  rg  c                    |                                   |dk    rt          | j        dz             |                     |dd          }|                     |ddg          }|!t          |                                           }|                     |          }|                     ||          }	| 	                    ||          }
||d         |	|
|dd}| 
                    |d	|          }|                     |d	          }|                     |g d
          }|                     |g d          }|dk    rt          | j        dz   |z   dz             || 	                    ||          |d<   d|d	<   n| 
                    |d          }|                     |d          }|2|dk    s|dk    rdg|d<   n|dk    s|dk    rdg|d<   n|dk    rdg|d<   |                     |dd          }|                     |d          }|rdg|d<   | 
                    |d          }||g|d<   |                     |                     ||                    }|                     |          S )a  
        create a trade order

        https://docs.gemini.com/rest-api/#new-order

        :param str symbol: unified symbol of the market to create an order in
        :param str type: must be 'limit'
        :param str side: 'buy' or 'sell'
        :param float amount: how much of currency you want to trade in units of base currency
        :param float [price]: the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
        :param dict [params]: extra parameters specific to the exchange API endpoint
        :returns dict: an `order structure <https://docs.ccxt.com/?id=order-structure>`
        r  z' createOrder() allows limit orders onlyrB  r=  Nr,   r<  )r=  r_  rf  rg  r  r=  r=  )r  
stop_price	stopPrice)r  rS  rT  r=  	stopLimitzO createOrder() requires a triggerPrice parameter or a stop_price parameter for z ordersrS  zexchange stop limitr  r  r?  r   r  r@  r  rA  rp   F)r  r   r,   r  omitr  r   r  amount_to_precisionprice_to_precisionrC  safe_string_nr   r  privatePostV1OrderNewr  rI  )r"  r_  r=  r  rf  rg  r(  rB  r  r  r  r  r  r  rp   r   r  s                    r$  create_orderzgemini.create_order  s    	7??*S STTT**6?DUVV6O5F#GHH  1 1 3 344MV$$//??--fe<<,Tl" $
 
 5566**))&2]2]2]^^6#V#V#VWW;#DG.$  CG  %G  JS  %S  T  T  T#$($;$;FL$Q$QGL!3GFOO **6=AAKYYv}55F&5((k=R.R.R*?)@GI&&!U**~0M0M*8)9GI&& D((*;)<GI&~~fj%@@HYYvz22F 9&7%8	"&&vy99G"&-Y	"--dkk'6.J.JKK0 )))r%  c                     |                                   d|i}|                     |                     ||                    }|                     |          S )a{  
        cancels an open order

        https://docs.gemini.com/rest-api/#cancel-order

        :param str id: order id
        :param str symbol: unified symbol of the market the order was made in
        :param dict [params]: extra parameters specific to the exchange API endpoint
        :returns dict: An `order structure <https://docs.ccxt.com/?id=order-structure>`
        r  )r  privatePostV1OrderCancelr  rI  rL  s         r$  cancel_orderzgemini.cancel_order0  s[     	
 00Wf1M1MNN2 )))r%  c                 d   |t          | j        dz             |                                  |                     |          }d|d         i}|||d<   ||                     |dz            |d<   |                     |                     ||                    }|                     ||||          S )a  
        fetch all trades made by the user

        https://docs.gemini.com/rest-api/#get-past-trades

        :param str symbol: unified market symbol
        :param int [since]: the earliest time in ms to fetch trades for
        :param int [limit]: the maximum number of trades structures to retrieve
        :param dict [params]: extra parameters specific to the exchange API endpoint
        :returns Trade[]: a list of `trade structures <https://docs.ccxt.com/?id=trade-structure>`
        Nz+ fetchMyTrades() requires a symbol argumentr_  r,   r  i  r  )r   r,   r  r  r  privatePostV1Mytradesr  r  r  s           r$  fetch_my_tradeszgemini.fetch_my_tradesZ  s     >#DG.[$[\\\V$$fTl
 &+GN##'#4#4UT\#B#BGK --dkk'6.J.JKK  65%@@@r%  r<  addresstagc                    |                      ||          \  }}|                     |           |                                  |                     |          }|d         ||d}|                     |                     ||                    }|                     |d          }	|	dk    r-t          | j        dz   | 	                    |          z             | 
                    ||          S )a  
        make a withdrawal

        https://docs.gemini.com/rest-api/#withdraw-crypto-funds

        :param str code: unified currency code
        :param float amount: the amount to withdraw
        :param str address: the address to withdraw to
        :param str tag:
        :param dict [params]: extra parameters specific to the exchange API endpoint
        :returns dict: a `transaction structure <https://docs.ccxt.com/?id=transaction-structure>`
        r,   )rM  rf  rb  rJ  ru  z withdraw() failed: )handle_withdraw_tag_and_paramscheck_addressr  rM  privatePostV1WithdrawCurrencyr  rC  r   r,   jsonparse_transaction)
r"  r<  rf  rb  rc  r(  rM  r  r  rJ  s
             r$  rv   zgemini.withdrawt  s     99#vFFV7###==&& 
 

 55dkk'66R6RSS0 !!(H55W*@ @499XCVCV VWWW%%h999r%  c                     |                      | j        dd          }|dk    r|                                 S |                                 S )Nr   r   )rC  r   r   seconds)r"  nonceMethods     r$  r   zgemini.nonce  sF    &&t|WnMM.(($$&&&||~~r%  c                     |                                   i }|||d<   |||d<   |                     |                     ||                    }|                     |          S )aX  
        fetch history of deposits and withdrawals

        https://docs.gemini.com/rest-api/#transfers

        :param str [code]: unified currency code for the currency of the deposit/withdrawals, default is None
        :param int [since]: timestamp in ms of the earliest deposit/withdrawal, default is None
        :param int [limit]: max number of deposit/withdrawals to return, default is None
        :param dict [params]: extra parameters specific to the exchange API endpoint
        :returns dict: a list of `transaction structure <https://docs.ccxt.com/?id=transaction-structure>`
        Nlimit_transfersr  )r  privatePostV1Transfersr  parse_transactions)r"  r<  r  r  r(  r  r  s          r$  fetch_deposits_withdrawalsz!gemini.fetch_deposits_withdrawals  sq     	).G%&#(GK ..t{{7F/K/KLL&&x000r%  transactionrM  c                    |                      |d          }|                     |d          }|                     ||          }|                     |d          }|                     |d          }|                     |d          }d }	|                     |d          }
|
|
|d}	i d|d	|                     |d
d          d|                     |d          d|d|                     |          dd d|dd dd dd dd dd d|d|                     |d          d|d|                     |          dd d |                     |d          |	dS )Nr  rM  destinationr=  r  	feeAmountr	  r6  r,   eidwithdrawalIdtxidtxHashr  r  r7  rb  	addressToaddressFromrc  tagTotagFromrf  updatedmessage)internalcommentr9  )r  rC  rD  rt  rs  r  r  parse_transaction_status)r"  rr  rM  r  r#  r<  rb  r=  	statusRawr9  ru  s              r$  ri  zgemini.parse_transaction  s   & %%k=AA	%%k:>>
&&z8<<"";>>%%k6::$$[(;;	$$[+>>	 !  C
K
$$$[%HH
 D$$[(;;
 	

 Y//
 t
 w
 
 4
 4
 T
 t
 D
 d&&{H==
 
  d33I>>!
" t#
$ ''Y??)
 
 
 	
r%  r  c                 :    ddd}|                      |||          S )Nok)AdvancedComplete)rC  r  s      r$  r  zgemini.parse_transaction_status  s.    
 
 &&999r%  c                 j    |                      |d          }|                     d |          }|d |d |dS )Nrb  )rM  r7  rb  rc  r6  )rC  rD  )r"  depositAddressrM  rb  r<  s        r$  parse_deposit_addresszgemini.parse_deposit_address  sL     "">9==&&tX66"
 
 	
r%  c                 
   |                                   |                     ||          }d}|                     |          \  }}|                     |                     ||          d          }|                     ||          S )a  

        https://docs.gemini.com/rest-api/#get-deposit-addresses

        fetch the deposit address for a currency associated with self account
        :param str code: unified currency code
        :param dict [params]: extra parameters specific to the endpoint
        :param str [params.network]:  *required* The chain of currency
        :returns dict: an `address structure <https://docs.ccxt.com/?id=address-structure>`
        NrM  )r  "fetch_deposit_addresses_by_networkhandle_network_code_and_paramsr  r@  )r"  r<  r(  groupedByNetworkrO  networkGroups         r$  fetch_deposit_addresszgemini.fetch_deposit_address  s     	BB4PP"AA&IIV}}T__5E{%S%SU_``|T222r%  c                    |                                   |                     |          }|d         }d}|                     |          \  }}|t          | j        dz             |                     |          }d|i}|                     |                     ||                    }|                     ||gd||d          }| 	                    |d          S )a
  
        fetch a dictionary of addresses for a currency, indexed by network

        https://docs.gemini.com/rest-api/#get-deposit-addresses

        :param str code: unified currency code of the currency for the deposit address
        :param dict [params]: extra parameters specific to the exchange API endpoint
        :param str [params.network]:  *required* The chain of currency
        :returns dict: a dictionary of `address structures <https://docs.ccxt.com/?id=address-structure>` indexed by the network
        r<  Nz5 fetchDepositAddresses() requires a network parameterr7  F)r7  rM  )
r  rM  r  r   r,   network_code_to_idprivatePostV1AddressesNetworkr  parse_deposit_addressesgroup_by)	r"  r<  r(  rM  rO  rN  r  r  resultss	            r$  r  z)gemini.fetch_deposit_addresses_by_network%  s     	==&&"AA&IIV#DG.e$efff++K88	y
 55dkk'66R6RSS..x$T_mqHrHrss}}Wi000r%  rx   GETc                 Z   d|                      ||          z   }|                     ||                     |                    }|dk    r|                                  | j        }	|	                    d          dk     rt          | j        dz             t          | 	                                          }
| 
                    ||
d|          }|                     |          }|                     |          }|                     |                     |          |                     | j                  t           j                  }d| j        ||d}n|r|d	|                     |          z   z  }| j        d
         |         |z   }|dk    s|dk    r|                     |          }||||dS )Nr`  ry   r   r   z> sign() requires an account-key, master-keys are not-supported)r  r   z
text/plain)zContent-TypezX-GEMINI-APIKEYzX-GEMINI-PAYLOADzX-GEMINI-SIGNATURE?r}   POSTDELETE)urlrU  bodyheaders)implode_paramsrV  extract_paramscheck_required_credentialsapiKeyr  r   r,   r  r   r  rh  string_to_base64hmacencodesecrethashlibsha384	urlencoderw   )r"  pathr}   rU  r(  r  r  r  queryr  r   r  payload	signatures                 r$  signzgemini.sign?  s   D''f555		&$"5"5d";";<<)++---[F{{9%%)))$'4t*tuuu

%%Ekk# #  G ii((G++G44G		$++g"6"6DK8P8PRYR`aaI ,#';$+&/	 GG  3sT^^E2222is#c)f&H"4"499U##DfdwOOOr%  httpCodereasonr  rU  r  r  c
                 *   |Ft          |t                    r/| j        dz   |z   }
|                     | j        d         ||
           d S |                     |d          }|dk    r|                     |d          }|                     |d          }| j        dz   |z   }
|                     | j        d         ||
           |                     | j        d         ||
           |                     | j        d         ||
           t          |
          d S )Nr]  r   rJ  ru  r  r  r   )r  r  r,   throw_broadly_matched_exceptionr   rC  throw_exactly_matched_exceptionr   )r"  r  r  r  rU  r  r  r  requestHeadersrequestBodyfeedbackrJ  reasonInnerr  s                 r$  handle_errorszgemini.handle_errors]  s   $$$ _7S=4/44T_W5MtU]^^^4 !!(H55W**8X>>K&&x;;Gw}w.H001I;X`aaa001I7T\]]]001I7T\]]])))tr%  c                     |                                   |                     |          }d|d         i}|                     |                     ||                    }|                     |d          }|                     |           ||dd|dS )a{  
        create a currency deposit address

        https://docs.gemini.com/rest-api/#new-deposit-address

        :param str code: unified currency code of the currency for the deposit address
        :param dict [params]: extra parameters specific to the exchange API endpoint
        :returns dict: an `address structure <https://docs.ccxt.com/?id=address-structure>`
        rM  r,   rb  N)rM  rb  rc  r7  r6  )r  rM  &privatePostV1DepositCurrencyNewAddressr  rC  rf  )r"  r<  r(  rM  r  r  rb  s          r$  create_deposit_addresszgemini.create_deposit_addressu  s     	==&&
 >>t{{7TZ?[?[\\""8Y777###
 
 	
r%  r   	timeframec                 &   |                                   |                     |          }|                     | j        ||          }||d         d}|                     |                     ||                    }	|                     |	||||          S )a  
        fetches historical candlestick data containing the open, high, low, and close price, and the volume of a market

        https://docs.gemini.com/rest-api/#candles

        :param str symbol: unified symbol of the market to fetch OHLCV data for
        :param str timeframe: the length of time each candle represents
        :param int [since]: timestamp in ms of the earliest candle to fetch
        :param int [limit]: the maximum amount of candles to fetch
        :param dict [params]: extra parameters specific to the exchange API endpoint
        :returns int[][]: A list of candles ordered, open, high, low, close, volume
        r,   )r  r_  )r  r  rC  r   !publicGetV2CandlesSymbolTimeframer  parse_ohlcvs)
r"  r_  r  r  r  r(  r  timeframeIdr  r  s
             r$  fetch_ohlcvzgemini.fetch_ohlcv  s     	V$$&&t	9MM$Tl
 
 99$++gv:V:VWW   69eUKKKr%  c                     |                                   |                     |          }d|d         i}|                     |                     ||                    }|                     ||          S )af  
        retrieves the open interest of a contract trading pair

        https://docs.gemini.com/rest/derivatives#get-risk-stats

        :param str symbol: unified CCXT market symbol
        :param dict [params]: exchange specific parameters
        :returns dict} an open interest structure{@link https://docs.ccxt.com/?id=open-interest-structure:
        r_  r,   )r  r  publicGetV1RiskstatsSymbolr  parse_open_interestr  s         r$  fetch_open_interestzgemini.fetch_open_interest  sr     	V$$fTl
 224;;w3O3OPP ''&999r%  c           	          |                      ||                     |d          |                     |d          |                     |d          d d d|          S )Nr_  open_interestopen_interest_notional)r6  r_  openInterestAmountopenInterestValuer  r  )safe_open_interestrC  )r"  interestr  s      r$  r  zgemini.parse_open_interest  sn     &&&&vx88"&"2"28_"M"M!%!1!1(<T!U!U(
 (
   	r%  )N)F__name__
__module____qualname__r   r!  r   r)  r'  r   r   rX  rQ  r  rS  r   r  r  r
   r   r  r  r  r  r   r  dictr  r   r   r  r   r  r  r   r$  r   r0  r3  r   rI  r   rM  rQ  r   r   floatr   r[  r^  ra  r   rv   r   rq  r   ri  r  r  r	   r  r  r  intr  r  r  r  r  r  __classcell__)r#  s   @r$  r)   r)      sz       |# | | | | | || ') 6 6Z 6 6 6 6 02 W W W Wr $& 3 3$v, 3 3 3 3$ -/ [ [ [ [z
6 
6 
6 )+    " -/ 5 5 5 5nR
 R
 R
 R
 R
h :>b j js j3 jY j j j j, 35 3 3c 3 3 3 3* 35 3 3c 3 3 3 3, :<  S     02 ; ;3 ;f ; ; ; ;&X X4 X X6 X X X Xt 04B ? ?W ?7 ? ? ? ?<= = =v = = = = =~ 6:UW #A #A3 #As #A# #A\`af\g #A #A #A #AJ
) 
) 
) 
) 
) )+ 8 8{ 8 8 8 8t $& , ,( , , , ,] ] ]v ] ] ] ] ]~ 26b '* '*c '*3 '* '* '* '*R /3TXac *A *A *A3 *Ac *Ahlmrhs *A *A *A *AX gksu U* U*3 U*i U*y U*RW U*`c U* U* U* U*n 37r (* (*s (*C (* (* (* (*T -1tRV_a A Ac A AC A A A A4 KOWY 1: 1:S 1:% 1:# 1:C 1:^i 1: 1: 1: 1:f   6:[_hj 1 1s 1# 1UX 1ost  pA 1 1 1 1*6
 6
T 6
X 6
Q\ 6
 6
 6
 6
p:s : : : :
 
h 
 
 
 
$ 79 3 3# 3^ 3 3 3 3$ DF 1 1s 1$~J^ 1 1 1 14 &eBSW P P P P<c 3 S # X\ dg    0 8: 
 
3 
n 
 
 
 
4 9=4^bkm L L# L# LS LX[ Lrvw{r| L L L L< 79 : :# : : : :6 F        r%  r)   ).ccxt.base.exchanger   ccxt.abstract.geminir   r  ccxt.base.typesr   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   typingr   ccxt.base.errorsr   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   ccxt.base.decimal_to_precisionr&   ccxt.base.preciser'   r)    r%  r$  <module>r     s   ( ' ' ' ' ' , , , , , ,  J  J  J  J  J  J  J  J  J  J  J  J  J  J  J  J  J  J  J  J  J  J  J  J  J  J  J  J  J  J  J  J  J  J  J  J  J  J  J  J  J  J       * * * * * * 0 0 0 0 0 0 - - - - - - . . . . . . ' ' ' ' ' ' . . . . . . ) ) ) ) ) ) * * * * * * ) ) ) ) ) ) . . . . . . 1 1 1 1 1 1 * * * * * * ) ) ) ) ) ) 4 4 4 4 4 4 % % % % % %} } } } }X{ } } } } }r%  