diff --git a/programs/src/main/java/software/sava/anchor/programs/drift/DriftAsset.java b/programs/src/main/java/software/sava/anchor/programs/drift/DriftAsset.java index 7ffc7bc..9e6d92f 100644 --- a/programs/src/main/java/software/sava/anchor/programs/drift/DriftAsset.java +++ b/programs/src/main/java/software/sava/anchor/programs/drift/DriftAsset.java @@ -10,6 +10,7 @@ public enum DriftAsset { JLP, JTO, JUP, + MOTHER, POPCAT, PYTH, PYUSD, diff --git a/programs/src/main/java/software/sava/anchor/programs/drift/DriftExtraAccounts.java b/programs/src/main/java/software/sava/anchor/programs/drift/DriftExtraAccounts.java index 5e97f50..0fd40c5 100644 --- a/programs/src/main/java/software/sava/anchor/programs/drift/DriftExtraAccounts.java +++ b/programs/src/main/java/software/sava/anchor/programs/drift/DriftExtraAccounts.java @@ -24,19 +24,25 @@ static DriftExtraAccounts createExtraAccounts(final DriftAccounts driftAccounts) List 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); } diff --git a/programs/src/main/java/software/sava/anchor/programs/drift/DriftExtraAccountsRecord.java b/programs/src/main/java/software/sava/anchor/programs/drift/DriftExtraAccountsRecord.java index 2981548..84b2640 100644 --- a/programs/src/main/java/software/sava/anchor/programs/drift/DriftExtraAccountsRecord.java +++ b/programs/src/main/java/software/sava/anchor/programs/drift/DriftExtraAccountsRecord.java @@ -18,65 +18,80 @@ private static void mergeAccount(final Map metaMap, fina metaMap.merge(meta.publicKey(), meta, Transaction.MERGE_ACCOUNT_META); } - private void mergeAccount(final Map markets, final MarketConfig marketConfig) { - mergeAccount(markets, marketConfig.readMarketPDA()); + private void mergeAccount(final Map 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 diff --git a/programs/src/main/java/software/sava/anchor/programs/drift/DriftProduct.java b/programs/src/main/java/software/sava/anchor/programs/drift/DriftProduct.java index ce7e1e3..c84844b 100644 --- a/programs/src/main/java/software/sava/anchor/programs/drift/DriftProduct.java +++ b/programs/src/main/java/software/sava/anchor/programs/drift/DriftProduct.java @@ -9,6 +9,7 @@ public enum DriftProduct { BREAKPOINT_IGGYERIC_BET, BTC_PERP, CLOUD_PERP, + DBR_PERP, DEMOCRATS_WIN_MICHIGAN_BET, DOGE_PERP, DRIFT_PERP, @@ -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, @@ -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, diff --git a/programs/src/main/java/software/sava/anchor/programs/drift/MarketConfig.java b/programs/src/main/java/software/sava/anchor/programs/drift/MarketConfig.java index ae85eab..e2a52dd 100644 --- a/programs/src/main/java/software/sava/anchor/programs/drift/MarketConfig.java +++ b/programs/src/main/java/software/sava/anchor/programs/drift/MarketConfig.java @@ -11,4 +11,6 @@ public sealed interface MarketConfig permits SpotMarketConfig, PerpMarketConfig AccountMeta readOracle(); AccountMeta readMarketPDA(); + + AccountMeta writeMarketPDA(); } diff --git a/programs/src/main/java/software/sava/anchor/programs/drift/PerpMarketConfig.java b/programs/src/main/java/software/sava/anchor/programs/drift/PerpMarketConfig.java index 62fd6bd..1aa04c1 100644 --- a/programs/src/main/java/software/sava/anchor/programs/drift/PerpMarketConfig.java +++ b/programs/src/main/java/software/sava/anchor/programs/drift/PerpMarketConfig.java @@ -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 categories, @@ -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, @@ -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) ); } @@ -137,7 +140,7 @@ private PerpMarketConfig create() { oracle == null ? null : AccountMeta.createRead(oracle), null, pythFeedId, - null + null, null ); } } diff --git a/programs/src/main/java/software/sava/anchor/programs/drift/PerpMarketConfigs.java b/programs/src/main/java/software/sava/anchor/programs/drift/PerpMarketConfigs.java index 9d00032..d65b56e 100644 --- a/programs/src/main/java/software/sava/anchor/programs/drift/PerpMarketConfigs.java +++ b/programs/src/main/java/software/sava/anchor/programs/drift/PerpMarketConfigs.java @@ -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" ) }); @@ -809,7 +881,7 @@ public final class PerpMarketConfigs { "W", 23, "2024-03-07T23:02:17Z", - "4iCi4DvXrubHQne8jzbMaWL3pd7v1Fip8iTe4H9vHNXB", + "J9nrFWjDUeDVZ4BhhxsbQXWgLcLEgQyNBrCbwSADmJdr", "4HbitGsdcFbtFotmYscikQFAAKJ3nYx4t7sV7fTvsk8U", "H9j8CT1bFiWHaZUPMooEaxMRHdWdJ5T9CzFn41z96JHW", "8BbCGbxsQk1HYohgdn1TMUNs6RYcX4Hae3k8mt4rvnzf" diff --git a/programs/src/main/java/software/sava/anchor/programs/drift/SpotMarketConfig.java b/programs/src/main/java/software/sava/anchor/programs/drift/SpotMarketConfig.java index 7656993..06cd32d 100644 --- a/programs/src/main/java/software/sava/anchor/programs/drift/SpotMarketConfig.java +++ b/programs/src/main/java/software/sava/anchor/programs/drift/SpotMarketConfig.java @@ -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, @@ -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, @@ -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) ); } @@ -141,7 +144,7 @@ private SpotMarketConfig create() { phoenixMarket, openbookMarket, pythFeedId, - null + null, null ); } } diff --git a/programs/src/main/java/software/sava/anchor/programs/drift/SpotMarketConfigs.java b/programs/src/main/java/software/sava/anchor/programs/drift/SpotMarketConfigs.java index ec92681..13c5b31 100644 --- a/programs/src/main/java/software/sava/anchor/programs/drift/SpotMarketConfigs.java +++ b/programs/src/main/java/software/sava/anchor/programs/drift/SpotMarketConfigs.java @@ -49,12 +49,12 @@ public final class SpotMarketConfigs { 3, null, "9Tq8iN5WnMX2PcZGj4iSFEAgHCi8cM6x8LsDUbuzq8uw", - "486kr3pmFPfTsS4aZgcsQ7kS4i9rjMsYYZup6HQNSTT4", + "9Tq8iN5WnMX2PcZGj4iSFEAgHCi8cM6x8LsDUbuzq8uw", "3NZ9JMVBmGAqocybic2c7LQCJScmgsAZ6vQqTDzcqmJh", "3BAKsQd3RuhZKES2DGysMhjBdwjZYKYmxRqnSMtZ4KSN", null, null, - "GVXRSBjFk6e6J3NbVPXohDJetcTjaeeuykUpbQF8UoMU", + "Eavb8FKNoYPbHnSS8kMi4tnUh8qK8bqxTjCojer4pZrr", "54Ai4NTZmPgsT4kUr1w4zFbh33JaC34ptvvvByamsaSw" ), createConfig( @@ -257,12 +257,12 @@ public final class SpotMarketConfigs { 19, "2024-06-26T15:19:17Z", "5Mb11e5rt1Sp6A286B145E4TmgMzsM2UX9nCF2vas5bs", - null, + "5Mb11e5rt1Sp6A286B145E4TmgMzsM2UX9nCF2vas5bs", "27G8MtK7VtTcCHkpASjSDdkWWYfoqT6ggEuKidVJidD4", null, null, null, - null, + "ETzAjoG8xfhNzUD2ARvFncRf3K2qNokqGU9f5jeo2o1T", "DVYXHwLhwALZm94pChALZDJ2b6a7uZTKPXntAGMQtRoM" ), createConfig( @@ -342,6 +342,19 @@ public final class SpotMarketConfigs { null, "H6ARHf6YXhGYeQfUzQNGk6rDNnLBQKrenN712K4AQJEG", "9HPhFcrxmpeVHDvRNytsZ8CoNv5u2nZsajQH1ckH8JuZ" + ), + createConfig( + "MOTHER", + 26, + null, + "56ap2coZG7FPWUigVm9XrpQs3xuCwnwQaWtjWZcffEUG", + "56ap2coZG7FPWUigVm9XrpQs3xuCwnwQaWtjWZcffEUG", + "3S8qX1MsMqRbiwKg2cQyx7nis1oHMgaCuc9c4VfvVdPN", + null, + null, + null, + "7dKhAhQpaaquHuyugjYV3U976DULY2DFnzsRHfzeJfFy", + "4gfG8qMNQ5tL8BYapMAh5BShg1Z19kDqfhVJT1UAijjK" ) });