Skip to content

Commit

Permalink
feat: add endpoint to retrieve public addresses (#1498)
Browse files Browse the repository at this point in the history
feat: updates to get public addresses

fix: fix linter err
  • Loading branch information
nick-bisonai authored May 20, 2024
1 parent 5b96c05 commit d9e79da
Show file tree
Hide file tree
Showing 8 changed files with 150 additions and 5 deletions.
4 changes: 2 additions & 2 deletions node/pkg/admin/tests/main_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -91,15 +91,15 @@ func insertSampleData(ctx context.Context) (*TmpData, error) {
}
tmpData.proxy = tmpProxy

encryptedTestPk, err := encryptor.EncryptText("test_pk")
encryptedTestPk, err := encryptor.EncryptText("0xec5e03e43eb58d0ea03c639e9bf1894793091928f1e222ce18df961ad4efb04e")
if err != nil {
return nil, err
}
tmpWallet, err := db.QueryRow[wallet.WalletModel](ctx, wallet.InsertWallet, map[string]any{"pk": encryptedTestPk})
if err != nil {
return nil, err
}
tmpWallet.Pk = "test_pk"
tmpWallet.Pk = "0xec5e03e43eb58d0ea03c639e9bf1894793091928f1e222ce18df961ad4efb04e"
tmpData.wallet = tmpWallet

tmpProviderUrl, err := db.QueryRow[providerUrl.ProviderUrlModel](ctx, providerUrl.InsertProviderUrl, map[string]any{"chain_id": 1, "url": "test_url", "priority": 1})
Expand Down
21 changes: 19 additions & 2 deletions node/pkg/admin/tests/wallet_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ func TestWalletInsert(t *testing.T) {
defer cleanup()

mockWallet := wallet.WalletInsertModel{
Pk: "test_pk_v2",
Pk: "0x7b48c1fd1861ebc850e3a8629198e9c4d33fc16ff995162a25438b532c42253d",
}

readResultBefore, err := GetRequest[[]wallet.WalletModel](testItems.app, "/api/v1/wallet", nil)
Expand Down Expand Up @@ -71,6 +71,23 @@ func TestWalletGet(t *testing.T) {
assert.Equalf(t, readResult[0].Pk, testItems.tmpData.wallet.Pk, "expected to have the same wallet")
}

func TestWalletGetAddress(t *testing.T) {
ctx := context.Background()
cleanup, testItems, err := setup(ctx)
if err != nil {
t.Fatalf("error setting up test: %v", err)
}
defer cleanup()

readResult, err := GetRequest[[]string](testItems.app, "/api/v1/wallet/addresses", nil)
if err != nil {
t.Fatalf("error getting addresses: %v", err)
}

assert.Greaterf(t, len(readResult), 0, "expected to have at least one address")
assert.Equalf(t, readResult[0], "0xd45bd119bE9D4EE5dCd642978648142681caa7e6", "expected to have the same address")
}

func TestWalletGetById(t *testing.T) {
ctx := context.Background()
cleanup, testItems, err := setup(ctx)
Expand Down Expand Up @@ -102,7 +119,7 @@ func TestWalletUpdateById(t *testing.T) {
defer cleanup()

mockWallet := wallet.WalletInsertModel{
Pk: "test_pk_v2",
Pk: "0x7b48c1fd1861ebc850e3a8629198e9c4d33fc16ff995162a25438b532c42253d",
}

beforeUpdate, err := GetRequest[wallet.WalletModel](testItems.app, "/api/v1/wallet/"+strconv.FormatInt(*testItems.tmpData.wallet.Id, 10), nil)
Expand Down
24 changes: 24 additions & 0 deletions node/pkg/admin/wallet/controller.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package wallet

import (
chainUtils "bisonai.com/orakl/node/pkg/chain/utils"
"bisonai.com/orakl/node/pkg/db"
"bisonai.com/orakl/node/pkg/utils/encryptor"
"github.com/go-playground/validator/v10"
Expand Down Expand Up @@ -62,6 +63,29 @@ func get(c *fiber.Ctx) error {
return c.JSON(results)
}

func getAddresses(c *fiber.Ctx) error {
wallets, err := db.QueryRows[WalletModel](c.Context(), GetWallets, nil)
if err != nil {
return c.Status(fiber.StatusInternalServerError).SendString("failed to execute get wallet query: " + err.Error())
}
var result []string
for _, wallet := range wallets {
decryptedPk, err := encryptor.DecryptText(wallet.Pk)
if err != nil {
log.Warn().Err(err).Msg("failed to decrypt pk on get wallets query")
continue
}
address, err := chainUtils.StringPkToAddressHex(decryptedPk)
if err != nil {
log.Warn().Err(err).Msg("failed to convert pk to address on get wallets query")
continue
}
result = append(result, address)
}

return c.JSON(result)
}

func getById(c *fiber.Ctx) error {
id := c.Params("id")
result, err := db.QueryRow[WalletModel](c.Context(), GetWalletById, map[string]any{"id": id})
Expand Down
1 change: 1 addition & 0 deletions node/pkg/admin/wallet/route.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ func Routes(router fiber.Router) {

wallets.Post("", insert)
wallets.Get("", get)
wallets.Get("/addresses", getAddresses)
wallets.Get("/:id", getById)
wallets.Patch("/:id", updateById)
wallets.Delete("/:id", deleteById)
Expand Down
16 changes: 15 additions & 1 deletion node/pkg/chain/helper/helper.go
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,21 @@ func NewChainHelper(ctx context.Context, opts ...ChainHelperOption) (*ChainHelpe
}
if config.ReporterPk != "" {
primaryWallet := strings.TrimPrefix(config.ReporterPk, "0x")
wallets = append([]string{primaryWallet}, wallets...)
exists := false
for _, wallet := range wallets {
if wallet == primaryWallet {
exists = true
break
}
}

if !exists {
wallets = append([]string{primaryWallet}, wallets...)
err = utils.InsertWallet(ctx, primaryWallet)
if err != nil {
log.Warn().Err(err).Msg("failed to insert primary wallet")
}
}
}

delegatorUrl := os.Getenv(EnvDelegatorUrl)
Expand Down
45 changes: 45 additions & 0 deletions node/pkg/chain/tests/chain_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -474,6 +474,51 @@ func TestMakeAbiFuncAttribute(t *testing.T) {
}
}

func TestGetWallets(t *testing.T) {
ctx := context.Background()
testPk := "cbebf778dd0a62952e6caa9d51eefc6ec9242c1111e7b7e1165485a2041cab2b"

err := utils.InsertWallet(ctx, testPk)
if err != nil {
t.Errorf("Unexpected error: %v", err)
}
defer func() {
err = db.QueryWithoutResult(ctx, "DELETE FROM wallets;", nil)
if err != nil {
t.Errorf("Unexpected error: %v", err)
}
}()

wallets, err := utils.GetWallets(ctx)
if err != nil {
t.Errorf("Unexpected error: %v", err)
}

assert.Contains(t, wallets, testPk)
}

func TestInsertWalletEmptyDbEnv(t *testing.T) {
ctx := context.Background()
err := os.Setenv("DATABASE_URL", "")
if err != nil {
t.Errorf("Unexpected error: %v", err)
}

testPk := "cbebf778dd0a62952e6caa9d51eefc6ec9242c1111e7b7e1165485a2041cab2b"

err = utils.InsertWallet(ctx, testPk)
if err != nil {
t.Errorf("Unexpected error: %v", err)
}

wallets, err := utils.GetWallets(ctx)
if err != nil {
t.Errorf("Unexpected error: %v", err)
}

assert.NotContains(t, wallets, testPk)
}

func TestMakeGlobalAggregateProof(t *testing.T) {
s, err := helper.NewSignHelper("")
if err != nil {
Expand Down
31 changes: 31 additions & 0 deletions node/pkg/chain/utils/utils.go
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,19 @@ func GetWallets(ctx context.Context) ([]string, error) {
return wallets, nil
}

func InsertWallet(ctx context.Context, pk string) error {
if os.Getenv("DATABASE_URL") == "" {
log.Warn().Msg("DATABASE_URL is not set, skipping wallet insert")
return nil
}
encryptedPk, err := encryptor.EncryptText(pk)
if err != nil {
return err
}

return db.QueryWithoutResult(ctx, "INSERT INTO wallets (pk) VALUES (@pk)", map[string]any{"pk": encryptedPk})
}

func GetChainID(ctx context.Context, client ClientInterface) (*big.Int, error) {
return client.NetworkID(ctx)
}
Expand Down Expand Up @@ -593,6 +606,24 @@ func StringToPk(pk string) (*ecdsa.PrivateKey, error) {
return crypto.HexToECDSA(strings.TrimPrefix(pk, "0x"))
}

func StringPkToAddressHex(pk string) (string, error) {
privateKey, err := StringToPk(pk)
if err != nil {
return "", err
}
publicKey := privateKey.Public()
publicKeyECDSA, ok := publicKey.(*ecdsa.PublicKey)
if !ok {
return "", errorSentinel.ErrChainPubKeyToECDSAFail
}
result := crypto.PubkeyToAddress(*publicKeyECDSA).Hex()
if !strings.HasPrefix(result, "0x") {
result = "0x" + result
}

return result, nil
}

func RecoverSigner(hash []byte, signature []byte) (address common.Address, err error) {
if len(signature) != 65 {
return common.Address{}, errorSentinel.ErrChainInvalidSignatureLength
Expand Down
13 changes: 13 additions & 0 deletions node/pkg/por/app.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import (
"time"

"bisonai.com/orakl/node/pkg/chain/helper"
chainUtils "bisonai.com/orakl/node/pkg/chain/utils"
errorSentinel "bisonai.com/orakl/node/pkg/error"
"bisonai.com/orakl/node/pkg/fetcher"
"bisonai.com/orakl/node/pkg/secrets"
Expand Down Expand Up @@ -104,6 +105,18 @@ func (a *App) Run(ctx context.Context) error {
}
})

http.HandleFunc("/api/v1/address", func(w http.ResponseWriter, r *http.Request) {
porReporterPk := os.Getenv("POR_REPORTER_PK")
addr, err := chainUtils.StringPkToAddressHex(porReporterPk)
if err != nil {
log.Error().Err(err).Msg("failed to convert pk to address")
}
_, err = w.Write([]byte(addr))
if err != nil {
log.Error().Err(err).Msg("failed to write response")
}
})

if err := http.ListenAndServe(":"+port, nil); err != nil {
log.Fatal().Err(err).Msg("failed to start http server")
}
Expand Down

0 comments on commit d9e79da

Please sign in to comment.