From 41834ee6576f120e759aa7f61f15d5ea0591c8f1 Mon Sep 17 00:00:00 2001 From: skosito Date: Wed, 21 May 2025 13:55:00 +0200 Subject: [PATCH 1/5] add sender to execute message hash --- contrib/localnet/solana/gateway.so | Bin 381304 -> 383776 bytes pkg/contracts/solana/gateway_message.go | 12 ++++++++++++ 2 files changed, 12 insertions(+) diff --git a/contrib/localnet/solana/gateway.so b/contrib/localnet/solana/gateway.so index dd903d936b3e3d451d169a18dee5db38be5534ff..c3a6dcfe132f3b45bb79ccd78725bdc8b60b70fb 100755 GIT binary patch delta 57755 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 delta 55522 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 Date: Wed, 21 May 2025 13:56:19 +0200 Subject: [PATCH 2/5] changelog --- changelog.md | 1 + 1 file changed, 1 insertion(+) diff --git a/changelog.md b/changelog.md index 5066907e7f..d73dd45e1c 100644 --- a/changelog.md +++ b/changelog.md @@ -48,6 +48,7 @@ * [3850](https://github.com/zeta-chain/node/pull/3850) - broadcast single sui withdraw tx at a time to avoid nonce mismatch failure * [3877](https://github.com/zeta-chain/node/pull/3877) - use multiple SUI coin objects to pay PTB transaction gas fee * [3890](https://github.com/zeta-chain/node/pull/3890) - solana abort address format +* [3896](https://github.com/zeta-chain/node/pull/3896) - add sender to solana execute message hash ### Tests From 2987efff37d692e6f007d5e0ba3bd00749b8ee7a Mon Sep 17 00:00:00 2001 From: skosito Date: Wed, 21 May 2025 19:30:38 +0200 Subject: [PATCH 3/5] fix unit tests --- pkg/contracts/solana/gateway_message_test.go | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/pkg/contracts/solana/gateway_message_test.go b/pkg/contracts/solana/gateway_message_test.go index b86eebc3a3..e3fa5de907 100644 --- a/pkg/contracts/solana/gateway_message_test.go +++ b/pkg/contracts/solana/gateway_message_test.go @@ -108,7 +108,7 @@ func Test_MsgExecuteHash(t *testing.T) { to := solana.MustPublicKeyFromBase58("37yGiHAnLvWZUNVwu9esp74YQFqxU1qHCbABkDvRddUQ") sender := common.HexToAddress("0x42bd6E2ce4CDb2F58Ed0A0E427F011A0645D5E33") - wantHash := "7391cf357fd80e7cb3d2a9758932fdea4988d03c87210a2632f03b467728d199" + wantHash := "ff0737262c010614dead18a4ed152ca38bd92aae694f08ba611cea307f3d92d9" wantHashBytes := testutil.HexToBytes(t, wantHash) // ACT @@ -134,7 +134,7 @@ func Test_MsgExecuteSPLHash(t *testing.T) { require.NoError(t, err) sender := common.HexToAddress("0x42bd6E2ce4CDb2F58Ed0A0E427F011A0645D5E33") - wantHash := "d90f9640faecd76509b4e88fa7d18f130918130b8666179f1597f185a828d3a5" + wantHash := "8ed9d12294399703611bf6b4d131aa0cdd9b1c2ca7e2586238c47929766ed0b9" wantHashBytes := testutil.HexToBytes(t, wantHash) // ACT @@ -155,14 +155,14 @@ func Test_MsgExecuteRevertHash(t *testing.T) { nonce := uint64(0) amount := uint64(1336000) to := solana.MustPublicKeyFromBase58("37yGiHAnLvWZUNVwu9esp74YQFqxU1qHCbABkDvRddUQ") - sender := common.HexToAddress("0x42bd6E2ce4CDb2F58Ed0A0E427F011A0645D5E33") + sender := solana.MustPublicKeyFromBase58("CVoPuE3EMu6QptGHLx7mDGb2ZgASJRQ5BcTvmhZNJd8A") - wantHash := "A55A5E8E302D5BA9A4C2DCDE54225F45F5E20081873AA7F6A3A361DB20527E31" + wantHash := "8a84b88736c9b677b1d859b212bd07f9808f8ca07682b3585eb1b6c5f2f6f4dd" wantHashBytes := testutil.HexToBytes(t, wantHash) // ACT // create new execute message - hash := contracts.NewMsgExecute(chainID, nonce, amount, to, sender.Hex(), []byte("hello"), contracts.ExecuteTypeRevert, []*solana.AccountMeta{}). + hash := contracts.NewMsgExecute(chainID, nonce, amount, to, sender.String(), []byte("hello"), contracts.ExecuteTypeRevert, []*solana.AccountMeta{}). Hash() // ASSERT @@ -180,14 +180,14 @@ func Test_MsgExecuteSPLRevertHash(t *testing.T) { to := solana.MustPublicKeyFromBase58("37yGiHAnLvWZUNVwu9esp74YQFqxU1qHCbABkDvRddUQ") toAta, _, err := solana.FindAssociatedTokenAddress(to, mintAccount) require.NoError(t, err) - sender := common.HexToAddress("0x42bd6E2ce4CDb2F58Ed0A0E427F011A0645D5E33") + sender := solana.MustPublicKeyFromBase58("CVoPuE3EMu6QptGHLx7mDGb2ZgASJRQ5BcTvmhZNJd8A") - wantHash := "C27871066FB9F28387E39281F267688FC54CE584F321891454503B17C3353B11" + wantHash := "147f471f794e0227653f69c40d9ac0ab278ac8549de41d9229e9b6ca14735c57" wantHashBytes := testutil.HexToBytes(t, wantHash) // ACT // create new execute message - hash := contracts.NewMsgExecuteSPL(chainID, nonce, amount, 8, mintAccount, to, toAta, sender.Hex(), []byte("hello"), contracts.ExecuteTypeRevert, []*solana.AccountMeta{}). + hash := contracts.NewMsgExecuteSPL(chainID, nonce, amount, 8, mintAccount, to, toAta, sender.String(), []byte("hello"), contracts.ExecuteTypeRevert, []*solana.AccountMeta{}). Hash() // ASSERT From 2fcb10e4a9c78e1b52deb5c4a7d984c47bbe87f1 Mon Sep 17 00:00:00 2001 From: skosito Date: Wed, 21 May 2025 19:57:22 +0200 Subject: [PATCH 4/5] validate sender based on execute type --- zetaclient/chains/solana/signer/execute.go | 28 ++++++++++++++++++- .../chains/solana/signer/execute_spl.go | 8 +++++- .../chains/solana/signer/withdraw_spl.go | 7 ++++- 3 files changed, 40 insertions(+), 3 deletions(-) diff --git a/zetaclient/chains/solana/signer/execute.go b/zetaclient/chains/solana/signer/execute.go index 5378cb8a93..7a6cea9da6 100644 --- a/zetaclient/chains/solana/signer/execute.go +++ b/zetaclient/chains/solana/signer/execute.go @@ -2,6 +2,7 @@ package signer import ( "context" + "fmt" "cosmossdk.io/errors" "github.com/ethereum/go-ethereum/common" @@ -88,6 +89,12 @@ func (signer *Signer) createMsgExecute( return nil, nil, errors.Wrapf(err, "cannot decode receiver address %s", params.Receiver) } + // check sender based on execute type + sender, err := validateSender(cctx.InboundParams.Sender, executeType) + if err != nil { + return nil, nil, errors.Wrap(err, "cannot validate sender") + } + remainingAccounts := []*solana.AccountMeta{} for _, a := range msg.Accounts { remainingAccounts = append(remainingAccounts, &solana.AccountMeta{ @@ -101,7 +108,7 @@ func (signer *Signer) createMsgExecute( nonce, amount, to, - cctx.InboundParams.Sender, + sender, msg.Data, executeType, remainingAccounts, @@ -172,3 +179,22 @@ func (signer *Signer) createExecuteInstruction(msg contracts.MsgExecute) (*solan return inst, nil } + +// validateSender validates and formats the sender address based on execute type +func validateSender(sender string, executeType contracts.ExecuteType) (string, error) { + if executeType == contracts.ExecuteTypeCall { + // for regular execute, sender should be an Ethereum address + senderEth := common.HexToAddress(sender) + if senderEth == (common.Address{}) { + return "", fmt.Errorf("invalid execute sender %s", sender) + } + return senderEth.Hex(), nil + } else { + // for revert execute, sender should be a Solana address + senderSol, err := solana.PublicKeyFromBase58(sender) + if err != nil { + return "", errors.Wrapf(err, "invalid execute revert sender %s", sender) + } + return senderSol.String(), nil + } +} diff --git a/zetaclient/chains/solana/signer/execute_spl.go b/zetaclient/chains/solana/signer/execute_spl.go index 822eece7eb..6235522806 100644 --- a/zetaclient/chains/solana/signer/execute_spl.go +++ b/zetaclient/chains/solana/signer/execute_spl.go @@ -94,6 +94,12 @@ func (signer *Signer) createMsgExecuteSPL( return nil, nil, errors.Wrapf(err, "cannot decode receiver address %s", params.Receiver) } + // check sender based on execute type + sender, err := validateSender(cctx.InboundParams.Sender, executeType) + if err != nil { + return nil, nil, errors.Wrap(err, "cannot validate sender") + } + // parse mint account mintAccount, err := solana.PublicKeyFromBase58(cctx.InboundParams.Asset) if err != nil { @@ -133,7 +139,7 @@ func (signer *Signer) createMsgExecuteSPL( mintAccount, to, destinationProgramPdaAta, - cctx.InboundParams.Sender, + sender, msg.Data, executeType, remainingAccounts, diff --git a/zetaclient/chains/solana/signer/withdraw_spl.go b/zetaclient/chains/solana/signer/withdraw_spl.go index b1c470cfc7..494a79ada3 100644 --- a/zetaclient/chains/solana/signer/withdraw_spl.go +++ b/zetaclient/chains/solana/signer/withdraw_spl.go @@ -157,7 +157,12 @@ func (signer *Signer) createWithdrawSPLInstruction(msg contracts.MsgWithdrawSPL) } func (signer *Signer) decodeMintAccountDetails(ctx context.Context, asset string) (token.Mint, error) { - info, err := signer.client.GetAccountInfo(ctx, solana.MustPublicKeyFromBase58(asset)) + mintPk, err := solana.PublicKeyFromBase58(asset) + if err != nil { + return token.Mint{}, err + } + + info, err := signer.client.GetAccountInfo(ctx, mintPk) if err != nil { return token.Mint{}, err } From 7fb2d3a0f57813d451bc3ccb175787fb87a4433e Mon Sep 17 00:00:00 2001 From: skosito Date: Wed, 21 May 2025 20:35:36 +0200 Subject: [PATCH 5/5] lint --- zetaclient/chains/solana/signer/execute.go | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/zetaclient/chains/solana/signer/execute.go b/zetaclient/chains/solana/signer/execute.go index 7a6cea9da6..0f10790558 100644 --- a/zetaclient/chains/solana/signer/execute.go +++ b/zetaclient/chains/solana/signer/execute.go @@ -189,12 +189,12 @@ func validateSender(sender string, executeType contracts.ExecuteType) (string, e return "", fmt.Errorf("invalid execute sender %s", sender) } return senderEth.Hex(), nil - } else { - // for revert execute, sender should be a Solana address - senderSol, err := solana.PublicKeyFromBase58(sender) - if err != nil { - return "", errors.Wrapf(err, "invalid execute revert sender %s", sender) - } - return senderSol.String(), nil } + + // for revert execute, sender should be a Solana address + senderSol, err := solana.PublicKeyFromBase58(sender) + if err != nil { + return "", errors.Wrapf(err, "invalid execute revert sender %s", sender) + } + return senderSol.String(), nil }