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())) 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 +} 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/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/solana/programs/reward_manager/instruction.go b/api/spl/programs/reward_manager/instruction.go similarity index 64% rename from api/solana/programs/reward_manager/instruction.go rename to api/spl/programs/reward_manager/instruction.go index fb980e69..209aae8e 100644 --- a/api/solana/programs/reward_manager/instruction.go +++ b/api/spl/programs/reward_manager/instruction.go @@ -2,7 +2,6 @@ package reward_manager import ( "bytes" - "encoding/hex" "fmt" bin "github.com/gagliardetto/binary" @@ -126,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(ethAddress[2:]) - 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/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