1
- import 'package:blockchain_utils/blockchain_utils.dart' ;
2
- import 'package:on_chain/solana/src/borsh_serialization/core/borsh_serializable.dart' ;
1
+ import 'package:blockchain_utils/layout/layout.dart' ;
2
+ import 'package:blockchain_utils/utils/utils.dart' ;
3
+ import 'package:on_chain/solana/src/address/sol_address.dart' ;
4
+ import 'package:on_chain/solana/src/borsh_serialization/program_layout.dart' ;
5
+ import 'package:on_chain/solana/src/exception/exception.dart' ;
6
+ // import 'package:on_chain/solana/src/instructions/associated_token_account/constant.dart';
7
+ import 'package:on_chain/solana/src/instructions/instructions.dart' ;
3
8
4
9
/// Abstract class for Borsh serializable programs.
5
- abstract class ProgramLayout implements LayoutSerializable {
10
+ abstract class ProgramLayout extends LayoutSerializable {
6
11
const ProgramLayout ();
7
12
8
13
/// The layout representing the structure of the program.
9
14
@override
10
15
abstract final StructLayout layout;
11
16
12
17
/// The instruction of the program.
13
- abstract final dynamic instruction;
18
+ abstract final ProgramLayoutInstruction instruction;
14
19
15
20
/// Serializes the program.
16
21
@override
@@ -19,7 +24,8 @@ abstract class ProgramLayout implements LayoutSerializable {
19
24
/// Converts the program to bytes using Borsh serialization.
20
25
@override
21
26
List <int > toBytes () {
22
- return layout.serialize ({"instruction" : instruction, ...serialize ()});
27
+ return layout
28
+ .serialize ({"instruction" : instruction.insturction, ...serialize ()});
23
29
}
24
30
25
31
/// Converts the program to a hexadecimal string.
@@ -43,20 +49,89 @@ abstract class ProgramLayout implements LayoutSerializable {
43
49
final decode = layout.deserialize (bytes).value;
44
50
if (instruction != null ) {
45
51
if (decode["instruction" ] != instruction) {
46
- throw MessageException ("invalid instruction index" , details: {
52
+ throw SolanaPluginException ("invalid instruction index" , details: {
47
53
"excepted" : instruction,
48
54
"instruction" : decode["instruction" ]
49
55
});
50
56
}
51
57
}
52
58
if (discriminator != null ) {
53
59
if (decode["discriminator" ] != discriminator) {
54
- throw MessageException ("invalid discriminator" , details: {
60
+ throw SolanaPluginException ("invalid discriminator" , details: {
55
61
"excepted" : discriminator,
56
62
"instruction" : decode["discriminator" ]
57
63
});
58
64
}
59
65
}
60
66
return decode;
61
67
}
68
+
69
+ factory ProgramLayout .fromBytes ({
70
+ required SolAddress programId,
71
+ required List <int > instructionBytes,
72
+ }) {
73
+ try {
74
+ if (programId == AddressLookupTableProgramConst .programId) {
75
+ return AddressLookupTableProgramLayout .fromBytes (instructionBytes);
76
+ } else if (programId == ComputeBudgetConst .programId) {
77
+ return ComputeBudgetProgramLayout .fromBytes (instructionBytes);
78
+ } else if (programId == Ed25519ProgramConst .programId) {
79
+ return Ed25519ProgramLayout .fromBuffer (instructionBytes);
80
+ } else if (programId == MemoProgramConst .programId) {
81
+ return MemoLayout .fromBuffer (instructionBytes);
82
+ } else if (programId == NameServiceProgramConst .programId) {
83
+ return NameServiceProgramLayout .fromBytes (instructionBytes);
84
+ } else if (programId == Secp256k1ProgramConst .programId) {
85
+ return Secp256k1Layout .fromBuffer (instructionBytes);
86
+ } else if (programId == SPLTokenProgramConst .tokenProgramId ||
87
+ programId == SPLTokenProgramConst .token2022ProgramId) {
88
+ try {
89
+ return SPLTokenProgramLayout .fromBytes (instructionBytes);
90
+ } on UnimplementedError {
91
+ return SPLTokenMetaDataProgramLayout .fromBytes (instructionBytes);
92
+ }
93
+ } else if (programId == SPLTokenSwapConst .oldTokenSwapProgramId ||
94
+ programId == SPLTokenSwapConst .tokenSwapProgramId) {
95
+ } else if (programId == StakeProgramConst .programId) {
96
+ return StakeProgramLayout .fromBytes (instructionBytes);
97
+ } else if (programId == StakePoolProgramConst .programId) {
98
+ return StakePoolProgramLayout .fromBytes (instructionBytes);
99
+ } else if (programId == SystemProgramConst .programId) {
100
+ return SystemProgramLayout .fromBytes (instructionBytes);
101
+ } else if (programId == VoteProgramConst .programId) {
102
+ return VoteProgramLayout .fromBytes (instructionBytes);
103
+ } else if (programId == TokenLendingProgramConst .lendingProgramId) {
104
+ return TokenLendingProgramLayout .fromBytes (instructionBytes);
105
+ } else if (programId ==
106
+ AssociatedTokenAccountProgramConst .associatedTokenProgramId) {
107
+ return AssociatedTokenAccountProgramLayout .fromBytes (instructionBytes);
108
+ } else if (programId == MetaplexAuctionHouseProgramConst .programId) {
109
+ return MetaplexAuctionHouseProgramLayout .fromBytes (instructionBytes);
110
+ } else if (programId == MetaplexAuctioneerProgramConst .programId) {
111
+ return MetaplexAuctioneerProgramLayout .fromBytes (instructionBytes);
112
+ } else if (programId == MetaplexBubblegumProgramConst .programId) {
113
+ return MetaplexBubblegumProgramLayout .fromBytes (instructionBytes);
114
+ } else if (programId ==
115
+ MetaplexCandyMachineCoreProgramConst .candyMachineV3programId ||
116
+ programId ==
117
+ MetaplexCandyMachineCoreProgramConst .candyGuardProgramId) {
118
+ return MetaplexCandyMachineProgramLayout .fromBytes (instructionBytes);
119
+ } else if (programId == MetaplexFixedPriceSaleProgramConst .programId) {
120
+ return MetaplexFixedPriceSaleProgramLayout .fromBytes (instructionBytes);
121
+ } else if (programId == MetaplexGumdropProgramConst .programId) {
122
+ return MetaplexGumdropProgramLayout .fromBytes (instructionBytes);
123
+ } else if (programId == MetaplexHydraProgramConst .programId) {
124
+ return MetaplexHydraProgramLayout .fromBytes (instructionBytes);
125
+ } else if (programId == MetaplexNFTPacksProgramConst .programId) {
126
+ return MetaplexNFTPacksProgramLayout .fromBytes (instructionBytes);
127
+ } else if (programId == MetaplexTokenEntanglerProgramConst .programId) {
128
+ return MetaplexTokenEntanglerProgramLayout .fromBytes (instructionBytes);
129
+ } else if (programId == MetaplexTokenMetaDataProgramConst .programId) {
130
+ return MetaplexTokenMetaDataProgramLayout .fromBytes (instructionBytes);
131
+ }
132
+ return UnknownProgramLayout (instructionBytes);
133
+ } catch (e) {
134
+ return UnknownProgramLayout (instructionBytes);
135
+ }
136
+ }
62
137
}
0 commit comments