add: DioneOracle contract to replace Aggregator and OracleEmitter with simple oracle requests storage
This commit is contained in:
parent
e55c19a38d
commit
b4c03da4ba
964
contracts/dioneOracle/dioneOracle.go
Normal file
964
contracts/dioneOracle/dioneOracle.go
Normal file
File diff suppressed because one or more lines are too long
104
eth-contracts/contracts/DioneOracle.sol
Normal file
104
eth-contracts/contracts/DioneOracle.sol
Normal file
@ -0,0 +1,104 @@
|
|||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
pragma solidity ^0.6.12;
|
||||||
|
|
||||||
|
import "@openzeppelin/contracts/math/SafeMath.sol";
|
||||||
|
import "@openzeppelin/contracts/access/Ownable.sol";
|
||||||
|
|
||||||
|
import "./interfaces/DioneStakingInterface.sol";
|
||||||
|
|
||||||
|
contract DioneOracle is Ownable {
|
||||||
|
using SafeMath for uint256;
|
||||||
|
|
||||||
|
uint256 private requestCounter;
|
||||||
|
uint256 constant public MAXIMUM_DELAY = 5 minutes;
|
||||||
|
DioneStakingInterface public dioneStaking;
|
||||||
|
|
||||||
|
struct OracleRequest {
|
||||||
|
uint8 originChain; // origin blockchain for request
|
||||||
|
string requestType; // rpc call type
|
||||||
|
string requestParams; // rpc call params
|
||||||
|
address callbackAddress; // callback address for users request contract
|
||||||
|
bytes4 callbackMethodID; // method for users request contract
|
||||||
|
uint256 reqID; // request counter
|
||||||
|
uint256 deadline;
|
||||||
|
bytes data;
|
||||||
|
}
|
||||||
|
|
||||||
|
mapping(uint256 => bytes32) private pendingRequests;
|
||||||
|
mapping(address => bool) private activeNodes;
|
||||||
|
|
||||||
|
event NewOracleRequest(
|
||||||
|
uint8 originChain,
|
||||||
|
string requestType,
|
||||||
|
string requestParams,
|
||||||
|
address callbackAddress,
|
||||||
|
bytes4 callbackMethodID,
|
||||||
|
uint256 reqID,
|
||||||
|
uint256 deadline
|
||||||
|
);
|
||||||
|
|
||||||
|
event CancelOracleRequest(
|
||||||
|
uint256 reqID
|
||||||
|
);
|
||||||
|
|
||||||
|
event SubmittedOracleRequest(
|
||||||
|
string requestParams,
|
||||||
|
address callbackAddress,
|
||||||
|
bytes4 callbackMethodID,
|
||||||
|
uint256 reqID,
|
||||||
|
uint256 deadline,
|
||||||
|
bytes data
|
||||||
|
);
|
||||||
|
|
||||||
|
modifier onlyPendingRequest(uint256 _reqID) {
|
||||||
|
require(pendingRequests[_reqID] != 0, "Invalid requestId");
|
||||||
|
_;
|
||||||
|
}
|
||||||
|
|
||||||
|
modifier onlyActiveNode() {
|
||||||
|
require(activeNodes[msg.sender], "Not an active miner");
|
||||||
|
_;
|
||||||
|
}
|
||||||
|
|
||||||
|
constructor(DioneStakingInterface _dioneStaking) public {
|
||||||
|
dioneStaking = _dioneStaking;
|
||||||
|
}
|
||||||
|
|
||||||
|
function requestOracles(uint8 _originChain, string memory _requestType, string memory _requestParams, address _callbackAddress, bytes4 _callbackMethodID) public returns (uint256) {
|
||||||
|
requestCounter += 1;
|
||||||
|
require(pendingRequests[requestCounter] == 0, "This counter is not unique");
|
||||||
|
uint256 requestDeadline = now.add(MAXIMUM_DELAY);
|
||||||
|
pendingRequests[requestCounter] = keccak256(abi.encodePacked(_requestParams, _callbackAddress, _callbackMethodID, requestCounter, requestDeadline));
|
||||||
|
|
||||||
|
emit NewOracleRequest(_originChain, _requestType, _requestParams, _callbackAddress, _callbackMethodID, requestCounter, requestDeadline);
|
||||||
|
return requestCounter;
|
||||||
|
}
|
||||||
|
|
||||||
|
function cancelOracleRequest(string memory _requestParams, bytes4 _callbackMethodID, uint256 _reqID, uint256 _requestDeadline) public {
|
||||||
|
bytes32 requestHash = keccak256(abi.encodePacked(_requestParams, msg.sender, _callbackMethodID, _reqID, _requestDeadline));
|
||||||
|
require(requestHash == pendingRequests[_reqID], "Request hash do not match it's origin");
|
||||||
|
require(_requestDeadline <= now, "Request didn't reached it's deadline");
|
||||||
|
|
||||||
|
delete pendingRequests[_reqID];
|
||||||
|
emit CancelOracleRequest(_reqID);
|
||||||
|
}
|
||||||
|
|
||||||
|
function submitOracleRequest(string memory _requestParams, address _callbackAddress, bytes4 _callbackMethodID, uint256 _reqID, uint256 _requestDeadline, bytes memory _data) public onlyActiveNode returns (bool) {
|
||||||
|
bytes32 requestHash = keccak256(abi.encodePacked(_requestParams, _callbackAddress, _callbackMethodID, _reqID, _requestDeadline));
|
||||||
|
require(pendingRequests[_reqID] == requestHash, "Params do not match request ID");
|
||||||
|
delete pendingRequests[_reqID];
|
||||||
|
dioneStaking.mine(msg.sender);
|
||||||
|
(bool success, ) = _callbackAddress.call(abi.encodeWithSelector(_callbackMethodID, _reqID, _data));
|
||||||
|
emit SubmittedOracleRequest(_requestParams, _callbackAddress, _callbackMethodID, _reqID, _requestDeadline, _data);
|
||||||
|
return success;
|
||||||
|
}
|
||||||
|
|
||||||
|
function setNodeStatus(address _miner, bool _status) public {
|
||||||
|
activeNodes[_miner] = _status;
|
||||||
|
}
|
||||||
|
|
||||||
|
function isActiveNode(address _miner) public view returns (bool) {
|
||||||
|
return activeNodes[_miner];
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
14
eth-contracts/contracts/interfaces/DioneStakingInterface.sol
Normal file
14
eth-contracts/contracts/interfaces/DioneStakingInterface.sol
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
pragma solidity ^0.6.0;
|
||||||
|
|
||||||
|
interface DioneStakingInterface {
|
||||||
|
function mine(address _minerAddr) external;
|
||||||
|
function mineAndStake(address _minerAddr) external;
|
||||||
|
function stake(uint256 _amount) external;
|
||||||
|
function withdraw(uint256 _amount) external;
|
||||||
|
function totalStake() external view returns (uint256);
|
||||||
|
function minerStake(address _minerAddr) external view returns (uint256);
|
||||||
|
function setMinerReward(uint256 _minerReward) external;
|
||||||
|
function isMiner(address _minerAddr) external view returns (bool);
|
||||||
|
function setMinimumStake(uint256 _minimumStake) external;
|
||||||
|
function setAggregator(address _aggregatorAddr) external;
|
||||||
|
}
|
@ -23,6 +23,7 @@ type EthereumClient struct {
|
|||||||
oracleEmitter *oracleEmitter.OracleEmitterSession
|
oracleEmitter *oracleEmitter.OracleEmitterSession
|
||||||
aggregator *aggregator.AggregatorSession
|
aggregator *aggregator.AggregatorSession
|
||||||
dioneStaking *stakingContract.DioneStakingSession
|
dioneStaking *stakingContract.DioneStakingSession
|
||||||
|
// dioneOracle *dioneOracle.DioneOracleSession
|
||||||
}
|
}
|
||||||
|
|
||||||
type OracleEvent struct {
|
type OracleEvent struct {
|
||||||
@ -71,6 +72,10 @@ func (c *EthereumClient) Initialize(ctx context.Context, url, privateKey, oracle
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
// oracleContract, err := dioneOracle.NewDioneOracle(common.HexToAddress(dioneOracleContract), client)
|
||||||
|
// if err != nil {
|
||||||
|
// return err
|
||||||
|
// }
|
||||||
c.oracleEmitter = &oracleEmitter.OracleEmitterSession{
|
c.oracleEmitter = &oracleEmitter.OracleEmitterSession{
|
||||||
Contract: emitter,
|
Contract: emitter,
|
||||||
CallOpts: bind.CallOpts{
|
CallOpts: bind.CallOpts{
|
||||||
@ -116,6 +121,21 @@ func (c *EthereumClient) Initialize(ctx context.Context, url, privateKey, oracle
|
|||||||
Context: context.Background(),
|
Context: context.Background(),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
// c.dioneOracle = &dioneOracle.DioneOracleSession{
|
||||||
|
// Contract: oracleContract,
|
||||||
|
// CallOpts: bind.CallOpts{
|
||||||
|
// Pending: true,
|
||||||
|
// From: authTransactor.From,
|
||||||
|
// Context: context.Background(),
|
||||||
|
// },
|
||||||
|
// TransactOpts: bind.TransactOpts{
|
||||||
|
// From: authTransactor.From,
|
||||||
|
// Signer: authTransactor.Signer,
|
||||||
|
// GasLimit: 200000, // 0 automatically estimates gas limit
|
||||||
|
// GasPrice: big.NewInt(1860127603), // nil automatically suggests gas price
|
||||||
|
// Context: context.Background(),
|
||||||
|
// },
|
||||||
|
// }
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -136,32 +156,20 @@ func (c *EthereumClient) SubscribeOnOracleEvents(ctx context.Context) (chan *ora
|
|||||||
return resChan, subscription, err
|
return resChan, subscription, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// func (c *EthereumClient) SubscribeOnSumbittedRequests(ctx context.Context) (chan *dioneOracle.DioneOracleSubmittedOracleRequest, event.Subscription, error) {
|
||||||
|
// resChan := make(chan *dioneOracle.DioneOracleSubmittedOracleRequest)
|
||||||
|
// requestsFilter := c.dioneOracle.Contract.DioneOracleFilterer
|
||||||
|
// subscription, err := requestsFilter.WatchSubmittedOracleRequest(&bind.WatchOpts{
|
||||||
|
// Start: nil, //last block
|
||||||
|
// Context: ctx,
|
||||||
|
// }, resChan)
|
||||||
|
// if err != nil {
|
||||||
|
// return nil, nil, err
|
||||||
|
// }
|
||||||
|
// return resChan, subscription, err
|
||||||
|
// }
|
||||||
|
|
||||||
func (c *EthereumClient) SubmitRequestAnswer(reqID *big.Int, data string, callbackAddress common.Address) error {
|
func (c *EthereumClient) SubmitRequestAnswer(reqID *big.Int, data string, callbackAddress common.Address) error {
|
||||||
// privateKey, err := crypto.HexToECDSA(private_key)
|
|
||||||
// if err != nil {
|
|
||||||
// c.Logger.Fatal("Failed to generate private key", err)
|
|
||||||
// }
|
|
||||||
|
|
||||||
// publicKey := privateKey.Public()
|
|
||||||
// publicKeyECDSA, ok := publicKey.(*ecdsa.PublicKey)
|
|
||||||
// if !ok {
|
|
||||||
// c.Logger.Fatal("cannot assert type: publicKey is not of type *ecdsa.PublicKey")
|
|
||||||
// }
|
|
||||||
|
|
||||||
// publicKeyBytes := crypto.FromECDSAPub(publicKeyECDSA)
|
|
||||||
// c.Logger.Info(hexutil.Encode(publicKeyBytes)[4:])
|
|
||||||
|
|
||||||
// fromAddress := crypto.PubkeyToAddress(*publicKeyECDSA)
|
|
||||||
// nonce, err := c.HttpClient.PendingNonceAt(ctx, fromAddress)
|
|
||||||
// if err != nil {
|
|
||||||
// c.Logger.Fatal(err)
|
|
||||||
// }
|
|
||||||
|
|
||||||
// gasPrice, err := c.HttpClient.SuggestGasPrice(ctx)
|
|
||||||
// if err != nil {
|
|
||||||
// c.Logger.Fatal(err)
|
|
||||||
// }
|
|
||||||
|
|
||||||
_, err := c.aggregator.CollectData(reqID, data, callbackAddress)
|
_, err := c.aggregator.CollectData(reqID, data, callbackAddress)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
Loading…
Reference in New Issue
Block a user