Compare commits
4 Commits
lash/dev-a
...
lash/dev-a
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7c697394b5
|
||
|
|
37bb460561
|
||
|
|
5511955438
|
||
|
|
25149ff265
|
56
dev/api.go
56
dev/api.go
@@ -16,6 +16,7 @@ import (
|
|||||||
"git.defalsify.org/vise.git/db"
|
"git.defalsify.org/vise.git/db"
|
||||||
fsdb "git.defalsify.org/vise.git/db/fs"
|
fsdb "git.defalsify.org/vise.git/db/fs"
|
||||||
"git.grassecon.net/grassrootseconomics/sarafu-api/models"
|
"git.grassecon.net/grassrootseconomics/sarafu-api/models"
|
||||||
|
"git.grassecon.net/grassrootseconomics/sarafu-api/event"
|
||||||
dataserviceapi "github.com/grassrootseconomics/ussd-data-service/pkg/api"
|
dataserviceapi "github.com/grassrootseconomics/ussd-data-service/pkg/api"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -40,6 +41,25 @@ type Tx struct {
|
|||||||
When time.Time `json: "when"`
|
When time.Time `json: "when"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (t *Tx) ToTransferEvent() event.EventTokenTransfer {
|
||||||
|
return event.EventTokenTransfer{
|
||||||
|
To: t.To,
|
||||||
|
Value: t.Value,
|
||||||
|
VoucherAddress: t.Voucher,
|
||||||
|
TxHash: t.Hsh,
|
||||||
|
From: t.From,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *Tx) ToMintEvent() event.EventTokenMint {
|
||||||
|
return event.EventTokenMint{
|
||||||
|
To: t.To,
|
||||||
|
Value: t.Value,
|
||||||
|
VoucherAddress: t.Voucher,
|
||||||
|
TxHash: t.Hsh,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
type Account struct {
|
type Account struct {
|
||||||
Track string `json: "track"`
|
Track string `json: "track"`
|
||||||
Address string `json: "address"`
|
Address string `json: "address"`
|
||||||
@@ -50,6 +70,12 @@ type Account struct {
|
|||||||
Txs []string `json: "txs"`
|
Txs []string `json: "txs"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (a *Account) ToRegistrationEvent() event.EventCustodialRegistration {
|
||||||
|
return event.EventCustodialRegistration{
|
||||||
|
Account: a.Address,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
type Voucher struct {
|
type Voucher struct {
|
||||||
Name string `json: "name"`
|
Name string `json: "name"`
|
||||||
Address string `json: "address"`
|
Address string `json: "address"`
|
||||||
@@ -74,6 +100,7 @@ type DevAccountService struct {
|
|||||||
autoVouchers []string
|
autoVouchers []string
|
||||||
autoVoucherValue map[string]int
|
autoVoucherValue map[string]int
|
||||||
defaultAccount string
|
defaultAccount string
|
||||||
|
emitterFunc event.EmitterFunc
|
||||||
// accountsSession map[string]string
|
// accountsSession map[string]string
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -107,6 +134,11 @@ func NewDevAccountService(ctx context.Context, d string) *DevAccountService {
|
|||||||
return svc
|
return svc
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (das *DevAccountService) WithEmitter(fn event.EmitterFunc) *DevAccountService {
|
||||||
|
das.emitterFunc = fn
|
||||||
|
return das
|
||||||
|
}
|
||||||
|
|
||||||
func (das *DevAccountService) loadAccount(ctx context.Context, pubKey string, v []byte) error {
|
func (das *DevAccountService) loadAccount(ctx context.Context, pubKey string, v []byte) error {
|
||||||
var acc Account
|
var acc Account
|
||||||
|
|
||||||
@@ -306,7 +338,17 @@ func (das *DevAccountService) CreateAccount(ctx context.Context) (*models.Accoun
|
|||||||
das.defaultAccount = pubKey
|
das.defaultAccount = pubKey
|
||||||
}
|
}
|
||||||
|
|
||||||
logg.InfoCtxf(ctx, "account created", "account", acc)
|
if das.emitterFunc != nil {
|
||||||
|
msg := event.Msg{
|
||||||
|
Typ: event.EventRegistrationTag,
|
||||||
|
Item: acc,
|
||||||
|
}
|
||||||
|
err = das.emitterFunc(ctx, msg)
|
||||||
|
if err != nil {
|
||||||
|
logg.ErrorCtxf(ctx, "emitter returned error", "err", err, "msg", msg)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
logg.TraceCtxf(ctx, "account created", "account", acc)
|
||||||
|
|
||||||
return &models.AccountResult{
|
return &models.AccountResult{
|
||||||
PublicKey: pubKey,
|
PublicKey: pubKey,
|
||||||
@@ -458,7 +500,17 @@ func (das *DevAccountService) TokenTransfer(ctx context.Context, amount, from, t
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
das.txs[hsh] = mytx
|
das.txs[hsh] = mytx
|
||||||
logg.InfoCtxf(ctx, "token transfer created", "tx", mytx)
|
if das.emitterFunc != nil {
|
||||||
|
msg := event.Msg{
|
||||||
|
Typ: event.EventTokenTransferTag,
|
||||||
|
Item: mytx,
|
||||||
|
}
|
||||||
|
err = das.emitterFunc(ctx, msg)
|
||||||
|
if err != nil {
|
||||||
|
logg.ErrorCtxf(ctx, "emitter returned error", "err", err, "msg", msg)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
logg.TraceCtxf(ctx, "token transfer created", "tx", mytx)
|
||||||
return &models.TokenTransferResponse{
|
return &models.TokenTransferResponse{
|
||||||
TrackingId: uid.String(),
|
TrackingId: uid.String(),
|
||||||
}, nil
|
}, nil
|
||||||
|
|||||||
66
event/msg.go
Normal file
66
event/msg.go
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
package event
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
// TODO: integrate with sarafu-vise-events
|
||||||
|
EventTokenTransferTag = "TOKEN_TRANSFER"
|
||||||
|
EventTokenMintTag = "TOKEN_MINT"
|
||||||
|
EventRegistrationTag = "CUSTODIAL_REGISTRATION"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Msg struct {
|
||||||
|
Typ string
|
||||||
|
Item any
|
||||||
|
}
|
||||||
|
|
||||||
|
type EmitterFunc func(context.Context, Msg) error
|
||||||
|
|
||||||
|
// fields used for handling custodial registration event.
|
||||||
|
type EventCustodialRegistration struct {
|
||||||
|
Account string
|
||||||
|
}
|
||||||
|
|
||||||
|
// fields used for handling token transfer event.
|
||||||
|
type EventTokenTransfer struct {
|
||||||
|
To string
|
||||||
|
Value int
|
||||||
|
VoucherAddress string
|
||||||
|
TxHash string
|
||||||
|
From string
|
||||||
|
}
|
||||||
|
|
||||||
|
type EventTokenMint struct {
|
||||||
|
To string
|
||||||
|
Value int
|
||||||
|
TxHash string
|
||||||
|
VoucherAddress string
|
||||||
|
}
|
||||||
|
|
||||||
|
type EventsHandlerFunc func(context.Context, any) error
|
||||||
|
|
||||||
|
type EventsHandler struct {
|
||||||
|
handlers map[string]EventsHandlerFunc
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewEventsHandler() *EventsHandler {
|
||||||
|
return &EventsHandler{
|
||||||
|
handlers: make(map[string]EventsHandlerFunc),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (eh *EventsHandler) WithHandler(tag string, fn EventsHandlerFunc) *EventsHandler {
|
||||||
|
eh.handlers[tag] = fn
|
||||||
|
return eh
|
||||||
|
}
|
||||||
|
|
||||||
|
func (eh *EventsHandler) Handle(ctx context.Context, tag string, o any) error {
|
||||||
|
fn, ok := eh.handlers[tag]
|
||||||
|
if !ok {
|
||||||
|
return fmt.Errorf("Handler not registered for tag: %s", tag)
|
||||||
|
}
|
||||||
|
return fn(ctx, o)
|
||||||
|
}
|
||||||
2
go.mod
2
go.mod
@@ -4,7 +4,7 @@ go 1.23.4
|
|||||||
|
|
||||||
require (
|
require (
|
||||||
git.defalsify.org/vise.git v0.2.3-0.20250103172917-3e190a44568d
|
git.defalsify.org/vise.git v0.2.3-0.20250103172917-3e190a44568d
|
||||||
git.grassecon.net/grassrootseconomics/visedriver v0.8.0-beta.10.0.20250113103142-5bf0a0e85893
|
git.grassecon.net/grassrootseconomics/visedriver v0.8.0-beta.10.0.20250113213325-5228aef0889b
|
||||||
github.com/gofrs/uuid v4.4.0+incompatible
|
github.com/gofrs/uuid v4.4.0+incompatible
|
||||||
github.com/grassrootseconomics/eth-custodial v1.3.0-beta
|
github.com/grassrootseconomics/eth-custodial v1.3.0-beta
|
||||||
github.com/grassrootseconomics/ussd-data-service v1.2.0-beta
|
github.com/grassrootseconomics/ussd-data-service v1.2.0-beta
|
||||||
|
|||||||
4
go.sum
4
go.sum
@@ -1,7 +1,7 @@
|
|||||||
git.defalsify.org/vise.git v0.2.3-0.20250103172917-3e190a44568d h1:bPAOVZOX4frSGhfOdcj7kc555f8dc9DmMd2YAyC2AMw=
|
git.defalsify.org/vise.git v0.2.3-0.20250103172917-3e190a44568d h1:bPAOVZOX4frSGhfOdcj7kc555f8dc9DmMd2YAyC2AMw=
|
||||||
git.defalsify.org/vise.git v0.2.3-0.20250103172917-3e190a44568d/go.mod h1:jyBMe1qTYUz3mmuoC9JQ/TvFeW0vTanCUcPu3H8p4Ck=
|
git.defalsify.org/vise.git v0.2.3-0.20250103172917-3e190a44568d/go.mod h1:jyBMe1qTYUz3mmuoC9JQ/TvFeW0vTanCUcPu3H8p4Ck=
|
||||||
git.grassecon.net/grassrootseconomics/visedriver v0.8.0-beta.10.0.20250113103142-5bf0a0e85893 h1:MyDINzwY1sjfXkIFoc+6T5lXF/1xdFV6yjHrpSNZzWM=
|
git.grassecon.net/grassrootseconomics/visedriver v0.8.0-beta.10.0.20250113213325-5228aef0889b h1:6SieNUSEKbkjzquuwazs/lVG56zdEWF10zQQEMRJfMs=
|
||||||
git.grassecon.net/grassrootseconomics/visedriver v0.8.0-beta.10.0.20250113103142-5bf0a0e85893/go.mod h1:E6W7ZOa7ZvVr0Bc5ot0LNSwpSPYq4hXlAIvEPy3AJ7U=
|
git.grassecon.net/grassrootseconomics/visedriver v0.8.0-beta.10.0.20250113213325-5228aef0889b/go.mod h1:E6W7ZOa7ZvVr0Bc5ot0LNSwpSPYq4hXlAIvEPy3AJ7U=
|
||||||
github.com/barbashov/iso639-3 v0.0.0-20211020172741-1f4ffb2d8d1c h1:H9Nm+I7Cg/YVPpEV1RzU3Wq2pjamPc/UtHDgItcb7lE=
|
github.com/barbashov/iso639-3 v0.0.0-20211020172741-1f4ffb2d8d1c h1:H9Nm+I7Cg/YVPpEV1RzU3Wq2pjamPc/UtHDgItcb7lE=
|
||||||
github.com/barbashov/iso639-3 v0.0.0-20211020172741-1f4ffb2d8d1c/go.mod h1:rGod7o6KPeJ+hyBpHfhi4v7blx9sf+QsHsA7KAsdN6U=
|
github.com/barbashov/iso639-3 v0.0.0-20211020172741-1f4ffb2d8d1c/go.mod h1:rGod7o6KPeJ+hyBpHfhi4v7blx9sf+QsHsA7KAsdN6U=
|
||||||
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
|
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
|
||||||
|
|||||||
Reference in New Issue
Block a user