From a6bb595ca5dd51542507a08b5fd90b81468e7fa8 Mon Sep 17 00:00:00 2001 From: agrippa Date: Tue, 14 Nov 2023 13:05:02 -0500 Subject: [PATCH 01/43] [bugfix] just use realm pks when talking to governance-api (#1921) --- hub/components/EditWalletRules/index.tsx | 3 ++- pages/dao/[symbol]/editConfig.tsx | 15 ++++++++------- .../treasury/governance/[governanceId]/edit.tsx | 11 +++++++++-- 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/hub/components/EditWalletRules/index.tsx b/hub/components/EditWalletRules/index.tsx index 802b041873..7c8fd304d6 100644 --- a/hub/components/EditWalletRules/index.tsx +++ b/hub/components/EditWalletRules/index.tsx @@ -58,6 +58,7 @@ function stepName(step: Step): string { interface Props { className?: string; governanceAddress: PublicKey; + realmPk: PublicKey; } export function EditWalletRules(props: Props) { @@ -71,7 +72,7 @@ export function EditWalletRules(props: Props) { const [result] = useQuery(gql.getGovernanceRulesResp, { query: gql.getGovernanceRules, variables: { - realmUrlId: symbol, + realmUrlId: props.realmPk, governancePublicKey: props.governanceAddress.toBase58(), }, }); diff --git a/pages/dao/[symbol]/editConfig.tsx b/pages/dao/[symbol]/editConfig.tsx index 169dbeb45a..b414ba92ba 100644 --- a/pages/dao/[symbol]/editConfig.tsx +++ b/pages/dao/[symbol]/editConfig.tsx @@ -1,13 +1,12 @@ import Head from 'next/head' -import { useRouter } from 'next/router' import { GraphQLProvider } from '@hub/providers/GraphQL' import { JWTProvider } from '@hub/providers/JWT' import { EditRealmConfig } from '@hub/components/EditRealmConfig' +import useSelectedRealmPubkey from '@hooks/selectedRealm/useSelectedRealmPubkey' export default function EditConfigPage() { - const router = useRouter() - const { symbol } = router.query + const realmPk = useSelectedRealmPubkey() return ( <> @@ -19,10 +18,12 @@ export default function EditConfigPage() {
- + {realmPk && ( + + )}
diff --git a/pages/dao/[symbol]/treasury/governance/[governanceId]/edit.tsx b/pages/dao/[symbol]/treasury/governance/[governanceId]/edit.tsx index 32a0dd9539..9127a7ea0b 100644 --- a/pages/dao/[symbol]/treasury/governance/[governanceId]/edit.tsx +++ b/pages/dao/[symbol]/treasury/governance/[governanceId]/edit.tsx @@ -5,6 +5,7 @@ import { PublicKey } from '@solana/web3.js' import { EditWalletRules } from '@hub/components/EditWalletRules' import { GraphQLProvider } from '@hub/providers/GraphQL' import { JWTProvider } from '@hub/providers/JWT' +import useSelectedRealmPubkey from '@hooks/selectedRealm/useSelectedRealmPubkey' export default function EditWallet() { const router = useRouter() @@ -14,8 +15,11 @@ export default function EditWallet() { const governanceAddress = typeof governanceId === 'string' ? new PublicKey(governanceId) : undefined + const realmPk = useSelectedRealmPubkey() + return ( - governanceAddress && ( + governanceAddress && + realmPk && ( <> @@ -26,7 +30,10 @@ export default function EditWallet() {
- +
From 94471522a9a413c95a23d3e478816535408e0e39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrian=20Brzezi=C5=84ski?= Date: Wed, 15 Nov 2023 02:45:30 +0100 Subject: [PATCH 02/43] update mango settings lib (#1923) --- components/instructions/programs/mangoV4.tsx | 14 +++++----- package.json | 4 +-- .../instructions/Mango/MangoV4/EditToken.tsx | 18 ++++++------ .../instructions/Mango/MangoV4/GroupEdit.tsx | 19 ++++++++++++- .../instructions/Mango/MangoV4/IxGateSet.tsx | 28 +++++++++++++++++++ .../Mango/MangoV4/TokenRegister.tsx | 12 ++++---- utils/Mango/listingTools.ts | 6 ++-- yarn.lock | 26 +++++++++++------ 8 files changed, 90 insertions(+), 37 deletions(-) diff --git a/components/instructions/programs/mangoV4.tsx b/components/instructions/programs/mangoV4.tsx index d86a9711ea..84c2a5f312 100644 --- a/components/instructions/programs/mangoV4.tsx +++ b/components/instructions/programs/mangoV4.tsx @@ -538,7 +538,7 @@ const instructions = () => ({ @@ -841,7 +841,7 @@ const instructions = () => ({ args.tokenConditionalSwapMakerFeeRateOpt, tokenConditionalSwapTakerFeeRate: args.tokenConditionalSwapTakerFeeRateOpt, - flashLoanDepositFeeRate: args.flashLoanDepositFeeRateOpt, + flashLoanSwapFeeRate: args.flashLoanSwapFeeRateOpt, reduceOnly: args.reduceOnlyOpt !== undefined ? REDUCE_ONLY_OPTIONS[args.reduceOnlyOpt].name @@ -1259,10 +1259,10 @@ const instructions = () => ({ suggestedVal={invalidFields.tokenConditionalSwapTakerFeeRate} /> { stablePriceGrowthLimit: (args.stablePriceGrowthLimit * 100).toFixed(2), tokenConditionalSwapMakerFeeRate: args.tokenConditionalSwapMakerFeeRate, tokenConditionalSwapTakerFeeRate: args.tokenConditionalSwapTakerFeeRate, - flashLoanDepositFeeRate: args.flashLoanDepositFeeRate, + flashLoanSwapFeeRate: args.flashLoanSwapFeeRate, reduceOnly: REDUCE_ONLY_OPTIONS[args.reduceOnly].name, } return formattedArgs diff --git a/package.json b/package.json index 8d76d95291..48491610d8 100644 --- a/package.json +++ b/package.json @@ -28,8 +28,8 @@ }, "dependencies": { "@blockworks-foundation/mango-mints-redemption": "0.0.10", - "@blockworks-foundation/mango-v4": "0.19.34", - "@blockworks-foundation/mango-v4-settings": "0.2.16", + "@blockworks-foundation/mango-v4": "0.20.2", + "@blockworks-foundation/mango-v4-settings": "0.2.18", "@blockworks-foundation/mangolana": "0.0.1-beta.15", "@bonfida/spl-name-service": "0.1.47", "@bundlr-network/client": "0.7.15", diff --git a/pages/dao/[symbol]/proposal/components/instructions/Mango/MangoV4/EditToken.tsx b/pages/dao/[symbol]/proposal/components/instructions/Mango/MangoV4/EditToken.tsx index c710d4b9dd..ffa56775af 100644 --- a/pages/dao/[symbol]/proposal/components/instructions/Mango/MangoV4/EditToken.tsx +++ b/pages/dao/[symbol]/proposal/components/instructions/Mango/MangoV4/EditToken.tsx @@ -59,7 +59,7 @@ const keyToLabel = { forceClose: 'Force Close', tokenConditionalSwapTakerFeeRate: 'Token Conditional Swap Taker Fee Rate', tokenConditionalSwapMakerFeeRate: 'Token Conditional Swap Maker Fee Rate', - flashLoanDepositFeeRate: 'Flash Loan Deposit Fee Rate', + flashLoanSwapFeeRate: 'Flash Loan Deposit Fee Rate', } type NamePkVal = { @@ -104,7 +104,7 @@ interface EditTokenForm { forceClose: boolean tokenConditionalSwapTakerFeeRate: number tokenConditionalSwapMakerFeeRate: number - flashLoanDepositFeeRate: number + flashLoanSwapFeeRate: number } const defaultFormValues: EditTokenForm = { @@ -144,7 +144,7 @@ const defaultFormValues: EditTokenForm = { holdupTime: 0, tokenConditionalSwapTakerFeeRate: 0, tokenConditionalSwapMakerFeeRate: 0, - flashLoanDepositFeeRate: 0, + flashLoanSwapFeeRate: 0, } const EditToken = ({ @@ -290,7 +290,7 @@ const EditToken = ({ null, Number ), - getNullOrTransform(values.flashLoanDepositFeeRate, null, Number) + getNullOrTransform(values.flashLoanSwapFeeRate, null, Number) ) .accounts({ group: mangoGroup!.publicKey, @@ -387,7 +387,7 @@ const EditToken = ({ currentToken.tokenConditionalSwapTakerFeeRate, tokenConditionalSwapMakerFeeRate: currentToken.tokenConditionalSwapMakerFeeRate, - flashLoanDepositFeeRate: currentToken.flashLoanDepositFeeRate, + flashLoanSwapFeeRate: currentToken.flashLoanSwapFeeRate, } setForm((prevForm) => ({ ...prevForm, @@ -696,12 +696,12 @@ const EditToken = ({ name: 'tokenConditionalSwapTakerFeeRate', }, { - label: keyToLabel['flashLoanDepositFeeRate'], - subtitle: getAdditionalLabelInfo('flashLoanDepositFeeRate'), - initialValue: form.flashLoanDepositFeeRate, + label: keyToLabel['flashLoanSwapFeeRate'], + subtitle: getAdditionalLabelInfo('flashLoanSwapFeeRate'), + initialValue: form.flashLoanSwapFeeRate, type: InstructionInputType.INPUT, inputType: 'number', - name: 'flashLoanDepositFeeRate', + name: 'flashLoanSwapFeeRate', }, ] diff --git a/pages/dao/[symbol]/proposal/components/instructions/Mango/MangoV4/GroupEdit.tsx b/pages/dao/[symbol]/proposal/components/instructions/Mango/MangoV4/GroupEdit.tsx index 9892ee942c..426bf98a7b 100644 --- a/pages/dao/[symbol]/proposal/components/instructions/Mango/MangoV4/GroupEdit.tsx +++ b/pages/dao/[symbol]/proposal/components/instructions/Mango/MangoV4/GroupEdit.tsx @@ -46,6 +46,7 @@ type GroupEditForm = { feesMngoTokenIndex: number | null feesExpiryInterval: number | null holdupTime: number + allowedFastListingsPerInterval: number | null } const defaultFormValues: GroupEditForm = { @@ -62,6 +63,7 @@ const defaultFormValues: GroupEditForm = { feesMngoTokenIndex: 0, feesExpiryInterval: 0, holdupTime: 0, + allowedFastListingsPerInterval: 0, } const GroupEdit = ({ @@ -122,7 +124,12 @@ const GroupEdit = ({ getNullOrTransform(values.feesMngoBonusRate, null, Number), getNullOrTransform(values.feesSwapMangoAccount, PublicKey), getNullOrTransform(values.feesMngoTokenIndex, null, Number), - getNullOrTransform(values.feesExpiryInterval, BN) + getNullOrTransform(values.feesExpiryInterval, BN), + getNullOrTransform( + values.allowedFastListingsPerInterval, + null, + Number + ) ) .accounts({ group: mangoGroup!.publicKey, @@ -195,6 +202,8 @@ const GroupEdit = ({ feesSwapMangoAccount: mangoGroup!.buybackFeesSwapMangoAccount?.toBase58(), feesMngoTokenIndex: mangoGroup!.mngoTokenIndex, feesExpiryInterval: mangoGroup!.buybackFeesExpiryInterval?.toNumber(), + allowedFastListingsPerInterval: mangoGroup! + .allowedFastListingsPerInterval, } setForm((prevForm) => ({ ...prevForm, @@ -307,6 +316,14 @@ const GroupEdit = ({ inputType: 'number', name: 'feesExpiryInterval', }, + { + label: keyToLabel['allowedFastListingsPerInterval'], + subtitle: getAdditionalLabelInfo('allowedFastListingsPerInterval'), + initialValue: form.allowedFastListingsPerInterval, + type: InstructionInputType.INPUT, + inputType: 'number', + name: 'allowedFastListingsPerInterval', + }, ] return ( diff --git a/pages/dao/[symbol]/proposal/components/instructions/Mango/MangoV4/IxGateSet.tsx b/pages/dao/[symbol]/proposal/components/instructions/Mango/MangoV4/IxGateSet.tsx index 25942fbd3c..5a9c41b274 100644 --- a/pages/dao/[symbol]/proposal/components/instructions/Mango/MangoV4/IxGateSet.tsx +++ b/pages/dao/[symbol]/proposal/components/instructions/Mango/MangoV4/IxGateSet.tsx @@ -113,6 +113,10 @@ const IxGateSet = ({ OpenbookV2SettleFunds: true, AdminTokenWithdrawFees: true, AdminPerpWithdrawFees: true, + AccountSizeMigration: true, + TokenConditionalSwapStart: true, + TokenConditionalSwapCreatePremiumAuction: true, + TokenConditionalSwapCreateLinearAuction: true, }) const [formErrors, setFormErrors] = useState({}) const { handleSetInstructions } = useContext(NewProposalContext) @@ -599,6 +603,30 @@ const IxGateSet = ({ type: InstructionInputType.SWITCH, name: 'AdminPerpWithdrawFees', }, + { + label: 'Account Size Migration', + initialValue: form.AccountSizeMigration, + type: InstructionInputType.SWITCH, + name: 'AccountSizeMigration', + }, + { + label: 'Token Conditional Swap Start', + initialValue: form.TokenConditionalSwapStart, + type: InstructionInputType.SWITCH, + name: 'TokenConditionalSwapStart', + }, + { + label: 'Token Conditional Swap Create Premium Auction', + initialValue: form.TokenConditionalSwapCreatePremiumAuction, + type: InstructionInputType.SWITCH, + name: 'TokenConditionalSwapCreatePremiumAuction', + }, + { + label: 'Token Conditional Swap Create Linear Auction', + initialValue: form.TokenConditionalSwapCreateLinearAuction, + type: InstructionInputType.SWITCH, + name: 'TokenConditionalSwapCreateLinearAuction', + }, ] return ( diff --git a/pages/dao/[symbol]/proposal/components/instructions/Mango/MangoV4/TokenRegister.tsx b/pages/dao/[symbol]/proposal/components/instructions/Mango/MangoV4/TokenRegister.tsx index 2a2276c351..95c31328ae 100644 --- a/pages/dao/[symbol]/proposal/components/instructions/Mango/MangoV4/TokenRegister.tsx +++ b/pages/dao/[symbol]/proposal/components/instructions/Mango/MangoV4/TokenRegister.tsx @@ -52,7 +52,7 @@ interface TokenRegisterForm { stablePriceDelayGrowthLimit: number tokenConditionalSwapTakerFeeRate: number tokenConditionalSwapMakerFeeRate: number - flashLoanDepositFeeRate: number + flashLoanSwapFeeRate: number reduceOnly: { name: string; value: number } borrowWeightScaleStartQuote: number depositWeightScaleStartQuote: number @@ -105,7 +105,7 @@ const TokenRegister = ({ stablePriceDelayGrowthLimit: 0.06, tokenConditionalSwapTakerFeeRate: 0, tokenConditionalSwapMakerFeeRate: 0, - flashLoanDepositFeeRate: 0, + flashLoanSwapFeeRate: 0, reduceOnly: REDUCE_ONLY_OPTIONS[0], borrowWeightScaleStartQuote: toNative(10000, 6).toNumber(), depositWeightScaleStartQuote: toNative(10000, 6).toNumber(), @@ -163,7 +163,7 @@ const TokenRegister = ({ Number(form.reduceOnly), Number(form.tokenConditionalSwapTakerFeeRate), Number(form.tokenConditionalSwapMakerFeeRate), - Number(form.flashLoanDepositFeeRate) + Number(form.flashLoanSwapFeeRate) ) .accounts({ group: mangoGroup!.publicKey, @@ -461,11 +461,11 @@ const TokenRegister = ({ }, { label: `Flash Loan Deposit Fee Rate`, - subtitle: getAdditionalLabelInfo('flashLoanDepositFeeRate'), - initialValue: form.flashLoanDepositFeeRate, + subtitle: getAdditionalLabelInfo('flashLoanSwapFeeRate'), + initialValue: form.flashLoanSwapFeeRate, type: InstructionInputType.INPUT, inputType: 'number', - name: 'flashLoanDepositFeeRate', + name: 'flashLoanSwapFeeRate', }, { label: `Borrow Weight Scale Start Quote`, diff --git a/utils/Mango/listingTools.ts b/utils/Mango/listingTools.ts index 1ca10c149e..016b26391f 100644 --- a/utils/Mango/listingTools.ts +++ b/utils/Mango/listingTools.ts @@ -63,7 +63,7 @@ export type FlatListingArgs = { stablePriceGrowthLimit: number tokenConditionalSwapMakerFeeRate: number tokenConditionalSwapTakerFeeRate: number - flashLoanDepositFeeRate: number + flashLoanSwapFeeRate: number reduceOnly: number groupInsuranceFund: boolean oracle: PublicKey @@ -97,7 +97,7 @@ export type FlatEditArgs = { stablePriceGrowthLimitOpt: number tokenConditionalSwapMakerFeeRateOpt: number tokenConditionalSwapTakerFeeRateOpt: number - flashLoanDepositFeeRateOpt: number + flashLoanSwapFeeRateOpt: number reduceOnlyOpt: number groupInsuranceFundOpt: boolean oracleOpt: PublicKey @@ -131,7 +131,7 @@ export type ListingArgsFormatted = { stablePriceGrowthLimit: string tokenConditionalSwapMakerFeeRate: number tokenConditionalSwapTakerFeeRate: number - flashLoanDepositFeeRate: number + flashLoanSwapFeeRate: number reduceOnly: string oracle: string } diff --git a/yarn.lock b/yarn.lock index 6d7a088bfc..60c6939d13 100644 --- a/yarn.lock +++ b/yarn.lock @@ -337,20 +337,28 @@ keccak256 "^1.0.6" merkletreejs "^0.3.11" -"@blockworks-foundation/mango-v4-settings@0.2.16", "@blockworks-foundation/mango-v4-settings@^0.2.15": - version "0.2.16" - resolved "https://registry.yarnpkg.com/@blockworks-foundation/mango-v4-settings/-/mango-v4-settings-0.2.16.tgz#63f03c13d1677461ea42d3b1e9171042830c6cdc" - integrity sha512-9GCRZkVqTQsEUkqx/488pmSWM8I74Ght5AEzMPsuS5XlRGWIDjytWoBE0Y9wFVPrnRw2THTj0ZQft+vDwCYDCA== +"@blockworks-foundation/mango-v4-settings@0.2.18": + version "0.2.18" + resolved "https://registry.yarnpkg.com/@blockworks-foundation/mango-v4-settings/-/mango-v4-settings-0.2.18.tgz#d984617fd44d7ba0d56b7f4a751f8b3b4d95cc35" + integrity sha512-hdU75eED5YzUWg4EJcUIJZsEvfeLVwUj3yfEykyj/OMVR/H83cbX5KuTnfh6ri0Iwd+K8cqNNFdParLKigoUxQ== dependencies: bn.js "^5.2.1" eslint-config-prettier "^9.0.0" -"@blockworks-foundation/mango-v4@0.19.34": - version "0.19.34" - resolved "https://registry.yarnpkg.com/@blockworks-foundation/mango-v4/-/mango-v4-0.19.34.tgz#ddeec24f4caa9343de08354790eab6ba50a0d613" - integrity sha512-QMM3e4pyfwh13S0dn7nYZp8fs4pRI00CtUiN/9Q/DvLqEF97JuBFllGDuxRM5Y3SZSiBOwsFaWOJwYnDyNJOAA== +"@blockworks-foundation/mango-v4-settings@^0.2.16": + version "0.2.17" + resolved "https://registry.yarnpkg.com/@blockworks-foundation/mango-v4-settings/-/mango-v4-settings-0.2.17.tgz#ebc64eb037137bdd16df93cdb63badc7f178542b" + integrity sha512-k4Hi0Rjq3XbWnN4Hvdd2aDrm24Ob+8+WDCz7hzR+XKCQ0HcYQXVrZn2Yz7e9IA4M3zQEP9n5HHnQopLQb8UgMw== dependencies: - "@blockworks-foundation/mango-v4-settings" "^0.2.15" + bn.js "^5.2.1" + eslint-config-prettier "^9.0.0" + +"@blockworks-foundation/mango-v4@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@blockworks-foundation/mango-v4/-/mango-v4-0.20.2.tgz#1e8d041155288cd3ca56cb19c935ca12da306c39" + integrity sha512-PrTFd1ZraRF3mjtCuJvqDqepwlo5xKIMxgJmrRRuC2Am8VqcIiXglrbPoYDKNVrEZ5OEraJFhccgRDHamkq2Vg== + dependencies: + "@blockworks-foundation/mango-v4-settings" "^0.2.16" "@coral-xyz/anchor" "^0.28.1-beta.2" "@project-serum/serum" "0.13.65" "@pythnetwork/client" "~2.14.0" From 3b8b7e616d33a79d425339bca9efb44cbee038c0 Mon Sep 17 00:00:00 2001 From: Valentin Madrid <94240868+valentinmadrid@users.noreply.github.com> Date: Wed, 15 Nov 2023 16:48:15 +0100 Subject: [PATCH 03/43] Add missing smart wallet (PDA wallet) support (#1922) --- .../Vanilla/useDepositCallback.tsx | 26 ++++++++++++------- hooks/useUserGovTokenAccount.ts | 3 ++- utils/instructions/PsyFinance/index.ts | 6 +++-- utils/uiTypes/VotePlugin.ts | 4 +-- 4 files changed, 24 insertions(+), 15 deletions(-) diff --git a/components/GovernancePower/Vanilla/useDepositCallback.tsx b/components/GovernancePower/Vanilla/useDepositCallback.tsx index 3d8e2dfa8e..08b47f7bde 100644 --- a/components/GovernancePower/Vanilla/useDepositCallback.tsx +++ b/components/GovernancePower/Vanilla/useDepositCallback.tsx @@ -38,24 +38,30 @@ export const useDepositCallback = ( ASSOCIATED_TOKEN_PROGRAM_ID, TOKEN_PROGRAM_ID, mint, - walletPk // owner + walletPk, // owner + true ) const instructions: TransactionInstruction[] = [] const signers: Keypair[] = [] - const transferAuthority = approveTokenTransfer( - instructions, - [], - userAtaPk, - wallet!.publicKey!, - amount - ) + // Checks if the connected wallet is the Squads Multisig extension (or any PDA wallet for future reference). If it is the case, it will not use an ephemeral signer. + const transferAuthority = wallet?.name == "SquadsX" + ? undefined + : approveTokenTransfer(instructions, [], userAtaPk, wallet!.publicKey!, amount); - signers.push(transferAuthority) + if (transferAuthority) { + signers.push(transferAuthority); + } const programVersion = await fetchProgramVersion(connection, realm.owner) + const publicKeyToUse = transferAuthority != undefined && wallet?.publicKey != null ? transferAuthority.publicKey : wallet?.publicKey; + + if (!publicKeyToUse) { + throw new Error() + } + await withDepositGoverningTokens( instructions, realm.owner, @@ -64,7 +70,7 @@ export const useDepositCallback = ( userAtaPk, mint, walletPk, - transferAuthority.publicKey, + publicKeyToUse, walletPk, amount ) diff --git a/hooks/useUserGovTokenAccount.ts b/hooks/useUserGovTokenAccount.ts index cf6311f973..c723199cc5 100644 --- a/hooks/useUserGovTokenAccount.ts +++ b/hooks/useUserGovTokenAccount.ts @@ -24,7 +24,8 @@ const useUserGovTokenAccountQuery = (role: 'community' | 'council') => { ASSOCIATED_TOKEN_PROGRAM_ID, TOKEN_PROGRAM_ID, mint, - walletPk + walletPk, + true ), [mint, walletPk] ) diff --git a/utils/instructions/PsyFinance/index.ts b/utils/instructions/PsyFinance/index.ts index f829b90a6a..b6f88eb11e 100644 --- a/utils/instructions/PsyFinance/index.ts +++ b/utils/instructions/PsyFinance/index.ts @@ -175,7 +175,8 @@ export const initializeOptionInstruction = async ( ASSOCIATED_TOKEN_PROGRAM_ID, TOKEN_PROGRAM_ID, underlyingMint, - FEE_OWNER_KEY + FEE_OWNER_KEY, + true ) remainingAccounts.push({ pubkey: mintFeeKey, @@ -199,7 +200,8 @@ export const initializeOptionInstruction = async ( ASSOCIATED_TOKEN_PROGRAM_ID, TOKEN_PROGRAM_ID, quoteMint, - FEE_OWNER_KEY + FEE_OWNER_KEY, + true ) remainingAccounts.push({ pubkey: exerciseFeeKey, diff --git a/utils/uiTypes/VotePlugin.ts b/utils/uiTypes/VotePlugin.ts index 648fe63788..9bab49d3ec 100644 --- a/utils/uiTypes/VotePlugin.ts +++ b/utils/uiTypes/VotePlugin.ts @@ -207,7 +207,7 @@ export class VotingClient { ) for (const pos of this.heliumVsrVotingPositions) { - const tokenAccount = await getAssociatedTokenAddress(pos.mint, walletPk) + const tokenAccount = await getAssociatedTokenAddress(pos.mint, walletPk, true) remainingAccounts.push( new AccountData(tokenAccount), @@ -396,7 +396,7 @@ export class VotingClient { for (let i = 0; i < unusedPositions.length; i++) { const pos = unusedPositions[i] - const tokenAccount = await getAssociatedTokenAddress(pos.mint, walletPk) + const tokenAccount = await getAssociatedTokenAddress(pos.mint, walletPk, true) const [nftVoteRecord] = nftVoteRecordKey( proposal.pubkey, pos.mint, From edeaa94efc9b8b34f3395744f9f272d40e458fab Mon Sep 17 00:00:00 2001 From: agrippa Date: Wed, 15 Nov 2023 15:20:36 -0500 Subject: [PATCH 04/43] skip delegator votes if already voted (#1920) --- actions/castVote.ts | 36 ++++++++++++++++++++++++++---------- 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/actions/castVote.ts b/actions/castVote.ts index 85ee947962..111470eb2c 100644 --- a/actions/castVote.ts +++ b/actions/castVote.ts @@ -15,6 +15,7 @@ import { VoteType, withPostChatMessage, withCreateTokenOwnerRecord, + getVoteRecordAddress, } from '@solana/spl-governance' import { ProgramAccount } from '@solana/spl-governance' import { RpcContext } from '@solana/spl-governance' @@ -39,6 +40,7 @@ import { findPluginName } from '@hooks/queries/governancePower' import { DELEGATOR_BATCH_VOTE_SUPPORT_BY_PLUGIN } from '@constants/flags' import { fetchTokenOwnerRecordByPubkey } from '@hooks/queries/tokenOwnerRecord' import { fetchProgramVersion } from '@hooks/queries/useProgramVersionQuery' +import { fetchVoteRecordByPubkey } from '@hooks/queries/voteRecord' const getVetoTokenMint = ( proposal: ProgramAccount, @@ -242,18 +244,32 @@ export async function castVote( DELEGATOR_BATCH_VOTE_SUPPORT_BY_PLUGIN[ findPluginName(votingPlugin?.client?.program.programId) ] - ? await Promise.all( - additionalTokenOwnerRecords.map((tokenOwnerRecordPk) => - createDelegatorVote({ - connection, - realmPk: realm.pubkey, - proposalPk: proposal.pubkey, - tokenOwnerRecordPk, - userPk: walletPubkey, - vote, + ? ( + await Promise.all( + additionalTokenOwnerRecords.map(async (tokenOwnerRecordPk) => { + // Skip vote if already voted + const voteRecordPk = await getVoteRecordAddress( + realm.owner, + proposal.pubkey, + tokenOwnerRecordPk + ) + const voteRecord = await fetchVoteRecordByPubkey( + connection, + voteRecordPk + ) + if (voteRecord.found) return undefined + + return createDelegatorVote({ + connection, + realmPk: realm.pubkey, + proposalPk: proposal.pubkey, + tokenOwnerRecordPk, + userPk: walletPubkey, + vote, + }) }) ) - ) + ).filter((x): x is NonNullable => x !== undefined) : [] const pluginPostMessageIxs: TransactionInstruction[] = [] From 28e2ac737b21c1dc58945482ecd1912dae194e98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrian=20Brzezi=C5=84ski?= Date: Thu, 16 Nov 2023 17:05:44 +0100 Subject: [PATCH 05/43] mango sdk parse fix (#1924) --- components/instructions/programs/mangoV4.tsx | 24 ++++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/components/instructions/programs/mangoV4.tsx b/components/instructions/programs/mangoV4.tsx index 84c2a5f312..f4224013c4 100644 --- a/components/instructions/programs/mangoV4.tsx +++ b/components/instructions/programs/mangoV4.tsx @@ -256,16 +256,15 @@ const instructions = () => ({ )[liqudityTier.tier] const suggestedUntrusted = liqudityTier.tier === 'UNTRUSTED' - const suggestedFormattedPreset: ListingArgsFormatted = Object.keys( - suggestedPreset - ).length - ? getFormattedListingValues({ - tokenIndex: args.tokenIndex, - name: args.name, - oracle: args.oracle, - ...suggestedPreset, - }) - : ({} as ListingArgsFormatted) + const suggestedFormattedPreset: ListingArgsFormatted = + Object.keys(suggestedPreset).length && !suggestedUntrusted + ? getFormattedListingValues({ + tokenIndex: args.tokenIndex, + name: args.name, + oracle: args.oracle, + ...suggestedPreset, + }) + : ({} as ListingArgsFormatted) const invalidKeys: (keyof ListingArgsFormatted)[] = Object.keys( suggestedPreset @@ -938,7 +937,8 @@ const instructions = () => ({

Very low liquidity Price impact of {liqudityTier?.priceImpact} - % on $1000 swap. Check params carefully + % on $1000 swap. Check params carefully token should be listed + with untrusted instruction

)} @@ -1566,7 +1566,7 @@ const DisplayNullishProperty = ({ {currentValue} - {
/
} + {currentValue &&
/
}
{value}
From aefbb7c3e18ef6251420031fdce1aea12382286c Mon Sep 17 00:00:00 2001 From: agrippa kellum Date: Thu, 16 Nov 2023 11:38:41 -0500 Subject: [PATCH 06/43] fix text input color --- components/DialectNotificationsModal/index.tsx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/components/DialectNotificationsModal/index.tsx b/components/DialectNotificationsModal/index.tsx index 63fdb2bc82..656f04efee 100644 --- a/components/DialectNotificationsModal/index.tsx +++ b/components/DialectNotificationsModal/index.tsx @@ -33,6 +33,9 @@ const themeVariables: IncomingThemeVariables = { bg: 'bg-bkg-1', toggleBackgroundActive: 'bg-primary-light', }, + textStyles: { + input: 'text-black', + }, outlinedInput: `${defaultVariables.dark.outlinedInput} focus-within:border-primary-light`, disabledButton: `${defaultVariables.dark.disabledButton} border-primary-light font-bold rounded-full border-fgd-3 text-fgd-3 cursor-not-allowed`, modal: `${defaultVariables.dark.modal} bg-bkg-1 sm:border sm:border-fgd-4 shadow-md sm:rounded-md`, From 350c56a91ec2eae82b6662e1cc686212e21a1219 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrian=20Brzezi=C5=84ski?= Date: Thu, 16 Nov 2023 20:11:18 +0100 Subject: [PATCH 07/43] let people withdraw during vsr transition (#1926) --- .../GovernancePowerForRole.tsx | 23 ++++++++++++++++--- pages/dao/[symbol]/account/me.tsx | 9 ++++++-- 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/components/GovernancePower/GovernancePowerForRole.tsx b/components/GovernancePower/GovernancePowerForRole.tsx index 173d5083bc..099ef5eda4 100644 --- a/components/GovernancePower/GovernancePowerForRole.tsx +++ b/components/GovernancePower/GovernancePowerForRole.tsx @@ -8,6 +8,8 @@ import NftVotingPower from '@components/ProposalVotingPower/NftVotingPower' import LockedCommunityNFTRecordVotingPower from '@components/ProposalVotingPower/LockedCommunityNFTRecordVotingPower' import VanillaVotingPower from './Vanilla/VanillaVotingPower' import { Deposit } from './Vanilla/Deposit' +import { useUserCommunityTokenOwnerRecord } from '@hooks/queries/tokenOwnerRecord' +import { ExclamationIcon } from '@heroicons/react/solid' export default function GovernancePowerForRole({ role, @@ -18,16 +20,24 @@ export default function GovernancePowerForRole({ className?: string }) { const { connection } = useConnection() - const realmPk = useSelectedRealmPubkey() + const ownTokenRecord = useUserCommunityTokenOwnerRecord().data?.result + //if dao transited to use plugin and some users have still deposited tokens they should withdraw before + //depositing to plugin + const didWithdrawFromVanillaSetup = + !ownTokenRecord || + ownTokenRecord.account.governingTokenDepositAmount.isZero() + const wallet = useWalletOnePointOh() const connected = !!wallet?.connected const { result: kind } = useAsync(async () => { if (realmPk === undefined) return undefined - return determineVotingPowerType(connection, realmPk, role) - }, [connection, realmPk, role]) + return didWithdrawFromVanillaSetup + ? determineVotingPowerType(connection, realmPk, role) + : 'vanilla' + }, [connection, realmPk, role, didWithdrawFromVanillaSetup]) if (connected && kind === undefined && !props.hideIfZero) { return ( @@ -42,6 +52,13 @@ export default function GovernancePowerForRole({
+ {!didWithdrawFromVanillaSetup && ( + + + Please withdraw your tokens and deposit again to get governance + power + + )}
) : kind === 'VSR' ? ( diff --git a/pages/dao/[symbol]/account/me.tsx b/pages/dao/[symbol]/account/me.tsx index 637a3177c0..b2bc6786ac 100644 --- a/pages/dao/[symbol]/account/me.tsx +++ b/pages/dao/[symbol]/account/me.tsx @@ -4,13 +4,18 @@ import LockTokensAccount from 'VoteStakeRegistry/components/Account/LockTokensAc import { LockTokensAccount as HeliumLockTokensAccount } from 'HeliumVotePlugin/components/LockTokensAccount' import { useAddressQuery_CommunityTokenOwner } from '@hooks/queries/addresses/tokenOwnerRecord' import Account from './Account' +import { useUserCommunityTokenOwnerRecord } from '@hooks/queries/tokenOwnerRecord' const AccountPage: React.FC = () => { const { vsrMode } = useRealm() - + const ownTokenRecord = useUserCommunityTokenOwnerRecord().data?.result const { data: tokenOwnerRecordPk } = useAddressQuery_CommunityTokenOwner() - if (vsrMode) { + if ( + vsrMode && + (!ownTokenRecord || + ownTokenRecord.account.governingTokenDepositAmount.isZero()) + ) { if (vsrMode === 'helium') { return ( From 8fd78b9af2908ab7fbd310b17f923b62b52ab3e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrian=20Brzezi=C5=84ski?= Date: Thu, 16 Nov 2023 21:25:29 +0100 Subject: [PATCH 08/43] fix mango decode (#1927) --- components/instructions/programs/mangoV4.tsx | 10 + utils/Mango/listingTools.ts | 221 ++++++++++--------- 2 files changed, 124 insertions(+), 107 deletions(-) diff --git a/components/instructions/programs/mangoV4.tsx b/components/instructions/programs/mangoV4.tsx index f4224013c4..97427c6f0d 100644 --- a/components/instructions/programs/mangoV4.tsx +++ b/components/instructions/programs/mangoV4.tsx @@ -376,6 +376,16 @@ const instructions = () => ({ ) : (
No Oracle Data
)} +
+
+
- Proposed + values +
+
+
- Suggested by + liqudity +
+
{ - const TIERS: LISTING_PRESETS_KEYS[] = [ - 'ULTRA_PREMIUM', - 'PREMIUM', - 'MID', - 'MEME', - 'SHIT', - ] - - const swaps = await Promise.all([ - fetchJupiterRoutes( - MAINNET_USDC_MINT.toBase58(), - outputMint, - toNative(250000, 6).toNumber() - ), - fetchJupiterRoutes( - MAINNET_USDC_MINT.toBase58(), - outputMint, - toNative(100000, 6).toNumber() - ), - fetchJupiterRoutes( - MAINNET_USDC_MINT.toBase58(), - outputMint, - toNative(20000, 6).toNumber() - ), - fetchJupiterRoutes( - MAINNET_USDC_MINT.toBase58(), - outputMint, - toNative(5000, 6).toNumber() - ), - fetchJupiterRoutes( - MAINNET_USDC_MINT.toBase58(), - outputMint, - toNative(1000, 6).toNumber() - ), - fetchJupiterRoutes( - MAINNET_USDC_MINT.toBase58(), - outputMint, - toNative(250000, 6).toNumber(), - 'ExactOut' - ), - fetchJupiterRoutes( - MAINNET_USDC_MINT.toBase58(), - outputMint, - toNative(100000, 6).toNumber(), - 'ExactOut' - ), - fetchJupiterRoutes( - MAINNET_USDC_MINT.toBase58(), - outputMint, - toNative(20000, 6).toNumber(), - 'ExactOut' - ), - fetchJupiterRoutes( - MAINNET_USDC_MINT.toBase58(), - outputMint, - toNative(5000, 6).toNumber(), - 'ExactOut' - ), - fetchJupiterRoutes( - MAINNET_USDC_MINT.toBase58(), - outputMint, - toNative(1000, 6).toNumber(), - 'ExactOut' - ), - ]) - const bestRoutesSwaps = swaps - .filter((x) => x.bestRoute) - .map((x) => x.bestRoute!) - - const averageSwaps = bestRoutesSwaps.reduce( - (acc: { amount: string; priceImpactPct: number }[], val) => { - if (val.swapMode === 'ExactIn') { - const exactOutRoute = bestRoutesSwaps.find( - (x) => x.amount === val.amount && x.swapMode === 'ExactOut' - ) - acc.push({ - amount: val.amount.toString(), - priceImpactPct: exactOutRoute?.priceImpactPct - ? (val.priceImpactPct + exactOutRoute.priceImpactPct) / 2 - : val.priceImpactPct, - }) - } - return acc - }, - [] - ) + try { + const TIERS: LISTING_PRESETS_KEYS[] = [ + 'ULTRA_PREMIUM', + 'PREMIUM', + 'MID', + 'MEME', + 'SHIT', + ] + + const swaps = await Promise.all([ + fetchJupiterRoutes( + MAINNET_USDC_MINT.toBase58(), + outputMint, + toNative(250000, 6).toNumber() + ), + fetchJupiterRoutes( + MAINNET_USDC_MINT.toBase58(), + outputMint, + toNative(100000, 6).toNumber() + ), + fetchJupiterRoutes( + MAINNET_USDC_MINT.toBase58(), + outputMint, + toNative(20000, 6).toNumber() + ), + fetchJupiterRoutes( + MAINNET_USDC_MINT.toBase58(), + outputMint, + toNative(5000, 6).toNumber() + ), + fetchJupiterRoutes( + MAINNET_USDC_MINT.toBase58(), + outputMint, + toNative(1000, 6).toNumber() + ), + fetchJupiterRoutes( + MAINNET_USDC_MINT.toBase58(), + outputMint, + toNative(250000, 6).toNumber(), + 'ExactOut' + ), + fetchJupiterRoutes( + MAINNET_USDC_MINT.toBase58(), + outputMint, + toNative(100000, 6).toNumber(), + 'ExactOut' + ), + fetchJupiterRoutes( + MAINNET_USDC_MINT.toBase58(), + outputMint, + toNative(20000, 6).toNumber(), + 'ExactOut' + ), + fetchJupiterRoutes( + MAINNET_USDC_MINT.toBase58(), + outputMint, + toNative(5000, 6).toNumber(), + 'ExactOut' + ), + fetchJupiterRoutes( + MAINNET_USDC_MINT.toBase58(), + outputMint, + toNative(1000, 6).toNumber(), + 'ExactOut' + ), + ]) + const bestRoutesSwaps = swaps + .filter((x) => x.bestRoute) + .map((x) => x.bestRoute!) + + const averageSwaps = bestRoutesSwaps.reduce( + (acc: { amount: string; priceImpactPct: number }[], val) => { + if (val.swapMode === 'ExactIn') { + const exactOutRoute = bestRoutesSwaps.find( + (x) => x.amount === val.amount && x.swapMode === 'ExactOut' + ) + acc.push({ + amount: val.amount.toString(), + priceImpactPct: exactOutRoute?.priceImpactPct + ? (val.priceImpactPct + exactOutRoute.priceImpactPct) / 2 + : val.priceImpactPct, + }) + } + return acc + }, + [] + ) - const indexForTierFromSwaps = averageSwaps.findIndex( - (x) => x?.priceImpactPct && x?.priceImpactPct * 100 < 1 - ) + const indexForTierFromSwaps = averageSwaps.findIndex( + (x) => x?.priceImpactPct && x?.priceImpactPct * 100 < 1 + ) - const tier = - indexForTierFromSwaps > -1 ? TIERS[indexForTierFromSwaps] : 'UNTRUSTED' + const tier = + indexForTierFromSwaps > -1 ? TIERS[indexForTierFromSwaps] : 'UNTRUSTED' - const tierLowerThenCurrent = - tier === 'ULTRA_PREMIUM' || tier === 'PREMIUM' - ? 'MID' - : tier === 'MID' - ? 'MEME' - : tier - const isPythRecommendedTier = - tier === 'MID' || tier === 'PREMIUM' || tier === 'ULTRA_PREMIUM' - const listingTier = - isPythRecommendedTier && !hasPythOracle ? tierLowerThenCurrent : tier + const tierLowerThenCurrent = + tier === 'ULTRA_PREMIUM' || tier === 'PREMIUM' + ? 'MID' + : tier === 'MID' + ? 'MEME' + : tier + const isPythRecommendedTier = + tier === 'MID' || tier === 'PREMIUM' || tier === 'ULTRA_PREMIUM' + const listingTier = + isPythRecommendedTier && !hasPythOracle ? tierLowerThenCurrent : tier - return { - tier: listingTier, - priceImpact: (indexForTierFromSwaps > -1 - ? averageSwaps[indexForTierFromSwaps]!.priceImpactPct - : 100 - ).toFixed(2), + return { + tier: listingTier, + priceImpact: (indexForTierFromSwaps > -1 + ? averageSwaps[indexForTierFromSwaps]!.priceImpactPct + : 100 + ).toFixed(2), + } + } catch (e) { + return { + tier: 'UNTRUSTED', + priceImpact: 100, + } } } From b93e13c8e9cb1e3d03e9cf216402e31949fad005 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrian=20Brzezi=C5=84ski?= Date: Fri, 17 Nov 2023 18:57:46 +0100 Subject: [PATCH 09/43] Feature/fix multiple instructions mango decoding fetch (#1928) --- components/instructions/programs/mangoV4.tsx | 46 +++++++++++++------- hooks/queries/mango.ts | 31 +++++++++++++ package.json | 2 +- utils/Mango/listingTools.ts | 4 ++ yarn.lock | 8 ++-- 5 files changed, 71 insertions(+), 20 deletions(-) create mode 100644 hooks/queries/mango.ts diff --git a/components/instructions/programs/mangoV4.tsx b/components/instructions/programs/mangoV4.tsx index 97427c6f0d..a993c63b20 100644 --- a/components/instructions/programs/mangoV4.tsx +++ b/components/instructions/programs/mangoV4.tsx @@ -41,6 +41,7 @@ import { } from '@blockworks-foundation/mango-v4-settings/lib/helpers/listingTools' import { tryParseKey } from '@tools/validators/pubkey' import Loading from '@components/Loading' +import queryClient from '@hooks/queries/queryClient' // import { snakeCase } from 'snake-case' // import { sha256 } from 'js-sha256' @@ -749,10 +750,9 @@ const instructions = () => ({ let mintData: null | TokenInfoWithoutDecimals | undefined = null const mintInfo = accounts[2].pubkey const group = accounts[0].pubkey - const client = await getClient(connection) const [mangoGroup, info, args] = await Promise.all([ - client.getGroup(group), + getGroupForClient(client, group), displayArgs(connection, data), getDataObjectFlattened(connection, data), ]) @@ -1335,7 +1335,7 @@ const instructions = () => ({ const group = accounts[0].pubkey const bank = accounts[1].pubkey const client = await getClient(connection) - const mangoGroup = await client.getGroup(group) + const mangoGroup = await getGroupForClient(client, group) const mint = [...mangoGroup.banksMapByMint.values()].find( (x) => x[0]!.publicKey.equals(bank)! )![0]!.mint! @@ -1370,7 +1370,7 @@ const instructions = () => ({ const group = accounts[0].pubkey const perpMarket = accounts[1].pubkey const client = await getClient(connection) - const mangoGroup = await client.getGroup(group) + const mangoGroup = await getGroupForClient(client, group) const marketName = [ ...mangoGroup.perpMarketsMapByName.values(), ].find((x) => x.publicKey.equals(perpMarket))?.name @@ -1459,20 +1459,36 @@ export const MANGO_V4_INSTRUCTIONS = { } const getClient = async (connection: Connection) => { - const options = AnchorProvider.defaultOptions() - const adminProvider = new AnchorProvider( - connection, - new EmptyWallet(Keypair.generate()), - options - ) - const client = await MangoClient.connect( - adminProvider, - 'mainnet-beta', - MANGO_V4_ID['mainnet-beta'] - ) + const client = await queryClient.fetchQuery({ + queryKey: ['mangoClient', connection.rpcEndpoint], + queryFn: async () => { + const options = AnchorProvider.defaultOptions() + const adminProvider = new AnchorProvider( + connection, + new EmptyWallet(Keypair.generate()), + options + ) + const client = await MangoClient.connect( + adminProvider, + 'mainnet-beta', + MANGO_V4_ID['mainnet-beta'] + ) + return client + }, + }) return client } +const getGroupForClient = async (client: MangoClient, groupPk: PublicKey) => { + const group = await queryClient.fetchQuery({ + queryKey: ['mangoGroup', groupPk.toBase58(), client.connection.rpcEndpoint], + queryFn: async () => { + const response = await client.getGroup(groupPk) + return response + }, + }) + return group +} async function getDataObjectFlattened( connection: Connection, diff --git a/hooks/queries/mango.ts b/hooks/queries/mango.ts new file mode 100644 index 0000000000..4c0771686f --- /dev/null +++ b/hooks/queries/mango.ts @@ -0,0 +1,31 @@ +import { Connection, Keypair } from '@solana/web3.js' +import { useQuery } from '@tanstack/react-query' +import { AnchorProvider } from '@coral-xyz/anchor' +import EmptyWallet from '@utils/Mango/listingTools' +import { MANGO_V4_ID, MangoClient } from '@blockworks-foundation/mango-v4' + +export const useMangoClient = (connection: Connection) => { + const isDevnet = connection.rpcEndpoint.includes('devnet') + const cluster = isDevnet ? 'devnet' : 'mainnet-beta' + + const query = useQuery({ + queryKey: ['MangoClient', connection.rpcEndpoint], + queryFn: async () => { + const options = AnchorProvider.defaultOptions() + const adminProvider = new AnchorProvider( + connection, + new EmptyWallet(Keypair.generate()), + options + ) + const client = await MangoClient.connect( + adminProvider, + cluster, + MANGO_V4_ID[cluster] + ) + + return client + }, + }) + + return query +} diff --git a/package.json b/package.json index 48491610d8..a5239c35e2 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ }, "dependencies": { "@blockworks-foundation/mango-mints-redemption": "0.0.10", - "@blockworks-foundation/mango-v4": "0.20.2", + "@blockworks-foundation/mango-v4": "0.20.3", "@blockworks-foundation/mango-v4-settings": "0.2.18", "@blockworks-foundation/mangolana": "0.0.1-beta.15", "@bonfida/spl-name-service": "0.1.47", diff --git a/utils/Mango/listingTools.ts b/utils/Mango/listingTools.ts index 36b4138338..9cef7f23b3 100644 --- a/utils/Mango/listingTools.ts +++ b/utils/Mango/listingTools.ts @@ -29,6 +29,7 @@ import { } from '@solana/web3.js' import SwitchboardProgram from '@switchboard-xyz/sbv2-lite' import Big from 'big.js' +import { secondsToHours } from 'date-fns' const MAINNET_PYTH_PROGRAM = new PublicKey( 'FsJ3A3u2vn5cTVofAjvy6y5kwABJAqYWpe4975bi2epH' @@ -643,5 +644,8 @@ export const getFormattedBankValues = (group: Group, bank: Bank) => { 6 ), liquidationFee: (bank.liquidationFee.toNumber() * 100).toFixed(2), + netBorrowLimitWindowSizeTs: secondsToHours( + bank.netBorrowLimitWindowSizeTs.toNumber() + ), } } diff --git a/yarn.lock b/yarn.lock index 60c6939d13..9783320a9c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -353,10 +353,10 @@ bn.js "^5.2.1" eslint-config-prettier "^9.0.0" -"@blockworks-foundation/mango-v4@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@blockworks-foundation/mango-v4/-/mango-v4-0.20.2.tgz#1e8d041155288cd3ca56cb19c935ca12da306c39" - integrity sha512-PrTFd1ZraRF3mjtCuJvqDqepwlo5xKIMxgJmrRRuC2Am8VqcIiXglrbPoYDKNVrEZ5OEraJFhccgRDHamkq2Vg== +"@blockworks-foundation/mango-v4@0.20.3": + version "0.20.3" + resolved "https://registry.yarnpkg.com/@blockworks-foundation/mango-v4/-/mango-v4-0.20.3.tgz#a944ccac8f3dfa93249c60a7ee8f2b807031c12b" + integrity sha512-K7N+6I1am4Q2Oq3me3ghEjMrSpRFbEPVF0locfCs4JszZznGQ1brY0mDxeDOSTsBjQobqdjMNyuU8rOpkXyTlg== dependencies: "@blockworks-foundation/mango-v4-settings" "^0.2.16" "@coral-xyz/anchor" "^0.28.1-beta.2" From 6553c32a13209b77bf2dc1beae087e061ebab447 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrian=20Brzezi=C5=84ski?= Date: Mon, 20 Nov 2023 13:20:26 +0100 Subject: [PATCH 10/43] update dist prefix mango (#1933) --- .../components/instructions/DistrubtionProgram/FillVaults.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/dao/[symbol]/proposal/components/instructions/DistrubtionProgram/FillVaults.tsx b/pages/dao/[symbol]/proposal/components/instructions/DistrubtionProgram/FillVaults.tsx index 447ebb9bdd..fed05758a5 100644 --- a/pages/dao/[symbol]/proposal/components/instructions/DistrubtionProgram/FillVaults.tsx +++ b/pages/dao/[symbol]/proposal/components/instructions/DistrubtionProgram/FillVaults.tsx @@ -33,7 +33,7 @@ import { parseMintNaturalAmountFromDecimal } from '@tools/sdk/units' import { validateInstruction } from '@utils/instructionTools' import useGovernanceNfts from '@components/treasuryV2/WalletList/WalletListItem/AssetList/useGovernanceNfts' -export const SEASON_PREFIX = 116 +export const SEASON_PREFIX = 117 interface FillVaultsForm { governedAccount: AssetAccount | null From 623f9f544e0903bf50c2b2563807c808c805fb17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrian=20Brzezi=C5=84ski?= Date: Mon, 20 Nov 2023 23:03:33 +0100 Subject: [PATCH 11/43] fix account order show in grant inst (#1934) --- components/instructions/programs/voteStakeRegistry.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/instructions/programs/voteStakeRegistry.tsx b/components/instructions/programs/voteStakeRegistry.tsx index 39b8603bee..e94a98b91b 100644 --- a/components/instructions/programs/voteStakeRegistry.tsx +++ b/components/instructions/programs/voteStakeRegistry.tsx @@ -284,7 +284,7 @@ const grantIx = (programId: PublicKey) => ({ <> {decodedInstructionData ? (
-
Grant to: {accounts[3].pubkey.toBase58()}
+
Grant to: {accounts[2].pubkey.toBase58()}
Lock type: {lockupKind}
Amount:{' '} From 345331795a8fe8d87ed3ce48014a6cd631d93927 Mon Sep 17 00:00:00 2001 From: agrippa Date: Tue, 21 Nov 2023 12:11:53 -0500 Subject: [PATCH 12/43] style dialect again (#1929) --- components/DialectNotificationsModal/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/DialectNotificationsModal/index.tsx b/components/DialectNotificationsModal/index.tsx index 656f04efee..d972c59755 100644 --- a/components/DialectNotificationsModal/index.tsx +++ b/components/DialectNotificationsModal/index.tsx @@ -34,7 +34,7 @@ const themeVariables: IncomingThemeVariables = { toggleBackgroundActive: 'bg-primary-light', }, textStyles: { - input: 'text-black', + input: 'text-primary-1 bg-bkg-1 border-none hover:border-none', }, outlinedInput: `${defaultVariables.dark.outlinedInput} focus-within:border-primary-light`, disabledButton: `${defaultVariables.dark.disabledButton} border-primary-light font-bold rounded-full border-fgd-3 text-fgd-3 cursor-not-allowed`, From 63ae8d28f6b1231ab866b9812e36569155dec171 Mon Sep 17 00:00:00 2001 From: guibescos <59208140+guibescos@users.noreply.github.com> Date: Tue, 21 Nov 2023 13:05:32 -0600 Subject: [PATCH 13/43] Update Pyth realm addresses (#1940) --- public/realms/devnet.json | 4 ++-- public/realms/mainnet-beta.json | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/public/realms/devnet.json b/public/realms/devnet.json index fb35685a54..e4312f6d0f 100644 --- a/public/realms/devnet.json +++ b/public/realms/devnet.json @@ -181,8 +181,8 @@ { "symbol": "PYTH", "displayName": "Pyth Network", - "programId": "GovFUVGZWWwyoLq8rhnoVWknRFkhDSbQiSoREJ5LiZCV", - "realmId": "A1f6LNEymJSSJsEVCL1FSgtS1jA9dNTC4ni8SkmbwQjG", + "programId": "pytGY6tWRgGinSCvRLnSv4fHfBTMoiDGiCsesmHWM6U", + "realmId": "4ct8XU5tKbMNRphWy4rePsS9kBqPhDdvZoGpmprPaug4", "ogImage": "/realms/PYTH/img/pyth.svg", "website": "https://pyth.network/", "twitter": "@PythNetwork" diff --git a/public/realms/mainnet-beta.json b/public/realms/mainnet-beta.json index e11c2bd6e3..e5c7c550a8 100644 --- a/public/realms/mainnet-beta.json +++ b/public/realms/mainnet-beta.json @@ -243,10 +243,10 @@ { "symbol": "PYTH", "category": "defi", - "bannerImage": "https://pbs.twimg.com/profile_banners/1376553581508059144/1665013565/1500x500", + "bannerImage": "https://pyth.network/images/pyth-realms-banner.png", "displayName": "Pyth Network", - "programId": "GovFUVGZWWwyoLq8rhnoVWknRFkhDSbQiSoREJ5LiZCV", - "realmId": "A1f6LNEymJSSJsEVCL1FSgtS1jA9dNTC4ni8SkmbwQjG", + "programId": "pytGY6tWRgGinSCvRLnSv4fHfBTMoiDGiCsesmHWM6U", + "realmId": "4ct8XU5tKbMNRphWy4rePsS9kBqPhDdvZoGpmprPaug4", "ogImage": "/realms/PYTH/img/pyth.svg", "shortDescription": "The Pyth network aims to bring valuable financial market data to DeFi applications and the general public", "sortRank": 3, From 7d224d0848aa86b2bc8f4f5954954f425e200b08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrian=20Brzezi=C5=84ski?= Date: Wed, 22 Nov 2023 22:27:33 +0100 Subject: [PATCH 14/43] add token ref account creation to listing (#1943) --- package.json | 1 + .../Mango/MangoV4/TokenRegister.tsx | 22 +++++++++++ .../Mango/MangoV4/TokenRegisterTrustless.tsx | 22 +++++++++++ tools/constants.ts | 5 +++ yarn.lock | 38 ++++++++++++------- 5 files changed, 74 insertions(+), 14 deletions(-) diff --git a/package.json b/package.json index a5239c35e2..94a55949bb 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,7 @@ "dependencies": { "@blockworks-foundation/mango-mints-redemption": "0.0.10", "@blockworks-foundation/mango-v4": "0.20.3", + "@jup-ag/referral-sdk": "0.1.5", "@blockworks-foundation/mango-v4-settings": "0.2.18", "@blockworks-foundation/mangolana": "0.0.1-beta.15", "@bonfida/spl-name-service": "0.1.47", diff --git a/pages/dao/[symbol]/proposal/components/instructions/Mango/MangoV4/TokenRegister.tsx b/pages/dao/[symbol]/proposal/components/instructions/Mango/MangoV4/TokenRegister.tsx index 95c31328ae..affbd62584 100644 --- a/pages/dao/[symbol]/proposal/components/instructions/Mango/MangoV4/TokenRegister.tsx +++ b/pages/dao/[symbol]/proposal/components/instructions/Mango/MangoV4/TokenRegister.tsx @@ -16,6 +16,9 @@ import UseMangoV4 from '../../../../../../../../hooks/useMangoV4' import { toNative } from '@blockworks-foundation/mango-v4' import { BN } from '@coral-xyz/anchor' import useWalletOnePointOh from '@hooks/useWalletOnePointOh' +import { ReferralProvider } from '@jup-ag/referral-sdk' +import { JUPITER_REFERRAL_PK } from '@tools/constants' +import useLegacyConnectionContext from '@hooks/useLegacyConnectionContext' const REDUCE_ONLY_OPTIONS = [ { value: 0, name: 'Disabled' }, @@ -68,6 +71,8 @@ const TokenRegister = ({ const wallet = useWalletOnePointOh() const { mangoClient, mangoGroup, getAdditionalLabelInfo } = UseMangoV4() const { assetAccounts } = useGovernanceAssets() + const connection = useLegacyConnectionContext() + const solAccounts = assetAccounts.filter( (x) => x.type === AccountType.SOL && @@ -121,6 +126,7 @@ const TokenRegister = ({ async function getInstruction(): Promise { const isValid = await validateInstruction() let serializedInstruction = '' + const additionalSerializedInstructions: string[] = [] if ( isValid && form.governedAccount?.governance?.account && @@ -175,6 +181,22 @@ const TokenRegister = ({ }) .instruction() + const rp = new ReferralProvider(connection.current) + + const tx = await rp.initializeReferralTokenAccount({ + payerPubKey: form.governedAccount.extensions.transferAddress!, + referralAccountPubKey: JUPITER_REFERRAL_PK, + mint: new PublicKey(form.mintPk), + }) + const isExistingAccount = + (await connection.current.getBalance(tx.referralTokenAccountPubKey)) > 1 + + if (!isExistingAccount) { + additionalSerializedInstructions.push( + ...tx.tx.instructions.map((x) => serializeInstructionToBase64(x)) + ) + } + serializedInstruction = serializeInstructionToBase64(ix) } const obj: UiInstruction = { diff --git a/pages/dao/[symbol]/proposal/components/instructions/Mango/MangoV4/TokenRegisterTrustless.tsx b/pages/dao/[symbol]/proposal/components/instructions/Mango/MangoV4/TokenRegisterTrustless.tsx index ca37222482..b8ea0de3ea 100644 --- a/pages/dao/[symbol]/proposal/components/instructions/Mango/MangoV4/TokenRegisterTrustless.tsx +++ b/pages/dao/[symbol]/proposal/components/instructions/Mango/MangoV4/TokenRegisterTrustless.tsx @@ -14,6 +14,9 @@ import InstructionForm, { InstructionInput } from '../../FormCreator' import { InstructionInputType } from '../../inputInstructionType' import UseMangoV4 from '../../../../../../../../hooks/useMangoV4' import useWalletOnePointOh from '@hooks/useWalletOnePointOh' +import { ReferralProvider } from '@jup-ag/referral-sdk' +import useLegacyConnectionContext from '@hooks/useLegacyConnectionContext' +import { JUPITER_REFERRAL_PK } from '@tools/constants' interface TokenRegisterTrustlessForm { governedAccount: AssetAccount | null @@ -42,6 +45,7 @@ const TokenRegisterTrustless = ({ (mangoGroup?.admin && x.extensions.transferAddress?.equals(mangoGroup?.admin))) ) + const connection = useLegacyConnectionContext() const shouldBeGoverned = !!(index !== 0 && governance) const [form, setForm] = useState({ governedAccount: null, @@ -62,6 +66,7 @@ const TokenRegisterTrustless = ({ async function getInstruction(): Promise { const isValid = await validateInstruction() let serializedInstruction = '' + const additionalSerializedInstructions: string[] = [] if ( isValid && form.governedAccount?.governance?.account && @@ -80,10 +85,27 @@ const TokenRegisterTrustless = ({ }) .instruction() + const rp = new ReferralProvider(connection.current) + + const tx = await rp.initializeReferralTokenAccount({ + payerPubKey: form.governedAccount.extensions.transferAddress!, + referralAccountPubKey: JUPITER_REFERRAL_PK, + mint: new PublicKey(form.mintPk), + }) + const isExistingAccount = + (await connection.current.getBalance(tx.referralTokenAccountPubKey)) > 1 + + if (!isExistingAccount) { + additionalSerializedInstructions.push( + ...tx.tx.instructions.map((x) => serializeInstructionToBase64(x)) + ) + } + serializedInstruction = serializeInstructionToBase64(ix) } const obj: UiInstruction = { serializedInstruction: serializedInstruction, + additionalSerializedInstructions, isValid, governance: form.governedAccount?.governance, customHoldUpTime: form.holdupTime, diff --git a/tools/constants.ts b/tools/constants.ts index a5aaae979f..225e808265 100644 --- a/tools/constants.ts +++ b/tools/constants.ts @@ -1,3 +1,4 @@ +import { PublicKey } from '@solana/web3.js' import BN from 'bn.js' /** @@ -16,3 +17,7 @@ export const DEFAULT_NFT_VOTER_PLUGIN = export const DEFAULT_NFT_VOTER_PLUGIN_V2 = 'GnftVc21v2BRchsRa9dGdrVmJPLZiRHe9j2offnFTZFg' + +export const JUPITER_REFERRAL_PK = new PublicKey( + 'EV4qhLE2yPKdUPdQ74EWJUn21xT3eGQxG3DRR1g9NNFc' +) diff --git a/yarn.lock b/yarn.lock index 9783320a9c..842c6d71d5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -721,12 +721,13 @@ superstruct "^0.15.4" toml "^3.0.0" -"@coral-xyz/anchor@^0.28.0": - version "0.28.0" - resolved "https://registry.yarnpkg.com/@coral-xyz/anchor/-/anchor-0.28.0.tgz#8345c3c9186a91f095f704d7b90cd256f7e8b2dc" - integrity sha512-kQ02Hv2ZqxtWP30WN1d4xxT4QqlOXYDxmEd3k/bbneqhV3X5QMO4LAtoUFs7otxyivOgoqam5Il5qx81FuI4vw== +"@coral-xyz/anchor@0.28.1-beta.2", "@coral-xyz/anchor@^0.28.1-beta.2": + version "0.28.1-beta.2" + resolved "https://registry.yarnpkg.com/@coral-xyz/anchor/-/anchor-0.28.1-beta.2.tgz#4ddd4b2b66af04407be47cf9524147793ec514a0" + integrity sha512-xreUcOFF8+IQKWOBUrDKJbIw2ftpRVybFlEPVrbSlOBCbreCWrQ5754Gt9cHIcuBDAzearCDiBqzsGQdNgPJiw== dependencies: "@coral-xyz/borsh" "^0.28.0" + "@noble/hashes" "^1.3.1" "@solana/web3.js" "^1.68.0" base64-js "^1.5.1" bn.js "^5.1.2" @@ -736,19 +737,17 @@ cross-fetch "^3.1.5" crypto-hash "^1.3.0" eventemitter3 "^4.0.7" - js-sha256 "^0.9.0" pako "^2.0.3" snake-case "^3.0.4" superstruct "^0.15.4" toml "^3.0.0" -"@coral-xyz/anchor@^0.28.1-beta.2": - version "0.28.1-beta.2" - resolved "https://registry.yarnpkg.com/@coral-xyz/anchor/-/anchor-0.28.1-beta.2.tgz#4ddd4b2b66af04407be47cf9524147793ec514a0" - integrity sha512-xreUcOFF8+IQKWOBUrDKJbIw2ftpRVybFlEPVrbSlOBCbreCWrQ5754Gt9cHIcuBDAzearCDiBqzsGQdNgPJiw== +"@coral-xyz/anchor@^0.28.0": + version "0.28.0" + resolved "https://registry.yarnpkg.com/@coral-xyz/anchor/-/anchor-0.28.0.tgz#8345c3c9186a91f095f704d7b90cd256f7e8b2dc" + integrity sha512-kQ02Hv2ZqxtWP30WN1d4xxT4QqlOXYDxmEd3k/bbneqhV3X5QMO4LAtoUFs7otxyivOgoqam5Il5qx81FuI4vw== dependencies: "@coral-xyz/borsh" "^0.28.0" - "@noble/hashes" "^1.3.1" "@solana/web3.js" "^1.68.0" base64-js "^1.5.1" bn.js "^5.1.2" @@ -758,6 +757,7 @@ cross-fetch "^3.1.5" crypto-hash "^1.3.0" eventemitter3 "^4.0.7" + js-sha256 "^0.9.0" pako "^2.0.3" snake-case "^3.0.4" superstruct "^0.15.4" @@ -1939,6 +1939,16 @@ "@json-rpc-tools/types" "^1.7.6" "@pedrouid/environment" "^1.0.1" +"@jup-ag/referral-sdk@0.1.5": + version "0.1.5" + resolved "https://registry.yarnpkg.com/@jup-ag/referral-sdk/-/referral-sdk-0.1.5.tgz#02a8bc901154659e75a5f31ae9a3e3edd28cd6cd" + integrity sha512-0R/NuBkIj2otpLnatacZqIwVAwL+OIheSlT+a2atAaNuf2WceL4lKZ/EZWm1AVTFhmFd/07HHN9PJ2fma9AMPA== + dependencies: + "@coral-xyz/anchor" "0.28.1-beta.2" + "@solana/spl-token" "0.3.8" + "@solana/web3.js" "^1.77.3" + lodash "^4.17.21" + "@keystonehq/bc-ur-registry-sol@^0.3.1": version "0.3.1" resolved "https://registry.yarnpkg.com/@keystonehq/bc-ur-registry-sol/-/bc-ur-registry-sol-0.3.1.tgz#5319c7c4a22cc83bbacfa6fe09aaa6fb21363f24" @@ -4140,7 +4150,7 @@ "@solana/buffer-layout-utils" "^0.2.0" buffer "^6.0.3" -"@solana/spl-token@^0.3.5", "@solana/spl-token@^0.3.6", "@solana/spl-token@^0.3.8": +"@solana/spl-token@0.3.8", "@solana/spl-token@^0.3.5", "@solana/spl-token@^0.3.6", "@solana/spl-token@^0.3.8": version "0.3.8" resolved "https://registry.yarnpkg.com/@solana/spl-token/-/spl-token-0.3.8.tgz#8e9515ea876e40a4cc1040af865f61fc51d27edf" integrity sha512-ogwGDcunP9Lkj+9CODOWMiVJEdRtqHAtX2rWF62KxnnSWtMZtV9rDhTrZFshiyJmxDnRL/1nKE1yJHg4jjs3gg== @@ -4608,7 +4618,7 @@ "@wallet-standard/app" "^1.0.1" "@wallet-standard/base" "^1.0.1" -"@solana/web3.js@1.56.0", "@solana/web3.js@1.73.3", "@solana/web3.js@^1.17.0", "@solana/web3.js@^1.21.0", "@solana/web3.js@^1.22.0", "@solana/web3.js@^1.30.2", "@solana/web3.js@^1.31.0", "@solana/web3.js@^1.32.0", "@solana/web3.js@^1.35.1", "@solana/web3.js@^1.36.0", "@solana/web3.js@^1.37.1", "@solana/web3.js@^1.43.4", "@solana/web3.js@^1.44.3", "@solana/web3.js@^1.48.0", "@solana/web3.js@^1.50.1", "@solana/web3.js@^1.56.2", "@solana/web3.js@^1.59.1", "@solana/web3.js@^1.63.0", "@solana/web3.js@^1.63.1", "@solana/web3.js@^1.66.2", "@solana/web3.js@^1.68.0", "@solana/web3.js@^1.73.0", "@solana/web3.js@^1.73.2", "@solana/web3.js@^1.78.2", "@solana/web3.js@^1.78.3": +"@solana/web3.js@1.56.0", "@solana/web3.js@1.73.3", "@solana/web3.js@^1.17.0", "@solana/web3.js@^1.21.0", "@solana/web3.js@^1.22.0", "@solana/web3.js@^1.30.2", "@solana/web3.js@^1.31.0", "@solana/web3.js@^1.32.0", "@solana/web3.js@^1.35.1", "@solana/web3.js@^1.36.0", "@solana/web3.js@^1.37.1", "@solana/web3.js@^1.43.4", "@solana/web3.js@^1.44.3", "@solana/web3.js@^1.48.0", "@solana/web3.js@^1.50.1", "@solana/web3.js@^1.56.2", "@solana/web3.js@^1.59.1", "@solana/web3.js@^1.63.0", "@solana/web3.js@^1.63.1", "@solana/web3.js@^1.66.2", "@solana/web3.js@^1.68.0", "@solana/web3.js@^1.73.0", "@solana/web3.js@^1.73.2", "@solana/web3.js@^1.77.3", "@solana/web3.js@^1.78.2", "@solana/web3.js@^1.78.3": version "1.73.3" resolved "https://registry.yarnpkg.com/@solana/web3.js/-/web3.js-1.73.3.tgz#60e6bd68f6f364d4be360b1e0a03a0a68468a029" integrity sha512-vHRMo589XEIpoujpE2sZZ1aMZvfA1ImKfNxobzEFyMb+H5j6mRRUXfdgWD0qJ0sm11e5BcBC7HPeRXJB+7f3Lg== @@ -6186,12 +6196,12 @@ ansi-escapes@^4.2.1: dependencies: type-fest "^0.21.3" -ansi-regex@3.0.1: +ansi-regex@3.0.1, ansi-regex@^2.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.1.tgz#123d6479e92ad45ad897d4054e3c7ca7db4944e1" integrity sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw== -"ansi-regex@>=3.0.1 <=5.0.1", ansi-regex@^2.0.0, ansi-regex@^3.0.0, ansi-regex@^4.1.0, ansi-regex@^5.0.0, ansi-regex@^5.0.1: +"ansi-regex@>=3.0.1 <=5.0.1", ansi-regex@^3.0.0, ansi-regex@^4.1.0, ansi-regex@^5.0.0, ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== From 7d5892cdbb4b1b203ef1234f100e1a57f4163588 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrian=20Brzezi=C5=84ski?= Date: Thu, 23 Nov 2023 17:58:22 +0100 Subject: [PATCH 15/43] upgrade sentry sdk (#1945) --- package.json | 2 +- yarn.lock | 375 +++++++++++++++++++++++++++++++++------------------ 2 files changed, 244 insertions(+), 133 deletions(-) diff --git a/package.json b/package.json index 94a55949bb..76a7bdcfc6 100644 --- a/package.json +++ b/package.json @@ -85,7 +85,7 @@ "@radix-ui/react-toast": "1.0.0", "@radix-ui/react-toolbar": "1.0.0", "@radix-ui/react-tooltip": "1.0.0", - "@sentry/nextjs": "6.19.7", + "@sentry/nextjs": "7.81.1", "@solana-mobile/wallet-adapter-mobile": "2.0.0", "@solana/buffer-layout": "4.0.0", "@solana/governance-program-library": "npm:@civic/governance-program-library@0.16.9-beta.2", diff --git a/yarn.lock b/yarn.lock index 842c6d71d5..98886153c2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1898,6 +1898,11 @@ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== +"@jridgewell/sourcemap-codec@^1.4.13": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + "@jridgewell/trace-mapping@0.3.9": version "0.3.9" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" @@ -3747,6 +3752,27 @@ "@react-spring/shared" "~9.6.0" "@react-spring/types" "~9.6.0" +"@rollup/plugin-commonjs@24.0.0": + version "24.0.0" + resolved "https://registry.yarnpkg.com/@rollup/plugin-commonjs/-/plugin-commonjs-24.0.0.tgz#fb7cf4a6029f07ec42b25daa535c75b05a43f75c" + integrity sha512-0w0wyykzdyRRPHOb0cQt14mIBLujfAv6GgP6g8nvg/iBxEm112t3YPPq+Buqe2+imvElTka+bjNlJ/gB56TD8g== + dependencies: + "@rollup/pluginutils" "^5.0.1" + commondir "^1.0.1" + estree-walker "^2.0.2" + glob "^8.0.3" + is-reference "1.2.1" + magic-string "^0.27.0" + +"@rollup/pluginutils@^5.0.1": + version "5.0.5" + resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-5.0.5.tgz#bbb4c175e19ebfeeb8c132c2eea0ecb89941a66c" + integrity sha512-6aEYR910NyP73oHiJglti74iRyOwgFU4x3meH/H8OJx6Ry0j6cOVZ5X/wTvub7G7Ao6qaHBEaNsV3GLJkSsF+Q== + dependencies: + "@types/estree" "^1.0.0" + estree-walker "^2.0.2" + picomatch "^2.3.1" + "@saberhq/anchor-contrib@^1.12.47", "@saberhq/anchor-contrib@^1.12.48", "@saberhq/anchor-contrib@^1.14.1", "@saberhq/anchor-contrib@^1.14.11", "@saberhq/anchor-contrib@^1.14.9": version "1.14.11" resolved "https://registry.yarnpkg.com/@saberhq/anchor-contrib/-/anchor-contrib-1.14.11.tgz#cebaac040faea643ade8ecb6afeeb2dcdf5a33a2" @@ -3866,139 +3892,135 @@ dependencies: any-observable "^0.3.0" -"@sentry/browser@6.19.7": - version "6.19.7" - resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-6.19.7.tgz#a40b6b72d911b5f1ed70ed3b4e7d4d4e625c0b5f" - integrity sha512-oDbklp4O3MtAM4mtuwyZLrgO1qDVYIujzNJQzXmi9YzymJCuzMLSRDvhY83NNDCRxf0pds4DShgYeZdbSyKraA== +"@sentry-internal/tracing@7.81.1": + version "7.81.1" + resolved "https://registry.yarnpkg.com/@sentry-internal/tracing/-/tracing-7.81.1.tgz#1180365cd8a9e18cb0f92e1ea970161840ec0e2e" + integrity sha512-E5xm27xrLXL10knH2EWDQsQYh5nb4SxxZzJ3sJwDGG9XGKzBdlp20UUhKqx00wixooVX9uCj3e4Jg8SvNB1hKg== + dependencies: + "@sentry/core" "7.81.1" + "@sentry/types" "7.81.1" + "@sentry/utils" "7.81.1" + +"@sentry/browser@7.81.1": + version "7.81.1" + resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-7.81.1.tgz#5ee6ae3679ee80f444d2e8c5662430e7a734ae50" + integrity sha512-DNtS7bZEnFPKVoGazKs5wHoWC0FwsOFOOMNeDvEfouUqKKbjO7+RDHbr7H6Bo83zX4qmZWRBf8V+3n3YPIiJFw== dependencies: - "@sentry/core" "6.19.7" - "@sentry/types" "6.19.7" - "@sentry/utils" "6.19.7" - tslib "^1.9.3" + "@sentry-internal/tracing" "7.81.1" + "@sentry/core" "7.81.1" + "@sentry/replay" "7.81.1" + "@sentry/types" "7.81.1" + "@sentry/utils" "7.81.1" -"@sentry/cli@^1.73.0": - version "1.74.6" - resolved "https://registry.yarnpkg.com/@sentry/cli/-/cli-1.74.6.tgz#c4f276e52c6f5e8c8d692845a965988068ebc6f5" - integrity sha512-pJ7JJgozyjKZSTjOGi86chIngZMLUlYt2HOog+OJn+WGvqEkVymu8m462j1DiXAnex9NspB4zLLNuZ/R6rTQHg== +"@sentry/cli@^1.77.1": + version "1.77.1" + resolved "https://registry.yarnpkg.com/@sentry/cli/-/cli-1.77.1.tgz#ebcf884712ef6c3c75443f491ec16f6a22148aec" + integrity sha512-OtJ7U9LeuPUAY/xow9wwcjM9w42IJIpDtClTKI/RliE685vd/OJUIpiAvebHNthDYpQynvwb/0iuF4fonh+CKw== dependencies: https-proxy-agent "^5.0.0" mkdirp "^0.5.5" node-fetch "^2.6.7" - npmlog "^4.1.2" progress "^2.0.3" proxy-from-env "^1.1.0" which "^2.0.2" -"@sentry/core@6.19.7": - version "6.19.7" - resolved "https://registry.yarnpkg.com/@sentry/core/-/core-6.19.7.tgz#156aaa56dd7fad8c89c145be6ad7a4f7209f9785" - integrity sha512-tOfZ/umqB2AcHPGbIrsFLcvApdTm9ggpi/kQZFkej7kMphjT+SGBiQfYtjyg9jcRW+ilAR4JXC9BGKsdEQ+8Vw== - dependencies: - "@sentry/hub" "6.19.7" - "@sentry/minimal" "6.19.7" - "@sentry/types" "6.19.7" - "@sentry/utils" "6.19.7" - tslib "^1.9.3" - -"@sentry/hub@6.19.7": - version "6.19.7" - resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-6.19.7.tgz#58ad7776bbd31e9596a8ec46365b45cd8b9cfd11" - integrity sha512-y3OtbYFAqKHCWezF0EGGr5lcyI2KbaXW2Ik7Xp8Mu9TxbSTuwTe4rTntwg8ngPjUQU3SUHzgjqVB8qjiGqFXCA== - dependencies: - "@sentry/types" "6.19.7" - "@sentry/utils" "6.19.7" - tslib "^1.9.3" - -"@sentry/integrations@6.19.7": - version "6.19.7" - resolved "https://registry.yarnpkg.com/@sentry/integrations/-/integrations-6.19.7.tgz#e6e126b692077c8731644224c754012bed65b425" - integrity sha512-yNeeFyuygJaV7Mdc5qWuDa13xVj5mVdECaaw2Xs4pfeHaXmRfRzZY17N8ypWFegKWxKBHynyQRMD10W5pBwJvA== - dependencies: - "@sentry/types" "6.19.7" - "@sentry/utils" "6.19.7" +"@sentry/core@7.81.1": + version "7.81.1" + resolved "https://registry.yarnpkg.com/@sentry/core/-/core-7.81.1.tgz#082fd9122bf9a488c8e05b1754724ddbc2d5cf30" + integrity sha512-tU37yAmckOGCw/moWKSwekSCWWJP15O6luIq+u7wal22hE88F3Vc5Avo8SeF3upnPR+4ejaOFH+BJTr6bgrs6Q== + dependencies: + "@sentry/types" "7.81.1" + "@sentry/utils" "7.81.1" + +"@sentry/integrations@7.81.1": + version "7.81.1" + resolved "https://registry.yarnpkg.com/@sentry/integrations/-/integrations-7.81.1.tgz#1b12c0cf3a7fa88224e86c0be46523ed7e3f3a43" + integrity sha512-DN5ONn0/LX5HHVPf1EBGHFssIZaZmLgkqUIeMqCNYBpB4DiOrJANnGwTcWKDPphqhdPxjnPv9AGRLaU0PdvvZQ== + dependencies: + "@sentry/core" "7.81.1" + "@sentry/types" "7.81.1" + "@sentry/utils" "7.81.1" localforage "^1.8.1" - tslib "^1.9.3" - -"@sentry/minimal@6.19.7": - version "6.19.7" - resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-6.19.7.tgz#b3ee46d6abef9ef3dd4837ebcb6bdfd01b9aa7b4" - integrity sha512-wcYmSJOdvk6VAPx8IcmZgN08XTXRwRtB1aOLZm+MVHjIZIhHoBGZJYTVQS/BWjldsamj2cX3YGbGXNunaCfYJQ== - dependencies: - "@sentry/hub" "6.19.7" - "@sentry/types" "6.19.7" - tslib "^1.9.3" - -"@sentry/nextjs@6.19.7": - version "6.19.7" - resolved "https://registry.yarnpkg.com/@sentry/nextjs/-/nextjs-6.19.7.tgz#2c40692d89a99ec1382189f11702b1498c91fb77" - integrity sha512-029gpqhR6gHF7zfE9oxFOf3Zm68CShDu8/6azC8mwfIfJtyLC9dqztJJi48j0Uxs+sR1TEkN5Dw3wZbfWtFd8g== - dependencies: - "@sentry/core" "6.19.7" - "@sentry/hub" "6.19.7" - "@sentry/integrations" "6.19.7" - "@sentry/node" "6.19.7" - "@sentry/react" "6.19.7" - "@sentry/tracing" "6.19.7" - "@sentry/utils" "6.19.7" - "@sentry/webpack-plugin" "1.18.8" - tslib "^1.9.3" - -"@sentry/node@6.19.7": - version "6.19.7" - resolved "https://registry.yarnpkg.com/@sentry/node/-/node-6.19.7.tgz#32963b36b48daebbd559e6f13b1deb2415448592" - integrity sha512-gtmRC4dAXKODMpHXKfrkfvyBL3cI8y64vEi3fDD046uqYcrWdgoQsffuBbxMAizc6Ez1ia+f0Flue6p15Qaltg== - dependencies: - "@sentry/core" "6.19.7" - "@sentry/hub" "6.19.7" - "@sentry/types" "6.19.7" - "@sentry/utils" "6.19.7" - cookie "^0.4.1" + +"@sentry/nextjs@7.81.1": + version "7.81.1" + resolved "https://registry.yarnpkg.com/@sentry/nextjs/-/nextjs-7.81.1.tgz#2d07a92555b669d6ffdb30645c4c4fff9f801b3a" + integrity sha512-Wx0QiZHttf+WJkao4UQ5szOWJVu/pmPdKZKE4FWsJuG+mUu6FviOXgh0T0Iq+NnJrgqzKzGLMN6rIWPzN9PLkg== + dependencies: + "@rollup/plugin-commonjs" "24.0.0" + "@sentry/core" "7.81.1" + "@sentry/integrations" "7.81.1" + "@sentry/node" "7.81.1" + "@sentry/react" "7.81.1" + "@sentry/types" "7.81.1" + "@sentry/utils" "7.81.1" + "@sentry/vercel-edge" "7.81.1" + "@sentry/webpack-plugin" "1.21.0" + chalk "3.0.0" + resolve "1.22.8" + rollup "2.78.0" + stacktrace-parser "^0.1.10" + +"@sentry/node@7.81.1": + version "7.81.1" + resolved "https://registry.yarnpkg.com/@sentry/node/-/node-7.81.1.tgz#3559ee1cef22f8220c907169cc60cc44744503b1" + integrity sha512-bKS3Mb95bar8AUEZSLKQ/RTSfFXo5sCSPNiBr5dDFuVljDFdkLq6NE3svG5bisrbENqfi0bqWsB4GZ7NHRTPbA== + dependencies: + "@sentry-internal/tracing" "7.81.1" + "@sentry/core" "7.81.1" + "@sentry/types" "7.81.1" + "@sentry/utils" "7.81.1" https-proxy-agent "^5.0.0" - lru_map "^0.3.3" - tslib "^1.9.3" - -"@sentry/react@6.19.7": - version "6.19.7" - resolved "https://registry.yarnpkg.com/@sentry/react/-/react-6.19.7.tgz#58cc2d6da20f7d3b0df40638dfbbbc86c9c85caf" - integrity sha512-VzJeBg/v41jfxUYPkH2WYrKjWc4YiMLzDX0f4Zf6WkJ4v3IlDDSkX6DfmWekjTKBho6wiMkSNy2hJ1dHfGZ9jA== - dependencies: - "@sentry/browser" "6.19.7" - "@sentry/minimal" "6.19.7" - "@sentry/types" "6.19.7" - "@sentry/utils" "6.19.7" + +"@sentry/react@7.81.1": + version "7.81.1" + resolved "https://registry.yarnpkg.com/@sentry/react/-/react-7.81.1.tgz#6a94e8e373a5bf27330cea2eb1a603ae0eb0b8ba" + integrity sha512-kk0plP/mf8KgVLOiImIpp1liYysmh3Un8uXcVAToomSuHZPGanelFAdP0XhY+0HlWU9KIfxTjhMte1iSwQ8pYw== + dependencies: + "@sentry/browser" "7.81.1" + "@sentry/types" "7.81.1" + "@sentry/utils" "7.81.1" hoist-non-react-statics "^3.3.2" - tslib "^1.9.3" -"@sentry/tracing@6.19.7": - version "6.19.7" - resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-6.19.7.tgz#54bb99ed5705931cd33caf71da347af769f02a4c" - integrity sha512-ol4TupNnv9Zd+bZei7B6Ygnr9N3Gp1PUrNI761QSlHtPC25xXC5ssSD3GMhBgyQrcvpuRcCFHVNNM97tN5cZiA== +"@sentry/replay@7.81.1": + version "7.81.1" + resolved "https://registry.yarnpkg.com/@sentry/replay/-/replay-7.81.1.tgz#a656d55e2a00b34e42be6eeb79018d21efc223af" + integrity sha512-4ueT0C4bYjngN/9p0fEYH10dTMLovHyk9HxJ6zSTgePvGVexhg+cSEHXisoBDwHeRZVnbIvsVM0NA7rmEDXJJw== dependencies: - "@sentry/hub" "6.19.7" - "@sentry/minimal" "6.19.7" - "@sentry/types" "6.19.7" - "@sentry/utils" "6.19.7" - tslib "^1.9.3" + "@sentry-internal/tracing" "7.81.1" + "@sentry/core" "7.81.1" + "@sentry/types" "7.81.1" + "@sentry/utils" "7.81.1" -"@sentry/types@6.19.7": - version "6.19.7" - resolved "https://registry.yarnpkg.com/@sentry/types/-/types-6.19.7.tgz#c6b337912e588083fc2896eb012526cf7cfec7c7" - integrity sha512-jH84pDYE+hHIbVnab3Hr+ZXr1v8QABfhx39KknxqKWr2l0oEItzepV0URvbEhB446lk/S/59230dlUUIBGsXbg== +"@sentry/types@7.81.1": + version "7.81.1" + resolved "https://registry.yarnpkg.com/@sentry/types/-/types-7.81.1.tgz#2b2551fc291e1089651fd574a68f7c4175878bd5" + integrity sha512-dvJvGyctiaPMIQqa46k56Re5IODWMDxiHJ1UjBs/WYDLrmWFPGrEbyJ8w8CYLhYA+7qqrCyIZmHbWSTRIxstHw== -"@sentry/utils@6.19.7": - version "6.19.7" - resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-6.19.7.tgz#6edd739f8185fd71afe49cbe351c1bbf5e7b7c79" - integrity sha512-z95ECmE3i9pbWoXQrD/7PgkBAzJYR+iXtPuTkpBjDKs86O3mT+PXOT3BAn79w2wkn7/i3vOGD2xVr1uiMl26dA== +"@sentry/utils@7.81.1": + version "7.81.1" + resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-7.81.1.tgz#42f3e77baf90205cec1f8599eb8445a6918030bd" + integrity sha512-gq+MDXIirHKxNZ+c9/lVvCXd6y2zaZANujwlFggRH2u9SRiPaIXVilLpvMm4uJqmqBMEcY81ArujExtHvkbCqg== dependencies: - "@sentry/types" "6.19.7" - tslib "^1.9.3" + "@sentry/types" "7.81.1" -"@sentry/webpack-plugin@1.18.8": - version "1.18.8" - resolved "https://registry.yarnpkg.com/@sentry/webpack-plugin/-/webpack-plugin-1.18.8.tgz#247a73a0aa9e28099a736bbe89ca0d35cbac7636" - integrity sha512-PtKr0NL62b5L3kPFGjwSNbIUwwcW5E5G6bQxAYZGpkgL1MFPnS4ND0SAsySuX0byQJRFFium5A19LpzyvQZSlQ== +"@sentry/vercel-edge@7.81.1": + version "7.81.1" + resolved "https://registry.yarnpkg.com/@sentry/vercel-edge/-/vercel-edge-7.81.1.tgz#8d33b27b8222bee8c85388cb734f886e57fecc1d" + integrity sha512-fO5yV+2rz+024XKvhBSGhUdi502j3S1Vds+fIUJVgpgehpxsx4CQQUA1nQDaqDWEtPCB6LcBupD3XvkhBTS5Mw== dependencies: - "@sentry/cli" "^1.73.0" + "@sentry-internal/tracing" "7.81.1" + "@sentry/core" "7.81.1" + "@sentry/types" "7.81.1" + "@sentry/utils" "7.81.1" + +"@sentry/webpack-plugin@1.21.0": + version "1.21.0" + resolved "https://registry.yarnpkg.com/@sentry/webpack-plugin/-/webpack-plugin-1.21.0.tgz#bbe7cb293751f80246a4a56f9a7dd6de00f14b58" + integrity sha512-x0PYIMWcsTauqxgl7vWUY6sANl+XGKtx7DCVnnY7aOIIlIna0jChTAPANTfA2QrK+VK+4I/4JxatCEZBnXh3Og== + dependencies: + "@sentry/cli" "^1.77.1" + webpack-sources "^2.0.0 || ^3.0.0" "@sinclair/typebox@^0.24.1": version "0.24.51" @@ -5402,6 +5424,11 @@ dependencies: "@types/ms" "*" +"@types/estree@*", "@types/estree@^1.0.0": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" + integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== + "@types/geojson@*": version "7946.0.10" resolved "https://registry.yarnpkg.com/@types/geojson/-/geojson-7946.0.10.tgz#6dfbf5ea17142f7f9a043809f1cd4c448cb68249" @@ -7167,6 +7194,14 @@ chai@^4.3.7: pathval "^1.1.1" type-detect "^4.0.5" +chalk@3.0.0, chalk@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" + integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + chalk@4.1.2, chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" @@ -7195,14 +7230,6 @@ chalk@^2.4.1, chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" - integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - char-regex@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" @@ -7465,6 +7492,11 @@ commander@^9.4.0: resolved "https://registry.yarnpkg.com/commander/-/commander-9.4.1.tgz#d1dd8f2ce6faf93147295c0df13c7c21141cfbdd" integrity sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw== +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== + concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" @@ -7485,11 +7517,6 @@ convert-source-map@^2.0.0: resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== -cookie@^0.4.1: - version "0.4.2" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" - integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== - copy-to-clipboard@^3.3.1: version "3.3.3" resolved "https://registry.yarnpkg.com/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz#55ac43a1db8ae639a4bd99511c148cdd1b83a1b0" @@ -8973,6 +9000,11 @@ estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== +estree-walker@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" + integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== + esutils@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" @@ -9485,6 +9517,11 @@ function-bind@^1.1.1: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + function.prototype.name@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" @@ -9623,6 +9660,17 @@ glob@^7.1.3, glob@^7.1.4, glob@^7.1.7: once "^1.3.0" path-is-absolute "^1.0.0" +glob@^8.0.3: + version "8.1.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" + integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^5.0.1" + once "^1.3.0" + globals@^11.1.0: version "11.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" @@ -9754,6 +9802,13 @@ hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: inherits "^2.0.3" minimalistic-assert "^1.0.1" +hasown@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.0.tgz#f4c513d454a57b7c7e1650778de226b11700546c" + integrity sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA== + dependencies: + function-bind "^1.1.2" + he@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" @@ -10106,6 +10161,13 @@ is-color-stop@^1.1.0: rgb-regex "^1.0.1" rgba-regex "^1.0.0" +is-core-module@^2.13.0: + version "2.13.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" + integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== + dependencies: + hasown "^2.0.0" + is-core-module@^2.8.1, is-core-module@^2.9.0: version "2.11.0" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" @@ -10233,6 +10295,13 @@ is-promise@^2.1.0: resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1" integrity sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ== +is-reference@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-1.2.1.tgz#8b2dac0b371f4bc994fdeaba9eb542d03002d0b7" + integrity sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ== + dependencies: + "@types/estree" "*" + is-regex@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" @@ -11310,11 +11379,6 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" -lru_map@^0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/lru_map/-/lru_map-0.3.3.tgz#b5c8351b9464cbd750335a79650a0ec0e56118dd" - integrity sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ== - luxon@^2.4.0: version "2.5.0" resolved "https://registry.yarnpkg.com/luxon/-/luxon-2.5.0.tgz#098090f67d690b247e83c090267a60b1aa8ea96c" @@ -11325,6 +11389,13 @@ lz-string@^1.4.4: resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.4.4.tgz#c0d8eaf36059f705796e1e344811cf4c498d3a26" integrity sha512-0ckx7ZHRPqb0oUm8zNr+90mtf9DQB60H1wMCjBtfi62Kl3a7JbHob6gA2bC+xRvZoOL+1hzUK8jeuEIQE8svEQ== +magic-string@^0.27.0: + version "0.27.0" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.27.0.tgz#e4a3413b4bab6d98d2becffd48b4a257effdbbf3" + integrity sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA== + dependencies: + "@jridgewell/sourcemap-codec" "^1.4.13" + make-dir@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" @@ -11893,6 +11964,13 @@ minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: dependencies: brace-expansion "^1.1.7" +minimatch@^5.0.1: + version "5.1.6" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + minimist@^1.2.0, minimist@^1.2.6: version "1.2.7" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18" @@ -13932,6 +14010,15 @@ resolve.exports@^1.1.0: resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-1.1.0.tgz#5ce842b94b05146c0e03076985d1d0e7e48c90c9" integrity sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ== +resolve@1.22.8: + version "1.22.8" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" + integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + resolve@^1.12.0, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.0: version "1.22.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" @@ -14018,6 +14105,13 @@ robust-predicates@^3.0.0: resolved "https://registry.yarnpkg.com/robust-predicates/-/robust-predicates-3.0.1.tgz#ecde075044f7f30118682bd9fb3f123109577f9a" integrity sha512-ndEIpszUHiG4HtDsQLeIuMvRsDnn8c8rYStabochtUeCvfuvNptb5TUbVD68LRAILPX7p9nqQGh4xJgn3EHS/g== +rollup@2.78.0: + version "2.78.0" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.78.0.tgz#00995deae70c0f712ea79ad904d5f6b033209d9e" + integrity sha512-4+YfbQC9QEVvKTanHhIAFVUFSRsezvQF8vFOJwtGfb9Bb+r014S+qryr9PSmw8x6sMnPkmFBGAvIFVQxvJxjtg== + optionalDependencies: + fsevents "~2.3.2" + rpc-websockets@^7.5.1: version "7.6.0" resolved "https://registry.yarnpkg.com/rpc-websockets/-/rpc-websockets-7.6.0.tgz#d3f4c0dac108ca35566b0e31552c32e58928cd04" @@ -14406,6 +14500,13 @@ stack-utils@^2.0.3: dependencies: escape-string-regexp "^2.0.0" +stacktrace-parser@^0.1.10: + version "0.1.10" + resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz#29fb0cae4e0d0b85155879402857a1639eb6051a" + integrity sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg== + dependencies: + type-fest "^0.7.1" + static-eval@2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/static-eval/-/static-eval-2.0.2.tgz#2d1759306b1befa688938454c546b7871f806a42" @@ -15066,7 +15167,7 @@ tsconfig-paths@3.14.1, tsconfig-paths@^3.14.1, tsconfig-paths@^3.5.0: minimist "^1.2.6" strip-bom "^3.0.0" -tslib@1.14.1, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: +tslib@1.14.1, tslib@^1.8.1, tslib@^1.9.0: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== @@ -15175,6 +15276,11 @@ type-fest@^0.21.3: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== +type-fest@^0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48" + integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== + typedoc-plugin-missing-exports@^0.22.6: version "0.22.6" resolved "https://registry.yarnpkg.com/typedoc-plugin-missing-exports/-/typedoc-plugin-missing-exports-0.22.6.tgz#7467c60f1cd26507124103f0b9bca271d5aa8d71" @@ -15572,6 +15678,11 @@ webpack-bundle-analyzer@4.3.0: sirv "^1.0.7" ws "^7.3.1" +"webpack-sources@^2.0.0 || ^3.0.0": + version "3.2.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" + integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== + webrtc-adapter@^7.2.1: version "7.7.1" resolved "https://registry.yarnpkg.com/webrtc-adapter/-/webrtc-adapter-7.7.1.tgz#b2c227a6144983b35057df67bd984a7d4bfd17f1" From 20d0a1a9f83b43ed5529ad120109baee55c9c676 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrian=20Brzezi=C5=84ski?= Date: Thu, 23 Nov 2023 18:38:02 +0100 Subject: [PATCH 16/43] fix vsr transition withdraw warning (#1946) --- components/GovernancePower/GovernancePowerForRole.tsx | 10 +++++++++- components/TokenBalance/TokenDeposit.tsx | 4 ++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/components/GovernancePower/GovernancePowerForRole.tsx b/components/GovernancePower/GovernancePowerForRole.tsx index 099ef5eda4..6b627cbc9f 100644 --- a/components/GovernancePower/GovernancePowerForRole.tsx +++ b/components/GovernancePower/GovernancePowerForRole.tsx @@ -10,6 +10,8 @@ import VanillaVotingPower from './Vanilla/VanillaVotingPower' import { Deposit } from './Vanilla/Deposit' import { useUserCommunityTokenOwnerRecord } from '@hooks/queries/tokenOwnerRecord' import { ExclamationIcon } from '@heroicons/react/solid' +import { VSR_PLUGIN_PKS } from '@constants/plugins' +import { useRealmConfigQuery } from '@hooks/queries/realmConfig' export default function GovernancePowerForRole({ role, @@ -21,10 +23,16 @@ export default function GovernancePowerForRole({ }) { const { connection } = useConnection() const realmPk = useSelectedRealmPubkey() + const config = useRealmConfigQuery().data?.result const ownTokenRecord = useUserCommunityTokenOwnerRecord().data?.result //if dao transited to use plugin and some users have still deposited tokens they should withdraw before //depositing to plugin + const isVsr = + config?.account?.communityTokenConfig?.voterWeightAddin && + VSR_PLUGIN_PKS.includes( + config?.account?.communityTokenConfig?.voterWeightAddin?.toBase58() + ) const didWithdrawFromVanillaSetup = !ownTokenRecord || ownTokenRecord.account.governingTokenDepositAmount.isZero() @@ -52,7 +60,7 @@ export default function GovernancePowerForRole({
- {!didWithdrawFromVanillaSetup && ( + {isVsr && !didWithdrawFromVanillaSetup && ( Please withdraw your tokens and deposit again to get governance diff --git a/components/TokenBalance/TokenDeposit.tsx b/components/TokenBalance/TokenDeposit.tsx index 1155144fe9..9f8e5baefd 100644 --- a/components/TokenBalance/TokenDeposit.tsx +++ b/components/TokenBalance/TokenDeposit.tsx @@ -290,9 +290,9 @@ export const TokenDeposit = ({ ? availableTokens : 0 const isVsr = - config?.account.communityTokenConfig.voterWeightAddin && + config?.account?.communityTokenConfig?.voterWeightAddin && VSR_PLUGIN_PKS.includes( - config?.account.communityTokenConfig.voterWeightAddin.toBase58() + config?.account?.communityTokenConfig?.voterWeightAddin?.toBase58() ) && tokenRole === GoverningTokenRole.Community From d524dbec796d1893c29975721138b6df38951f37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrian=20Brzezi=C5=84ski?= Date: Sun, 26 Nov 2023 13:41:08 +0100 Subject: [PATCH 17/43] fix marinde token stats (#1947) --- pages/dao/[symbol]/token-stats/index.tsx | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/pages/dao/[symbol]/token-stats/index.tsx b/pages/dao/[symbol]/token-stats/index.tsx index 990cc5c662..7d3a281042 100644 --- a/pages/dao/[symbol]/token-stats/index.tsx +++ b/pages/dao/[symbol]/token-stats/index.tsx @@ -46,7 +46,7 @@ import useLegacyConnectionContext from '@hooks/useLegacyConnectionContext' import { useRealmProposalsQuery } from '@hooks/queries/proposal' import { useQuery } from '@tanstack/react-query' import { IDL } from 'VoteStakeRegistry/sdk/voter_stake_registry' -import {ProfileImage, ProfileName} from "@components/Profile"; +import { ProfileImage, ProfileName } from '@components/Profile' const VestingVsTime = dynamic( () => import('VoteStakeRegistry/components/LockTokenStats/VestingVsTime'), @@ -445,7 +445,11 @@ const LockTokenStats = () => { ) } const renderAddressImage = (wallet) => ( - + ) return ( @@ -539,7 +543,7 @@ const LockTokenStats = () => { .reduce((acc, curr) => { return acc.add(curr.vestingAmount) }, new BN(0)) - .toNumber(), + .toString(), } }), ]} From a02ba10c0aac6d86553fd27d45eb201da6e190b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrian=20Brzezi=C5=84ski?= Date: Sun, 26 Nov 2023 20:54:38 +0100 Subject: [PATCH 18/43] fix clawback instructions package match (#1948) --- .../components/instructions/Clawback.tsx | 18 ++++++++++++++++-- components/instructions/TransactionCard.tsx | 1 - hooks/useGovernanceAssets.ts | 4 ++-- utils/uiTypes/proposalCreationTypes.ts | 1 + 4 files changed, 19 insertions(+), 5 deletions(-) diff --git a/VoteStakeRegistry/components/instructions/Clawback.tsx b/VoteStakeRegistry/components/instructions/Clawback.tsx index 03ab12d0be..49a13b802f 100644 --- a/VoteStakeRegistry/components/instructions/Clawback.tsx +++ b/VoteStakeRegistry/components/instructions/Clawback.tsx @@ -38,6 +38,7 @@ import useVotePluginsClientStore from 'stores/useVotePluginsClientStore' import { AssetAccount } from '@utils/uiTypes/assets' import { useRealmQuery } from '@hooks/queries/realm' import useLegacyConnectionContext from '@hooks/useLegacyConnectionContext' +import Input from '@components/inputs/Input' const Clawback = ({ index, @@ -54,13 +55,13 @@ const Clawback = ({ governedTokenAccountsWithoutNfts, governancesArray, } = useGovernanceAssets() - const shouldBeGoverned = !!(index !== 0 && governance) const [voters, setVoters] = useState([]) const [deposits, setDeposits] = useState([]) const [form, setForm] = useState({ governedTokenAccount: undefined, voter: null, deposit: null, + holdupTime: 0, }) const formDeposits = form.deposit const schema = useMemo( @@ -74,6 +75,7 @@ const Clawback = ({ }), [] ) + const realmAuthorityGov = governancesArray.find( (x) => x.pubkey.toBase58() === realm?.account.authority?.toBase58() ) @@ -119,6 +121,7 @@ const Clawback = ({ isValid, governance: realmAuthorityGov, prerequisiteInstructions: prerequisiteInstructions, + customHoldUpTime: form.holdupTime, } return obj }, [client, form, realmAuthorityGov, realm, schema]) @@ -265,6 +268,7 @@ const Clawback = ({ })} + + handleSetForm({ + value: evt.target.value, + propertyName: 'holdupTime', + }) + } + > ) } diff --git a/components/instructions/TransactionCard.tsx b/components/instructions/TransactionCard.tsx index 90ba969729..1c6f719602 100644 --- a/components/instructions/TransactionCard.tsx +++ b/components/instructions/TransactionCard.tsx @@ -23,7 +23,6 @@ export default function TransactionCard({ ? PlayState.Played : PlayState.Unplayed ) - return (

{`Transaction ${index} `}

diff --git a/hooks/useGovernanceAssets.ts b/hooks/useGovernanceAssets.ts index 66646cd16a..08a8052c97 100644 --- a/hooks/useGovernanceAssets.ts +++ b/hooks/useGovernanceAssets.ts @@ -236,7 +236,7 @@ export default function useGovernanceAssets() { canUseTokenTransferInstruction && currentPluginPk && VSR_PLUGIN_PKS.includes(currentPluginPk.toBase58()), - packageId: PackageEnum.Common, + packageId: PackageEnum.VsrPlugin, }, [Instructions.CloseTokenAccount]: { name: 'Close token account', @@ -277,7 +277,7 @@ export default function useGovernanceAssets() { canUseTokenTransferInstruction && currentPluginPk && VSR_PLUGIN_PKS.includes(currentPluginPk.toBase58()), - packageId: PackageEnum.Common, + packageId: PackageEnum.VsrPlugin, }, [Instructions.JoinDAO]: { name: 'Join a DAO', diff --git a/utils/uiTypes/proposalCreationTypes.ts b/utils/uiTypes/proposalCreationTypes.ts index 62cf0600d7..3880d37716 100644 --- a/utils/uiTypes/proposalCreationTypes.ts +++ b/utils/uiTypes/proposalCreationTypes.ts @@ -111,6 +111,7 @@ export interface ClawbackForm { governedTokenAccount: AssetAccount | undefined voter: Voter | null deposit: DepositWithMintAccount | null + holdupTime: number } export interface SendTokenCompactViewForm extends SplTokenTransferForm { From 8e893ba8bc746199990c2d1d66d46897def3adb5 Mon Sep 17 00:00:00 2001 From: agrippa Date: Sun, 26 Nov 2023 17:57:41 -0500 Subject: [PATCH 19/43] ignore plugin for council vote (#1949) --- hooks/useSubmitVote.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/hooks/useSubmitVote.ts b/hooks/useSubmitVote.ts index 16cafd9afa..7b2fd28789 100644 --- a/hooks/useSubmitVote.ts +++ b/hooks/useSubmitVote.ts @@ -142,7 +142,7 @@ export const useSubmitVote = () => { tokenOwnerRecordPk, vote, msg, - client, + role === 'community' ? client : undefined, // NOTE: currently FE doesn't support council plugins fully confirmationCallback, voteWeights, relevantDelegators @@ -155,6 +155,7 @@ export const useSubmitVote = () => { queryKey: [connection.cluster, 'ChatMessages'], }) } catch (e) { + console.error(e) notify({ type: 'error', message: e.message }) } finally { if (isNftPlugin) { From 794b146cf4e481b739c67714ccd3a0b3ba770ee7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrian=20Brzezi=C5=84ski?= Date: Mon, 27 Nov 2023 22:14:22 +0100 Subject: [PATCH 20/43] upgrade mngo settings lib (#1953) --- components/instructions/programs/jupiterRef.tsx | 17 +++++++++++++++++ components/instructions/tools.tsx | 2 ++ package.json | 2 +- utils/Mango/listingTools.ts | 4 ++-- yarn.lock | 12 ++++++------ 5 files changed, 28 insertions(+), 9 deletions(-) create mode 100644 components/instructions/programs/jupiterRef.tsx diff --git a/components/instructions/programs/jupiterRef.tsx b/components/instructions/programs/jupiterRef.tsx new file mode 100644 index 0000000000..63cc70242e --- /dev/null +++ b/components/instructions/programs/jupiterRef.tsx @@ -0,0 +1,17 @@ +export const JUPITER_REF = { + REFER4ZgmyYx9c6He5XfaTMiGfdLwRnkV4RPp9t9iF3: { + 125: { + name: 'Initialize Referral Token Account', + accounts: [ + { name: 'Payer' }, + { name: '' }, + { name: 'Referral' }, + { name: '' }, + { name: 'Mint' }, + ], + getDataUI: () => { + return
+ }, + }, + }, +} diff --git a/components/instructions/tools.tsx b/components/instructions/tools.tsx index ddb8b5d492..6fa7da772d 100644 --- a/components/instructions/tools.tsx +++ b/components/instructions/tools.tsx @@ -35,6 +35,7 @@ import { MANGO_V4_INSTRUCTIONS } from './programs/mangoV4' import { DUAL_INSTRUCTIONS } from './programs/dual' import { SWITCHBOARD_INSTRUCTIONS } from './programs/switchboard' import { STAKE_INSTRUCTIONS } from './programs/stake' +import { JUPITER_REF } from './programs/jupiterRef' /** * Default governance program id instance @@ -449,6 +450,7 @@ export const INSTRUCTION_DESCRIPTORS = { ...MANGO_V4_INSTRUCTIONS, ...DUAL_INSTRUCTIONS, ...STAKE_INSTRUCTIONS, + ...JUPITER_REF, } export async function getInstructionDescriptor( diff --git a/package.json b/package.json index 76a7bdcfc6..97fe04e510 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "@blockworks-foundation/mango-mints-redemption": "0.0.10", "@blockworks-foundation/mango-v4": "0.20.3", "@jup-ag/referral-sdk": "0.1.5", - "@blockworks-foundation/mango-v4-settings": "0.2.18", + "@blockworks-foundation/mango-v4-settings": "0.2.19", "@blockworks-foundation/mangolana": "0.0.1-beta.15", "@bonfida/spl-name-service": "0.1.47", "@bundlr-network/client": "0.7.15", diff --git a/utils/Mango/listingTools.ts b/utils/Mango/listingTools.ts index 9cef7f23b3..f2aa55db25 100644 --- a/utils/Mango/listingTools.ts +++ b/utils/Mango/listingTools.ts @@ -318,7 +318,7 @@ export const getSuggestedCoinTier = async ( ) const tier = - indexForTierFromSwaps > -1 ? TIERS[indexForTierFromSwaps] : 'UNTRUSTED' + indexForTierFromSwaps > -1 ? TIERS[indexForTierFromSwaps] : 'SHIT' const tierLowerThenCurrent = tier === 'ULTRA_PREMIUM' || tier === 'PREMIUM' @@ -340,7 +340,7 @@ export const getSuggestedCoinTier = async ( } } catch (e) { return { - tier: 'UNTRUSTED', + tier: 'SHIT', priceImpact: 100, } } diff --git a/yarn.lock b/yarn.lock index 98886153c2..a413b1d48b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -337,10 +337,10 @@ keccak256 "^1.0.6" merkletreejs "^0.3.11" -"@blockworks-foundation/mango-v4-settings@0.2.18": - version "0.2.18" - resolved "https://registry.yarnpkg.com/@blockworks-foundation/mango-v4-settings/-/mango-v4-settings-0.2.18.tgz#d984617fd44d7ba0d56b7f4a751f8b3b4d95cc35" - integrity sha512-hdU75eED5YzUWg4EJcUIJZsEvfeLVwUj3yfEykyj/OMVR/H83cbX5KuTnfh6ri0Iwd+K8cqNNFdParLKigoUxQ== +"@blockworks-foundation/mango-v4-settings@0.2.19": + version "0.2.19" + resolved "https://registry.yarnpkg.com/@blockworks-foundation/mango-v4-settings/-/mango-v4-settings-0.2.19.tgz#75b75cc5f98c0492530f6afbe6b177725304c81b" + integrity sha512-MZVbIK2w3ShqRq5WgHF4gU2dYiRQUuV13aBlwF1Ih+R1s2XmUL5/nkMCeWkJfUk6d9QuDwBbKlZEnyhDMYOM9w== dependencies: bn.js "^5.2.1" eslint-config-prettier "^9.0.0" @@ -6223,12 +6223,12 @@ ansi-escapes@^4.2.1: dependencies: type-fest "^0.21.3" -ansi-regex@3.0.1, ansi-regex@^2.0.0: +ansi-regex@3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.1.tgz#123d6479e92ad45ad897d4054e3c7ca7db4944e1" integrity sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw== -"ansi-regex@>=3.0.1 <=5.0.1", ansi-regex@^3.0.0, ansi-regex@^4.1.0, ansi-regex@^5.0.0, ansi-regex@^5.0.1: +"ansi-regex@>=3.0.1 <=5.0.1", ansi-regex@^2.0.0, ansi-regex@^3.0.0, ansi-regex@^4.1.0, ansi-regex@^5.0.0, ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== From 9bdf934eef31352bdfaac2c8b005a457f8336c6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrian=20Brzezi=C5=84ski?= Date: Tue, 28 Nov 2023 00:07:58 +0100 Subject: [PATCH 21/43] fix old proposals (#1954) --- pages/dao/[symbol]/proposal/[pk]/ProposalWarnings.tsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/pages/dao/[symbol]/proposal/[pk]/ProposalWarnings.tsx b/pages/dao/[symbol]/proposal/[pk]/ProposalWarnings.tsx index 7eb577a24a..cdd5ded8be 100644 --- a/pages/dao/[symbol]/proposal/[pk]/ProposalWarnings.tsx +++ b/pages/dao/[symbol]/proposal/[pk]/ProposalWarnings.tsx @@ -144,7 +144,7 @@ const useProposalSafetyCheck = (proposal: Proposal) => { [governance] ) const walletsPassedToInstructions = transactions?.flatMap((tx) => - tx.account.instructions.flatMap((ins) => + tx.account.instructions?.flatMap((ins) => ins.accounts.map((acc) => acc.pubkey) ) ) @@ -158,7 +158,9 @@ const useProposalSafetyCheck = (proposal: Proposal) => { treasuryAddress.result && !!transactions?.length && !walletsPassedToInstructions?.find( - (x) => governance?.pubkey.equals(x) || treasuryAddress.result?.equals(x) + (x) => + x && + (governance?.pubkey?.equals(x) || treasuryAddress.result?.equals(x)) ) const proposalWarnings: ( From aa080468c89fd83054975521e35981b22efd2afa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrian=20Brzezi=C5=84ski?= Date: Tue, 28 Nov 2023 20:05:06 +0100 Subject: [PATCH 22/43] upgrade mango lib (#1956) --- components/instructions/programs/mangoV4.tsx | 8 ++++++-- package.json | 2 +- utils/Mango/listingTools.ts | 7 ++++--- yarn.lock | 8 ++++---- 4 files changed, 15 insertions(+), 10 deletions(-) diff --git a/components/instructions/programs/mangoV4.tsx b/components/instructions/programs/mangoV4.tsx index a993c63b20..660466ddac 100644 --- a/components/instructions/programs/mangoV4.tsx +++ b/components/instructions/programs/mangoV4.tsx @@ -252,6 +252,7 @@ const instructions = () => ({ ) const formattedProposedArgs = getFormattedListingValues(args) + const suggestedPreset = getFormattedListingPresets( proposedOracle.type === 'Pyth' )[liqudityTier.tier] @@ -303,7 +304,7 @@ const instructions = () => ({ suggestedUntrusted={suggestedUntrusted} val={formattedProposedArgs[valKey]} suggestedVal={invalidFields[valKey]} - suffix={suffix} + suffix={formattedProposedArgs[valKey] && suffix} prefix={perfix} /> ) @@ -1644,7 +1645,10 @@ const getFormattedListingValues = (args: FlatListingArgs) => { tokenIndex: args.tokenIndex, tokenName: args.name, oracle: args.oracle?.toBase58(), - oracleConfidenceFilter: (args['oracleConfig.confFilter'] * 100).toFixed(2), + oracleConfidenceFilter: + args['oracleConfig.confFilter'] >= Number.MAX_SAFE_INTEGER + ? '' + : (args['oracleConfig.confFilter'] * 100).toFixed(2), oracleMaxStalenessSlots: args['oracleConfig.maxStalenessSlots'], interestRateUtilizationPoint0: ( args['interestRateParams.util0'] * 100 diff --git a/package.json b/package.json index 97fe04e510..7fa033a74e 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "@blockworks-foundation/mango-mints-redemption": "0.0.10", "@blockworks-foundation/mango-v4": "0.20.3", "@jup-ag/referral-sdk": "0.1.5", - "@blockworks-foundation/mango-v4-settings": "0.2.19", + "@blockworks-foundation/mango-v4-settings": "0.2.22", "@blockworks-foundation/mangolana": "0.0.1-beta.15", "@bonfida/spl-name-service": "0.1.47", "@bundlr-network/client": "0.7.15", diff --git a/utils/Mango/listingTools.ts b/utils/Mango/listingTools.ts index f2aa55db25..fba8169b2b 100644 --- a/utils/Mango/listingTools.ts +++ b/utils/Mango/listingTools.ts @@ -632,9 +632,10 @@ export const getFormattedBankValues = (group: Group, bank: Bank) => { lastRatesUpdate: new Date( 1000 * bank.bankRateLastUpdated.toNumber() ).toUTCString(), - oracleConfFilter: (100 * bank.oracleConfig.confFilter.toNumber()).toFixed( - 2 - ), + oracleConfFilter: + bank.oracleConfig.confFilter.toNumber() === Number.MAX_SAFE_INTEGER + ? '' + : (100 * bank.oracleConfig.confFilter.toNumber()).toFixed(2), minVaultToDepositsRatio: bank.minVaultToDepositsRatio * 100, netBorrowsInWindow: toUiDecimalsForQuote( I80F48.fromI64(bank.netBorrowsInWindow).mul(bank.price) diff --git a/yarn.lock b/yarn.lock index a413b1d48b..396355544f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -337,10 +337,10 @@ keccak256 "^1.0.6" merkletreejs "^0.3.11" -"@blockworks-foundation/mango-v4-settings@0.2.19": - version "0.2.19" - resolved "https://registry.yarnpkg.com/@blockworks-foundation/mango-v4-settings/-/mango-v4-settings-0.2.19.tgz#75b75cc5f98c0492530f6afbe6b177725304c81b" - integrity sha512-MZVbIK2w3ShqRq5WgHF4gU2dYiRQUuV13aBlwF1Ih+R1s2XmUL5/nkMCeWkJfUk6d9QuDwBbKlZEnyhDMYOM9w== +"@blockworks-foundation/mango-v4-settings@0.2.22": + version "0.2.22" + resolved "https://registry.yarnpkg.com/@blockworks-foundation/mango-v4-settings/-/mango-v4-settings-0.2.22.tgz#19a34eeabd7cf59d76d59048369b66fa1f393e9c" + integrity sha512-tHmLsGFn7oh4EPWoGeWExP1TBvOSvfaeKS5ypDq5sx87zA/95pEyzcPmkLFkQKQoUQTX+udz/4qTnUjPqPflWw== dependencies: bn.js "^5.2.1" eslint-config-prettier "^9.0.0" From 2ffef73d70fe90cd627acd5a507409787674d788 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrian=20Brzezi=C5=84ski?= Date: Thu, 30 Nov 2023 22:17:08 +0100 Subject: [PATCH 23/43] Feature/forwarder program wrapper (#1959) --- .../ForwarderProgram/ForwarderProgram.tsx | 116 ++++++++++++++++++ components/TreasuryAccount/MangoModal.tsx | 2 +- .../TransactionInstructionCard.tsx | 16 ++- components/instructions/programs/mangoV4.tsx | 5 + components/instructions/tools.tsx | 88 +++++++++++-- .../proposal/[pk]/ProposalWarnings.tsx | 40 ++++++ .../instructions/Mango/MangoV4/EditToken.tsx | 16 ++- .../Mango/MangoV4/OpenBookEditMarket.tsx | 15 ++- .../Mango/MangoV4/OpenBookRegisterMarket.tsx | 15 ++- .../instructions/Mango/MangoV4/PerpCreate.tsx | 15 ++- .../instructions/Mango/MangoV4/PerpEdit.tsx | 16 ++- .../Mango/MangoV4/TokenRegister.tsx | 21 +++- .../Mango/MangoV4/TokenRegisterTrustless.tsx | 21 +++- 13 files changed, 353 insertions(+), 33 deletions(-) create mode 100644 components/ForwarderProgram/ForwarderProgram.tsx diff --git a/components/ForwarderProgram/ForwarderProgram.tsx b/components/ForwarderProgram/ForwarderProgram.tsx new file mode 100644 index 0000000000..c6f168ccbd --- /dev/null +++ b/components/ForwarderProgram/ForwarderProgram.tsx @@ -0,0 +1,116 @@ +import Checkbox from '@components/inputs/Checkbox' +import Input from '@components/inputs/Input' +import { MANGO_INSTRUCTION_FORWARDER } from '@components/instructions/tools' +import { BN } from '@coral-xyz/anchor' +import { PublicKey, TransactionInstruction } from '@solana/web3.js' +import { tryParsePublicKey } from '@tools/core/pubkey' +import { useCallback, useState } from 'react' + +export function wrapWithForwarder( + ix: TransactionInstruction, + executableBy: PublicKey, + executableUntilUnixTs: number +): TransactionInstruction { + return new TransactionInstruction({ + keys: [ + { + pubkey: executableBy, + isSigner: true, + isWritable: false, + }, + { + pubkey: ix.programId, + isSigner: false, + isWritable: false, + }, + ...ix.keys, + ], + programId: new PublicKey(MANGO_INSTRUCTION_FORWARDER), + data: Buffer.concat([ + new BN(executableUntilUnixTs).toArrayLike(Buffer, 'le', 8), + ix.data, + ]), + }) +} + +export const useForwarderProgramHelpers = () => { + const [form, setForm] = useState({ + useExecutableBy: false, + wallet: '', + timestamp: '', + }) + + const withForwarderWrapper = useCallback( + (ix: TransactionInstruction) => { + if (form.useExecutableBy) { + return wrapWithForwarder( + ix, + new PublicKey(form.wallet), + Number(form.timestamp) + ) + } else { + return ix + } + }, + [form] + ) + return { form, setForm, withForwarderWrapper } +} + +type ForwarderProgramForm = { + useExecutableBy: boolean + wallet: string + timestamp: string +} + +const ForwarderProgram = ({ + form, + setForm, +}: ReturnType) => { + const isInvalidPubkey = form.wallet && !tryParsePublicKey(form.wallet) + return ( +
+
+ { + setForm({ + ...form, + useExecutableBy: e.target.checked, + }) + }} + label={'Use executable by'} + /> +
+ {form.useExecutableBy && ( + <> + + setForm({ + ...form, + wallet: evt.target.value, + }) + } + error={isInvalidPubkey ? 'Invalid publickey' : ''} + /> + + setForm({ + ...form, + timestamp: evt.target.value, + }) + } + /> + + )} +
+ ) +} + +export default ForwarderProgram diff --git a/components/TreasuryAccount/MangoModal.tsx b/components/TreasuryAccount/MangoModal.tsx index 18316a40a5..cc02cd6ba9 100644 --- a/components/TreasuryAccount/MangoModal.tsx +++ b/components/TreasuryAccount/MangoModal.tsx @@ -120,7 +120,7 @@ const MangoModal = ({ account }: { account: AssetAccount }) => { const createAccInstData = { data: getInstructionDataFromBase64( - serializeInstructionToBase64(createAccIx!) + serializeInstructionToBase64(createAccIx) ), holdUpTime: account?.governance.account?.config.minInstructionHoldUpTime, diff --git a/components/instructions/TransactionInstructionCard.tsx b/components/instructions/TransactionInstructionCard.tsx index 847887d313..d0f6760504 100644 --- a/components/instructions/TransactionInstructionCard.tsx +++ b/components/instructions/TransactionInstructionCard.tsx @@ -5,6 +5,7 @@ import InstructionProgram from './InstructionProgram' import { useCallback, useEffect, useState } from 'react' import { InstructionDescriptor, + MANGO_INSTRUCTION_FORWARDER, WSOL_MINT, getInstructionDescriptor, } from './tools' @@ -30,6 +31,15 @@ const TransactionInstructionCard = ({ const connection = useLegacyConnectionContext() const realm = useRealmQuery().data?.result const { governedTokenAccountsWithoutNfts } = useGovernanceAssets() + const instructionUseInstructionForwarder = + instructionData.programId.toBase58() === MANGO_INSTRUCTION_FORWARDER + const instructionAccounts = instructionUseInstructionForwarder + ? [...instructionData.accounts.slice(2, instructionData.accounts.length)] + : instructionData.accounts + + const programId = instructionUseInstructionForwarder + ? instructionData.accounts[1].pubkey + : instructionData.programId const [descriptor, setDescriptor] = useState() const [nftImgUrl, setNftImgUrl] = useState('') @@ -106,17 +116,17 @@ const TransactionInstructionCard = ({
- {instructionData.accounts.map((am, idx) => ( + {instructionAccounts.map((am, idx) => ( ))}
diff --git a/components/instructions/programs/mangoV4.tsx b/components/instructions/programs/mangoV4.tsx index 660466ddac..717d870035 100644 --- a/components/instructions/programs/mangoV4.tsx +++ b/components/instructions/programs/mangoV4.tsx @@ -204,6 +204,7 @@ const instructions = () => ({ //accounts: AccountMetaData[] ) => { const info = await displayArgs(connection, data) + console.log(info, '@@@@') try { return
{info}
} catch (e) { @@ -1549,6 +1550,10 @@ const displayArgs = async (connection: Connection, data: Uint8Array) => { }) .map((key) => { const isPublicKey = tryParseKey(args[key]) + const isBN = args[key] instanceof BN + if (isBN) { + console.log(args[key].toNumber()) + } return (
{key}:
diff --git a/components/instructions/tools.tsx b/components/instructions/tools.tsx index 6fa7da772d..fc4839889e 100644 --- a/components/instructions/tools.tsx +++ b/components/instructions/tools.tsx @@ -35,6 +35,7 @@ import { MANGO_V4_INSTRUCTIONS } from './programs/mangoV4' import { DUAL_INSTRUCTIONS } from './programs/dual' import { SWITCHBOARD_INSTRUCTIONS } from './programs/switchboard' import { STAKE_INSTRUCTIONS } from './programs/stake' +import dayjs from 'dayjs' import { JUPITER_REF } from './programs/jupiterRef' /** @@ -45,6 +46,8 @@ export const DEFAULT_GOVERNANCE_PROGRAM_ID = export const DEFAULT_GOVERNANCE_PROGRAM_VERSION = 3 export const MANGO_DAO_TREASURY = '9RGoboEjmaAjSCXsKi6p6zJucnwF3Eg5NUN9jPS6ziL3' +export const MANGO_INSTRUCTION_FORWARDER = + 'ixFPGCPYEp5GzhoahhHFVL8VVzkq1kc2eeFZh3qpYca' // Well known account names displayed on the instruction card export const ACCOUNT_NAMES = { @@ -459,38 +462,97 @@ export async function getInstructionDescriptor( realm?: ProgramAccount | undefined ) { let descriptors: any + let instructionToDecode = { ...instruction } + const isUsingForwardProgram = + instructionToDecode.programId.toBase58() === MANGO_INSTRUCTION_FORWARDER if ( - (realm && instruction.programId.equals(realm.owner)) || - instruction.programId.equals(new PublicKey(DEFAULT_GOVERNANCE_PROGRAM_ID)) + (realm && instructionToDecode.programId.equals(realm.owner)) || + instructionToDecode.programId.equals( + new PublicKey(DEFAULT_GOVERNANCE_PROGRAM_ID) + ) ) { descriptors = GOVERNANCE_INSTRUCTIONS['GovER5Lthms3bLBqWub97yVrMmEogzX7xNjdXpPPCVZw'] + } else if (isUsingForwardProgram) { + instructionToDecode = { + accounts: instructionToDecode.accounts.slice( + 1, + instructionToDecode.accounts.length + ), + data: instructionToDecode.data.slice(8, instructionToDecode.data.length), + programId: instructionToDecode.accounts[1].pubkey, + } + descriptors = + INSTRUCTION_DESCRIPTORS[instructionToDecode.programId.toBase58()] } else { - descriptors = INSTRUCTION_DESCRIPTORS[instruction.programId.toBase58()] + descriptors = + INSTRUCTION_DESCRIPTORS[instructionToDecode.programId.toBase58()] } // Make it work for program with one instruction like ATA program // and for the one with multiple instructions - const descriptor = !instruction.data.length + const descriptor = !instructionToDecode.data.length ? descriptors - : descriptors && descriptors[instruction.data[0]] - ? descriptors[instruction.data[0]] + : descriptors && descriptors[instructionToDecode.data[0]] + ? descriptors[instructionToDecode.data[0]] : //backup if first number is same for couple of instructions inside same idl - descriptors && descriptors[`${instruction.data[0]}${instruction.data[1]}`] - ? descriptors[`${instruction.data[0]}${instruction.data[1]}`] + descriptors && + descriptors[ + `${instructionToDecode.data[0]}${instructionToDecode.data[1]}` + ] + ? descriptors[ + `${instructionToDecode.data[0]}${instructionToDecode.data[1]}` + ] : descriptors const dataUI = (descriptor?.getDataUI && (await descriptor?.getDataUI( connection.current, - instruction.data, - instruction.accounts, - instruction.programId, + instructionToDecode.data, + instructionToDecode.accounts, + instructionToDecode.programId, connection.cluster - ))) ?? <>{JSON.stringify(instruction.data)} + ))) ?? <>{JSON.stringify(instructionToDecode.data)} + + const dataUiWithAdditionalInfo = ( + <> + {isUsingForwardProgram && ( + + )} + {dataUI} + + ) return { name: descriptor?.name, accounts: descriptor?.accounts, - dataUI, + dataUI: dataUiWithAdditionalInfo, } } + +const ForwarderProgramDecode = ({ + instruction, +}: { + instruction: InstructionData +}) => { + const timestampBytes = instruction.data.slice(0, 8) + const view = new DataView(Buffer.from(timestampBytes).buffer) + const timestamp = view.getUint32(0, true) // true for little-endian + + const date = dayjs(timestamp * 1000) // Convert to milliseconds + + return ( +
+
+ Instruction use forwarder program: {MANGO_INSTRUCTION_FORWARDER} +
+
+ Only wallet: {instruction.accounts[0].pubkey.toBase58()} can execute +
+
+ Proposal is executable only until: {date.format('DD-MM-YYYY HH:mm')} +
+
+ ) +} diff --git a/pages/dao/[symbol]/proposal/[pk]/ProposalWarnings.tsx b/pages/dao/[symbol]/proposal/[pk]/ProposalWarnings.tsx index cdd5ded8be..5699182923 100644 --- a/pages/dao/[symbol]/proposal/[pk]/ProposalWarnings.tsx +++ b/pages/dao/[symbol]/proposal/[pk]/ProposalWarnings.tsx @@ -1,3 +1,4 @@ +import { MANGO_INSTRUCTION_FORWARDER } from '@components/instructions/tools' import { ExclamationCircleIcon } from '@heroicons/react/solid' import { useGovernanceByPubkeyQuery } from '@hooks/queries/governance' import { useSelectedProposalTransactions } from '@hooks/queries/proposalTransaction' @@ -129,6 +130,32 @@ const ProgramUpgrade = () => (
) +const ForwardWarning = () => ( +
+
+
+
+
+

+ Instruction use instruction forward program:{' '} + {MANGO_INSTRUCTION_FORWARDER} +

+
+

+ This means one of instruction is executable only by given wallet + until time set in proposal, check time and wallet in instruction + panel +

+
+
+
+
+) + const useProposalSafetyCheck = (proposal: Proposal) => { const config = useRealmConfigQuery().data?.result const { realmInfo } = useRealm() @@ -136,6 +163,12 @@ const useProposalSafetyCheck = (proposal: Proposal) => { const governance = useGovernanceByPubkeyQuery(proposal?.governance).data ?.result + const isUsingForwardProgram = transactions + ?.flatMap((tx) => + tx.account.instructions.flatMap((ins) => ins.programId.toBase58()) + ) + .filter((x) => x === MANGO_INSTRUCTION_FORWARDER).length + const treasuryAddress = useAsync( async () => governance !== undefined @@ -169,6 +202,7 @@ const useProposalSafetyCheck = (proposal: Proposal) => { | 'thirdPartyInstructionWritesConfig' | 'possibleWrongGovernance' | 'programUpgrade' + | 'usingMangoInstructionForwarder' | undefined )[] = [] @@ -194,6 +228,9 @@ const useProposalSafetyCheck = (proposal: Proposal) => { return 'thirdPartyInstructionWritesConfig' } } + if (isUsingForwardProgram) { + return 'usingMangoInstructionForwarder' + } }) ) @@ -229,6 +266,9 @@ const ProposalWarnings = ({ proposal }: { proposal: Proposal }) => { {warnings?.includes('programUpgrade') && ( )} + {warnings?.includes('usingMangoInstructionForwarder') && ( + + )} ) } diff --git a/pages/dao/[symbol]/proposal/components/instructions/Mango/MangoV4/EditToken.tsx b/pages/dao/[symbol]/proposal/components/instructions/Mango/MangoV4/EditToken.tsx index ffa56775af..a263cb65ec 100644 --- a/pages/dao/[symbol]/proposal/components/instructions/Mango/MangoV4/EditToken.tsx +++ b/pages/dao/[symbol]/proposal/components/instructions/Mango/MangoV4/EditToken.tsx @@ -18,6 +18,9 @@ import { BN } from '@coral-xyz/anchor' import AdvancedOptionsDropdown from '@components/NewRealmWizard/components/AdvancedOptionsDropdown' import Switch from '@components/Switch' import useWalletOnePointOh from '@hooks/useWalletOnePointOh' +import ForwarderProgram, { + useForwarderProgramHelpers, +} from '@components/ForwarderProgram/ForwarderProgram' const REDUCE_ONLY_OPTIONS = [ { value: 0, name: 'Disabled' }, @@ -158,6 +161,7 @@ const EditToken = ({ const { getAdditionalLabelInfo, mangoClient, mangoGroup } = UseMangoV4() const { assetAccounts } = useGovernanceAssets() const [forcedValues, setForcedValues] = useState([]) + const forwarderProgramHelpers = useForwarderProgramHelpers() const solAccounts = assetAccounts.filter( (x) => x.type === AccountType.SOL && @@ -307,7 +311,9 @@ const EditToken = ({ ]) .instruction() - serializedInstruction = serializeInstructionToBase64(ix) + serializedInstruction = serializeInstructionToBase64( + forwarderProgramHelpers.withForwarderWrapper(ix) + ) } const obj: UiInstruction = { serializedInstruction: serializedInstruction, @@ -325,7 +331,12 @@ const EditToken = ({ index ) // eslint-disable-next-line react-hooks/exhaustive-deps -- TODO please fix, it can cause difficult bugs. You might wanna check out https://bobbyhadz.com/blog/react-hooks-exhaustive-deps for info. -@asktree - }, [form, forcedValues]) + }, [ + form, + forcedValues, + forwarderProgramHelpers.form, + forwarderProgramHelpers.withForwarderWrapper, + ]) useEffect(() => { const getTokens = async () => { @@ -716,6 +727,7 @@ const EditToken = ({ setFormErrors={setFormErrors} formErrors={formErrors} > +

Force values

diff --git a/pages/dao/[symbol]/proposal/components/instructions/Mango/MangoV4/OpenBookEditMarket.tsx b/pages/dao/[symbol]/proposal/components/instructions/Mango/MangoV4/OpenBookEditMarket.tsx index 3280e774c0..f85ef23d94 100644 --- a/pages/dao/[symbol]/proposal/components/instructions/Mango/MangoV4/OpenBookEditMarket.tsx +++ b/pages/dao/[symbol]/proposal/components/instructions/Mango/MangoV4/OpenBookEditMarket.tsx @@ -14,6 +14,9 @@ import { InstructionInputType } from '../../inputInstructionType' import UseMangoV4 from '../../../../../../../../hooks/useMangoV4' import { MarketIndex } from '@blockworks-foundation/mango-v4/dist/types/src/accounts/serum3' import useWalletOnePointOh from '@hooks/useWalletOnePointOh' +import ForwarderProgram, { + useForwarderProgramHelpers, +} from '@components/ForwarderProgram/ForwarderProgram' type NameMarketIndexVal = { name: string @@ -39,6 +42,7 @@ const OpenBookEditMarket = ({ const wallet = useWalletOnePointOh() const { mangoClient, mangoGroup } = UseMangoV4() const { assetAccounts } = useGovernanceAssets() + const forwarderProgramHelpers = useForwarderProgramHelpers() const solAccounts = assetAccounts.filter( (x) => x.type === AccountType.SOL && @@ -84,7 +88,9 @@ const OpenBookEditMarket = ({ }) .instruction() - serializedInstruction = serializeInstructionToBase64(ix) + serializedInstruction = serializeInstructionToBase64( + forwarderProgramHelpers.withForwarderWrapper(ix) + ) } const obj: UiInstruction = { serializedInstruction: serializedInstruction, @@ -102,7 +108,11 @@ const OpenBookEditMarket = ({ index ) // eslint-disable-next-line react-hooks/exhaustive-deps -- TODO please fix, it can cause difficult bugs. You might wanna check out https://bobbyhadz.com/blog/react-hooks-exhaustive-deps for info. -@asktree - }, [form]) + }, [ + form, + forwarderProgramHelpers.form, + forwarderProgramHelpers.withForwarderWrapper, + ]) useEffect(() => { const getMarkets = async () => { const markets = [...mangoGroup!.serum3MarketsMapByExternal.values()].map( @@ -197,6 +207,7 @@ const OpenBookEditMarket = ({ formErrors={formErrors} > )} + ) } diff --git a/pages/dao/[symbol]/proposal/components/instructions/Mango/MangoV4/OpenBookRegisterMarket.tsx b/pages/dao/[symbol]/proposal/components/instructions/Mango/MangoV4/OpenBookRegisterMarket.tsx index 700dcabf51..7d08cb3f87 100644 --- a/pages/dao/[symbol]/proposal/components/instructions/Mango/MangoV4/OpenBookRegisterMarket.tsx +++ b/pages/dao/[symbol]/proposal/components/instructions/Mango/MangoV4/OpenBookRegisterMarket.tsx @@ -16,6 +16,9 @@ import UseMangoV4 from '../../../../../../../../hooks/useMangoV4' import { OPENBOOK_PROGRAM_ID } from '@blockworks-foundation/mango-v4' import useWalletOnePointOh from '@hooks/useWalletOnePointOh' import useLegacyConnectionContext from '@hooks/useLegacyConnectionContext' +import ForwarderProgram, { + useForwarderProgramHelpers, +} from '@components/ForwarderProgram/ForwarderProgram' interface OpenBookRegisterMarketForm { governedAccount: AssetAccount | null @@ -38,6 +41,7 @@ const OpenBookRegisterMarket = ({ const wallet = useWalletOnePointOh() const { mangoClient, mangoGroup } = UseMangoV4() const { assetAccounts } = useGovernanceAssets() + const forwarderProgramHelpers = useForwarderProgramHelpers() const solAccounts = assetAccounts.filter( (x) => x.type === AccountType.SOL && @@ -87,7 +91,9 @@ const OpenBookRegisterMarket = ({ }) .instruction() - serializedInstruction = serializeInstructionToBase64(ix) + serializedInstruction = serializeInstructionToBase64( + forwarderProgramHelpers.withForwarderWrapper(ix) + ) } const obj: UiInstruction = { serializedInstruction: serializedInstruction, @@ -104,7 +110,11 @@ const OpenBookRegisterMarket = ({ index ) // eslint-disable-next-line react-hooks/exhaustive-deps -- TODO please fix, it can cause difficult bugs. You might wanna check out https://bobbyhadz.com/blog/react-hooks-exhaustive-deps for info. -@asktree - }, [form]) + }, [ + form, + forwarderProgramHelpers.form, + forwarderProgramHelpers.withForwarderWrapper, + ]) const schema = yup.object().shape({ governedAccount: yup @@ -217,6 +227,7 @@ const OpenBookRegisterMarket = ({ formErrors={formErrors} > )} + ) } diff --git a/pages/dao/[symbol]/proposal/components/instructions/Mango/MangoV4/PerpCreate.tsx b/pages/dao/[symbol]/proposal/components/instructions/Mango/MangoV4/PerpCreate.tsx index f49d366231..796ad5e9c7 100644 --- a/pages/dao/[symbol]/proposal/components/instructions/Mango/MangoV4/PerpCreate.tsx +++ b/pages/dao/[symbol]/proposal/components/instructions/Mango/MangoV4/PerpCreate.tsx @@ -21,6 +21,9 @@ import UseMangoV4 from '@hooks/useMangoV4' import { BN } from '@coral-xyz/anchor' import useWalletOnePointOh from '@hooks/useWalletOnePointOh' import useLegacyConnectionContext from '@hooks/useLegacyConnectionContext' +import ForwarderProgram, { + useForwarderProgramHelpers, +} from '@components/ForwarderProgram/ForwarderProgram' interface PerpCreateForm { governedAccount: AssetAccount | null @@ -109,6 +112,7 @@ const PerpCreate = ({ }) const [formErrors, setFormErrors] = useState({}) const { handleSetInstructions } = useContext(NewProposalContext) + const forwarderProgramHelpers = useForwarderProgramHelpers() const validateInstruction = async (): Promise => { const { isValid, validationErrors } = await isFormValid(schema, form) @@ -213,7 +217,9 @@ const PerpCreate = ({ .signers([bids, asks, eventQueue]) .instruction() - serializedInstruction = serializeInstructionToBase64(ix) + serializedInstruction = serializeInstructionToBase64( + forwarderProgramHelpers.withForwarderWrapper(ix) + ) } const obj: UiInstruction = { prerequisiteInstructions: prerequisiteInstructions, @@ -233,7 +239,11 @@ const PerpCreate = ({ index ) // eslint-disable-next-line react-hooks/exhaustive-deps -- TODO please fix, it can cause difficult bugs. You might wanna check out https://bobbyhadz.com/blog/react-hooks-exhaustive-deps for info. -@asktree - }, [form]) + }, [ + form, + forwarderProgramHelpers.form, + forwarderProgramHelpers.withForwarderWrapper, + ]) const schema = yup.object().shape({ governedAccount: yup .object() @@ -515,6 +525,7 @@ const PerpCreate = ({ formErrors={formErrors} > )} + ) } diff --git a/pages/dao/[symbol]/proposal/components/instructions/Mango/MangoV4/PerpEdit.tsx b/pages/dao/[symbol]/proposal/components/instructions/Mango/MangoV4/PerpEdit.tsx index 1c1ce6ff58..dbab5d8230 100644 --- a/pages/dao/[symbol]/proposal/components/instructions/Mango/MangoV4/PerpEdit.tsx +++ b/pages/dao/[symbol]/proposal/components/instructions/Mango/MangoV4/PerpEdit.tsx @@ -19,6 +19,9 @@ import { BN } from '@coral-xyz/anchor' import AdvancedOptionsDropdown from '@components/NewRealmWizard/components/AdvancedOptionsDropdown' import Switch from '@components/Switch' import useWalletOnePointOh from '@hooks/useWalletOnePointOh' +import ForwarderProgram, { + useForwarderProgramHelpers, +} from '@components/ForwarderProgram/ForwarderProgram' const keyToLabel = { oraclePk: 'Oracle', @@ -145,6 +148,7 @@ const PerpEdit = ({ const { assetAccounts } = useGovernanceAssets() const [perps, setPerps] = useState([]) const [forcedValues, setForcedValues] = useState([]) + const forwarderProgramHelpers = useForwarderProgramHelpers() const solAccounts = assetAccounts.filter( (x) => x.type === AccountType.SOL && @@ -247,7 +251,9 @@ const PerpEdit = ({ }) .instruction() - serializedInstruction = serializeInstructionToBase64(ix) + serializedInstruction = serializeInstructionToBase64( + forwarderProgramHelpers.withForwarderWrapper(ix) + ) } const obj: UiInstruction = { serializedInstruction: serializedInstruction, @@ -265,7 +271,12 @@ const PerpEdit = ({ index ) // eslint-disable-next-line react-hooks/exhaustive-deps -- TODO please fix, it can cause difficult bugs. You might wanna check out https://bobbyhadz.com/blog/react-hooks-exhaustive-deps for info. -@asktree - }, [form, forcedValues]) + }, [ + form, + forcedValues, + forwarderProgramHelpers.form, + forwarderProgramHelpers.withForwarderWrapper, + ]) const schema = yup.object().shape({ governedAccount: yup .object() @@ -646,6 +657,7 @@ const PerpEdit = ({ ))}
+ )} diff --git a/pages/dao/[symbol]/proposal/components/instructions/Mango/MangoV4/TokenRegister.tsx b/pages/dao/[symbol]/proposal/components/instructions/Mango/MangoV4/TokenRegister.tsx index affbd62584..7e7a1bccd7 100644 --- a/pages/dao/[symbol]/proposal/components/instructions/Mango/MangoV4/TokenRegister.tsx +++ b/pages/dao/[symbol]/proposal/components/instructions/Mango/MangoV4/TokenRegister.tsx @@ -19,6 +19,9 @@ import useWalletOnePointOh from '@hooks/useWalletOnePointOh' import { ReferralProvider } from '@jup-ag/referral-sdk' import { JUPITER_REFERRAL_PK } from '@tools/constants' import useLegacyConnectionContext from '@hooks/useLegacyConnectionContext' +import ForwarderProgram, { + useForwarderProgramHelpers, +} from '@components/ForwarderProgram/ForwarderProgram' const REDUCE_ONLY_OPTIONS = [ { value: 0, name: 'Disabled' }, @@ -72,6 +75,7 @@ const TokenRegister = ({ const { mangoClient, mangoGroup, getAdditionalLabelInfo } = UseMangoV4() const { assetAccounts } = useGovernanceAssets() const connection = useLegacyConnectionContext() + const forwarderProgramHelpers = useForwarderProgramHelpers() const solAccounts = assetAccounts.filter( (x) => @@ -193,11 +197,17 @@ const TokenRegister = ({ if (!isExistingAccount) { additionalSerializedInstructions.push( - ...tx.tx.instructions.map((x) => serializeInstructionToBase64(x)) + ...tx.tx.instructions.map((x) => + serializeInstructionToBase64( + forwarderProgramHelpers.withForwarderWrapper(x) + ) + ) ) } - serializedInstruction = serializeInstructionToBase64(ix) + serializedInstruction = serializeInstructionToBase64( + forwarderProgramHelpers.withForwarderWrapper(ix) + ) } const obj: UiInstruction = { serializedInstruction: serializedInstruction, @@ -215,7 +225,11 @@ const TokenRegister = ({ index ) // eslint-disable-next-line react-hooks/exhaustive-deps -- TODO please fix, it can cause difficult bugs. You might wanna check out https://bobbyhadz.com/blog/react-hooks-exhaustive-deps for info. -@asktree - }, [form]) + }, [ + form, + forwarderProgramHelpers.form, + forwarderProgramHelpers.withForwarderWrapper, + ]) const schema = yup.object().shape({ governedAccount: yup .object() @@ -518,6 +532,7 @@ const TokenRegister = ({ formErrors={formErrors} > )} + ) } diff --git a/pages/dao/[symbol]/proposal/components/instructions/Mango/MangoV4/TokenRegisterTrustless.tsx b/pages/dao/[symbol]/proposal/components/instructions/Mango/MangoV4/TokenRegisterTrustless.tsx index b8ea0de3ea..6814f32de1 100644 --- a/pages/dao/[symbol]/proposal/components/instructions/Mango/MangoV4/TokenRegisterTrustless.tsx +++ b/pages/dao/[symbol]/proposal/components/instructions/Mango/MangoV4/TokenRegisterTrustless.tsx @@ -17,6 +17,9 @@ import useWalletOnePointOh from '@hooks/useWalletOnePointOh' import { ReferralProvider } from '@jup-ag/referral-sdk' import useLegacyConnectionContext from '@hooks/useLegacyConnectionContext' import { JUPITER_REFERRAL_PK } from '@tools/constants' +import ForwarderProgram, { + useForwarderProgramHelpers, +} from '@components/ForwarderProgram/ForwarderProgram' interface TokenRegisterTrustlessForm { governedAccount: AssetAccount | null @@ -45,6 +48,7 @@ const TokenRegisterTrustless = ({ (mangoGroup?.admin && x.extensions.transferAddress?.equals(mangoGroup?.admin))) ) + const forwarderProgramHelpers = useForwarderProgramHelpers() const connection = useLegacyConnectionContext() const shouldBeGoverned = !!(index !== 0 && governance) const [form, setForm] = useState({ @@ -97,11 +101,17 @@ const TokenRegisterTrustless = ({ if (!isExistingAccount) { additionalSerializedInstructions.push( - ...tx.tx.instructions.map((x) => serializeInstructionToBase64(x)) + ...tx.tx.instructions.map((x) => + serializeInstructionToBase64( + forwarderProgramHelpers.withForwarderWrapper(x) + ) + ) ) } - serializedInstruction = serializeInstructionToBase64(ix) + serializedInstruction = serializeInstructionToBase64( + forwarderProgramHelpers.withForwarderWrapper(ix) + ) } const obj: UiInstruction = { serializedInstruction: serializedInstruction, @@ -119,7 +129,11 @@ const TokenRegisterTrustless = ({ index ) // eslint-disable-next-line react-hooks/exhaustive-deps -- TODO please fix, it can cause difficult bugs. You might wanna check out https://bobbyhadz.com/blog/react-hooks-exhaustive-deps for info. -@asktree - }, [form]) + }, [ + form, + forwarderProgramHelpers.form, + forwarderProgramHelpers.withForwarderWrapper, + ]) const schema = yup.object().shape({ governedAccount: yup .object() @@ -207,6 +221,7 @@ const TokenRegisterTrustless = ({ formErrors={formErrors} > )} + ) } From aab486834db422160642f32ffa90bd18daff5c73 Mon Sep 17 00:00:00 2001 From: guibescos <59208140+guibescos@users.noreply.github.com> Date: Thu, 30 Nov 2023 22:46:45 +0000 Subject: [PATCH 24/43] Bring back PYTH DAO (#1918) Co-authored-by: Daniel Chew Co-authored-by: 0xfirefist Co-authored-by: agrippa kellum --- actions/createProposal.ts | 13 ++-- components/TokenBalance/TokenDeposit.tsx | 25 ++++---- constants/flags.ts | 1 + constants/plugins.ts | 6 ++ hooks/queries/governancePower.ts | 31 ++++++++- hooks/useVotingPlugins.ts | 34 ++++++++++ package.json | 1 + public/realms/devnet.json | 1 - stores/useVotePluginsClientStore.tsx | 15 +++++ utils/uiTypes/VotePlugin.ts | 59 ++++++++++++++++- yarn.lock | 80 +++++++++++++++++------- 11 files changed, 219 insertions(+), 47 deletions(-) diff --git a/actions/createProposal.ts b/actions/createProposal.ts index 8b418e77f5..c073c016ad 100644 --- a/actions/createProposal.ts +++ b/actions/createProposal.ts @@ -96,11 +96,11 @@ export const createProposal = async ( const voteType = isMulti ? VoteType.MULTI_CHOICE( - MultiChoiceType.FullWeight, - 1, - options.length, - options.length - ) + MultiChoiceType.FullWeight, + 1, + options.length, + options.length + ) : VoteType.SINGLE_CHOICE //will run only if plugin is connected with realm @@ -108,7 +108,8 @@ export const createProposal = async ( instructions, tokenOwnerRecord.pubkey, 'createProposal', - createNftTicketsIxs + createNftTicketsIxs, + governance ) const proposalAddress = await withCreateProposal( diff --git a/components/TokenBalance/TokenDeposit.tsx b/components/TokenBalance/TokenDeposit.tsx index 9f8e5baefd..ac8cc76d0e 100644 --- a/components/TokenBalance/TokenDeposit.tsx +++ b/components/TokenBalance/TokenDeposit.tsx @@ -42,6 +42,7 @@ import queryClient from '@hooks/queries/queryClient' import { proposalQueryKeys } from '@hooks/queries/proposal' import asFindable from '@utils/queries/asFindable' import VanillaVotingPower from '@components/GovernancePower/Vanilla/VanillaVotingPower' +import { fetchTokenAccountByPubkey } from '@hooks/queries/tokenAccount' import { DepositTokensButton } from '@components/DepositTokensButton' export const TokenDeposit = ({ @@ -192,20 +193,22 @@ export const TokenDeposit = ({ ) } } - let ata: PublicKey | null = null - if (!depositTokenAccount) { - ata = await Token.getAssociatedTokenAddress( - ASSOCIATED_TOKEN_PROGRAM_ID, - TOKEN_PROGRAM_ID, - depositMint!, - wallet!.publicKey!, - true - ) + + const ataPk = await Token.getAssociatedTokenAddress( + ASSOCIATED_TOKEN_PROGRAM_ID, + TOKEN_PROGRAM_ID, + depositMint!, + wallet!.publicKey!, + true + ) + const ata = await fetchTokenAccountByPubkey(connection, ataPk) + + if (!ata.found) { const ataIx = Token.createAssociatedTokenAccountInstruction( ASSOCIATED_TOKEN_PROGRAM_ID, TOKEN_PROGRAM_ID, depositMint!, - ata, + ataPk, wallet!.publicKey!, wallet!.publicKey! // fee payer ) @@ -219,7 +222,7 @@ export const TokenDeposit = ({ realm!.pubkey, depositTokenAccount?.publicKey ? depositTokenAccount!.publicKey - : new PublicKey(ata!), + : new PublicKey(ataPk), depositTokenRecord!.account.governingTokenMint, wallet!.publicKey! ) diff --git a/constants/flags.ts b/constants/flags.ts index a928eb4260..98cdf74eb2 100644 --- a/constants/flags.ts +++ b/constants/flags.ts @@ -13,5 +13,6 @@ export const DELEGATOR_BATCH_VOTE_SUPPORT_BY_PLUGIN: Record< HeliumVSR: false, gateway: false, NFT: false, + pyth: false, unknown: false, } diff --git a/constants/plugins.ts b/constants/plugins.ts index daee165085..aa1ae4ab6c 100644 --- a/constants/plugins.ts +++ b/constants/plugins.ts @@ -26,6 +26,10 @@ export const GATEWAY_PLUGINS_PKS: string[] = [ 'GgathUhdrCWRHowoRKACjgWhYHfxCEdBi5ViqYN6HVxk', // v2, supporting composition ] +export const PYTH_PLUGIN_PK: string[] = [ + 'pytS9TjG1qyAZypk7n8rw8gfW9sUaqqYyMhJQ4E7JCQ', +] + export const findPluginName = (programId: PublicKey | undefined) => programId === undefined ? ('vanilla' as const) @@ -37,4 +41,6 @@ export const findPluginName = (programId: PublicKey | undefined) => ? 'NFT' : GATEWAY_PLUGINS_PKS.includes(programId.toString()) ? 'gateway' + : PYTH_PLUGIN_PK.includes(programId.toString()) + ? 'pyth' : 'unknown' diff --git a/hooks/queries/governancePower.ts b/hooks/queries/governancePower.ts index f6c6a340a3..c24b893d43 100644 --- a/hooks/queries/governancePower.ts +++ b/hooks/queries/governancePower.ts @@ -1,4 +1,4 @@ -import { Connection, PublicKey } from '@solana/web3.js' +import { Connection, Keypair, PublicKey } from '@solana/web3.js' import { fetchTokenOwnerRecordByPubkey, useTokenOwnerRecordByPubkeyQuery, @@ -16,6 +16,7 @@ import { GATEWAY_PLUGINS_PKS, HELIUM_VSR_PLUGINS_PKS, NFT_PLUGINS_PKS, + PYTH_PLUGIN_PK, VSR_PLUGIN_PKS, } from '@constants/plugins' import useHeliumVsrStore from 'HeliumVotePlugin/hooks/useHeliumVsrStore' @@ -35,6 +36,8 @@ import { } from '@models/voteWeights' import useUserOrDelegator from '@hooks/useUserOrDelegator' import { getVsrGovpower } from './plugins/vsr' +import { PythClient } from '@pythnetwork/staking' +import NodeWallet from '@coral-xyz/anchor/dist/cjs/nodewallet' export const getVanillaGovpower = async ( connection: Connection, @@ -102,6 +105,20 @@ export const getNftGovpower = async ( return power } +export const getPythGovPower = async (connection: Connection, user : PublicKey | undefined) : Promise => { + if (!user) return new BN(0) + + const pythClient = await PythClient.connect(connection, new NodeWallet(new Keypair())) + const stakeAccount = await pythClient.getMainAccount(user) + + if (stakeAccount){ + return stakeAccount.getVoterWeight(await pythClient.getTime()).toBN() + } + else { + return new BN(0) + } +} + export const findPluginName = (programId: PublicKey | undefined) => programId === undefined ? ('vanilla' as const) @@ -112,7 +129,9 @@ export const findPluginName = (programId: PublicKey | undefined) => : NFT_PLUGINS_PKS.includes(programId.toString()) ? 'NFT' : GATEWAY_PLUGINS_PKS.includes(programId.toString()) - ? 'gateway' + ? 'gateway' + : PYTH_PLUGIN_PK.includes(programId.toString()) + ? 'pyth' : 'unknown' export const determineVotingPowerType = async ( @@ -172,6 +191,8 @@ export const useGovernancePowerAsync = ( ? heliumVotingPower : plugin === 'gateway' ? gatewayVotingPower + : plugin === 'pyth' + ? getPythGovPower(connection, actingAsWalletPk) : new BN(0)), [ plugin, @@ -220,6 +241,12 @@ export const useLegacyVoterWeight = () => { ? undefined : plugin === 'vanilla' ? new VoterWeight(communityTOR.result, councilTOR?.result) + : plugin === 'pyth' + ? new VoteRegistryVoterWeight( + communityTOR.result, + councilTOR?.result, + await getPythGovPower(connection, actingAsWalletPk) + ) : plugin === 'NFT' ? communityTOR.result?.pubkey ? new VoteNftWeight( diff --git a/hooks/useVotingPlugins.ts b/hooks/useVotingPlugins.ts index 9cafeae390..f67faa9acf 100644 --- a/hooks/useVotingPlugins.ts +++ b/hooks/useVotingPlugins.ts @@ -19,6 +19,7 @@ import { HELIUM_VSR_PLUGINS_PKS, VSR_PLUGIN_PKS, GATEWAY_PLUGINS_PKS, + PYTH_PLUGIN_PK, } from '../constants/plugins' import useUserOrDelegator from './useUserOrDelegator' import { getNetworkFromEndpoint } from '@utils/connection' @@ -41,6 +42,7 @@ export function useVotingPlugins() { handleSetNftRegistrar, handleSetGatewayRegistrar, handleSetCurrentRealmVotingClient, + handleSetPythClient, } = useVotePluginsClientStore() const [ @@ -67,6 +69,7 @@ export function useVotingPlugins() { nftClient, nftMintRegistrar, heliumVsrClient, + pythClient, ] = useVotePluginsClientStore((s) => [ s.state.currentRealmVotingClient, s.state.vsrClient, @@ -74,6 +77,7 @@ export function useVotingPlugins() { s.state.nftClient, s.state.nftMintRegistrar, s.state.heliumVsrClient, + s.state.pythClient, s.state.heliumVsrRegistrar, ]) @@ -128,6 +132,18 @@ export function useVotingPlugins() { [usedCollectionsPks] ) + // initialise pyth plugin + useEffect(() => { + if ( + wallet && + connection && + currentPluginPk && + PYTH_PLUGIN_PK.includes(currentPluginPk.toBase58()) + ) { + handleSetPythClient(wallet, connection) + } + }, [connection, currentPluginPk, handleSetPythClient, wallet]) + useEffect(() => { if (wallet && connection) { if (currentPluginPk) { @@ -203,6 +219,22 @@ export function useVotingPlugins() { } } + const handlePythPlugin = () => { + if ( + pythClient && + currentPluginPk && + PYTH_PLUGIN_PK.includes(currentPluginPk.toBase58()) + ) { + if (voterPk) { + handleSetCurrentRealmVotingClient({ + client: pythClient, + realm, + walletPk: voterPk, + }) + } + } + } + // If the current realm uses Civic Pass // register the gatekeeper network (the "type" of Civic) // in the Civic GatewayProvider. @@ -239,6 +271,7 @@ export function useVotingPlugins() { handleGatewayPlugin() handleVsrPlugin() handleHeliumVsrPlugin() + handlePythPlugin() } }, [ currentClient, @@ -255,6 +288,7 @@ export function useVotingPlugins() { voterPk, realm, vsrClient, + pythClient, ]) const handleMaxVoterWeight = useCallback(async () => { diff --git a/package.json b/package.json index 7fa033a74e..2a714eed55 100644 --- a/package.json +++ b/package.json @@ -69,6 +69,7 @@ "@project-serum/serum": "0.13.65", "@project-serum/sol-wallet-adapter": "0.2.6", "@pythnetwork/client": "2.17.0", + "@pythnetwork/staking": "^2.0.0", "@radix-ui/react-accordion": "1.0.0", "@radix-ui/react-aspect-ratio": "1.0.0", "@radix-ui/react-dialog": "1.0.0", diff --git a/public/realms/devnet.json b/public/realms/devnet.json index e4312f6d0f..cf00d616e5 100644 --- a/public/realms/devnet.json +++ b/public/realms/devnet.json @@ -1,5 +1,4 @@ [ - { "symbol": "UNQ", "displayName": "UNQ Universe", diff --git a/stores/useVotePluginsClientStore.tsx b/stores/useVotePluginsClientStore.tsx index 732881f87f..d22261a98d 100644 --- a/stores/useVotePluginsClientStore.tsx +++ b/stores/useVotePluginsClientStore.tsx @@ -19,6 +19,7 @@ import { HeliumVsrClient } from 'HeliumVotePlugin/sdk/client' import { Registrar as HeliumVsrRegistrar } from 'HeliumVotePlugin/sdk/types' import * as heliumVsrSdk from '@helium/voter-stake-registry-sdk' import { NftVoterClient } from '@utils/uiTypes/NftVoterClient' +import { StakeConnection as PythClient } from '@pythnetwork/staking' interface UseVotePluginsClientStore extends State { state: { @@ -27,6 +28,7 @@ interface UseVotePluginsClientStore extends State { heliumVsrClient: HeliumVsrClient | undefined nftClient: NftVoterClient | undefined gatewayClient: GatewayClient | undefined + pythClient: PythClient | undefined nftMintRegistrar: any gatewayRegistrar: any currentRealmVotingClient: VotingClient @@ -74,6 +76,10 @@ interface UseVotePluginsClientStore extends State { realm, walletPk, }: VotingClientProps) => void + handleSetPythClient: ( + wallet: SignerWalletAdapter | undefined, + connection: ConnectionContext + ) => void } const defaultState = { @@ -81,6 +87,7 @@ const defaultState = { heliumVsrClient: undefined, nftClient: undefined, gatewayClient: undefined, + pythClient: undefined, voteStakeRegistryRegistrar: null, heliumVsrRegistrar: null, voteStakeRegistryRegistrarPk: null, @@ -233,6 +240,14 @@ const useVotePluginsClientStore = create( s.state.gatewayClient = gatewayClient }) }, + handleSetPythClient: async (wallet, connection) => { + if (wallet) { + const pythClient = await PythClient.connect(connection.current, wallet as unknown as Wallet) + set((s) => { + s.state.pythClient = pythClient + }) + } + }, }) ) diff --git a/utils/uiTypes/VotePlugin.ts b/utils/uiTypes/VotePlugin.ts index 9bab49d3ec..deb575e4df 100644 --- a/utils/uiTypes/VotePlugin.ts +++ b/utils/uiTypes/VotePlugin.ts @@ -53,6 +53,7 @@ import { NftVoter } from 'idls/nft_voter' import { NftVoterV2 } from 'idls/nft_voter_v2' import { Program } from '@project-serum/anchor' import { fetchTokenOwnerRecordByPubkey } from '@hooks/queries/tokenOwnerRecord' +import { StakeConnection as PythClient } from '@pythnetwork/staking' export type UpdateVoterWeightRecordTypes = | 'castVote' @@ -77,6 +78,7 @@ export enum VotingClientType { HeliumVsrClient, NftVoterClient, GatewayClient, + PythClient, } export class AccountData { @@ -104,6 +106,7 @@ export type Client = | HeliumVsrClient | NftVoterClient | GatewayClient + | PythClient //Abstract for common functions that plugins will implement export class VotingClient { @@ -148,12 +151,17 @@ export class VotingClient { this.clientType = VotingClientType.GatewayClient this.noClient = false } + if (this.client instanceof PythClient) { + this.clientType = VotingClientType.PythClient + this.noClient = false + } } withUpdateVoterWeightRecord = async ( instructions: TransactionInstruction[], tokenOwnerRecord: PublicKey, type: UpdateVoterWeightRecordTypes, - createNftActionTicketIxs?: TransactionInstruction[] + createNftActionTicketIxs?: TransactionInstruction[], + pythVoterWeightTarget?: PublicKey ): Promise => { if (this.noClient) return @@ -207,7 +215,11 @@ export class VotingClient { ) for (const pos of this.heliumVsrVotingPositions) { - const tokenAccount = await getAssociatedTokenAddress(pos.mint, walletPk, true) + const tokenAccount = await getAssociatedTokenAddress( + pos.mint, + walletPk, + true + ) remainingAccounts.push( new AccountData(tokenAccount), @@ -316,6 +328,24 @@ export class VotingClient { instructions.push(updateVoterWeightRecordIx) return { voterWeightPk, maxVoterWeightRecord: undefined } } + if (this.client instanceof PythClient) { + const stakeAccount = await this.client!.getMainAccount(walletPk) + + const { + voterWeightAccount, + maxVoterWeightRecord, + } = await this.client.withUpdateVoterWeight( + instructions, + stakeAccount!, + { [type]: {} }, + pythVoterWeightTarget + ) + + return { + voterWeightPk: voterWeightAccount, + maxVoterWeightRecord, + } + } } withCastPluginVote = async ( instructions: TransactionInstruction[], @@ -396,7 +426,11 @@ export class VotingClient { for (let i = 0; i < unusedPositions.length; i++) { const pos = unusedPositions[i] - const tokenAccount = await getAssociatedTokenAddress(pos.mint, walletPk, true) + const tokenAccount = await getAssociatedTokenAddress( + pos.mint, + walletPk, + true + ) const [nftVoteRecord] = nftVoteRecordKey( proposal.pubkey, pos.mint, @@ -434,6 +468,25 @@ export class VotingClient { } } + if (this.client instanceof PythClient) { + const stakeAccount = await this.client!.getMainAccount(walletPk) + + const { + voterWeightAccount, + maxVoterWeightRecord, + } = await this.client.withUpdateVoterWeight( + instructions, + stakeAccount!, + { ['castVote']: {} }, + proposal.pubkey + ) + + return { + voterWeightPk: voterWeightAccount, + maxVoterWeightRecord, + } + } + if (this.client instanceof NftVoterClient) { const { registrar } = await getPluginRegistrarPDA( realm.pubkey, diff --git a/yarn.lock b/yarn.lock index 396355544f..a00344c039 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2732,6 +2732,26 @@ snake-case "^3.0.4" toml "^3.0.0" +"@project-serum/anchor@0.24.2", "@project-serum/anchor@^0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@project-serum/anchor/-/anchor-0.24.2.tgz#a3c52a99605c80735f446ca9b3a4885034731004" + integrity sha512-0/718g8/DnEuwAidUwh5wLYphUYXhUbiClkuRNhvNoa+1Y8a4g2tJyxoae+emV+PG/Gikd/QUBNMkIcimiIRTA== + dependencies: + "@project-serum/borsh" "^0.2.5" + "@solana/web3.js" "^1.36.0" + base64-js "^1.5.1" + bn.js "^5.1.2" + bs58 "^4.0.1" + buffer-layout "^1.2.2" + camelcase "^5.3.1" + cross-fetch "^3.1.5" + crypto-hash "^1.3.0" + eventemitter3 "^4.0.7" + js-sha256 "^0.9.0" + pako "^2.0.3" + snake-case "^3.0.4" + toml "^3.0.0" + "@project-serum/anchor@0.25.0", "@project-serum/anchor@^0.25.0": version "0.25.0" resolved "https://registry.yarnpkg.com/@project-serum/anchor/-/anchor-0.25.0.tgz#88ee4843336005cf5a64c80636ce626f0996f503" @@ -2814,26 +2834,6 @@ snake-case "^3.0.4" toml "^3.0.0" -"@project-serum/anchor@^0.24.2": - version "0.24.2" - resolved "https://registry.yarnpkg.com/@project-serum/anchor/-/anchor-0.24.2.tgz#a3c52a99605c80735f446ca9b3a4885034731004" - integrity sha512-0/718g8/DnEuwAidUwh5wLYphUYXhUbiClkuRNhvNoa+1Y8a4g2tJyxoae+emV+PG/Gikd/QUBNMkIcimiIRTA== - dependencies: - "@project-serum/borsh" "^0.2.5" - "@solana/web3.js" "^1.36.0" - base64-js "^1.5.1" - bn.js "^5.1.2" - bs58 "^4.0.1" - buffer-layout "^1.2.2" - camelcase "^5.3.1" - cross-fetch "^3.1.5" - crypto-hash "^1.3.0" - eventemitter3 "^4.0.7" - js-sha256 "^0.9.0" - pako "^2.0.3" - snake-case "^3.0.4" - toml "^3.0.0" - "@project-serum/associated-token@^0.1.1": version "0.1.1" resolved "https://registry.yarnpkg.com/@project-serum/associated-token/-/associated-token-0.1.1.tgz#9acf745e84dad21e2ea26e06694704b9d698e532" @@ -2945,6 +2945,25 @@ "@coral-xyz/anchor" "^0.26.0" buffer "^6.0.1" +"@pythnetwork/staking-wasm@*": + version "0.3.4" + resolved "https://registry.yarnpkg.com/@pythnetwork/staking-wasm/-/staking-wasm-0.3.4.tgz#29c0f47467249a4c66814a8aab9eadf2cc008add" + integrity sha512-0ZdaWmueVO5hucdVH4UDfHyBuxtW6UDcrpEFtD/3pq4naQjcgu1u6rK8iL2pgKi8W2UlsB4vwJqay2Sf1sA4mw== + +"@pythnetwork/staking@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@pythnetwork/staking/-/staking-2.0.0.tgz#41edcb000a3c2d1db938a3017dae46f54aac061e" + integrity sha512-7RPcsYfEJxGZ12P+OyQ1lfXxgcoe69N0Zftj525GaxUDMBvCXtNSQM+FuskF8y/GKHifZ+CDI8eP3w26gv0ZzQ== + dependencies: + "@project-serum/anchor" "0.24.2" + "@pythnetwork/staking-wasm" "*" + "@solana/spl-governance" "0.3.26" + "@solana/spl-token" "^0.1.8" + "@solana/web3.js" "^1.36.0" + encoding "^0.1.13" + ts-node "^10.7.0" + typescript "^4.3.5" + "@radix-ui/number@1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@radix-ui/number/-/number-1.0.0.tgz#4c536161d0de750b3f5d55860fc3de46264f897b" @@ -4131,6 +4150,19 @@ js-sha3 "^0.8.0" typescript-collections "^1.3.3" +"@solana/spl-governance@0.3.26": + version "0.3.26" + resolved "https://registry.yarnpkg.com/@solana/spl-governance/-/spl-governance-0.3.26.tgz#1a6c56037063654d243cc3ee9503b5b3140bbd6f" + integrity sha512-L84AWKcAmEMIWhh5gcfasfDesOMT+IU4i+s0ELgKCN0O9MC/hVrSjTkn68vBhDfCElnJyJTFMAN7NqSbrweD9A== + dependencies: + "@solana/web3.js" "^1.22.0" + axios "^1.1.3" + bignumber.js "^9.0.1" + bn.js "^5.1.3" + borsh "^0.3.1" + bs58 "^4.0.1" + superstruct "^0.15.2" + "@solana/spl-governance@0.3.28": version "0.3.28" resolved "https://registry.yarnpkg.com/@solana/spl-governance/-/spl-governance-0.3.28.tgz#63ff71f235206f069f8ea1e66a40e7cdb6252d3f" @@ -6223,12 +6255,12 @@ ansi-escapes@^4.2.1: dependencies: type-fest "^0.21.3" -ansi-regex@3.0.1: +ansi-regex@3.0.1, ansi-regex@^2.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.1.tgz#123d6479e92ad45ad897d4054e3c7ca7db4944e1" integrity sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw== -"ansi-regex@>=3.0.1 <=5.0.1", ansi-regex@^2.0.0, ansi-regex@^3.0.0, ansi-regex@^4.1.0, ansi-regex@^5.0.0, ansi-regex@^5.0.1: +"ansi-regex@>=3.0.1 <=5.0.1", ansi-regex@^3.0.0, ansi-regex@^4.1.0, ansi-regex@^5.0.0, ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== @@ -15119,7 +15151,7 @@ ts-mocha@^9.0.2: optionalDependencies: tsconfig-paths "^3.5.0" -ts-node@10.9.1, ts-node@^10.9.1: +ts-node@10.9.1, ts-node@^10.7.0, ts-node@^10.9.1: version "10.9.1" resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== @@ -15291,7 +15323,7 @@ typescript-collections@^1.3.3: resolved "https://registry.yarnpkg.com/typescript-collections/-/typescript-collections-1.3.3.tgz#62d50d93c018c094d425eabee649f00ec5cc0fea" integrity sha512-7sI4e/bZijOzyURng88oOFZCISQPTHozfE2sUu5AviFYk5QV7fYGb6YiDl+vKjF/pICA354JImBImL9XJWUvdQ== -typescript@4.9.5, typescript@^4.1.2, typescript@^4.5.5, typescript@^4.6.2: +typescript@4.9.5, typescript@^4.1.2, typescript@^4.3.5, typescript@^4.5.5, typescript@^4.6.2: version "4.9.5" resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== From 46b2e9f905e557569c48e798fafe80099c82de45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrian=20Brzezi=C5=84ski?= Date: Fri, 1 Dec 2023 02:44:15 +0100 Subject: [PATCH 25/43] fix descriptor for forwarder (#1960) --- components/instructions/programs/mangoV4.tsx | 1 + components/instructions/tools.tsx | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/components/instructions/programs/mangoV4.tsx b/components/instructions/programs/mangoV4.tsx index 717d870035..859712198b 100644 --- a/components/instructions/programs/mangoV4.tsx +++ b/components/instructions/programs/mangoV4.tsx @@ -750,6 +750,7 @@ const instructions = () => ({ ) => { try { let mintData: null | TokenInfoWithoutDecimals | undefined = null + const mintInfo = accounts[2].pubkey const group = accounts[0].pubkey const client = await getClient(connection) diff --git a/components/instructions/tools.tsx b/components/instructions/tools.tsx index fc4839889e..418652698d 100644 --- a/components/instructions/tools.tsx +++ b/components/instructions/tools.tsx @@ -465,6 +465,7 @@ export async function getInstructionDescriptor( let instructionToDecode = { ...instruction } const isUsingForwardProgram = instructionToDecode.programId.toBase58() === MANGO_INSTRUCTION_FORWARDER + if ( (realm && instructionToDecode.programId.equals(realm.owner)) || instructionToDecode.programId.equals( @@ -476,7 +477,7 @@ export async function getInstructionDescriptor( } else if (isUsingForwardProgram) { instructionToDecode = { accounts: instructionToDecode.accounts.slice( - 1, + 2, instructionToDecode.accounts.length ), data: instructionToDecode.data.slice(8, instructionToDecode.data.length), From 87275324f50f88a2fb5854b3f3bff07831889b01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrian=20Brzezi=C5=84ski?= Date: Fri, 1 Dec 2023 15:11:39 +0100 Subject: [PATCH 26/43] add forwarder to custom inst (#1961) --- .../components/instructions/CustomBase64.tsx | 27 +++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/pages/dao/[symbol]/proposal/components/instructions/CustomBase64.tsx b/pages/dao/[symbol]/proposal/components/instructions/CustomBase64.tsx index 33c4380b64..4e30215f0b 100644 --- a/pages/dao/[symbol]/proposal/components/instructions/CustomBase64.tsx +++ b/pages/dao/[symbol]/proposal/components/instructions/CustomBase64.tsx @@ -4,6 +4,7 @@ import { getInstructionDataFromBase64, Governance, ProgramAccount, + serializeInstructionToBase64, } from '@solana/spl-governance' import Input from '@components/inputs/Input' import Textarea from '@components/inputs/Textarea' @@ -18,6 +19,10 @@ import GovernedAccountSelect from '../GovernedAccountSelect' import useGovernanceAssets from '@hooks/useGovernanceAssets' import useWalletOnePointOh from '@hooks/useWalletOnePointOh' import { useLegacyVoterWeight } from '@hooks/queries/governancePower' +import ForwarderProgram, { + useForwarderProgramHelpers, +} from '@components/ForwarderProgram/ForwarderProgram' +import { TransactionInstruction } from '@solana/web3.js' const CustomBase64 = ({ index, @@ -29,6 +34,7 @@ const CustomBase64 = ({ const { result: ownVoterWeight } = useLegacyVoterWeight() const wallet = useWalletOnePointOh() const { assetAccounts } = useGovernanceAssets() + const forwarderProgramHelpers = useForwarderProgramHelpers() const shouldBeGoverned = !!(index !== 0 && governance) const [form, setForm] = useState({ governedAccount: undefined, @@ -49,7 +55,19 @@ const CustomBase64 = ({ form.governedAccount?.governance?.account && wallet?.publicKey ) { - serializedInstruction = form.base64 + if (forwarderProgramHelpers.form.useExecutableBy) { + const ix = getInstructionDataFromBase64(form.base64) + const tx = new TransactionInstruction({ + keys: ix.accounts, + data: Buffer.from(ix.data), + programId: ix.programId, + }) + serializedInstruction = serializeInstructionToBase64( + forwarderProgramHelpers.withForwarderWrapper(tx) + ) + } else { + serializedInstruction = form.base64 + } } const obj: UiInstruction = { serializedInstruction: serializedInstruction, @@ -65,7 +83,11 @@ const CustomBase64 = ({ index ) // eslint-disable-next-line react-hooks/exhaustive-deps -- TODO please fix, it can cause difficult bugs. You might wanna check out https://bobbyhadz.com/blog/react-hooks-exhaustive-deps for info. -@asktree - }, [form]) + }, [ + form, + forwarderProgramHelpers.form, + forwarderProgramHelpers.withForwarderWrapper, + ]) const schema = yup.object().shape({ governedAccount: yup .object() @@ -149,6 +171,7 @@ const CustomBase64 = ({ } error={formErrors['base64']} > + ) } From 64251a394ee85220cd8293238c3281af904a0b9b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrian=20Brzezi=C5=84ski?= Date: Fri, 1 Dec 2023 15:54:39 +0100 Subject: [PATCH 27/43] listing instruction fixes mango (#1962) --- components/instructions/programs/mangoV4.tsx | 5 ++--- .../instructions/Mango/MangoV4/TokenRegister.tsx | 7 ++++--- .../instructions/Mango/MangoV4/TokenRegisterTrustless.tsx | 5 +++-- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/components/instructions/programs/mangoV4.tsx b/components/instructions/programs/mangoV4.tsx index 859712198b..847e0bb7e8 100644 --- a/components/instructions/programs/mangoV4.tsx +++ b/components/instructions/programs/mangoV4.tsx @@ -204,7 +204,6 @@ const instructions = () => ({ //accounts: AccountMetaData[] ) => { const info = await displayArgs(connection, data) - console.log(info, '@@@@') try { return
{info}
} catch (e) { @@ -1552,8 +1551,8 @@ const displayArgs = async (connection: Connection, data: Uint8Array) => { .map((key) => { const isPublicKey = tryParseKey(args[key]) const isBN = args[key] instanceof BN - if (isBN) { - console.log(args[key].toNumber()) + if (isBN && key === 'price.val') { + return args[key] / Math.pow(2, 48) } return (
diff --git a/pages/dao/[symbol]/proposal/components/instructions/Mango/MangoV4/TokenRegister.tsx b/pages/dao/[symbol]/proposal/components/instructions/Mango/MangoV4/TokenRegister.tsx index 7e7a1bccd7..aea9acd811 100644 --- a/pages/dao/[symbol]/proposal/components/instructions/Mango/MangoV4/TokenRegister.tsx +++ b/pages/dao/[symbol]/proposal/components/instructions/Mango/MangoV4/TokenRegister.tsx @@ -170,7 +170,7 @@ const TokenRegister = ({ new BN(form.netBorrowLimitPerWindowQuote), Number(form.borrowWeightScaleStartQuote), Number(form.depositWeightScaleStartQuote), - Number(form.reduceOnly), + Number(form.reduceOnly.value), Number(form.tokenConditionalSwapTakerFeeRate), Number(form.tokenConditionalSwapMakerFeeRate), Number(form.flashLoanSwapFeeRate) @@ -192,8 +192,9 @@ const TokenRegister = ({ referralAccountPubKey: JUPITER_REFERRAL_PK, mint: new PublicKey(form.mintPk), }) - const isExistingAccount = - (await connection.current.getBalance(tx.referralTokenAccountPubKey)) > 1 + const isExistingAccount = await connection.current.getAccountInfo( + tx.referralTokenAccountPubKey + ) if (!isExistingAccount) { additionalSerializedInstructions.push( diff --git a/pages/dao/[symbol]/proposal/components/instructions/Mango/MangoV4/TokenRegisterTrustless.tsx b/pages/dao/[symbol]/proposal/components/instructions/Mango/MangoV4/TokenRegisterTrustless.tsx index 6814f32de1..89d908a661 100644 --- a/pages/dao/[symbol]/proposal/components/instructions/Mango/MangoV4/TokenRegisterTrustless.tsx +++ b/pages/dao/[symbol]/proposal/components/instructions/Mango/MangoV4/TokenRegisterTrustless.tsx @@ -96,8 +96,9 @@ const TokenRegisterTrustless = ({ referralAccountPubKey: JUPITER_REFERRAL_PK, mint: new PublicKey(form.mintPk), }) - const isExistingAccount = - (await connection.current.getBalance(tx.referralTokenAccountPubKey)) > 1 + const isExistingAccount = await connection.current.getAccountInfo( + tx.referralTokenAccountPubKey + ) if (!isExistingAccount) { additionalSerializedInstructions.push( From 3b08984b325ea09e6762de74f3ed265b268ee128 Mon Sep 17 00:00:00 2001 From: Britt Cyr Date: Fri, 1 Dec 2023 12:28:43 -0500 Subject: [PATCH 28/43] Possibly init wallet base ata for the user on dual exercise (#1963) --- utils/instructions/Dual/index.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/utils/instructions/Dual/index.ts b/utils/instructions/Dual/index.ts index 1e8b2bbc0a..e4b5b68e2f 100644 --- a/utils/instructions/Dual/index.ts +++ b/utils/instructions/Dual/index.ts @@ -479,6 +479,17 @@ export async function getExerciseInstruction({ additionalSerializedInstructions.push(serializeInstructionToBase64(ataIx)) } + // Possibly init the base token account that is receiving tokens from exercise. + const walletBaseAta = await findAssociatedTokenAddress(wallet.publicKey, baseMint); + if ((await connection.current.getAccountInfo(walletBaseAta)) === null) { + const [ataIx] = await createAssociatedTokenAccount( + wallet.publicKey, + wallet.publicKey, + baseMint + ) + additionalSerializedInstructions.push(serializeInstructionToBase64(ataIx)) + } + const prerequisiteInstructions: TransactionInstruction[] = [] const space = 165 const rent = await connection.current.getMinimumBalanceForRentExemption( From 76219ee681c8e3266c7692da87149cf764167dcb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrian=20Brzezi=C5=84ski?= Date: Mon, 4 Dec 2023 12:39:11 +0100 Subject: [PATCH 29/43] upgrade mango lib (#1967) --- package.json | 2 +- yarn.lock | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index 2a714eed55..7100319d0f 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "@blockworks-foundation/mango-mints-redemption": "0.0.10", "@blockworks-foundation/mango-v4": "0.20.3", "@jup-ag/referral-sdk": "0.1.5", - "@blockworks-foundation/mango-v4-settings": "0.2.22", + "@blockworks-foundation/mango-v4-settings": "0.2.23", "@blockworks-foundation/mangolana": "0.0.1-beta.15", "@bonfida/spl-name-service": "0.1.47", "@bundlr-network/client": "0.7.15", diff --git a/yarn.lock b/yarn.lock index a00344c039..7183da36e4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -337,10 +337,10 @@ keccak256 "^1.0.6" merkletreejs "^0.3.11" -"@blockworks-foundation/mango-v4-settings@0.2.22": - version "0.2.22" - resolved "https://registry.yarnpkg.com/@blockworks-foundation/mango-v4-settings/-/mango-v4-settings-0.2.22.tgz#19a34eeabd7cf59d76d59048369b66fa1f393e9c" - integrity sha512-tHmLsGFn7oh4EPWoGeWExP1TBvOSvfaeKS5ypDq5sx87zA/95pEyzcPmkLFkQKQoUQTX+udz/4qTnUjPqPflWw== +"@blockworks-foundation/mango-v4-settings@0.2.23": + version "0.2.23" + resolved "https://registry.yarnpkg.com/@blockworks-foundation/mango-v4-settings/-/mango-v4-settings-0.2.23.tgz#a42a93f9b0b0449c1879386b00d81bebcfdc52e0" + integrity sha512-47NuZPHo0odIRxY0TFrMOqjnJJADzXuIIEG5urCOb4FhLClthCpyjZRbHsTSzHTk5RRHChO4ZtfP9+B+qT5LAw== dependencies: bn.js "^5.2.1" eslint-config-prettier "^9.0.0" @@ -6255,12 +6255,12 @@ ansi-escapes@^4.2.1: dependencies: type-fest "^0.21.3" -ansi-regex@3.0.1, ansi-regex@^2.0.0: +ansi-regex@3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.1.tgz#123d6479e92ad45ad897d4054e3c7ca7db4944e1" integrity sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw== -"ansi-regex@>=3.0.1 <=5.0.1", ansi-regex@^3.0.0, ansi-regex@^4.1.0, ansi-regex@^5.0.0, ansi-regex@^5.0.1: +"ansi-regex@>=3.0.1 <=5.0.1", ansi-regex@^2.0.0, ansi-regex@^3.0.0, ansi-regex@^4.1.0, ansi-regex@^5.0.0, ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== From bcca1db99abea175a86a62ccbfb1080ff1e9ab0f Mon Sep 17 00:00:00 2001 From: Britt Cyr Date: Mon, 4 Dec 2023 20:07:19 -0500 Subject: [PATCH 30/43] Fix GSO withdraw validation (#1964) --- utils/instructions/Dual/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/instructions/Dual/index.ts b/utils/instructions/Dual/index.ts index e4b5b68e2f..1d46f5a42d 100644 --- a/utils/instructions/Dual/index.ts +++ b/utils/instructions/Dual/index.ts @@ -742,7 +742,7 @@ export async function getGsoWithdrawInstruction({ const serializedInstruction = '' const additionalSerializedInstructions: string[] = [] - if (isValid && form.soName && form.baseTreasury && !!form.baseTreasury.isSol && wallet?.publicKey) { + if (isValid && form.soName && form.baseTreasury && wallet?.publicKey) { const gso = getGsoApi(connection) const authority = form.baseTreasury.extensions.token!.account.owner! const baseMint = form.baseTreasury.extensions.mint?.publicKey From 94d5a9a2c73c4d27fc5765a6ca2fc0e684b52414 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrian=20Brzezi=C5=84ski?= Date: Tue, 5 Dec 2023 19:18:38 +0100 Subject: [PATCH 31/43] fix z index footer (#1968) --- components/Footer.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/Footer.tsx b/components/Footer.tsx index ef5688283d..892a9166ff 100644 --- a/components/Footer.tsx +++ b/components/Footer.tsx @@ -35,7 +35,7 @@ const Footer = () => { 'lg:pb-24', 'gap-y-8', 'md:gap-y-0', - 'z-10' + 'z-[1]' )} >
Date: Wed, 6 Dec 2023 00:11:47 +0100 Subject: [PATCH 32/43] remove typo in ui (#1970) --- components/AssetsList/AssetsCompactWrapper.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/components/AssetsList/AssetsCompactWrapper.tsx b/components/AssetsList/AssetsCompactWrapper.tsx index 63ce2cfcca..59b0239057 100644 --- a/components/AssetsList/AssetsCompactWrapper.tsx +++ b/components/AssetsList/AssetsCompactWrapper.tsx @@ -35,7 +35,6 @@ const AssetsCompactWrapper = () => {
- )
) } From d586891cf6a565dda1a839117c6660ca82cc49ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrian=20Brzezi=C5=84ski?= Date: Thu, 7 Dec 2023 23:35:49 +0100 Subject: [PATCH 33/43] fix lockup types multipler (#1972) --- .../components/Account/LockTokensModal.tsx | 3 +- VoteStakeRegistry/tools/deposits.ts | 46 ++++++++++--------- components/instructions/programs/names.ts | 2 + .../instructions/Mango/MangoV4/EditToken.tsx | 3 +- 4 files changed, 31 insertions(+), 23 deletions(-) diff --git a/VoteStakeRegistry/components/Account/LockTokensModal.tsx b/VoteStakeRegistry/components/Account/LockTokensModal.tsx index 7e94e1aa01..fa67087e0d 100644 --- a/VoteStakeRegistry/components/Account/LockTokensModal.tsx +++ b/VoteStakeRegistry/components/Account/LockTokensModal.tsx @@ -208,7 +208,8 @@ const LockTokensModal = ({ const currentMultiplier = calcMintMultiplier( lockupPeriodDays * SECS_PER_DAY, voteStakeRegistryRegistrar, - realm + realm, + lockupType.value !== 'constant' ) const currentPercentOfMaxMultiplier = (100 * currentMultiplier) / maxMultiplier diff --git a/VoteStakeRegistry/tools/deposits.ts b/VoteStakeRegistry/tools/deposits.ts index 890f2b296a..49136643c5 100644 --- a/VoteStakeRegistry/tools/deposits.ts +++ b/VoteStakeRegistry/tools/deposits.ts @@ -2,7 +2,7 @@ import { BN, EventParser, Idl, Program } from '@coral-xyz/anchor' import { ProgramAccount, Realm } from '@solana/spl-governance' import { PublicKey, Transaction, Connection } from '@solana/web3.js' import { SIMULATION_WALLET } from '@tools/constants' -import { DAYS_PER_MONTH } from '@utils/dateTools' +import { DAYS_PER_MONTH, SECS_PER_DAY } from '@utils/dateTools' import { chunks } from '@utils/helpers' import { tryGetMint } from '@utils/tokens' import { @@ -259,31 +259,33 @@ export const calcMultiplier = ({ maxExtraLockupVoteWeightScaledFactor, lockupSecs, lockupSaturationSecs, + isVested = false, }: { depositScaledFactor: number maxExtraLockupVoteWeightScaledFactor: number lockupSecs: number lockupSaturationSecs: number + isVested?: boolean }) => { - // if (isVested) { - // const onMonthSecs = SECS_PER_DAY * DAYS_PER_MONTH - // const n_periods_before_saturation = lockupSaturationSecs / onMonthSecs - // const n_periods = lockupSecs / onMonthSecs - // const n_unsaturated_periods = Math.min( - // n_periods, - // n_periods_before_saturation - // ) - // const n_saturated_periods = Math.max(0, n_periods - n_unsaturated_periods) - // const calc = - // (depositScaledFactor + - // (maxExtraLockupVoteWeightScaledFactor / n_periods) * - // (n_saturated_periods + - // ((n_unsaturated_periods + 1) * n_unsaturated_periods) / - // 2 / - // n_periods_before_saturation)) / - // depositScaledFactor - // return depositScaledFactor !== 0 ? calc : 0 - // } + if (isVested) { + const onMonthSecs = SECS_PER_DAY * DAYS_PER_MONTH + const n_periods_before_saturation = lockupSaturationSecs / onMonthSecs + const n_periods = lockupSecs / onMonthSecs + const n_unsaturated_periods = Math.min( + n_periods, + n_periods_before_saturation + ) + const n_saturated_periods = Math.max(0, n_periods - n_unsaturated_periods) + const calc = + (depositScaledFactor + + (maxExtraLockupVoteWeightScaledFactor / n_periods) * + (n_saturated_periods + + ((n_unsaturated_periods + 1) * n_unsaturated_periods) / + 2 / + n_periods_before_saturation)) / + depositScaledFactor + return depositScaledFactor !== 0 ? calc : 0 + } const calc = (depositScaledFactor + (maxExtraLockupVoteWeightScaledFactor * @@ -318,7 +320,8 @@ export const getPeriod = ( export const calcMintMultiplier = ( lockupSecs: number, registrar: Registrar | null, - realm: ProgramAccount | undefined + realm: ProgramAccount | undefined, + isVested?: boolean ) => { const mintCfgs = registrar?.votingMints const mintCfg = mintCfgs?.find( @@ -339,6 +342,7 @@ export const calcMintMultiplier = ( maxExtraLockupVoteWeightScaledFactor: maxExtraLockupVoteWeightScaledFactorNum, lockupSaturationSecs: lockupSaturationSecsNum, lockupSecs, + isVested, }) return parseFloat(calced.toFixed(2)) diff --git a/components/instructions/programs/names.ts b/components/instructions/programs/names.ts index e6d0451e54..79924845ac 100644 --- a/components/instructions/programs/names.ts +++ b/components/instructions/programs/names.ts @@ -10,6 +10,8 @@ import { NAME_PROGRAM_ID } from '@bonfida/spl-name-service' const GOVERNANCE_PROGRAM_NAMES = { GqTPL6qRf5aUuqscLh8Rg2HTxPUXfhhAXDptTLhp1t2J: 'Mango Governance Program', FP4PxqHTVzeG2c6eZd7974F9WvKUSdBeduUK3rjYyvBw: 'Mango v4 Program Governance ', + '89VDjvzxfNLN7EgkvkNZ4VWpskBuiuZtHkLpYJd3ynEY': + 'Mango v4 Program Governance Wallet', AVoAYTs36yB5izAaBkxRG67wL1AMwG3vo41hKtUSb8is: 'Serum Governance Program (Old)', G41fmJzd29v7Qmdi8ZyTBBYa98ghh3cwHBTexqCG1PQJ: diff --git a/pages/dao/[symbol]/proposal/components/instructions/Mango/MangoV4/EditToken.tsx b/pages/dao/[symbol]/proposal/components/instructions/Mango/MangoV4/EditToken.tsx index a263cb65ec..f1c6e2e976 100644 --- a/pages/dao/[symbol]/proposal/components/instructions/Mango/MangoV4/EditToken.tsx +++ b/pages/dao/[symbol]/proposal/components/instructions/Mango/MangoV4/EditToken.tsx @@ -217,7 +217,8 @@ const EditToken = ({ ? null : form.oracleConfFilter const maxStalenessSlots = - (form.maxStalenessSlots as number | string) === '' + (form.maxStalenessSlots as number | string) === '' || + form.maxStalenessSlots === -1 ? null : form.maxStalenessSlots From 41115e2d06b7017137f66c039d25b875b7fdb011 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrian=20Brzezi=C5=84ski?= Date: Fri, 8 Dec 2023 12:42:33 +0100 Subject: [PATCH 34/43] upgrade mango settings lib (#1973) --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 7100319d0f..7f22ac3595 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "@blockworks-foundation/mango-mints-redemption": "0.0.10", "@blockworks-foundation/mango-v4": "0.20.3", "@jup-ag/referral-sdk": "0.1.5", - "@blockworks-foundation/mango-v4-settings": "0.2.23", + "@blockworks-foundation/mango-v4-settings": "0.2.24", "@blockworks-foundation/mangolana": "0.0.1-beta.15", "@bonfida/spl-name-service": "0.1.47", "@bundlr-network/client": "0.7.15", diff --git a/yarn.lock b/yarn.lock index 7183da36e4..f80917ae8a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -337,10 +337,10 @@ keccak256 "^1.0.6" merkletreejs "^0.3.11" -"@blockworks-foundation/mango-v4-settings@0.2.23": - version "0.2.23" - resolved "https://registry.yarnpkg.com/@blockworks-foundation/mango-v4-settings/-/mango-v4-settings-0.2.23.tgz#a42a93f9b0b0449c1879386b00d81bebcfdc52e0" - integrity sha512-47NuZPHo0odIRxY0TFrMOqjnJJADzXuIIEG5urCOb4FhLClthCpyjZRbHsTSzHTk5RRHChO4ZtfP9+B+qT5LAw== +"@blockworks-foundation/mango-v4-settings@0.2.24": + version "0.2.24" + resolved "https://registry.yarnpkg.com/@blockworks-foundation/mango-v4-settings/-/mango-v4-settings-0.2.24.tgz#0335f6e35ea67984699436e5177a1a1d768401a9" + integrity sha512-jv4SvJ88N3YcQtUw4T4u/k6uA3fe216WX4A+aZ8iHLj9Zk3ADoILLsC/SWhGWRt2SaGv8ClndLmETIT4R1VDDw== dependencies: bn.js "^5.2.1" eslint-config-prettier "^9.0.0" From 3588bea1738d5fa25586e10089c305d66d4b6194 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrian=20Brzezi=C5=84ski?= Date: Sat, 9 Dec 2023 12:05:55 +0100 Subject: [PATCH 35/43] upgrade switchboard lib (#1974) --- package.json | 2 +- .../instructions/Switchboard/FundOracle.tsx | 5 +-- .../Switchboard/WithdrawFromOracle.tsx | 5 +-- yarn.lock | 45 +++++++++++++------ 4 files changed, 35 insertions(+), 22 deletions(-) diff --git a/package.json b/package.json index 7f22ac3595..2b4024cc42 100644 --- a/package.json +++ b/package.json @@ -107,7 +107,7 @@ "@solendprotocol/solend-sdk": "0.5.5", "@sqds/iframe-adapter": "1.0.16", "@switchboard-xyz/sbv2-lite": "0.2.4", - "@switchboard-xyz/solana.js": "2.5.4", + "@switchboard-xyz/solana.js": "3.1.5", "@tailwindcss/forms": "0.5.3", "@tailwindcss/line-clamp": "0.4.2", "@tanstack/react-query": "4.14.3", diff --git a/pages/dao/[symbol]/proposal/components/instructions/Switchboard/FundOracle.tsx b/pages/dao/[symbol]/proposal/components/instructions/Switchboard/FundOracle.tsx index 76e167a52d..2f08a61c61 100644 --- a/pages/dao/[symbol]/proposal/components/instructions/Switchboard/FundOracle.tsx +++ b/pages/dao/[symbol]/proposal/components/instructions/Switchboard/FundOracle.tsx @@ -76,10 +76,7 @@ const SwitchboardFundOracle = ({ form.governedAccount?.governance?.account && wallet?.publicKey ) { - const program = await SwitchboardProgram.load( - connection.cluster === 'devnet' ? 'devnet' : 'mainnet-beta', - connection.current - ) + const program = await SwitchboardProgram.load(connection.current) const [oracle, oracleAccountData] = await AggregatorAccount.load( program, form.oraclePublicKey diff --git a/pages/dao/[symbol]/proposal/components/instructions/Switchboard/WithdrawFromOracle.tsx b/pages/dao/[symbol]/proposal/components/instructions/Switchboard/WithdrawFromOracle.tsx index d226f63942..37f9d76e7f 100644 --- a/pages/dao/[symbol]/proposal/components/instructions/Switchboard/WithdrawFromOracle.tsx +++ b/pages/dao/[symbol]/proposal/components/instructions/Switchboard/WithdrawFromOracle.tsx @@ -65,10 +65,7 @@ const WithdrawFromOracle = ({ form.governedAccount?.governance?.account && wallet?.publicKey ) { - const program = await SwitchboardProgram.load( - connection.cluster === 'devnet' ? 'devnet' : 'mainnet-beta', - connection.current - ) + const program = await SwitchboardProgram.load(connection.current) const [oracle, oracleAccountData] = await AggregatorAccount.load( program, form.oraclePublicKey diff --git a/yarn.lock b/yarn.lock index f80917ae8a..09483bdcd4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4916,14 +4916,11 @@ dependencies: tslib "^2.4.0" -"@switchboard-xyz/common@^2.3.0": - version "2.3.0" - resolved "https://registry.yarnpkg.com/@switchboard-xyz/common/-/common-2.3.0.tgz#f148481b62850555a7b76e92d23483bd347e1988" - integrity sha512-MIjsHv71tFyj6ZAVme35Con0IYTXMeGhWOzcc6s2oK6vPLTDiLMoS2DO0Ih/2y//O/m1Bz+YbSbXWbpSjvuP2g== +"@switchboard-xyz/common@^2.3.9": + version "2.3.9" + resolved "https://registry.yarnpkg.com/@switchboard-xyz/common/-/common-2.3.9.tgz#c19e4135d95a6b679f00272d6dbe42130a11bc19" + integrity sha512-Sdr+m1MFzLCNjpPvklazd7BwT/s2g2spfVnhe0dhwc36ONWeObXAALOLMrFJKiLar2wtd+qhclHt5OoBfceFtw== dependencies: - "@coral-xyz/borsh" "^0.28.0" - "@types/big.js" "^6.1.6" - "@types/bn.js" "^5.1.1" big.js "^6.2.1" bn.js "^5.2.1" bs58 "^5.0.0" @@ -4948,19 +4945,22 @@ "@project-serum/anchor" "^0.24.2" big.js "^6.1.1" -"@switchboard-xyz/solana.js@2.5.4": - version "2.5.4" - resolved "https://registry.yarnpkg.com/@switchboard-xyz/solana.js/-/solana.js-2.5.4.tgz#097b3dc9f509676a858633a495cf077a65359200" - integrity sha512-n+vlW3atEZJPn0RYjO41BfPj/7em18+vixxaRQmZYCviQG4TXYGMuKFFgciid/PFKiBnZaCo5/lkWPxjZW4A2w== +"@switchboard-xyz/solana.js@3.1.5": + version "3.1.5" + resolved "https://registry.yarnpkg.com/@switchboard-xyz/solana.js/-/solana.js-3.1.5.tgz#b754d1ba2ccee24586d9f14fc8eaf86cd9195262" + integrity sha512-bKNXBw5g7zBbIfLqDim9gAr0KKKNgw3/KgRsVa5/pl1/2JsDPX8dpuv7H0S0p01CaUryu32Lg1mxjN+qznupAg== dependencies: "@coral-xyz/anchor" "^0.28.0" "@coral-xyz/borsh" "^0.28.0" "@solana/spl-token" "^0.3.8" "@solana/web3.js" "^1.78.3" - "@switchboard-xyz/common" "^2.3.0" + "@switchboard-xyz/common" "^2.3.9" cron-validator "^1.3.1" + cross-fetch "^4.0.0" dotenv "^16.3.1" lodash "^4.17.21" + zod "^3.22.2" + zod-error "^1.5.0" "@tailwindcss/forms@0.5.3": version "0.5.3" @@ -5201,7 +5201,7 @@ resolved "https://registry.yarnpkg.com/@types/big.js/-/big.js-6.2.0.tgz#e1f6a9a6ce64bc7c131137e71fbad34a5574f987" integrity sha512-ubLURWoc4tCw/8Yds0P3CE9cBG5q+aoycwWBiXXx4gp7XPYZy9ch0L9+Pv6osSoSRgvuQNqJdlwEhP5QhKKl6w== -"@types/bn.js@5.1.0", "@types/bn.js@^4.11.5", "@types/bn.js@^5.1.0", "@types/bn.js@^5.1.1": +"@types/bn.js@5.1.0", "@types/bn.js@^4.11.5", "@types/bn.js@^5.1.0": version "5.1.0" resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.0.tgz#32c5d271503a12653c62cf4d2b45e6eab8cebc68" integrity sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA== @@ -7665,6 +7665,13 @@ cross-fetch@^3.0.4, cross-fetch@^3.1.5: dependencies: node-fetch "^2.6.12" +cross-fetch@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-4.0.0.tgz#f037aef1580bb3a1a35164ea2a848ba81b445983" + integrity sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g== + dependencies: + node-fetch "^2.6.12" + cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" @@ -16057,6 +16064,18 @@ yup@0.32.11: property-expr "^2.0.4" toposort "^2.0.2" +zod-error@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/zod-error/-/zod-error-1.5.0.tgz#bfdc20532746d564c88c51bd36267d6b7d9b9a5d" + integrity sha512-zzopKZ/skI9iXpqCEPj+iLCKl9b88E43ehcU+sbRoHuwGd9F1IDVGQ70TyO6kmfiRL1g4IXkjsXK+g1gLYl4WQ== + dependencies: + zod "^3.20.2" + +zod@^3.20.2, zod@^3.22.2: + version "3.22.4" + resolved "https://registry.yarnpkg.com/zod/-/zod-3.22.4.tgz#f31c3a9386f61b1f228af56faa9255e845cf3fff" + integrity sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg== + zustand@3.7.2: version "3.7.2" resolved "https://registry.yarnpkg.com/zustand/-/zustand-3.7.2.tgz#7b44c4f4a5bfd7a8296a3957b13e1c346f42514d" From 668cc47bc5c5f38fd777034f9514ee861521eca5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrian=20Brzezi=C5=84ski?= Date: Sat, 9 Dec 2023 12:07:39 +0100 Subject: [PATCH 36/43] upgrade mango lib (#1975) --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 2b4024cc42..351ff3608e 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "@blockworks-foundation/mango-mints-redemption": "0.0.10", "@blockworks-foundation/mango-v4": "0.20.3", "@jup-ag/referral-sdk": "0.1.5", - "@blockworks-foundation/mango-v4-settings": "0.2.24", + "@blockworks-foundation/mango-v4-settings": "0.2.25", "@blockworks-foundation/mangolana": "0.0.1-beta.15", "@bonfida/spl-name-service": "0.1.47", "@bundlr-network/client": "0.7.15", diff --git a/yarn.lock b/yarn.lock index 09483bdcd4..3776e5d1c9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -337,10 +337,10 @@ keccak256 "^1.0.6" merkletreejs "^0.3.11" -"@blockworks-foundation/mango-v4-settings@0.2.24": - version "0.2.24" - resolved "https://registry.yarnpkg.com/@blockworks-foundation/mango-v4-settings/-/mango-v4-settings-0.2.24.tgz#0335f6e35ea67984699436e5177a1a1d768401a9" - integrity sha512-jv4SvJ88N3YcQtUw4T4u/k6uA3fe216WX4A+aZ8iHLj9Zk3ADoILLsC/SWhGWRt2SaGv8ClndLmETIT4R1VDDw== +"@blockworks-foundation/mango-v4-settings@0.2.25": + version "0.2.25" + resolved "https://registry.yarnpkg.com/@blockworks-foundation/mango-v4-settings/-/mango-v4-settings-0.2.25.tgz#4c64122db0a8d959d6c51f0b558a46b9f06a11a4" + integrity sha512-dp9DSELiILG6dd0DLyt+1pxSbQVB6s7ylmS8J0iPV/PxjiFU5i+VA0shnJ25UoB4oY27emvdtYz/kXlEcgghbQ== dependencies: bn.js "^5.2.1" eslint-config-prettier "^9.0.0" From 9c4efcfe4b8426a6513d507a82fc6236d517507e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrian=20Brzezi=C5=84ski?= Date: Mon, 11 Dec 2023 12:54:46 +0100 Subject: [PATCH 37/43] upgrade mango settings (#1976) --- components/instructions/programs/mangoV4.tsx | 4 ++-- package.json | 2 +- yarn.lock | 8 ++++---- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/components/instructions/programs/mangoV4.tsx b/components/instructions/programs/mangoV4.tsx index 847e0bb7e8..4e545e7dfa 100644 --- a/components/instructions/programs/mangoV4.tsx +++ b/components/instructions/programs/mangoV4.tsx @@ -1651,8 +1651,8 @@ const getFormattedListingValues = (args: FlatListingArgs) => { tokenName: args.name, oracle: args.oracle?.toBase58(), oracleConfidenceFilter: - args['oracleConfig.confFilter'] >= Number.MAX_SAFE_INTEGER - ? '' + args['oracleConfig.confFilter'] >= 100 + ? args['oracleConfig.confFilter'].toString() : (args['oracleConfig.confFilter'] * 100).toFixed(2), oracleMaxStalenessSlots: args['oracleConfig.maxStalenessSlots'], interestRateUtilizationPoint0: ( diff --git a/package.json b/package.json index 351ff3608e..d0ad5e67d4 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "@blockworks-foundation/mango-mints-redemption": "0.0.10", "@blockworks-foundation/mango-v4": "0.20.3", "@jup-ag/referral-sdk": "0.1.5", - "@blockworks-foundation/mango-v4-settings": "0.2.25", + "@blockworks-foundation/mango-v4-settings": "0.2.26", "@blockworks-foundation/mangolana": "0.0.1-beta.15", "@bonfida/spl-name-service": "0.1.47", "@bundlr-network/client": "0.7.15", diff --git a/yarn.lock b/yarn.lock index 3776e5d1c9..a968aa4983 100644 --- a/yarn.lock +++ b/yarn.lock @@ -337,10 +337,10 @@ keccak256 "^1.0.6" merkletreejs "^0.3.11" -"@blockworks-foundation/mango-v4-settings@0.2.25": - version "0.2.25" - resolved "https://registry.yarnpkg.com/@blockworks-foundation/mango-v4-settings/-/mango-v4-settings-0.2.25.tgz#4c64122db0a8d959d6c51f0b558a46b9f06a11a4" - integrity sha512-dp9DSELiILG6dd0DLyt+1pxSbQVB6s7ylmS8J0iPV/PxjiFU5i+VA0shnJ25UoB4oY27emvdtYz/kXlEcgghbQ== +"@blockworks-foundation/mango-v4-settings@0.2.26": + version "0.2.26" + resolved "https://registry.yarnpkg.com/@blockworks-foundation/mango-v4-settings/-/mango-v4-settings-0.2.26.tgz#9e03599fc838d31c2b1dad6cf86e912ab77462ab" + integrity sha512-xOcLGGpcZYF5D7Gn+0Q4fsYq3G5BHbl9f9PFo2MzIKat0bOtelnxlovx5Gf8sggy5KzESrQRf8tmvnHV0QsgZQ== dependencies: bn.js "^5.2.1" eslint-config-prettier "^9.0.0" From d86adba3a5197b76245e111e61cbbaf51caa58b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrian=20Brzezi=C5=84ski?= Date: Mon, 11 Dec 2023 16:56:04 +0100 Subject: [PATCH 38/43] fix pyth url (#1977) --- utils/Mango/listingTools.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/Mango/listingTools.ts b/utils/Mango/listingTools.ts index fba8169b2b..b7070dea7a 100644 --- a/utils/Mango/listingTools.ts +++ b/utils/Mango/listingTools.ts @@ -401,7 +401,7 @@ export const isPythOracle = async ( ) if (feed) { - return `https://pyth.network/price-feeds/${feed.asset_type.toLowerCase()}-${feed.base.toLowerCase()}-${feed.quote_currency.toLowerCase()}?cluster=mainnet-beta` + return `https://pyth.network/price-feeds/${feed.asset_type.toLowerCase()}-${feed.base.toLowerCase()}-${feed.quote_currency.toLowerCase()}?cluster=solana-mainnet-beta` } return '' } From 5ab5ee01e7883ae3d26e3e52dc13c81fdeb1a2e3 Mon Sep 17 00:00:00 2001 From: Daniel Kelleher Date: Tue, 12 Dec 2023 12:29:30 +0100 Subject: [PATCH 39/43] Chore/civic profile lib upgrade (#1971) --- components/Profile/useProfile.ts | 9 +- package.json | 4 +- .../instructions/Identity/AddKeyToDID.tsx | 2 +- yarn.lock | 326 +++++++----------- 4 files changed, 136 insertions(+), 205 deletions(-) diff --git a/components/Profile/useProfile.ts b/components/Profile/useProfile.ts index eff4025801..7c07b85e96 100644 --- a/components/Profile/useProfile.ts +++ b/components/Profile/useProfile.ts @@ -16,11 +16,10 @@ const getProfile = async ( ): Promise => { const cached = profiles.get(publicKey.toBase58()); if (cached) return cached; - const promise = CivicProfile.get(publicKey.toBase58(), { - solana: { - connection, - }, - }); + + const options = connection ? { solana: { connection } } : undefined; + + const promise = CivicProfile.get(publicKey.toBase58(), options); profiles.set(publicKey.toBase58(), promise) diff --git a/package.json b/package.json index d0ad5e67d4..21475bb481 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,7 @@ "@bonfida/spl-name-service": "0.1.47", "@bundlr-network/client": "0.7.15", "@carbon/icons-react": "11.7.0", - "@civic/profile": "0.1.2", + "@civic/profile": "^0.5.0-beta.1", "@civic/solana-gateway-react": "0.15.0", "@coral-xyz/anchor": "0.27.0", "@coral-xyz/borsh": "0.27.0", @@ -54,7 +54,7 @@ "@helium/voter-stake-registry-sdk": "0.0.44", "@heroicons/react": "1.0.6", "@hookform/resolvers": "2.8.10", - "@identity.com/sol-did-client": "3.1.4", + "@identity.com/sol-did-client": "3.3.0", "@marinade.finance/marinade-ts-sdk": "2.0.9", "@mean-dao/payment-streaming": "4.0.3", "@metaplex-foundation/js": "0.19.4", diff --git a/pages/dao/[symbol]/proposal/components/instructions/Identity/AddKeyToDID.tsx b/pages/dao/[symbol]/proposal/components/instructions/Identity/AddKeyToDID.tsx index 5f31176b1a..6ce7aef750 100644 --- a/pages/dao/[symbol]/proposal/components/instructions/Identity/AddKeyToDID.tsx +++ b/pages/dao/[symbol]/proposal/components/instructions/Identity/AddKeyToDID.tsx @@ -70,7 +70,7 @@ const AddKeyToDID = ({ .addVerificationMethod({ flags: [BitwiseVerificationMethodFlag.CapabilityInvocation], fragment: form!.alias, - keyData: new PublicKey(form!.key).toBytes(), + keyData: new PublicKey(form!.key).toBuffer(), // TODO support eth keys too methodType: VerificationMethodType.Ed25519VerificationKey2018, }) diff --git a/yarn.lock b/yarn.lock index a968aa4983..3b6d240a8e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -404,7 +404,7 @@ borsh "^0.6.0" bs58 "4.0.1" -"@bonfida/spl-name-service@0.1.47", "@bonfida/spl-name-service@^0.1.24", "@bonfida/spl-name-service@^0.1.50": +"@bonfida/spl-name-service@0.1.47", "@bonfida/spl-name-service@^0.1.24", "@bonfida/spl-name-service@^1.0.6": version "0.1.47" resolved "https://registry.yarnpkg.com/@bonfida/spl-name-service/-/spl-name-service-0.1.47.tgz#bb5b22ccbbb3135d70f2fa3e7bbfaee0c2c7f3dc" integrity sha512-BQrdvWm27KJowPvCuWmDWNC4vtYOnBNK9i+PFzfhKAMxa0X58DYpmk7ZSQDr4/EklAK8aR2noUMfvBInlsIfgg== @@ -623,32 +623,45 @@ styled-components "^5.3.1" uuid "^9.0.0" -"@civic/lexi@0.0.10": - version "0.0.10" - resolved "https://registry.yarnpkg.com/@civic/lexi/-/lexi-0.0.10.tgz#77066df36e8c78cf88a9ee50fc8cb1bbec9d987e" - integrity sha512-TxscOBzV29s+onZTrKbcZZErYgpXCH2syFVJzSWl/WYmE9LNNCU/p4dvTAlaQdSH7cDYEFu7d7zqyyVUMY1Vtw== +"@civic/did-registry@0.0.6-alpha.2": + version "0.0.6-alpha.2" + resolved "https://registry.yarnpkg.com/@civic/did-registry/-/did-registry-0.0.6-alpha.2.tgz#6d2ee70a8d784194978c99c3387072f63503be4d" + integrity sha512-5s60RIElhcOSjhJxmAs5Squ5aCdMN1XqphT9xs8TTMXgz83E06eEKgm03yTF01Trrq/3P4opUFMdhKJLq/8Wzg== dependencies: - "@stablelib/base64" "^1.0.1" - "@stablelib/utf8" "^1.0.1" - axios "^0.26.1" - bs58 "^5.0.0" - did-jwt "git+https://github.com/civicteam/did-jwt" - did-resolver "^3.2.0" - ed2curve-esm "^0.3.0-alpha-1" - tweetnacl "^1.0.3" + "@identity.com/sol-did-client" "^3.1.4" + "@project-serum/anchor" "^0.25.0" -"@civic/profile@0.1.2": - version "0.1.2" - resolved "https://registry.yarnpkg.com/@civic/profile/-/profile-0.1.2.tgz#a529a2fb7205098c4137efdc8ef4aaa3e0dd19c8" - integrity sha512-gtP5rseTKXOtnhSVoObp2w5ZyVGiFvyjrgnjgA8OZWa8ul0YEfwPi2NQgIHQZvWLR1zexmzPpVF7VlRFJg2nYA== - dependencies: - "@bonfida/spl-name-service" "^0.1.50" - "@civic/storage" "^0.1.14" - "@identity.com/sol-did-client" "^3.1.2" - "@identity.com/solana-gateway-ts" "^0.9.0-beta.1" - "@solana/web3.js" "^1.48.0" +"@civic/identity-store-client@*": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@civic/identity-store-client/-/identity-store-client-0.1.1.tgz#7d42e170c45e18fa6188f6ddb3940a6417c64e13" + integrity sha512-2F3v4/BYngAZmAW06QjPyFFk5eM4Nr0rcF+3h6ODCLgM3WileeHZqdGNkqjOoA97zeO6nDHOaClgYHSVg3xxgA== + dependencies: + isomorphic-fetch "^3.0.0" + querystring "^0.2.1" + +"@civic/pkh-did-resolver@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@civic/pkh-did-resolver/-/pkh-did-resolver-1.2.0.tgz#c3b396913ed19446c248c847ee42b0e3e4607f0b" + integrity sha512-UVZHrEDeVg4c/fVNGtvHZhty6ab24WzaCFwfuFXvsg94jN9qDKFrAyuKudfc2Ner12CVbpbOXAKscbcHvEJVMg== + dependencies: + caip "~1.1.0" + +"@civic/profile@^0.5.0-beta.1": + version "0.5.0-beta.1" + resolved "https://registry.yarnpkg.com/@civic/profile/-/profile-0.5.0-beta.1.tgz#8caf4e575a682c4dcc47237310642ee8896463ea" + integrity sha512-NdWUcxu0/ecdVJoHVbVP2sSY+1nqV4uuEAYyfrIFfp9x6EiJZoXnxl73cNa22NKThCumSURTkAoiW3cs2q7bMg== + dependencies: + "@bonfida/spl-name-service" "^1.0.6" + "@civic/did-registry" "0.0.6-alpha.2" + "@civic/identity-store-client" "*" + "@civic/pkh-did-resolver" "^1.2.0" + "@civic/storage-adapter" "*" + "@ethersproject/address" "^5.7.0" + "@ethersproject/providers" "^5.7.2" + "@solana/web3.js" "^1.87.6" + axios "^1.3.6" did-resolver "^3.2.0" - ramda "^0.28.0" + ramda "^0.29.0" "@civic/solana-gateway-react@0.15.0": version "0.15.0" @@ -661,23 +674,12 @@ "@solana/web3.js" "^1.73.0" ramda "^0.28.0" -"@civic/storage@^0.1.14": - version "0.1.15" - resolved "https://registry.yarnpkg.com/@civic/storage/-/storage-0.1.15.tgz#9c888d2bfdb1bb64dc5e4c24e8b0c0053bf6fcef" - integrity sha512-5gQSjEIeV9rAv4eCY3bOe5ooiNUiSs8XlB13pCRVErdSPkQxPm//xhbp6aefgR/o8/KsPB7vGH5HuKudOnbJDg== +"@civic/storage-adapter@*": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@civic/storage-adapter/-/storage-adapter-0.1.0.tgz#92a966958a3745aac79832928f51cc08cf2d7448" + integrity sha512-wP2uYnSvs6rvfbzqpDvIF12XyEuMqXfCMlt8iDnPa2FQ791K9uz/F1xnUE/bPTM1DtK8R1KTjQgpF6Ihyq1jxQ== dependencies: - "@civic/lexi" "0.0.10" - "@identity.com/sol-did-client" "^3.1.2" - "@solana/web3.js" "^1.30.2" - axios "^0.26.1" - did-resolver "^3.2.2" - graceful-fs "^4.2.10" - jsonpath "^1.1.1" - jsonschema "^1.4.0" - multiformats "^9.7.1" - node-localstorage "^2.2.1" - ramda "^0.28.0" - tweetnacl "^1.0.3" + ajv "^8.12.0" "@coral-xyz/anchor@0.26.0", "@coral-xyz/anchor@^0.26.0": version "0.26.0" @@ -1254,7 +1256,7 @@ dependencies: "@ethersproject/logger" "^5.7.0" -"@ethersproject/providers@5.7.2": +"@ethersproject/providers@5.7.2", "@ethersproject/providers@^5.7.2": version "5.7.2" resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.7.2.tgz#f8b1a4f275d7ce58cf0a2eec222269a08beb18cb" integrity sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg== @@ -1594,16 +1596,16 @@ did-resolver "^3.0.1" ramda "^0.27.1" -"@identity.com/sol-did-client@3.1.4", "@identity.com/sol-did-client@^3.1.2": - version "3.1.4" - resolved "https://registry.yarnpkg.com/@identity.com/sol-did-client/-/sol-did-client-3.1.4.tgz#8902329ce0aaa09fd18c4d6d4da394a45006ca81" - integrity sha512-DRzSi3SlFm71+9MIguHN/1oM459StW1QENHLQaxBF03rKMu1M62IYZEbryjrr9S3WzUkgQXph6G3tPuq/gXGUw== +"@identity.com/sol-did-client@3.3.0", "@identity.com/sol-did-client@^3.1.4": + version "3.3.0" + resolved "https://registry.yarnpkg.com/@identity.com/sol-did-client/-/sol-did-client-3.3.0.tgz#05df2f37d0d4c19b4eeeacde7842f552b0c5d0a2" + integrity sha512-v/hPHocEG0eaWyOUvLIMcl8+EDVXNFxX4EHInn/UsFpTrjg73ZIcPTEylWlRBF4mvBf1Qt7CuV60jK6H36GfNQ== dependencies: "@ethersproject/address" "^5.7.0" "@ethersproject/bytes" "^5.7.0" "@identity.com/sol-did-client-legacy" "^2.0.4" "@identity.com/sol-did-idl" "^3.1.0" - "@project-serum/anchor" "0.25.0" + "@project-serum/anchor" "0.26.0" "@solana/web3.js" "^1.59.1" bs58 "^5.0.0" did-resolver "^3.2.2" @@ -1625,18 +1627,6 @@ bs58 "^5.0.0" ramda "^0.27.1" -"@identity.com/solana-gateway-ts@^0.9.0-beta.1": - version "0.9.0" - resolved "https://registry.yarnpkg.com/@identity.com/solana-gateway-ts/-/solana-gateway-ts-0.9.0.tgz#23ce316f1cfd3b30e84bde31079de53e81f26c8f" - integrity sha512-aTq3TOth5KF9Nfw64XxDHFOqyhXlpzp1L/WpeOsmYlVIMdtgIvJFZEJMix4Q6Tr7BXzVXHAfXr5VVwkGOp4t1A== - dependencies: - "@solana/web3.js" "^1.63.0" - async-retry "^1.3.3" - bn.js "^5.2.0" - borsh "^0.4.0" - bs58 "^5.0.0" - ramda "^0.27.1" - "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" @@ -2752,18 +2742,18 @@ snake-case "^3.0.4" toml "^3.0.0" -"@project-serum/anchor@0.25.0", "@project-serum/anchor@^0.25.0": - version "0.25.0" - resolved "https://registry.yarnpkg.com/@project-serum/anchor/-/anchor-0.25.0.tgz#88ee4843336005cf5a64c80636ce626f0996f503" - integrity sha512-E6A5Y/ijqpfMJ5psJvbw0kVTzLZFUcOFgs6eSM2M2iWE1lVRF18T6hWZVNl6zqZsoz98jgnNHtVGJMs+ds9A7A== +"@project-serum/anchor@0.26.0": + version "0.26.0" + resolved "https://registry.yarnpkg.com/@project-serum/anchor/-/anchor-0.26.0.tgz#99e15a3923a5d10514f8185b2d3909e5699d60d5" + integrity sha512-Nq+COIjE1135T7qfnOHEn7E0q39bQTgXLFk837/rgFe6Hkew9WML7eHsS+lSYD2p3OJaTiUOHTAq1lHy36oIqQ== dependencies: - "@project-serum/borsh" "^0.2.5" - "@solana/web3.js" "^1.36.0" + "@coral-xyz/borsh" "^0.26.0" + "@solana/web3.js" "^1.68.0" base64-js "^1.5.1" bn.js "^5.1.2" bs58 "^4.0.1" buffer-layout "^1.2.2" - camelcase "^5.3.1" + camelcase "^6.3.0" cross-fetch "^3.1.5" crypto-hash "^1.3.0" eventemitter3 "^4.0.7" @@ -2834,6 +2824,27 @@ snake-case "^3.0.4" toml "^3.0.0" +"@project-serum/anchor@^0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@project-serum/anchor/-/anchor-0.25.0.tgz#88ee4843336005cf5a64c80636ce626f0996f503" + integrity sha512-E6A5Y/ijqpfMJ5psJvbw0kVTzLZFUcOFgs6eSM2M2iWE1lVRF18T6hWZVNl6zqZsoz98jgnNHtVGJMs+ds9A7A== + dependencies: + "@project-serum/borsh" "^0.2.5" + "@solana/web3.js" "^1.36.0" + base64-js "^1.5.1" + bn.js "^5.1.2" + bs58 "^4.0.1" + buffer-layout "^1.2.2" + camelcase "^5.3.1" + cross-fetch "^3.1.5" + crypto-hash "^1.3.0" + eventemitter3 "^4.0.7" + js-sha256 "^0.9.0" + pako "^2.0.3" + snake-case "^3.0.4" + superstruct "^0.15.4" + toml "^3.0.0" + "@project-serum/associated-token@^0.1.1": version "0.1.1" resolved "https://registry.yarnpkg.com/@project-serum/associated-token/-/associated-token-0.1.1.tgz#9acf745e84dad21e2ea26e06694704b9d698e532" @@ -4672,7 +4683,7 @@ "@wallet-standard/app" "^1.0.1" "@wallet-standard/base" "^1.0.1" -"@solana/web3.js@1.56.0", "@solana/web3.js@1.73.3", "@solana/web3.js@^1.17.0", "@solana/web3.js@^1.21.0", "@solana/web3.js@^1.22.0", "@solana/web3.js@^1.30.2", "@solana/web3.js@^1.31.0", "@solana/web3.js@^1.32.0", "@solana/web3.js@^1.35.1", "@solana/web3.js@^1.36.0", "@solana/web3.js@^1.37.1", "@solana/web3.js@^1.43.4", "@solana/web3.js@^1.44.3", "@solana/web3.js@^1.48.0", "@solana/web3.js@^1.50.1", "@solana/web3.js@^1.56.2", "@solana/web3.js@^1.59.1", "@solana/web3.js@^1.63.0", "@solana/web3.js@^1.63.1", "@solana/web3.js@^1.66.2", "@solana/web3.js@^1.68.0", "@solana/web3.js@^1.73.0", "@solana/web3.js@^1.73.2", "@solana/web3.js@^1.77.3", "@solana/web3.js@^1.78.2", "@solana/web3.js@^1.78.3": +"@solana/web3.js@1.56.0", "@solana/web3.js@1.73.3", "@solana/web3.js@^1.17.0", "@solana/web3.js@^1.21.0", "@solana/web3.js@^1.22.0", "@solana/web3.js@^1.30.2", "@solana/web3.js@^1.31.0", "@solana/web3.js@^1.32.0", "@solana/web3.js@^1.35.1", "@solana/web3.js@^1.36.0", "@solana/web3.js@^1.37.1", "@solana/web3.js@^1.43.4", "@solana/web3.js@^1.44.3", "@solana/web3.js@^1.50.1", "@solana/web3.js@^1.56.2", "@solana/web3.js@^1.59.1", "@solana/web3.js@^1.63.0", "@solana/web3.js@^1.63.1", "@solana/web3.js@^1.66.2", "@solana/web3.js@^1.68.0", "@solana/web3.js@^1.73.0", "@solana/web3.js@^1.73.2", "@solana/web3.js@^1.77.3", "@solana/web3.js@^1.78.2", "@solana/web3.js@^1.78.3", "@solana/web3.js@^1.87.6": version "1.73.3" resolved "https://registry.yarnpkg.com/@solana/web3.js/-/web3.js-1.73.3.tgz#60e6bd68f6f364d4be360b1e0a03a0a68468a029" integrity sha512-vHRMo589XEIpoujpE2sZZ1aMZvfA1ImKfNxobzEFyMb+H5j6mRRUXfdgWD0qJ0sm11e5BcBC7HPeRXJB+7f3Lg== @@ -4752,7 +4763,7 @@ resolved "https://registry.yarnpkg.com/@stablelib/bytes/-/bytes-1.0.1.tgz#0f4aa7b03df3080b878c7dea927d01f42d6a20d8" integrity sha512-Kre4Y4kdwuqL8BR2E9hV/R5sOrUj6NanZaZis0V6lX5yzqC3hBuVSDXUIBqQv/sCpmuWRiHLwqiT1pqqjuBXoQ== -"@stablelib/chacha20poly1305@1.0.1", "@stablelib/chacha20poly1305@^1.0.1": +"@stablelib/chacha20poly1305@1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@stablelib/chacha20poly1305/-/chacha20poly1305-1.0.1.tgz#de6b18e283a9cb9b7530d8767f99cde1fec4c2ee" integrity sha512-MmViqnqHd1ymwjOQfghRKw2R/jMIGT3wySN7cthjXCBdO+qErNPUBnRzqNpnvIwg7JBCg3LdeCZZO4de/yEhVA== @@ -4837,7 +4848,7 @@ "@stablelib/binary" "^1.0.1" "@stablelib/wipe" "^1.0.1" -"@stablelib/sha256@1.0.1", "@stablelib/sha256@^1.0.1": +"@stablelib/sha256@1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@stablelib/sha256/-/sha256-1.0.1.tgz#77b6675b67f9b0ea081d2e31bda4866297a3ae4f" integrity sha512-GIIH3e6KH+91FqGV42Kcj71Uefd/QEe7Dy42sBTeqppXV95ggCcxLTk39bEr+lZfJmp+ghsR07J++ORkRELsBQ== @@ -4855,17 +4866,12 @@ "@stablelib/hash" "^1.0.1" "@stablelib/wipe" "^1.0.1" -"@stablelib/utf8@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@stablelib/utf8/-/utf8-1.0.1.tgz#fd5e7ad353b7e3cd1ce85e49099360e57693cfd1" - integrity sha512-FrYD1xadah/TtAP6VJ04lDD5h9rdDj/d8wH/jMYTtHqZBv9z2btdvEU8vTxdjdkFmo1b/BH+t3R1wi/mYhCCNg== - "@stablelib/wipe@^1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@stablelib/wipe/-/wipe-1.0.1.tgz#d21401f1d59ade56a62e139462a97f104ed19a36" integrity sha512-WfqfX/eXGiAd3RJe4VU2snh/ZPwtSjLG4ynQ/vYzvghTh7dHFcI1wl+nrkWG6lGhukOxOsUHfv8dUXr58D0ayg== -"@stablelib/x25519@^1.0.2", "@stablelib/x25519@^1.0.3": +"@stablelib/x25519@^1.0.3": version "1.0.3" resolved "https://registry.yarnpkg.com/@stablelib/x25519/-/x25519-1.0.3.tgz#13c8174f774ea9f3e5e42213cbf9fc68a3c7b7fd" integrity sha512-KnTbKmUhPhHavzobclVJQG5kuivH+qDLpe84iRqX3CLrKp881cF160JvXJ+hjn1aMyCwYOKeIZefIH/P5cJoRw== @@ -4874,26 +4880,6 @@ "@stablelib/random" "^1.0.2" "@stablelib/wipe" "^1.0.1" -"@stablelib/xchacha20@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@stablelib/xchacha20/-/xchacha20-1.0.1.tgz#e98808d1f7d8b20e3ff37c71a3062a2a955d9a8c" - integrity sha512-1YkiZnFF4veUwBVhDnDYwo6EHeKzQK4FnLiO7ezCl/zu64uG0bCCAUROJaBkaLH+5BEsO3W7BTXTguMbSLlWSw== - dependencies: - "@stablelib/binary" "^1.0.1" - "@stablelib/chacha" "^1.0.1" - "@stablelib/wipe" "^1.0.1" - -"@stablelib/xchacha20poly1305@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@stablelib/xchacha20poly1305/-/xchacha20poly1305-1.0.1.tgz#addcaf30b92dd956f76b3357888e2f91b92e7a61" - integrity sha512-B1Abj0sMJ8h3HNmGnJ7vHBrAvxuNka6cJJoZ1ILN7iuacXp7sUYcgOVEOTLWj+rtQMpspY9tXSCRLPmN1mQNWg== - dependencies: - "@stablelib/aead" "^1.0.1" - "@stablelib/chacha20poly1305" "^1.0.1" - "@stablelib/constant-time" "^1.0.1" - "@stablelib/wipe" "^1.0.1" - "@stablelib/xchacha20" "^1.0.1" - "@strike-protocols/solana-wallet-adapter@^0.1.8": version "0.1.8" resolved "https://registry.yarnpkg.com/@strike-protocols/solana-wallet-adapter/-/solana-wallet-adapter-0.1.8.tgz#19cef6f1f7a81dfa838b990f48929c4f63b91218" @@ -6217,6 +6203,16 @@ ajv@^6.10.0, ajv@^6.12.3, ajv@^6.12.4: json-schema-traverse "^0.4.1" uri-js "^4.2.2" +ajv@^8.12.0: + version "8.12.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" + integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + algo-msgpack-with-bigint@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/algo-msgpack-with-bigint/-/algo-msgpack-with-bigint-2.1.1.tgz#38bb717220525b3ff42232eefdcd9efb9ad405d6" @@ -6590,7 +6586,7 @@ aws4@^1.8.0: resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== -axios@0.26.1, axios@^0.26.0, axios@^0.26.1: +axios@0.26.1, axios@^0.26.0: version "0.26.1" resolved "https://registry.yarnpkg.com/axios/-/axios-0.26.1.tgz#1ede41c51fcf51bbbd6fd43669caaa4f0495aaa9" integrity sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA== @@ -6635,6 +6631,15 @@ axios@^1.1.3, axios@^1.4.0: form-data "^4.0.0" proxy-from-env "^1.1.0" +axios@^1.3.6: + version "1.6.2" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.2.tgz#de67d42c755b571d3e698df1b6504cde9b0ee9f2" + integrity sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A== + dependencies: + follow-redirects "^1.15.0" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + babel-jest@^29.3.1: version "29.3.1" resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.3.1.tgz#05c83e0d128cd48c453eea851482a38782249f44" @@ -6768,11 +6773,6 @@ bech32@1.1.4: resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== -bech32@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/bech32/-/bech32-2.0.0.tgz#078d3686535075c8c79709f054b1b226a133b355" - integrity sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg== - big.js@^6.1.1, big.js@^6.2.1: version "6.2.1" resolved "https://registry.yarnpkg.com/big.js/-/big.js-6.2.1.tgz#7205ce763efb17c2e41f26f121c420c6a7c2744f" @@ -7126,6 +7126,11 @@ bytes@^3.0.0: resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== +caip@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/caip/-/caip-1.1.0.tgz#0ccd5bf1bff822459389ccec0a8555712a30c374" + integrity sha512-yOO3Fu4ygyKYAdznuoaqschMKIZzcdgyMpBNtrIfrUhnOeaOWG+dh0c13wcOS6B/46IGGbncoyzJlio79jU7rw== + call-bind@^1.0.0, call-bind@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" @@ -7164,11 +7169,6 @@ caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.300014 resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001439.tgz#ab7371faeb4adff4b74dad1718a6fd122e45d9cb" integrity sha512-1MgUzEkoMO6gKfXflStpYgZDlFM7M/ck/bgfVCACO5vnAf0fXoNVHdWtqGU+MYca+4bL9Z5bpOVmR33cWW9G2A== -canonicalize@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/canonicalize/-/canonicalize-1.0.8.tgz#24d1f1a00ed202faafd9bf8e63352cd4450c6df1" - integrity sha512-0CNTVCLZggSh7bc5VkX5WWPWO+cyZbNd07IHIsSXLia/eAq+r836hgk+8BKoEh7949Mda87VUOitx5OddVj64A== - capability@^0.2.5: version "0.2.5" resolved "https://registry.yarnpkg.com/capability/-/capability-0.2.5.tgz#51ad87353f1936ffd77f2f21c74633a4dea88801" @@ -8391,24 +8391,7 @@ detective@^5.2.0: defined "^1.0.0" minimist "^1.2.6" -"did-jwt@git+https://github.com/civicteam/did-jwt": - version "6.1.0" - resolved "git+https://github.com/civicteam/did-jwt#d4e318df78bd88e3127e62784915c7a334881eb6" - dependencies: - "@stablelib/ed25519" "^1.0.2" - "@stablelib/random" "^1.0.1" - "@stablelib/sha256" "^1.0.1" - "@stablelib/x25519" "^1.0.2" - "@stablelib/xchacha20poly1305" "^1.0.1" - bech32 "^2.0.0" - canonicalize "^1.0.8" - did-resolver "^3.1.5" - elliptic "^6.5.4" - js-sha3 "^0.8.0" - multiformats "^9.6.4" - uint8arrays "^3.0.0" - -did-resolver@^3.0.1, did-resolver@^3.1.5, did-resolver@^3.2.0, did-resolver@^3.2.2: +did-resolver@^3.0.1, did-resolver@^3.2.0, did-resolver@^3.2.2: version "3.2.2" resolved "https://registry.yarnpkg.com/did-resolver/-/did-resolver-3.2.2.tgz#6f4e252a810f785d1b28a10265fad6dffee25158" integrity sha512-Eeo2F524VM5N3W4GwglZrnul2y6TLTwMQP3In62JdG34NZoqihYyOZLk+5wUW8sSgvIYIcJM8Dlt3xsdKZZ3tg== @@ -8579,13 +8562,6 @@ ecc-jsbn@~0.1.1: jsbn "~0.1.0" safer-buffer "^2.1.0" -ed2curve-esm@^0.3.0-alpha-1: - version "0.3.0-alpha-1" - resolved "https://registry.yarnpkg.com/ed2curve-esm/-/ed2curve-esm-0.3.0-alpha-1.tgz#67a5722ea97976c3310aeaf0990a2b58ee383aef" - integrity sha512-Ydrqcf0NwKUBT4gL0Nnxp8/O5NG8iatN+/zbEgs/7eMGjgSVbgfE1YfWld2qYnoNIxOQvSWOFy5uBoaL3jCanw== - dependencies: - tweetnacl "^1.0.1" - ed2curve@0.3.0, ed2curve@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/ed2curve/-/ed2curve-0.3.0.tgz#322b575152a45305429d546b071823a93129a05d" @@ -8810,18 +8786,6 @@ escape-string-regexp@^5.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz#4683126b500b61762f2dbebace1806e8be31b1c8" integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw== -escodegen@^1.8.1: - version "1.14.3" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" - integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw== - dependencies: - esprima "^4.0.1" - estraverse "^4.2.0" - esutils "^2.0.2" - optionator "^0.8.1" - optionalDependencies: - source-map "~0.6.1" - escodegen@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" @@ -9005,11 +8969,6 @@ espree@^9.3.2, espree@^9.4.0: acorn-jsx "^5.3.2" eslint-visitor-keys "^3.3.0" -esprima@1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-1.2.2.tgz#76a0fd66fcfe154fd292667dc264019750b1657b" - integrity sha512-+JpPZam9w5DuJ3Q67SqsMGtiHKENSMRVoxvArfJZK01/BfLEObtZ6orJa/MtoGNR/rfMgp5837T41PAmTwAv/A== - esprima@^4.0.0, esprima@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" @@ -9029,7 +8988,7 @@ esrecurse@^4.3.0: dependencies: estraverse "^5.2.0" -estraverse@^4.1.1, estraverse@^4.2.0: +estraverse@^4.1.1: version "4.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== @@ -9741,7 +9700,7 @@ gopd@^1.0.1: dependencies: get-intrinsic "^1.1.3" -graceful-fs@^4.1.11, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.10, graceful-fs@^4.2.3, graceful-fs@^4.2.4, graceful-fs@^4.2.9: +graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.3, graceful-fs@^4.2.4, graceful-fs@^4.2.9: version "4.2.10" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== @@ -11009,6 +10968,11 @@ json-schema-traverse@^0.4.1: resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + json-schema@0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" @@ -11062,20 +11026,6 @@ jsonparse@^1.2.0: resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== -jsonpath@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/jsonpath/-/jsonpath-1.1.1.tgz#0ca1ed8fb65bb3309248cc9d5466d12d5b0b9901" - integrity sha512-l6Cg7jRpixfbgoWgkrl77dgEj8RPvND0wMH6TwQmi9Qs4TFfS9u5cUFnbeKTwj5ga5Y3BTGGNI28k117LJ009w== - dependencies: - esprima "1.2.2" - static-eval "2.0.2" - underscore "1.12.1" - -jsonschema@^1.4.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/jsonschema/-/jsonschema-1.4.1.tgz#cc4c3f0077fb4542982973d8a083b6b34f482dab" - integrity sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ== - jsprim@^1.2.2: version "1.4.2" resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.2.tgz#712c65533a15c878ba59e9ed5f0e26d5b77c5feb" @@ -12133,7 +12083,7 @@ ms@2.1.3, ms@^2.0.0, ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -multiformats@^9.4.2, multiformats@^9.6.4, multiformats@^9.7.1: +multiformats@^9.4.2, multiformats@^9.6.4: version "9.9.0" resolved "https://registry.yarnpkg.com/multiformats/-/multiformats-9.9.0.tgz#c68354e7d21037a8f1f8833c8ccd68618e8f1d37" integrity sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg== @@ -12347,13 +12297,6 @@ node-kraken-api@^2.2.2: bufferutil "^4.0.6" utf-8-validate "^5.0.9" -node-localstorage@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/node-localstorage/-/node-localstorage-2.2.1.tgz#869723550a4883e426cb391d2df0b563a51c7c1c" - integrity sha512-vv8fJuOUCCvSPjDjBLlMqYMHob4aGjkmrkaE42/mZr0VT+ZAU10jRF8oTnX9+pgU9/vYJ8P7YT3Vd6ajkmzSCw== - dependencies: - write-file-atomic "^1.1.4" - node-releases@^2.0.6: version "2.0.7" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.7.tgz#593edbc7c22860ee4d32d3933cfebdfab0c0e0e5" @@ -13435,6 +13378,11 @@ query-string@7.1.1: split-on-first "^1.0.0" strict-uri-encode "^2.0.0" +querystring@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.1.tgz#40d77615bb09d16902a85c3e38aa8b5ed761c2dd" + integrity sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg== + querystringify@^2.1.1: version "2.2.0" resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" @@ -13465,6 +13413,11 @@ ramda@^0.27.1: resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.27.2.tgz#84463226f7f36dc33592f6f4ed6374c48306c3f1" integrity sha512-SbiLPU40JuJniHexQSAgad32hfwd+DRUdwF2PlVuI5RZD0/vahUco7R8vD86J/tcEKKF9vZrUVwgtmGCqlCKyA== +ramda@^0.29.0: + version "0.29.1" + resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.29.1.tgz#408a6165b9555b7ba2fc62555804b6c5a2eca196" + integrity sha512-OfxIeWzd4xdUNxlWhgFazxsA/nl3mS4/jGZI5n00uWOoSSFRhC1b6gl6xvmzUamgmqELraWp0J/qqVlXYPDPyA== + randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" @@ -14012,6 +13965,11 @@ require-directory@^2.1.1: resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + require-main-filename@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" @@ -14420,11 +14378,6 @@ slice-ansi@0.0.4: resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" integrity sha512-up04hB2hR92PgjpyU3y/eg91yIBILyjVY26NvvciY3EVVPjybkMszMpXQ9QAkcS3I5rtJBDLoTxxg+qvW8c7rw== -slide@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" - integrity sha512-NwrtjCg+lZoqhFU8fOwl4ay2ei8PaqCBOUV3/ektPY9trO1yQ1oXEfmHAhKArUVUr/hOHvy5f6AdP17dCM0zMw== - snake-case@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-3.0.4.tgz#4f2bbd568e9935abdfd593f34c691dadb49c452c" @@ -14546,13 +14499,6 @@ stacktrace-parser@^0.1.10: dependencies: type-fest "^0.7.1" -static-eval@2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/static-eval/-/static-eval-2.0.2.tgz#2d1759306b1befa688938454c546b7871f806a42" - integrity sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg== - dependencies: - escodegen "^1.8.1" - "statuses@>= 1.5.0 < 2": version "1.5.0" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" @@ -15372,11 +15318,6 @@ unbox-primitive@^1.0.2: has-symbols "^1.0.3" which-boxed-primitive "^1.0.2" -underscore@1.12.1: - version "1.12.1" - resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.12.1.tgz#7bb8cc9b3d397e201cf8553336d262544ead829e" - integrity sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw== - unified@^10.0.0: version "10.1.2" resolved "https://registry.yarnpkg.com/unified/-/unified-10.1.2.tgz#b1d64e55dafe1f0b98bb6c719881103ecf6c86df" @@ -15861,15 +15802,6 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== -write-file-atomic@^1.1.4: - version "1.3.4" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-1.3.4.tgz#f807a4f0b1d9e913ae7a48112e6cc3af1991b45f" - integrity sha512-SdrHoC/yVBPpV0Xq/mUZQIpW2sWXAShb/V4pomcJXh92RuaO+f3UTWItiR3Px+pLnV2PvC2/bfn5cwr5X6Vfxw== - dependencies: - graceful-fs "^4.1.11" - imurmurhash "^0.1.4" - slide "^1.1.5" - write-file-atomic@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" From f3cbe28648d0bd4d4a247eb146f5fec2bfe47a83 Mon Sep 17 00:00:00 2001 From: Kirk Date: Tue, 12 Dec 2023 22:36:59 +0200 Subject: [PATCH 40/43] Update mainnet-beta.json (#1969) --- public/realms/mainnet-beta.json | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/public/realms/mainnet-beta.json b/public/realms/mainnet-beta.json index e5c7c550a8..e41a8a4b57 100644 --- a/public/realms/mainnet-beta.json +++ b/public/realms/mainnet-beta.json @@ -13,17 +13,29 @@ "shortDescription": "Cyborg Apes Society Mission DAO", "sortRank": -1000 }, + { + "symbol": "Frictionless", + "displayName": "Frictionless DAO", + "programId": "GovER5Lthms3bLBqWub97yVrMmEogzX7xNjdXpPPCVZw", + "realmId": "Hr6PtVoKHTZETmJtjiYu9YeAFCMNUkDTv4qQV2kdDF2C", + "ogImage": "https://shdw-drive.genesysgo.net/5nwi4maAZ3v3EwTJtcg9oFfenQUX7pb9ry4KuhyUSawK/frictionless_logo.png", + "github": "https://github.com/Grape-Labs", + "website": "https://governance.so/frictionless", + "twitter": "@grapeprotocol", + "discord": "@grapedao", + "shortDescription": "Frictionless is revolutionizing governance participation, bridging the gap between web2 and web3" + }, { "symbol": "GrapeUX", "displayName": "Grape UX", "programId": "GovER5Lthms3bLBqWub97yVrMmEogzX7xNjdXpPPCVZw", "realmId": "jtncbMzs2k3wypGiLBtM55ou3mFERpeZniH7V1Bq4zg", - "ogImage": "https://gizd7klcchftk5lmjgketydzoblxqeb2x4uacdle4q6ayhdety4q.arweave.net/MjI_qWIRyzV1bEmUSeB5cFd4EDq_KAENZOQ8DBxknjk?ext=png", + "ogImage": "https://shdw-drive.genesysgo.net/5nwi4maAZ3v3EwTJtcg9oFfenQUX7pb9ry4KuhyUSawK/UX_logo.png", "github": "https://github.com/Grape-Labs", "website": "https://governance.so/dao/jtncbMzs2k3wypGiLBtM55ou3mFERpeZniH7V1Bq4zg", "twitter": "@grapeprotocol", "discord": "@grapedao", - "shortDescription": "Grape UX DAO has early access to Grape Gvoernance and contributors provide feedback to quickly iterate and improve UX" + "shortDescription": "Grape UX DAO has early access to Grape Governance and contributors provide feedback to quickly iterate and improve UX" }, { "symbol": "CollabX", From f694fd48cac4696ea7b543f69e570125a464ba92 Mon Sep 17 00:00:00 2001 From: silas <95582913+silas-x@users.noreply.github.com> Date: Tue, 12 Dec 2023 21:41:30 +0000 Subject: [PATCH 41/43] Sec updates (#1950) --- .github/workflows/ci-main-tests.yml | 19 +-- components/App.tsx | 83 ++++++++--- .../EditForms/common/FieldIconPreview.tsx | 8 +- .../EditMetadata/EditForms/index.tsx | 5 +- hub/components/Hub/Gallery/index.tsx | 135 ++++++++++-------- package.json | 7 +- 6 files changed, 156 insertions(+), 101 deletions(-) diff --git a/.github/workflows/ci-main-tests.yml b/.github/workflows/ci-main-tests.yml index f1944c0358..e91d40665f 100644 --- a/.github/workflows/ci-main-tests.yml +++ b/.github/workflows/ci-main-tests.yml @@ -15,19 +15,14 @@ jobs: contents: read security-events: write - strategy: - fail-fast: false - matrix: - language: ['javascript'] - steps: - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Initialise CodeQL uses: github/codeql-action/init@v2 with: - languages: ${{ matrix.language }} + languages: 'javascript' - name: Run CodeQL uses: github/codeql-action/analyze@v2 @@ -37,7 +32,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 # Report all vulnerabilities GitHub security tab - name: Report on all vulnerabilities @@ -71,12 +66,12 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Setup Node - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: - node-version: lts/* + node-version: 18 cache: yarn - name: Cache dependencies @@ -86,7 +81,7 @@ jobs: key: ${{ runner.os }}-modules-${{ hashFiles('**/yarn.lock') }} - name: Install dependencies - run: yarn install --frozen-lockfile + run: yarn ci - name: Run tests run: yarn test-all diff --git a/components/App.tsx b/components/App.tsx index 6a74061f91..ee5f389895 100644 --- a/components/App.tsx +++ b/components/App.tsx @@ -93,6 +93,13 @@ export function App(props: Props) { ) } +const allowedFaviconPaths = ['/realms/'] +const allowedDomains = [ + 'https://app.realms.today', + 'http://localhost', + 'http://localhost:3000', +] + export function AppContents(props: Props) { handleRouterHistory() useVotingPlugins() @@ -113,7 +120,7 @@ export function AppContents(props: Props) { const vsrClient = useVotePluginsClientStore((s) => s.state.vsrClient) const router = useRouter() - const { cluster, symbol } = router.query + const { cluster } = router.query const updateSerumGovAccounts = useSerumGovStore( (s) => s.actions.updateSerumGovAccounts ) @@ -124,26 +131,62 @@ export function AppContents(props: Props) { // Note: ?v==${Date.now()} is added to the url to force favicon refresh. // Without it browsers would cache the last used and won't change it for different realms // https://stackoverflow.com/questions/2208933/how-do-i-force-a-favicon-refresh - const faviconUrl = useMemo( - () => - symbol && - tryParsePublicKey(symbol as string) === undefined && // don't try to use a custom favicon if this is a pubkey-based url - `/realms/${getResourcePathPart( - symbol as string - )}/favicon.ico?v=${Date.now()}`, - [symbol] - ) - // check if a file actually exists at faviconUrl - const { result: faviconExists } = useAsync( - async () => - faviconUrl - ? fetch(faviconUrl) - .then((response) => response.status === 200) - .catch(() => false) - : false, - [faviconUrl] - ) + const faviconUrl = useMemo(() => { + const symbol = router.query.symbol + + if (!symbol || tryParsePublicKey(symbol as string) !== undefined) { + return null + } + if (!isValidSymbol(symbol)) { + console.error('Invalid symbol') + return null + } + + const resourcePath = getResourcePathPart(symbol as string) + const fullUrl = `${ + window.location.origin + }/realms/${resourcePath}/favicon.ico?v=${Date.now()}` + + // Check if the domain is in the allow list + try { + const urlObject = new URL(fullUrl) + if (!allowedDomains.includes(urlObject.origin)) { + console.error('Domain not in allowed list') + return null + } + // Check if the path is in the allow list + if ( + !allowedFaviconPaths.some((path) => urlObject.pathname.startsWith(path)) + ) { + console.error('Path not in allowed list') + return null + } + + return urlObject.href + } catch (error) { + console.error('Invalid URL:', error) + return null + } + }, [router.query.symbol]) + + // Validate it's an ico file + function isValidSymbol(symbol) { + return typeof symbol === 'string' && symbol.trim() !== '' && /^[a-zA-Z0-9-_]+$/.test(symbol); + } + const { result: faviconExists } = useAsync(async () => { + if (!faviconUrl) { + return false + } + + try { + const response = await fetch(faviconUrl) + return response.status === 200 + } catch (error) { + console.error('Error fetching favicon:', error) + return false + } + }, [faviconUrl]) useEffect(() => { if ( diff --git a/hub/components/EditMetadata/EditForms/common/FieldIconPreview.tsx b/hub/components/EditMetadata/EditForms/common/FieldIconPreview.tsx index c5e87709b8..1038dc26e9 100644 --- a/hub/components/EditMetadata/EditForms/common/FieldIconPreview.tsx +++ b/hub/components/EditMetadata/EditForms/common/FieldIconPreview.tsx @@ -18,8 +18,10 @@ export function FieldIconPreview(props: Props) { useEffect(() => { setIsValid(true); }, [setIsValid, props.url]); - - if (props.url?.includes('www.youtube.com') && props.allowYoutube) { + if ( + props.url?.startsWith('youtube.com/') || + (props.url?.startsWith('youtu.be/') && props.allowYoutube) + ) { return (
diff --git a/hub/components/EditMetadata/EditForms/index.tsx b/hub/components/EditMetadata/EditForms/index.tsx index 2d7d7c1522..b84af1b6c2 100644 --- a/hub/components/EditMetadata/EditForms/index.tsx +++ b/hub/components/EditMetadata/EditForms/index.tsx @@ -134,7 +134,10 @@ async function enhanceData(data: Realm): Promise { newRealm.gallery = await Promise.all( newRealm.gallery.map(async (image) => { - if (image.url.includes('youtube.com')) { + if ( + image.url.startsWith('youtube.com/') || + image.url.startsWith('youtu.be/') + ) { return removeTypename({ ...image, height: 448, width: 800 }); } diff --git a/hub/components/Hub/Gallery/index.tsx b/hub/components/Hub/Gallery/index.tsx index 599ea608bd..4e7e6204ab 100644 --- a/hub/components/Hub/Gallery/index.tsx +++ b/hub/components/Hub/Gallery/index.tsx @@ -4,15 +4,21 @@ import * as AspectRatio from '@radix-ui/react-aspect-ratio'; import cx from '@hub/lib/cx'; export function getYoutubeEmbedUrl(url: string) { - const regExp = /^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?))\??v?=?([^#&?]*).*/; + if (!url.startsWith('youtube.com/') && !url.startsWith('youtu.be/')) { + return null; + } + + const regExp = /^(?:https?:\/\/)?(?:www\.)?(?:youtube\.com\/(?:[^\/\n\s]+\/\S+\/|(?:v|e(?:mbed)?)\/|\S*?[?&]v=)|youtu\.be\/)([a-zA-Z0-9_-]{11})/; const match = url.match(regExp); - const id = match && match[7].length == 11 ? match[7] : null; + + const id = match && /^[a-zA-Z0-9_-]{11}$/.test(match[1]) ? match[1] : null; if (id) { - return `https://www.youtube.com/embed/${id}`; + const safeId = encodeURIComponent(id); + return `https://www.youtube.com/embed/${safeId}`; } - return url; + return null; } interface Props { @@ -57,65 +63,68 @@ export function Gallery(props: Props) { width: props.items[0].width / 2, }} /> - {props.items.map((item, i) => ( -
- {item.url.includes('www.youtube.com') ? ( -
- -