Skip to content

Instantly share code, notes, and snippets.

@chibie
Last active March 30, 2024 22:36
Show Gist options
  • Select an option

  • Save chibie/cce5ab87e555f62c07d13bce4b553cf5 to your computer and use it in GitHub Desktop.

Select an option

Save chibie/cce5ab87e555f62c07d13bce4b553cf5 to your computer and use it in GitHub Desktop.
paycrest create order indexer
func (s *IndexerService) IndexOrderCreated(ctx context.Context, client types.RPCClient, network *ent.Network) error {
var err error
// Connect to RPC endpoint
if client == nil {
client, err = types.NewEthClient(network.RPCEndpoint)
if err != nil {
return fmt.Errorf("IndexOrderCreated.NewEthClient: %w", err)
}
}
// Initialize contract filterer
filterer, err := contracts.NewPaycrestFilterer(OrderConf.PaycrestOrderContractAddress, client)
if err != nil {
return fmt.Errorf("IndexOrderCreated.NewPaycrestFilterer: %w", err)
}
// Index missed blocks
go func() {
// Filter logs from the last lock payment order block number
opts := s.getMissedOrderBlocksOpts(ctx, client, network, lockpaymentorder.StatusPending)
// Fetch logs
var iter *contracts.PaycrestOrderCreatedIterator
retryErr := utils.Retry(3, 5*time.Second, func() error {
var err error
iter, err = filterer.FilterOrderCreated(opts, nil, nil, nil)
return err
})
if retryErr != nil {
logger.Errorf("IndexOrderCreated.FilterOrderCreated: %v", retryErr)
return
}
// Iterate over logs
for iter.Next() {
err := s.createLockPaymentOrder(ctx, client, network, iter.Event)
if err != nil {
logger.Errorf("IndexOrderCreated.createOrder: %v", err)
continue
}
}
}()
if ServerConf.Environment != "test" {
// Start listening for deposit events
logs := make(chan *contracts.PaycrestOrderCreated)
sub, err := filterer.WatchOrderCreated(&bind.WatchOpts{
Start: nil,
}, logs, nil, nil, nil)
if err != nil {
return fmt.Errorf("IndexOrderCreated.WatchOrderCreated: %w", err)
}
defer sub.Unsubscribe()
logger.Infof("Listening for OrderCreated events...\n")
for {
select {
case log := <-logs:
err := s.createLockPaymentOrder(ctx, client, network, log)
if err != nil {
logger.Errorf("IndexOrderCreated.createLockPaymentOrder: %v", err)
continue
}
case err := <-sub.Err():
if err == nil {
sub.Unsubscribe()
// Retry the subscription
retryErr := utils.Retry(3, 5*time.Second, func() error {
sub, err = filterer.WatchOrderCreated(&bind.WatchOpts{
Start: nil,
}, logs, nil, nil, nil)
return err
})
if retryErr != nil {
logger.Errorf("IndexOrderCreated.WatchOrderCreated: %v", retryErr)
return retryErr
}
} else {
logger.Errorf("IndexOrderCreated.logError: %v", err)
continue
}
}
}
}
return nil
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment