Skip to content

Commit

Permalink
Drift support writable extra accounts.
Browse files Browse the repository at this point in the history
  • Loading branch information
jpe7s committed Oct 11, 2024
1 parent 0b49e62 commit 414053e
Show file tree
Hide file tree
Showing 9 changed files with 169 additions and 48 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ public enum DriftAsset {
JLP,
JTO,
JUP,
MOTHER,
POPCAT,
PYTH,
PYUSD,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,19 +24,25 @@ static DriftExtraAccounts createExtraAccounts(final DriftAccounts driftAccounts)

List<AccountMeta> toList();

void userAccounts(final User user);
void mergeOracle(final AccountMeta accountMeta);

void market(final SpotMarketConfig marketConfig);
void mergeSpotMarket(final AccountMeta accountMeta);

void market(final PerpMarketConfig marketConfig);
void mergePerpMarket(final AccountMeta accountMeta);

void market(final MarketConfig marketConfig);
void userAccounts(final User user, final boolean write);

void market(final PerpMarketConfig marketConfig, final SpotMarketConfig quoteMarket);
void market(final SpotMarketConfig marketConfig, final boolean write);

void userAndMarket(final User user, final SpotMarketConfig marketConfig);
void market(final PerpMarketConfig marketConfig, final boolean write);

void userAndMarket(final User user, final PerpMarketConfig marketConfig);
void market(final MarketConfig marketConfig, final boolean write);

void userAndMarket(final User user, final MarketConfig marketConfig);
void market(final PerpMarketConfig marketConfig, final SpotMarketConfig quoteMarket, final boolean write);

void userAndMarket(final User user, final SpotMarketConfig marketConfig, final boolean write);

void userAndMarket(final User user, final PerpMarketConfig marketConfig, final boolean write);

void userAndMarket(final User user, final MarketConfig marketConfig, final boolean write);
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,65 +18,80 @@ private static void mergeAccount(final Map<PublicKey, AccountMeta> metaMap, fina
metaMap.merge(meta.publicKey(), meta, Transaction.MERGE_ACCOUNT_META);
}

private void mergeAccount(final Map<PublicKey, AccountMeta> markets, final MarketConfig marketConfig) {
mergeAccount(markets, marketConfig.readMarketPDA());
private void mergeAccount(final Map<PublicKey, AccountMeta> markets,
final MarketConfig marketConfig,
final boolean write) {
mergeAccount(markets, write ? marketConfig.writeMarketPDA() : marketConfig.readMarketPDA());
mergeAccount(oracles, marketConfig.readOracle());
}

@Override
public void userAccounts(final User user) {
public void mergeOracle(final AccountMeta accountMeta) {
mergeAccount(oracles, accountMeta);
}

@Override
public void mergeSpotMarket(final AccountMeta accountMeta) {
mergeAccount(spotMarkets, accountMeta);
}

@Override
public void mergePerpMarket(final AccountMeta accountMeta) {
mergeAccount(perpMarkets, accountMeta);
}

@Override
public void userAccounts(final User user, final boolean write) {
for (final var position : user.spotPositions()) {
if (position.scaledBalance() != 0) {
final var spotMarket = driftAccounts.spotMarketConfig(position.marketIndex());
market(spotMarket);
market(spotMarket, write);
}
}
}

@Override
public void market(final SpotMarketConfig marketConfig) {
mergeAccount(spotMarkets, marketConfig);
public void market(final SpotMarketConfig marketConfig, final boolean write) {
mergeAccount(spotMarkets, marketConfig, write);
}

@Override
public void market(final MarketConfig marketConfig) {
final var markets = switch (marketConfig) {
case SpotMarketConfig _ -> spotMarkets;
case PerpMarketConfig perpMarketConfig -> {
market(driftAccounts.defaultQuoteMarket());
yield perpMarkets;
}
};
mergeAccount(markets, marketConfig);
public void market(final PerpMarketConfig perpMarketConfig,
final SpotMarketConfig quoteMarket,
final boolean write) {
market(quoteMarket, write);
mergeAccount(perpMarkets, perpMarketConfig, write);
}

@Override
public void market(final PerpMarketConfig perpMarketConfig, final SpotMarketConfig quoteMarket) {
market(quoteMarket);
mergeAccount(perpMarkets, perpMarketConfig);
public void market(final PerpMarketConfig perpMarketConfig, final boolean write) {
market(perpMarketConfig, driftAccounts.defaultQuoteMarket(), write);
}

@Override
public void market(final PerpMarketConfig perpMarketConfig) {
market(perpMarketConfig, driftAccounts.defaultQuoteMarket());
public void market(final MarketConfig marketConfig, final boolean write) {
switch (marketConfig) {
case SpotMarketConfig spotMarketConfig -> market(spotMarketConfig, write);
case PerpMarketConfig perpMarketConfig -> market(perpMarketConfig, write);
}
}

@Override
public void userAndMarket(final User user, final SpotMarketConfig marketConfig) {
userAccounts(user);
market(marketConfig);
public void userAndMarket(final User user, final SpotMarketConfig marketConfig, final boolean write) {
userAccounts(user, write);
market(marketConfig, write);
}

@Override
public void userAndMarket(final User user, final PerpMarketConfig marketConfig) {
userAccounts(user);
market(marketConfig);
public void userAndMarket(final User user, final PerpMarketConfig marketConfig, final boolean write) {
userAccounts(user, write);
market(marketConfig, write);
}

@Override
public void userAndMarket(final User user, final MarketConfig marketConfig) {
userAccounts(user);
market(marketConfig);
public void userAndMarket(final User user, final MarketConfig marketConfig, final boolean write) {
userAccounts(user, write);
market(marketConfig, write);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ public enum DriftProduct {
BREAKPOINT_IGGYERIC_BET,
BTC_PERP,
CLOUD_PERP,
DBR_PERP,
DEMOCRATS_WIN_MICHIGAN_BET,
DOGE_PERP,
DRIFT_PERP,
Expand All @@ -23,8 +24,11 @@ public enum DriftProduct {
KAMALA_POPULAR_VOTE_2024_BET,
KAMALA_POPULAR_VOTE_2024_PREDICT,
KMNO_PERP,
LANDO_F1_SGP_WIN_BET,
LINK_PERP,
MATIC_PERP,
MOODENG_PERP,
MOTHER_PERP,
OP_PERP,
POPCAT_PERP,
PYTH_PERP,
Expand All @@ -40,7 +44,9 @@ public enum DriftProduct {
TON_PERP,
TRUMP_WIN_2024_BET,
TRUMP_WIN_2024_PREDICT,
WARWICK_FIGHT_WIN_BET,
WIF_PERP,
WLF_5B_1W_BET,
W_PERP,
XRP_PERP,
ZEX_PERP,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,6 @@ public sealed interface MarketConfig permits SpotMarketConfig, PerpMarketConfig
AccountMeta readOracle();

AccountMeta readMarketPDA();

AccountMeta writeMarketPDA();
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,8 @@ public record PerpMarketConfig(String fullName,
AccountMeta readOracle,
PublicKey pythPullOraclePDA,
PublicKey pythFeedId,
AccountMeta readMarketPDA) implements SrcGen, MarketConfig {
AccountMeta readMarketPDA,
AccountMeta writeMarketPDA) implements SrcGen, MarketConfig {

static PerpMarketConfig createConfig(final String fullName,
final Set<String> categories,
Expand All @@ -36,6 +37,7 @@ static PerpMarketConfig createConfig(final String fullName,
final String pythPullOraclePDA,
final String pythFeedId,
final String marketPDA) {
final var marketPDAKey = PublicKey.fromBase58Encoded(marketPDA);
return new PerpMarketConfig(
fullName,
categories,
Expand All @@ -46,7 +48,8 @@ static PerpMarketConfig createConfig(final String fullName,
SrcGen.readMetaFromBase58Encoded(oracle),
SrcGen.fromBase58Encoded(pythPullOraclePDA),
SrcGen.fromBase58Encoded(pythFeedId),
SrcGen.readMetaFromBase58Encoded(marketPDA)
AccountMeta.createRead(marketPDAKey),
AccountMeta.createWrite(marketPDAKey)
);
}

Expand Down Expand Up @@ -137,7 +140,7 @@ private PerpMarketConfig create() {
oracle == null ? null : AccountMeta.createRead(oracle),
null,
pythFeedId,
null
null, null
);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -522,6 +522,78 @@ public final class PerpMarketConfigs {
"BNjCXrpEqjdBnuRy2SAUgm5Pq8B73wGFwsf6RYFJiLPY",
"AFJXXYuniABNnoEE7DLtkxwqLDkcda4xG5k2F4FB86hj",
"J5RWv9z5ore5pDXtyKho8fmm35N13Mststp8JRUaE93P"
),
createConfig(
"LANDO-F1-SGP-WIN-BET",
Set.of("Prediction", "Sports"),
"LANDO-F1-SGP-WIN-BET",
"LANDO-F1-SGP-WIN",
43,
"2024-09-18T08:00:53Z",
"DpJz7rjTJLxxnuqrqZTUjMWtnaMFAEfZUv5ATdb9HTh1",
null,
null,
"DjTmuKjkSYzzrLMcyrNUdV6dv4tozcMRdw2tH6ERHKJr"
),
createConfig(
"MOTHER",
Set.of("Solana", "Meme"),
"MOTHER-PERP",
"MOTHER",
44,
"2024-09-25T19:17:39Z",
"56ap2coZG7FPWUigVm9XrpQs3xuCwnwQaWtjWZcffEUG",
"56ap2coZG7FPWUigVm9XrpQs3xuCwnwQaWtjWZcffEUG",
"7dKhAhQpaaquHuyugjYV3U976DULY2DFnzsRHfzeJfFy",
"G9JHXgiDXDKENtp4hmhYfciKM2YL8tMHLLMZ3aXo21Xx"
),
createConfig(
"MOODENG",
Set.of("Solana", "Meme"),
"MOODENG-PERP",
"MOODENG",
45,
"2024-10-03T14:31:04Z",
"21gjgEcuDppthwV16J1QpFzje3vmgMp2uSzh7pJsG7ob",
"21gjgEcuDppthwV16J1QpFzje3vmgMp2uSzh7pJsG7ob",
"JEJtFypgxMbKC14navaTfeVQhVkWwYJJ3b7DoXsvibg2",
"FQKbtupzpZ1XWcZR2axN5pjDWMyjuS4v8BjP1CVdPBE3"
),
createConfig(
"WARWICK-FIGHT-WIN-BET",
Set.of("Sport", "Prediction"),
"WARWICK-FIGHT-WIN-BET",
"WARWICK-FIGHT-WIN",
46,
"2024-10-03T14:31:04Z",
"Dz5Nvxo1hv7Zfyu11hy8e97twLMRKk6heTWCDGXytj7N",
null,
null,
"Ey41MmrKhS5sxnbBPNcJKFpwWStqzWZqzgv59JqkC9BT"
),
createConfig(
"DeBridge",
Set.of("Bridge"),
"DBR-PERP",
"DBR",
47,
"2024-10-10T15:34:53Z",
"AQzxePg2vY52Cw4di1j5xF7BqetNPxogqYPgDBL7HXWn",
null,
null,
"7MfxQtZFQV7yNWjfWnrbwcVSGinUqVCRRpW6X7a72mDL"
),
createConfig(
"WLF-5B-1W",
Set.of("Prediction"),
"WLF-5B-1W-BET",
"WLF-5B-1W",
48,
"2024-10-10T15:34:53Z",
"7LpRfPaWR7cQqN7CMkCmZjEQpWyqso5LGuKCvDXH5ZAr",
null,
null,
"8YqKj1qYgSRBkMxFRMPfq6zQBW2A5szgjoGRpoLGveUL"
)
});

Expand Down Expand Up @@ -809,7 +881,7 @@ public final class PerpMarketConfigs {
"W",
23,
"2024-03-07T23:02:17Z",
"4iCi4DvXrubHQne8jzbMaWL3pd7v1Fip8iTe4H9vHNXB",
"J9nrFWjDUeDVZ4BhhxsbQXWgLcLEgQyNBrCbwSADmJdr",
"4HbitGsdcFbtFotmYscikQFAAKJ3nYx4t7sV7fTvsk8U",
"H9j8CT1bFiWHaZUPMooEaxMRHdWdJ5T9CzFn41z96JHW",
"8BbCGbxsQk1HYohgdn1TMUNs6RYcX4Hae3k8mt4rvnzf"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,8 @@ public record SpotMarketConfig(String symbol,
PublicKey phoenixMarket,
PublicKey openbookMarket,
PublicKey pythFeedId,
AccountMeta readMarketPDA) implements SrcGen, MarketConfig {
AccountMeta readMarketPDA,
AccountMeta writeMarketPDA) implements SrcGen, MarketConfig {

static SpotMarketConfig createConfig(final String symbol,
final int marketIndex,
Expand All @@ -35,6 +36,7 @@ static SpotMarketConfig createConfig(final String symbol,
final String openbookMarket,
final String pythFeedId,
final String marketPDA) {
final var marketPDAKey = PublicKey.fromBase58Encoded(marketPDA);
return new SpotMarketConfig(
symbol,
marketIndex,
Expand All @@ -46,7 +48,8 @@ static SpotMarketConfig createConfig(final String symbol,
SrcGen.fromBase58Encoded(phoenixMarket),
SrcGen.fromBase58Encoded(openbookMarket),
SrcGen.fromBase58Encoded(pythFeedId),
SrcGen.readMetaFromBase58Encoded(marketPDA)
AccountMeta.createRead(marketPDAKey),
AccountMeta.createWrite(marketPDAKey)
);
}

Expand Down Expand Up @@ -141,7 +144,7 @@ private SpotMarketConfig create() {
phoenixMarket,
openbookMarket,
pythFeedId,
null
null, null
);
}
}
Expand Down
Loading

0 comments on commit 414053e

Please sign in to comment.