Skip to content

Commit

Permalink
initial Gitcoin Passport provider implementation
Browse files Browse the repository at this point in the history
  • Loading branch information
lucasmenendez committed Jan 19, 2024
1 parent 5054692 commit e8e5e7c
Show file tree
Hide file tree
Showing 12 changed files with 511 additions and 27 deletions.
80 changes: 80 additions & 0 deletions api/api.go
Original file line number Diff line number Diff line change
@@ -1,11 +1,20 @@
package api

import (
"context"
"database/sql"
"encoding/json"
"errors"
"os"
"path/filepath"
"strings"
"time"

"github.com/ethereum/go-ethereum/common"
lru "github.com/hashicorp/golang-lru/v2"
"github.com/vocdoni/census3/db"
"github.com/vocdoni/census3/db/annotations"
queries "github.com/vocdoni/census3/db/sqlc"
"github.com/vocdoni/census3/queue"
"github.com/vocdoni/census3/service"
"github.com/vocdoni/census3/service/web3"
Expand Down Expand Up @@ -149,3 +158,74 @@ func (capi *census3API) getAPIInfo(msg *api.APIdata, ctx *httprouter.HTTPContext
}
return ctx.Send(res, api.HTTPstatusOK)
}

func (capi *census3API) CreateInitialTokens(tokensPath string) error {
// skip if the tokens file is not defined
if tokensPath == "" {
return nil
}
// read the tokens file
content, err := os.ReadFile(tokensPath)
if err != nil {
return err
}
// parse the tokens file
tokens := []GetTokenResponse{}
if err := json.Unmarshal(content, &tokens); err != nil {
return err
}
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
defer cancel()
// create the tokens
tx, err := capi.db.RW.BeginTx(ctx, nil)
if err != nil {
return err
}
defer func() {
if err := tx.Rollback(); err != nil && !errors.Is(sql.ErrTxDone, err) {
log.Errorw(err, "create token transaction rollback failed")
}
}()
qtx := capi.db.QueriesRW.WithTx(tx)
for _, token := range tokens {
addr := common.HexToAddress(token.ID)
_, err = qtx.CreateToken(ctx, queries.CreateTokenParams{
ID: addr.Bytes(),
Name: token.Name,
Symbol: token.Symbol,
Decimals: token.Decimals,
TotalSupply: annotations.BigInt(token.TotalSupply),
CreationBlock: 0,
TypeID: uint64(state.TokenTypeFromString(token.Type)),
Synced: false,
Tags: token.Tags,
ChainID: token.ChainID,
ChainAddress: token.ChainAddress,
ExternalID: token.ExternalID,
IconUri: token.IconURI,
})
if err != nil {
if strings.Contains(err.Error(), "UNIQUE constraint failed") {
return nil
}
return err
}
strategyID, err := capi.createDefaultTokenStrategy(ctx, qtx,
addr, token.ChainID, token.ChainAddress, token.Symbol, token.ExternalID)
if err != nil {
return err
}
if _, err := qtx.UpdateTokenDefaultStrategy(ctx, queries.UpdateTokenDefaultStrategyParams{
ID: addr.Bytes(),
DefaultStrategy: uint64(strategyID),
ChainID: token.ChainID,
ExternalID: token.ExternalID,
}); err != nil {
return err
}
}
if err := tx.Commit(); err != nil {
return err
}
return nil
}
28 changes: 26 additions & 2 deletions cmd/census3/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import (
"github.com/vocdoni/census3/db"
"github.com/vocdoni/census3/internal"
"github.com/vocdoni/census3/service"
"github.com/vocdoni/census3/service/gitcoin"
"github.com/vocdoni/census3/service/poap"
"github.com/vocdoni/census3/service/web3"
"github.com/vocdoni/census3/state"
Expand All @@ -28,8 +29,10 @@ type Census3Config struct {
listOfWeb3Providers []string
port int
poapAPIEndpoint, poapAuthToken string
gitcoinEndpoint string
scannerCoolDown time.Duration
adminToken string
initialTokens string
}

func main() {
Expand All @@ -46,12 +49,14 @@ func main() {
flag.StringVar(&config.logLevel, "logLevel", "info", "log level (debug, info, warn, error)")
flag.IntVar(&config.port, "port", 7788, "HTTP port for the API")
flag.StringVar(&config.connectKey, "connectKey", "", "connect group key for IPFS connect")
flag.StringVar(&config.poapAPIEndpoint, "poapAPIEndpoint", "", "POAP API access token")
flag.StringVar(&config.poapAPIEndpoint, "poapAPIEndpoint", "", "POAP API endpoint")
flag.StringVar(&config.poapAuthToken, "poapAuthToken", "", "POAP API access token")
flag.StringVar(&config.gitcoinEndpoint, "gitcoinEndpoint", "", "Gitcoin Passport API access token")
var strWeb3Providers string
flag.StringVar(&strWeb3Providers, "web3Providers", "", "the list of URL's of available web3 providers")
flag.DurationVar(&config.scannerCoolDown, "scannerCoolDown", 120*time.Second, "the time to wait before next scanner iteration")
flag.StringVar(&config.adminToken, "adminToken", "", "the admin UUID token for the API")
flag.StringVar(&config.initialTokens, "initialTokens", "", "path of the initial tokens json file")
flag.Parse()
// init viper to read config file
pviper := viper.New()
Expand Down Expand Up @@ -89,6 +94,10 @@ func main() {
panic(err)
}
config.poapAuthToken = pviper.GetString("poapAuthToken")
if err := pviper.BindPFlag("gitcoinEndpoint", flag.Lookup("gitcoinEndpoint")); err != nil {
panic(err)
}
config.gitcoinEndpoint = pviper.GetString("gitcoinEndpoint")
if err := pviper.BindPFlag("web3Providers", flag.Lookup("web3Providers")); err != nil {
panic(err)
}
Expand All @@ -101,6 +110,10 @@ func main() {
panic(err)
}
config.adminToken = pviper.GetString("adminToken")
if err := pviper.BindPFlag("initialTokens", flag.Lookup("initialTokens")); err != nil {
panic(err)
}
config.initialTokens = pviper.GetString("initialTokens")
// init logger
log.Init(config.logLevel, "stdout", nil)
// check if the web3 providers are defined
Expand All @@ -125,9 +138,17 @@ func main() {
if err := poapProvider.Init(); err != nil {
log.Fatal(err)
}
// init Gitcoin external provider
gitcoinProvider := &gitcoin.GitcoinPassport{
APIEndpoint: config.gitcoinEndpoint,
}
if err := gitcoinProvider.Init(); err != nil {
log.Fatal(err)
}
// start the holder scanner with the database and the external providers
externalProviders := map[state.TokenType]service.HolderProvider{
state.CONTRACT_TYPE_POAP: poapProvider,
state.CONTRACT_TYPE_POAP: poapProvider,
state.CONTRACT_TYPE_GITCOINPASSPORT: gitcoinProvider,
}
hc, err := service.NewHoldersScanner(database, w3p, externalProviders, config.scannerCoolDown)
if err != nil {
Expand Down Expand Up @@ -155,6 +176,9 @@ func main() {
if err != nil {
log.Fatal(err)
}
if err := apiService.CreateInitialTokens(config.initialTokens); err != nil {
log.Warnf("error creating initial tokens: %s", err)
}
ctx, cancel := context.WithCancel(context.Background())
go hc.Start(ctx)

Expand Down
7 changes: 7 additions & 0 deletions db/initial_data/tokens.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
[
{
"ID": "0x000000000000000000000000000000000000006C",
"type": "gitcoinpassport",
"chainID": 1
}
]
7 changes: 6 additions & 1 deletion example.env
Original file line number Diff line number Diff line change
Expand Up @@ -16,4 +16,9 @@ CENSUS3_DATADIR="./.census3"
# Scanner cooldown duration
CENSUS3_SCANNERCOOLDOWN="20s"
# UUID admin token for protected endpoints
CENSUS3_ADMINTOKENS="927aa5d3-c359-4136-b05c-530a70945967"
CENSUS3_ADMINTOKENS="927aa5d3-c359-4136-b05c-530a70945967"
# POAP API configuration
CENSUS3_POAPAPIENDPOINT="poapAPIEndpoint"
CENSUS3_POAPAUTHTOKEN="yourPOAPAuthToken"
# Gitcoin API configuration
CENSUS3_GITCOINAPIENDPOINT="gitcoinAPIEndpoint"
Loading

0 comments on commit e8e5e7c

Please sign in to comment.