Skip to content

Commit

Permalink
implement with mint with mercurial vault (#145)
Browse files Browse the repository at this point in the history
  • Loading branch information
Orelsanpls authored Oct 27, 2022
1 parent b3147a3 commit c7681b9
Show file tree
Hide file tree
Showing 7 changed files with 226 additions and 8 deletions.
50 changes: 49 additions & 1 deletion components/instructions/programs/uxdProtocol.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,62 @@ import { struct, u8, nu64, Layout } from 'buffer-layout';
import { AccountMetaData } from '@solana/spl-governance';
import { bool, u128, u64 } from '@project-serum/borsh';
import { INSURANCE_MINTS } from '@tools/sdk/uxdProtocol/uxdClient';
import { UXD_DECIMALS } from '@uxd-protocol/uxd-client';
import { nativeToUi, UXD_DECIMALS } from '@uxd-protocol/uxd-client';
import { nativeAmountToFormattedUiAmount } from '@tools/sdk/units';
import { BN } from '@project-serum/anchor';
import { tryGetTokenMint } from '@utils/tokens';
import { ANCHOR_DISCRIMINATOR_LAYOUT } from '@utils/helpers';
import { getSplTokenNameByMint } from '@utils/splTokens';

export const UXD_PROGRAM_INSTRUCTIONS = {
UXD8m9cvwk4RcSxnX2HZ9VudQCEeDH6fRnB4CAP57Dr: {
228: {
name: 'UXD - Mint with Mercurial Vault Depository',
accounts: [
'User',
'Payer',
'Controller',
'Depository',
'Redeemable mint',
'User redeemable',
'Collateral mint',
'User collateral',
'Depository LP token vault',
'Mercurial vault',
'Mercurial vault lp mint',
'Mercurial vault collateral token_safe',
'Mercurial vault program',
'System program',
'Token program',
],
getDataUI: (
_connection: Connection,
data: Uint8Array,
accounts: AccountMetaData[],
) => {
const dataLayout = struct([
u8('instruction'),
...ANCHOR_DISCRIMINATOR_LAYOUT,
nu64('collateralAmount'),
]);

const { collateralAmount } = dataLayout.decode(
Buffer.from(data),
) as any;

const collateralMintName = getSplTokenNameByMint(accounts[6].pubkey);

return (
<>
<p>{`native collateral amount: ${nativeToUi(
collateralAmount,
6,
).toLocaleString()}`}</p>
<p>Collateral mint: {collateralMintName}</p>
</>
);
},
},
216: {
name: 'UXD - Set Mango Depository Quote Mint and Redeem Soft Cap',
accounts: ['Authority', 'Controller'],
Expand Down
6 changes: 6 additions & 0 deletions hooks/useGovernanceAssets.ts
Original file line number Diff line number Diff line change
Expand Up @@ -484,6 +484,12 @@ export default function useGovernanceAssets() {
packageId: PackageEnum.UXD,
tag: 'beta',
},
[InstructionEnum.UXDMintWithMercurialVaultDepository]: {
name: 'Mint with Mercurial Vault Depository',
isVisible: canUseAnyInstruction,
packageId: PackageEnum.UXD,
tag: 'beta',
},
[InstructionEnum.UXDSetMangoDepositoryQuoteMintAndRedeemFee]: {
name: 'Set Mango Depository Quote Mint And Redeem Fee',
isVisible: canUseAnyInstruction,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ import UXDRegisterMercurialVaultDepository from './UXD/RegisterMercurialVaultDep
import UXDEditMercurialVaultDepository from './UXD/EditMercurialVaultDepository';
import UXDEditController from './UXD/EditController';
import UXDEditMangoDepository from './UXD/EditMangoDepository';
import UXDMintWithMercurialVaultDepository from './UXD/MintWithMercurialVaultDepository';
import UXDDisableDepositoryMinting from './UXD/DisableDepositoryMinting';
import UXDQuoteMintWithMangoDepository from './UXD/QuoteMintWithMangoDepository';
import UXDQuoteRedeemWithMangoDepository from './UXD/QuoteRedeemWithMangoDepository';
Expand Down Expand Up @@ -295,6 +296,13 @@ const SelectedInstruction = ({
governedAccount={governedAccount}
/>
);
case InstructionEnum.UXDMintWithMercurialVaultDepository:
return (
<UXDMintWithMercurialVaultDepository
index={index}
governedAccount={governedAccount}
/>
);
case InstructionEnum.UXDEditController:
return (
<UXDEditController index={index} governedAccount={governedAccount} />
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
import * as yup from 'yup';
import Select from '@components/inputs/Select';
import useInstructionFormBuilder from '@hooks/useInstructionFormBuilder';
import { getDepositoryMintSymbols } from '@tools/sdk/uxdProtocol/uxdClient';
import { GovernedMultiTypeAccount } from '@utils/tokens';
import { UXDMintWithMercurialVaultDepositoryForm } from '@utils/uiTypes/proposalCreationTypes';
import SelectOptionList from '../../SelectOptionList';
import Input from '@components/inputs/Input';
import { PublicKey } from '@solana/web3.js';
import createMintWithMercurialVaultDepositoryInstruction from '@tools/sdk/uxdProtocol/createMintWithMercurialVaultDepositoryInstruction';

const schema = yup.object().shape({
governedAccount: yup
.object()
.nullable()
.required('Governance account is required'),
uxdProgram: yup.string().required('UXD Program address is required'),
collateralName: yup.string().required('Collateral Name address is required'),
uiCollateralAmount: yup
.number()
.moreThan(0, 'Collateral amount should be more than 0')
.required('Collateral Amount is required'),
});

const UXDMintWithMercurialVaultDepository = ({
index,
governedAccount,
}: {
index: number;
governedAccount?: GovernedMultiTypeAccount;
}) => {
const {
connection,
form,
formErrors,
handleSetForm,
} = useInstructionFormBuilder<UXDMintWithMercurialVaultDepositoryForm>({
index,
initialFormValues: {
governedAccount,
},
schema,
shouldSplitIntoSeparateTxs: true,
buildInstruction: async function ({ form, governedAccountPubkey, wallet }) {
return createMintWithMercurialVaultDepositoryInstruction({
connection,
uxdProgramId: new PublicKey(form.uxdProgram!),
authority: governedAccountPubkey,
depositoryMintName: form.collateralName!,
collateralAmount: form.uiCollateralAmount!,
payer: wallet.publicKey!,
});
},
});

return (
<>
<Input
label="UXD Program"
value={form.uxdProgram}
type="string"
onChange={(evt) =>
handleSetForm({
value: evt.target.value,
propertyName: 'uxdProgram',
})
}
error={formErrors['uxdProgram']}
/>

<Select
label="Collateral Name"
value={form.collateralName}
placeholder="Please select..."
onChange={(value) =>
handleSetForm({ value, propertyName: 'collateralName' })
}
error={formErrors['collateralName']}
>
<SelectOptionList list={getDepositoryMintSymbols(connection.cluster)} />
</Select>

<Input
label="Collateral Amount"
value={form.uiCollateralAmount}
type="number"
min={0}
max={10 ** 12}
onChange={(evt) =>
handleSetForm({
value: evt.target.value,
propertyName: 'uiCollateralAmount',
})
}
error={formErrors['uiCollateralAmount']}
/>
</>
);
};

export default UXDMintWithMercurialVaultDepository;
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
import { Provider } from '@project-serum/anchor';
import { TransactionInstruction, PublicKey } from '@solana/web3.js';
import {
Controller,
MercurialVaultDepository,
UXD_DECIMALS,
} from '@uxd-protocol/uxd-client';
import type { ConnectionContext } from 'utils/connection';
import { uxdClient, getDepositoryMintInfo } from './uxdClient';

const createMintWithMercurialVaultDepositoryInstruction = async ({
connection,
uxdProgramId,
authority,
depositoryMintName,
collateralAmount,
payer,
}: {
connection: ConnectionContext;
uxdProgramId: PublicKey;
authority: PublicKey;
depositoryMintName: string;
collateralAmount: number;
payer: PublicKey;
}): Promise<TransactionInstruction> => {
const {
address: collateralMint,
decimals: collateralDecimals,
} = getDepositoryMintInfo(connection.cluster, depositoryMintName);

const client = uxdClient(uxdProgramId);

const depository = await MercurialVaultDepository.initialize({
connection: connection.current,
collateralMint: {
mint: collateralMint,
name: depositoryMintName,
symbol: depositoryMintName,
decimals: collateralDecimals,
},
uxdProgramId,
});

return client.createMintWithMercurialVaultDepositoryInstruction(
new Controller('UXD', UXD_DECIMALS, uxdProgramId),
depository,
authority,
collateralAmount,
Provider.defaultOptions(),
payer,
);
};

export default createMintWithMercurialVaultDepositoryInstruction;
Original file line number Diff line number Diff line change
Expand Up @@ -34,13 +34,6 @@ const createRegisterMercurialVaultDepositoryInstruction = async ({

const client = uxdClient(uxdProgramId);

console.log('Register', {
mint: collateralMint.toBase58(),
name: depositoryMintName,
symbol: depositoryMintName,
decimals: collateralDecimals,
});

const depository = await MercurialVaultDepository.initialize({
connection: connection.current,
collateralMint: {
Expand Down
8 changes: 8 additions & 0 deletions utils/uiTypes/proposalCreationTypes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -266,6 +266,13 @@ export interface UXDWithdrawInsuranceFromMangoDepositoryForm {
insuranceWithdrawnAmount: number;
}

export interface UXDMintWithMercurialVaultDepositoryForm {
governedAccount?: GovernedMultiTypeAccount;
uxdProgram?: string;
collateralName?: string;
uiCollateralAmount?: number;
}

export interface UXDDisableDepositoryMintingForm {
governedAccount?: GovernedMultiTypeAccount;
collateralName?: string;
Expand Down Expand Up @@ -719,6 +726,7 @@ export enum InstructionEnum {
UXDEditMercurialVaultDepository,
UXDEditController,
UXDEditMangoDepository,
UXDMintWithMercurialVaultDepository,
UXDSetMangoDepositoryQuoteMintAndRedeemFee,
UXDSetMangoDepositoryQuoteMintAndRedeemSoftCap,
UXDStakingInitializeStakingCampaign,
Expand Down

1 comment on commit c7681b9

@vercel
Copy link

@vercel vercel bot commented on c7681b9 Oct 27, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please sign in to comment.