Last active
March 20, 2019 15:07
-
-
Save bumi/7452de4ae3ec3d70b0709c7c26a404e2 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
pragma solidity ^0.5.6; | |
contract Auth { | |
enum Op { NONE, EQ, NEQ, GT, LT, GTE, LTE, RET, NOT, AND, OR, XOR, IF_ELSE } | |
bytes32 paramHash; | |
mapping (bytes32 => bytes32) public permissions; // permissions hash => params hash | |
mapping (bytes32 => Param[]) public permissionParams; // params hash => params | |
uint256[] public params; | |
struct Param { | |
uint8 id; | |
uint8 op; | |
uint240 value; // even though value is an uint240 it can store addresses | |
// in the case of 32 byte hashes losing 2 bytes precision isn't a huge deal | |
// op and id take less than 1 byte each so it can be kept in 1 sstore | |
} | |
function createParam() public returns (uint256[] memory) { | |
params = new uint256[](3); | |
params[0] = uint8(205); | |
params[1] = uint8(1); | |
params[2] = uint240(50); | |
return params; | |
Param memory p = Param(1, 6, 300); | |
//return uint256(p); | |
//return uint240(50); | |
//return uint256(uint8(205)); | |
//return uint256(uint8(1) & uint8(6) & uint240(300)); | |
} | |
function toUint240(uint256 a) public pure returns (uint240) { | |
return uint240(a); | |
} | |
function getOp() public pure returns (uint8) { | |
return uint8(Op.EQ); | |
} | |
function createAndDecodeParam() pure public returns (uint8, uint8, uint240) { | |
uint256 param; | |
uint8 id = uint8(1); | |
uint8 op = uint8(6); | |
uint240 v = uint240(300); | |
param = uint256(id) << 248 | uint256(op) << 240 | v; | |
return decodeParam(param); | |
} | |
function decodeParam(uint256 encodedParam) pure public returns (uint8, uint8, uint240) { | |
Param memory param = Param(decodeParamId(encodedParam), decodeParamOp(encodedParam), uint240(encodedParam)); | |
return (param.id, param.op, param.value); | |
} | |
function _saveParams(uint256[] memory _encodedParams) public returns (bytes32) { | |
paramHash = keccak256(abi.encodePacked(_encodedParams)); | |
Param[] storage params = permissionParams[paramHash]; | |
if (params.length == 0) { // params not saved before | |
for (uint256 i = 0; i < _encodedParams.length; i++) { | |
uint256 encodedParam = _encodedParams[i]; | |
Param memory param = Param(decodeParamId(encodedParam), decodeParamOp(encodedParam), uint240(encodedParam)); | |
params.push(param); | |
} | |
} | |
return paramHash; | |
} | |
function decodeParamOp(uint256 _x) public pure returns (uint8 b) { | |
return uint8(_x >> (8 * 30)); | |
} | |
function decodeParamId(uint256 _x) public pure returns (uint8 b) { | |
return uint8(_x >> (8 * 31)); | |
} | |
function decodeParamsList(uint256 _x) public pure returns (uint32 a, uint32 b, uint32 c) { | |
a = uint32(_x); | |
b = uint32(_x >> (8 * 4)); | |
c = uint32(_x >> (8 * 8)); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment