Compare commits

..

No commits in common. "master" and "lash/dbtx" have entirely different histories.

15 changed files with 162 additions and 242 deletions

View File

@ -1,9 +0,0 @@
/**
!/cmd
!/config
!/event
!/internal
!/lookup
!/LICENSE
!/go.*
!/.env.example

View File

@ -1,56 +0,0 @@
name: release
on:
push:
tags:
- "v*"
jobs:
docker:
runs-on: ubuntu-latest
steps:
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Check out repo
uses: actions/checkout@v3
with:
fetch-depth: 0
- name: Cache Docker layers
uses: actions/cache@v3
with:
path: /tmp/.buildx-cache
key: ${{ runner.os }}-buildx-${{ github.sha }}
restore-keys: |
${{ runner.os }}-buildx-
- name: Login to GHCR Docker registry
uses: docker/login-action@v1
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Set outputs
run: |
echo "RELEASE_TAG=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV \
&& echo "RELEASE_SHORT_COMMIT=$(git rev-parse --short HEAD)" >> $GITHUB_ENV
- name: Build and push image
uses: docker/build-push-action@v2
with:
context: ./
file: ./Dockerfile
platforms: linux/amd64
push: true
build-args: |
BUILD=${{ env.RELEASE_SHORT_COMMIT }}
cache-from: type=local,src=/tmp/.buildx-cache
cache-to: type=local,dest=/tmp/.buildx-cache
tags: |
ghcr.io/grassrootseconomics/sarafu-vise-events:latest
ghcr.io/grassrootseconomics/sarafu-vise-events:${{ env.RELEASE_TAG }}

View File

@ -1,38 +0,0 @@
FROM golang:1.23.4-bookworm AS build
ENV CGO_ENABLED=1
ARG BUILDPLATFORM
ARG TARGETPLATFORM
ARG BUILD=dev
WORKDIR /build
COPY . .
RUN apt-get update && apt-get install -y --no-install-recommends \
libgdbm-dev \
git \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /build
RUN echo "Building on $BUILDPLATFORM, building for $TARGETPLATFORM"
RUN go mod download
RUN go build -tags logtrace -o sarafu-vise-events -ldflags="-X main.build=${BUILD} -s -w" cmd/main.go
FROM debian:bookworm-slim
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get install -y --no-install-recommends \
libgdbm-dev \
ca-certificates \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /service
COPY --from=build /build/sarafu-vise-events .
COPY --from=build /build/LICENSE .
COPY --from=build /build/.env.example .
RUN mv .env.example .env
CMD ["./sarafu-vise-events"]

View File

@ -9,22 +9,21 @@ import (
"syscall" "syscall"
"git.defalsify.org/vise.git/logging" "git.defalsify.org/vise.git/logging"
sarafuconfig "git.grassecon.net/grassrootseconomics/sarafu-vise/config" "git.grassecon.net/grassrootseconomics/visedriver/storage"
"git.grassecon.net/grassrootseconomics/sarafu-vise-events/config" "git.grassecon.net/grassrootseconomics/sarafu-vise-events/config"
"git.grassecon.net/grassrootseconomics/sarafu-vise-events/event/nats" "git.grassecon.net/grassrootseconomics/sarafu-vise-events/event/nats"
"git.grassecon.net/grassrootseconomics/sarafu-vise-events/lookup" "git.grassecon.net/grassrootseconomics/sarafu-vise-events/lookup"
viseevent "git.grassecon.net/grassrootseconomics/sarafu-vise/handlers/event" viseevent "git.grassecon.net/grassrootseconomics/sarafu-vise/handlers/event"
"git.grassecon.net/grassrootseconomics/visedriver/storage"
) )
var ( var (
logg = logging.NewVanilla() logg = logging.NewVanilla()
) )
func main() { func main() {
config.LoadConfig() config.LoadConfig()
override := sarafuconfig.NewOverride() override := config.NewOverride()
flag.StringVar(override.DbConn, "c", "?", "default connection string (replaces all unspecified strings)") flag.StringVar(override.DbConn, "c", "?", "default connection string (replaces all unspecified strings)")
flag.StringVar(override.ResourceConn, "resource", "?", "resource connection string") flag.StringVar(override.ResourceConn, "resource", "?", "resource connection string")
@ -32,8 +31,8 @@ func main() {
flag.StringVar(override.StateConn, "state", "?", "state store connection string") flag.StringVar(override.StateConn, "state", "?", "state store connection string")
flag.Parse() flag.Parse()
sarafuconfig.Apply(override) config.Apply(&override)
conns, err := sarafuconfig.GetConns() conns, err := config.GetConns()
if err != nil { if err != nil {
fmt.Fprintf(os.Stderr, "conn specification error: %v\n", err) fmt.Fprintf(os.Stderr, "conn specification error: %v\n", err)
os.Exit(1) os.Exit(1)

View File

@ -2,24 +2,29 @@ package config
import ( import (
viseconfig "git.grassecon.net/grassrootseconomics/visedriver/config" viseconfig "git.grassecon.net/grassrootseconomics/visedriver/config"
apiconfig "git.grassecon.net/grassrootseconomics/sarafu-api/config"
"git.grassecon.net/grassrootseconomics/sarafu-vise/config" "git.grassecon.net/grassrootseconomics/sarafu-vise/config"
"git.grassecon.net/grassrootseconomics/visedriver/env" "git.grassecon.net/grassrootseconomics/visedriver/env"
) )
var ( var (
JetstreamURL string JetstreamURL string
JetstreamClientName string JetstreamClientName string
Apply = config.Apply Apply = config.Apply
GetConns = config.GetConns GetConns = config.GetConns
) )
const ( const (
defaultJetstreamURL string = "localhost:4222" defaultJetstreamURL string = "localhost:4222"
defaultJetstreamClientName string = "omnom" defaultJetstreamClientName string = "omnom"
) )
func LoadConfig() error { func LoadConfig() error {
err := config.LoadConfig() err := viseconfig.LoadConfig()
if err != nil {
return err
}
err = apiconfig.LoadConfig()
if err != nil { if err != nil {
return err return err
} }
@ -31,3 +36,7 @@ func LoadConfig() error {
func Language() string { func Language() string {
return viseconfig.DefaultLanguage return viseconfig.DefaultLanguage
} }
func NewOverride() config.Override {
return config.Override{}
}

View File

@ -1,8 +1,8 @@
package event package event
import ( import (
apievent "git.grassecon.net/grassrootseconomics/sarafu-api/event"
geEvent "github.com/grassrootseconomics/eth-tracker/pkg/event" geEvent "github.com/grassrootseconomics/eth-tracker/pkg/event"
apievent "git.grassecon.net/grassrootseconomics/sarafu-api/event"
) )
const ( const (

View File

@ -4,19 +4,20 @@ import (
"context" "context"
"testing" "testing"
"git.defalsify.org/vise.git/cache"
"git.defalsify.org/vise.git/db" "git.defalsify.org/vise.git/db"
"git.defalsify.org/vise.git/state" "git.defalsify.org/vise.git/state"
"git.grassecon.net/grassrootseconomics/common/hex" "git.defalsify.org/vise.git/cache"
apievent "git.grassecon.net/grassrootseconomics/sarafu-api/event"
"git.grassecon.net/grassrootseconomics/sarafu-api/remote/http"
apimocks "git.grassecon.net/grassrootseconomics/sarafu-api/testutil/mocks"
"git.grassecon.net/grassrootseconomics/sarafu-vise-events/config"
viseevent "git.grassecon.net/grassrootseconomics/sarafu-vise/handlers/event"
storedb "git.grassecon.net/grassrootseconomics/sarafu-vise/store/db"
"git.grassecon.net/grassrootseconomics/visedriver/testutil/mocks" "git.grassecon.net/grassrootseconomics/visedriver/testutil/mocks"
"git.grassecon.net/grassrootseconomics/sarafu-api/remote/http"
"git.grassecon.net/grassrootseconomics/sarafu-vise-events/config"
"git.grassecon.net/grassrootseconomics/common/hex"
storedb "git.grassecon.net/grassrootseconomics/sarafu-vise/store/db"
apievent "git.grassecon.net/grassrootseconomics/sarafu-api/event"
apimocks "git.grassecon.net/grassrootseconomics/sarafu-api/testutil/mocks"
viseevent "git.grassecon.net/grassrootseconomics/sarafu-vise/handlers/event"
) )
func TestCustodialRegistration(t *testing.T) { func TestCustodialRegistration(t *testing.T) {
err := config.LoadConfig() err := config.LoadConfig()
if err != nil { if err != nil {

View File

@ -5,13 +5,13 @@ import (
"encoding/json" "encoding/json"
"fmt" "fmt"
"git.defalsify.org/vise.git/logging"
apievent "git.grassecon.net/grassrootseconomics/sarafu-api/event"
"git.grassecon.net/grassrootseconomics/sarafu-vise-events/config"
"git.grassecon.net/grassrootseconomics/sarafu-vise-events/event"
geEvent "github.com/grassrootseconomics/eth-tracker/pkg/event"
nats "github.com/nats-io/nats.go" nats "github.com/nats-io/nats.go"
"github.com/nats-io/nats.go/jetstream" "github.com/nats-io/nats.go/jetstream"
geEvent "github.com/grassrootseconomics/eth-tracker/pkg/event"
"git.defalsify.org/vise.git/logging"
"git.grassecon.net/grassrootseconomics/sarafu-vise-events/event"
"git.grassecon.net/grassrootseconomics/sarafu-vise-events/config"
apievent "git.grassecon.net/grassrootseconomics/sarafu-api/event"
) )
var ( var (
@ -23,10 +23,10 @@ var (
// Extends Router. // Extends Router.
type NatsSubscription struct { type NatsSubscription struct {
*event.Router *event.Router
ctx context.Context ctx context.Context
conn *nats.Conn conn *nats.Conn
js jetstream.JetStream js jetstream.JetStream
cs jetstream.Consumer cs jetstream.Consumer
cctx jetstream.ConsumeContext cctx jetstream.ConsumeContext
} }
@ -37,13 +37,13 @@ func NewNatsSubscription(handler *apievent.EventsHandler) *NatsSubscription {
} }
} }
// Connect sets up the connection to the nats server and a consumer for the // Connect sets up the connection to the nats server and a consumer for the
// "Jetstream". // "Jetstream".
// //
// Fails if connection fails or the "Jetstream" consumer cannot be set up. // Fails if connection fails or the "Jetstream" consumer cannot be set up.
// //
// Once connected, it will attempt to reconnect if disconnected. // Once connected, it will attempt to reconnect if disconnected.
func (n *NatsSubscription) Connect(ctx context.Context, connStr string) error { func(n *NatsSubscription) Connect(ctx context.Context, connStr string) error {
var err error var err error
// enables set ctx in test, even if the connstr is invalid (js msg handler doesnt take context) // enables set ctx in test, even if the connstr is invalid (js msg handler doesnt take context)
@ -59,8 +59,8 @@ func (n *NatsSubscription) Connect(ctx context.Context, connStr string) error {
return err return err
} }
n.cs, err = n.js.CreateConsumer(ctx, "TRACKER", jetstream.ConsumerConfig{ n.cs, err = n.js.CreateConsumer(ctx, "TRACKER", jetstream.ConsumerConfig{
Name: config.JetstreamClientName, Name: config.JetstreamClientName,
Durable: config.JetstreamClientName, Durable: config.JetstreamClientName,
FilterSubjects: []string{"TRACKER.*"}, FilterSubjects: []string{"TRACKER.*"},
}) })
if err != nil { if err != nil {
@ -71,14 +71,14 @@ func (n *NatsSubscription) Connect(ctx context.Context, connStr string) error {
logg.DebugCtxf(ctx, "nats connected, starting consumer", "status", n.conn.Status(), "server", serverInfo) logg.DebugCtxf(ctx, "nats connected, starting consumer", "status", n.conn.Status(), "server", serverInfo)
n.cctx, err = n.cs.Consume(n.handleEvent) n.cctx, err = n.cs.Consume(n.handleEvent)
if err != nil { if err != nil {
return err return err
} }
return nil return nil
} }
// Close cleanly brings down the nats and jetstream connection. // Close cleanly brings down the nats and jetstream connection.
func (n *NatsSubscription) Close() error { func(n *NatsSubscription) Close() error {
n.cctx.Stop() n.cctx.Stop()
select { select {
case <-n.cctx.Closed(): case <-n.cctx.Closed():
@ -88,7 +88,7 @@ func (n *NatsSubscription) Close() error {
} }
// jetstream message handler and acknowledger. // jetstream message handler and acknowledger.
func (n *NatsSubscription) handleEvent(m jetstream.Msg) { func(n *NatsSubscription) handleEvent(m jetstream.Msg) {
var ev geEvent.Event var ev geEvent.Event
logg.DebugCtxf(n.ctx, "have msg", "msg", m) logg.DebugCtxf(n.ctx, "have msg", "msg", m)

View File

@ -9,34 +9,34 @@ import (
"testing" "testing"
"time" "time"
"git.defalsify.org/vise.git/db"
"git.grassecon.net/grassrootseconomics/common/hex"
"git.grassecon.net/grassrootseconomics/sarafu-api/models"
apimocks "git.grassecon.net/grassrootseconomics/sarafu-api/testutil/mocks"
"git.grassecon.net/grassrootseconomics/sarafu-vise-events/config"
"git.grassecon.net/grassrootseconomics/sarafu-vise-events/internal/testutil"
"git.grassecon.net/grassrootseconomics/sarafu-vise-events/lookup"
"git.grassecon.net/grassrootseconomics/sarafu-vise/handlers/application"
viseevent "git.grassecon.net/grassrootseconomics/sarafu-vise/handlers/event"
"git.grassecon.net/grassrootseconomics/sarafu-vise/store"
storedb "git.grassecon.net/grassrootseconomics/sarafu-vise/store/db"
"git.grassecon.net/grassrootseconomics/visedriver/testutil/mocks"
dataserviceapi "github.com/grassrootseconomics/ussd-data-service/pkg/api"
nats "github.com/nats-io/nats.go" nats "github.com/nats-io/nats.go"
"github.com/nats-io/nats.go/jetstream" "github.com/nats-io/nats.go/jetstream"
dataserviceapi "github.com/grassrootseconomics/ussd-data-service/pkg/api"
"git.defalsify.org/vise.git/db"
"git.grassecon.net/grassrootseconomics/sarafu-vise-events/config"
"git.grassecon.net/grassrootseconomics/sarafu-vise/store"
storedb "git.grassecon.net/grassrootseconomics/sarafu-vise/store/db"
"git.grassecon.net/grassrootseconomics/sarafu-api/models"
"git.grassecon.net/grassrootseconomics/sarafu-vise-events/lookup"
"git.grassecon.net/grassrootseconomics/common/hex"
apimocks "git.grassecon.net/grassrootseconomics/sarafu-api/testutil/mocks"
"git.grassecon.net/grassrootseconomics/sarafu-vise-events/internal/testutil"
"git.grassecon.net/grassrootseconomics/sarafu-vise/handlers/application"
viseevent "git.grassecon.net/grassrootseconomics/sarafu-vise/handlers/event"
"git.grassecon.net/grassrootseconomics/visedriver/testutil/mocks"
) )
const ( const (
txBlock = 42 txBlock = 42
tokenAddress = "0x765DE816845861e75A25fCA122bb6898B8B1282a" tokenAddress = "0x765DE816845861e75A25fCA122bb6898B8B1282a"
tokenSymbol = "FOO" tokenSymbol = "FOO"
tokenName = "Foo Token" tokenName = "Foo Token"
tokenDecimals = 6 tokenDecimals = 6
txValue = 1337 txValue = 1337
tokenBalance = 362436 tokenBalance = 362436
txTimestamp = 1730592500 txTimestamp = 1730592500
txHash = "0xabcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789" txHash = "0xabcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789"
sinkAddress = "0xb42C5920014eE152F2225285219407938469BBfA" sinkAddress = "0xb42C5920014eE152F2225285219407938469BBfA"
) )
// TODO: jetstream, would have been nice of you to provide an easier way to make a mock msg // TODO: jetstream, would have been nice of you to provide an easier way to make a mock msg
@ -44,51 +44,51 @@ type testMsg struct {
data []byte data []byte
} }
func (m *testMsg) Ack() error { func(m *testMsg) Ack() error {
return nil return nil
} }
func (m *testMsg) Nak() error { func(m *testMsg) Nak() error {
return nil return nil
} }
func (m *testMsg) NakWithDelay(time.Duration) error { func(m *testMsg) NakWithDelay(time.Duration) error {
return nil return nil
} }
func (m *testMsg) Data() []byte { func(m *testMsg) Data() []byte {
return m.data return m.data
} }
func (m *testMsg) Reply() string { func(m *testMsg) Reply() string {
return "" return ""
} }
func (m *testMsg) Subject() string { func(m *testMsg) Subject() string {
return "" return ""
} }
func (m *testMsg) Term() error { func(m *testMsg) Term() error {
return nil return nil
} }
func (m *testMsg) TermWithReason(string) error { func(m *testMsg) TermWithReason(string) error {
return nil return nil
} }
func (m *testMsg) DoubleAck(ctx context.Context) error { func(m *testMsg) DoubleAck(ctx context.Context) error {
return nil return nil
} }
func (m *testMsg) Headers() nats.Header { func(m *testMsg) Headers() nats.Header {
return nats.Header{} return nats.Header{}
} }
func (m *testMsg) InProgress() error { func(m *testMsg) InProgress() error {
return nil return nil
} }
func (m *testMsg) Metadata() (*jetstream.MsgMetadata, error) { func(m *testMsg) Metadata() (*jetstream.MsgMetadata, error) {
return nil, nil return nil, nil
} }
@ -101,29 +101,29 @@ func TestHandleMsg(t *testing.T) {
api := &apimocks.MockApi{} api := &apimocks.MockApi{}
api.TransactionsContent = []dataserviceapi.Last10TxResponse{ api.TransactionsContent = []dataserviceapi.Last10TxResponse{
dataserviceapi.Last10TxResponse{ dataserviceapi.Last10TxResponse{
Sender: apimocks.AliceChecksum, Sender: apimocks.AliceChecksum,
Recipient: apimocks.BobChecksum, Recipient: apimocks.BobChecksum,
TransferValue: strconv.Itoa(txValue), TransferValue: strconv.Itoa(txValue),
ContractAddress: tokenAddress, ContractAddress: tokenAddress,
TxHash: txHash, TxHash: txHash,
DateBlock: time.Unix(txTimestamp, 0), DateBlock: time.Unix(txTimestamp, 0),
TokenSymbol: tokenSymbol, TokenSymbol: tokenSymbol,
TokenDecimals: strconv.Itoa(tokenDecimals), TokenDecimals: strconv.Itoa(tokenDecimals),
}, },
} }
api.VoucherDataContent = &models.VoucherDataResult{ api.VoucherDataContent = &models.VoucherDataResult{
TokenSymbol: tokenSymbol, TokenSymbol: tokenSymbol,
TokenName: tokenName, TokenName: tokenName,
//TokenDecimals: strconv.Itoa(tokenDecimals), //TokenDecimals: strconv.Itoa(tokenDecimals),
TokenDecimals: tokenDecimals, TokenDecimals: tokenDecimals,
SinkAddress: sinkAddress, SinkAddress: sinkAddress,
} }
api.VouchersContent = []dataserviceapi.TokenHoldings{ api.VouchersContent = []dataserviceapi.TokenHoldings{
dataserviceapi.TokenHoldings{ dataserviceapi.TokenHoldings{
ContractAddress: tokenAddress, ContractAddress: tokenAddress,
TokenSymbol: tokenSymbol, TokenSymbol: tokenSymbol,
TokenDecimals: strconv.Itoa(tokenDecimals), TokenDecimals: strconv.Itoa(tokenDecimals),
Balance: strconv.Itoa(tokenBalance), Balance: strconv.Itoa(tokenBalance),
}, },
} }
lookup.Api = api lookup.Api = api
@ -182,8 +182,8 @@ func TestHandleMsg(t *testing.T) {
t.Fatal(err) t.Fatal(err)
} }
fmts := fmt.Sprintf("%%1.%df", tokenDecimals) fmts := fmt.Sprintf("%%1.%df", tokenDecimals)
expect := fmt.Sprintf(fmts, float64(tokenBalance)/math.Pow(10, tokenDecimals)) expect := fmt.Sprintf(fmts, float64(tokenBalance) / math.Pow(10, tokenDecimals))
//if !bytes.Equal(v, []byte(strconv.Itoa(tokenBalance))) {
if !bytes.Equal(v, []byte(expect)) { if !bytes.Equal(v, []byte(expect)) {
t.Fatalf("expected '%d', got %s", tokenBalance, v) t.Fatalf("expected '%d', got %s", tokenBalance, v)
} }
@ -196,6 +196,7 @@ func TestHandleMsg(t *testing.T) {
t.Fatal("no transaction data") t.Fatal("no transaction data")
} }
mh, err := application.NewMenuHandlers(nil, userStore, nil, testutil.ReplaceSeparatorFunc) mh, err := application.NewMenuHandlers(nil, userStore, nil, testutil.ReplaceSeparatorFunc)
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
@ -209,4 +210,14 @@ func TestHandleMsg(t *testing.T) {
if rrs.Content != expect { if rrs.Content != expect {
t.Fatalf("expected '%v', got '%v'", expect, rrs.Content) t.Fatalf("expected '%v', got '%v'", expect, rrs.Content)
} }
// userDb.SetPrefix(event.DATATYPE_USERSUB)
// userDb.SetSession(apimocks.AliceSession)
// k := append([]byte("vouchers"), []byte("sym")...)
// v, err = userDb.Get(ctx, k)
// if err != nil {
// t.Fatal(err)
// }
// if !bytes.Contains(v, []byte(fmt.Sprintf("1:%s", tokenSymbol))) {
// t.Fatalf("expected '1:%s', got %s", tokenSymbol, v)
// }
} }

View File

@ -30,7 +30,7 @@ func NewRouter(handler *apievent.EventsHandler) *Router {
// //
// An error will be returned if no handler can be found, or if the resolved // An error will be returned if no handler can be found, or if the resolved
// handler fails to successfully execute. // handler fails to successfully execute.
func (r *Router) Route(ctx context.Context, gev *geEvent.Event) error { func(r *Router) Route(ctx context.Context, gev *geEvent.Event) error {
logg.DebugCtxf(ctx, "have event", "ev", gev) logg.DebugCtxf(ctx, "have event", "ev", gev)
evCC, ok := asCustodialRegistrationEvent(gev) evCC, ok := asCustodialRegistrationEvent(gev)
if ok { if ok {

View File

@ -34,6 +34,7 @@ func formatTransaction(tag string, idx int, item any) string {
return "" return ""
} }
// waiter to check whether object is available on dependency endpoints. // waiter to check whether object is available on dependency endpoints.
func updateWait(ctx context.Context) error { func updateWait(ctx context.Context) error {
return nil return nil

View File

@ -9,36 +9,37 @@ import (
"testing" "testing"
"time" "time"
dataserviceapi "github.com/grassrootseconomics/ussd-data-service/pkg/api"
"git.defalsify.org/vise.git/db" "git.defalsify.org/vise.git/db"
"git.grassecon.net/grassrootseconomics/common/hex"
apievent "git.grassecon.net/grassrootseconomics/sarafu-api/event"
"git.grassecon.net/grassrootseconomics/sarafu-api/models"
apimocks "git.grassecon.net/grassrootseconomics/sarafu-api/testutil/mocks"
"git.grassecon.net/grassrootseconomics/sarafu-vise-events/config" "git.grassecon.net/grassrootseconomics/sarafu-vise-events/config"
"git.grassecon.net/grassrootseconomics/sarafu-vise-events/internal/testutil"
"git.grassecon.net/grassrootseconomics/sarafu-vise-events/lookup"
"git.grassecon.net/grassrootseconomics/sarafu-vise/handlers/application" "git.grassecon.net/grassrootseconomics/sarafu-vise/handlers/application"
viseevent "git.grassecon.net/grassrootseconomics/sarafu-vise/handlers/event" "git.grassecon.net/grassrootseconomics/sarafu-api/models"
"git.grassecon.net/grassrootseconomics/sarafu-vise/store" "git.grassecon.net/grassrootseconomics/sarafu-vise/store"
storedb "git.grassecon.net/grassrootseconomics/sarafu-vise/store/db" storedb "git.grassecon.net/grassrootseconomics/sarafu-vise/store/db"
"git.grassecon.net/grassrootseconomics/sarafu-vise-events/lookup"
"git.grassecon.net/grassrootseconomics/common/hex"
"git.grassecon.net/grassrootseconomics/sarafu-vise-events/internal/testutil"
apievent "git.grassecon.net/grassrootseconomics/sarafu-api/event"
apimocks "git.grassecon.net/grassrootseconomics/sarafu-api/testutil/mocks"
viseevent "git.grassecon.net/grassrootseconomics/sarafu-vise/handlers/event"
"git.grassecon.net/grassrootseconomics/visedriver/testutil/mocks" "git.grassecon.net/grassrootseconomics/visedriver/testutil/mocks"
dataserviceapi "github.com/grassrootseconomics/ussd-data-service/pkg/api"
) )
const ( const (
txBlock = 42 txBlock = 42
tokenAddress = "0x765DE816845861e75A25fCA122bb6898B8B1282a" tokenAddress = "0x765DE816845861e75A25fCA122bb6898B8B1282a"
tokenSymbol = "FOO" tokenSymbol = "FOO"
tokenName = "Foo Token" tokenName = "Foo Token"
tokenDecimals = 6 tokenDecimals = 6
txValue = 1337 txValue = 1337
tokenBalance = 362436 tokenBalance = 362436
txTimestamp = 1730592500 txTimestamp = 1730592500
txHash = "0xabcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789" txHash = "0xabcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789"
sinkAddress = "0xb42C5920014eE152F2225285219407938469BBfA" sinkAddress = "0xb42C5920014eE152F2225285219407938469BBfA"
bogusSym = "/-21380u" bogusSym = "/-21380u"
) )
func TestTokenTransfer(t *testing.T) { func TestTokenTransfer(t *testing.T) {
err := config.LoadConfig() err := config.LoadConfig()
if err != nil { if err != nil {
@ -48,29 +49,29 @@ func TestTokenTransfer(t *testing.T) {
api := &apimocks.MockApi{} api := &apimocks.MockApi{}
api.TransactionsContent = []dataserviceapi.Last10TxResponse{ api.TransactionsContent = []dataserviceapi.Last10TxResponse{
dataserviceapi.Last10TxResponse{ dataserviceapi.Last10TxResponse{
Sender: apimocks.AliceChecksum, Sender: apimocks.AliceChecksum,
Recipient: apimocks.BobChecksum, Recipient: apimocks.BobChecksum,
TransferValue: strconv.Itoa(txValue), TransferValue: strconv.Itoa(txValue),
ContractAddress: tokenAddress, ContractAddress: tokenAddress,
TxHash: txHash, TxHash: txHash,
DateBlock: time.Unix(txTimestamp, 0), DateBlock: time.Unix(txTimestamp, 0),
TokenSymbol: tokenSymbol, TokenSymbol: tokenSymbol,
TokenDecimals: strconv.Itoa(tokenDecimals), TokenDecimals: strconv.Itoa(tokenDecimals),
}, },
} }
api.VoucherDataContent = &models.VoucherDataResult{ api.VoucherDataContent = &models.VoucherDataResult{
TokenSymbol: tokenSymbol, TokenSymbol: tokenSymbol,
TokenName: tokenName, TokenName: tokenName,
//TokenDecimals: strconv.Itoa(tokenDecimals), //TokenDecimals: strconv.Itoa(tokenDecimals),
TokenDecimals: tokenDecimals, TokenDecimals: tokenDecimals,
SinkAddress: sinkAddress, SinkAddress: sinkAddress,
} }
api.VouchersContent = []dataserviceapi.TokenHoldings{ api.VouchersContent = []dataserviceapi.TokenHoldings{
dataserviceapi.TokenHoldings{ dataserviceapi.TokenHoldings{
ContractAddress: tokenAddress, ContractAddress: tokenAddress,
TokenSymbol: tokenSymbol, TokenSymbol: tokenSymbol,
TokenDecimals: strconv.Itoa(tokenDecimals), TokenDecimals: strconv.Itoa(tokenDecimals),
Balance: strconv.Itoa(tokenBalance), Balance: strconv.Itoa(tokenBalance),
}, },
} }
lookup.Api = api lookup.Api = api
@ -97,8 +98,8 @@ func TestTokenTransfer(t *testing.T) {
} }
ev := &apievent.EventTokenTransfer{ ev := &apievent.EventTokenTransfer{
From: apimocks.BobChecksum, From: apimocks.BobChecksum,
To: apimocks.AliceChecksum, To: apimocks.AliceChecksum,
Value: txValue, Value: txValue,
} }
@ -122,7 +123,7 @@ func TestTokenTransfer(t *testing.T) {
} }
//if !bytes.Equal(v, []byte(strconv.Itoa(tokenBalance))) { //if !bytes.Equal(v, []byte(strconv.Itoa(tokenBalance))) {
fmts := fmt.Sprintf("%%1.%df", tokenDecimals) fmts := fmt.Sprintf("%%1.%df", tokenDecimals)
expect := fmt.Sprintf(fmts, float64(tokenBalance)/math.Pow(10, tokenDecimals)) expect := fmt.Sprintf(fmts, float64(tokenBalance) / math.Pow(10, tokenDecimals))
if !bytes.Equal(v, []byte(expect)) { if !bytes.Equal(v, []byte(expect)) {
t.Fatalf("expected '%s', got %s", expect, v) t.Fatalf("expected '%s', got %s", expect, v)
} }
@ -159,33 +160,34 @@ func TestTokenMint(t *testing.T) {
api := &apimocks.MockApi{} api := &apimocks.MockApi{}
api.TransactionsContent = []dataserviceapi.Last10TxResponse{ api.TransactionsContent = []dataserviceapi.Last10TxResponse{
dataserviceapi.Last10TxResponse{ dataserviceapi.Last10TxResponse{
Sender: apimocks.AliceChecksum, Sender: apimocks.AliceChecksum,
Recipient: apimocks.BobChecksum, Recipient: apimocks.BobChecksum,
TransferValue: strconv.Itoa(txValue), TransferValue: strconv.Itoa(txValue),
ContractAddress: tokenAddress, ContractAddress: tokenAddress,
TxHash: txHash, TxHash: txHash,
DateBlock: time.Unix(txTimestamp, 0), DateBlock: time.Unix(txTimestamp, 0),
TokenSymbol: tokenSymbol, TokenSymbol: tokenSymbol,
TokenDecimals: strconv.Itoa(tokenDecimals), TokenDecimals: strconv.Itoa(tokenDecimals),
}, },
} }
api.VoucherDataContent = &models.VoucherDataResult{ api.VoucherDataContent = &models.VoucherDataResult{
TokenSymbol: tokenSymbol, TokenSymbol: tokenSymbol,
TokenName: tokenName, TokenName: tokenName,
//TokenDecimals: strconv.Itoa(tokenDecimals), //TokenDecimals: strconv.Itoa(tokenDecimals),
TokenDecimals: tokenDecimals, TokenDecimals: tokenDecimals,
SinkAddress: sinkAddress, SinkAddress: sinkAddress,
} }
api.VouchersContent = []dataserviceapi.TokenHoldings{ api.VouchersContent = []dataserviceapi.TokenHoldings{
dataserviceapi.TokenHoldings{ dataserviceapi.TokenHoldings{
ContractAddress: tokenAddress, ContractAddress: tokenAddress,
TokenSymbol: tokenSymbol, TokenSymbol: tokenSymbol,
TokenDecimals: strconv.Itoa(tokenDecimals), TokenDecimals: strconv.Itoa(tokenDecimals),
Balance: strconv.Itoa(tokenBalance), Balance: strconv.Itoa(tokenBalance),
}, },
} }
lookup.Api = api lookup.Api = api
ctx := context.Background() ctx := context.Background()
storageService := mocks.NewMemStorageService(ctx) storageService := mocks.NewMemStorageService(ctx)
eu := viseevent.NewEventsUpdater(api, storageService) eu := viseevent.NewEventsUpdater(api, storageService)
@ -207,7 +209,7 @@ func TestTokenMint(t *testing.T) {
} }
ev := &apievent.EventTokenMint{ ev := &apievent.EventTokenMint{
To: apimocks.AliceChecksum, To: apimocks.AliceChecksum,
Value: txValue, Value: txValue,
} }
@ -230,8 +232,8 @@ func TestTokenMint(t *testing.T) {
t.Fatal(err) t.Fatal(err)
} }
fmts := fmt.Sprintf("%%1.%df", tokenDecimals) fmts := fmt.Sprintf("%%1.%df", tokenDecimals)
expect := fmt.Sprintf(fmts, float64(tokenBalance)/math.Pow(10, tokenDecimals)) expect := fmt.Sprintf(fmts, float64(tokenBalance) / math.Pow(10, tokenDecimals))
//if !bytes.Equal(v, []byte(strconv.Itoa(tokenBalance))) {
if !bytes.Equal(v, []byte(expect)) { if !bytes.Equal(v, []byte(expect)) {
t.Fatalf("expected '%d', got %s", tokenBalance, v) t.Fatalf("expected '%d', got %s", tokenBalance, v)
} }

4
go.mod
View File

@ -6,8 +6,8 @@ require (
git.defalsify.org/vise.git v0.2.3-0.20250120121301-10739fb4a8c9 git.defalsify.org/vise.git v0.2.3-0.20250120121301-10739fb4a8c9
git.grassecon.net/grassrootseconomics/common v0.0.0-20250121134736-ba8cbbccea7d git.grassecon.net/grassrootseconomics/common v0.0.0-20250121134736-ba8cbbccea7d
git.grassecon.net/grassrootseconomics/sarafu-api v0.0.0-20250121135150-e0b539809805 git.grassecon.net/grassrootseconomics/sarafu-api v0.0.0-20250121135150-e0b539809805
git.grassecon.net/grassrootseconomics/sarafu-vise v0.0.0-20250124084723-9a094f440f86 git.grassecon.net/grassrootseconomics/sarafu-vise v0.0.0-20250121142648-4baacb325d2b
git.grassecon.net/grassrootseconomics/visedriver v0.8.0-beta.10.0.20250122123424-6749c632b0a2 git.grassecon.net/grassrootseconomics/visedriver v0.8.0-beta.10.0.20250121134912-f7d31e4e8162
github.com/grassrootseconomics/eth-tracker v1.3.0-rc github.com/grassrootseconomics/eth-tracker v1.3.0-rc
github.com/grassrootseconomics/ussd-data-service v1.2.0-beta github.com/grassrootseconomics/ussd-data-service v1.2.0-beta
github.com/nats-io/nats.go v1.37.0 github.com/nats-io/nats.go v1.37.0

8
go.sum
View File

@ -4,10 +4,10 @@ git.grassecon.net/grassrootseconomics/common v0.0.0-20250121134736-ba8cbbccea7d
git.grassecon.net/grassrootseconomics/common v0.0.0-20250121134736-ba8cbbccea7d/go.mod h1:wgQJZGIS6QuNLHqDhcsvehsbn5PvgV7aziRebMnJi60= git.grassecon.net/grassrootseconomics/common v0.0.0-20250121134736-ba8cbbccea7d/go.mod h1:wgQJZGIS6QuNLHqDhcsvehsbn5PvgV7aziRebMnJi60=
git.grassecon.net/grassrootseconomics/sarafu-api v0.0.0-20250121135150-e0b539809805 h1:deGnqf4YCsbxhXgjFEjYjTUCvciLEmI26T9IysRsQXY= git.grassecon.net/grassrootseconomics/sarafu-api v0.0.0-20250121135150-e0b539809805 h1:deGnqf4YCsbxhXgjFEjYjTUCvciLEmI26T9IysRsQXY=
git.grassecon.net/grassrootseconomics/sarafu-api v0.0.0-20250121135150-e0b539809805/go.mod h1:9bc3d//Qqm11hz7GYRdQc1Uan+0GJIOpvRBbv8cHMu8= git.grassecon.net/grassrootseconomics/sarafu-api v0.0.0-20250121135150-e0b539809805/go.mod h1:9bc3d//Qqm11hz7GYRdQc1Uan+0GJIOpvRBbv8cHMu8=
git.grassecon.net/grassrootseconomics/sarafu-vise v0.0.0-20250124084723-9a094f440f86 h1:wqISfQKU7nJgKVGGMm/b0M46tMRmvkBc+riLOWzd7ss= git.grassecon.net/grassrootseconomics/sarafu-vise v0.0.0-20250121142648-4baacb325d2b h1:kUQW5cM4Q7TogrUfrxFjdvA/BYCescsAZBtf5teLYrY=
git.grassecon.net/grassrootseconomics/sarafu-vise v0.0.0-20250124084723-9a094f440f86/go.mod h1:kt/HZVYJZoQLzJtHKSfltZu7+khRUUq5P98PtPpKbUc= git.grassecon.net/grassrootseconomics/sarafu-vise v0.0.0-20250121142648-4baacb325d2b/go.mod h1:AF6qgkV+OmxamrPcrzZfsRUYTaQMZXBRejRg7dIKej4=
git.grassecon.net/grassrootseconomics/visedriver v0.8.0-beta.10.0.20250122123424-6749c632b0a2 h1:ON77G5K0JNuwPb5JT/hRfF6G6+xstlBQgEIEzWydnhg= git.grassecon.net/grassrootseconomics/visedriver v0.8.0-beta.10.0.20250121134912-f7d31e4e8162 h1:NaPbgGQ1Nb+yYF+Qj1LSagpjYeDcSXST8iZwONg4afY=
git.grassecon.net/grassrootseconomics/visedriver v0.8.0-beta.10.0.20250122123424-6749c632b0a2/go.mod h1:pjKp9L/ZsWW3kMB0UoIl1yv9TBIuU33mn9Aghxp7vGk= git.grassecon.net/grassrootseconomics/visedriver v0.8.0-beta.10.0.20250121134912-f7d31e4e8162/go.mod h1:pjKp9L/ZsWW3kMB0UoIl1yv9TBIuU33mn9Aghxp7vGk=
github.com/alecthomas/assert/v2 v2.2.2 h1:Z/iVC0xZfWTaFNE6bA3z07T86hd45Xe2eLt6WVy2bbk= github.com/alecthomas/assert/v2 v2.2.2 h1:Z/iVC0xZfWTaFNE6bA3z07T86hd45Xe2eLt6WVy2bbk=
github.com/alecthomas/assert/v2 v2.2.2/go.mod h1:pXcQ2Asjp247dahGEmsZ6ru0UVwnkhktn7S0bBDLxvQ= github.com/alecthomas/assert/v2 v2.2.2/go.mod h1:pXcQ2Asjp247dahGEmsZ6ru0UVwnkhktn7S0bBDLxvQ=
github.com/alecthomas/participle/v2 v2.0.0 h1:Fgrq+MbuSsJwIkw3fEj9h75vDP0Er5JzepJ0/HNHv0g= github.com/alecthomas/participle/v2 v2.0.0 h1:Fgrq+MbuSsJwIkw3fEj9h75vDP0Er5JzepJ0/HNHv0g=

View File

@ -1,8 +1,8 @@
package lookup package lookup
import ( import (
"git.grassecon.net/grassrootseconomics/sarafu-api/remote"
"git.grassecon.net/grassrootseconomics/sarafu-api/remote/http" "git.grassecon.net/grassrootseconomics/sarafu-api/remote/http"
"git.grassecon.net/grassrootseconomics/sarafu-api/remote"
) )
var ( var (