Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions api/error_response.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package api

import (
"errors"
"net/http"

"github.com/gofiber/fiber/v2"
Expand All @@ -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()))
Expand Down
43 changes: 43 additions & 0 deletions api/spl/address_lookup_table.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package spl

import (
bin "github.com/gagliardetto/binary"
"github.com/gagliardetto/solana-go"
)

type AddressLookupTableMeta struct {
DeactivationSlot uint64
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why not just int?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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
}
Original file line number Diff line number Diff line change
Expand Up @@ -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"
)
Expand Down
49 changes: 49 additions & 0 deletions api/spl/programs/reward_manager/accounts.go
Original file line number Diff line number Diff line change
@@ -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)
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package reward_manager

import (
"bytes"
"encoding/hex"
"fmt"

bin "github.com/gagliardetto/binary"
Expand Down Expand Up @@ -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)
}
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down
Loading