From ccb4c66ef7ccc6be7e49c22ba9d2cfde34ec055e Mon Sep 17 00:00:00 2001 From: Marcus Pasell <3690498+rickyrombo@users.noreply.github.com> Date: Wed, 23 Apr 2025 17:32:35 -0700 Subject: [PATCH 1/4] Fix error handler to change status code --- api/error_response.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/api/error_response.go b/api/error_response.go index 62fd3085..0c20b678 100644 --- a/api/error_response.go +++ b/api/error_response.go @@ -1,6 +1,7 @@ package api import ( + "errors" "net/http" "github.com/gofiber/fiber/v2" @@ -22,6 +23,11 @@ func errorHandler(logger *zap.Logger) func(*fiber.Ctx, error) error { code = http.StatusNotFound } + var e *fiber.Error + if errors.As(err, &e) { + code = e.Code + } + if code > 499 { logger.Error(err.Error(), zap.String("url", ctx.OriginalURL())) From 417fd6514c298595fc15109ad17020173a4a6326 Mon Sep 17 00:00:00 2001 From: Marcus Pasell <3690498+rickyrombo@users.noreply.github.com> Date: Wed, 23 Apr 2025 22:55:54 -0700 Subject: [PATCH 2/4] move solana to spl to prevent name conflicts --- .../programs/reward_manager/ChangeManagerAccount.go | 0 api/{solana => spl}/programs/reward_manager/CreateSender.go | 0 .../programs/reward_manager/CreateSenderPublic.go | 0 api/{solana => spl}/programs/reward_manager/DeleteSender.go | 0 .../programs/reward_manager/DeleteSenderPublic.go | 0 .../programs/reward_manager/EvaluateAttestations.go | 0 .../programs/reward_manager/EvaluateAttestations_test.go | 2 +- api/{solana => spl}/programs/reward_manager/Init.go | 0 .../programs/reward_manager/SubmitAttestation.go | 0 api/{solana => spl}/programs/reward_manager/instruction.go | 3 ++- api/{solana => spl}/programs/secp256k1/Secp256k1Instruction.go | 0 .../programs/secp256k1/Secp256k1Instruction_test.go | 2 +- api/{solana => spl}/programs/secp256k1/instruction.go | 0 13 files changed, 4 insertions(+), 3 deletions(-) rename api/{solana => spl}/programs/reward_manager/ChangeManagerAccount.go (100%) rename api/{solana => spl}/programs/reward_manager/CreateSender.go (100%) rename api/{solana => spl}/programs/reward_manager/CreateSenderPublic.go (100%) rename api/{solana => spl}/programs/reward_manager/DeleteSender.go (100%) rename api/{solana => spl}/programs/reward_manager/DeleteSenderPublic.go (100%) rename api/{solana => spl}/programs/reward_manager/EvaluateAttestations.go (100%) rename api/{solana => spl}/programs/reward_manager/EvaluateAttestations_test.go (97%) rename api/{solana => spl}/programs/reward_manager/Init.go (100%) rename api/{solana => spl}/programs/reward_manager/SubmitAttestation.go (100%) rename api/{solana => spl}/programs/reward_manager/instruction.go (98%) rename api/{solana => spl}/programs/secp256k1/Secp256k1Instruction.go (100%) rename api/{solana => spl}/programs/secp256k1/Secp256k1Instruction_test.go (98%) rename api/{solana => spl}/programs/secp256k1/instruction.go (100%) diff --git a/api/solana/programs/reward_manager/ChangeManagerAccount.go b/api/spl/programs/reward_manager/ChangeManagerAccount.go similarity index 100% rename from api/solana/programs/reward_manager/ChangeManagerAccount.go rename to api/spl/programs/reward_manager/ChangeManagerAccount.go diff --git a/api/solana/programs/reward_manager/CreateSender.go b/api/spl/programs/reward_manager/CreateSender.go similarity index 100% rename from api/solana/programs/reward_manager/CreateSender.go rename to api/spl/programs/reward_manager/CreateSender.go diff --git a/api/solana/programs/reward_manager/CreateSenderPublic.go b/api/spl/programs/reward_manager/CreateSenderPublic.go similarity index 100% rename from api/solana/programs/reward_manager/CreateSenderPublic.go rename to api/spl/programs/reward_manager/CreateSenderPublic.go diff --git a/api/solana/programs/reward_manager/DeleteSender.go b/api/spl/programs/reward_manager/DeleteSender.go similarity index 100% rename from api/solana/programs/reward_manager/DeleteSender.go rename to api/spl/programs/reward_manager/DeleteSender.go diff --git a/api/solana/programs/reward_manager/DeleteSenderPublic.go b/api/spl/programs/reward_manager/DeleteSenderPublic.go similarity index 100% rename from api/solana/programs/reward_manager/DeleteSenderPublic.go rename to api/spl/programs/reward_manager/DeleteSenderPublic.go diff --git a/api/solana/programs/reward_manager/EvaluateAttestations.go b/api/spl/programs/reward_manager/EvaluateAttestations.go similarity index 100% rename from api/solana/programs/reward_manager/EvaluateAttestations.go rename to api/spl/programs/reward_manager/EvaluateAttestations.go diff --git a/api/solana/programs/reward_manager/EvaluateAttestations_test.go b/api/spl/programs/reward_manager/EvaluateAttestations_test.go similarity index 97% rename from api/solana/programs/reward_manager/EvaluateAttestations_test.go rename to api/spl/programs/reward_manager/EvaluateAttestations_test.go index 99d21827..cd9f659d 100644 --- a/api/solana/programs/reward_manager/EvaluateAttestations_test.go +++ b/api/spl/programs/reward_manager/EvaluateAttestations_test.go @@ -4,7 +4,7 @@ import ( "encoding/hex" "testing" - "bridgerton.audius.co/api/solana/programs/reward_manager" + "bridgerton.audius.co/api/spl/programs/reward_manager" "github.com/gagliardetto/solana-go" "github.com/stretchr/testify/require" ) diff --git a/api/solana/programs/reward_manager/Init.go b/api/spl/programs/reward_manager/Init.go similarity index 100% rename from api/solana/programs/reward_manager/Init.go rename to api/spl/programs/reward_manager/Init.go diff --git a/api/solana/programs/reward_manager/SubmitAttestation.go b/api/spl/programs/reward_manager/SubmitAttestation.go similarity index 100% rename from api/solana/programs/reward_manager/SubmitAttestation.go rename to api/spl/programs/reward_manager/SubmitAttestation.go diff --git a/api/solana/programs/reward_manager/instruction.go b/api/spl/programs/reward_manager/instruction.go similarity index 98% rename from api/solana/programs/reward_manager/instruction.go rename to api/spl/programs/reward_manager/instruction.go index fb980e69..e58d6784 100644 --- a/api/solana/programs/reward_manager/instruction.go +++ b/api/spl/programs/reward_manager/instruction.go @@ -4,6 +4,7 @@ import ( "bytes" "encoding/hex" "fmt" + "strings" bin "github.com/gagliardetto/binary" "github.com/gagliardetto/solana-go" @@ -136,7 +137,7 @@ func deriveAuthority(programId solana.PublicKey, state solana.PublicKey) (solana func deriveSender(programId solana.PublicKey, authority solana.PublicKey, ethAddress string) (solana.PublicKey, uint8, error) { senderSeedPrefix := []byte(SenderSeedPrefix) // Remove 0x and decode hex - decodedEthAddress, err := hex.DecodeString(ethAddress[2:]) + decodedEthAddress, err := hex.DecodeString(strings.TrimPrefix(ethAddress, "0x")) if err != nil { return solana.PublicKey{}, 0, err } diff --git a/api/solana/programs/secp256k1/Secp256k1Instruction.go b/api/spl/programs/secp256k1/Secp256k1Instruction.go similarity index 100% rename from api/solana/programs/secp256k1/Secp256k1Instruction.go rename to api/spl/programs/secp256k1/Secp256k1Instruction.go diff --git a/api/solana/programs/secp256k1/Secp256k1Instruction_test.go b/api/spl/programs/secp256k1/Secp256k1Instruction_test.go similarity index 98% rename from api/solana/programs/secp256k1/Secp256k1Instruction_test.go rename to api/spl/programs/secp256k1/Secp256k1Instruction_test.go index b71f812f..01e07b23 100644 --- a/api/solana/programs/secp256k1/Secp256k1Instruction_test.go +++ b/api/spl/programs/secp256k1/Secp256k1Instruction_test.go @@ -4,7 +4,7 @@ import ( "encoding/hex" "testing" - "bridgerton.audius.co/api/solana/programs/secp256k1" + "bridgerton.audius.co/api/spl/programs/secp256k1" "github.com/ethereum/go-ethereum/crypto" bin "github.com/gagliardetto/binary" "github.com/gagliardetto/solana-go" diff --git a/api/solana/programs/secp256k1/instruction.go b/api/spl/programs/secp256k1/instruction.go similarity index 100% rename from api/solana/programs/secp256k1/instruction.go rename to api/spl/programs/secp256k1/instruction.go From 4b0238f0f92bc3b2a4afc8c1fcaaaee6be8b0b69 Mon Sep 17 00:00:00 2001 From: Marcus Pasell <3690498+rickyrombo@users.noreply.github.com> Date: Wed, 23 Apr 2025 23:01:30 -0700 Subject: [PATCH 3/4] Add decoder for address lookup tables --- api/spl/address_lookup_table.go | 43 +++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 api/spl/address_lookup_table.go diff --git a/api/spl/address_lookup_table.go b/api/spl/address_lookup_table.go new file mode 100644 index 00000000..4d5409ca --- /dev/null +++ b/api/spl/address_lookup_table.go @@ -0,0 +1,43 @@ +package spl + +import ( + bin "github.com/gagliardetto/binary" + "github.com/gagliardetto/solana-go" +) + +type AddressLookupTableMeta struct { + DeactivationSlot uint64 + LastExtendedSlot uint64 + LastExtendedSlotStartIndex uint8 + Authority []solana.PublicKey +} + +type AddressLookupTable struct { + State uint32 + Meta AddressLookupTableMeta + Addresses []solana.PublicKey +} + +func (inst *AddressLookupTable) UnmarshalWithDecoder(decoder *bin.Decoder) error { + err := decoder.Decode(&inst.State) + if err != nil { + return err + } + err = decoder.Decode(&inst.Meta) + if err != nil { + return err + } + err = decoder.SetPosition(56) + if err != nil { + return err + } + for decoder.HasRemaining() { + pub := &solana.PublicKey{} + err = decoder.Decode(pub) + if err != nil { + return err + } + inst.Addresses = append(inst.Addresses, *pub) + } + return err +} From 4c4aab295249f5bec72677d31c963d209eec199e Mon Sep 17 00:00:00 2001 From: Marcus Pasell <3690498+rickyrombo@users.noreply.github.com> Date: Wed, 23 Apr 2025 23:02:55 -0700 Subject: [PATCH 4/4] Move account derivations and add RewardManagerState struct --- api/spl/programs/reward_manager/accounts.go | 49 +++++++++++++++++++ .../programs/reward_manager/instruction.go | 36 -------------- 2 files changed, 49 insertions(+), 36 deletions(-) create mode 100644 api/spl/programs/reward_manager/accounts.go diff --git a/api/spl/programs/reward_manager/accounts.go b/api/spl/programs/reward_manager/accounts.go new file mode 100644 index 00000000..d67cf503 --- /dev/null +++ b/api/spl/programs/reward_manager/accounts.go @@ -0,0 +1,49 @@ +package reward_manager + +import ( + "encoding/hex" + "strings" + + "github.com/gagliardetto/solana-go" +) + +type RewardManagerState struct { + Version uint8 + TokenAccount solana.PublicKey + Manager solana.PublicKey + MinVotes uint8 +} + +func deriveAuthority(programId solana.PublicKey, state solana.PublicKey) (solana.PublicKey, uint8, error) { + seeds := make([][]byte, 1) + seeds[0] = state.Bytes()[0:32] + return solana.FindProgramAddress(seeds, programId) +} + +func deriveSender(programId solana.PublicKey, authority solana.PublicKey, ethAddress string) (solana.PublicKey, uint8, error) { + senderSeedPrefix := []byte(SenderSeedPrefix) + // Remove 0x and decode hex + decodedEthAddress, err := hex.DecodeString(strings.TrimPrefix(ethAddress, "0x")) + if err != nil { + return solana.PublicKey{}, 0, err + } + // Pad the eth address if necessary w/ leading 0 + senderSeed := make([]byte, len(senderSeedPrefix)+EthAddressByteLength) + copy(senderSeed, senderSeedPrefix) + copy(senderSeed[len(senderSeed)-len(decodedEthAddress):], decodedEthAddress) + return solana.FindProgramAddress([][]byte{authority.Bytes()[0:32], senderSeed}, programId) +} + +func deriveAttestations(programId solana.PublicKey, authority solana.PublicKey, disbursementId string) (solana.PublicKey, uint8, error) { + attestationsSeed := make([]byte, len(AttestationsSeedPrefix)+len(disbursementId)) + copy(attestationsSeed, []byte(AttestationsSeedPrefix)) + copy(attestationsSeed[len([]byte(AttestationsSeedPrefix)):], disbursementId) + return solana.FindProgramAddress([][]byte{authority.Bytes()[0:32], attestationsSeed}, programId) +} + +func deriveDisbursement(programId solana.PublicKey, authority solana.PublicKey, disbursementId string) (solana.PublicKey, uint8, error) { + disbursementSeed := make([]byte, len(DisbursementSeedPrefix)+len(disbursementId)) + copy(disbursementSeed, []byte(DisbursementSeedPrefix)) + copy(disbursementSeed[len([]byte(DisbursementSeedPrefix)):], disbursementId) + return solana.FindProgramAddress([][]byte{authority.Bytes()[0:32], disbursementSeed}, programId) +} diff --git a/api/spl/programs/reward_manager/instruction.go b/api/spl/programs/reward_manager/instruction.go index e58d6784..209aae8e 100644 --- a/api/spl/programs/reward_manager/instruction.go +++ b/api/spl/programs/reward_manager/instruction.go @@ -2,9 +2,7 @@ package reward_manager import ( "bytes" - "encoding/hex" "fmt" - "strings" bin "github.com/gagliardetto/binary" "github.com/gagliardetto/solana-go" @@ -127,37 +125,3 @@ func DecodeInstruction(accounts []*solana.AccountMeta, data []byte) (*Instructio } return inst, nil } - -func deriveAuthority(programId solana.PublicKey, state solana.PublicKey) (solana.PublicKey, uint8, error) { - seeds := make([][]byte, 1) - seeds[0] = state.Bytes()[0:32] - return solana.FindProgramAddress(seeds, programId) -} - -func deriveSender(programId solana.PublicKey, authority solana.PublicKey, ethAddress string) (solana.PublicKey, uint8, error) { - senderSeedPrefix := []byte(SenderSeedPrefix) - // Remove 0x and decode hex - decodedEthAddress, err := hex.DecodeString(strings.TrimPrefix(ethAddress, "0x")) - if err != nil { - return solana.PublicKey{}, 0, err - } - // Pad the eth address if necessary w/ leading 0 - senderSeed := make([]byte, len(senderSeedPrefix)+EthAddressByteLength) - copy(senderSeed, senderSeedPrefix) - copy(senderSeed[len(senderSeed)-len(decodedEthAddress):], decodedEthAddress) - return solana.FindProgramAddress([][]byte{authority.Bytes()[0:32], senderSeed}, programId) -} - -func deriveAttestations(programId solana.PublicKey, authority solana.PublicKey, disbursementId string) (solana.PublicKey, uint8, error) { - attestationsSeed := make([]byte, len(AttestationsSeedPrefix)+len(disbursementId)) - copy(attestationsSeed, []byte(AttestationsSeedPrefix)) - copy(attestationsSeed[len([]byte(AttestationsSeedPrefix)):], disbursementId) - return solana.FindProgramAddress([][]byte{authority.Bytes()[0:32], attestationsSeed}, programId) -} - -func deriveDisbursement(programId solana.PublicKey, authority solana.PublicKey, disbursementId string) (solana.PublicKey, uint8, error) { - disbursementSeed := make([]byte, len(DisbursementSeedPrefix)+len(disbursementId)) - copy(disbursementSeed, []byte(DisbursementSeedPrefix)) - copy(disbursementSeed[len([]byte(DisbursementSeedPrefix)):], disbursementId) - return solana.FindProgramAddress([][]byte{authority.Bytes()[0:32], disbursementSeed}, programId) -}