diff --git a/ts/accounts/types/serum3.ts b/ts/accounts/types/serum3.ts index f89e10ac2..84a2d8029 100644 --- a/ts/accounts/types/serum3.ts +++ b/ts/accounts/types/serum3.ts @@ -45,6 +45,7 @@ export class Serum3Market { ) {} } +/** @deprecated */ export async function serum3RegisterMarket( client: MangoClient, groupPk: PublicKey, @@ -70,6 +71,7 @@ export async function serum3RegisterMarket( return await client.program.provider.send(tx); } +/** @deprecated */ export async function serum3RegisterMarketIx( client: MangoClient, groupPk: PublicKey, @@ -94,6 +96,7 @@ export async function serum3RegisterMarketIx( .instruction(); } +/** @deprecated */ export async function getSerum3MarketForBaseAndQuote( client: MangoClient, groupPk: PublicKey, diff --git a/ts/client.ts b/ts/client.ts index fe3bcb6ba..2687ef92a 100644 --- a/ts/client.ts +++ b/ts/client.ts @@ -6,11 +6,13 @@ import { SYSVAR_RENT_PUBKEY, TransactionSignature, } from '@solana/web3.js'; +import bs58 from 'bs58'; import { Bank, getMintInfoForTokenIndex } from './accounts/types/bank'; import { Group } from './accounts/types/group'; import { I80F48 } from './accounts/types/I80F48'; import { MangoAccount } from './accounts/types/mangoAccount'; import { StubOracle } from './accounts/types/oracle'; +import { Serum3Market } from './accounts/types/serum3'; import { IDL, MangoV4 } from './mango_v4'; export const MANGO_V4_ID = new PublicKey( @@ -254,6 +256,87 @@ export class MangoClient { .rpc(); } + // Serum + + public async serum3RegisterMarket( + group: Group, + serum3ProgramId: PublicKey, + serum3MarketExternalPk: PublicKey, + baseBank: Bank, + quoteBank: Bank, + marketIndex: number, + ): Promise { + return await this.program.methods + .serum3RegisterMarket(marketIndex) + .accounts({ + group: group.publicKey, + admin: this.program.provider.wallet.publicKey, + serumProgram: serum3ProgramId, + serumMarketExternal: serum3MarketExternalPk, + baseBank: baseBank.publicKey, + quoteBank: quoteBank.publicKey, + payer: this.program.provider.wallet.publicKey, + }) + .rpc(); + } + + public async serum3GetMarketForBaseAndQuote( + group: Group, + baseTokenIndex: number, + quoteTokenIndex: number, + ): Promise { + const bbuf = Buffer.alloc(2); + bbuf.writeUInt16LE(baseTokenIndex); + + const qbuf = Buffer.alloc(2); + qbuf.writeUInt16LE(quoteTokenIndex); + + const bumpfbuf = Buffer.alloc(1); + bumpfbuf.writeUInt8(255); + + return ( + await this.program.account.serum3Market.all([ + { + memcmp: { + bytes: group.publicKey.toBase58(), + offset: 8, + }, + }, + { + memcmp: { + bytes: bs58.encode(bbuf), + offset: 106, + }, + }, + { + memcmp: { + bytes: bs58.encode(qbuf), + offset: 108, + }, + }, + ]) + ).map((tuple) => Serum3Market.from(tuple.publicKey, tuple.account)); + } + + public async serum3CreateOpenOrders( + group: Group, + mangoAccount: MangoAccount, + serum3Market: Serum3Market, + ): Promise { + return await this.program.methods + .serum3CreateOpenOrders() + .accounts({ + group: group.publicKey, + account: mangoAccount.publicKey, + serumMarket: serum3Market.publicKey, + serumProgram: serum3Market.serumProgram, + serumMarketExternal: serum3Market.serumMarketExternal, + owner: this.program.provider.wallet.publicKey, + payer: this.program.provider.wallet.publicKey, + }) + .rpc(); + } + /// static static async connect( diff --git a/ts/example1-admin.ts b/ts/example1-admin.ts index 48a8385d2..7f975622c 100644 --- a/ts/example1-admin.ts +++ b/ts/example1-admin.ts @@ -66,6 +66,31 @@ async function main() { ); } + // register serum market + const serumProgramId = new PublicKey( + 'DESVgJVGajEgKGXhb6XmqDHGz3VjdgP7rEVESBgxmroY', + ); + const serumMarketExternalPk = new PublicKey( + 'DW83EpHFywBxCHmyARxwj3nzxJd7MUdSeznmrdzZKNZB', + ); + try { + } catch (error) { + await client.serum3RegisterMarket( + group, + serumProgramId, + serumMarketExternalPk, + banks[0], + banks[1], + 0, + ); + } + const markets = await client.serum3GetMarketForBaseAndQuote( + group, + banks[0].tokenIndex, + banks[1].tokenIndex, + ); + console.log(`Serum3 market ${markets[0].publicKey}`); + process.exit(); } diff --git a/ts/example1-user.ts b/ts/example1-user.ts index 2302441bc..80e1ca142 100644 --- a/ts/example1-user.ts +++ b/ts/example1-user.ts @@ -52,6 +52,17 @@ async function main() { await client.deposit(group, mangoAccount, banks[0], 1000); console.log(`Withdrawing...500`); await client.withdraw(group, mangoAccount, banks[0], 500, false); + + // serum3 + const markets = await client.serum3GetMarketForBaseAndQuote( + group, + banks[1].tokenIndex, + banks[0].tokenIndex, + ); + console.log(markets); + await client.serum3CreateOpenOrders(group, mangoAccount, markets[0]); + + process.exit(); } main();