stub oracle
Signed-off-by: microwavedcola1 <microwavedcola@gmail.com>
This commit is contained in:
parent
9debc63a6a
commit
bf161ac3f6
|
@ -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,
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
|
|
|
@ -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": {
|
||||
|
|
34
ts/types.ts
34
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();
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue