Skip to content

Commit 3cfb694

Browse files
authored
feat(solana): chunked router instructions + working e2e (#766)
1 parent 8d0bd41 commit 3cfb694

File tree

49 files changed

+3608
-2317
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

49 files changed

+3608
-2317
lines changed

e2e/interchaintestv8/relayer/solana_and_cosmos_config.go

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ type SolanaCosmosConfigInfo struct {
1414
ICS07ProgramID string
1515
// ICS26 Router program ID on Solana
1616
ICS26RouterProgramID string
17+
// IBC app program ID on Solana
18+
IBCAppProgramID string
1719
// Signer address for Cosmos transactions
1820
CosmosSignerAddress string
1921
// Solana fee payer address (for cosmos-to-solana)
@@ -46,6 +48,8 @@ type CosmosToSolanaModuleConfig struct {
4648
SolanaIcs26ProgramId string `json:"solana_ics26_program_id"`
4749
// Solana ICS07 Tendermint light client program ID (must be "solana_ics07_program_id")
4850
SolanaIcs07ProgramId string `json:"solana_ics07_program_id"`
51+
// Solana IBC app program ID (must be "solana_ibc_app_program_id")
52+
SolanaIbcAppProgramId string `json:"solana_ibc_app_program_id"`
4953
// Solana fee payer address for unsigned transactions
5054
SolanaFeePayer string `json:"solana_fee_payer"`
5155
}
@@ -70,11 +74,12 @@ func CreateSolanaCosmosModules(configInfo SolanaCosmosConfigInfo) []ModuleConfig
7074
SrcChain: configInfo.CosmosChainID,
7175
DstChain: configInfo.SolanaChainID,
7276
Config: CosmosToSolanaModuleConfig{
73-
SourceRpcUrl: configInfo.TmRPC,
74-
TargetRpcUrl: configInfo.SolanaRPC,
75-
SolanaIcs26ProgramId: configInfo.ICS26RouterProgramID,
76-
SolanaIcs07ProgramId: configInfo.ICS07ProgramID,
77-
SolanaFeePayer: configInfo.SolanaFeePayer,
77+
SourceRpcUrl: configInfo.TmRPC,
78+
TargetRpcUrl: configInfo.SolanaRPC,
79+
SolanaIcs26ProgramId: configInfo.ICS26RouterProgramID,
80+
SolanaIcs07ProgramId: configInfo.ICS07ProgramID,
81+
SolanaIbcAppProgramId: configInfo.IBCAppProgramID,
82+
SolanaFeePayer: configInfo.SolanaFeePayer,
7883
},
7984
},
8085
}

e2e/interchaintestv8/solana/cluster_health.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,10 @@ func (s *Solana) WaitForClusterReady(ctx context.Context, timeout time.Duration)
3939
continue
4040
}
4141

42-
// Ensure faucet has at least 1000 SOL for funding operations
43-
minBalance := uint64(1000_000_000_000) // 1000 SOL in lamports
42+
// Ensure faucet has at least 10 SOL for funding operations
43+
minBalance := uint64(10_000_000_000) // 1000 SOL in lamports
4444
if balance.Value < minBalance {
45-
return fmt.Errorf("faucet balance too low: %d lamports (need at least %d)", balance.Value, minBalance)
45+
return fmt.Errorf("faucet balance too low: %d lamports (need at least %d). Re-create solana validator node", balance.Value, minBalance)
4646
}
4747
}
4848

e2e/interchaintestv8/solana/solana.go

Lines changed: 45 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -95,12 +95,19 @@ func (s *Solana) BroadcastTx(ctx context.Context, tx *solana.Transaction) (solan
9595
)
9696
}
9797

98-
func (s *Solana) WaitForTxConfirmation(txSig solana.Signature) error {
99-
return s.WaitForTxStatus(txSig, rpc.ConfirmationStatusConfirmed)
100-
}
101-
102-
func (s *Solana) WaitForTxFinalization(txSig solana.Signature) error {
103-
return s.WaitForTxStatus(txSig, rpc.ConfirmationStatusFinalized)
98+
// confirmationStatusLevel returns a numeric level for comparison.
99+
// Higher numbers indicate higher confirmation levels.
100+
func confirmationStatusLevel(status rpc.ConfirmationStatusType) int {
101+
switch status {
102+
case rpc.ConfirmationStatusProcessed:
103+
return 1
104+
case rpc.ConfirmationStatusConfirmed:
105+
return 2
106+
case rpc.ConfirmationStatusFinalized:
107+
return 3
108+
default:
109+
return 0
110+
}
104111
}
105112

106113
func (s *Solana) WaitForTxStatus(txSig solana.Signature, status rpc.ConfirmationStatusType) error {
@@ -114,7 +121,7 @@ func (s *Solana) WaitForTxStatus(txSig solana.Signature, status rpc.Confirmation
114121
return false, fmt.Errorf("transaction %s failed with error: %s", txSig, out.Value[0].Err)
115122
}
116123

117-
if out.Value[0].ConfirmationStatus == status {
124+
if confirmationStatusLevel(out.Value[0].ConfirmationStatus) >= confirmationStatusLevel(status) {
118125
return true, nil
119126
}
120127
return false, nil
@@ -142,7 +149,7 @@ func (s *Solana) FundUser(pubkey solana.PublicKey, amount uint64) (solana.Signat
142149
return solana.Signature{}, err
143150
}
144151

145-
return s.SignAndBroadcastTx(context.TODO(), tx, s.Faucet)
152+
return s.SignAndBroadcastTxWithConfirmedStatus(context.TODO(), tx, s.Faucet)
146153
}
147154

148155
func (s *Solana) CreateAndFundWallet() (*solana.Wallet, error) {
@@ -170,12 +177,10 @@ func (s *Solana) WaitForProgramAvailabilityWithTimeout(ctx context.Context, prog
170177
return false
171178
}
172179

173-
// SignAndBroadcastTxWithRetry retries transaction broadcasting with default timeout
174180
func (s *Solana) SignAndBroadcastTxWithRetry(ctx context.Context, tx *solana.Transaction, wallet *solana.Wallet) (solana.Signature, error) {
175181
return s.SignAndBroadcastTxWithRetryTimeout(ctx, tx, wallet, 30)
176182
}
177183

178-
// SignAndBroadcastTxWithRetryTimeout retries transaction broadcasting with specified timeout
179184
func (s *Solana) SignAndBroadcastTxWithRetryTimeout(ctx context.Context, tx *solana.Transaction, wallet *solana.Wallet, timeoutSeconds int) (solana.Signature, error) {
180185
var lastErr error
181186
for range timeoutSeconds {
@@ -189,6 +194,35 @@ func (s *Solana) SignAndBroadcastTxWithRetryTimeout(ctx context.Context, tx *sol
189194
return solana.Signature{}, fmt.Errorf("transaction broadcast timed out after %d seconds: %w", timeoutSeconds, lastErr)
190195
}
191196

197+
func (s *Solana) SignAndBroadcastTxWithConfirmedStatus(ctx context.Context, tx *solana.Transaction, wallet *solana.Wallet) (solana.Signature, error) {
198+
return s.SignAndBroadcastTxWithOpts(ctx, tx, wallet, rpc.ConfirmationStatusConfirmed)
199+
}
200+
201+
func (s *Solana) SignAndBroadcastTxWithOpts(ctx context.Context, tx *solana.Transaction, wallet *solana.Wallet, status rpc.ConfirmationStatusType) (solana.Signature, error) {
202+
_, err := s.SignTx(ctx, tx, wallet)
203+
if err != nil {
204+
return solana.Signature{}, err
205+
}
206+
207+
sig, err := s.RPCClient.SendTransactionWithOpts(
208+
ctx,
209+
tx,
210+
rpc.TransactionOpts{
211+
SkipPreflight: true,
212+
},
213+
)
214+
if err != nil {
215+
return solana.Signature{}, err
216+
}
217+
218+
err = s.WaitForTxStatus(sig, status)
219+
if err != nil {
220+
return solana.Signature{}, err
221+
}
222+
223+
return sig, err
224+
}
225+
192226
// WaitForBalanceChange waits for an account balance to change from the initial value
193227
func (s *Solana) WaitForBalanceChange(ctx context.Context, account solana.PublicKey, initialBalance uint64) (uint64, bool) {
194228
return s.WaitForBalanceChangeWithTimeout(ctx, account, initialBalance, 30)
@@ -197,7 +231,7 @@ func (s *Solana) WaitForBalanceChange(ctx context.Context, account solana.Public
197231
// WaitForBalanceChangeWithTimeout waits for an account balance to change with specified timeout
198232
func (s *Solana) WaitForBalanceChangeWithTimeout(ctx context.Context, account solana.PublicKey, initialBalance uint64, timeoutSeconds int) (uint64, bool) {
199233
for range timeoutSeconds {
200-
balanceResp, err := s.RPCClient.GetBalance(ctx, account, "confirmed")
234+
balanceResp, err := s.RPCClient.GetBalance(ctx, account, rpc.CommitmentConfirmed)
201235
if err == nil {
202236
currentBalance := balanceResp.Value
203237
if currentBalance != initialBalance {

0 commit comments

Comments
 (0)