diff --git a/Strategies/components/WithdrawModal.tsx b/Strategies/components/WithdrawModal.tsx index a215f399d8..2dda629b1f 100644 --- a/Strategies/components/WithdrawModal.tsx +++ b/Strategies/components/WithdrawModal.tsx @@ -126,7 +126,6 @@ const WithdrawModal = ({ ), amount: yup.string().required('Amount is required'), }) - console.log(selectedMangoAccount.spotOpenOrders.map((x) => x.toBase58())) const handlePropose = async (idx: number) => { const isValid = await validateInstruction({ schema, form, setFormErrors }) if (!isValid) { diff --git a/SwitchboardVotePlugin/SwitchboardQueueVoterClient.ts b/SwitchboardVotePlugin/SwitchboardQueueVoterClient.ts index dc04d5454d..706cd4a9af 100644 --- a/SwitchboardVotePlugin/SwitchboardQueueVoterClient.ts +++ b/SwitchboardVotePlugin/SwitchboardQueueVoterClient.ts @@ -47,7 +47,6 @@ export async function grantPermissionTx( switchboardProgram: PublicKey, permission: PublicKey ): Promise { - console.log('IN GRANT FUNC') const [addinState] = await PublicKey.findProgramAddress( [Buffer.from('state')], program.programId @@ -70,8 +69,6 @@ export async function revokePermissionTx( switchboardProgram: PublicKey, permission: PublicKey ): Promise { - console.log('IN REVOKE FUNC') - const [addinState] = await PublicKey.findProgramAddress( [Buffer.from('state')], program.programId diff --git a/components/NotificationsCard.tsx b/components/NotificationsCard.tsx index 8686643f1f..d4844c49a4 100644 --- a/components/NotificationsCard.tsx +++ b/components/NotificationsCard.tsx @@ -147,7 +147,6 @@ const NotificationsCard = () => { if (alertResult.targetGroup?.telegramTargets?.length > 0) { const target = alertResult.targetGroup?.telegramTargets[0] if (target && !target.isConfirmed) { - console.log(target.confirmationUrl) if (target.confirmationUrl) { window.open(target.confirmationUrl) } @@ -168,7 +167,6 @@ const NotificationsCard = () => { if (alertResult.targetGroup?.telegramTargets?.length > 0) { const target = alertResult.targetGroup?.telegramTargets[0] if (target && !target.isConfirmed) { - console.log(target.confirmationUrl) if (target.confirmationUrl) { window.open(target.confirmationUrl) } diff --git a/components/TokenBalance/SwitchboardPermissionCard.tsx b/components/TokenBalance/SwitchboardPermissionCard.tsx index 7d89dd876a..f2aac0c788 100644 --- a/components/TokenBalance/SwitchboardPermissionCard.tsx +++ b/components/TokenBalance/SwitchboardPermissionCard.tsx @@ -22,8 +22,6 @@ const SwitchboardPermissionCard = () => { const switchboardRefreshInstructions = useSwitchboardPluginStore( (s) => s.state.instructions ) - console.log('sbis:') - console.log() const [tokenOwnerRecordPk, setTokenOwneRecordPk] = useState('') const { realm, symbol } = useRealm() @@ -67,8 +65,6 @@ const SwitchboardPermissionCard = () => {
{(() => { - console.log(switchboardVoterWeight) - console.log(`does it equal zero: ${switchboardVoterWeight.isZero()}`) if (switchboardVoterWeight.isZero()) { return You do not have voting rights } else { diff --git a/components/TokenBalance/TokenBalanceCardWrapper.tsx b/components/TokenBalance/TokenBalanceCardWrapper.tsx index 24fda795c6..25a50aa574 100644 --- a/components/TokenBalance/TokenBalanceCardWrapper.tsx +++ b/components/TokenBalance/TokenBalanceCardWrapper.tsx @@ -70,7 +70,6 @@ const TokenBalanceCardWrapper = ({ (!ownTokenRecord || ownTokenRecord.account.governingTokenDepositAmount.isZero()) ) { - console.log('IS SWITCHBOARD MODE') return } //Default diff --git a/components/instructions/instructionCard.tsx b/components/instructions/instructionCard.tsx index cc3fc37e72..5d22487026 100644 --- a/components/instructions/instructionCard.tsx +++ b/components/instructions/instructionCard.tsx @@ -218,21 +218,23 @@ export function InstructionProgram({ Program
- {programId.toBase58()} - {programLabel && ( -
- {programLabel} -
- )} +
+ {programId.toBase58()} + {programLabel && ( +
+ {programLabel} +
+ )} +
+
-
) @@ -276,21 +278,23 @@ export function InstructionAccount({
- {accountMeta.pubkey.toBase58()} - {accountLabel && ( -
- {accountLabel} -
- )} +
+ {accountMeta.pubkey.toBase58()} + {accountLabel && ( +
+ {accountLabel} +
+ )} +
+
-
) diff --git a/components/instructions/programs/mango.tsx b/components/instructions/programs/mango.tsx index 83606743b7..f7b4aaa0b6 100644 --- a/components/instructions/programs/mango.tsx +++ b/components/instructions/programs/mango.tsx @@ -2,12 +2,17 @@ import { Connection, PublicKey } from '@solana/web3.js' import { AccountMetaData } from '@solana/spl-governance' import { Config, + IDS, MangoClient, MangoInstructionLayout, } from '@blockworks-foundation/mango-client' import dayjs from 'dayjs' import { tryGetTokenMint } from '@utils/tokens' import { getMintDecimalAmountFromNatural } from '@tools/sdk/units' +import { + ASSET_TYPE, + MARKET_MODE, +} from 'pages/dao/[symbol]/proposal/components/instructions/Mango/MakeSetMarketMode' function displayInstructionArgument(decodedArgs, argName) { return ( @@ -397,6 +402,43 @@ export const MANGO_INSTRUCTIONS = { return <>{displayAllArgs(args)} }, }, + 66: { + name: 'Mango v3: Set Market Mode', + accounts: { + 0: { name: 'Mango Group' }, + }, + getDataUI: async ( + _connection: Connection, + data: Uint8Array, + _accounts: AccountMetaData[] + ) => { + const args = MangoInstructionLayout.decode(Buffer.from(data), 0) + .SetMarketMode + const mangoGroup = IDS.groups.find( + (x) => x.publicKey === _accounts[0].pubkey.toBase58() + )! + return ( + <> +
+ Market:{' '} + { + mangoGroup[ + args.marketType === 0 ? 'spotMarkets' : 'perpMarkets' + ]!.find((x) => x.marketIndex === Number(args.marketIndex))!.name + } +
+
+ Market Mode:{' '} + {MARKET_MODE.find((x) => x.value === args.marketMode)?.name} +
+
+ Market Type:{' '} + {ASSET_TYPE.find((x) => x.value === args.marketType)?.name} +
+ + ) + }, + }, }, } diff --git a/hooks/useGovernanceAssets.ts b/hooks/useGovernanceAssets.ts index 68cb00b073..8b18e18fa3 100644 --- a/hooks/useGovernanceAssets.ts +++ b/hooks/useGovernanceAssets.ts @@ -292,29 +292,9 @@ export default function useGovernanceAssets() { isVisible: canUseProgramUpgradeInstruction && symbol === 'MNGO', }, { - id: Instructions.Mint, - name: 'Mint Tokens', - isVisible: canUseMintInstruction, - }, - { - id: Instructions.CreateAssociatedTokenAccount, - name: 'Create Associated Token Account', - isVisible: canUseAnyInstruction, - }, - { - id: Instructions.Base64, - name: 'Execute Custom Instruction', - isVisible: canUseAnyInstruction, - }, - { - id: Instructions.VotingMintConfig, - name: 'Vote Escrowed Tokens: Configure Voting Mint', - isVisible: canUseAuthorityInstruction, - }, - { - id: Instructions.CreateVsrRegistrar, - name: 'Vote Escrowed Tokens: Create Registrar', - isVisible: canUseAuthorityInstruction, + id: Instructions.MangoSetMarketMode, + name: 'Mango: Set Market Mode', + isVisible: canUseProgramUpgradeInstruction && symbol === 'MNGO', }, { id: Instructions.DepositIntoVolt, diff --git a/package.json b/package.json index 5d17146ff5..27056c6a37 100644 --- a/package.json +++ b/package.json @@ -23,8 +23,7 @@ ] }, "dependencies": { - "@switchboard-xyz/switchboard-v2": "^0.0.110", - "@blockworks-foundation/mango-client": "^3.5.0", + "@blockworks-foundation/mango-client": "^3.6.3", "@blockworks-foundation/voter-stake-registry-client": "^0.2.3", "@cardinal/namespaces-components": "^2.5.5", "@castlefinance/vault-core": "^0.1.3", @@ -33,8 +32,8 @@ "@dialectlabs/react-ui": "0.8.2", "@emotion/react": "^11.9.0", "@emotion/styled": "^11.8.1", - "@friktion-labs/friktion-sdk": "^1.1.118", "@foresight-tmp/foresight-sdk": "^0.1.46", + "@friktion-labs/friktion-sdk": "^1.1.118", "@headlessui/react": "^1.6.0", "@heroicons/react": "^1.0.1", "@marinade.finance/marinade-ts-sdk": "^2.0.9", @@ -64,6 +63,7 @@ "@solana/wallet-adapter-torus": "^0.11.11", "@solana/web3.js": "^1.37.1", "@solendprotocol/solend-sdk": "^0.5.5", + "@switchboard-xyz/switchboard-v2": "^0.0.110", "@tippyjs/react": "^4.2.6", "axios": "^0.26.1", "bignumber.js": "^9.0.2", diff --git a/pages/dao/[symbol]/proposal/components/instructions/FormCreator.tsx b/pages/dao/[symbol]/proposal/components/instructions/FormCreator.tsx index 6542030b6f..566ec83357 100644 --- a/pages/dao/[symbol]/proposal/components/instructions/FormCreator.tsx +++ b/pages/dao/[symbol]/proposal/components/instructions/FormCreator.tsx @@ -5,12 +5,14 @@ import { useState, useEffect } from 'react' import GovernedAccountSelect from '../GovernedAccountSelect' import { precision } from '@utils/formatting' import Switch from '@components/Switch' +import Select from '@components/inputs/Select' export enum InstructionInputType { GOVERNED_ACCOUNT, INPUT, TEXTAREA, SWITCH, + SELECT, } export interface InstructionInput { @@ -110,6 +112,26 @@ const InstructionInput = ({ governance={input.governance} /> ) + case InstructionInputType.SELECT: + return ( + + ) case InstructionInputType.INPUT: { const validateAmountOnBlur = () => { const value = form[input.name] diff --git a/pages/dao/[symbol]/proposal/components/instructions/Mango/MakeSetMarketMode.tsx b/pages/dao/[symbol]/proposal/components/instructions/Mango/MakeSetMarketMode.tsx new file mode 100644 index 0000000000..6f49f2d67a --- /dev/null +++ b/pages/dao/[symbol]/proposal/components/instructions/Mango/MakeSetMarketMode.tsx @@ -0,0 +1,234 @@ +/* eslint-disable @typescript-eslint/no-non-null-assertion */ +import React, { useContext, useEffect, useState } from 'react' +import useRealm from '@hooks/useRealm' +import { PublicKey } from '@solana/web3.js' +import * as yup from 'yup' +import { isFormValid } from '@utils/formValidation' +import { + UiInstruction, + MangoMakeSetMarketModeForm, +} from '@utils/uiTypes/proposalCreationTypes' +import { NewProposalContext } from '../../../new' +import useGovernanceAssets from '@hooks/useGovernanceAssets' +import { Governance } from '@solana/spl-governance' +import { ProgramAccount } from '@solana/spl-governance' +import useWalletStore from 'stores/useWalletStore' +import { serializeInstructionToBase64 } from '@solana/spl-governance' +import { + IDS, + makeSetMarketModeInstruction, + BN, + Config, +} from '@blockworks-foundation/mango-client' +import { AccountType } from '@utils/uiTypes/assets' +import InstructionForm, { + InstructionInput, + InstructionInputType, +} from '../FormCreator' + +export const ASSET_TYPE = [ + { + name: 'Token', + value: 0, + }, + { + name: 'Perp', + value: 1, + }, +] + +export const MARKET_MODE = [ + { + name: 'Default', + value: 0, + }, + { + name: 'Active', + value: 1, + }, + { + name: 'Close Only', + value: 2, + }, + { + name: 'Force Close Only', + value: 3, + }, + { + name: 'Inactive', + value: 4, + }, + { + name: 'Swapping Spot Market', + value: 5, + }, +] + +const MakeSetMarketMode = ({ + index, + governance, +}: { + index: number + governance: ProgramAccount | null +}) => { + const wallet = useWalletStore((s) => s.current) + const { realmInfo } = useRealm() + const { assetAccounts } = useGovernanceAssets() + const governedProgramAccounts = assetAccounts.filter( + (x) => x.type === AccountType.PROGRAM + ) + const shouldBeGoverned = index !== 0 && governance + const programId: PublicKey | undefined = realmInfo?.programId + const [form, setForm] = useState({ + governedAccount: null, + mangoGroup: null, + marketIndex: null, + adminPk: '', + marketMode: null, + marketType: null, + }) + const [formErrors, setFormErrors] = useState({}) + const { handleSetInstructions } = useContext(NewProposalContext) + const handleSetForm = ({ propertyName, value }) => { + setFormErrors({}) + setForm({ ...form, [propertyName]: value }) + } + const validateInstruction = async (): Promise => { + const { isValid, validationErrors } = await isFormValid(schema, form) + setFormErrors(validationErrors) + return isValid + } + async function getInstruction(): Promise { + const isValid = await validateInstruction() + let serializedInstruction = '' + if ( + isValid && + programId && + form.governedAccount?.governance?.account && + wallet?.publicKey + ) { + const groupConfig = Config.ids().groups.find((c) => + c.publicKey.equals(new PublicKey(form.mangoGroup!.value)) + )! + //Mango instruction call and serialize + const addOracleIx = makeSetMarketModeInstruction( + groupConfig.mangoProgramId, + new PublicKey(form.mangoGroup!.value), + new PublicKey(form.adminPk), + new BN(form.marketIndex!.value), + Number(form.marketMode!.value), + Number(form.marketType!.value) + ) + + serializedInstruction = serializeInstructionToBase64(addOracleIx) + } + const obj: UiInstruction = { + serializedInstruction: serializedInstruction, + isValid, + governance: form.governedAccount?.governance, + } + return obj + } + useEffect(() => { + handleSetForm({ + propertyName: 'programId', + value: programId?.toString(), + }) + }, [realmInfo?.programId]) + + useEffect(() => { + handleSetInstructions( + { governedAccount: form.governedAccount?.governance, getInstruction }, + index + ) + }, [form]) + const schema = yup.object().shape({ + mangoGroup: yup.object().nullable().required('Mango group is required'), + marketIndex: yup.object().nullable().required('Market index is required'), + adminPk: yup.string().required('Admin Pk is required'), + marketMode: yup.object().nullable().required('Market Mode is required'), + marketType: yup.object().nullable().required('Market Type is required'), + governedAccount: yup + .object() + .nullable() + .required('Program governed account is required'), + }) + const getOptionsForMarketIndex = () => { + const currentMangoGroup = IDS.groups.find( + (x) => x.publicKey === form.mangoGroup?.value + )! + return form.mangoGroup && form.marketType + ? currentMangoGroup[ + Number(form.marketType.value) === 0 ? 'spotMarkets' : 'perpMarkets' + ].map((x) => { + return { + name: x.name, + value: x.marketIndex, + } + }) + : [] + } + const inputs: InstructionInput[] = [ + { + label: 'Governance', + initialValue: form.governedAccount, + name: 'governedAccount', + type: InstructionInputType.GOVERNED_ACCOUNT, + shouldBeGoverned: shouldBeGoverned as any, + governance: form.governedAccount?.governance, + options: governedProgramAccounts, + }, + { + label: 'Mango group', + initialValue: form.mangoGroup, + type: InstructionInputType.SELECT, + name: 'mangoGroup', + options: IDS.groups.map((x) => { + return { name: x.name, value: x.publicKey } + }), + }, + { + label: 'Market type', + initialValue: form.marketType, + type: InstructionInputType.SELECT, + name: 'marketType', + options: ASSET_TYPE, + }, + { + label: 'Market index', + initialValue: form.marketIndex, + type: InstructionInputType.SELECT, + name: 'marketIndex', + options: getOptionsForMarketIndex(), + }, + { + label: 'Market mode', + initialValue: form.marketMode, + type: InstructionInputType.SELECT, + name: 'marketMode', + options: MARKET_MODE, + }, + { + label: 'Admin PublicKey', + initialValue: form.adminPk, + type: InstructionInputType.INPUT, + name: 'adminPk', + }, + ] + + return ( + <> + {form && ( + + )} + + ) +} + +export default MakeSetMarketMode diff --git a/pages/dao/[symbol]/proposal/new.tsx b/pages/dao/[symbol]/proposal/new.tsx index ceabd66c1a..520b4f7575 100644 --- a/pages/dao/[symbol]/proposal/new.tsx +++ b/pages/dao/[symbol]/proposal/new.tsx @@ -80,6 +80,7 @@ import VotingMintConfig from './components/instructions/Vsr/VotingMintConfig' import CreateVsrRegistrar from './components/instructions/Vsr/CreateRegistrar' import GoblinGoldDeposit from './components/instructions/GoblinGold/GoblinGoldDeposit' import GoblinGoldWithdraw from './components/instructions/GoblinGold/GoblinGoldWithdraw' +import MakeSetMarketMode from './components/instructions/Mango/MakeSetMarketMode' const schema = yup.object().shape({ title: yup.string().required('Title is required'), @@ -270,16 +271,6 @@ const New = () => { governance )) as ProgramAccount } - - console.log('creating proposal with args:') - console.log({ - title: form.title, - description: form.description, - governance: selectedGovernance, - instructionsData, - voteByCouncil, - isDraft, - }) proposalAddress = await handleCreateProposal({ title: form.title, description: form.description, @@ -295,7 +286,6 @@ const New = () => { router.push(url) } catch (ex) { - console.log('Notifying:') console.log(ex) notify({ type: 'error', message: `${ex}` }) } @@ -310,7 +300,6 @@ const New = () => { }, [instructionsData[0].governedAccount?.pubkey]) useEffect(() => { - console.log('this useeffect was called...') const governedAccount = extractGovernanceAccountFromInstructionsData( instructionsData ) @@ -319,8 +308,6 @@ const New = () => { }, [instructionsData]) const getCurrentInstruction = ({ typeId, idx }) => { - console.log('IN GET CURRENT INSTRUCTION:') - console.log(typeId) switch (typeId) { case Instructions.Transfer: return ( @@ -462,6 +449,13 @@ const New = () => { governance={governance} > ) + case Instructions.MangoSetMarketMode: + return ( + + ) case Instructions.ForesightInitMarket: return ( { onChange={(value) => setInstructionType({ value, idx })} value={instruction.type?.name} > - {availableInstructionsForIdx.map((inst) => ( - + {availableInstructionsForIdx.map((inst, idx) => ( + {inst.name} ))} diff --git a/stores/useGovernanceAssetsStore.tsx b/stores/useGovernanceAssetsStore.tsx index 40ceccd7bf..174db83fc0 100644 --- a/stores/useGovernanceAssetsStore.tsx +++ b/stores/useGovernanceAssetsStore.tsx @@ -100,7 +100,6 @@ const useGovernanceAssetsStore = create((set, _get) => ({ ? await getAccountsForGovernances(connection, realm, governancesArray) : [] - console.log(accounts) set((s) => { s.governancesArray = governancesArray s.loadGovernedAccounts = false @@ -586,7 +585,6 @@ const getSolAccountsInfo = async ( const filterOutHiddenAccs = (x: AssetAccount) => { const pubkey = typeof x.pubkey === 'string' ? x.pubkey : x.pubkey.toBase58() - console.log() return ( HIDDEN_TREASURES.findIndex((x) => x === pubkey) === -1 && (!x.extensions.token || diff --git a/tsconfig.json b/tsconfig.json index 9617d3ce3c..c5b2ff3b6b 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -13,7 +13,6 @@ "module": "esnext", "moduleResolution": "node", "resolveJsonModule": true, - "isolatedModules": true, "jsx": "preserve", "paths": { "@components/*": ["components/*"], @@ -22,7 +21,8 @@ "@models/*": ["models/*"], "@utils/*": ["utils/*"] }, - "incremental": true + "incremental": true, + "isolatedModules": true }, "exclude": ["node_modules", ".next", "out", "docs"], "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", "**/*.js"], diff --git a/utils/connection.ts b/utils/connection.ts index 135089ea08..4276d38955 100644 --- a/utils/connection.ts +++ b/utils/connection.ts @@ -5,13 +5,11 @@ import type { EndpointInfo } from '../@types/types' const ENDPOINTS: EndpointInfo[] = [ { name: 'mainnet', - url: - process.env.MAINNET_RPC || - 'https://explorer-api.mainnet-beta.solana.com/', + url: process.env.MAINNET_RPC || 'https://api.dao.solana.com/', }, { name: 'devnet', - url: process.env.DEVNET_RPC || 'https://explorer-api.devnet.solana.com/', + url: process.env.DEVNET_RPC || 'https://api.dao.devnet.solana.com/', }, { name: 'localnet', diff --git a/utils/instructions/Castle/index.ts b/utils/instructions/Castle/index.ts index 552a8161c1..71d3901cd6 100644 --- a/utils/instructions/Castle/index.ts +++ b/utils/instructions/Castle/index.ts @@ -93,7 +93,6 @@ export async function getCastleDepositInstruction({ try { await vaultClient.getLpTokenAccountInfo(userLpTokenAccount) } catch (error) { - console.log('Creating LP token account', error) createLpAcctIx = Token.createAssociatedTokenAccountInstruction( ASSOCIATED_TOKEN_PROGRAM_ID, TOKEN_PROGRAM_ID, @@ -130,7 +129,6 @@ export async function getCastleDepositInstruction({ signers, shouldSplitIntoSeparateTxs: true, } - console.log('cas: obj', obj) return obj } @@ -178,8 +176,6 @@ export async function getCastleWithdrawInstruction({ form ) - console.log(vaultClient) - const lpTokenAccountOwner = governedTokenAccount.extensions.token.account.owner @@ -235,7 +231,6 @@ export async function getCastleWithdrawInstruction({ signers, shouldSplitIntoSeparateTxs: true, } - console.log('cas: obj', obj) return obj } @@ -269,8 +264,6 @@ export async function getCastleReconcileInstruction( 16 ).toNumber() - console.log('Grabbed', amount, 'from proposal instruction') - return await vaultClient.getReconcileTxs(amount) } diff --git a/utils/instructions/GoblinGold/index.ts b/utils/instructions/GoblinGold/index.ts index 7aa8a6e146..e7bd8838fd 100644 --- a/utils/instructions/GoblinGold/index.ts +++ b/utils/instructions/GoblinGold/index.ts @@ -242,8 +242,6 @@ export async function getGoblinGoldDepositInstruction({ shouldSplitIntoSeparateTxs: true, } - console.log('goblingold instruction:', obj) - return obj } @@ -350,7 +348,5 @@ export async function getGoblinGoldWithdrawInstruction({ shouldSplitIntoSeparateTxs: true, } - console.log('goblingold instruction:', obj) - return obj } diff --git a/utils/uiTypes/proposalCreationTypes.ts b/utils/uiTypes/proposalCreationTypes.ts index 1619966ab6..5d2790bab6 100644 --- a/utils/uiTypes/proposalCreationTypes.ts +++ b/utils/uiTypes/proposalCreationTypes.ts @@ -146,6 +146,20 @@ export interface MangoMakeAddOracleForm { oracleAccount: string | undefined } +type NameValue = { + name: string + value: string +} + +export interface MangoMakeSetMarketModeForm { + governedAccount: AssetAccount | null + mangoGroup: NameValue | null + marketIndex: NameValue | null + marketMode: NameValue | null + marketType: NameValue | null + adminPk: string +} + export interface MangoMakeAddSpotMarketForm { governedAccount: AssetAccount | undefined programId: string | undefined @@ -327,6 +341,7 @@ export enum Instructions { MangoChangeReferralFeeParams, MangoChangeSpotMarket, MangoCreatePerpMarket, + MangoSetMarketMode, Grant, Clawback, CreateAssociatedTokenAccount, diff --git a/yarn.lock b/yarn.lock index f4ee1b8227..1ce0b67b5c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -529,16 +529,16 @@ toformat "^2.0.0" yargs "^17.0.1" -"@blockworks-foundation/mango-client@^3.5.0": - version "3.5.0" - resolved "https://registry.yarnpkg.com/@blockworks-foundation/mango-client/-/mango-client-3.5.0.tgz#485e7762bc39d08a22afdea8d9ae9aeae381dd30" - integrity sha512-MtdHjz0J08IFaWKyBC1LmQmErS4nluU2ra8QOdR1jC0q1NEZkMXeSAx51U8SbpqShepRTBN/s44iLUzc7D4EaA== +"@blockworks-foundation/mango-client@^3.6.3": + version "3.6.3" + resolved "https://registry.yarnpkg.com/@blockworks-foundation/mango-client/-/mango-client-3.6.3.tgz#994ff59a7b48ae20a0500be5c7fad9a1f68ace11" + integrity sha512-yQAAaMkBuhkQtNNDJTeIFzDFfduRF2XJfHM/pmAO7xkP9jLBMKCy1OVGMbY271ZL3eSC1ENQIS7OF6CJ6ONdnA== dependencies: "@project-serum/anchor" "^0.21.0" "@project-serum/serum" "0.13.55" "@project-serum/sol-wallet-adapter" "^0.2.0" "@solana/spl-token" "^0.1.6" - "@solana/web3.js" "^1.43.1" + "@solana/web3.js" "^1.43.5" big.js "^6.1.1" bn.js "^5.1.0" buffer-layout "^1.2.1" @@ -2822,7 +2822,7 @@ superstruct "^0.14.2" tweetnacl "^1.0.0" -"@solana/web3.js@^1.35.0", "@solana/web3.js@^1.43.1": +"@solana/web3.js@^1.35.0": version "1.43.5" resolved "https://registry.yarnpkg.com/@solana/web3.js/-/web3.js-1.43.5.tgz#ab12bb6ab3fff0a08e8c7453b4fc4cda9f66df11" integrity sha512-/PF4Fp+2jvCt9R3hYrf+tVUZXpPXZaHcwpaY/ytgdcswy8YiYf2snug52BJTCTlxwiXJipS4JpIo7rJJO0nN6w== @@ -2866,6 +2866,28 @@ superstruct "^0.14.2" tweetnacl "^1.0.0" +"@solana/web3.js@^1.43.5": + version "1.44.0" + resolved "https://registry.yarnpkg.com/@solana/web3.js/-/web3.js-1.44.0.tgz#233f7bd268520a0ce852ff7f92ded150c5fad0f5" + integrity sha512-KHf7o8sM5FlxYGHGroD7IJeCCOmjFITdBIXq4cO5xPFQ8O6Y26FWfYqIXqY1dXI29t240g0m1GYPssCp5UVgZg== + dependencies: + "@babel/runtime" "^7.12.5" + "@ethersproject/sha2" "^5.5.0" + "@solana/buffer-layout" "^4.0.0" + bigint-buffer "^1.1.5" + bn.js "^5.0.0" + borsh "^0.7.0" + bs58 "^4.0.1" + buffer "6.0.1" + fast-stable-stringify "^1.0.0" + jayson "^3.4.4" + js-sha3 "^0.8.0" + node-fetch "2" + rpc-websockets "^7.4.2" + secp256k1 "^4.0.2" + superstruct "^0.14.2" + tweetnacl "^1.0.0" + "@solendprotocol/solend-sdk@^0.4.4": version "0.4.9" resolved "https://registry.yarnpkg.com/@solendprotocol/solend-sdk/-/solend-sdk-0.4.9.tgz#c0e3f24148c4951bf0cfdf16c884bc4ffbb42b7b"