Advertisement
Guest User

Untitled

a guest
Mar 25th, 2019
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.87 KB | None | 0 0
  1. pragma solidity ^0.5.6;
  2.  
  3.  
  4. contract Auth {
  5.  
  6. enum Op { NONE, EQ, NEQ, GT, LT, GTE, LTE, RET, NOT, AND, OR, XOR, IF_ELSE }
  7.  
  8. bytes32 paramHash;
  9. mapping (bytes32 => bytes32) public permissions; // permissions hash => params hash
  10. mapping (bytes32 => Param[]) public permissionParams; // params hash => params
  11.  
  12. uint256[] public params;
  13.  
  14. struct Param {
  15. uint8 id;
  16. uint8 op;
  17. uint240 value; // even though value is an uint240 it can store addresses
  18. // in the case of 32 byte hashes losing 2 bytes precision isn't a huge deal
  19. // op and id take less than 1 byte each so it can be kept in 1 sstore
  20. }
  21.  
  22. function createParam() public returns (uint256[] memory) {
  23. params = new uint256[](3);
  24. params[0] = uint8(205);
  25. params[1] = uint8(1);
  26. params[2] = uint240(50);
  27. return params;
  28. Param memory p = Param(1, 6, 300);
  29. //return uint256(p);
  30. //return uint240(50);
  31. //return uint256(uint8(205));
  32. //return uint256(uint8(1) & uint8(6) & uint240(300));
  33.  
  34. }
  35.  
  36. function toUint240(uint256 a) public pure returns (uint240) {
  37. return uint240(a);
  38. }
  39.  
  40.  
  41. function getOp() public pure returns (uint8) {
  42. return uint8(Op.EQ);
  43. }
  44.  
  45. function createAndDecodeParam() pure public returns (uint8, uint8, uint240) {
  46. uint256 param;
  47. uint8 id = uint8(1);
  48. uint8 op = uint8(6);
  49. uint240 v = uint240(300);
  50.  
  51.  
  52. param = uint256(id) << 248 | uint256(op) << 240 | v;
  53.  
  54. return decodeParam(param);
  55. }
  56.  
  57. function decodeParam(uint256 encodedParam) pure public returns (uint8, uint8, uint240) {
  58. Param memory param = Param(decodeParamId(encodedParam), decodeParamOp(encodedParam), uint240(encodedParam));
  59. return (param.id, param.op, param.value);
  60. }
  61.  
  62. function _saveParams(uint256[] memory _encodedParams) public returns (bytes32) {
  63. paramHash = keccak256(abi.encodePacked(_encodedParams));
  64. Param[] storage params = permissionParams[paramHash];
  65.  
  66. if (params.length == 0) { // params not saved before
  67. for (uint256 i = 0; i < _encodedParams.length; i++) {
  68. uint256 encodedParam = _encodedParams[i];
  69. Param memory param = Param(decodeParamId(encodedParam), decodeParamOp(encodedParam), uint240(encodedParam));
  70. params.push(param);
  71. }
  72. }
  73.  
  74. return paramHash;
  75. }
  76.  
  77. function decodeParamOp(uint256 _x) public pure returns (uint8 b) {
  78. return uint8(_x >> (8 * 30));
  79. }
  80.  
  81. function decodeParamId(uint256 _x) public pure returns (uint8 b) {
  82. return uint8(_x >> (8 * 31));
  83. }
  84.  
  85. function decodeParamsList(uint256 _x) public pure returns (uint32 a, uint32 b, uint32 c) {
  86. a = uint32(_x);
  87. b = uint32(_x >> (8 * 4));
  88. c = uint32(_x >> (8 * 8));
  89. }
  90.  
  91.  
  92. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement