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 }