cic-custodial/internal/tasker/server/registration.go
Mohammed Sohail 1bc8d65016
refactor: remove action provider
* allows better control over accounting  locking
2022-10-26 09:11:15 +00:00

98 lines
2.1 KiB
Go

package server
import (
"context"
"encoding/json"
"fmt"
"math/big"
"github.com/grassrootseconomics/cic-custodial/internal/tasker/client"
"github.com/grassrootseconomics/cic-go-sdk/chain"
"github.com/hibiken/asynq"
"github.com/lmittmann/w3"
)
const (
initialGiftGasValue = 1000000
)
func (tp *TaskerProcessor) setNewAccountNonce(ctx context.Context, t *asynq.Task) error {
var (
p client.RegistrationPayload
)
if err := json.Unmarshal(t.Payload(), &p); err != nil {
return fmt.Errorf("json.Unmarshal failed: %v: %w", err, asynq.SkipRetry)
}
if err := tp.Noncestore.SetNewAccountNonce(ctx, p.PublicKey); err != nil {
return err
}
_, err := tp.TaskerClient.CreateRegistrationTask(p, client.GiftGasTask)
if err != nil {
return err
}
return nil
}
func (tp *TaskerProcessor) giftGasProcessor(ctx context.Context, t *asynq.Task) error {
var (
p client.RegistrationPayload
)
if err := json.Unmarshal(t.Payload(), &p); err != nil {
return fmt.Errorf("json.Unmarshal failed: %v: %w", err, asynq.SkipRetry)
}
lock, err := tp.LockProvider.Obtain(ctx, tp.SystemPublicKey, LockTTL, nil)
if err != nil {
return err
}
defer lock.Release(ctx)
nonce, err := tp.Noncestore.Acquire(ctx, tp.SystemPublicKey)
if err != nil {
return err
}
builtTx, err := tp.ChainProvider.BuildGasTransferTx(tp.SystemPrivateKey, chain.TransactionData{
To: w3.A(p.PublicKey),
Nonce: nonce,
}, big.NewInt(initialGiftGasValue))
if err != nil {
return err
}
_, err = tp.TaskerClient.CreateTxDispatchTask(client.TxPayload{
Tx: builtTx,
}, client.TxDispatchTask)
if err != nil {
return err
}
_, err = tp.TaskerClient.CreateRegistrationTask(p, client.ActivateAccountTask)
if err != nil {
return err
}
return nil
}
func (tp *TaskerProcessor) activateAccountProcessor(ctx context.Context, t *asynq.Task) error {
var (
p client.RegistrationPayload
)
if err := json.Unmarshal(t.Payload(), &p); err != nil {
return fmt.Errorf("json.Unmarshal failed: %v: %w", err, asynq.SkipRetry)
}
if err := tp.Keystore.ActivateAccount(ctx, p.PublicKey); err != nil {
return err
}
return nil
}