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,19 @@
1
+ pragma solidity 0.4.24;
2
+
3
+ import "../interfaces/ChainlinkRequestInterface.sol";
4
+ import "../interfaces/OracleInterface.sol";
5
+
6
+ /* solhint-disable no-empty-blocks */
7
+
8
+ contract EmptyOracle is ChainlinkRequestInterface, OracleInterface {
9
+
10
+ function cancelOracleRequest(bytes32, uint256, bytes4, uint256) external {}
11
+ function fulfillOracleRequest(bytes32, uint256, address, bytes4, uint256, bytes32) external returns (bool) {}
12
+ function getAuthorizationStatus(address) external view returns (bool) { return false; }
13
+ function onTokenTransfer(address, uint256, bytes) external pure {}
14
+ function oracleRequest(address, uint256, bytes32, address, bytes4, uint256, uint256, bytes) external {}
15
+ function setFulfillmentPermission(address, bool) external {}
16
+ function withdraw(address, uint256) external {}
17
+ function withdrawable() external view returns (uint256) {}
18
+
19
+ }
@@ -0,0 +1,45 @@
1
+ pragma solidity 0.4.24;
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 _value) public {
27
+ getBytes = _value;
28
+ emit SetBytes(msg.sender, _value);
29
+ }
30
+
31
+ function requestedBytes(bytes32 _requestId, bytes _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,76 @@
1
+ pragma solidity 0.4.24;
2
+
3
+ import "../vendor/CBOR.sol";
4
+
5
+
6
+ library MaliciousChainlink {
7
+ using CBOR for Buffer.buffer;
8
+
9
+ struct Request {
10
+ bytes32 specId;
11
+ address callbackAddress;
12
+ bytes4 callbackFunctionId;
13
+ uint256 nonce;
14
+ Buffer.buffer buf;
15
+ }
16
+
17
+ struct WithdrawRequest {
18
+ bytes32 specId;
19
+ address callbackAddress;
20
+ bytes4 callbackFunctionId;
21
+ uint256 nonce;
22
+ Buffer.buffer buf;
23
+ }
24
+
25
+ function initializeWithdraw(
26
+ WithdrawRequest memory self,
27
+ bytes32 _specId,
28
+ address _callbackAddress,
29
+ bytes4 _callbackFunction
30
+ ) internal pure returns (MaliciousChainlink.WithdrawRequest memory) {
31
+ Buffer.init(self.buf, 128);
32
+ self.specId = _specId;
33
+ self.callbackAddress = _callbackAddress;
34
+ self.callbackFunctionId = _callbackFunction;
35
+ return self;
36
+ }
37
+
38
+ function add(Request memory self, string _key, string _value)
39
+ internal pure
40
+ {
41
+ self.buf.encodeString(_key);
42
+ self.buf.encodeString(_value);
43
+ }
44
+
45
+ function addBytes(Request memory self, string _key, bytes _value)
46
+ internal pure
47
+ {
48
+ self.buf.encodeString(_key);
49
+ self.buf.encodeBytes(_value);
50
+ }
51
+
52
+ function addInt(Request memory self, string _key, int256 _value)
53
+ internal pure
54
+ {
55
+ self.buf.encodeString(_key);
56
+ self.buf.encodeInt(_value);
57
+ }
58
+
59
+ function addUint(Request memory self, string _key, uint256 _value)
60
+ internal pure
61
+ {
62
+ self.buf.encodeString(_key);
63
+ self.buf.encodeUInt(_value);
64
+ }
65
+
66
+ function addStringArray(Request memory self, string _key, string[] memory _values)
67
+ internal pure
68
+ {
69
+ self.buf.encodeString(_key);
70
+ self.buf.startArray();
71
+ for (uint256 i = 0; i < _values.length; i++) {
72
+ self.buf.encodeString(_values[i]);
73
+ }
74
+ self.buf.endSequence();
75
+ }
76
+ }
@@ -0,0 +1,109 @@
1
+ pragma solidity 0.4.24;
2
+
3
+ import "./MaliciousChainlink.sol";
4
+ import "../Chainlinked.sol";
5
+ import "../vendor/SafeMath.sol";
6
+
7
+ contract MaliciousChainlinked is Chainlinked {
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] = oracleAddress();
32
+ emit ChainlinkRequested(requestId);
33
+ LinkTokenInterface link = LinkTokenInterface(chainlinkToken());
34
+ require(link.transferAndCall(oracleAddress(), _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] = oracleAddress();
47
+ emit ChainlinkRequested(requestId);
48
+ LinkTokenInterface link = LinkTokenInterface(chainlinkToken());
49
+ require(link.transferAndCall(oracleAddress(), _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] = oracleAddress();
62
+ emit ChainlinkRequested(requestId);
63
+ LinkTokenInterface link = LinkTokenInterface(chainlinkToken());
64
+ require(link.transferAndCall(oracleAddress(), _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.4.24;
2
+
3
+
4
+ import "../Chainlinked.sol";
5
+
6
+
7
+ contract MaliciousConsumer is Chainlinked {
8
+ uint256 constant private ORACLE_PAYMENT = 1 * LINK;
9
+ uint256 private expiration;
10
+
11
+ constructor(address _link, address _oracle) public payable {
12
+ setLinkToken(_link);
13
+ setOracle(_oracle);
14
+ }
15
+
16
+ function () public payable {} // solhint-disable-line no-empty-blocks
17
+
18
+ function requestData(bytes32 _id, bytes _callbackFunc) public {
19
+ Chainlink.Request memory req = newRequest(_id, this, bytes4(keccak256(_callbackFunc)));
20
+ expiration = now.add(5 minutes); // solhint-disable-line not-rely-on-time
21
+ chainlinkRequest(req, ORACLE_PAYMENT);
22
+ }
23
+
24
+ function assertFail(bytes32, bytes32) public pure {
25
+ assert(1 == 2);
26
+ }
27
+
28
+ function cancelRequestOnFulfill(bytes32 _requestId, bytes32) public {
29
+ cancelChainlinkRequest(
30
+ _requestId,
31
+ ORACLE_PAYMENT,
32
+ this.cancelRequestOnFulfill.selector,
33
+ expiration);
34
+ }
35
+
36
+ function remove() public {
37
+ selfdestruct(address(0));
38
+ }
39
+
40
+ function stealEthCall(bytes32 _requestId, bytes32) public recordChainlinkFulfillment(_requestId) {
41
+ require(address(this).call.value(100)(), "Call failed"); // solhint-disable-line avoid-call-value
42
+ }
43
+
44
+ function stealEthSend(bytes32 _requestId, bytes32) public recordChainlinkFulfillment(_requestId) {
45
+ // solhint-disable-next-line check-send-result
46
+ require(address(this).send(100), "Send failed"); // solhint-disable-line multiple-sends
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.4.24;
2
+
3
+
4
+ import "./MaliciousChainlinked.sol";
5
+
6
+
7
+ contract MaliciousRequester is MaliciousChainlinked {
8
+
9
+ uint256 constant private ORACLE_PAYMENT = 1 * LINK;
10
+ uint256 private expiration;
11
+
12
+ constructor(address _link, address _oracle) public {
13
+ setLinkToken(_link);
14
+ setOracle(_oracle);
15
+ }
16
+
17
+ function maliciousWithdraw()
18
+ public
19
+ {
20
+ MaliciousChainlink.WithdrawRequest memory req = newWithdrawRequest(
21
+ "specId", this, this.doesNothing.selector);
22
+ chainlinkWithdrawRequest(req, ORACLE_PAYMENT);
23
+ }
24
+
25
+ function request(bytes32 _id, address _target, bytes _callbackFunc) public returns (bytes32 requestId) {
26
+ Chainlink.Request memory req = newRequest(_id, _target, bytes4(keccak256(_callbackFunc)));
27
+ expiration = now.add(5 minutes); // solhint-disable-line not-rely-on-time
28
+ requestId = chainlinkRequest(req, ORACLE_PAYMENT);
29
+ }
30
+
31
+ function maliciousPrice(bytes32 _id) public returns (bytes32 requestId) {
32
+ Chainlink.Request memory req = newRequest(_id, 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 = newRequest("specId", _target, bytes4(keccak256("fulfill(bytes32,bytes32)")));
38
+ requestId = chainlinkTargetRequest(_target, req, ORACLE_PAYMENT);
39
+ }
40
+
41
+ function maliciousRequestCancel(bytes32 _id, bytes _callbackFunc) public {
42
+ ChainlinkRequestInterface oracle = ChainlinkRequestInterface(oracleAddress());
43
+ oracle.cancelOracleRequest(
44
+ request(_id, 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,24 @@
1
+ pragma solidity 0.4.24;
2
+
3
+ import "./Consumer.sol";
4
+
5
+ contract UpdatableConsumer is Consumer {
6
+
7
+ constructor(bytes32 _specId, address _ens, bytes32 _node) public {
8
+ specId = _specId;
9
+ useChainlinkWithENS(_ens, _node);
10
+ }
11
+
12
+ function updateOracle() public {
13
+ updateChainlinkOracleWithENS();
14
+ }
15
+
16
+ function getChainlinkToken() public view returns (address) {
17
+ return chainlinkTokenAddress();
18
+ }
19
+
20
+ function getOracle() public view returns (address) {
21
+ return chainlinkOracleAddress();
22
+ }
23
+
24
+ }
@@ -0,0 +1,301 @@
1
+ pragma solidity >0.4.18;
2
+
3
+ /**
4
+ * @dev A library for working with mutable byte buffers in Solidity.
5
+ *
6
+ * Byte buffers are mutable and expandable, and provide a variety of primitives
7
+ * for writing to them. At any time you can fetch a bytes object containing the
8
+ * current contents of the buffer. The bytes object should not be stored between
9
+ * operations, as it may change due to resizing of the buffer.
10
+ */
11
+ library Buffer {
12
+ /**
13
+ * @dev Represents a mutable buffer. Buffers have a current value (buf) and
14
+ * a capacity. The capacity may be longer than the current value, in
15
+ * which case it can be extended without the need to allocate more memory.
16
+ */
17
+ struct buffer {
18
+ bytes buf;
19
+ uint capacity;
20
+ }
21
+
22
+ /**
23
+ * @dev Initializes a buffer with an initial capacity.
24
+ * @param buf The buffer to initialize.
25
+ * @param capacity The number of bytes of space to allocate the buffer.
26
+ * @return The buffer, for chaining.
27
+ */
28
+ function init(buffer memory buf, uint capacity) internal pure returns(buffer memory) {
29
+ if (capacity % 32 != 0) {
30
+ capacity += 32 - (capacity % 32);
31
+ }
32
+ // Allocate space for the buffer data
33
+ buf.capacity = capacity;
34
+ assembly {
35
+ let ptr := mload(0x40)
36
+ mstore(buf, ptr)
37
+ mstore(ptr, 0)
38
+ mstore(0x40, add(32, add(ptr, capacity)))
39
+ }
40
+ return buf;
41
+ }
42
+
43
+ /**
44
+ * @dev Initializes a new buffer from an existing bytes object.
45
+ * Changes to the buffer may mutate the original value.
46
+ * @param b The bytes object to initialize the buffer with.
47
+ * @return A new buffer.
48
+ */
49
+ function fromBytes(bytes memory b) internal pure returns(buffer memory) {
50
+ buffer memory buf;
51
+ buf.buf = b;
52
+ buf.capacity = b.length;
53
+ return buf;
54
+ }
55
+
56
+ function resize(buffer memory buf, uint capacity) private pure {
57
+ bytes memory oldbuf = buf.buf;
58
+ init(buf, capacity);
59
+ append(buf, oldbuf);
60
+ }
61
+
62
+ function max(uint a, uint b) private pure returns(uint) {
63
+ if (a > b) {
64
+ return a;
65
+ }
66
+ return b;
67
+ }
68
+
69
+ /**
70
+ * @dev Sets buffer length to 0.
71
+ * @param buf The buffer to truncate.
72
+ * @return The original buffer, for chaining..
73
+ */
74
+ function truncate(buffer memory buf) internal pure returns (buffer memory) {
75
+ assembly {
76
+ let bufptr := mload(buf)
77
+ mstore(bufptr, 0)
78
+ }
79
+ return buf;
80
+ }
81
+
82
+ /**
83
+ * @dev Writes a byte string to a buffer. Resizes if doing so would exceed
84
+ * the capacity of the buffer.
85
+ * @param buf The buffer to append to.
86
+ * @param off The start offset to write to.
87
+ * @param data The data to append.
88
+ * @param len The number of bytes to copy.
89
+ * @return The original buffer, for chaining.
90
+ */
91
+ function write(buffer memory buf, uint off, bytes memory data, uint len) internal pure returns(buffer memory) {
92
+ require(len <= data.length);
93
+
94
+ if (off + len > buf.capacity) {
95
+ resize(buf, max(buf.capacity, len + off) * 2);
96
+ }
97
+
98
+ uint dest;
99
+ uint src;
100
+ assembly {
101
+ // Memory address of the buffer data
102
+ let bufptr := mload(buf)
103
+ // Length of existing buffer data
104
+ let buflen := mload(bufptr)
105
+ // Start address = buffer address + offset + sizeof(buffer length)
106
+ dest := add(add(bufptr, 32), off)
107
+ // Update buffer length if we're extending it
108
+ if gt(add(len, off), buflen) {
109
+ mstore(bufptr, add(len, off))
110
+ }
111
+ src := add(data, 32)
112
+ }
113
+
114
+ // Copy word-length chunks while possible
115
+ for (; len >= 32; len -= 32) {
116
+ assembly {
117
+ mstore(dest, mload(src))
118
+ }
119
+ dest += 32;
120
+ src += 32;
121
+ }
122
+
123
+ // Copy remaining bytes
124
+ uint mask = 256 ** (32 - len) - 1;
125
+ assembly {
126
+ let srcpart := and(mload(src), not(mask))
127
+ let destpart := and(mload(dest), mask)
128
+ mstore(dest, or(destpart, srcpart))
129
+ }
130
+
131
+ return buf;
132
+ }
133
+
134
+ /**
135
+ * @dev Appends a byte string to a buffer. Resizes if doing so would exceed
136
+ * the capacity of the buffer.
137
+ * @param buf The buffer to append to.
138
+ * @param data The data to append.
139
+ * @param len The number of bytes to copy.
140
+ * @return The original buffer, for chaining.
141
+ */
142
+ function append(buffer memory buf, bytes memory data, uint len) internal pure returns (buffer memory) {
143
+ return write(buf, buf.buf.length, data, len);
144
+ }
145
+
146
+ /**
147
+ * @dev Appends a byte string to a buffer. Resizes if doing so would exceed
148
+ * the capacity of the buffer.
149
+ * @param buf The buffer to append to.
150
+ * @param data The data to append.
151
+ * @return The original buffer, for chaining.
152
+ */
153
+ function append(buffer memory buf, bytes memory data) internal pure returns (buffer memory) {
154
+ return write(buf, buf.buf.length, data, data.length);
155
+ }
156
+
157
+ /**
158
+ * @dev Writes a byte to the buffer. Resizes if doing so would exceed the
159
+ * capacity of the buffer.
160
+ * @param buf The buffer to append to.
161
+ * @param off The offset to write the byte at.
162
+ * @param data The data to append.
163
+ * @return The original buffer, for chaining.
164
+ */
165
+ function writeUint8(buffer memory buf, uint off, uint8 data) internal pure returns(buffer memory) {
166
+ if (off >= buf.capacity) {
167
+ resize(buf, buf.capacity * 2);
168
+ }
169
+
170
+ assembly {
171
+ // Memory address of the buffer data
172
+ let bufptr := mload(buf)
173
+ // Length of existing buffer data
174
+ let buflen := mload(bufptr)
175
+ // Address = buffer address + sizeof(buffer length) + off
176
+ let dest := add(add(bufptr, off), 32)
177
+ mstore8(dest, data)
178
+ // Update buffer length if we extended it
179
+ if eq(off, buflen) {
180
+ mstore(bufptr, add(buflen, 1))
181
+ }
182
+ }
183
+ return buf;
184
+ }
185
+
186
+ /**
187
+ * @dev Appends a byte to the buffer. Resizes if doing so would exceed the
188
+ * capacity of the buffer.
189
+ * @param buf The buffer to append to.
190
+ * @param data The data to append.
191
+ * @return The original buffer, for chaining.
192
+ */
193
+ function appendUint8(buffer memory buf, uint8 data) internal pure returns(buffer memory) {
194
+ return writeUint8(buf, buf.buf.length, data);
195
+ }
196
+
197
+ /**
198
+ * @dev Writes up to 32 bytes to the buffer. Resizes if doing so would
199
+ * exceed the capacity of the buffer.
200
+ * @param buf The buffer to append to.
201
+ * @param off The offset to write at.
202
+ * @param data The data to append.
203
+ * @param len The number of bytes to write (left-aligned).
204
+ * @return The original buffer, for chaining.
205
+ */
206
+ function write(buffer memory buf, uint off, bytes32 data, uint len) private pure returns(buffer memory) {
207
+ if (len + off > buf.capacity) {
208
+ resize(buf, (len + off) * 2);
209
+ }
210
+
211
+ uint mask = 256 ** len - 1;
212
+ // Right-align data
213
+ data = data >> (8 * (32 - len));
214
+ assembly {
215
+ // Memory address of the buffer data
216
+ let bufptr := mload(buf)
217
+ // Address = buffer address + sizeof(buffer length) + off + len
218
+ let dest := add(add(bufptr, off), len)
219
+ mstore(dest, or(and(mload(dest), not(mask)), data))
220
+ // Update buffer length if we extended it
221
+ if gt(add(off, len), mload(bufptr)) {
222
+ mstore(bufptr, add(off, len))
223
+ }
224
+ }
225
+ return buf;
226
+ }
227
+
228
+ /**
229
+ * @dev Writes a bytes20 to the buffer. Resizes if doing so would exceed the
230
+ * capacity of the buffer.
231
+ * @param buf The buffer to append to.
232
+ * @param off The offset to write at.
233
+ * @param data The data to append.
234
+ * @return The original buffer, for chaining.
235
+ */
236
+ function writeBytes20(buffer memory buf, uint off, bytes20 data) internal pure returns (buffer memory) {
237
+ return write(buf, off, bytes32(data), 20);
238
+ }
239
+
240
+ /**
241
+ * @dev Appends a bytes20 to the buffer. Resizes if doing so would exceed
242
+ * the capacity of the buffer.
243
+ * @param buf The buffer to append to.
244
+ * @param data The data to append.
245
+ * @return The original buffer, for chhaining.
246
+ */
247
+ function appendBytes20(buffer memory buf, bytes20 data) internal pure returns (buffer memory) {
248
+ return write(buf, buf.buf.length, bytes32(data), 20);
249
+ }
250
+
251
+ /**
252
+ * @dev Appends a bytes32 to the buffer. Resizes if doing so would exceed
253
+ * the capacity of the buffer.
254
+ * @param buf The buffer to append to.
255
+ * @param data The data to append.
256
+ * @return The original buffer, for chaining.
257
+ */
258
+ function appendBytes32(buffer memory buf, bytes32 data) internal pure returns (buffer memory) {
259
+ return write(buf, buf.buf.length, data, 32);
260
+ }
261
+
262
+ /**
263
+ * @dev Writes an integer to the buffer. Resizes if doing so would exceed
264
+ * the capacity of the buffer.
265
+ * @param buf The buffer to append to.
266
+ * @param off The offset to write at.
267
+ * @param data The data to append.
268
+ * @param len The number of bytes to write (right-aligned).
269
+ * @return The original buffer, for chaining.
270
+ */
271
+ function writeInt(buffer memory buf, uint off, uint data, uint len) private pure returns(buffer memory) {
272
+ if (len + off > buf.capacity) {
273
+ resize(buf, (len + off) * 2);
274
+ }
275
+
276
+ uint mask = 256 ** len - 1;
277
+ assembly {
278
+ // Memory address of the buffer data
279
+ let bufptr := mload(buf)
280
+ // Address = buffer address + off + sizeof(buffer length) + len
281
+ let dest := add(add(bufptr, off), len)
282
+ mstore(dest, or(and(mload(dest), not(mask)), data))
283
+ // Update buffer length if we extended it
284
+ if gt(add(off, len), mload(bufptr)) {
285
+ mstore(bufptr, add(off, len))
286
+ }
287
+ }
288
+ return buf;
289
+ }
290
+
291
+ /**
292
+ * @dev Appends a byte to the end of the buffer. Resizes if doing so would
293
+ * exceed the capacity of the buffer.
294
+ * @param buf The buffer to append to.
295
+ * @param data The data to append.
296
+ * @return The original buffer.
297
+ */
298
+ function appendInt(buffer memory buf, uint data, uint len) internal pure returns(buffer memory) {
299
+ return writeInt(buf, buf.buf.length, data, len);
300
+ }
301
+ }