Source

models/ProtocolMining/ProtocolMiningReward.js

  1. import { protocolMiningReward } from '../../interfaces';
  2. // import Numbers from '../../utils/Numbers';
  3. import IContract from '../IContract';
  4. /**
  5. * @typedef {Object} ProtocolMiningReward~Options
  6. * @property {Boolean} test
  7. * @property {Boolean} localtest ganache local blockchain
  8. * @property {Web3Connection} [web3Connection=Web3Connection]
  9. * created from params: 'test', 'localtest' and optional 'web3Connection' string and 'privateKey'
  10. * @property {string} [contractAddress]
  11. */
  12. /**
  13. * @class ProtocolMiningReward
  14. * @param {ProtocolMiningReward~Options} options
  15. * NOTE: to encode function signature we use 'web3.eth.abi.encodeFunctionSignature'
  16. * For example, for encoding transfer function of ERC20 token we do:
  17. * web3.eth.abi.encodeFunctionSignature('transfer(address,uint256)')
  18. * NOTE: to encode parameters for encoded call data we use
  19. * web3.eth.abi.encodeParameters(typesArray, valuesArray)
  20. * For example, for encoding transfer function parameters of ERC20 token we do:
  21. * web3.eth.abi.encodeParameters(['address','uint256'], [userAddress, transferTokenAmount])
  22. * userAddress, transferTokenAmount are variables holding user address and tokens amount.
  23. * NOTE: to encode function signature together with parameters as a single encoded call data
  24. * we use a combination of the two above.
  25. * Specific details on how to encode call data can be found in the unit test file.
  26. */
  27. class ProtocolMiningReward extends IContract {
  28. constructor(params = {}) {
  29. super({ abi: protocolMiningReward, ...params });
  30. }
  31. /**
  32. * Use a {@link protocolMiningReward} contract with the current address
  33. * @return {Promise<void>}
  34. */
  35. __assert = async () => {
  36. this.params.contract.use(protocolMiningReward, this.getAddress());
  37. // this.params.decimals = await this.getDecimalsAsync();
  38. };
  39. /**
  40. * Get Token Address
  41. * @returns {Address} address
  42. */
  43. getAddress() {
  44. return this.params.contractAddress;
  45. }
  46. /**
  47. * Get reward token address
  48. * @function
  49. * @returns {Promise<Address>}
  50. */
  51. rewardToken() {
  52. return this.getContract().methods.rewardToken().call();
  53. }
  54. /**
  55. * Get reward token default reward amount
  56. * @function
  57. * @returns {Promise<Integer>}
  58. */
  59. rewardAmount() {
  60. return this.getContract().methods.rewardAmount().call();
  61. }
  62. /**
  63. * Get encoded call reward token amount
  64. * @function
  65. * @param {Object} params Parameters
  66. * @param {string} params.callHash Encoded call hash as bytes32 string
  67. * @returns {Promise<Integer>} Reward token amount
  68. */
  69. callsRewardTokenAmount({ callHash }) {
  70. return this.getContract().methods.callsRewardTokenAmount(callHash).call();
  71. }
  72. /**
  73. * Get encoded function call hash
  74. * @function
  75. * @param {Object} params Parameters
  76. * @param {Address} params.target Smart contract address target
  77. * @param {string} params.funcSelector Function selector as byte4 string
  78. * @returns {Promise<string>} Call hash as bytes32 string
  79. */
  80. hashOperation({ target, funcSelector }) {
  81. return this.getContract().methods.hashOperation(target, funcSelector).call();
  82. }
  83. /**
  84. * Get encoded function call hash given encoded data with function selector
  85. * @function
  86. * @param {Object} params Parameters
  87. * @param {Address} params.target Smart contract address target
  88. * @param {string} params.callData Encoded call data with function selector and params
  89. * @returns {Promise<string>} Call hash as bytes32 string
  90. */
  91. hashOperationData({ target, callData }) {
  92. return this.getContract().methods.hashOperationData(target, callData).call();
  93. }
  94. /**
  95. * Get encoded function calls hashes as batch
  96. * @function
  97. * @param {Object} params Parameters
  98. * @param {Array<Address>} params.targets Smart contract addresses targets
  99. * @param {Array<string>} params.funcSelectors Function selectors as byte4 string
  100. * @returns {Promise<string>} Call hash as bytes32 string
  101. */
  102. hashOperationBatch({ targets, funcSelectors }) {
  103. return this.getContract().methods.hashOperationBatch(targets, funcSelectors).call();
  104. }
  105. /**
  106. * Get encoded function calls hashes as batch given encoded data with function selectors
  107. * @function
  108. * @param {Object} params Parameters
  109. * @param {Array<Address>} params.targets Smart contract addresses targets
  110. * @param {Array<string>} params.callDatas Encoded calls data with function selectors and params
  111. * @returns {Promise<string>} Call hash as bytes32 string
  112. */
  113. hashOperationBatchData({ targets, callDatas }) {
  114. return this.getContract().methods.hashOperationBatchData(targets, callDatas).call();
  115. }
  116. /**
  117. * Approve function call
  118. * @function
  119. * @param {Object} params Parameters
  120. * @param {Address} params.target Contract address to call
  121. * @param {string} params.funcSelector Target contract function selector
  122. * @param {Integer} params.rewardTokenAmount Token reward amount to sender
  123. * @returns {Promise<Transaction>} Transaction
  124. */
  125. approveCall({
  126. target,
  127. funcSelector,
  128. rewardTokenAmount,
  129. }, options) {
  130. return this.__sendTx(
  131. this.getContract().methods.approveCall(target, funcSelector, rewardTokenAmount),
  132. options,
  133. );
  134. }
  135. /**
  136. * Approve function call
  137. * @function
  138. * @param {Object} params Parameters
  139. * @param {Address} params.target Contract address to call
  140. * @param {string} params.callData Target contract encoded call data with function selector and params
  141. * @param {Integer} params.rewardTokenAmount Token reward amount to sender
  142. * @returns {Promise<Transaction>} Transaction
  143. */
  144. approveCallData({
  145. target,
  146. callData,
  147. rewardTokenAmount,
  148. }, options) {
  149. return this.__sendTx(
  150. this.getContract().methods.approveCallData(target, callData, rewardTokenAmount),
  151. options,
  152. );
  153. }
  154. /**
  155. * Approve function calls as batch
  156. * @function
  157. * @param {Object} params Parameters
  158. * @param {Array<Address>} params.targets Contract addresses to call
  159. * @param {Array<string>} params.funcSelectors Target contract function selectors
  160. * @param {Integer} params.rewardTokenAmount Token reward amount to sender
  161. * @returns {Promise<Transaction>} Transaction
  162. */
  163. approveBatch({
  164. targets,
  165. funcSelectors,
  166. rewardTokenAmount,
  167. }, options) {
  168. return this.__sendTx(
  169. this.getContract().methods.approveBatch(targets, funcSelectors, rewardTokenAmount),
  170. options,
  171. );
  172. }
  173. /**
  174. * Approve function calls as batch
  175. * @function
  176. * @param {Object} params Parameters
  177. * @param {Array<Address>} params.targets Contract addresses to call
  178. * @param {Array<string>} params.callDatas Target contract function selectors
  179. * @param {Integer} params.rewardTokenAmount Token reward amount to sender
  180. * @returns {Promise<Transaction>} Transaction
  181. */
  182. approveBatchData({
  183. targets,
  184. callDatas,
  185. rewardTokenAmount,
  186. }, options) {
  187. return this.__sendTx(
  188. this.getContract().methods.approveBatchData(targets, callDatas, rewardTokenAmount),
  189. options,
  190. );
  191. }
  192. /**
  193. * Disapprove function call
  194. * @function
  195. * @param {Object} params Parameters
  196. * @param {Address} params.target Contract address to call
  197. * @param {string} params.funcSelector Target contract function selector
  198. * @returns {Promise<Transaction>} Transaction
  199. */
  200. disapproveCall({
  201. target,
  202. funcSelector,
  203. }, options) {
  204. return this.__sendTx(
  205. this.getContract().methods.disapproveCall(target, funcSelector),
  206. options,
  207. );
  208. }
  209. /**
  210. * Disapprove function call with encoded call data
  211. * @function
  212. * @param {Object} params Parameters
  213. * @param {Address} params.target Contract address to call
  214. * @param {string} params.callData Target contract encoded call data with function selector and params
  215. * @returns {Promise<Transaction>} Transaction
  216. */
  217. disapproveCallData({
  218. target,
  219. callData,
  220. }, options) {
  221. return this.__sendTx(
  222. this.getContract().methods.disapproveCallData(target, callData),
  223. options,
  224. );
  225. }
  226. /**
  227. * Disapprove function calls as batch
  228. * @function
  229. * @param {Object} params Parameters
  230. * @param {Array<Address>} params.targets Contract addresses to call
  231. * @param {Array<string>} params.funcSelectors Target contract function selectors
  232. * @returns {Promise<Transaction>} Transaction
  233. */
  234. disapproveBatch({
  235. targets,
  236. funcSelectors,
  237. }, options) {
  238. return this.__sendTx(
  239. this.getContract().methods.disapproveBatch(targets, funcSelectors),
  240. options,
  241. );
  242. }
  243. /**
  244. * Disapprove function calls as batch with encoded call datas
  245. * @function
  246. * @param {Object} params Parameters
  247. * @param {Array<Address>} params.targets Contract addresses to call
  248. * @param {Array<string>} params.callDatas Target contract encoded call datas with function selectors and params
  249. * @returns {Promise<Transaction>} Transaction
  250. */
  251. disapproveBatchData({
  252. targets,
  253. callDatas,
  254. }, options) {
  255. return this.__sendTx(
  256. this.getContract().methods.disapproveBatchData(targets, callDatas),
  257. options,
  258. );
  259. }
  260. /**
  261. * Disapprove all function calls
  262. * @function
  263. * @returns {Promise<Transaction>} Transaction
  264. */
  265. disapproveAll(options) {
  266. return this.__sendTx(
  267. this.getContract().methods.disapproveAll(),
  268. options,
  269. );
  270. }
  271. /**
  272. * Execute call from approve function calls
  273. * @function
  274. * @param {Object} params Parameters
  275. * @param {Address} params.target Contract address to call
  276. * @param {string} params.funcSelector Target contract function selector
  277. * @param {string} params.callParam Target contract function params as encoded data
  278. * @returns {Promise<Transaction>} Transaction
  279. */
  280. execute({
  281. target,
  282. funcSelector,
  283. callParam,
  284. }, options) {
  285. return this.__sendTx(
  286. this.getContract().methods.execute(target, funcSelector, callParam),
  287. options,
  288. );
  289. }
  290. /**
  291. * Execute call from approve function calls with encoded call data
  292. * @function
  293. * @param {Object} params Parameters
  294. * @param {Address} params.target Contract address to call
  295. * @param {string} params.callData Target contract encoded call data with function selector and params
  296. * @returns {Promise<Transaction>} Transaction
  297. */
  298. executeData({
  299. target,
  300. callData,
  301. }, options) {
  302. return this.__sendTx(
  303. this.getContract().methods.executeData(target, callData),
  304. options,
  305. );
  306. }
  307. /**
  308. * Execute call from approve batch function calls
  309. * @function
  310. * @param {Object} params Parameters
  311. * @param {Array<Address>} params.targets Target contracts addresses
  312. * @param {Array<Integer>} params.values Eth values for each call
  313. * @param {Array<string>} params.funcSelectors Target contracts function selectors
  314. * @param {Array<string>} params.callParams Target contracts function params as encoded call datas
  315. * @returns {Promise<Transaction>} Transaction
  316. */
  317. executeBatch({
  318. targets,
  319. values,
  320. funcSelectors,
  321. callParams,
  322. }, options) {
  323. return this.__sendTx(
  324. this.getContract().methods.executeBatch(targets, values, funcSelectors, callParams),
  325. options,
  326. );
  327. }
  328. /**
  329. * Execute call from approve batch function calls with encoded call datas
  330. * @function
  331. * @param {Object} params Parameters
  332. * @param {Array<Address>} params.targets Contract address to call
  333. * @param {Array<Integer>} params.values eth values for each call
  334. * @param {Array<string>} params.callDatas Target contract encoded call datas with function selectors and params
  335. * @returns {Promise<Transaction>} Transaction
  336. */
  337. executeBatchData({
  338. targets,
  339. values,
  340. callDatas,
  341. }, options) {
  342. return this.__sendTx(
  343. this.getContract().methods.executeBatchData(targets, values, callDatas),
  344. options,
  345. );
  346. }
  347. /**
  348. * Get call hash as bytes32 given an index
  349. * @function
  350. * @param {Integer} i Index of approved call
  351. * @returns {Promise<string>} Call hash as bytes32 string
  352. */
  353. getCallHashByIndex(i) {
  354. return this.getContract().methods.getCallHashByIndex(i).call();
  355. }
  356. /**
  357. * Get calls array length
  358. * @function
  359. * @returns {Promise<Integer>} Calls count
  360. */
  361. callsCount() {
  362. return this.getContract().methods.callsCount().call();
  363. }
  364. /**
  365. * True if call hash is approved (exists), false otherwise
  366. * @param {Object} params Parameters
  367. * @param {string} params.callHash Call hash as bytes32 string
  368. * @returns {Promise<Boolean>} true if call hash exists, false otherwise
  369. */
  370. callApproved({ callHash }) {
  371. return this.getContract().methods.callApproved(callHash).call();
  372. }
  373. /**
  374. * Remove call by hash, call hash must be approved (exists)
  375. * @param {Object} params Parameters
  376. * @param {string} params.callHash Call hash as bytes32 string
  377. * @returns {Promise<Transaction>} Transaction
  378. */
  379. removeCallHash({ callHash }, options) {
  380. return this.__sendTx(
  381. this.getContract().methods.removeCallHash(callHash),
  382. options,
  383. );
  384. }
  385. /**
  386. * Deploy ERC20 Token
  387. * @function
  388. * @param {Object} params Parameters
  389. * @param {Address} params.rewardTokenAddress Reward token address
  390. * @param {Number} params.rewardTokenAmount Reward token amount
  391. * @param {IContract~TxOptions} options
  392. * @returns {Promise<Transaction>} Transaction
  393. */
  394. deploy = async ({ rewardTokenAddress, rewardTokenAmount }, options) => {
  395. if (!rewardTokenAddress) {
  396. throw new Error('Please provide a Reward erc20 token address');
  397. }
  398. if (!rewardTokenAmount) {
  399. throw new Error('Please provide a Reward erc20 token amount');
  400. }
  401. const params = [ rewardTokenAddress, rewardTokenAmount ];
  402. const res = await this.__deploy(params, options);
  403. this.params.contractAddress = res.contractAddress;
  404. /* Call to Backend API */
  405. await this.__assert();
  406. return res;
  407. };
  408. }
  409. export default ProtocolMiningReward;