1717
1818import static systems .comodal .jsoniter .JsonIterator .fieldEquals ;
1919
20- public record ProgramMapConfig (Collection <AccountMeta > programs ,
20+ public record ProgramMapConfig (AccountMeta invokedProxyProgram ,
21+ Collection <AccountMeta > programs ,
2122 List <IxMapConfig > ixMapConfigs ,
2223 int discriminatorLength ) {
2324
2425 public boolean fixedLengthDiscriminator () {
2526 return discriminatorLength > 0 ;
2627 }
2728
28- public <A > Collection <ProgramProxy <A >> createProgramProxies (final AccountMeta invokedProxyProgram ,
29+ public <A > Collection <ProgramProxy <A >> createProgramProxies (final AccountMeta defaultInvokedProxyProgram ,
2930 final Function <DynamicAccountConfig , DynamicAccount <A >> dynamicAccountFactory ) {
31+ final var invokedProxyProgram = Objects .requireNonNullElse (this .invokedProxyProgram , defaultInvokedProxyProgram );
3032 if (fixedLengthDiscriminator ()) {
3133 final var ixProxies = HashMap .<Discriminator , IxProxy <A >>newHashMap (ixMapConfigs .size ());
3234 for (final var ixMapConfig : ixMapConfigs ) {
@@ -48,12 +50,12 @@ public <A> Collection<ProgramProxy<A>> createProgramProxies(final AccountMeta in
4850 }
4951 }
5052
51- public static <A > Map <PublicKey , ProgramProxy <A >> createProgramProxies (final AccountMeta invokedProxyProgram ,
53+ public static <A > Map <PublicKey , ProgramProxy <A >> createProgramProxies (final AccountMeta defaultInvokedProxyProgram ,
5254 final Function <DynamicAccountConfig , DynamicAccount <A >> dynamicAccountFactory ,
5355 final List <ProgramMapConfig > programMapConfigs ) {
5456 final var proxies = new HashMap <PublicKey , ProgramProxy <A >>(programMapConfigs .size ());
5557 for (final var programMapConfig : programMapConfigs ) {
56- final var programProxies = programMapConfig .createProgramProxies (invokedProxyProgram , dynamicAccountFactory );
58+ final var programProxies = programMapConfig .createProgramProxies (defaultInvokedProxyProgram , dynamicAccountFactory );
5759 for (final var programProxy : programProxies ) {
5860 proxies .put (programProxy .cpiProgram (), programProxy );
5961 }
@@ -62,7 +64,7 @@ public static <A> Map<PublicKey, ProgramProxy<A>> createProgramProxies(final Acc
6264 }
6365
6466 public static <A > void createProxies (final Path mappingFile ,
65- final AccountMeta invokedProxyProgram ,
67+ final AccountMeta defaultInvokedProxyProgram ,
6668 final Map <PublicKey , ProgramProxy <A >> programProxiesOutput ,
6769 final Function <DynamicAccountConfig , DynamicAccount <A >> dynamicAccountFactory ,
6870 final Map <AccountMeta , AccountMeta > accountMetaCache ,
@@ -71,7 +73,7 @@ public static <A> void createProxies(final Path mappingFile,
7173 final var mappingJson = Files .readAllBytes (mappingFile );
7274 final var ji = JsonIterator .parse (mappingJson );
7375 final var programMapConfig = ProgramMapConfig .parseConfig (accountMetaCache , indexedAccountMetaCache , ji );
74- final var programProxyCollection = programMapConfig .createProgramProxies (invokedProxyProgram , dynamicAccountFactory );
76+ final var programProxyCollection = programMapConfig .createProgramProxies (defaultInvokedProxyProgram , dynamicAccountFactory );
7577 for (final var proxy : programProxyCollection ) {
7678 programProxiesOutput .put (proxy .cpiProgram (), proxy );
7779 }
@@ -95,6 +97,7 @@ private static final class Parser implements FieldBufferPredicate {
9597 private final Map <AccountMeta , AccountMeta > accountMetaCache ;
9698 private final Map <IndexedAccountMeta , IndexedAccountMeta > indexedAccountMetaCache ;
9799
100+ private PublicKey proxyProgram ;
98101 private Collection <AccountMeta > programs ;
99102 private List <IxMapConfig > ixMapConfigs ;
100103
@@ -105,17 +108,18 @@ private Parser(final Map<AccountMeta, AccountMeta> accountMetaCache,
105108 }
106109
107110 private ProgramMapConfig create () {
111+ final var invokedProxyProgram = proxyProgram == null ? null : AccountMeta .createInvoked (proxyProgram );
108112 if (ixMapConfigs .isEmpty ()) {
109- return new ProgramMapConfig (programs , ixMapConfigs , 0 );
113+ return new ProgramMapConfig (invokedProxyProgram , programs , ixMapConfigs , 0 );
110114 } else {
111115 final var iterator = ixMapConfigs .iterator ();
112116 final int discriminatorLength = iterator .next ().cpiDiscriminator ().length ();
113117 while (iterator .hasNext ()) {
114118 if (iterator .next ().cpiDiscriminator ().length () != discriminatorLength ) {
115- return new ProgramMapConfig (programs , ixMapConfigs , -1 );
119+ return new ProgramMapConfig (invokedProxyProgram , programs , ixMapConfigs , -1 );
116120 }
117121 }
118- return new ProgramMapConfig (programs , ixMapConfigs , discriminatorLength );
122+ return new ProgramMapConfig (invokedProxyProgram , programs , ixMapConfigs , discriminatorLength );
119123 }
120124 }
121125
@@ -131,6 +135,8 @@ public boolean test(final char[] buf, final int offset, final int len, final Jso
131135 } else {
132136 this .programs = List .of (AccountMeta .createRead (ji .applyChars (PARSE_BASE58_PUBLIC_KEY )));
133137 }
138+ } else if (fieldEquals ("proxy_program_id" , buf , offset , len )) {
139+ this .proxyProgram = ji .applyChars (PARSE_BASE58_PUBLIC_KEY );
134140 } else if (fieldEquals ("instructions" , buf , offset , len )) {
135141 final var ixMapConfigs = new ArrayList <IxMapConfig >();
136142 while (ji .readArray ()) {
0 commit comments