Skip to content

Commit

Permalink
chore: merge with main
Browse files Browse the repository at this point in the history
  • Loading branch information
hthieu1110 committed Aug 5, 2023
2 parents 6031e26 + ca69325 commit 6b9e8d3
Show file tree
Hide file tree
Showing 58 changed files with 2,594 additions and 671 deletions.
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,8 @@ node_modules/
npm-debug.log
yarn-error.log
package-lock.json
.yarn/
.yarn/cache
.yarn/install-state.gz

# BUCK
buck-out/
Expand Down
56 changes: 56 additions & 0 deletions .yarn/patches/@gnolang-tm2-js-client-npm-1.0.1-9e54bafbb3.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
diff --git a/bin/provider/jsonrpc/jsonrpc.d.ts b/bin/provider/jsonrpc/jsonrpc.d.ts
index 434273193c4f38a5eefaa9d43b3114bc44e5fd0e..69f2922f8fd30cd56021db887619fab0f012935c 100644
--- a/bin/provider/jsonrpc/jsonrpc.d.ts
+++ b/bin/provider/jsonrpc/jsonrpc.d.ts
@@ -23,5 +23,5 @@ export declare class JSONRPCProvider implements Provider {
getAccountNumber(address: string, height?: number): Promise<number>;
getStatus(): Promise<Status>;
sendTransaction(tx: string): Promise<string>;
- waitForTransaction(hash: string, fromHeight?: number, timeout?: number): Promise<Tx>;
+ waitForTransaction(hash: string, fromHeight?: number, timeout?: number): Promise<{tx: Tx, height: number, index: number}>;
}
diff --git a/bin/provider/provider.d.ts b/bin/provider/provider.d.ts
index a5b37aacb3b9c47bec2a4bc6fe1bb7f653656ee5..d9aa2d8a703c9c40d58695643e3718b2c82aaf5a 100644
--- a/bin/provider/provider.d.ts
+++ b/bin/provider/provider.d.ts
@@ -82,5 +82,5 @@ export interface Provider {
* @param {number} [fromHeight=latest] The block height used to begin the search
* @param {number} [timeout=15000] Optional wait timeout in MS
*/
- waitForTransaction(hash: string, fromHeight?: number, timeout?: number): Promise<Tx>;
+ waitForTransaction(hash: string, fromHeight?: number, timeout?: number): Promise<{tx: Tx, height: number, index: number}>;
}
diff --git a/bin/provider/utility/provider.utility.d.ts b/bin/provider/utility/provider.utility.d.ts
index d476e4ef17146c3001ac538699dc6dd5ee1256e0..16a444812443399344d250d6e66a49eed23eff94 100644
--- a/bin/provider/utility/provider.utility.d.ts
+++ b/bin/provider/utility/provider.utility.d.ts
@@ -25,4 +25,4 @@ export declare const extractAccountNumberFromResponse: (abciData: string | null)
* @param {number} [fromHeight=latest] the starting height for the search. If omitted, it is the latest block in the chain
* @param {number} [timeout=15000] the timeout in MS for the search
*/
-export declare const waitForTransaction: (provider: Provider, hash: string, fromHeight?: number, timeout?: number) => Promise<Tx>;
+export declare const waitForTransaction: (provider: Provider, hash: string, fromHeight?: number, timeout?: number) => Promise<{tx: Tx, height: number, index: number}>;
diff --git a/bin/provider/utility/provider.utility.js b/bin/provider/utility/provider.utility.js
index 82a13a73ec49ed3970dc0567bac5b4bfc4fa8c41..b860d1d4d4d45dd24073a3a3aba665be5bc35690 100644
--- a/bin/provider/utility/provider.utility.js
+++ b/bin/provider/utility/provider.utility.js
@@ -167,7 +167,7 @@ var waitForTransaction = function (provider, hash, fromHeight, timeout) { return
// Clear the interval
clearInterval(fetchInterval);
// Decode the transaction from amino
- resolve(proto_1.Tx.decode(txRaw));
+ resolve({tx: proto_1.Tx.decode(txRaw), height: parseInt(block.block.header.height, 10), index: _i});
}
}
_b.label = 4;
diff --git a/bin/provider/websocket/ws.d.ts b/bin/provider/websocket/ws.d.ts
index a373b6af1d5cb158d4c129199e565b9fe16f5548..05e8cc7c9a7fd7d89154a1f4a0441f1133ff742f 100644
--- a/bin/provider/websocket/ws.d.ts
+++ b/bin/provider/websocket/ws.d.ts
@@ -51,5 +51,5 @@ export declare class WSProvider implements Provider {
getAccountNumber(address: string, height?: number): Promise<number>;
getStatus(): Promise<Status>;
sendTransaction(tx: string): Promise<string>;
- waitForTransaction(hash: string, fromHeight?: number, timeout?: number): Promise<Tx>;
+ waitForTransaction(hash: string, fromHeight?: number, timeout?: number): Promise<{tx: Tx, height: number, index: number}>;
}
108 changes: 77 additions & 31 deletions App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,12 @@ import { StatusBar } from "expo-status-bar";
import { MetaMaskProvider } from "metamask-react";
import React from "react";
import { useForm, FormProvider } from "react-hook-form";
import { Platform } from "react-native";
import { Platform, View } from "react-native";
import { MenuProvider } from "react-native-popup-menu";
import { SafeAreaProvider } from "react-native-safe-area-context";
import { Provider as ReduxProvider } from "react-redux";

import { BrandText } from "./packages/components/BrandText";
import { Navigator } from "./packages/components/navigation/Navigator";
import { DropdownsContextProvider } from "./packages/context/DropdownsProvider";
import { FeedbacksContextProvider } from "./packages/context/FeedbacksProvider";
Expand Down Expand Up @@ -47,35 +48,80 @@ export default function App() {
}

return (
<QueryClientProvider client={queryClient}>
<FormProvider<DefaultForm> {...methods}>
<MetaMaskProvider>
<NavigationContainer linking={linking}>
<SafeAreaProvider>
<ReduxProvider store={store}>
<FeedbacksContextProvider>
<DropdownsContextProvider>
<WalletsProvider>
<SearchBarContextProvider>
<TransactionModalsProvider>
<TNSContextProvider>
<TNSMetaDataListContextProvider>
<MenuProvider>
<StatusBar style="inverted" />
<Navigator />
</MenuProvider>
</TNSMetaDataListContextProvider>
</TNSContextProvider>
</TransactionModalsProvider>
</SearchBarContextProvider>
</WalletsProvider>
</DropdownsContextProvider>
</FeedbacksContextProvider>
</ReduxProvider>
</SafeAreaProvider>
</NavigationContainer>
</MetaMaskProvider>
</FormProvider>
</QueryClientProvider>
<ErrorBoundary>
<QueryClientProvider client={queryClient}>
<FormProvider<DefaultForm> {...methods}>
<MetaMaskProvider>
<NavigationContainer linking={linking}>
<SafeAreaProvider>
<ReduxProvider store={store}>
<FeedbacksContextProvider>
<DropdownsContextProvider>
<WalletsProvider>
<SearchBarContextProvider>
<TransactionModalsProvider>
<TNSContextProvider>
<TNSMetaDataListContextProvider>
<MenuProvider>
<StatusBar style="inverted" />
<Navigator />
</MenuProvider>
</TNSMetaDataListContextProvider>
</TNSContextProvider>
</TransactionModalsProvider>
</SearchBarContextProvider>
</WalletsProvider>
</DropdownsContextProvider>
</FeedbacksContextProvider>
</ReduxProvider>
</SafeAreaProvider>
</NavigationContainer>
</MetaMaskProvider>
</FormProvider>
</QueryClientProvider>
</ErrorBoundary>
);
}

class ErrorBoundary extends React.Component {
state: {
hasError: boolean;
error?: unknown;
catchError?: unknown;
catchInfo?: React.ErrorInfo;
};

constructor(props: object) {
super(props);
this.state = { hasError: false };
}

static getDerivedStateFromError(error: unknown) {
console.log("derived state from error");
return { hasError: true, error };
}

componentDidCatch(error: unknown, info: React.ErrorInfo) {
console.log("did catch");
console.error(error, info);
this.setState({ catchError: error, catchInfo: info });
}

render() {
if (this.state.hasError) {
console.log("rendering error boundary");
// You can render any custom fallback UI
return (
<View style={{ backgroundColor: "black", height: "100%" }}>
<BrandText>{`${this.state.error}`}</BrandText>
{this.state.error !== this.state.catchError && (
<BrandText>{`${this.state.catchError}`}</BrandText>
)}
<BrandText>{this.state.catchInfo?.componentStack}</BrandText>
</View>
);
}

return this.props.children;
}
}
106 changes: 106 additions & 0 deletions go/cmd/gno_names_indexer/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
package main

import (
"flag"
"fmt"
"io/ioutil"
"net/http"
"os"
"regexp"
"time"

"github.com/TERITORI/teritori-dapp/go/internal/indexerdb"
"github.com/TERITORI/teritori-dapp/go/pkg/networks"
"github.com/go-co-op/gocron"
"github.com/peterbourgon/ff/v3"
"github.com/pkg/errors"
"go.uber.org/zap"
)

var nameRegexp = regexp.MustCompile(` * \[(.+)\]\(/r/demo/users\:`)

func main() {
// handle args
fs := flag.NewFlagSet("teritori-indexer", flag.ContinueOnError)
var (
dbHost = fs.String("db-indexer-host", "", "host postgreSQL database")
dbPort = fs.String("db-indexer-port", "", "port for postgreSQL database")
dbPass = fs.String("postgres-password", "", "password for postgreSQL database")
dbName = fs.String("database-name", "", "database name for postgreSQL")
dbUser = fs.String("postgres-user", "", "username for postgreSQL")
networksFile = fs.String("networks-file", "networks.json", "path to networks config file")
networkID = fs.String("gno-network-id", "gno-teritori", "network id to index")
)
if err := ff.Parse(fs, os.Args[1:],
ff.WithEnvVars(),
ff.WithIgnoreUndefined(true),
ff.WithConfigFile(".env"),
ff.WithConfigFileParser(ff.EnvParser),
ff.WithAllowMissingConfigFile(true),
); err != nil {
panic(errors.Wrap(err, "failed to parse flags"))
}

logger, err := zap.NewDevelopment()
if err != nil {
panic(err)
}

// load networks
networksBytes, err := os.ReadFile(*networksFile)
if err != nil {
panic(errors.Wrap(err, "failed to read networks config file"))
}
netstore, err := networks.UnmarshalNetworkStore(networksBytes)
if err != nil {
panic(errors.Wrap(err, "failed to unmarshal networks config"))
}

// get and validate selected network
network := netstore.MustGetGnoNetwork(*networkID)
if network.ChainID == "" {
panic(errors.New("missing chainId in network config"))
}
if network.NameServiceContractAddress == "" {
panic(errors.New("missing nameServiceContractAddress in network config"))
}

dataConnexion := fmt.Sprintf("host=%s user=%s password=%s dbname=%s port=%s",
*dbHost, *dbUser, *dbPass, *dbName, *dbPort)
db, err := indexerdb.NewPostgresDB(dataConnexion)

if err != nil {
panic(errors.Wrap(err, "failed to access db"))
}
err = indexerdb.MigrateDB(db)
if err != nil {
panic(errors.Wrap(err, "failed migrate database models"))
}

schedule := gocron.NewScheduler(time.UTC)
schedule.Every(2).Minutes().Do(func() {
logger.Info("indexing")
resp, err := http.Get(network.GnowebURL + "/r/demo/users")
if err != nil {
logger.Error("failed to get names list", zap.Error(err))
return
}
data, err := ioutil.ReadAll(resp.Body)
if err != nil {
logger.Error("failed to read response body", zap.Error(err))
return
}
render := string(data)
matches := nameRegexp.FindAllStringSubmatch(render, -1)
var names []indexerdb.Name
for _, m := range matches {
names = append(names, indexerdb.Name{Value: m[1] + ".gno", NetworkID: network.ChainID})
}
if err := db.Save(names).Error; err != nil {
logger.Error("failed to save names", zap.Error(err))
return
}
logger.Info("done", zap.Int("names-count", len(names)))
})
schedule.StartBlocking()
}
3 changes: 3 additions & 0 deletions go/internal/indexerdb/db.go
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,9 @@ var allModels = []interface{}{
&DAO{},
&DAOMember{},
&DAOProposal{},

// names
&Name{},
}

func NewSQLiteDB(path string) (*gorm.DB, error) {
Expand Down
7 changes: 7 additions & 0 deletions go/internal/indexerdb/names.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package indexerdb

type Name struct {
Value string `gorm:"primaryKey"`
UserID string
NetworkID string
}
Loading

0 comments on commit 6b9e8d3

Please sign in to comment.