stub oracle

Signed-off-by: microwavedcola1 <microwavedcola@gmail.com>
This commit is contained in:
microwavedcola1 2022-04-03 06:00:30 +02:00
parent 9debc63a6a
commit bf161ac3f6
4 changed files with 71 additions and 16 deletions

View File

@ -6,6 +6,7 @@ import { MangoClient } from './client';
import {
createGroup,
createMangoAccount,
createStubOracle,
deposit,
getBank,
getBankForGroupAndMint,
@ -13,6 +14,7 @@ import {
getMangoAccount,
getMangoAccountsForGroupAndOwner,
getSerum3MarketForBaseAndQuote,
getStubOracleForGroupAndMint,
registerToken,
serum3RegisterMarket,
withdraw,
@ -59,21 +61,18 @@ async function main() {
console.log(`Group ${group.publicKey}`);
//
// Find existing or register new tokens
// Find existing or register new oracles
//
// TODO: replace with 4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU,
// see https://developers.circle.com/docs/usdc-on-testnet#usdc-on-solana-testnet
const usdcDevnetMint = new PublicKey(
'8FRFC6MoGGkMFQwngccyu69VnYbzykGeez7ignHVAFSN',
);
const usdcDevnetStubOracle = await findOrCreate(
'stubOracle',
getGroupForAdmin,
[adminClient, admin.publicKey],
createGroup,
[adminClient, admin.publicKey, payer],
getStubOracleForGroupAndMint,
[adminClient, group.publicKey, usdcDevnetMint],
createStubOracle,
[adminClient, group.publicKey, admin.publicKey, usdcDevnetMint, payer, 1],
);
console.log(`Group ${group.publicKey}`);
const btcDevnetMint = new PublicKey(
'3UNBZ6o52WTWwjac2kPUb4FyodhU1vFkRJheu1Sh2TvU',
);
@ -81,6 +80,11 @@ async function main() {
'HovQMDrbAgAYPCmHVSrezcSmkMtXSSUsLDFANExrZh2J',
);
//
// Find existing or register new tokens
//
// TODO: replace with 4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU,
// see https://developers.circle.com/docs/usdc-on-testnet#usdc-on-solana-testnet
const btcBank = await findOrCreate<Bank>(
'bank',
getBankForGroupAndMint,

View File

@ -8,7 +8,7 @@ import {
} from '@solana/web3.js';
import * as bs58 from 'bs58';
import { MangoClient } from './client';
import { Bank, Group, MangoAccount, Serum3Market } from './types';
import { Bank, Group, MangoAccount, Serum3Market, StubOracle } from './types';
import { I80F48 } from './I80F48';
//
@ -481,6 +481,8 @@ export async function getSerum3MarketForBaseAndQuote(
export async function createStubOracle(
client: MangoClient,
groupPk: PublicKey,
adminPk: PublicKey,
tokenMintPk: PublicKey,
payer: Keypair,
staticPrice: number,
@ -488,6 +490,8 @@ export async function createStubOracle(
return await client.program.methods
.createStubOracle({ val: I80F48.fromNumber(staticPrice).getData() })
.accounts({
group: groupPk,
admin: adminPk,
tokenMint: tokenMintPk,
payer: payer.publicKey,
})
@ -497,13 +501,17 @@ export async function createStubOracle(
export async function setStubOracle(
client: MangoClient,
groupPk: PublicKey,
adminPk: PublicKey,
tokenMintPk: PublicKey,
payer: Keypair,
staticPrice: number,
): Promise<void> {
return await client.program.methods
.setStubOracle({ val: I80F48.fromNumber(staticPrice).getData() })
.setStubOracle({ val: new BN(staticPrice) })
.accounts({
group: groupPk,
admin: adminPk,
tokenMint: tokenMintPk,
payer: payer.publicKey,
})
@ -511,24 +519,25 @@ export async function setStubOracle(
.rpc();
}
export async function getStubOracleForMint(
export async function getStubOracleForGroupAndMint(
client: MangoClient,
groupPk: PublicKey,
mintPk: PublicKey,
): Promise<MangoAccount[]> {
): Promise<StubOracle[]> {
return (
await client.program.account.mangoAccount.all([
await client.program.account.stubOracle.all([
{
memcmp: {
bytes: group.toBase58(),
bytes: groupPk.toBase58(),
offset: 8,
},
},
{
memcmp: {
bytes: ownerPk.toBase58(),
bytes: mintPk.toBase58(),
offset: 40,
},
},
])
).map((pa) => MangoAccount.from(pa.publicKey, pa.account));
).map((pa) => StubOracle.from(pa.publicKey, pa.account));
}

View File

@ -1608,6 +1608,10 @@ export type MangoV4 = {
"name": "group",
"type": "publicKey"
},
{
"name": "mint",
"type": "publicKey"
},
{
"name": "price",
"type": {
@ -3998,6 +4002,10 @@ export const IDL: MangoV4 = {
"name": "group",
"type": "publicKey"
},
{
"name": "mint",
"type": "publicKey"
},
{
"name": "price",
"type": {

View File

@ -211,3 +211,37 @@ export class Serum3Market {
public quoteTokenIndex: number,
) {}
}
export class StubOracle {
public price: I80F48;
public lastUpdated: number;
static from(
publicKey: PublicKey,
obj: {
group: PublicKey;
mint: PublicKey;
price: I80F48Dto;
lastUpdated: BN;
reserved: unknown;
},
): StubOracle {
return new StubOracle(
publicKey,
obj.group,
obj.mint,
obj.price,
obj.lastUpdated,
);
}
constructor(
public publicKey: PublicKey,
public group: PublicKey,
public mint: PublicKey,
price: I80F48Dto,
lastUpdated: BN,
) {
this.price = I80F48.from(price);
this.lastUpdated = lastUpdated.toNumber();
}
}