permissioned-markets-quicks.../scripts/trade-bot.js

181 lines
4.6 KiB
JavaScript
Executable File

#!/usr/bin/env node
// Script to infinitely post orders that are immediately filled.
const process = require("process");
const anchor = require("@project-serum/anchor");
const PublicKey = anchor.web3.PublicKey;
const marketMaker = require("../tests/utils/market-maker");
const MARKET_MAKER = marketMaker.KEYPAIR;
async function main() {
const market = new PublicKey(process.argv[2]);
const provider = anchor.Provider.local();
// TODO: enable the trade bot.
// runTradeBot(market, provider);
}
async function runTradeBot(market, provider, iterations = undefined) {
const marketProxyClient = marketProxy.load(
provider.connection,
proxyProgramId,
DEX_PID,
market
);
const baseTokenUser1 = (
await marketProxyClient.market.getTokenAccountsByOwnerForMint(
provider.connection,
MARKET_MAKER.publicKey,
marketProxyClient.market.baseMintAddress
)
)[0].pubkey;
const quoteTokenUser1 = (
await marketProxyClient.market.getTokenAccountsByOwnerForMint(
provider.connection,
MARKET_MAKER.publicKey,
marketProxyClient.market.quoteMintAddress
)
)[0].pubkey;
const baseTokenUser2 = (
await marketProxyClient.market.getTokenAccountsByOwnerForMint(
provider.connection,
provider.wallet.publicKey,
marketProxyClient.market.baseMintAddress
)
)[0].pubkey;
const quoteTokenUser2 = (
await marketProxyClient.market.getTokenAccountsByOwnerForMint(
provider.connection,
provider.wallet.publicKey,
marketProxyClient.market.quoteMintAddress
)
)[0].pubkey;
const makerOpenOrdersUser1 = (
await OpenOrders.findForMarketAndOwner(
provider.connection,
market,
MARKET_MAKER.publicKey,
DEX_PID
)
)[0];
makerOpenOrdersUser2 = (
await OpenOrders.findForMarketAndOwner(
provider.connection,
market,
provider.wallet.publicKey,
DEX_PID
)
)[0];
const price = 6.041;
const size = 700000.8;
let maker = MARKET_MAKER;
let taker = provider.wallet.payer;
let baseToken = baseTokenUser1;
let quoteToken = quoteTokenUser2;
let makerOpenOrders = makerOpenOrdersUser1;
let k = 1;
while (true) {
if (iterations && k > iterations) {
break;
}
const clientId = new BN(k);
if (k % 5 === 0) {
if (maker.publicKey.equals(MARKET_MAKER.publicKey)) {
maker = provider.wallet.payer;
makerOpenOrders = makerOpenOrdersUser2;
taker = MARKET_MAKER;
baseToken = baseTokenUser2;
quoteToken = quoteTokenUser1;
} else {
maker = MARKET_MAKER;
makerOpenOrders = makerOpenOrdersUser1;
taker = provider.wallet.payer;
baseToken = baseTokenUser1;
quoteToken = quoteTokenUser2;
}
}
// Post ask.
const txAsk = new Transaction();
txAsk.add(
await marketProxyClient.instruction.newOrderV3({
owner: maker,
payer: baseToken,
side: "sell",
price,
size,
orderType: "postOnly",
clientId,
openOrdersAddressKey: undefined,
openOrdersAccount: undefined,
feeDiscountPubkey: null,
selfTradeBehavior: "abortTransaction",
})
);
let txSig = await provider.send(txAsk, [maker]);
console.log("Ask", txSig);
// Take.
const txBid = new Transaction();
tx.add(
await marketProxyClient.instruction.newOrderV3({
owner: taker,
payer: quoteToken,
side: "buy",
price,
size,
orderType: "ioc",
clientId: undefined,
openOrdersAddressKey: undefined,
openOrdersAccount: undefined,
feeDiscountPubkey: null,
selfTradeBehavior: "abortTransaction",
})
);
txSig = await provider.send(txBid, [taker]);
console.log("Bid", txSig);
await sleep(1000);
// Cancel anything remaining.
try {
const tx = new Transaction();
tx.add(
marketProxyClient.instruction.cancelOrderByClientId(
provider.connection,
maker.publicKey,
makerOpenOrders.address,
clientId
)
);
txSig = await provider.send(tx, [maker]);
console.log("Cancelled the rest", txSig);
await sleep(1000);
} catch (e) {
console.log("Unable to cancel order", e);
}
k += 1;
// If the open orders account wasn't previously initialized, it is now.
if (makerOpenOrdersUser2 === undefined) {
makerOpenOrdersUser2 = (
await OpenOrders.findForMarketAndOwner(
provider.connection,
market,
provider.wallet.publicKey,
DEX_PID
)
)[0];
}
}
}
main();