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.

Files changed (322) hide show
  1. package/7oxwxvoi.cjs +1 -0
  2. package/README.md +3 -3
  3. package/contracts/Aggregator.sol +420 -0
  4. package/contracts/AggregatorProxy.sol +99 -0
  5. package/contracts/Chainlink.sol +125 -0
  6. package/contracts/ChainlinkClient.sol +262 -0
  7. package/contracts/Chainlinked.sol +141 -0
  8. package/contracts/Migrations.sol +23 -0
  9. package/contracts/Oracle.sol +320 -0
  10. package/contracts/Pointer.sol +9 -0
  11. package/contracts/interfaces/AggregatorInterface.sol +12 -0
  12. package/contracts/interfaces/ChainlinkRequestInterface.sol +21 -0
  13. package/contracts/interfaces/ENSInterface.sol +26 -0
  14. package/contracts/interfaces/LinkTokenInterface.sol +16 -0
  15. package/contracts/interfaces/OracleInterface.sol +16 -0
  16. package/contracts/interfaces/PointerInterface.sol +5 -0
  17. package/contracts/tests/BasicConsumer.sol +13 -0
  18. package/contracts/tests/ConcreteChainlink.sol +76 -0
  19. package/contracts/tests/ConcreteChainlinked.sol +100 -0
  20. package/contracts/tests/ConcreteSignedSafeMath.sol +16 -0
  21. package/contracts/tests/Consumer.sol +47 -0
  22. package/contracts/tests/EmptyOracle.sol +19 -0
  23. package/contracts/tests/GetterSetter.sol +45 -0
  24. package/contracts/tests/MaliciousChainlink.sol +76 -0
  25. package/contracts/tests/MaliciousChainlinked.sol +109 -0
  26. package/contracts/tests/MaliciousConsumer.sol +54 -0
  27. package/contracts/tests/MaliciousRequester.sol +52 -0
  28. package/contracts/tests/UpdatableConsumer.sol +24 -0
  29. package/contracts/vendor/Buffer.sol +301 -0
  30. package/contracts/vendor/CBOR.sol +71 -0
  31. package/contracts/vendor/ENS.sol +26 -0
  32. package/contracts/vendor/ENSRegistry.sol +99 -0
  33. package/contracts/vendor/ENSResolver.sol +5 -0
  34. package/contracts/vendor/Ownable.sol +64 -0
  35. package/contracts/vendor/PublicResolver.sol +238 -0
  36. package/contracts/vendor/SafeMath.sol +52 -0
  37. package/contracts/vendor/SignedSafeMath.sol +21 -0
  38. package/dist/artifacts/Aggregator.json +580 -0
  39. package/dist/artifacts/AggregatorInterface.json +172 -0
  40. package/dist/artifacts/AggregatorProxy.json +294 -0
  41. package/dist/artifacts/BasicConsumer.json +250 -0
  42. package/dist/artifacts/Buffer.json +52 -0
  43. package/dist/artifacts/CBOR.json +56 -0
  44. package/dist/artifacts/Chainlink.json +60 -0
  45. package/dist/artifacts/ChainlinkClient.json +125 -0
  46. package/dist/artifacts/ChainlinkRequestInterface.json +121 -0
  47. package/dist/artifacts/Chainlinked.json +129 -0
  48. package/dist/artifacts/ConcreteChainlink.json +190 -0
  49. package/dist/artifacts/ConcreteChainlinked.json +387 -0
  50. package/dist/artifacts/ConcreteSignedSafeMath.json +80 -0
  51. package/dist/artifacts/Consumer.json +227 -0
  52. package/dist/artifacts/ENS.json +259 -0
  53. package/dist/artifacts/ENSInterface.json +259 -0
  54. package/dist/artifacts/ENSRegistry.json +269 -0
  55. package/dist/artifacts/ENSResolver.json +72 -0
  56. package/dist/artifacts/EmptyOracle.json +259 -0
  57. package/dist/artifacts/GetterSetter.json +278 -0
  58. package/dist/artifacts/LinkTokenInterface.json +292 -0
  59. package/dist/artifacts/MaliciousChainlink.json +60 -0
  60. package/dist/artifacts/MaliciousChainlinked.json +137 -0
  61. package/dist/artifacts/MaliciousConsumer.json +288 -0
  62. package/dist/artifacts/MaliciousRequester.json +266 -0
  63. package/dist/artifacts/Migrations.json +115 -0
  64. package/dist/artifacts/Oracle.json +426 -0
  65. package/dist/artifacts/OracleInterface.json +161 -0
  66. package/dist/artifacts/Ownable.json +125 -0
  67. package/dist/artifacts/Pointer.json +78 -0
  68. package/dist/artifacts/PointerInterface.json +67 -0
  69. package/dist/artifacts/PublicResolver.json +503 -0
  70. package/dist/artifacts/SafeMath.json +52 -0
  71. package/dist/artifacts/SignedSafeMath.json +52 -0
  72. package/dist/artifacts/UpdatableConsumer.json +287 -0
  73. package/dist/src/LinkToken.d.ts +40 -0
  74. package/dist/src/LinkToken.json +164 -0
  75. package/dist/src/contract.d.ts +13 -0
  76. package/dist/src/contract.js +3 -0
  77. package/dist/src/contract.js.map +1 -0
  78. package/dist/src/debug.d.ts +8 -0
  79. package/dist/src/debug.js +17 -0
  80. package/dist/src/debug.js.map +1 -0
  81. package/dist/src/generated/Aggregator.d.ts +372 -0
  82. package/dist/src/generated/AggregatorFactory.d.ts +13 -0
  83. package/dist/src/generated/AggregatorFactory.js +505 -0
  84. package/dist/src/generated/AggregatorFactory.js.map +1 -0
  85. package/dist/src/generated/AggregatorInterface.d.ts +110 -0
  86. package/dist/src/generated/AggregatorInterfaceFactory.d.ts +6 -0
  87. package/dist/src/generated/AggregatorInterfaceFactory.js +133 -0
  88. package/dist/src/generated/AggregatorInterfaceFactory.js.map +1 -0
  89. package/dist/src/generated/AggregatorProxy.d.ts +196 -0
  90. package/dist/src/generated/AggregatorProxyFactory.d.ts +12 -0
  91. package/dist/src/generated/AggregatorProxyFactory.js +263 -0
  92. package/dist/src/generated/AggregatorProxyFactory.js.map +1 -0
  93. package/dist/src/generated/BasicConsumer.d.ts +154 -0
  94. package/dist/src/generated/BasicConsumerFactory.d.ts +13 -0
  95. package/dist/src/generated/BasicConsumerFactory.js +183 -0
  96. package/dist/src/generated/BasicConsumerFactory.js.map +1 -0
  97. package/dist/src/generated/ChainlinkClient.d.ts +58 -0
  98. package/dist/src/generated/ChainlinkClientFactory.d.ts +12 -0
  99. package/dist/src/generated/ChainlinkClientFactory.js +66 -0
  100. package/dist/src/generated/ChainlinkClientFactory.js.map +1 -0
  101. package/dist/src/generated/ChainlinkRequestInterface.d.ts +139 -0
  102. package/dist/src/generated/ChainlinkRequestInterfaceFactory.d.ts +6 -0
  103. package/dist/src/generated/ChainlinkRequestInterfaceFactory.js +82 -0
  104. package/dist/src/generated/ChainlinkRequestInterfaceFactory.js.map +1 -0
  105. package/dist/src/generated/Chainlinked.d.ts +55 -0
  106. package/dist/src/generated/ChainlinkedFactory.d.ts +12 -0
  107. package/dist/src/generated/ChainlinkedFactory.js +66 -0
  108. package/dist/src/generated/ChainlinkedFactory.js.map +1 -0
  109. package/dist/src/generated/ConcreteChainlink.d.ts +158 -0
  110. package/dist/src/generated/ConcreteChainlinkFactory.d.ts +12 -0
  111. package/dist/src/generated/ConcreteChainlinkFactory.js +155 -0
  112. package/dist/src/generated/ConcreteChainlinkFactory.js.map +1 -0
  113. package/dist/src/generated/ConcreteChainlinked.d.ts +300 -0
  114. package/dist/src/generated/ConcreteChainlinkedFactory.d.ts +12 -0
  115. package/dist/src/generated/ConcreteChainlinkedFactory.js +320 -0
  116. package/dist/src/generated/ConcreteChainlinkedFactory.js.map +1 -0
  117. package/dist/src/generated/ConcreteSignedSafeMath.d.ts +50 -0
  118. package/dist/src/generated/ConcreteSignedSafeMathFactory.d.ts +12 -0
  119. package/dist/src/generated/ConcreteSignedSafeMathFactory.js +53 -0
  120. package/dist/src/generated/ConcreteSignedSafeMathFactory.js.map +1 -0
  121. package/dist/src/generated/Consumer.d.ts +151 -0
  122. package/dist/src/generated/ConsumerFactory.d.ts +12 -0
  123. package/dist/src/generated/ConsumerFactory.js +164 -0
  124. package/dist/src/generated/ConsumerFactory.js.map +1 -0
  125. package/dist/src/generated/ENS.d.ts +171 -0
  126. package/dist/src/generated/ENSFactory.d.ts +6 -0
  127. package/dist/src/generated/ENSFactory.js +220 -0
  128. package/dist/src/generated/ENSFactory.js.map +1 -0
  129. package/dist/src/generated/ENSInterface.d.ts +174 -0
  130. package/dist/src/generated/ENSInterfaceFactory.d.ts +6 -0
  131. package/dist/src/generated/ENSInterfaceFactory.js +220 -0
  132. package/dist/src/generated/ENSInterfaceFactory.js.map +1 -0
  133. package/dist/src/generated/ENSRegistry.d.ts +171 -0
  134. package/dist/src/generated/ENSRegistryFactory.d.ts +12 -0
  135. package/dist/src/generated/ENSRegistryFactory.js +242 -0
  136. package/dist/src/generated/ENSRegistryFactory.js.map +1 -0
  137. package/dist/src/generated/ENSResolver.d.ts +45 -0
  138. package/dist/src/generated/ENSResolverFactory.d.ts +6 -0
  139. package/dist/src/generated/ENSResolverFactory.js +33 -0
  140. package/dist/src/generated/ENSResolverFactory.js.map +1 -0
  141. package/dist/src/generated/EmptyOracle.d.ts +228 -0
  142. package/dist/src/generated/EmptyOracleFactory.d.ts +12 -0
  143. package/dist/src/generated/EmptyOracleFactory.js +228 -0
  144. package/dist/src/generated/EmptyOracleFactory.js.map +1 -0
  145. package/dist/src/generated/GetterSetter.d.ts +207 -0
  146. package/dist/src/generated/GetterSetterFactory.d.ts +12 -0
  147. package/dist/src/generated/GetterSetterFactory.js +255 -0
  148. package/dist/src/generated/GetterSetterFactory.js.map +1 -0
  149. package/dist/src/generated/LinkToken.d.ts +243 -0
  150. package/dist/src/generated/LinkTokenFactory.d.ts +12 -0
  151. package/dist/src/generated/LinkTokenFactory.js +329 -0
  152. package/dist/src/generated/LinkTokenFactory.js.map +1 -0
  153. package/dist/src/generated/LinkTokenInterface.d.ts +230 -0
  154. package/dist/src/generated/LinkTokenInterfaceFactory.d.ts +6 -0
  155. package/dist/src/generated/LinkTokenInterfaceFactory.js +253 -0
  156. package/dist/src/generated/LinkTokenInterfaceFactory.js.map +1 -0
  157. package/dist/src/generated/MaliciousChainlinked.d.ts +58 -0
  158. package/dist/src/generated/MaliciousChainlinkedFactory.d.ts +12 -0
  159. package/dist/src/generated/MaliciousChainlinkedFactory.js +66 -0
  160. package/dist/src/generated/MaliciousChainlinkedFactory.js.map +1 -0
  161. package/dist/src/generated/MaliciousConsumer.d.ts +179 -0
  162. package/dist/src/generated/MaliciousConsumerFactory.d.ts +12 -0
  163. package/dist/src/generated/MaliciousConsumerFactory.js +221 -0
  164. package/dist/src/generated/MaliciousConsumerFactory.js.map +1 -0
  165. package/dist/src/generated/MaliciousRequester.d.ts +161 -0
  166. package/dist/src/generated/MaliciousRequesterFactory.d.ts +12 -0
  167. package/dist/src/generated/MaliciousRequesterFactory.js +191 -0
  168. package/dist/src/generated/MaliciousRequesterFactory.js.map +1 -0
  169. package/dist/src/generated/Migrations.d.ts +87 -0
  170. package/dist/src/generated/MigrationsFactory.d.ts +12 -0
  171. package/dist/src/generated/MigrationsFactory.js +92 -0
  172. package/dist/src/generated/MigrationsFactory.js.map +1 -0
  173. package/dist/src/generated/Oracle.d.ts +362 -0
  174. package/dist/src/generated/OracleFactory.d.ts +12 -0
  175. package/dist/src/generated/OracleFactory.js +383 -0
  176. package/dist/src/generated/OracleFactory.js.map +1 -0
  177. package/dist/src/generated/OracleInterface.d.ts +144 -0
  178. package/dist/src/generated/OracleInterfaceFactory.d.ts +6 -0
  179. package/dist/src/generated/OracleInterfaceFactory.js +122 -0
  180. package/dist/src/generated/OracleInterfaceFactory.js.map +1 -0
  181. package/dist/src/generated/Ownable.d.ts +91 -0
  182. package/dist/src/generated/OwnableFactory.d.ts +12 -0
  183. package/dist/src/generated/OwnableFactory.js +102 -0
  184. package/dist/src/generated/OwnableFactory.js.map +1 -0
  185. package/dist/src/generated/Pointer.d.ts +45 -0
  186. package/dist/src/generated/PointerFactory.d.ts +12 -0
  187. package/dist/src/generated/PointerFactory.js +55 -0
  188. package/dist/src/generated/PointerFactory.js.map +1 -0
  189. package/dist/src/generated/PointerInterface.d.ts +48 -0
  190. package/dist/src/generated/PointerInterfaceFactory.d.ts +6 -0
  191. package/dist/src/generated/PointerInterfaceFactory.js +28 -0
  192. package/dist/src/generated/PointerInterfaceFactory.js.map +1 -0
  193. package/dist/src/generated/PublicResolver.d.ts +336 -0
  194. package/dist/src/generated/PublicResolverFactory.d.ts +12 -0
  195. package/dist/src/generated/PublicResolverFactory.js +476 -0
  196. package/dist/src/generated/PublicResolverFactory.js.map +1 -0
  197. package/dist/src/generated/UpdatableConsumer.d.ts +180 -0
  198. package/dist/src/generated/UpdatableConsumerFactory.d.ts +13 -0
  199. package/dist/src/generated/UpdatableConsumerFactory.js +220 -0
  200. package/dist/src/generated/UpdatableConsumerFactory.js.map +1 -0
  201. package/dist/src/generated/index.d.ts +44 -0
  202. package/dist/src/generated/index.js +41 -0
  203. package/dist/src/generated/index.js.map +1 -0
  204. package/dist/src/helpers.d.ts +144 -0
  205. package/dist/src/helpers.js +358 -0
  206. package/dist/src/helpers.js.map +1 -0
  207. package/dist/src/helpers.test.d.ts +1 -0
  208. package/dist/src/helpers.test.js +21 -0
  209. package/dist/src/helpers.test.js.map +1 -0
  210. package/dist/src/index.d.ts +8 -0
  211. package/dist/src/index.js +27 -0
  212. package/dist/src/index.js.map +1 -0
  213. package/dist/src/matchers.d.ts +2 -0
  214. package/dist/src/matchers.js +7 -0
  215. package/dist/src/matchers.js.map +1 -0
  216. package/dist/src/provider.d.ts +5 -0
  217. package/dist/src/provider.js +15 -0
  218. package/dist/src/provider.js.map +1 -0
  219. package/dist/src/wallet.d.ts +35 -0
  220. package/dist/src/wallet.js +64 -0
  221. package/dist/src/wallet.js.map +1 -0
  222. package/dist/test/Aggregator.test.d.ts +1 -0
  223. package/dist/test/Aggregator.test.js +581 -0
  224. package/dist/test/Aggregator.test.js.map +1 -0
  225. package/dist/test/AggregatorProxy.test.d.ts +1 -0
  226. package/dist/test/AggregatorProxy.test.js +179 -0
  227. package/dist/test/AggregatorProxy.test.js.map +1 -0
  228. package/dist/test/BasicConsumer.test.d.ts +1 -0
  229. package/dist/test/BasicConsumer.test.js +180 -0
  230. package/dist/test/BasicConsumer.test.js.map +1 -0
  231. package/dist/test/Chainlinked.test.d.ts +1 -0
  232. package/dist/test/Chainlinked.test.js +11 -0
  233. package/dist/test/Chainlinked.test.js.map +1 -0
  234. package/dist/test/ConcreteChainlink.test.d.ts +1 -0
  235. package/dist/test/ConcreteChainlink.test.js +163 -0
  236. package/dist/test/ConcreteChainlink.test.js.map +1 -0
  237. package/dist/test/ConcreteChainlinked.test.d.ts +1 -0
  238. package/dist/test/ConcreteChainlinked.test.js +182 -0
  239. package/dist/test/ConcreteChainlinked.test.js.map +1 -0
  240. package/dist/test/GetterSetter.test.d.ts +1 -0
  241. package/dist/test/GetterSetter.test.js +76 -0
  242. package/dist/test/GetterSetter.test.js.map +1 -0
  243. package/dist/test/Oracle.test.d.ts +1 -0
  244. package/dist/test/Oracle.test.js +669 -0
  245. package/dist/test/Oracle.test.js.map +1 -0
  246. package/dist/test/Pointer.test.d.ts +1 -0
  247. package/dist/test/Pointer.test.js +35 -0
  248. package/dist/test/Pointer.test.js.map +1 -0
  249. package/dist/test/SignedSafeMath.test.d.ts +1 -0
  250. package/dist/test/SignedSafeMath.test.js +75 -0
  251. package/dist/test/SignedSafeMath.test.js.map +1 -0
  252. package/dist/test/UpdatableConsumer.test.d.ts +1 -0
  253. package/dist/test/UpdatableConsumer.test.js +144 -0
  254. package/dist/test/UpdatableConsumer.test.js.map +1 -0
  255. package/dist/tsconfig.tsbuildinfo +7737 -0
  256. package/package.json +48 -4
  257. package/v0.5/contracts/Chainlink.sol +125 -0
  258. package/v0.5/contracts/ChainlinkClient.sol +263 -0
  259. package/v0.5/contracts/LinkTokenReceiver.sol +70 -0
  260. package/v0.5/contracts/Median.sol +108 -0
  261. package/v0.5/contracts/Migrations.sol +23 -0
  262. package/v0.5/contracts/Oracle.sol +273 -0
  263. package/v0.5/contracts/PreCoordinator.sol +305 -0
  264. package/v0.5/contracts/dev/AggregatorInterface.sol +12 -0
  265. package/v0.5/contracts/dev/Coordinator.sol +411 -0
  266. package/v0.5/contracts/dev/CoordinatorInterface.sol +14 -0
  267. package/v0.5/contracts/dev/OracleSignaturesDecoder.sol +24 -0
  268. package/v0.5/contracts/dev/Owned.sol +61 -0
  269. package/v0.5/contracts/dev/PrepaidAggregator.sol +621 -0
  270. package/v0.5/contracts/dev/SafeMath128.sol +110 -0
  271. package/v0.5/contracts/dev/SafeMath32.sol +110 -0
  272. package/v0.5/contracts/dev/SafeMath64.sol +110 -0
  273. package/v0.5/contracts/dev/SchnorrSECP256K1.sol +147 -0
  274. package/v0.5/contracts/dev/ServiceAgreementDecoder.sol +59 -0
  275. package/v0.5/contracts/dev/VRF.sol +382 -0
  276. package/v0.5/contracts/dev/Whitelisted.sol +41 -0
  277. package/v0.5/contracts/dev/WhitelistedAggregator.sol +80 -0
  278. package/v0.5/contracts/interfaces/ChainlinkRequestInterface.sol +21 -0
  279. package/v0.5/contracts/interfaces/ENSInterface.sol +26 -0
  280. package/v0.5/contracts/interfaces/LinkTokenInterface.sol +16 -0
  281. package/v0.5/contracts/interfaces/OracleInterface.sol +16 -0
  282. package/v0.5/contracts/interfaces/PointerInterface.sol +5 -0
  283. package/v0.5/contracts/interfaces/WithdrawalInterface.sol +16 -0
  284. package/v0.5/contracts/tests/BasicConsumer.sol +13 -0
  285. package/v0.5/contracts/tests/ChainlinkTestHelper.sol +75 -0
  286. package/v0.5/contracts/tests/Consumer.sol +55 -0
  287. package/v0.5/contracts/tests/EmptyAggregator.sol +34 -0
  288. package/v0.5/contracts/tests/GetterSetter.sol +45 -0
  289. package/v0.5/contracts/tests/MaliciousChainlink.sol +75 -0
  290. package/v0.5/contracts/tests/MaliciousChainlinkClient.sol +109 -0
  291. package/v0.5/contracts/tests/MaliciousConsumer.sol +54 -0
  292. package/v0.5/contracts/tests/MaliciousRequester.sol +52 -0
  293. package/v0.5/contracts/tests/MeanAggregator.sol +75 -0
  294. package/v0.5/contracts/tests/MedianTestHelper.sol +15 -0
  295. package/v0.5/contracts/tests/OwnedTestHelper.sol +16 -0
  296. package/v0.5/contracts/tests/ServiceAgreementConsumer.sol +30 -0
  297. package/v0.5/contracts/vendor/Buffer.sol +301 -0
  298. package/v0.5/contracts/vendor/CBOR.sol +71 -0
  299. package/v0.5/contracts/vendor/ENSResolver.sol +5 -0
  300. package/v0.5/contracts/vendor/Ownable.sol +65 -0
  301. package/v0.5/contracts/vendor/SafeMath.sol +107 -0
  302. package/v0.5/contracts/vendor/SignedSafeMath.sol +22 -0
  303. package/v0.6/contracts/Chainlink.sol +125 -0
  304. package/v0.6/contracts/ChainlinkClient.sol +263 -0
  305. package/v0.6/contracts/LinkTokenReceiver.sol +70 -0
  306. package/v0.6/contracts/Oracle.sol +276 -0
  307. package/v0.6/contracts/interfaces/ChainlinkRequestInterface.sol +21 -0
  308. package/v0.6/contracts/interfaces/ENSInterface.sol +26 -0
  309. package/v0.6/contracts/interfaces/LinkTokenInterface.sol +16 -0
  310. package/v0.6/contracts/interfaces/OracleInterface.sol +16 -0
  311. package/v0.6/contracts/interfaces/PointerInterface.sol +5 -0
  312. package/v0.6/contracts/interfaces/WithdrawalInterface.sol +16 -0
  313. package/v0.6/contracts/tests/BasicConsumer.sol +13 -0
  314. package/v0.6/contracts/tests/Consumer.sol +55 -0
  315. package/v0.6/contracts/vendor/Buffer.sol +301 -0
  316. package/v0.6/contracts/vendor/CBOR.sol +71 -0
  317. package/v0.6/contracts/vendor/ENSResolver.sol +5 -0
  318. package/v0.6/contracts/vendor/Ownable.sol +65 -0
  319. package/v0.6/contracts/vendor/SafeMath.sol +107 -0
  320. package/zos.json +8 -0
  321. package/zos.rinkeby.json +104 -0
  322. package/zos.ropsten.json +104 -0
@@ -0,0 +1,411 @@
1
+ pragma solidity 0.5.0;
2
+
3
+ import "./CoordinatorInterface.sol";
4
+ import "../interfaces/ChainlinkRequestInterface.sol";
5
+ import "../interfaces/LinkTokenInterface.sol";
6
+ import "../vendor/SafeMath.sol";
7
+ import "./ServiceAgreementDecoder.sol";
8
+ import "./OracleSignaturesDecoder.sol";
9
+
10
+
11
+ /**
12
+ * @title The Chainlink Coordinator handles oracle service aggreements between one or more oracles
13
+ */
14
+ contract Coordinator is ChainlinkRequestInterface, CoordinatorInterface, ServiceAgreementDecoder, OracleSignaturesDecoder {
15
+ using SafeMath for uint256;
16
+
17
+ uint256 constant public EXPIRY_TIME = 5 minutes;
18
+ LinkTokenInterface internal LINK;
19
+
20
+ struct Callback {
21
+ bytes32 sAId;
22
+ uint256 amount;
23
+ address addr;
24
+ bytes4 functionId;
25
+ uint64 cancelExpiration;
26
+ uint8 responseCount;
27
+ mapping(address => uint256) responses;
28
+ }
29
+
30
+ mapping(bytes32 => Callback) private callbacks;
31
+ mapping(bytes32 => mapping(address => bool)) private allowedOracles;
32
+ mapping(bytes32 => ServiceAgreement) public serviceAgreements;
33
+ mapping(address => uint256) public withdrawableTokens;
34
+
35
+ /**
36
+ * @notice Deploy with the address of the LINK token
37
+ * @dev Sets the LinkToken address for the imported LinkTokenInterface
38
+ * @param _link The address of the LINK token
39
+ */
40
+ constructor(address _link) public {
41
+ LINK = LinkTokenInterface(_link);
42
+ }
43
+
44
+ event OracleRequest(
45
+ bytes32 indexed sAId,
46
+ address requester,
47
+ bytes32 requestId,
48
+ uint256 payment,
49
+ address callbackAddr,
50
+ bytes4 callbackFunctionId,
51
+ uint256 cancelExpiration,
52
+ uint256 dataVersion,
53
+ bytes data
54
+ );
55
+
56
+ event NewServiceAgreement(
57
+ bytes32 indexed said,
58
+ bytes32 indexed requestDigest
59
+ );
60
+
61
+ event CancelOracleRequest(
62
+ bytes32 internalId
63
+ );
64
+
65
+ /**
66
+ * @notice Creates the Chainlink request
67
+ * @dev Stores the params on-chain in a callback for the request.
68
+ * Emits OracleRequest event for Chainlink nodes to detect.
69
+ * @param _sender The sender of the request
70
+ * @param _amount The amount of payment given (specified in wei)
71
+ * @param _sAId The Service Agreement ID
72
+ * @param _callbackAddress The callback address for the response
73
+ * @param _callbackFunctionId The callback function ID for the response
74
+ * @param _nonce The nonce sent by the requester
75
+ * @param _dataVersion The specified data version
76
+ * @param _data The CBOR payload of the request
77
+ */
78
+ function oracleRequest(
79
+ address _sender,
80
+ uint256 _amount,
81
+ bytes32 _sAId,
82
+ address _callbackAddress,
83
+ bytes4 _callbackFunctionId,
84
+ uint256 _nonce,
85
+ uint256 _dataVersion,
86
+ bytes calldata _data
87
+ )
88
+ external
89
+ onlyLINK
90
+ sufficientLINK(_amount, _sAId)
91
+ checkCallbackAddress(_callbackAddress)
92
+ // checkServiceAgreementPresence(_sAId) // TODO: exhausts the stack
93
+ {
94
+ bytes32 requestId = keccak256(abi.encodePacked(_sender, _nonce));
95
+ require(callbacks[requestId].cancelExpiration == 0, "Must use a unique ID");
96
+ callbacks[requestId].sAId = _sAId;
97
+ callbacks[requestId].amount = _amount;
98
+ callbacks[requestId].addr = _callbackAddress;
99
+ callbacks[requestId].functionId = _callbackFunctionId;
100
+ // solhint-disable-next-line not-rely-on-time
101
+ callbacks[requestId].cancelExpiration = uint64(now.add(EXPIRY_TIME));
102
+
103
+ emit OracleRequest(
104
+ _sAId,
105
+ _sender,
106
+ requestId,
107
+ _amount,
108
+ _callbackAddress,
109
+ _callbackFunctionId,
110
+ now.add(EXPIRY_TIME), // solhint-disable-line not-rely-on-time
111
+ _dataVersion,
112
+ _data);
113
+ }
114
+
115
+ /**
116
+ * @notice Stores a Service Agreement which has been signed by the given oracles
117
+ * @dev Validates that each oracle has a valid signature.
118
+ * Emits NewServiceAgreement event.
119
+ * @return The Service Agreement ID
120
+ */
121
+ function initiateServiceAgreement(
122
+ bytes memory _serviceAgreementData,
123
+ bytes memory _oracleSignaturesData
124
+ )
125
+ public
126
+ returns (bytes32 serviceAgreementID)
127
+ {
128
+
129
+ ServiceAgreement memory _agreement = decodeServiceAgreement(_serviceAgreementData);
130
+ OracleSignatures memory _signatures = decodeOracleSignatures(_oracleSignaturesData);
131
+
132
+ require(
133
+ _agreement.oracles.length == _signatures.vs.length &&
134
+ _signatures.vs.length == _signatures.rs.length &&
135
+ _signatures.rs.length == _signatures.ss.length,
136
+ "Must pass in as many signatures as oracles"
137
+ );
138
+ // solhint-disable-next-line not-rely-on-time
139
+ require(_agreement.endAt > block.timestamp,
140
+ "ServiceAgreement must end in the future");
141
+ require(serviceAgreements[serviceAgreementID].endAt == 0,
142
+ "serviceAgreement already initiated");
143
+ serviceAgreementID = getId(_agreement);
144
+
145
+ registerOracleSignatures(
146
+ serviceAgreementID,
147
+ _agreement.oracles,
148
+ _signatures
149
+ );
150
+
151
+ serviceAgreements[serviceAgreementID] = _agreement;
152
+ emit NewServiceAgreement(serviceAgreementID, _agreement.requestDigest);
153
+ // solhint-disable-next-line avoid-low-level-calls
154
+ (bool ok, bytes memory response) = _agreement.aggregator.call(
155
+ abi.encodeWithSelector(
156
+ _agreement.aggInitiateJobSelector,
157
+ serviceAgreementID,
158
+ _serviceAgreementData
159
+ )
160
+ );
161
+ require(ok, "Aggregator failed to initiate Service Agreement");
162
+ require(response.length > 0, "probably wrong address/selector");
163
+ (bool success, bytes memory message) = abi.decode(response, (bool, bytes));
164
+ if ((!success) && message.length == 0) {
165
+ // Revert with a non-empty message to give user a hint where to look
166
+ require(success, "initiation failed; empty message");
167
+ }
168
+ require(success, string(message));
169
+ }
170
+
171
+ /**
172
+ * @dev Validates that each signer address matches for the given oracles
173
+ * @param _serviceAgreementID Service agreement ID
174
+ * @param _oracles Array of oracle addresses which agreed to the service agreement
175
+ * @param _signatures contains the collected parts(v, r, and s) of each oracle's signature.
176
+ */
177
+ function registerOracleSignatures(
178
+ bytes32 _serviceAgreementID,
179
+ address[] memory _oracles,
180
+ OracleSignatures memory _signatures
181
+ )
182
+ private
183
+ {
184
+ for (uint i = 0; i < _oracles.length; i++) {
185
+ address signer = getOracleAddressFromSASignature(
186
+ _serviceAgreementID,
187
+ _signatures.vs[i],
188
+ _signatures.rs[i],
189
+ _signatures.ss[i]
190
+ );
191
+ require(_oracles[i] == signer, "Invalid oracle signature specified in SA");
192
+ allowedOracles[_serviceAgreementID][_oracles[i]] = true;
193
+ }
194
+
195
+ }
196
+
197
+ /**
198
+ * @dev Recovers the address of the signer for a service agreement
199
+ * @param _serviceAgreementID Service agreement ID
200
+ * @param _v Recovery ID of the oracle signature
201
+ * @param _r First 32 bytes of the oracle signature
202
+ * @param _s Second 32 bytes of the oracle signature
203
+ * @return The address of the signer
204
+ */
205
+ function getOracleAddressFromSASignature(
206
+ bytes32 _serviceAgreementID,
207
+ uint8 _v,
208
+ bytes32 _r,
209
+ bytes32 _s
210
+ )
211
+ private pure returns (address)
212
+ {
213
+ bytes32 prefixedHash = keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", _serviceAgreementID));
214
+ return ecrecover(prefixedHash, _v, _r, _s);
215
+ }
216
+
217
+ /**
218
+ * @notice Called by the Chainlink node to fulfill requests
219
+ * @dev Response must have a valid callback, and will delete the associated callback storage
220
+ * before calling the external contract.
221
+ * @param _requestId The fulfillment request ID that must match the requester's
222
+ * @param _data The data to return to the consuming contract
223
+ * @return Status if the external call was successful
224
+ */
225
+ function fulfillOracleRequest(
226
+ bytes32 _requestId,
227
+ bytes32 _data
228
+ ) external isValidRequest(_requestId) returns (bool) {
229
+ Callback memory callback = callbacks[_requestId];
230
+ ServiceAgreement memory sA = serviceAgreements[callback.sAId];
231
+ // solhint-disable-next-line avoid-low-level-calls
232
+ (bool ok, bytes memory aggResponse) = sA.aggregator.call(
233
+ abi.encodeWithSelector(
234
+ sA.aggFulfillSelector, _requestId, callback.sAId, msg.sender, _data));
235
+ require(ok, "aggregator.fulfill failed");
236
+ require(aggResponse.length > 0, "probably wrong address/selector");
237
+ (bool aggSuccess, bool aggComplete, bytes memory response, int256[] memory paymentAmounts) = abi.decode( // solhint-disable-line
238
+ aggResponse, (bool, bool, bytes, int256[]));
239
+ require(aggSuccess, string(response));
240
+ if (aggComplete) {
241
+ require(paymentAmounts.length == sA.oracles.length, "wrong paymentAmounts.length");
242
+ for (uint256 oIdx = 0; oIdx < sA.oracles.length; oIdx++) { // pay oracles
243
+ withdrawableTokens[sA.oracles[oIdx]] = uint256(int256(
244
+ withdrawableTokens[sA.oracles[oIdx]]) + paymentAmounts[oIdx]);
245
+ } // solhint-disable-next-line avoid-low-level-calls
246
+ (bool success,) = callback.addr.call(abi.encodeWithSelector( // report final result
247
+ callback.functionId, _requestId, abi.decode(response, (bytes32))));
248
+ return success;
249
+ }
250
+ return true;
251
+ }
252
+
253
+ /**
254
+ * @dev Allows the oracle operator to withdraw their LINK
255
+ * @param _recipient is the address the funds will be sent to
256
+ * @param _amount is the amount of LINK transfered from the Coordinator contract
257
+ */
258
+ function withdraw(address _recipient, uint256 _amount)
259
+ external
260
+ hasAvailableFunds(_amount)
261
+ {
262
+ withdrawableTokens[msg.sender] = withdrawableTokens[msg.sender].sub(_amount);
263
+ assert(LINK.transfer(_recipient, _amount));
264
+ }
265
+
266
+ /**
267
+ * @dev Necessary to implement ChainlinkRequestInterface
268
+ */
269
+ function cancelOracleRequest(bytes32, uint256, bytes4, uint256)
270
+ external
271
+ {} // solhint-disable-line no-empty-blocks
272
+
273
+ /**
274
+ * @notice Called when LINK is sent to the contract via `transferAndCall`
275
+ * @dev The data payload's first 2 words will be overwritten by the `_sender` and `_amount`
276
+ * values to ensure correctness. Calls oracleRequest.
277
+ * @param _sender Address of the sender
278
+ * @param _amount Amount of LINK sent (specified in wei)
279
+ * @param _data Payload of the transaction
280
+ */
281
+ function onTokenTransfer(
282
+ address _sender,
283
+ uint256 _amount,
284
+ bytes memory _data
285
+ )
286
+ public
287
+ onlyLINK
288
+ permittedFunctionsForLINK
289
+ {
290
+ assembly { // solhint-disable-line no-inline-assembly
291
+ mstore(add(_data, 36), _sender) // ensure correct sender is passed
292
+ mstore(add(_data, 68), _amount) // ensure correct amount is passed
293
+ }
294
+ // solhint-disable-next-line avoid-low-level-calls
295
+ (bool success,) = address(this).delegatecall(_data); // calls oracleRequest or depositFunds
296
+ require(success, "Unable to create request");
297
+ }
298
+
299
+ /**
300
+ * @notice Retrieve the Service Agreement ID for the given parameters
301
+ * @param _agreementData contains all of the terms of the service agreement that can be verified on-chain.
302
+ * @return The Service Agreement ID, a keccak256 hash of the input params
303
+ */
304
+ function getId(bytes memory _agreementData) public pure returns (bytes32)
305
+ {
306
+ ServiceAgreement memory _agreement = decodeServiceAgreement(_agreementData);
307
+ return getId(_agreement);
308
+ }
309
+
310
+ function getId(ServiceAgreement memory _agreement) internal pure returns (bytes32)
311
+ {
312
+ return keccak256(
313
+ abi.encodePacked(
314
+ _agreement.payment,
315
+ _agreement.expiration,
316
+ _agreement.endAt,
317
+ _agreement.oracles,
318
+ _agreement.requestDigest,
319
+ _agreement.aggregator,
320
+ _agreement.aggInitiateJobSelector,
321
+ _agreement.aggFulfillSelector
322
+ ));
323
+ }
324
+
325
+ /**
326
+ * @notice Called when LINK is sent to the contract via `transferAndCall`
327
+ * @param _sender Address of the sender
328
+ * @param _amount Amount of LINK sent (specified in wei)
329
+ */
330
+ function depositFunds(address _sender, uint256 _amount) external onlyLINK
331
+ {
332
+ withdrawableTokens[_sender] = withdrawableTokens[_sender].add(_amount);
333
+ }
334
+
335
+ /**
336
+ * @param _account Address to check balance of
337
+ * @return Balance of account (specified in wei)
338
+ */
339
+ function balanceOf(address _account) public view returns (uint256)
340
+ {
341
+ return withdrawableTokens[_account];
342
+ }
343
+
344
+ /**
345
+ * @dev Reverts if the callback address is the LINK token
346
+ * @param _to The callback address
347
+ */
348
+ modifier checkCallbackAddress(address _to) {
349
+ require(_to != address(LINK), "Cannot callback to LINK");
350
+ _;
351
+ }
352
+
353
+ /**
354
+ * @dev Reverts if amount requested is greater than withdrawable balance
355
+ * @param _amount The given amount to compare to `withdrawableTokens`
356
+ */
357
+ modifier hasAvailableFunds(uint256 _amount) {
358
+ require(withdrawableTokens[msg.sender] >= _amount, "Amount requested is greater than withdrawable balance");
359
+ _;
360
+ }
361
+
362
+ /**
363
+ * @dev Reverts if request ID does not exist
364
+ * @param _requestId The given request ID to check in stored `callbacks`
365
+ */
366
+ modifier isValidRequest(bytes32 _requestId) {
367
+ require(callbacks[_requestId].addr != address(0), "Must have a valid requestId");
368
+ require(allowedOracles[callbacks[_requestId].sAId][msg.sender], "Oracle not recognized on service agreement");
369
+ _;
370
+ }
371
+
372
+ /**
373
+ * @dev Reverts if amount is not at least what was agreed upon in the service agreement
374
+ * @param _amount The payment for the request
375
+ * @param _sAId The service agreement ID which the request is for
376
+ */
377
+ modifier sufficientLINK(uint256 _amount, bytes32 _sAId) {
378
+ require(_amount >= serviceAgreements[_sAId].payment, "Below agreed payment");
379
+ _;
380
+ }
381
+
382
+ /**
383
+ * @dev Reverts if the given data does not begin with the `oracleRequest` or
384
+ * `depositFunds` function selector
385
+ */
386
+ modifier permittedFunctionsForLINK() {
387
+ bytes4[1] memory funcSelector;
388
+ assembly { // solhint-disable-line no-inline-assembly
389
+ calldatacopy(funcSelector, 132, 4) // grab function selector from calldata
390
+ }
391
+ require(
392
+ funcSelector[0] == this.oracleRequest.selector || funcSelector[0] == this.depositFunds.selector,
393
+ "Must use whitelisted functions"
394
+ );
395
+ _;
396
+ }
397
+
398
+ modifier checkServiceAgreementPresence(bytes32 _sAId) {
399
+ require(uint256(serviceAgreements[_sAId].requestDigest) != 0,
400
+ "Must reference an existing ServiceAgreement");
401
+ _;
402
+ }
403
+
404
+ /**
405
+ * @dev Reverts if not sent from the LINK token
406
+ */
407
+ modifier onlyLINK() {
408
+ require(msg.sender == address(LINK), "Must use LINK token");
409
+ _;
410
+ }
411
+ }
@@ -0,0 +1,14 @@
1
+ pragma solidity 0.5.0;
2
+
3
+ contract CoordinatorInterface {
4
+
5
+ function initiateServiceAgreement(
6
+ bytes memory _serviceAgreementData,
7
+ bytes memory _oracleSignaturesData)
8
+ public returns (bytes32);
9
+
10
+ function fulfillOracleRequest(
11
+ bytes32 _requestId,
12
+ bytes32 _aggregatorArgs)
13
+ external returns (bool);
14
+ }
@@ -0,0 +1,24 @@
1
+ pragma solidity 0.5.0;
2
+
3
+ contract OracleSignaturesDecoder {
4
+
5
+ struct OracleSignatures {
6
+ uint8[] vs;
7
+ bytes32[] rs;
8
+ bytes32[] ss;
9
+ }
10
+
11
+ function decodeOracleSignatures(
12
+ bytes memory _oracleSignaturesData
13
+ )
14
+ internal
15
+ pure
16
+ returns(OracleSignatures memory)
17
+ {
18
+ // solhint-disable indent
19
+ OracleSignatures memory signatures;
20
+ ( signatures.vs, signatures.rs, signatures.ss) =
21
+ abi.decode(_oracleSignaturesData, ( uint8[], bytes32[], bytes32[] ));
22
+ return signatures;
23
+ }
24
+ }
@@ -0,0 +1,61 @@
1
+ pragma solidity 0.5.0;
2
+
3
+ /**
4
+ * @title The Owned contract
5
+ * @notice A contract with helpers for basic contract ownership.
6
+ */
7
+ contract Owned {
8
+
9
+ address public owner;
10
+ address private pendingOwner;
11
+
12
+ event OwnershipTransferRequested(
13
+ address indexed from,
14
+ address indexed to
15
+ );
16
+ event OwnershipTransfered(
17
+ address indexed from,
18
+ address indexed to
19
+ );
20
+
21
+ constructor() public {
22
+ owner = msg.sender;
23
+ }
24
+
25
+ /**
26
+ * @dev Allows an owner to begin transferring ownership to a new address,
27
+ * pending.
28
+ */
29
+ function transferOwnership(address _to)
30
+ external
31
+ onlyOwner()
32
+ {
33
+ pendingOwner = _to;
34
+
35
+ emit OwnershipTransferRequested(owner, _to);
36
+ }
37
+
38
+ /**
39
+ * @dev Allows an ownership transfer to be completed by the recipient.
40
+ */
41
+ function acceptOwnership()
42
+ external
43
+ {
44
+ require(msg.sender == pendingOwner, "Must be proposed owner");
45
+
46
+ address oldOwner = owner;
47
+ owner = msg.sender;
48
+ pendingOwner = address(0);
49
+
50
+ emit OwnershipTransfered(oldOwner, msg.sender);
51
+ }
52
+
53
+ /**
54
+ * @dev Reverts if called by anyone other than the contract owner.
55
+ */
56
+ modifier onlyOwner() {
57
+ require(msg.sender == owner, "Only callable by owner");
58
+ _;
59
+ }
60
+
61
+ }