github.com/loomnetwork/gamechain@v0.0.0-20200406110549-36c47eb97a92/oracle/gamechain_gateway.go (about)

     1  package oracle
     2  
     3  import (
     4  	"github.com/loomnetwork/gamechain/types/zb/zb_calls"
     5  	"time"
     6  
     7  	orctype "github.com/loomnetwork/gamechain/types/oracle"
     8  	"github.com/loomnetwork/go-loom"
     9  	"github.com/loomnetwork/go-loom/auth"
    10  	"github.com/loomnetwork/go-loom/client"
    11  	"github.com/pkg/errors"
    12  )
    13  
    14  type GamechainGateway struct {
    15  	Address loom.Address
    16  	// Timestamp of the last successful response from the DAppChain
    17  	LastResponseTime time.Time
    18  
    19  	contract *client.Contract
    20  	caller   loom.Address
    21  	logger   *loom.Logger
    22  	signer   auth.Signer
    23  }
    24  
    25  func ConnectToGamechainGateway(
    26  	loomClient *client.DAppChainRPCClient, caller loom.Address, contractName string, signer auth.Signer,
    27  	logger *loom.Logger,
    28  ) (*GamechainGateway, error) {
    29  	gatewayAddr, err := loomClient.Resolve(contractName)
    30  	if err != nil {
    31  		return nil, errors.Wrap(err, "failed to resolve Gateway Go contract address")
    32  	}
    33  	return &GamechainGateway{
    34  		Address:          gatewayAddr,
    35  		LastResponseTime: time.Now(),
    36  		contract:         client.NewContract(loomClient, gatewayAddr.Local),
    37  		caller:           caller,
    38  		signer:           signer,
    39  		logger:           logger,
    40  	}, nil
    41  }
    42  
    43  func (gw *GamechainGateway) GetLastPlasmaBlockNumber() (uint64, error) {
    44  	var req zb_calls.EmptyRequest
    45  	var resp zb_calls.GetContractStateResponse
    46  
    47  	if _, err := gw.contract.StaticCall("GetContractState", &req, gw.caller, &resp); err != nil {
    48  		err = errors.Wrap(err, "failed to call GetContractState")
    49  		gw.logger.Error(err.Error())
    50  		return 0, err
    51  	}
    52  	gw.LastResponseTime = time.Now()
    53  	return resp.State.LastPlasmachainBlockNumber, nil
    54  }
    55  
    56  func (gw *GamechainGateway) SetLastPlasmaBlockNumber(lastBlock uint64) error {
    57  	req := zb_calls.SetLastPlasmaBlockNumberRequest{
    58  		LastPlasmachainBlockNumber: lastBlock,
    59  	}
    60  
    61  	if _, err := gw.contract.Call("SetLastPlasmaBlockNumber", &req, gw.signer, nil); err != nil {
    62  		err = errors.Wrap(err, "failed to call SetLastPlasmaBlockNumber")
    63  		gw.logger.Error(err.Error())
    64  		return err
    65  	}
    66  	gw.LastResponseTime = time.Now()
    67  	return nil
    68  }
    69  
    70  func (gw *GamechainGateway) GetOracleCommandRequestList() ([]*orctype.OracleCommandRequest, error) {
    71  	var req orctype.GetOracleCommandRequestListRequest
    72  	var resp orctype.GetOracleCommandRequestListResponse
    73  
    74  	if _, err := gw.contract.StaticCall("GetOracleCommandRequestList", &req, gw.caller, &resp); err != nil {
    75  		err = errors.Wrap(err, "failed to call GetOracleCommandRequestList")
    76  		gw.logger.Error(err.Error())
    77  		return nil, err
    78  	}
    79  	gw.LastResponseTime = time.Now()
    80  	return resp.CommandRequests, nil
    81  }
    82  
    83  func (gw *GamechainGateway) ProcessOracleCommandResponseBatch(commandResponses []*orctype.OracleCommandResponse) error {
    84  	req := orctype.ProcessOracleCommandResponseBatchRequest{
    85  		CommandResponses: commandResponses,
    86  	}
    87  
    88  	if _, err := gw.contract.Call("ProcessOracleCommandResponseBatch", &req, gw.signer, nil); err != nil {
    89  		err = errors.Wrap(err, "failed to call ProcessOracleCommandResponseBatch")
    90  		gw.logger.Error(err.Error())
    91  		return err
    92  	}
    93  	gw.LastResponseTime = time.Now()
    94  	return nil
    95  }
    96  
    97  func (gw *GamechainGateway) ProcessOracleEventBatch(events []*orctype.PlasmachainEvent, endBlock uint64, zbgCardContractAddress loom.Address) error {
    98  	req := orctype.ProcessOracleEventBatchRequest{
    99  		Events:                     events,
   100  		LastPlasmachainBlockNumber: endBlock,
   101  		ZbgCardContractAddress:     zbgCardContractAddress.MarshalPB(),
   102  	}
   103  
   104  	if _, err := gw.contract.Call("ProcessOracleEventBatch", &req, gw.signer, nil); err != nil {
   105  		err = errors.Wrap(err, "failed to call ProcessOracleEventBatch")
   106  		gw.logger.Error(err.Error())
   107  		return err
   108  	}
   109  	gw.LastResponseTime = time.Now()
   110  	return nil
   111  }