From bf161ac3f63217098d71f1b10983aa86869967f6 Mon Sep 17 00:00:00 2001 From: microwavedcola1 Date: Sun, 3 Apr 2022 06:00:30 +0200 Subject: [PATCH] stub oracle Signed-off-by: microwavedcola1 --- ts/example.ts | 20 ++++++++++++-------- ts/instructions.ts | 25 +++++++++++++++++-------- ts/mango_v4.ts | 8 ++++++++ ts/types.ts | 34 ++++++++++++++++++++++++++++++++++ 4 files changed, 71 insertions(+), 16 deletions(-) diff --git a/ts/example.ts b/ts/example.ts index ee9de61e6..b42d5dcf8 100644 --- a/ts/example.ts +++ b/ts/example.ts @@ -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', getBankForGroupAndMint, diff --git a/ts/instructions.ts b/ts/instructions.ts index 4bc2d4fd8..b6879dfc3 100644 --- a/ts/instructions.ts +++ b/ts/instructions.ts @@ -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 { 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 { +): Promise { 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)); } diff --git a/ts/mango_v4.ts b/ts/mango_v4.ts index 37c5a04c7..59cd019a5 100644 --- a/ts/mango_v4.ts +++ b/ts/mango_v4.ts @@ -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": { diff --git a/ts/types.ts b/ts/types.ts index 66c13ab48..98c740cba 100644 --- a/ts/types.ts +++ b/ts/types.ts @@ -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(); + } +}