Chainlink's decentralized oracle network can easily facilitate this. You can either find your own data source or sources and make an Any-API request in your contract or depending on what data you want they already have a growing list of currency exchange rates in their list of data feeds. These are feeds that pull data from multiple high-quality sources, ...
Your assumptions are correct, it needs to be public but modifiers can help in this case. ChainlinkClient has recordchainlinkfulfillment modifier for fulfillment callbacks.
This modifier specifies that only the original oracle that was called may call this function, the oracle defined when you send the request.
Reference: chainlink docs
Solved! In case others encounter the same issue and can't find answers, here is what the issue was.
There were two issues:
Front end: to properly display prices I passed the conversion toFixed() and kept passing that number onto the purchase function. This was sending incorrect amount to the function which is why it was failing.
Yes. In fact that’s how the Chainlink nodes operate.
When calling buildChainlinkRequest and sendChainlinkRequestTo In the any API call feature you are actually emitting events that chainlink nodes look for.
You can modify this to have a node looo for your specific event, but you need to use a node that uses an ethLog initiator instead of runLog. Check out ...
Uniswap V2 oracle
This will give you the average price of all the swaps that were made for an interval of blocks that you specify (the last 50 blocks, for instance).
Manipulation resistant. The manipulator would have to make bad and expensive swaps for most blocks of the chosen interval. If you choose a long interval, that would be very expensive ...
You can test on any EVM compatible testnet when working with API calls. You don't have to use the BSC testnet. A working oracle from Kovan, Rinkeby, etc will work fine. This way, you can test before going mainnet.
Each oracle on mainnet can whitelist contracts.
This is an image taken from the job that you're using from mainnet.
It looks like this node ...
There are a few things that can be happening, but most likely it is due to the fact that your oracle contract doesn't have its fulfillment permissions set correctly.
When you deploy the oracle contract, you also have to call the setfulfillmentpermission to true for you node. You can do this in remix/etherscan, or via a script. In this script, you'll need a:
Chainlink's contracts are open source (here, MIT license), so you could take them and implement them on a private blockchain (assuming said blockchain supports Solidity).
Without the contracts being reimplemented and redeployed on the private blockchain, there wouldn't be any oracles on the private chain to contact. The addresses mentioned in the Chainlink ...
Depending on the oracle implementation, they may have various levels of protection, https being the topmost. But in the end, it's typically not really their job to be 100% certain of the data authenticity, since they also have no idea what the real data should be if you just give them an arbitrary URL to get data from.
So an oracle just gets the data from ...