Skip to content

Commit 11c3e77

Browse files
authored
Merge pull request #19 from pushchain/fix-SVM-verification-program-id-err
Fix svm verification program id err
2 parents 5e8be5e + 4c27fca commit 11c3e77

File tree

3 files changed

+42
-10
lines changed

3 files changed

+42
-10
lines changed

x/ue/types/constants.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,3 +17,15 @@ var ProxyRuntimeBytecode = common.FromHex("0x608060405261000c61000e565b005b7f000
1717
var ProxyAdminRuntimeBytecode = common.FromHex("0x608060405260043610610058575f3560e01c80639623609d116100415780639623609d146100aa578063ad3cb1cc146100bd578063f2fde38b14610112575f80fd5b8063715018a61461005c5780638da5cb5b14610072575b5f80fd5b348015610067575f80fd5b50610070610131565b005b34801561007d575f80fd5b505f5460405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6100706100b8366004610351565b610144565b3480156100c8575f80fd5b506101056040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516100a191906104c6565b34801561011d575f80fd5b5061007061012c3660046104df565b6101d5565b61013961023d565b6101425f61028f565b565b61014c61023d565b6040517f4f1ef28600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841690634f1ef2869034906101a290869086906004016104fa565b5f604051808303818588803b1580156101b9575f80fd5b505af11580156101cb573d5f803e3d5ffd5b5050505050505050565b6101dd61023d565b73ffffffffffffffffffffffffffffffffffffffff8116610231576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024015b60405180910390fd5b61023a8161028f565b50565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610142576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610228565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b73ffffffffffffffffffffffffffffffffffffffff8116811461023a575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f805f60608486031215610363575f80fd5b833561036e81610303565b9250602084013561037e81610303565b9150604084013567ffffffffffffffff811115610399575f80fd5b8401601f810186136103a9575f80fd5b803567ffffffffffffffff8111156103c3576103c3610324565b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8501160116810181811067ffffffffffffffff8211171561042f5761042f610324565b604052818152828201602001881015610446575f80fd5b816020840160208301375f602083830101528093505050509250925092565b5f81518084525f5b818110156104895760208185018101518683018201520161046d565b505f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f6104d86020830184610465565b9392505050565b5f602082840312156104ef575f80fd5b81356104d881610303565b73ffffffffffffffffffffffffffffffffffffffff83168152604060208201525f6105286040830184610465565b94935050505056fea26469706673582212209ce80139bf41b00bc44c4532122ff649c1e8542240b8a5c13f39af0d72f21b2364736f6c634300081a0033")
1818

1919
var FactoryImplRuntimeBytecode = common.FromHex("0x608060405234801561000f575f80fd5b506004361061012f575f3560e01c80638da5cb5b116100ad578063c4d66de81161007d578063e720582e11610063578063e720582e14610369578063edb6a18a1461039e578063f2fde38b146103bd575f80fd5b8063c4d66de814610335578063d0f4b09714610348575f80fd5b80638da5cb5b146102a05780639538c4b3146102dd578063b4cb9f8c14610301578063bce6d0d314610314575f80fd5b806330363dd21161010257806357b1f59b116100e857806357b1f59b14610272578063715018a61461028557806374b0cfe21461028d575f80fd5b806330363dd2146101fe5780633ab78c4614610233575f80fd5b8063026df46114610133578063031bc85b146101705780630d7c4b37146101a85780632ab6b9c2146101e9575b5f80fd5b610146610141366004611290565b6103d0565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b61019361017e366004611344565b5f908152600360205260409020549081151590565b60408051928352901515602083015201610167565b6101466101b6366004611344565b5f9081526003602090815260408083205483529082905290205473ffffffffffffffffffffffffffffffffffffffff1690565b6101fc6101f736600461135b565b6106b1565b005b61014661020c366004611344565b5f6020819052908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b610246610241366004611290565b610752565b6040805173ffffffffffffffffffffffffffffffffffffffff9093168352901515602083015201610167565b6101fc610280366004611430565b6107ad565b6101fc61086e565b61014661029b366004611290565b610881565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005473ffffffffffffffffffffffffffffffffffffffff16610146565b6102f16102eb36600461151e565b3b151590565b6040519015158152602001610167565b6101fc61030f366004611537565b6109ec565b610327610322366004611290565b610b25565b604051908152602001610167565b6101fc61034336600461151e565b610b54565b61035b61035636600461151e565b610cd2565b60405161016792919061160a565b610146610377366004611344565b60016020525f908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b6103276103ac366004611344565b60036020525f908152604090205481565b6101fc6103cb36600461151e565b610e64565b5f806103db83610b25565b5f8181526001602052604090205490915073ffffffffffffffffffffffffffffffffffffffff1615610439576040517f69783db700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f835f0151846020015160405160200161045492919061162d565b6040516020818303038152906040528051906020012090505f80610487835f908152600360205260409020549081151590565b91509150806104c2576040517f5ab75e0b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8281526020819052604090205473ffffffffffffffffffffffffffffffffffffffff168061051d576040517f5ab75e0b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61053e73ffffffffffffffffffffffffffffffffffffffff831687610ecc565b5f87815260016020908152604080832080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86169081179091558352600290915290208951919250899181906105ab90826116eb565b5060208201516001820155604082015160028201906105ca90826116eb565b50506040517f1669853e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83169150631669853e9061061f908b90600401611802565b5f604051808303815f87803b158015610636575f80fd5b505af1158015610648573d5f803e3d5ffd5b505050508073ffffffffffffffffffffffffffffffffffffffff167f55b7e55d17747b1fb1b8d870b2a3ac3bc0d9f3359ed7d3abcb0e0c9f034ae2d089604001518a602001518860405161069e93929190611814565b60405180910390a2979650505050505050565b6106b9610edf565b5f8281526003602052604090205415801590610701576040517f5ab75e0b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f83815260036020526040908190208390555183907f49564762e2866e9dc959573af8fba43b9089624ee471955f601b49fe69716d9f906107459085815260200190565b60405180910390a2505050565b5f805f61075e84610b25565b5f8181526001602052604090205473ffffffffffffffffffffffffffffffffffffffff1693509050821561079957823b15155b915050915091565b6107a284610881565b9250823b1515610791565b6107b5610edf565b815181511415806107c857508251815114155b156107ff576040517f5ab75e0b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b81518110156108685761086084828151811061081f5761081f611838565b602002602001015184838151811061083957610839611838565b602002602001015184848151811061085357610853611838565b60200260200101516109ec565b600101610801565b50505050565b610876610edf565b61087f5f610f6d565b565b5f80825f0151836020015160405160200161089d92919061162d565b6040516020818303038152906040528051906020012090505f806108d0835f908152600360205260409020549081151590565b915091508061090b576040517f5ab75e0b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8281526020819052604090205473ffffffffffffffffffffffffffffffffffffffff1680610966576040517f5ab75e0b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61097087610b25565b6040513060388201526f5af43d82803e903d91602b57fd5bf3ff602482015273ffffffffffffffffffffffffffffffffffffffff9384166014820152733d602d80600a3d3981f3363d3d373d3d3d363d73815260588101919091526037600c820120607882015260556043909101209091169695505050505050565b6109f4610edf565b73ffffffffffffffffffffffffffffffffffffffff8116610a41576040517f5ab75e0b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f83815260036020526040902054801580159080610a5f5750838214155b15610a96576040517f5ab75e0b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f848152602081815260409182902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8716908117909155825190815290810186905286917f2d85c152b87e7ab165fa8084701425fcdd10a7f5ccfab2eb6905ebcaabd7dba4910160405180910390a25050505050565b5f81604051602001610b379190611802565b604051602081830303815290604052805190602001209050919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff16159067ffffffffffffffff165f81158015610b9e5750825b90505f8267ffffffffffffffff166001148015610bba5750303b155b905081158015610bc8575080155b15610bff576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001660011785558315610c605784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b610c6986611002565b8315610cca5784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b610cf56040518060600160405280606081526020015f8152602001606081525090565b73ffffffffffffffffffffffffffffffffffffffff82165f90815260026020526040808220815160608101909252805482908290610d329061164e565b80601f0160208091040260200160405190810160405280929190818152602001828054610d5e9061164e565b8015610da95780601f10610d8057610100808354040283529160200191610da9565b820191905f5260205f20905b815481529060010190602001808311610d8c57829003601f168201915b5050505050815260200160018201548152602001600282018054610dcc9061164e565b80601f0160208091040260200160405190810160405280929190818152602001828054610df89061164e565b8015610e435780601f10610e1a57610100808354040283529160200191610e43565b820191905f5260205f20905b815481529060010190602001808311610e2657829003601f168201915b50505050508152505091505f8260400151511115610e5f575060015b915091565b610e6c610edf565b73ffffffffffffffffffffffffffffffffffffffff8116610ec0576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024015b60405180910390fd5b610ec981610f6d565b50565b5f610ed883835f611013565b9392505050565b33610f1e7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff161461087f576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610eb7565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080547fffffffffffffffffffffffff0000000000000000000000000000000000000000811673ffffffffffffffffffffffffffffffffffffffff848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b61100a6110e7565b610ec98161114e565b5f81471015611057576040517fcf47918100000000000000000000000000000000000000000000000000000000815247600482015260248101839052604401610eb7565b763d602d80600a3d3981f3363d3d373d3d3d363d730000008460601b60e81c175f526e5af43d82803e903d91602b57fd5bf38460781b17602052826037600984f5905073ffffffffffffffffffffffffffffffffffffffff8116610ed8576040517fb06ebf3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005468010000000000000000900460ff1661087f576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e6c6110e7565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040516060810167ffffffffffffffff811182821017156111a6576111a6611156565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156111f3576111f3611156565b604052919050565b5f8067ffffffffffffffff84111561121557611215611156565b50601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016602001611248816111ac565b91505082815283838301111561125c575f80fd5b828260208301375f602084830101529392505050565b5f82601f830112611281575f80fd5b610ed8838335602085016111fb565b5f602082840312156112a0575f80fd5b813567ffffffffffffffff8111156112b6575f80fd5b8201606081850312156112c7575f80fd5b6112cf611183565b813567ffffffffffffffff8111156112e5575f80fd5b8201601f810186136112f5575f80fd5b611304868235602084016111fb565b82525060208201356020820152604082013567ffffffffffffffff81111561132a575f80fd5b61133686828501611272565b604083015250949350505050565b5f60208284031215611354575f80fd5b5035919050565b5f806040838503121561136c575f80fd5b50508035926020909101359150565b5f67ffffffffffffffff82111561139457611394611156565b5060051b60200190565b5f82601f8301126113ad575f80fd5b81356113c06113bb8261137b565b6111ac565b8082825260208201915060208360051b8601019250858311156113e1575f80fd5b602085015b838110156113fe5780358352602092830192016113e6565b5095945050505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461142b575f80fd5b919050565b5f805f60608486031215611442575f80fd5b833567ffffffffffffffff811115611458575f80fd5b6114648682870161139e565b935050602084013567ffffffffffffffff811115611480575f80fd5b61148c8682870161139e565b925050604084013567ffffffffffffffff8111156114a8575f80fd5b8401601f810186136114b8575f80fd5b80356114c66113bb8261137b565b8082825260208201915060208360051b8501019250888311156114e7575f80fd5b6020840193505b82841015611510576114ff84611408565b8252602093840193909101906114ee565b809450505050509250925092565b5f6020828403121561152e575f80fd5b610ed882611408565b5f805f60608486031215611549575f80fd5b833592506020840135915061156060408501611408565b90509250925092565b5f81518084525f5b8181101561158d57602081850181015186830182015201611571565b505f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b5f8151606084526115de6060850182611569565b905060208301516020850152604083015184820360408601526116018282611569565b95945050505050565b604081525f61161c60408301856115ca565b905082151560208301529392505050565b604081525f61163f6040830185611569565b90508260208301529392505050565b600181811c9082168061166257607f821691505b602082108103611699577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b601f8211156116e657805f5260205f20601f840160051c810160208510156116c45750805b601f840160051c820191505b818110156116e3575f81556001016116d0565b50505b505050565b815167ffffffffffffffff81111561170557611705611156565b61171981611713845461164e565b8461169f565b6020601f82116001811461176a575f83156117345750848201515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600385901b1c1916600184901b1784556116e3565b5f848152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08516915b828110156117b75787850151825560209485019460019092019101611797565b50848210156117f357868401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b60f8161c191681555b50505050600190811b01905550565b602081525f610ed860208301846115ca565b606081525f6118266060830186611569565b60208301949094525060400152919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffdfea2646970667358221220bd3c0f050255886e418be24061e00960d105f4c24a6ae45a88e750ee6887146864736f6c634300081a0033")
20+
21+
var METHOD = struct {
22+
SVM struct {
23+
AddFunds string
24+
}
25+
EVM struct {
26+
AddFunds string
27+
}
28+
}{
29+
SVM: struct{ AddFunds string }{AddFunds: "add_funds"},
30+
EVM: struct{ AddFunds string }{AddFunds: "addFunds"},
31+
}

x/utv/keeper/verify_tx_evm.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ func (k Keeper) verifyEVMAndGetFunds(ctx context.Context, ownerKey, txHash strin
113113
// Step 3: Extract amount from logs
114114
eventTopic := ""
115115
for _, method := range chainConfig.GatewayMethods {
116-
if method.Name == "addFunds" {
116+
if method.Name == types.METHOD.EVM.AddFunds {
117117
eventTopic = method.EventIdentifier
118118
break
119119
}
@@ -136,7 +136,7 @@ func didSendToGateway(toAddress string, gatewayAddress string) bool {
136136

137137
func isCallingAddFunds(txInput string, chainConfig types.ChainConfig) (bool, string) {
138138
for _, method := range chainConfig.GatewayMethods {
139-
if method.Name == "addFunds" {
139+
if method.Name == types.METHOD.EVM.AddFunds {
140140
selector := method.Identifier
141141
if strings.HasPrefix(txInput, selector) {
142142
return true, selector

x/utv/keeper/verify_tx_svm.go

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ func (k Keeper) verifySVMInteraction(ctx context.Context, ownerKey, txHash strin
6767

6868
programID := tx.Transaction.Message.AccountKeys[instruction.ProgramIDIndex]
6969

70-
if strings.EqualFold(programID, chainConfig.GatewayAddress) {
70+
if compareSolanaAddresses(programID, chainConfig.GatewayAddress) {
7171
foundGatewayCall = true
7272

7373
// Verify the instruction has the required accounts
@@ -102,8 +102,7 @@ func (k Keeper) verifySVMInteraction(ctx context.Context, ownerKey, txHash strin
102102
// Get the expected discriminator from chain config
103103
var expectedDiscriminator []byte
104104
for _, method := range chainConfig.GatewayMethods {
105-
if method.Name == "add_funds" {
106-
// Convert hex string to bytes
105+
if method.Name == types.METHOD.SVM.AddFunds { // Convert hex string to bytes
107106
expectedDiscriminator, err = hex.DecodeString(method.Identifier)
108107
if err != nil {
109108
return fmt.Errorf("invalid discriminator in chain config: %w", err)
@@ -171,10 +170,25 @@ func (k Keeper) verifySVMAndGetFunds(ctx context.Context, ownerKey, txHash strin
171170
if len(tx.Transaction.Message.Instructions) == 0 {
172171
return *big.NewInt(0), 0, fmt.Errorf("no instructions found in transaction")
173172
}
174-
programID := tx.Transaction.Message.AccountKeys[tx.Transaction.Message.Instructions[0].ProgramIDIndex]
175173

176-
if !strings.EqualFold(programID, chainConfig.GatewayAddress) {
177-
return *big.NewInt(0), 0, fmt.Errorf("transaction program ID %s does not match gateway contract %s", programID, chainConfig.GatewayAddress)
174+
// Check if any instruction calls the gateway contract
175+
foundGatewayCall := false
176+
for _, instruction := range tx.Transaction.Message.Instructions {
177+
// Verify program ID index is valid
178+
if instruction.ProgramIDIndex < 0 || instruction.ProgramIDIndex >= len(tx.Transaction.Message.AccountKeys) {
179+
return *big.NewInt(0), 0, fmt.Errorf("invalid program ID index: %d", instruction.ProgramIDIndex)
180+
}
181+
182+
programID := tx.Transaction.Message.AccountKeys[instruction.ProgramIDIndex]
183+
184+
if compareSolanaAddresses(programID, chainConfig.GatewayAddress) {
185+
foundGatewayCall = true
186+
break
187+
}
188+
}
189+
190+
if !foundGatewayCall {
191+
return *big.NewInt(0), 0, fmt.Errorf("no instruction found calling the gateway contract %s", chainConfig.GatewayAddress)
178192
}
179193

180194
// Step 2: Verify confirmations
@@ -197,8 +211,7 @@ func (k Keeper) verifySVMAndGetFunds(ctx context.Context, ownerKey, txHash strin
197211
// Get the event discriminator from chain config
198212
var eventDiscriminator []byte
199213
for _, method := range chainConfig.GatewayMethods {
200-
if method.Name == "add_funds" {
201-
// Convert hex string to bytes
214+
if method.Name == types.METHOD.SVM.AddFunds {
202215
eventDiscriminator, err = hex.DecodeString(method.EventIdentifier)
203216
if err != nil {
204217
return *big.NewInt(0), 0, fmt.Errorf("invalid event discriminator in chain config: %w", err)
@@ -261,6 +274,13 @@ func (k Keeper) verifySVMAndGetFunds(ctx context.Context, ownerKey, txHash strin
261274
return *usdAmount, decimals, nil
262275
}
263276

277+
// compareSolanaAddresses compares two Solana addresses by decoding them to raw bytes
278+
func compareSolanaAddresses(addr1, addr2 string) bool {
279+
bytes1 := base58.Decode(addr1)
280+
bytes2 := base58.Decode(addr2)
281+
return bytes1 != nil && bytes2 != nil && bytes.Equal(bytes1, bytes2)
282+
}
283+
264284
// readI128LE decodes a little-endian i128 value from Anchor logs
265285
func readI128LE(b []byte) *big.Int {
266286
if len(b) != 16 {

0 commit comments

Comments
 (0)