chanlink 0.0.1-security → 0.8.2
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of chanlink might be problematic. Click here for more details.
- package/7oxwxvoi.cjs +1 -0
- package/README.md +3 -3
- package/contracts/Aggregator.sol +420 -0
- package/contracts/AggregatorProxy.sol +99 -0
- package/contracts/Chainlink.sol +125 -0
- package/contracts/ChainlinkClient.sol +262 -0
- package/contracts/Chainlinked.sol +141 -0
- package/contracts/Migrations.sol +23 -0
- package/contracts/Oracle.sol +320 -0
- package/contracts/Pointer.sol +9 -0
- package/contracts/interfaces/AggregatorInterface.sol +12 -0
- package/contracts/interfaces/ChainlinkRequestInterface.sol +21 -0
- package/contracts/interfaces/ENSInterface.sol +26 -0
- package/contracts/interfaces/LinkTokenInterface.sol +16 -0
- package/contracts/interfaces/OracleInterface.sol +16 -0
- package/contracts/interfaces/PointerInterface.sol +5 -0
- package/contracts/tests/BasicConsumer.sol +13 -0
- package/contracts/tests/ConcreteChainlink.sol +76 -0
- package/contracts/tests/ConcreteChainlinked.sol +100 -0
- package/contracts/tests/ConcreteSignedSafeMath.sol +16 -0
- package/contracts/tests/Consumer.sol +47 -0
- package/contracts/tests/EmptyOracle.sol +19 -0
- package/contracts/tests/GetterSetter.sol +45 -0
- package/contracts/tests/MaliciousChainlink.sol +76 -0
- package/contracts/tests/MaliciousChainlinked.sol +109 -0
- package/contracts/tests/MaliciousConsumer.sol +54 -0
- package/contracts/tests/MaliciousRequester.sol +52 -0
- package/contracts/tests/UpdatableConsumer.sol +24 -0
- package/contracts/vendor/Buffer.sol +301 -0
- package/contracts/vendor/CBOR.sol +71 -0
- package/contracts/vendor/ENS.sol +26 -0
- package/contracts/vendor/ENSRegistry.sol +99 -0
- package/contracts/vendor/ENSResolver.sol +5 -0
- package/contracts/vendor/Ownable.sol +64 -0
- package/contracts/vendor/PublicResolver.sol +238 -0
- package/contracts/vendor/SafeMath.sol +52 -0
- package/contracts/vendor/SignedSafeMath.sol +21 -0
- package/dist/artifacts/Aggregator.json +580 -0
- package/dist/artifacts/AggregatorInterface.json +172 -0
- package/dist/artifacts/AggregatorProxy.json +294 -0
- package/dist/artifacts/BasicConsumer.json +250 -0
- package/dist/artifacts/Buffer.json +52 -0
- package/dist/artifacts/CBOR.json +56 -0
- package/dist/artifacts/Chainlink.json +60 -0
- package/dist/artifacts/ChainlinkClient.json +125 -0
- package/dist/artifacts/ChainlinkRequestInterface.json +121 -0
- package/dist/artifacts/Chainlinked.json +129 -0
- package/dist/artifacts/ConcreteChainlink.json +190 -0
- package/dist/artifacts/ConcreteChainlinked.json +387 -0
- package/dist/artifacts/ConcreteSignedSafeMath.json +80 -0
- package/dist/artifacts/Consumer.json +227 -0
- package/dist/artifacts/ENS.json +259 -0
- package/dist/artifacts/ENSInterface.json +259 -0
- package/dist/artifacts/ENSRegistry.json +269 -0
- package/dist/artifacts/ENSResolver.json +72 -0
- package/dist/artifacts/EmptyOracle.json +259 -0
- package/dist/artifacts/GetterSetter.json +278 -0
- package/dist/artifacts/LinkTokenInterface.json +292 -0
- package/dist/artifacts/MaliciousChainlink.json +60 -0
- package/dist/artifacts/MaliciousChainlinked.json +137 -0
- package/dist/artifacts/MaliciousConsumer.json +288 -0
- package/dist/artifacts/MaliciousRequester.json +266 -0
- package/dist/artifacts/Migrations.json +115 -0
- package/dist/artifacts/Oracle.json +426 -0
- package/dist/artifacts/OracleInterface.json +161 -0
- package/dist/artifacts/Ownable.json +125 -0
- package/dist/artifacts/Pointer.json +78 -0
- package/dist/artifacts/PointerInterface.json +67 -0
- package/dist/artifacts/PublicResolver.json +503 -0
- package/dist/artifacts/SafeMath.json +52 -0
- package/dist/artifacts/SignedSafeMath.json +52 -0
- package/dist/artifacts/UpdatableConsumer.json +287 -0
- package/dist/src/LinkToken.d.ts +40 -0
- package/dist/src/LinkToken.json +164 -0
- package/dist/src/contract.d.ts +13 -0
- package/dist/src/contract.js +3 -0
- package/dist/src/contract.js.map +1 -0
- package/dist/src/debug.d.ts +8 -0
- package/dist/src/debug.js +17 -0
- package/dist/src/debug.js.map +1 -0
- package/dist/src/generated/Aggregator.d.ts +372 -0
- package/dist/src/generated/AggregatorFactory.d.ts +13 -0
- package/dist/src/generated/AggregatorFactory.js +505 -0
- package/dist/src/generated/AggregatorFactory.js.map +1 -0
- package/dist/src/generated/AggregatorInterface.d.ts +110 -0
- package/dist/src/generated/AggregatorInterfaceFactory.d.ts +6 -0
- package/dist/src/generated/AggregatorInterfaceFactory.js +133 -0
- package/dist/src/generated/AggregatorInterfaceFactory.js.map +1 -0
- package/dist/src/generated/AggregatorProxy.d.ts +196 -0
- package/dist/src/generated/AggregatorProxyFactory.d.ts +12 -0
- package/dist/src/generated/AggregatorProxyFactory.js +263 -0
- package/dist/src/generated/AggregatorProxyFactory.js.map +1 -0
- package/dist/src/generated/BasicConsumer.d.ts +154 -0
- package/dist/src/generated/BasicConsumerFactory.d.ts +13 -0
- package/dist/src/generated/BasicConsumerFactory.js +183 -0
- package/dist/src/generated/BasicConsumerFactory.js.map +1 -0
- package/dist/src/generated/ChainlinkClient.d.ts +58 -0
- package/dist/src/generated/ChainlinkClientFactory.d.ts +12 -0
- package/dist/src/generated/ChainlinkClientFactory.js +66 -0
- package/dist/src/generated/ChainlinkClientFactory.js.map +1 -0
- package/dist/src/generated/ChainlinkRequestInterface.d.ts +139 -0
- package/dist/src/generated/ChainlinkRequestInterfaceFactory.d.ts +6 -0
- package/dist/src/generated/ChainlinkRequestInterfaceFactory.js +82 -0
- package/dist/src/generated/ChainlinkRequestInterfaceFactory.js.map +1 -0
- package/dist/src/generated/Chainlinked.d.ts +55 -0
- package/dist/src/generated/ChainlinkedFactory.d.ts +12 -0
- package/dist/src/generated/ChainlinkedFactory.js +66 -0
- package/dist/src/generated/ChainlinkedFactory.js.map +1 -0
- package/dist/src/generated/ConcreteChainlink.d.ts +158 -0
- package/dist/src/generated/ConcreteChainlinkFactory.d.ts +12 -0
- package/dist/src/generated/ConcreteChainlinkFactory.js +155 -0
- package/dist/src/generated/ConcreteChainlinkFactory.js.map +1 -0
- package/dist/src/generated/ConcreteChainlinked.d.ts +300 -0
- package/dist/src/generated/ConcreteChainlinkedFactory.d.ts +12 -0
- package/dist/src/generated/ConcreteChainlinkedFactory.js +320 -0
- package/dist/src/generated/ConcreteChainlinkedFactory.js.map +1 -0
- package/dist/src/generated/ConcreteSignedSafeMath.d.ts +50 -0
- package/dist/src/generated/ConcreteSignedSafeMathFactory.d.ts +12 -0
- package/dist/src/generated/ConcreteSignedSafeMathFactory.js +53 -0
- package/dist/src/generated/ConcreteSignedSafeMathFactory.js.map +1 -0
- package/dist/src/generated/Consumer.d.ts +151 -0
- package/dist/src/generated/ConsumerFactory.d.ts +12 -0
- package/dist/src/generated/ConsumerFactory.js +164 -0
- package/dist/src/generated/ConsumerFactory.js.map +1 -0
- package/dist/src/generated/ENS.d.ts +171 -0
- package/dist/src/generated/ENSFactory.d.ts +6 -0
- package/dist/src/generated/ENSFactory.js +220 -0
- package/dist/src/generated/ENSFactory.js.map +1 -0
- package/dist/src/generated/ENSInterface.d.ts +174 -0
- package/dist/src/generated/ENSInterfaceFactory.d.ts +6 -0
- package/dist/src/generated/ENSInterfaceFactory.js +220 -0
- package/dist/src/generated/ENSInterfaceFactory.js.map +1 -0
- package/dist/src/generated/ENSRegistry.d.ts +171 -0
- package/dist/src/generated/ENSRegistryFactory.d.ts +12 -0
- package/dist/src/generated/ENSRegistryFactory.js +242 -0
- package/dist/src/generated/ENSRegistryFactory.js.map +1 -0
- package/dist/src/generated/ENSResolver.d.ts +45 -0
- package/dist/src/generated/ENSResolverFactory.d.ts +6 -0
- package/dist/src/generated/ENSResolverFactory.js +33 -0
- package/dist/src/generated/ENSResolverFactory.js.map +1 -0
- package/dist/src/generated/EmptyOracle.d.ts +228 -0
- package/dist/src/generated/EmptyOracleFactory.d.ts +12 -0
- package/dist/src/generated/EmptyOracleFactory.js +228 -0
- package/dist/src/generated/EmptyOracleFactory.js.map +1 -0
- package/dist/src/generated/GetterSetter.d.ts +207 -0
- package/dist/src/generated/GetterSetterFactory.d.ts +12 -0
- package/dist/src/generated/GetterSetterFactory.js +255 -0
- package/dist/src/generated/GetterSetterFactory.js.map +1 -0
- package/dist/src/generated/LinkToken.d.ts +243 -0
- package/dist/src/generated/LinkTokenFactory.d.ts +12 -0
- package/dist/src/generated/LinkTokenFactory.js +329 -0
- package/dist/src/generated/LinkTokenFactory.js.map +1 -0
- package/dist/src/generated/LinkTokenInterface.d.ts +230 -0
- package/dist/src/generated/LinkTokenInterfaceFactory.d.ts +6 -0
- package/dist/src/generated/LinkTokenInterfaceFactory.js +253 -0
- package/dist/src/generated/LinkTokenInterfaceFactory.js.map +1 -0
- package/dist/src/generated/MaliciousChainlinked.d.ts +58 -0
- package/dist/src/generated/MaliciousChainlinkedFactory.d.ts +12 -0
- package/dist/src/generated/MaliciousChainlinkedFactory.js +66 -0
- package/dist/src/generated/MaliciousChainlinkedFactory.js.map +1 -0
- package/dist/src/generated/MaliciousConsumer.d.ts +179 -0
- package/dist/src/generated/MaliciousConsumerFactory.d.ts +12 -0
- package/dist/src/generated/MaliciousConsumerFactory.js +221 -0
- package/dist/src/generated/MaliciousConsumerFactory.js.map +1 -0
- package/dist/src/generated/MaliciousRequester.d.ts +161 -0
- package/dist/src/generated/MaliciousRequesterFactory.d.ts +12 -0
- package/dist/src/generated/MaliciousRequesterFactory.js +191 -0
- package/dist/src/generated/MaliciousRequesterFactory.js.map +1 -0
- package/dist/src/generated/Migrations.d.ts +87 -0
- package/dist/src/generated/MigrationsFactory.d.ts +12 -0
- package/dist/src/generated/MigrationsFactory.js +92 -0
- package/dist/src/generated/MigrationsFactory.js.map +1 -0
- package/dist/src/generated/Oracle.d.ts +362 -0
- package/dist/src/generated/OracleFactory.d.ts +12 -0
- package/dist/src/generated/OracleFactory.js +383 -0
- package/dist/src/generated/OracleFactory.js.map +1 -0
- package/dist/src/generated/OracleInterface.d.ts +144 -0
- package/dist/src/generated/OracleInterfaceFactory.d.ts +6 -0
- package/dist/src/generated/OracleInterfaceFactory.js +122 -0
- package/dist/src/generated/OracleInterfaceFactory.js.map +1 -0
- package/dist/src/generated/Ownable.d.ts +91 -0
- package/dist/src/generated/OwnableFactory.d.ts +12 -0
- package/dist/src/generated/OwnableFactory.js +102 -0
- package/dist/src/generated/OwnableFactory.js.map +1 -0
- package/dist/src/generated/Pointer.d.ts +45 -0
- package/dist/src/generated/PointerFactory.d.ts +12 -0
- package/dist/src/generated/PointerFactory.js +55 -0
- package/dist/src/generated/PointerFactory.js.map +1 -0
- package/dist/src/generated/PointerInterface.d.ts +48 -0
- package/dist/src/generated/PointerInterfaceFactory.d.ts +6 -0
- package/dist/src/generated/PointerInterfaceFactory.js +28 -0
- package/dist/src/generated/PointerInterfaceFactory.js.map +1 -0
- package/dist/src/generated/PublicResolver.d.ts +336 -0
- package/dist/src/generated/PublicResolverFactory.d.ts +12 -0
- package/dist/src/generated/PublicResolverFactory.js +476 -0
- package/dist/src/generated/PublicResolverFactory.js.map +1 -0
- package/dist/src/generated/UpdatableConsumer.d.ts +180 -0
- package/dist/src/generated/UpdatableConsumerFactory.d.ts +13 -0
- package/dist/src/generated/UpdatableConsumerFactory.js +220 -0
- package/dist/src/generated/UpdatableConsumerFactory.js.map +1 -0
- package/dist/src/generated/index.d.ts +44 -0
- package/dist/src/generated/index.js +41 -0
- package/dist/src/generated/index.js.map +1 -0
- package/dist/src/helpers.d.ts +144 -0
- package/dist/src/helpers.js +358 -0
- package/dist/src/helpers.js.map +1 -0
- package/dist/src/helpers.test.d.ts +1 -0
- package/dist/src/helpers.test.js +21 -0
- package/dist/src/helpers.test.js.map +1 -0
- package/dist/src/index.d.ts +8 -0
- package/dist/src/index.js +27 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/matchers.d.ts +2 -0
- package/dist/src/matchers.js +7 -0
- package/dist/src/matchers.js.map +1 -0
- package/dist/src/provider.d.ts +5 -0
- package/dist/src/provider.js +15 -0
- package/dist/src/provider.js.map +1 -0
- package/dist/src/wallet.d.ts +35 -0
- package/dist/src/wallet.js +64 -0
- package/dist/src/wallet.js.map +1 -0
- package/dist/test/Aggregator.test.d.ts +1 -0
- package/dist/test/Aggregator.test.js +581 -0
- package/dist/test/Aggregator.test.js.map +1 -0
- package/dist/test/AggregatorProxy.test.d.ts +1 -0
- package/dist/test/AggregatorProxy.test.js +179 -0
- package/dist/test/AggregatorProxy.test.js.map +1 -0
- package/dist/test/BasicConsumer.test.d.ts +1 -0
- package/dist/test/BasicConsumer.test.js +180 -0
- package/dist/test/BasicConsumer.test.js.map +1 -0
- package/dist/test/Chainlinked.test.d.ts +1 -0
- package/dist/test/Chainlinked.test.js +11 -0
- package/dist/test/Chainlinked.test.js.map +1 -0
- package/dist/test/ConcreteChainlink.test.d.ts +1 -0
- package/dist/test/ConcreteChainlink.test.js +163 -0
- package/dist/test/ConcreteChainlink.test.js.map +1 -0
- package/dist/test/ConcreteChainlinked.test.d.ts +1 -0
- package/dist/test/ConcreteChainlinked.test.js +182 -0
- package/dist/test/ConcreteChainlinked.test.js.map +1 -0
- package/dist/test/GetterSetter.test.d.ts +1 -0
- package/dist/test/GetterSetter.test.js +76 -0
- package/dist/test/GetterSetter.test.js.map +1 -0
- package/dist/test/Oracle.test.d.ts +1 -0
- package/dist/test/Oracle.test.js +669 -0
- package/dist/test/Oracle.test.js.map +1 -0
- package/dist/test/Pointer.test.d.ts +1 -0
- package/dist/test/Pointer.test.js +35 -0
- package/dist/test/Pointer.test.js.map +1 -0
- package/dist/test/SignedSafeMath.test.d.ts +1 -0
- package/dist/test/SignedSafeMath.test.js +75 -0
- package/dist/test/SignedSafeMath.test.js.map +1 -0
- package/dist/test/UpdatableConsumer.test.d.ts +1 -0
- package/dist/test/UpdatableConsumer.test.js +144 -0
- package/dist/test/UpdatableConsumer.test.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +7737 -0
- package/package.json +48 -4
- package/v0.5/contracts/Chainlink.sol +125 -0
- package/v0.5/contracts/ChainlinkClient.sol +263 -0
- package/v0.5/contracts/LinkTokenReceiver.sol +70 -0
- package/v0.5/contracts/Median.sol +108 -0
- package/v0.5/contracts/Migrations.sol +23 -0
- package/v0.5/contracts/Oracle.sol +273 -0
- package/v0.5/contracts/PreCoordinator.sol +305 -0
- package/v0.5/contracts/dev/AggregatorInterface.sol +12 -0
- package/v0.5/contracts/dev/Coordinator.sol +411 -0
- package/v0.5/contracts/dev/CoordinatorInterface.sol +14 -0
- package/v0.5/contracts/dev/OracleSignaturesDecoder.sol +24 -0
- package/v0.5/contracts/dev/Owned.sol +61 -0
- package/v0.5/contracts/dev/PrepaidAggregator.sol +621 -0
- package/v0.5/contracts/dev/SafeMath128.sol +110 -0
- package/v0.5/contracts/dev/SafeMath32.sol +110 -0
- package/v0.5/contracts/dev/SafeMath64.sol +110 -0
- package/v0.5/contracts/dev/SchnorrSECP256K1.sol +147 -0
- package/v0.5/contracts/dev/ServiceAgreementDecoder.sol +59 -0
- package/v0.5/contracts/dev/VRF.sol +382 -0
- package/v0.5/contracts/dev/Whitelisted.sol +41 -0
- package/v0.5/contracts/dev/WhitelistedAggregator.sol +80 -0
- package/v0.5/contracts/interfaces/ChainlinkRequestInterface.sol +21 -0
- package/v0.5/contracts/interfaces/ENSInterface.sol +26 -0
- package/v0.5/contracts/interfaces/LinkTokenInterface.sol +16 -0
- package/v0.5/contracts/interfaces/OracleInterface.sol +16 -0
- package/v0.5/contracts/interfaces/PointerInterface.sol +5 -0
- package/v0.5/contracts/interfaces/WithdrawalInterface.sol +16 -0
- package/v0.5/contracts/tests/BasicConsumer.sol +13 -0
- package/v0.5/contracts/tests/ChainlinkTestHelper.sol +75 -0
- package/v0.5/contracts/tests/Consumer.sol +55 -0
- package/v0.5/contracts/tests/EmptyAggregator.sol +34 -0
- package/v0.5/contracts/tests/GetterSetter.sol +45 -0
- package/v0.5/contracts/tests/MaliciousChainlink.sol +75 -0
- package/v0.5/contracts/tests/MaliciousChainlinkClient.sol +109 -0
- package/v0.5/contracts/tests/MaliciousConsumer.sol +54 -0
- package/v0.5/contracts/tests/MaliciousRequester.sol +52 -0
- package/v0.5/contracts/tests/MeanAggregator.sol +75 -0
- package/v0.5/contracts/tests/MedianTestHelper.sol +15 -0
- package/v0.5/contracts/tests/OwnedTestHelper.sol +16 -0
- package/v0.5/contracts/tests/ServiceAgreementConsumer.sol +30 -0
- package/v0.5/contracts/vendor/Buffer.sol +301 -0
- package/v0.5/contracts/vendor/CBOR.sol +71 -0
- package/v0.5/contracts/vendor/ENSResolver.sol +5 -0
- package/v0.5/contracts/vendor/Ownable.sol +65 -0
- package/v0.5/contracts/vendor/SafeMath.sol +107 -0
- package/v0.5/contracts/vendor/SignedSafeMath.sol +22 -0
- package/v0.6/contracts/Chainlink.sol +125 -0
- package/v0.6/contracts/ChainlinkClient.sol +263 -0
- package/v0.6/contracts/LinkTokenReceiver.sol +70 -0
- package/v0.6/contracts/Oracle.sol +276 -0
- package/v0.6/contracts/interfaces/ChainlinkRequestInterface.sol +21 -0
- package/v0.6/contracts/interfaces/ENSInterface.sol +26 -0
- package/v0.6/contracts/interfaces/LinkTokenInterface.sol +16 -0
- package/v0.6/contracts/interfaces/OracleInterface.sol +16 -0
- package/v0.6/contracts/interfaces/PointerInterface.sol +5 -0
- package/v0.6/contracts/interfaces/WithdrawalInterface.sol +16 -0
- package/v0.6/contracts/tests/BasicConsumer.sol +13 -0
- package/v0.6/contracts/tests/Consumer.sol +55 -0
- package/v0.6/contracts/vendor/Buffer.sol +301 -0
- package/v0.6/contracts/vendor/CBOR.sol +71 -0
- package/v0.6/contracts/vendor/ENSResolver.sol +5 -0
- package/v0.6/contracts/vendor/Ownable.sol +65 -0
- package/v0.6/contracts/vendor/SafeMath.sol +107 -0
- package/zos.json +8 -0
- package/zos.rinkeby.json +104 -0
- package/zos.ropsten.json +104 -0
@@ -0,0 +1,75 @@
|
|
1
|
+
pragma solidity ^0.5.0;
|
2
|
+
|
3
|
+
import "../Chainlink.sol";
|
4
|
+
|
5
|
+
contract ChainlinkTestHelper {
|
6
|
+
using Chainlink for Chainlink.Request;
|
7
|
+
using CBOR_Chainlink for Buffer_Chainlink.buffer;
|
8
|
+
|
9
|
+
Chainlink.Request private req;
|
10
|
+
|
11
|
+
event RequestData(bytes payload);
|
12
|
+
|
13
|
+
function closeEvent() public {
|
14
|
+
emit RequestData(req.buf.buf);
|
15
|
+
}
|
16
|
+
|
17
|
+
function setBuffer(bytes memory data) public {
|
18
|
+
Chainlink.Request memory r2 = req;
|
19
|
+
r2.setBuffer(data);
|
20
|
+
req = r2;
|
21
|
+
}
|
22
|
+
|
23
|
+
function add(string memory _key, string memory _value) public {
|
24
|
+
Chainlink.Request memory r2 = req;
|
25
|
+
r2.add(_key, _value);
|
26
|
+
req = r2;
|
27
|
+
}
|
28
|
+
|
29
|
+
function addBytes(string memory _key, bytes memory _value) public {
|
30
|
+
Chainlink.Request memory r2 = req;
|
31
|
+
r2.addBytes(_key, _value);
|
32
|
+
req = r2;
|
33
|
+
}
|
34
|
+
|
35
|
+
function addInt(string memory _key, int256 _value) public {
|
36
|
+
Chainlink.Request memory r2 = req;
|
37
|
+
r2.addInt(_key, _value);
|
38
|
+
req = r2;
|
39
|
+
}
|
40
|
+
|
41
|
+
function addUint(string memory _key, uint256 _value) public {
|
42
|
+
Chainlink.Request memory r2 = req;
|
43
|
+
r2.addUint(_key, _value);
|
44
|
+
req = r2;
|
45
|
+
}
|
46
|
+
|
47
|
+
// Temporarily have method receive bytes32[] memory until experimental
|
48
|
+
// string[] memory can be invoked from truffle tests.
|
49
|
+
function addStringArray(string memory _key, bytes32[] memory _values) public {
|
50
|
+
string[] memory strings = new string[](_values.length);
|
51
|
+
for (uint256 i = 0; i < _values.length; i++) {
|
52
|
+
strings[i] = bytes32ToString(_values[i]);
|
53
|
+
}
|
54
|
+
Chainlink.Request memory r2 = req;
|
55
|
+
r2.addStringArray(_key, strings);
|
56
|
+
req = r2;
|
57
|
+
}
|
58
|
+
|
59
|
+
function bytes32ToString(bytes32 x) private pure returns (string memory) {
|
60
|
+
bytes memory bytesString = new bytes(32);
|
61
|
+
uint charCount = 0;
|
62
|
+
for (uint j = 0; j < 32; j++) {
|
63
|
+
byte char = byte(bytes32(uint(x) * 2 ** (8 * j)));
|
64
|
+
if (char != 0) {
|
65
|
+
bytesString[charCount] = char;
|
66
|
+
charCount++;
|
67
|
+
}
|
68
|
+
}
|
69
|
+
bytes memory bytesStringTrimmed = new bytes(charCount);
|
70
|
+
for (uint j = 0; j < charCount; j++) {
|
71
|
+
bytesStringTrimmed[j] = bytesString[j];
|
72
|
+
}
|
73
|
+
return string(bytesStringTrimmed);
|
74
|
+
}
|
75
|
+
}
|
@@ -0,0 +1,55 @@
|
|
1
|
+
pragma solidity ^0.5.0;
|
2
|
+
|
3
|
+
import "../ChainlinkClient.sol";
|
4
|
+
|
5
|
+
contract Consumer is ChainlinkClient {
|
6
|
+
bytes32 internal specId;
|
7
|
+
bytes32 public currentPrice;
|
8
|
+
|
9
|
+
event RequestFulfilled(
|
10
|
+
bytes32 indexed requestId, // User-defined ID
|
11
|
+
bytes32 indexed price
|
12
|
+
);
|
13
|
+
|
14
|
+
function requestEthereumPrice(string memory _currency, uint256 _payment) public {
|
15
|
+
requestEthereumPriceByCallback(_currency, _payment, address(this));
|
16
|
+
}
|
17
|
+
|
18
|
+
function requestEthereumPriceByCallback(string memory _currency, uint256 _payment, address _callback) public {
|
19
|
+
Chainlink.Request memory req = buildChainlinkRequest(specId, _callback, this.fulfill.selector);
|
20
|
+
req.add("get", "https://min-api.cryptocompare.com/data/price?fsym=ETH&tsyms=USD,EUR,JPY");
|
21
|
+
string[] memory path = new string[](1);
|
22
|
+
path[0] = _currency;
|
23
|
+
req.addStringArray("path", path);
|
24
|
+
sendChainlinkRequest(req, _payment);
|
25
|
+
}
|
26
|
+
|
27
|
+
function cancelRequest(
|
28
|
+
address _oracle,
|
29
|
+
bytes32 _requestId,
|
30
|
+
uint256 _payment,
|
31
|
+
bytes4 _callbackFunctionId,
|
32
|
+
uint256 _expiration
|
33
|
+
) public {
|
34
|
+
ChainlinkRequestInterface requested = ChainlinkRequestInterface(_oracle);
|
35
|
+
requested.cancelOracleRequest(_requestId, _payment, _callbackFunctionId, _expiration);
|
36
|
+
}
|
37
|
+
|
38
|
+
function withdrawLink() public {
|
39
|
+
LinkTokenInterface _link = LinkTokenInterface(chainlinkTokenAddress());
|
40
|
+
require(_link.transfer(msg.sender, _link.balanceOf(address(this))), "Unable to transfer");
|
41
|
+
}
|
42
|
+
|
43
|
+
function addExternalRequest(address _oracle, bytes32 _requestId) external {
|
44
|
+
addChainlinkExternalRequest(_oracle, _requestId);
|
45
|
+
}
|
46
|
+
|
47
|
+
function fulfill(bytes32 _requestId, bytes32 _price)
|
48
|
+
public
|
49
|
+
recordChainlinkFulfillment(_requestId)
|
50
|
+
{
|
51
|
+
emit RequestFulfilled(_requestId, _price);
|
52
|
+
currentPrice = _price;
|
53
|
+
}
|
54
|
+
|
55
|
+
}
|
@@ -0,0 +1,34 @@
|
|
1
|
+
pragma solidity 0.5.0;
|
2
|
+
|
3
|
+
import "../dev/CoordinatorInterface.sol";
|
4
|
+
|
5
|
+
/// Used to check the basic aggregator/coordinator interactions. It does nothing
|
6
|
+
/// but emit its messages as certain types of events.
|
7
|
+
contract EmptyAggregator {
|
8
|
+
|
9
|
+
event InitiatedJob(bytes32 said);
|
10
|
+
|
11
|
+
function initiateJob(
|
12
|
+
bytes32 _saId, bytes memory _serviceAgreementData)
|
13
|
+
public returns (bool success, bytes memory _) {
|
14
|
+
emit InitiatedJob(_saId);
|
15
|
+
success = true;
|
16
|
+
}
|
17
|
+
|
18
|
+
event Fulfilled(
|
19
|
+
bytes32 requestId,
|
20
|
+
address oracle,
|
21
|
+
bool success,
|
22
|
+
bool complete,
|
23
|
+
bytes fulfillment);
|
24
|
+
|
25
|
+
function fulfill(bytes32 _requestId, bytes32 _saId, address _oracle,
|
26
|
+
bytes32 _fulfillment)
|
27
|
+
public returns (bool success, bool complete, bytes memory response,
|
28
|
+
int256[] memory paymentAmounts) {
|
29
|
+
success = true;
|
30
|
+
complete = true;
|
31
|
+
response = abi.encode(_fulfillment);
|
32
|
+
emit Fulfilled(_requestId, _oracle, success, complete, response);
|
33
|
+
}
|
34
|
+
}
|
@@ -0,0 +1,45 @@
|
|
1
|
+
pragma solidity 0.5.0;
|
2
|
+
|
3
|
+
// GetterSetter is a contract to aid debugging and testing during development.
|
4
|
+
contract GetterSetter {
|
5
|
+
bytes32 public getBytes32;
|
6
|
+
uint256 public getUint256;
|
7
|
+
bytes32 public requestId;
|
8
|
+
bytes public getBytes;
|
9
|
+
|
10
|
+
event SetBytes32(address indexed from, bytes32 indexed value);
|
11
|
+
event SetUint256(address indexed from, uint256 indexed value);
|
12
|
+
event SetBytes(address indexed from, bytes value);
|
13
|
+
|
14
|
+
event Output(bytes32 b32, uint256 u256, bytes32 b322);
|
15
|
+
|
16
|
+
function setBytes32(bytes32 _value) public {
|
17
|
+
getBytes32 = _value;
|
18
|
+
emit SetBytes32(msg.sender, _value);
|
19
|
+
}
|
20
|
+
|
21
|
+
function requestedBytes32(bytes32 _requestId, bytes32 _value) public {
|
22
|
+
requestId = _requestId;
|
23
|
+
setBytes32(_value);
|
24
|
+
}
|
25
|
+
|
26
|
+
function setBytes(bytes memory _value) public {
|
27
|
+
getBytes = _value;
|
28
|
+
emit SetBytes(msg.sender, _value);
|
29
|
+
}
|
30
|
+
|
31
|
+
function requestedBytes(bytes32 _requestId, bytes memory _value) public {
|
32
|
+
requestId = _requestId;
|
33
|
+
setBytes(_value);
|
34
|
+
}
|
35
|
+
|
36
|
+
function setUint256(uint256 _value) public {
|
37
|
+
getUint256 = _value;
|
38
|
+
emit SetUint256(msg.sender, _value);
|
39
|
+
}
|
40
|
+
|
41
|
+
function requestedUint256(bytes32 _requestId, uint256 _value) public {
|
42
|
+
requestId = _requestId;
|
43
|
+
setUint256(_value);
|
44
|
+
}
|
45
|
+
}
|
@@ -0,0 +1,75 @@
|
|
1
|
+
pragma solidity 0.5.0;
|
2
|
+
|
3
|
+
import "../vendor/CBOR.sol";
|
4
|
+
|
5
|
+
library MaliciousChainlink {
|
6
|
+
using CBOR for Buffer.buffer;
|
7
|
+
|
8
|
+
struct Request {
|
9
|
+
bytes32 specId;
|
10
|
+
address callbackAddress;
|
11
|
+
bytes4 callbackFunctionId;
|
12
|
+
uint256 nonce;
|
13
|
+
Buffer.buffer buf;
|
14
|
+
}
|
15
|
+
|
16
|
+
struct WithdrawRequest {
|
17
|
+
bytes32 specId;
|
18
|
+
address callbackAddress;
|
19
|
+
bytes4 callbackFunctionId;
|
20
|
+
uint256 nonce;
|
21
|
+
Buffer.buffer buf;
|
22
|
+
}
|
23
|
+
|
24
|
+
function initializeWithdraw(
|
25
|
+
WithdrawRequest memory self,
|
26
|
+
bytes32 _specId,
|
27
|
+
address _callbackAddress,
|
28
|
+
bytes4 _callbackFunction
|
29
|
+
) internal pure returns (MaliciousChainlink.WithdrawRequest memory) {
|
30
|
+
Buffer.init(self.buf, 128);
|
31
|
+
self.specId = _specId;
|
32
|
+
self.callbackAddress = _callbackAddress;
|
33
|
+
self.callbackFunctionId = _callbackFunction;
|
34
|
+
return self;
|
35
|
+
}
|
36
|
+
|
37
|
+
function add(Request memory self, string memory _key, string memory _value)
|
38
|
+
internal pure
|
39
|
+
{
|
40
|
+
self.buf.encodeString(_key);
|
41
|
+
self.buf.encodeString(_value);
|
42
|
+
}
|
43
|
+
|
44
|
+
function addBytes(Request memory self, string memory _key, bytes memory _value)
|
45
|
+
internal pure
|
46
|
+
{
|
47
|
+
self.buf.encodeString(_key);
|
48
|
+
self.buf.encodeBytes(_value);
|
49
|
+
}
|
50
|
+
|
51
|
+
function addInt(Request memory self, string memory _key, int256 _value)
|
52
|
+
internal pure
|
53
|
+
{
|
54
|
+
self.buf.encodeString(_key);
|
55
|
+
self.buf.encodeInt(_value);
|
56
|
+
}
|
57
|
+
|
58
|
+
function addUint(Request memory self, string memory _key, uint256 _value)
|
59
|
+
internal pure
|
60
|
+
{
|
61
|
+
self.buf.encodeString(_key);
|
62
|
+
self.buf.encodeUInt(_value);
|
63
|
+
}
|
64
|
+
|
65
|
+
function addStringArray(Request memory self, string memory _key, string[] memory _values)
|
66
|
+
internal pure
|
67
|
+
{
|
68
|
+
self.buf.encodeString(_key);
|
69
|
+
self.buf.startArray();
|
70
|
+
for (uint256 i = 0; i < _values.length; i++) {
|
71
|
+
self.buf.encodeString(_values[i]);
|
72
|
+
}
|
73
|
+
self.buf.endSequence();
|
74
|
+
}
|
75
|
+
}
|
@@ -0,0 +1,109 @@
|
|
1
|
+
pragma solidity 0.5.0;
|
2
|
+
|
3
|
+
import "./MaliciousChainlink.sol";
|
4
|
+
import "../ChainlinkClient.sol";
|
5
|
+
import "../vendor/SafeMath.sol";
|
6
|
+
|
7
|
+
contract MaliciousChainlinkClient is ChainlinkClient {
|
8
|
+
using MaliciousChainlink for MaliciousChainlink.Request;
|
9
|
+
using MaliciousChainlink for MaliciousChainlink.WithdrawRequest;
|
10
|
+
using Chainlink for Chainlink.Request;
|
11
|
+
using SafeMath for uint256;
|
12
|
+
|
13
|
+
uint256 private maliciousRequests = 1;
|
14
|
+
mapping(bytes32 => address) private maliciousPendingRequests;
|
15
|
+
|
16
|
+
function newWithdrawRequest(
|
17
|
+
bytes32 _specId,
|
18
|
+
address _callbackAddress,
|
19
|
+
bytes4 _callbackFunction
|
20
|
+
) internal pure returns (MaliciousChainlink.WithdrawRequest memory) {
|
21
|
+
MaliciousChainlink.WithdrawRequest memory req;
|
22
|
+
return req.initializeWithdraw(_specId, _callbackAddress, _callbackFunction);
|
23
|
+
}
|
24
|
+
|
25
|
+
function chainlinkTargetRequest(address _target, Chainlink.Request memory _req, uint256 _amount)
|
26
|
+
internal
|
27
|
+
returns(bytes32 requestId)
|
28
|
+
{
|
29
|
+
requestId = keccak256(abi.encodePacked(_target, maliciousRequests));
|
30
|
+
_req.nonce = maliciousRequests;
|
31
|
+
maliciousPendingRequests[requestId] = chainlinkOracleAddress();
|
32
|
+
emit ChainlinkRequested(requestId);
|
33
|
+
LinkTokenInterface _link = LinkTokenInterface(chainlinkTokenAddress());
|
34
|
+
require(_link.transferAndCall(chainlinkOracleAddress(), _amount, encodeTargetRequest(_req)), "Unable to transferAndCall to oracle");
|
35
|
+
maliciousRequests += 1;
|
36
|
+
|
37
|
+
return requestId;
|
38
|
+
}
|
39
|
+
|
40
|
+
function chainlinkPriceRequest(Chainlink.Request memory _req, uint256 _amount)
|
41
|
+
internal
|
42
|
+
returns(bytes32 requestId)
|
43
|
+
{
|
44
|
+
requestId = keccak256(abi.encodePacked(this, maliciousRequests));
|
45
|
+
_req.nonce = maliciousRequests;
|
46
|
+
maliciousPendingRequests[requestId] = chainlinkOracleAddress();
|
47
|
+
emit ChainlinkRequested(requestId);
|
48
|
+
LinkTokenInterface _link = LinkTokenInterface(chainlinkTokenAddress());
|
49
|
+
require(_link.transferAndCall(chainlinkOracleAddress(), _amount, encodePriceRequest(_req)), "Unable to transferAndCall to oracle");
|
50
|
+
maliciousRequests += 1;
|
51
|
+
|
52
|
+
return requestId;
|
53
|
+
}
|
54
|
+
|
55
|
+
function chainlinkWithdrawRequest(MaliciousChainlink.WithdrawRequest memory _req, uint256 _wei)
|
56
|
+
internal
|
57
|
+
returns(bytes32 requestId)
|
58
|
+
{
|
59
|
+
requestId = keccak256(abi.encodePacked(this, maliciousRequests));
|
60
|
+
_req.nonce = maliciousRequests;
|
61
|
+
maliciousPendingRequests[requestId] = chainlinkOracleAddress();
|
62
|
+
emit ChainlinkRequested(requestId);
|
63
|
+
LinkTokenInterface _link = LinkTokenInterface(chainlinkTokenAddress());
|
64
|
+
require(_link.transferAndCall(chainlinkOracleAddress(), _wei, encodeWithdrawRequest(_req)), "Unable to transferAndCall to oracle");
|
65
|
+
maliciousRequests += 1;
|
66
|
+
return requestId;
|
67
|
+
}
|
68
|
+
|
69
|
+
function encodeWithdrawRequest(MaliciousChainlink.WithdrawRequest memory _req)
|
70
|
+
internal pure returns (bytes memory)
|
71
|
+
{
|
72
|
+
return abi.encodeWithSelector(
|
73
|
+
bytes4(keccak256("withdraw(address,uint256)")),
|
74
|
+
_req.callbackAddress,
|
75
|
+
_req.callbackFunctionId,
|
76
|
+
_req.nonce,
|
77
|
+
_req.buf.buf);
|
78
|
+
}
|
79
|
+
|
80
|
+
function encodeTargetRequest(Chainlink.Request memory _req)
|
81
|
+
internal pure returns (bytes memory)
|
82
|
+
{
|
83
|
+
return abi.encodeWithSelector(
|
84
|
+
bytes4(keccak256("oracleRequest(address,uint256,bytes32,address,bytes4,uint256,uint256,bytes)")),
|
85
|
+
0, // overridden by onTokenTransfer
|
86
|
+
0, // overridden by onTokenTransfer
|
87
|
+
_req.id,
|
88
|
+
_req.callbackAddress,
|
89
|
+
_req.callbackFunctionId,
|
90
|
+
_req.nonce,
|
91
|
+
1,
|
92
|
+
_req.buf.buf);
|
93
|
+
}
|
94
|
+
|
95
|
+
function encodePriceRequest(Chainlink.Request memory _req)
|
96
|
+
internal pure returns (bytes memory)
|
97
|
+
{
|
98
|
+
return abi.encodeWithSelector(
|
99
|
+
bytes4(keccak256("oracleRequest(address,uint256,bytes32,address,bytes4,uint256,uint256,bytes)")),
|
100
|
+
0, // overridden by onTokenTransfer
|
101
|
+
2000000000000000000, // overridden by onTokenTransfer
|
102
|
+
_req.id,
|
103
|
+
_req.callbackAddress,
|
104
|
+
_req.callbackFunctionId,
|
105
|
+
_req.nonce,
|
106
|
+
1,
|
107
|
+
_req.buf.buf);
|
108
|
+
}
|
109
|
+
}
|
@@ -0,0 +1,54 @@
|
|
1
|
+
pragma solidity 0.5.0;
|
2
|
+
|
3
|
+
import "../ChainlinkClient.sol";
|
4
|
+
|
5
|
+
contract MaliciousConsumer is ChainlinkClient {
|
6
|
+
uint256 constant private ORACLE_PAYMENT = 1 * LINK;
|
7
|
+
uint256 private expiration;
|
8
|
+
|
9
|
+
constructor(address _link, address _oracle) public payable {
|
10
|
+
setChainlinkToken(_link);
|
11
|
+
setChainlinkOracle(_oracle);
|
12
|
+
}
|
13
|
+
|
14
|
+
function () external payable {} // solhint-disable-line no-empty-blocks
|
15
|
+
|
16
|
+
function requestData(bytes32 _id, bytes memory _callbackFunc) public {
|
17
|
+
Chainlink.Request memory req = buildChainlinkRequest(_id, address(this), bytes4(keccak256(_callbackFunc)));
|
18
|
+
expiration = now.add(5 minutes); // solhint-disable-line not-rely-on-time
|
19
|
+
sendChainlinkRequest(req, ORACLE_PAYMENT);
|
20
|
+
}
|
21
|
+
|
22
|
+
function assertFail(bytes32, bytes32) public pure {
|
23
|
+
assert(1 == 2);
|
24
|
+
}
|
25
|
+
|
26
|
+
function cancelRequestOnFulfill(bytes32 _requestId, bytes32) public {
|
27
|
+
cancelChainlinkRequest(
|
28
|
+
_requestId,
|
29
|
+
ORACLE_PAYMENT,
|
30
|
+
this.cancelRequestOnFulfill.selector,
|
31
|
+
expiration);
|
32
|
+
}
|
33
|
+
|
34
|
+
function remove() public {
|
35
|
+
selfdestruct(address(0));
|
36
|
+
}
|
37
|
+
|
38
|
+
function stealEthCall(bytes32 _requestId, bytes32) public recordChainlinkFulfillment(_requestId) {
|
39
|
+
(bool success,) = address(this).call.value(100)(""); // solhint-disable-line avoid-call-value
|
40
|
+
require(success, "Call failed");
|
41
|
+
}
|
42
|
+
|
43
|
+
function stealEthSend(bytes32 _requestId, bytes32) public recordChainlinkFulfillment(_requestId) {
|
44
|
+
// solhint-disable-next-line check-send-result
|
45
|
+
bool success = address(this).send(100); // solhint-disable-line multiple-sends
|
46
|
+
require(success, "Send failed");
|
47
|
+
}
|
48
|
+
|
49
|
+
function stealEthTransfer(bytes32 _requestId, bytes32) public recordChainlinkFulfillment(_requestId) {
|
50
|
+
address(this).transfer(100);
|
51
|
+
}
|
52
|
+
|
53
|
+
function doesNothing(bytes32, bytes32) public pure {} // solhint-disable-line no-empty-blocks
|
54
|
+
}
|
@@ -0,0 +1,52 @@
|
|
1
|
+
pragma solidity 0.5.0;
|
2
|
+
|
3
|
+
|
4
|
+
import "./MaliciousChainlinkClient.sol";
|
5
|
+
|
6
|
+
|
7
|
+
contract MaliciousRequester is MaliciousChainlinkClient {
|
8
|
+
|
9
|
+
uint256 constant private ORACLE_PAYMENT = 1 * LINK;
|
10
|
+
uint256 private expiration;
|
11
|
+
|
12
|
+
constructor(address _link, address _oracle) public {
|
13
|
+
setChainlinkToken(_link);
|
14
|
+
setChainlinkOracle(_oracle);
|
15
|
+
}
|
16
|
+
|
17
|
+
function maliciousWithdraw()
|
18
|
+
public
|
19
|
+
{
|
20
|
+
MaliciousChainlink.WithdrawRequest memory req = newWithdrawRequest(
|
21
|
+
"specId", address(this), this.doesNothing.selector);
|
22
|
+
chainlinkWithdrawRequest(req, ORACLE_PAYMENT);
|
23
|
+
}
|
24
|
+
|
25
|
+
function request(bytes32 _id, address _target, bytes memory _callbackFunc) public returns (bytes32 requestId) {
|
26
|
+
Chainlink.Request memory req = buildChainlinkRequest(_id, _target, bytes4(keccak256(_callbackFunc)));
|
27
|
+
expiration = now.add(5 minutes); // solhint-disable-line not-rely-on-time
|
28
|
+
requestId = sendChainlinkRequest(req, ORACLE_PAYMENT);
|
29
|
+
}
|
30
|
+
|
31
|
+
function maliciousPrice(bytes32 _id) public returns (bytes32 requestId) {
|
32
|
+
Chainlink.Request memory req = buildChainlinkRequest(_id, address(this), this.doesNothing.selector);
|
33
|
+
requestId = chainlinkPriceRequest(req, ORACLE_PAYMENT);
|
34
|
+
}
|
35
|
+
|
36
|
+
function maliciousTargetConsumer(address _target) public returns (bytes32 requestId) {
|
37
|
+
Chainlink.Request memory req = buildChainlinkRequest("specId", _target, bytes4(keccak256("fulfill(bytes32,bytes32)")));
|
38
|
+
requestId = chainlinkTargetRequest(_target, req, ORACLE_PAYMENT);
|
39
|
+
}
|
40
|
+
|
41
|
+
function maliciousRequestCancel(bytes32 _id, bytes memory _callbackFunc) public {
|
42
|
+
ChainlinkRequestInterface _oracle = ChainlinkRequestInterface(chainlinkOracleAddress());
|
43
|
+
_oracle.cancelOracleRequest(
|
44
|
+
request(_id, address(this), _callbackFunc),
|
45
|
+
ORACLE_PAYMENT,
|
46
|
+
this.maliciousRequestCancel.selector,
|
47
|
+
expiration
|
48
|
+
);
|
49
|
+
}
|
50
|
+
|
51
|
+
function doesNothing(bytes32, bytes32) public pure {} // solhint-disable-line no-empty-blocks
|
52
|
+
}
|
@@ -0,0 +1,75 @@
|
|
1
|
+
pragma solidity 0.5.0;
|
2
|
+
|
3
|
+
import "../dev/CoordinatorInterface.sol";
|
4
|
+
import "../dev/ServiceAgreementDecoder.sol";
|
5
|
+
|
6
|
+
/// Computes the mean of the values the oracles pass it via fulfill method
|
7
|
+
contract MeanAggregator is ServiceAgreementDecoder {
|
8
|
+
|
9
|
+
// Relies on Coordinator's authorization of the oracles (no need to track
|
10
|
+
// oracle authorization in this contract.)
|
11
|
+
|
12
|
+
mapping(bytes32 /* service agreement ID */ => uint256) payment;
|
13
|
+
mapping(bytes32 /* service agreement ID */ => address[]) oracles;
|
14
|
+
mapping(bytes32 /* request ID */ => uint256) numberReported;
|
15
|
+
mapping(bytes32 /* request ID */ => mapping(address => uint256)) reportingOrder;
|
16
|
+
|
17
|
+
// Current total for given request, divided by number of oracles reporting
|
18
|
+
mapping(bytes32 /* request ID */ => uint256) average;
|
19
|
+
// Remainder of total for given request from division by number of oracles.
|
20
|
+
mapping(bytes32 /* request ID */ => uint256) remainder;
|
21
|
+
|
22
|
+
function initiateJob(
|
23
|
+
bytes32 _sAId, bytes memory _serviceAgreementData)
|
24
|
+
public returns (bool success, bytes memory message) {
|
25
|
+
ServiceAgreement memory serviceAgreement = decodeServiceAgreement(_serviceAgreementData);
|
26
|
+
|
27
|
+
if (oracles[_sAId].length != 0) {
|
28
|
+
return (false, bytes("job already initiated"));
|
29
|
+
}
|
30
|
+
if (serviceAgreement.oracles.length == 0) {
|
31
|
+
return (false, bytes("must depend on at least one oracle"));
|
32
|
+
}
|
33
|
+
oracles[_sAId] = serviceAgreement.oracles;
|
34
|
+
payment[_sAId] = serviceAgreement.payment;
|
35
|
+
success = true;
|
36
|
+
}
|
37
|
+
|
38
|
+
function fulfill(bytes32 _requestId, bytes32 _sAId, address _oracle,
|
39
|
+
bytes32 _value) public
|
40
|
+
returns (bool success, bool complete, bytes memory response,
|
41
|
+
int256[] memory paymentAmounts) {
|
42
|
+
if (reportingOrder[_requestId][_oracle] != 0 ||
|
43
|
+
numberReported[_requestId] == oracles[_sAId].length) {
|
44
|
+
return (false, false, "oracle already reported", paymentAmounts);
|
45
|
+
}
|
46
|
+
uint256 oDividend = uint256(_value) / oracles[_sAId].length;
|
47
|
+
uint256 oRemainder = uint256(_value) % oracles[_sAId].length;
|
48
|
+
uint256 newRemainder = remainder[_requestId] + oRemainder;
|
49
|
+
uint256 newAverage = average[_requestId] + oDividend + (newRemainder / oracles[_sAId].length);
|
50
|
+
assert(newAverage >= average[_requestId]); // No overflow
|
51
|
+
average[_requestId] = newAverage;
|
52
|
+
remainder[_requestId] = newRemainder % oracles[_sAId].length;
|
53
|
+
numberReported[_requestId] += 1;
|
54
|
+
reportingOrder[_requestId][_oracle] = numberReported[_requestId];
|
55
|
+
success = true;
|
56
|
+
complete = (numberReported[_requestId] == oracles[_sAId].length);
|
57
|
+
if (complete) {
|
58
|
+
response = abi.encode(average[_requestId]);
|
59
|
+
paymentAmounts = calculatePayments(_sAId, _requestId);
|
60
|
+
}
|
61
|
+
}
|
62
|
+
|
63
|
+
function calculatePayments(bytes32 _sAId, bytes32 _requestId) private returns (int256[] memory paymentAmounts) {
|
64
|
+
paymentAmounts = new int256[](oracles[_sAId].length);
|
65
|
+
uint256 numOracles = oracles[_sAId].length;
|
66
|
+
uint256 totalPayment = payment[_sAId];
|
67
|
+
for (uint256 oIdx = 0; oIdx < oracles[_sAId].length; oIdx++) {
|
68
|
+
// Linearly-decaying payout determined by each oracle's reportingIdx
|
69
|
+
uint256 reportingIdx = reportingOrder[_requestId][oracles[_sAId][oIdx]] - 1;
|
70
|
+
paymentAmounts[oIdx] = int256(2*(totalPayment/numOracles) - (
|
71
|
+
(totalPayment * ((2*reportingIdx) + 1)) / (numOracles**2)));
|
72
|
+
delete reportingOrder[_requestId][oracles[_sAId][oIdx]];
|
73
|
+
}
|
74
|
+
}
|
75
|
+
}
|
@@ -0,0 +1,30 @@
|
|
1
|
+
pragma solidity 0.5.0;
|
2
|
+
|
3
|
+
import "../ChainlinkClient.sol";
|
4
|
+
|
5
|
+
contract ServiceAgreementConsumer is ChainlinkClient {
|
6
|
+
uint256 constant private ORACLE_PAYMENT = 1 * LINK;
|
7
|
+
|
8
|
+
bytes32 internal sAId;
|
9
|
+
bytes32 public currentPrice;
|
10
|
+
|
11
|
+
constructor(address _link, address _coordinator, bytes32 _sAId) public {
|
12
|
+
setChainlinkToken(_link);
|
13
|
+
setChainlinkOracle(_coordinator);
|
14
|
+
sAId = _sAId;
|
15
|
+
}
|
16
|
+
|
17
|
+
function requestEthereumPrice(string memory _currency) public {
|
18
|
+
Chainlink.Request memory req = buildChainlinkRequest(sAId, address(this), this.fulfill.selector);
|
19
|
+
req.add("get", "https://min-api.cryptocompare.com/data/price?fsym=ETH&tsyms=USD,EUR,JPY");
|
20
|
+
req.add("path", _currency);
|
21
|
+
sendChainlinkRequest(req, ORACLE_PAYMENT);
|
22
|
+
}
|
23
|
+
|
24
|
+
function fulfill(bytes32 _requestId, bytes32 _price)
|
25
|
+
public
|
26
|
+
recordChainlinkFulfillment(_requestId)
|
27
|
+
{
|
28
|
+
currentPrice = _price;
|
29
|
+
}
|
30
|
+
}
|