aboutsummaryrefslogtreecommitdiffstats
path: root/test/compilationTests/zeppelin/token/LimitedTransferToken.sol
diff options
context:
space:
mode:
Diffstat (limited to 'test/compilationTests/zeppelin/token/LimitedTransferToken.sol')
-rw-r--r--test/compilationTests/zeppelin/token/LimitedTransferToken.sol57
1 files changed, 57 insertions, 0 deletions
diff --git a/test/compilationTests/zeppelin/token/LimitedTransferToken.sol b/test/compilationTests/zeppelin/token/LimitedTransferToken.sol
new file mode 100644
index 00000000..ee5032c9
--- /dev/null
+++ b/test/compilationTests/zeppelin/token/LimitedTransferToken.sol
@@ -0,0 +1,57 @@
+pragma solidity ^0.4.11;
+
+import "./ERC20.sol";
+
+/**
+ * @title LimitedTransferToken
+ * @dev LimitedTransferToken defines the generic interface and the implementation to limit token
+ * transferability for different events. It is intended to be used as a base class for other token
+ * contracts.
+ * LimitedTransferToken has been designed to allow for different limiting factors,
+ * this can be achieved by recursively calling super.transferableTokens() until the base class is
+ * hit. For example:
+ * function transferableTokens(address holder, uint64 time) constant public returns (uint256) {
+ * return min256(unlockedTokens, super.transferableTokens(holder, time));
+ * }
+ * A working example is VestedToken.sol:
+ * https://github.com/OpenZeppelin/zeppelin-solidity/blob/master/contracts/token/VestedToken.sol
+ */
+
+contract LimitedTransferToken is ERC20 {
+
+ /**
+ * @dev Checks whether it can transfer or otherwise throws.
+ */
+ modifier canTransfer(address _sender, uint256 _value) {
+ if (_value > transferableTokens(_sender, uint64(now))) throw;
+ _;
+ }
+
+ /**
+ * @dev Checks modifier and allows transfer if tokens are not locked.
+ * @param _to The address that will recieve the tokens.
+ * @param _value The amount of tokens to be transferred.
+ */
+ function transfer(address _to, uint256 _value) canTransfer(msg.sender, _value) {
+ super.transfer(_to, _value);
+ }
+
+ /**
+ * @dev Checks modifier and allows transfer if tokens are not locked.
+ * @param _from The address that will send the tokens.
+ * @param _to The address that will recieve the tokens.
+ * @param _value The amount of tokens to be transferred.
+ */
+ function transferFrom(address _from, address _to, uint256 _value) canTransfer(_from, _value) {
+ super.transferFrom(_from, _to, _value);
+ }
+
+ /**
+ * @dev Default transferable tokens function returns all tokens for a holder (no limit).
+ * @dev Overwriting transferableTokens(address holder, uint64 time) is the way to provide the
+ * specific logic for limiting token transferability for a holder over time.
+ */
+ function transferableTokens(address holder, uint64 time) constant public returns (uint256) {
+ return balanceOf(holder);
+ }
+}