@@ -29,7 +29,7 @@ import (
2929 "os"
3030 "sort"
3131
32- "filippo.io/edwards25519"
32+ "filippo.io/edwards25519/field "
3333 "github.com/gagliardetto/solana-go/base58"
3434 mrtronbase58 "github.com/mr-tron/base58"
3535 "go.mongodb.org/mongo-driver/v2/bson"
@@ -678,14 +678,35 @@ func CreateProgramAddress(seeds [][]byte, programID PublicKey) (PublicKey, error
678678 return PublicKeyFromBytes (hash [:]), nil
679679}
680680
681+ var feOne = new (field.Element ).One ()
682+ var d , _ = new (field.Element ).SetBytes ([]byte {
683+ 0xa3 , 0x78 , 0x59 , 0x13 , 0xca , 0x4d , 0xeb , 0x75 ,
684+ 0xab , 0xd8 , 0x41 , 0x41 , 0x4d , 0x0a , 0x70 , 0x00 ,
685+ 0x98 , 0xe8 , 0x79 , 0x77 , 0x79 , 0x40 , 0xc7 , 0x8c ,
686+ 0x73 , 0xfe , 0x6f , 0x2b , 0xee , 0x6c , 0x03 , 0x52 })
687+
681688// Check if the provided `b` is on the ed25519 curve.
682689func IsOnCurve (b []byte ) bool {
683690 if len (b ) != ed25519 .PublicKeySize {
684691 return false
685692 }
686- _ , err := new (edwards25519.Point ).SetBytes (b )
687- isOnCurve := err == nil
688- return isOnCurve
693+ //_, err := new(edwards25519.Point).SetBytes(b)
694+ y , err := new (field.Element ).SetBytes (b )
695+ if err != nil {
696+ return false
697+ }
698+
699+ y2 := new (field.Element ).Square (y )
700+ u := new (field.Element ).Subtract (y2 , feOne )
701+
702+ vv := new (field.Element ).Multiply (y2 , d )
703+ vv = vv .Add (vv , feOne )
704+
705+ _ , wasSquare := new (field.Element ).SqrtRatio (u , vv )
706+ if wasSquare == 0 {
707+ return false
708+ }
709+ return true
689710}
690711
691712// Find a valid program address and its corresponding bump seed.
0 commit comments