Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactor/reviewing contract code and comments #234

Merged
merged 12 commits into from Aug 26, 2019

Updating additional comments and make a few naming changes.

  • Loading branch information
Freydal committed Aug 26, 2019
commit 7f452e0e1ab5cc2541ee3256e36a5daa08e20ba6
@@ -6,108 +6,84 @@ import "../event/EventEmitter.sol";

/** @title PosterRegistry
@author Freydal
@dev Implementation contract for the PosterRegistry, allowing users to bond and un-bond tokens.
@dev The PosterRegistry allows accounts to manage tokens registered rewarding permission to post orders to the kosu network.
*/
contract PosterRegistry {
using SafeMath for uint;

mapping(address => uint) private _balances;
uint private _tokensContributed = 0;
KosuToken private _kosuToken;
Treasury private _treasury;
uint public tokensContributed = 0;
KosuToken public kosuToken;
Treasury public treasury;
EventEmitter private e;

/** @dev Creates a new PosterRegistry
@notice Creates a new PosterRegistry
@param _treasuryAddress Deployed Treasury contract address
@param _events Deployed Events contract address
/** @dev Initializes the PosterRegistry with the treasury and EventEmitter addresses.
@notice Initializes the PosterRegistry with the treasury and EventEmitter addresses.
@param _treasuryAddress Treasury contract address.
@param _events Deployed Events contract address.
*/
constructor(address payable _treasuryAddress, address _events) public {
_treasury = Treasury(_treasuryAddress);
_kosuToken = _treasury.kosuToken();
treasury = Treasury(_treasuryAddress);
kosuToken = treasury.kosuToken();
e = EventEmitter(_events);
}

/** @dev Fallback payable function to allow for direct deposit of ether to generate and claim tokens for Posting to Kosu network
@notice Fallback payable function to allow for direct deposit of ether to generate and claim tokens for Posting to Kosu network
/** @dev Fallback payable function allows for direct deposit of ether to generate tokens to be registered for Posting to Kosu network.
@notice Fallback payable function allows for direct deposit of ether to generate tokens to be registered for Posting to Kosu network.
*/
function () external payable {
uint amount = _treasury.contractBond.value(msg.value)(msg.sender);
_treasury.claimTokens(msg.sender, amount);
_tokensContributed = _tokensContributed.add(amount);
uint amount = treasury.contractBond.value(msg.value)(msg.sender);
treasury.claimTokens(msg.sender, amount);
tokensContributed = tokensContributed.add(amount);
_balances[msg.sender] = _balances[msg.sender].add(amount);
emitEvent(msg.sender);
_emitEvent(msg.sender);
}

/** @dev The number of tokens that have been contributed to the contract
@notice The number of tokens that have been contributed to the contract
@return Total number of tokens contributed.
*/
function tokensContributed() external view returns (uint) {
return _tokensContributed;
}

/** @dev The token address.
@notice The token address.
@return KosuToken address.
*/
function token() external view returns (address) {
return address(_kosuToken);
}

/** @dev The Treasury address.
@notice The Treasury address.
@return Deployed Treasury address.
*/
function treasury() external view returns (address) {
return address(_treasury);
}

/** @dev Tokens registered for a user.
@notice Tokens registered for a user.
@param a Address to get value for
/** @dev Tokens registered for an account.
@notice Tokens registered for an account.
@param a Address to get value for.
@return Tokens registered for address.
*/
function tokensRegisteredFor(address a) external view returns (uint) {
return tokensFor(a);
return _tokensFor(a);
}

/** @dev Register tokens.
@notice Register tokens.
@param amount Number of tokens to register
/** @dev Register tokens for posting permissions.
@notice Register tokens for posting permissions.
@param amount Number of tokens to register.
*/
function registerTokens(uint amount) external {
//Claim tokens from the treasury, delivering them to this contract and accounting for the balances locally.
_treasury.claimTokens(msg.sender, amount);
_tokensContributed = _tokensContributed.add(amount);
treasury.claimTokens(msg.sender, amount);
tokensContributed = tokensContributed.add(amount);
_balances[msg.sender] = _balances[msg.sender].add(amount);
emitEvent(msg.sender);
_emitEvent(msg.sender);
}

/** @dev Release tokens from the registry.
@notice Release tokens from the registry.
@param amount Number of tokens to release
@param amount Number of tokens to release.
*/
function releaseTokens(uint amount) external {
//Approve treasury to take tokens from this contract, treasury takes tokens and updates accounting.
_kosuToken.approve(address(_treasury), amount);
_treasury.releaseTokens(msg.sender, amount);
kosuToken.approve(address(treasury), amount);
treasury.releaseTokens(msg.sender, amount);
_balances[msg.sender] = _balances[msg.sender].sub(amount);
_tokensContributed = _tokensContributed.sub(amount);
emitEvent(msg.sender);
tokensContributed = tokensContributed.sub(amount);
_emitEvent(msg.sender);
}

// Internal

function emitEvent(address a) internal {
function _emitEvent(address a) internal {
//Emits an event for the address that made a change and the new current balance.
bytes32[] memory data = new bytes32[](2);
data[0] = bytes32(uint(a));
data[1] = bytes32(tokensFor(a));
data[1] = bytes32(_tokensFor(a));
e.emitEvent("PosterRegistryUpdate", data, "");
}

function tokensFor(address a) internal view returns (uint) {
function _tokensFor(address a) internal view returns (uint) {
return _balances[a];
}
}
@@ -10,7 +10,7 @@ import "@0x/contracts-exchange-libs/contracts/src/LibOrder.sol";

/** @title ZeroExV2SubContract
@author Freydal
@dev Implementation of a sub contract that forwards a 0x - kosu order to the zero ex contract system
@dev Implementation of a SubContract that forwards kosu orders with 0x resolution to the 0x exchange contract.
*/
contract ZeroExV2SubContract is SubContract {
using BytesDecoder for bytes;
@@ -21,8 +21,8 @@ contract ZeroExV2SubContract is SubContract {
string private _arguments;
bytes4 private ERC20bytes = bytes4(keccak256("ERC20Token(address)"));

/** @dev Constructor
@notice Constructor
/** @dev Initialize subContract with arguments json 0x Exchange address and the 0x erc20 proxy address.
@notice Initialize subContract with arguments json 0x Exchange address and the 0x erc20 proxy address.
@param args The arguments json string.
@param exchangeAddress The 0x deployed exchange address.
@param proxyAddress The 0x deployed erc20 proxy address.
@@ -33,8 +33,8 @@ contract ZeroExV2SubContract is SubContract {
_proxy = proxyAddress;
}

/** @dev The arguments used to serialize kosu orders.
@notice The arguments used to serialize kosu orders.
/** @dev The arguments used to serialize kosu orders into values to generate the 0x exchange transaction.
@notice The arguments used to serialize kosu orders into values to generate the 0x exchange transaction.
@return String encoded JSON object used to encode contract input.
*/
function arguments() external view returns (string memory) {
@@ -47,7 +47,7 @@ contract ZeroExV2SubContract is SubContract {
@return Validity of order.
*/
function isValid(bytes calldata data) external view returns (bool) {
LibOrder.Order memory order = getOrder(data);
LibOrder.Order memory order = _getOrder(data);
LibOrder.OrderInfo memory info = _exchange.getOrderInfo(order);
return info.orderStatus == uint8(LibOrder.OrderStatus.FILLABLE);
}
@@ -58,34 +58,34 @@ contract ZeroExV2SubContract is SubContract {
@return Tokens remaining to fill.
*/
function amountRemaining(bytes calldata data) external view returns (uint) {
LibOrder.Order memory order = getOrder(data);
LibOrder.Order memory order = _getOrder(data);
LibOrder.OrderInfo memory info = _exchange.getOrderInfo(order);
return order.takerAssetAmount - info.orderTakerAssetFilledAmount;
}

/** @dev De-serializes ksou order data to 0x order and submits to the 0x exchange.
@notice De-serializes ksou order data to 0x order and submits to the 0x exchange.
/** @dev De-serializes ksou order data to 0x order and submits to the 0x exchange for final resolution. Finalizes by forwarding along any successfully exchanged tokens.
@notice De-serializes ksou order data to 0x order and submits to the 0x exchange for final resolution. Finalizes by forwarding along any successfully exchanged tokens.
@param data Kosu order data serialized with arguments.
@return Fill success.
*/
function participate(bytes calldata data) external returns (bool) {
LibOrder.Order memory order = getOrder(data);
LibOrder.Order memory order = _getOrder(data);
address taker = data.getAddress(410);
uint takeAmount = data.getUint(430);

require(taker == tx.origin, "The taker should send the transaction");

// TODO May want to use a different method since 0x started doing something different for gas reasons.
require(getTokenAssetCode(order.makerAssetData.getBytes(0, 4)) == ERC20bytes, "Maker token asset isn't ERC20");
require(getTokenAssetCode(order.takerAssetData.getBytes(0, 4)) == ERC20bytes, "Taker token asset isn't ERC20");
require(_getTokenAssetCode(order.makerAssetData.getBytes(0, 4)) == ERC20bytes, "Maker token asset isn't ERC20");
require(_getTokenAssetCode(order.takerAssetData.getBytes(0, 4)) == ERC20bytes, "Taker token asset isn't ERC20");

IERC20 makerToken = IERC20(order.makerAssetData.getAddress(16));
IERC20 takerToken = IERC20(order.takerAssetData.getAddress(16));

takerToken.transferFrom(taker, address(this), takeAmount);
takerToken.approve(_proxy, takeAmount);

LibFillResults.FillResults memory fillResult = _exchange.fillOrder(order, takeAmount, getSignature(data));
LibFillResults.FillResults memory fillResult = _exchange.fillOrder(order, takeAmount, _getSignature(data));

if (fillResult.makerAssetFilledAmount > 0) {
require(makerToken.transfer(taker, fillResult.makerAssetFilledAmount), "Didn't successfully forward exchanged tokens. Reverting.");
@@ -100,7 +100,7 @@ contract ZeroExV2SubContract is SubContract {

/** @dev Internal function to deserialize the Order data from the input bytes.
*/
function getOrder(bytes memory data) internal pure returns (LibOrder.Order memory) {
function _getOrder(bytes memory data) internal pure returns (LibOrder.Order memory) {
return LibOrder.Order(
data.getAddress(0),
data.getAddress(20),
@@ -119,13 +119,13 @@ contract ZeroExV2SubContract is SubContract {

/** @dev Internal function to deserialize the 0x signature from the input bytes.
*/
function getSignature(bytes memory data) internal returns (bytes memory) {
function _getSignature(bytes memory data) internal returns (bytes memory) {
return data.getBytes(344, 66); // Special 0x signature with a trailing code representing the signature type.
}

/** @dev Internal function to read the token asset code
*/
function getTokenAssetCode(bytes memory data) internal pure returns (bytes4 outBytes4) {
function _getTokenAssetCode(bytes memory data) internal pure returns (bytes4 outBytes4) {
if (data.length == 0) {
return 0x0;
}
ProTip! Use n and p to navigate between commits in a pull request.
You can’t perform that action at this time.