Add method to settle funds
This commit is contained in:
parent
4d1e45f815
commit
db5635c1f6
20
README.md
20
README.md
|
@ -77,4 +77,24 @@ for (let fill of await market.loadFills(connection)) {
|
|||
fill.side,
|
||||
);
|
||||
}
|
||||
|
||||
// Settle funds
|
||||
for (let openOrders of await market.findOpenOrdersAccountsForOwner(
|
||||
connection,
|
||||
owner.publicKey,
|
||||
)) {
|
||||
if (openOrders.baseTokenFree > 0 || openOrders.quoteTokenFree > 0) {
|
||||
// spl-token accounts to which to send the proceeds from trades
|
||||
let baseTokenAccount = new PublicKey('...');
|
||||
let quoteTokenAccount = new PublicKey('...');
|
||||
|
||||
await market.settleFunds(
|
||||
connection,
|
||||
owner,
|
||||
openOrders,
|
||||
baseTokenAccount,
|
||||
quoteTokenAccount,
|
||||
);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "@project-serum/serum",
|
||||
"version": "0.5.0",
|
||||
"version": "0.5.1",
|
||||
"description": "Library for interacting with the serum dex",
|
||||
"license": "MIT",
|
||||
"repository": "project-serum/serum-js",
|
||||
|
|
|
@ -51,6 +51,7 @@ INSTRUCTION_LAYOUT.inner.addVariant(
|
|||
]),
|
||||
'cancelOrder',
|
||||
);
|
||||
INSTRUCTION_LAYOUT.inner.addVariant(5, struct([]), 'settleFunds');
|
||||
|
||||
export function encodeInstruction(instruction) {
|
||||
const b = Buffer.alloc(100);
|
||||
|
@ -193,4 +194,33 @@ export class DexInstructions {
|
|||
}),
|
||||
});
|
||||
}
|
||||
|
||||
static settleFunds({
|
||||
market,
|
||||
openOrders,
|
||||
owner,
|
||||
baseVault,
|
||||
quoteVault,
|
||||
baseWallet,
|
||||
quoteWallet,
|
||||
vaultSigner,
|
||||
}) {
|
||||
return new TransactionInstruction({
|
||||
keys: [
|
||||
{ pubkey: market, isSigner: false, isWritable: true },
|
||||
{ pubkey: openOrders, isSigner: false, isWritable: true },
|
||||
{ pubkey: owner, isSigner: true, isWritable: false },
|
||||
{ pubkey: baseVault, isSigner: false, isWritable: true },
|
||||
{ pubkey: quoteVault, isSigner: false, isWritable: true },
|
||||
{ pubkey: baseWallet, isSigner: false, isWritable: true },
|
||||
{ pubkey: quoteWallet, isSigner: false, isWritable: true },
|
||||
{ pubkey: vaultSigner, isSigner: false, isWritable: false },
|
||||
{ pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },
|
||||
],
|
||||
programId: DEX_PROGRAM_ID,
|
||||
data: encodeInstruction({
|
||||
settleFunds: {},
|
||||
}),
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
|
@ -261,7 +261,13 @@ export class Market {
|
|||
skipPreflight: this._skipPreflight,
|
||||
});
|
||||
if (this._confirmations > 0) {
|
||||
await connection.confirmTransaction(signature, this._confirmations);
|
||||
const { value } = await connection.confirmTransaction(
|
||||
signature,
|
||||
this._confirmations,
|
||||
);
|
||||
if (value?.err) {
|
||||
throw new Error(JSON.stringify(value.err));
|
||||
}
|
||||
}
|
||||
return signature;
|
||||
}
|
||||
|
@ -295,6 +301,55 @@ export class Market {
|
|||
return transaction;
|
||||
}
|
||||
|
||||
async settleFunds(
|
||||
connection: Connection,
|
||||
owner: Account,
|
||||
openOrders: OpenOrders,
|
||||
baseWallet: PublicKey,
|
||||
quoteWallet: PublicKey,
|
||||
) {
|
||||
if (!openOrders.owner.equals(owner.publicKey)) {
|
||||
throw new Error('Invalid open orders account');
|
||||
}
|
||||
const transaction = await this.makeSettleFundsTransaction(
|
||||
connection,
|
||||
openOrders,
|
||||
baseWallet,
|
||||
quoteWallet,
|
||||
);
|
||||
return await this._sendTransaction(connection, transaction, [owner]);
|
||||
}
|
||||
|
||||
async makeSettleFundsTransaction(
|
||||
connection: Connection,
|
||||
openOrders: OpenOrders,
|
||||
baseWallet: PublicKey,
|
||||
quoteWallet: PublicKey,
|
||||
) {
|
||||
const tx = new Transaction();
|
||||
// @ts-ignore
|
||||
const vaultSigner = await PublicKey.createProgramAddress(
|
||||
[
|
||||
this.address.toBuffer(),
|
||||
this._decoded.vaultSignerNonce.toArrayLike(Buffer, 'le', 8),
|
||||
],
|
||||
DEX_PROGRAM_ID,
|
||||
);
|
||||
tx.add(
|
||||
DexInstructions.settleFunds({
|
||||
market: this.address,
|
||||
openOrders: openOrders.address,
|
||||
owner: openOrders.owner,
|
||||
baseVault: this._decoded.baseVault,
|
||||
quoteVault: this._decoded.quoteVault,
|
||||
baseWallet,
|
||||
quoteWallet,
|
||||
vaultSigner,
|
||||
}),
|
||||
);
|
||||
return tx;
|
||||
}
|
||||
|
||||
async loadRequestQueue(connection: Connection) {
|
||||
const { data } = throwIfNull(
|
||||
await connection.getAccountInfo(this._decoded.requestQueue),
|
||||
|
|
Loading…
Reference in New Issue