Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

v2: Rewrite SDK to automatically generate from latest docs #92

Merged
merged 25 commits into from
Jul 7, 2023
Merged

Conversation

dvcrn
Copy link
Owner

@dvcrn dvcrn commented Jul 2, 2023

To improve maintainability and catch up with the latest changes to the Binance API, I rewrote everything with metaprogramming and learnings I made from ex_openai

Status: In Progress

Key changes:

  • Instead of 1-by-1 implementing API endpoints, with this change, this SDK will be almost fully auto-generated using API definitions published by Binance. Since no proper parsable format is available, I am using the postman collection instead
  • Changes should, in theory, just require an update to the JSON definition and everything should work as is
  • All existing unit tests have been adjusted to work with the new API and: all the existing VCR cassettes work 🎉 meaning it's just the elixir interface that changes slightly and the rest stays intact
  • Also gives quite nice documentation as an additional benefit:
image

Quirks:

  • The postman definition doesn't include parameter types, or return types. So for now all the typedocs are sadly any(). For responses, we can manually map those. I backported everything that already existed in the tests, so all the existing structs are used as is and those endpoints have proper types. It's sadly a bit of a mixed bag now because some endpoints have proper structs while others don't
  • No response types in typedocs yet (:: xxxx.t()) since we don't have them in the current structs yet. Need to either generate those or add them in
  • When generating function names, some endpoints are used multiple times with different methods (GET/POST/DELETE), so I had to include the method into the actual function name which resulted in some awkwardness (like post_asset_get_funding_asset)
  • Sometimes required parameters aren't correctly flagged in the definition, so they end up in opts when they shouldn't
  • To make future addition of new proper structs easier, I made the choice to convert all returned maps from strings into atoms. It is considered bad practice to convert server returned stuff into atoms blindly to not cause memory overflows, but if we add new structs for new responses we would introduce a breaking change with every struct added. Having everything as atoms means that if the struct has the same structure as the existing map, it won't break anything, just add new types on top. (Not fully convinced this is the right move though...)

Full list of functions with just the published spot collection. Others not included yet, but already way more than we had previously:

parsing group: BLVT
  generating get_blvt_redeem_record (get:/sapi/v1/blvt/redeem/record)
  generating get_blvt_subscribe_record (get:/sapi/v1/blvt/subscribe/record)
  generating get_blvt_token_info (get:/sapi/v1/blvt/tokenInfo)
  generating get_blvt_user_limit (get:/sapi/v1/blvt/userLimit)
  generating post_blvt_redeem (post:/sapi/v1/blvt/redeem)
  generating post_blvt_subscribe (post:/sapi/v1/blvt/subscribe)
parsing group: BSwap
  generating get_bswap_add_liquidity_preview (get:/sapi/v1/bswap/addLiquidityPreview)
  generating get_bswap_claimed_history (get:/sapi/v1/bswap/claimedHistory)
  generating get_bswap_liquidity (get:/sapi/v1/bswap/liquidity)
  generating get_bswap_liquidity_ops (get:/sapi/v1/bswap/liquidityOps)
  generating get_bswap_pool_configure (get:/sapi/v1/bswap/poolConfigure)
  generating get_bswap_pools (get:/sapi/v1/bswap/pools)
  generating get_bswap_quote (get:/sapi/v1/bswap/quote)
  generating get_bswap_remove_liquidity_preview (get:/sapi/v1/bswap/removeLiquidityPreview)
  generating get_bswap_swap (get:/sapi/v1/bswap/swap)
  generating get_bswap_unclaimed_rewards (get:/sapi/v1/bswap/unclaimedRewards)
  generating post_bswap_claim_rewards (post:/sapi/v1/bswap/claimRewards)
  generating post_bswap_liquidity_add (post:/sapi/v1/bswap/liquidityAdd)
  generating post_bswap_liquidity_remove (post:/sapi/v1/bswap/liquidityRemove)
  generating post_bswap_swap (post:/sapi/v1/bswap/swap)
parsing group: C2C
  generating get_c2c_order_match_list_user_order_history (get:/sapi/v1/c2c/orderMatch/listUserOrderHistory)
parsing group: Convert
  generating get_convert_asset_info (get:/sapi/v1/convert/assetInfo)
  generating get_convert_exchange_info (get:/sapi/v1/convert/exchangeInfo)
  generating get_convert_order_status (get:/sapi/v1/convert/orderStatus)
  generating get_convert_trade_flow (get:/sapi/v1/convert/tradeFlow)
  generating post_convert_accept_quote (post:/sapi/v1/convert/acceptQuote)
  generating post_convert_get_quote (post:/sapi/v1/convert/getQuote)
parsing group: Crypto Loans
  generating get_loan_borrow_history (get:/sapi/v1/loan/borrow/history)
  generating get_loan_collateral_data (get:/sapi/v1/loan/collateral/data)
  generating get_loan_income (get:/sapi/v1/loan/income)
  generating get_loan_loanable_data (get:/sapi/v1/loan/loanable/data)
  generating get_loan_ltv_adjustment_history (get:/sapi/v1/loan/ltv/adjustment/history)
  generating get_loan_ongoing_orders (get:/sapi/v1/loan/ongoing/orders)
  generating get_loan_repay_collateral_rate (get:/sapi/v1/loan/repay/collateral/rate)
  generating get_loan_repay_history (get:/sapi/v1/loan/repay/history)
  generating post_loan_adjust_ltv (post:/sapi/v1/loan/adjust/ltv)
  generating post_loan_borrow (post:/sapi/v1/loan/borrow)
  generating post_loan_customize_margin_call (post:/sapi/v1/loan/customize/margin_call)
  generating post_loan_repay (post:/sapi/v1/loan/repay)
parsing group: Fiat
  generating get_fiat_orders (get:/sapi/v1/fiat/orders)
  generating get_fiat_payments (get:/sapi/v1/fiat/payments)
parsing group: Futures
  generating get_futures_loan_adjust_collateral_history (get:/sapi/v1/futures/loan/adjustCollateral/history)
  generating get_futures_loan_borrow_history (get:/sapi/v1/futures/loan/borrow/history)
  generating get_futures_loan_interest_history (get:/sapi/v1/futures/loan/interestHistory)
  generating get_futures_loan_liquidation_history (get:/sapi/v1/futures/loan/liquidationHistory)
  generating get_futures_loan_repay_history (get:/sapi/v1/futures/loan/repay/history)
  generating get_futures_loan_wallet (get:/sapi/v2/futures/loan/wallet)
  generating get_futures_transfer (get:/sapi/v1/futures/transfer)
  generating post_futures_transfer (post:/sapi/v1/futures/transfer)
parsing group: Futures Algo
  generating delete_algo_futures_order (delete:/sapi/v1/algo/futures/order)
  generating get_algo_futures_historical_orders (get:/sapi/v1/algo/futures/historicalOrders)
  generating get_algo_futures_open_orders (get:/sapi/v1/algo/futures/openOrders)
  generating get_algo_futures_sub_orders (get:/sapi/v1/algo/futures/subOrders)
  generating post_algo_futures_new_order_twap (post:/sapi/v1/algo/futures/newOrderTwap)
  generating post_algo_futures_new_order_vp (post:/sapi/v1/algo/futures/newOrderVp)
parsing group: Gift Card
  generating get_giftcard_buy_code_token_limit (get:/sapi/v1/giftcard/buyCode/token-limit)
  generating get_giftcard_cryptography_rsa_public_key (get:/sapi/v1/giftcard/cryptography/rsa-public-key)
  generating get_giftcard_verify (get:/sapi/v1/giftcard/verify)
  generating post_giftcard_buy_code (post:/sapi/v1/giftcard/buyCode)
  generating post_giftcard_create_code (post:/sapi/v1/giftcard/createCode)
  generating post_giftcard_redeem_code (post:/sapi/v1/giftcard/redeemCode)
parsing group: Margin
  generating delete_margin_order (delete:/sapi/v1/margin/order)
  generating delete_margin_isolated_account (delete:/sapi/v1/margin/isolated/account)
  generating get_margin_loan (get:/sapi/v1/margin/loan)
  generating get_margin_all_pairs (get:/sapi/v1/margin/allPairs)
  generating get_margin_isolated_account_limit (get:/sapi/v1/margin/isolated/accountLimit)
  generating get_margin_all_order_list (get:/sapi/v1/margin/allOrderList)
  generating get_margin_price_index (get:/sapi/v1/margin/priceIndex)
  generating post_margin_order (post:/sapi/v1/margin/order)
  generating post_margin_isolated_account (post:/sapi/v1/margin/isolated/account)
  generating get_margin_trade_coeff (get:/sapi/v1/margin/tradeCoeff)
  generating get_margin_all_orders (get:/sapi/v1/margin/allOrders)
  generating get_margin_transfer (get:/sapi/v1/margin/transfer)
  generating get_margin_rate_limit_order (get:/sapi/v1/margin/rateLimit/order)
  generating get_margin_force_liquidation_rec (get:/sapi/v1/margin/forceLiquidationRec)
  generating get_margin_max_transferable (get:/sapi/v1/margin/maxTransferable)
  generating get_margin_repay (get:/sapi/v1/margin/repay)
  generating post_bnb_burn (post:/sapi/v1/bnbBurn)
  generating get_margin_isolated_all_pairs (get:/sapi/v1/margin/isolated/allPairs)
  generating post_margin_order_oco (post:/sapi/v1/margin/order/oco)
  generating get_margin_cross_margin_data (get:/sapi/v1/margin/crossMarginData)
  generating get_margin_pair (get:/sapi/v1/margin/pair)
  generating get_margin_all_assets (get:/sapi/v1/margin/allAssets)
  generating get_margin_order (get:/sapi/v1/margin/order)
  generating get_margin_open_orders (get:/sapi/v1/margin/openOrders)
  generating get_margin_open_order_list (get:/sapi/v1/margin/openOrderList)
  generating get_margin_asset (get:/sapi/v1/margin/asset)
  generating get_margin_isolated_account (get:/sapi/v1/margin/isolated/account)
  generating get_margin_interest_history (get:/sapi/v1/margin/interestHistory)
  generating get_bnb_burn (get:/sapi/v1/bnbBurn)
  generating get_margin_max_borrowable (get:/sapi/v1/margin/maxBorrowable)
  generating get_margin_interest_rate_history (get:/sapi/v1/margin/interestRateHistory)
  generating get_margin_isolated_transfer (get:/sapi/v1/margin/isolated/transfer)
  generating get_margin_isolated_margin_data (get:/sapi/v1/margin/isolatedMarginData)
  generating get_margin_isolated_margin_tier (get:/sapi/v1/margin/isolatedMarginTier)
  generating post_margin_isolated_transfer (post:/sapi/v1/margin/isolated/transfer)
  generating get_margin_order_list (get:/sapi/v1/margin/orderList)
  generating post_margin_repay (post:/sapi/v1/margin/repay)
  generating delete_margin_open_orders (delete:/sapi/v1/margin/openOrders)
  generating get_margin_my_trades (get:/sapi/v1/margin/myTrades)
  generating get_margin_isolated_pair (get:/sapi/v1/margin/isolated/pair)
  generating get_margin_account (get:/sapi/v1/margin/account)
  generating post_margin_transfer (post:/sapi/v1/margin/transfer)
  generating delete_margin_order_list (delete:/sapi/v1/margin/orderList)
  generating post_margin_loan (post:/sapi/v1/margin/loan)
  generating get_margin_dribblet (get:/sapi/v1/margin/dribblet)
parsing group: Market
  generating get_agg_trades (get:/api/v3/aggTrades)
  generating get_avg_price (get:/api/v3/avgPrice)
  generating get_depth (get:/api/v3/depth)
  generating get_exchange_info (get:/api/v3/exchangeInfo)
  generating get_historical_trades (get:/api/v3/historicalTrades)
  generating get_klines (get:/api/v3/klines)
  generating get_ping (get:/api/v3/ping)
  generating get_ticker (get:/api/v3/ticker)
  generating get_ticker_24hr (get:/api/v3/ticker/24hr)
  generating get_ticker_book_ticker (get:/api/v3/ticker/bookTicker)
  generating get_ticker_price (get:/api/v3/ticker/price)
  generating get_time (get:/api/v3/time)
  generating get_trades (get:/api/v3/trades)
  generating get_ui_klines (get:/api/v3/uiKlines)
parsing group: Mining
  generating get_mining_hash_transfer_config_details_list (get:/sapi/v1/mining/hash-transfer/config/details/list)
  generating get_mining_hash_transfer_profit_details (get:/sapi/v1/mining/hash-transfer/profit/details)
  generating get_mining_payment_list (get:/sapi/v1/mining/payment/list)
  generating get_mining_payment_other (get:/sapi/v1/mining/payment/other)
  generating get_mining_payment_uid (get:/sapi/v1/mining/payment/uid)
  generating get_mining_pub_algo_list (get:/sapi/v1/mining/pub/algoList)
  generating get_mining_pub_coin_list (get:/sapi/v1/mining/pub/coinList)
  generating get_mining_statistics_user_list (get:/sapi/v1/mining/statistics/user/list)
  generating get_mining_statistics_user_status (get:/sapi/v1/mining/statistics/user/status)
  generating get_mining_worker_detail (get:/sapi/v1/mining/worker/detail)
  generating get_mining_worker_list (get:/sapi/v1/mining/worker/list)
  generating post_mining_hash_transfer_config (post:/sapi/v1/mining/hash-transfer/config)
  generating post_mining_hash_transfer_config_cancel (post:/sapi/v1/mining/hash-transfer/config/cancel)
parsing group: NFT
  generating get_nft_history_deposit (get:/sapi/v1/nft/history/deposit)
  generating get_nft_history_transactions (get:/sapi/v1/nft/history/transactions)
  generating get_nft_history_withdraw (get:/sapi/v1/nft/history/withdraw)
  generating get_nft_user_get_asset (get:/sapi/v1/nft/user/getAsset)
parsing group: Pay
  generating get_pay_transactions (get:/sapi/v1/pay/transactions)
parsing group: Portfolio Margin
  generating get_portfolio_account (get:/sapi/v1/portfolio/account)
  generating get_portfolio_collateral_rate (get:/sapi/v1/portfolio/collateralRate)
  generating get_portfolio_pm_loan (get:/sapi/v1/portfolio/pmLoan)
  generating post_portfolio_repay (post:/sapi/v1/portfolio/repay)
parsing group: Rebate
  generating get_rebate_tax_query (get:/sapi/v1/rebate/taxQuery)
parsing group: Savings
  generating get_lending_daily_product_list (get:/sapi/v1/lending/daily/product/list)
  generating get_lending_daily_token_position (get:/sapi/v1/lending/daily/token/position)
  generating get_lending_daily_user_left_quota (get:/sapi/v1/lending/daily/userLeftQuota)
  generating get_lending_daily_user_redemption_quota (get:/sapi/v1/lending/daily/userRedemptionQuota)
  generating get_lending_project_list (get:/sapi/v1/lending/project/list)
  generating get_lending_project_position_list (get:/sapi/v1/lending/project/position/list)
  generating get_lending_union_account (get:/sapi/v1/lending/union/account)
  generating get_lending_union_interest_history (get:/sapi/v1/lending/union/interestHistory)
  generating get_lending_union_purchase_record (get:/sapi/v1/lending/union/purchaseRecord)
  generating get_lending_union_redemption_record (get:/sapi/v1/lending/union/redemptionRecord)
  generating post_lending_customized_fixed_purchase (post:/sapi/v1/lending/customizedFixed/purchase)
  generating post_lending_daily_purchase (post:/sapi/v1/lending/daily/purchase)
  generating post_lending_daily_redeem (post:/sapi/v1/lending/daily/redeem)
  generating post_lending_position_changed (post:/sapi/v1/lending/positionChanged)
parsing group: Staking
  generating get_staking_personal_left_quota (get:/sapi/v1/staking/personalLeftQuota)
  generating get_staking_position (get:/sapi/v1/staking/position)
  generating get_staking_product_list (get:/sapi/v1/staking/productList)
  generating get_staking_staking_record (get:/sapi/v1/staking/stakingRecord)
  generating post_staking_purchase (post:/sapi/v1/staking/purchase)
  generating post_staking_redeem (post:/sapi/v1/staking/redeem)
  generating post_staking_set_auto_staking (post:/sapi/v1/staking/setAutoStaking)
parsing group: Sub-Account
  generating get_sub_account_assets (get:/sapi/v3/sub-account/assets)
  generating post_managed_subaccount_withdraw (post:/sapi/v1/managed-subaccount/withdraw)
  generating get_sub_account_list (get:/sapi/v1/sub-account/list)
  generating post_sub_account_futures_transfer (post:/sapi/v1/sub-account/futures/transfer)
  generating post_sub_account_virtual_sub_account (post:/sapi/v1/sub-account/virtualSubAccount)
  generating get_sub_account_spot_summary (get:/sapi/v1/sub-account/spotSummary)
  generating post_sub_account_transfer_sub_to_master (post:/sapi/v1/sub-account/transfer/subToMaster)
  generating get_managed_subaccount_asset (get:/sapi/v1/managed-subaccount/asset)
  generating delete_sub_account_sub_account_api_ip_restriction_ip_list (delete:/sapi/v1/sub-account/subAccountApi/ipRestriction/ipList)
  generating get_capital_deposit_sub_address (get:/sapi/v1/capital/deposit/subAddress)
  generating get_sub_account_sub_transfer_history (get:/sapi/v1/sub-account/sub/transfer/history)
  generating get_sub_account_futures_internal_transfer (get:/sapi/v1/sub-account/futures/internalTransfer)
  generating get_managed_subaccount_account_snapshot (get:/sapi/v1/managed-subaccount/accountSnapshot)
  generating post_managed_subaccount_deposit (post:/sapi/v1/managed-subaccount/deposit)
  generating post_sub_account_margin_transfer (post:/sapi/v1/sub-account/margin/transfer)
  generating post_sub_account_sub_account_api_ip_restriction (post:/sapi/v2/sub-account/subAccountApi/ipRestriction)
  generating get_sub_account_futures_account (get:/sapi/v2/sub-account/futures/account)
  generating get_sub_account_sub_account_api_ip_restriction (get:/sapi/v1/sub-account/subAccountApi/ipRestriction)
  generating post_sub_account_blvt_enable (post:/sapi/v1/sub-account/blvt/enable)
  generating get_sub_account_futures_position_risk (get:/sapi/v2/sub-account/futures/positionRisk)
  generating get_sub_account_futures_account_summary (get:/sapi/v2/sub-account/futures/accountSummary)
  generating get_sub_account_margin_account (get:/sapi/v1/sub-account/margin/account)
  generating get_sub_account_transfer_sub_user_history (get:/sapi/v1/sub-account/transfer/subUserHistory)
  generating get_sub_account_margin_account_summary (get:/sapi/v1/sub-account/margin/accountSummary)
  generating post_sub_account_futures_internal_transfer (post:/sapi/v1/sub-account/futures/internalTransfer)
  generating get_capital_deposit_sub_hisrec (get:/sapi/v1/capital/deposit/subHisrec)
  generating get_sub_account_api_restrictions_ip_restriction_third_party_list (get:/sapi/v1/sub-account/apiRestrictions/ipRestriction/thirdPartyList)
  generating post_sub_account_transfer_sub_to_sub (post:/sapi/v1/sub-account/transfer/subToSub)
  generating post_sub_account_futures_enable (post:/sapi/v1/sub-account/futures/enable)
  generating get_sub_account_universal_transfer (get:/sapi/v1/sub-account/universalTransfer)
  generating get_sub_account_status (get:/sapi/v1/sub-account/status)
  generating post_sub_account_universal_transfer (post:/sapi/v1/sub-account/universalTransfer)
  generating post_sub_account_margin_enable (post:/sapi/v1/sub-account/margin/enable)
  generating post_sub_account_sub_account_api_ip_restriction_ip_list (post:/sapi/v1/sub-account/subAccountApi/ipRestriction/ipList)
parsing group: Trade
  generating delete_open_orders (delete:/api/v3/openOrders)
  generating delete_order (delete:/api/v3/order)
  generating delete_order_list (delete:/api/v3/orderList)
  generating get_account (get:/api/v3/account)
  generating get_all_order_list (get:/api/v3/allOrderList)
  generating get_all_orders (get:/api/v3/allOrders)
  generating get_my_trades (get:/api/v3/myTrades)
  generating get_open_order_list (get:/api/v3/openOrderList)
  generating get_open_orders (get:/api/v3/openOrders)
  generating get_order (get:/api/v3/order)
  generating get_order_list (get:/api/v3/orderList)
  generating get_rate_limit_order (get:/api/v3/rateLimit/order)
  generating post_order (post:/api/v3/order)
  generating post_order_cancel_replace (post:/api/v3/order/cancelReplace)
  generating post_order_oco (post:/api/v3/order/oco)
  generating post_order_test (post:/api/v3/order/test)
parsing group: User Data Stream
  generating delete_user_data_stream (delete:/sapi/v1/userDataStream)
  generating delete_user_data_stream_isolated (delete:/sapi/v1/userDataStream/isolated)
  generating post_user_data_stream (post:/sapi/v1/userDataStream)
  generating post_user_data_stream_isolated (post:/sapi/v1/userDataStream/isolated)
  generating put_user_data_stream (put:/sapi/v1/userDataStream)
  generating put_user_data_stream_isolated (put:/sapi/v1/userDataStream/isolated)
parsing group: Wallet
  generating get_account_api_restrictions (get:/sapi/v1/account/apiRestrictions)
  generating get_account_api_trading_status (get:/sapi/v1/account/apiTradingStatus)
  generating get_account_snapshot (get:/sapi/v1/accountSnapshot)
  generating get_account_status (get:/sapi/v1/account/status)
  generating get_asset_asset_detail (get:/sapi/v1/asset/assetDetail)
  generating get_asset_asset_dividend (get:/sapi/v1/asset/assetDividend)
  generating get_asset_convert_transfer_query_by_page (get:/sapi/v1/asset/convert-transfer/queryByPage)
  generating get_asset_dribblet (get:/sapi/v1/asset/dribblet)
  generating get_asset_ledger_transfer_cloud_mining_query_by_page (get:/sapi/v1/asset/ledger-transfer/cloud-mining/queryByPage)
  generating get_asset_trade_fee (get:/sapi/v1/asset/tradeFee)
  generating get_asset_transfer (get:/sapi/v1/asset/transfer)
  generating get_capital_config_getall (get:/sapi/v1/capital/config/getall)
  generating get_capital_deposit_address (get:/sapi/v1/capital/deposit/address)
  generating get_capital_deposit_hisrec (get:/sapi/v1/capital/deposit/hisrec)
  generating get_capital_withdraw_history (get:/sapi/v1/capital/withdraw/history)
  generating get_system_status (get:/sapi/v1/system/status)
  generating post_account_disable_fast_withdraw_switch (post:/sapi/v1/account/disableFastWithdrawSwitch)
  generating post_account_enable_fast_withdraw_switch (post:/sapi/v1/account/enableFastWithdrawSwitch)
  generating post_asset_convert_transfer (post:/sapi/v1/asset/convert-transfer)
  generating post_asset_dust (post:/sapi/v1/asset/dust)
  generating post_asset_dust_btc (post:/sapi/v1/asset/dust-btc)
  generating post_asset_get_funding_asset (post:/sapi/v1/asset/get-funding-asset)
  generating post_asset_get_user_asset (post:/sapi/v3/asset/getUserAsset)
  generating post_asset_transfer (post:/sapi/v1/asset/transfer)
  generating post_capital_withdraw_apply (post:/sapi/v1/capital/withdraw/apply)
parsing group: VIP Loans
  generating get_loan_vip_collateral_account (get:/sapi/v1/loan/vip/collateral/account)
  generating get_loan_vip_ongoing_orders (get:/sapi/v1/loan/vip/ongoing/orders)
  generating get_loan_vip_repay_history (get:/sapi/v1/loan/vip/repay/history)
  generating post_loan_vip_repay (post:/sapi/v1/loan/vip/repay)

@dvcrn
Copy link
Owner Author

dvcrn commented Jul 3, 2023

@Cinderella-Man are you still monitoring this repo? Would love to hear some thoughts on this :) Not a full review needed but maybe you see something I’ve missed

@Cinderella-Man
Copy link
Collaborator

Hey @dvcrn

I'm indeed getting tons of emails (one per your commit) about your updates. I sadly won't have time to review stuff this or next week.

@dvcrn
Copy link
Owner Author

dvcrn commented Jul 5, 2023 via email

@dvcrn
Copy link
Owner Author

dvcrn commented Jul 7, 2023

I've been using v2 for a while and it looks to be fine so far, so I'm going to cut v2.0.0 and update the default. I moved the previous master branch into a v1 branch so sticks around and we can roll back

@dvcrn dvcrn merged commit 86dcf28 into master Jul 7, 2023
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants