diff --git a/contracts/Vault.sol b/contracts/Vault.sol index 1bb7e8b..9f0673e 100644 --- a/contracts/Vault.sol +++ b/contracts/Vault.sol @@ -30,24 +30,28 @@ contract Vault is VaultBase { return _getLock(controller, context); } + function lock(Context context, Timestamp expiry, Timestamp maximum) public { + Controller controller = Controller.wrap(msg.sender); + _lock(controller, context, expiry, maximum); + } + + function extendLock(Context context, Timestamp expiry) public { + Controller controller = Controller.wrap(msg.sender); + _extendLock(controller, context, expiry); + } + function deposit(Context context, address from, uint128 amount) public { Controller controller = Controller.wrap(msg.sender); _deposit(controller, context, from, amount); } - function withdraw(Context context, Recipient recipient) public { + function designate( + Context context, + Recipient recipient, + uint128 amount + ) public { Controller controller = Controller.wrap(msg.sender); - _withdraw(controller, context, recipient); - } - - function withdrawByRecipient(Controller controller, Context context) public { - Recipient recipient = Recipient.wrap(msg.sender); - _withdraw(controller, context, recipient); - } - - function burn(Context context, Recipient recipient) public { - Controller controller = Controller.wrap(msg.sender); - _burn(controller, context, recipient); + _designate(controller, context, recipient, amount); } function transfer( @@ -60,25 +64,6 @@ contract Vault is VaultBase { _transfer(controller, context, from, to, amount); } - function designate( - Context context, - Recipient recipient, - uint128 amount - ) public { - Controller controller = Controller.wrap(msg.sender); - _designate(controller, context, recipient, amount); - } - - function lock(Context context, Timestamp expiry, Timestamp maximum) public { - Controller controller = Controller.wrap(msg.sender); - _lockup(controller, context, expiry, maximum); - } - - function extendLock(Context context, Timestamp expiry) public { - Controller controller = Controller.wrap(msg.sender); - _extendLock(controller, context, expiry); - } - function flow( Context context, Recipient from, @@ -88,4 +73,19 @@ contract Vault is VaultBase { Controller controller = Controller.wrap(msg.sender); _flow(controller, context, from, to, rate); } + + function burn(Context context, Recipient recipient) public { + Controller controller = Controller.wrap(msg.sender); + _burn(controller, context, recipient); + } + + function withdraw(Context context, Recipient recipient) public { + Controller controller = Controller.wrap(msg.sender); + _withdraw(controller, context, recipient); + } + + function withdrawByRecipient(Controller controller, Context context) public { + Recipient recipient = Recipient.wrap(msg.sender); + _withdraw(controller, context, recipient); + } } diff --git a/contracts/vault/VaultBase.sol b/contracts/vault/VaultBase.sol index af2453b..9f23064 100644 --- a/contracts/vault/VaultBase.sol +++ b/contracts/vault/VaultBase.sol @@ -73,132 +73,7 @@ abstract contract VaultBase { return _locks[controller][context]; } - function _deposit( - Controller controller, - Context context, - address from, - uint128 amount - ) internal { - Lock memory lock = _locks[controller][context]; - require(lock.isLocked(), LockRequired()); - - Recipient recipient = Recipient.wrap(from); - Balance memory balance = _balances[controller][context][recipient]; - - balance.available += amount; - lock.value += amount; - - _balances[controller][context][recipient] = balance; - _locks[controller][context] = lock; - - _token.safeTransferFrom(from, address(this), amount); - } - - function _delete( - Controller controller, - Context context, - Recipient recipient - ) private { - delete _balances[controller][context][recipient]; - delete _flows[controller][context][recipient]; - } - - function _withdraw( - Controller controller, - Context context, - Recipient recipient - ) internal { - Lock memory lock = _locks[controller][context]; - require(!lock.isLocked(), Locked()); - - Balance memory balance = _getBalance(controller, context, recipient); - uint128 amount = balance.available + balance.designated; - - lock.value -= amount; - - if (lock.value == 0) { - delete _locks[controller][context]; - } else { - _locks[controller][context] = lock; - } - - _delete(controller, context, recipient); - _token.safeTransfer(Recipient.unwrap(recipient), amount); - } - - function _burn( - Controller controller, - Context context, - Recipient recipient - ) internal { - Lock memory lock = _locks[controller][context]; - require(lock.isLocked(), LockRequired()); - - Flow memory flow = _flows[controller][context][recipient]; - require(flow.rate == TokensPerSecond.wrap(0), CannotBurnFlowingTokens()); - - Balance memory balance = _getBalance(controller, context, recipient); - uint128 amount = balance.available + balance.designated; - - lock.value -= amount; - - if (lock.value == 0) { - delete _locks[controller][context]; - } else { - _locks[controller][context] = lock; - } - - _delete(controller, context, recipient); - - _token.safeTransfer(address(0xdead), amount); - } - - function _transfer( - Controller controller, - Context context, - Recipient from, - Recipient to, - uint128 amount - ) internal { - Lock memory lock = _locks[controller][context]; - require(lock.isLocked(), LockRequired()); - - Balance memory senderBalance = _getBalance(controller, context, from); - Balance memory receiverBalance = _getBalance(controller, context, to); - require(amount <= senderBalance.available, InsufficientBalance()); - - senderBalance.available -= amount; - receiverBalance.available += amount; - - Flow memory senderFlow = _flows[controller][context][from]; - _checkFlowInvariant(senderBalance, lock, senderFlow); - - _balances[controller][context][from] = senderBalance; - _balances[controller][context][to] = receiverBalance; - } - - function _designate( - Controller controller, - Context context, - Recipient recipient, - uint128 amount - ) internal { - Lock memory lock = _locks[controller][context]; - require(lock.isLocked(), LockRequired()); - - Balance memory balance = _balances[controller][context][recipient]; - require(amount <= balance.available, InsufficientBalance()); - - balance.available -= amount; - balance.designated += amount; - - Flow memory flow = _flows[controller][context][recipient]; - _checkFlowInvariant(balance, lock, flow); - - _balances[controller][context][recipient] = balance; - } - - function _lockup( + function _lock( Controller controller, Context context, Timestamp expiry, @@ -225,6 +100,72 @@ abstract contract VaultBase { _locks[controller][context] = lock; } + function _deposit( + Controller controller, + Context context, + address from, + uint128 amount + ) internal { + Lock memory lock = _locks[controller][context]; + require(lock.isLocked(), LockRequired()); + + Recipient recipient = Recipient.wrap(from); + Balance memory balance = _balances[controller][context][recipient]; + + balance.available += amount; + lock.value += amount; + + _balances[controller][context][recipient] = balance; + _locks[controller][context] = lock; + + _token.safeTransferFrom(from, address(this), amount); + } + + function _designate( + Controller controller, + Context context, + Recipient recipient, + uint128 amount + ) internal { + Lock memory lock = _locks[controller][context]; + require(lock.isLocked(), LockRequired()); + + Balance memory balance = _balances[controller][context][recipient]; + require(amount <= balance.available, InsufficientBalance()); + + balance.available -= amount; + balance.designated += amount; + + Flow memory flow = _flows[controller][context][recipient]; + _checkFlowInvariant(balance, lock, flow); + + _balances[controller][context][recipient] = balance; + } + + function _transfer( + Controller controller, + Context context, + Recipient from, + Recipient to, + uint128 amount + ) internal { + Lock memory lock = _locks[controller][context]; + require(lock.isLocked(), LockRequired()); + + Balance memory senderBalance = _getBalance(controller, context, from); + Balance memory receiverBalance = _getBalance(controller, context, to); + require(amount <= senderBalance.available, InsufficientBalance()); + + senderBalance.available -= amount; + receiverBalance.available += amount; + + Flow memory senderFlow = _flows[controller][context][from]; + _checkFlowInvariant(senderBalance, lock, senderFlow); + + _balances[controller][context][from] = senderBalance; + _balances[controller][context][to] = receiverBalance; + } + function _flow( Controller controller, Context context, @@ -256,6 +197,65 @@ abstract contract VaultBase { _flows[controller][context][to] = receiverFlow; } + function _burn( + Controller controller, + Context context, + Recipient recipient + ) internal { + Lock memory lock = _locks[controller][context]; + require(lock.isLocked(), LockRequired()); + + Flow memory flow = _flows[controller][context][recipient]; + require(flow.rate == TokensPerSecond.wrap(0), CannotBurnFlowingTokens()); + + Balance memory balance = _getBalance(controller, context, recipient); + uint128 amount = balance.available + balance.designated; + + lock.value -= amount; + + if (lock.value == 0) { + delete _locks[controller][context]; + } else { + _locks[controller][context] = lock; + } + + _delete(controller, context, recipient); + + _token.safeTransfer(address(0xdead), amount); + } + + function _withdraw( + Controller controller, + Context context, + Recipient recipient + ) internal { + Lock memory lock = _locks[controller][context]; + require(!lock.isLocked(), Locked()); + + Balance memory balance = _getBalance(controller, context, recipient); + uint128 amount = balance.available + balance.designated; + + lock.value -= amount; + + if (lock.value == 0) { + delete _locks[controller][context]; + } else { + _locks[controller][context] = lock; + } + + _delete(controller, context, recipient); + _token.safeTransfer(Recipient.unwrap(recipient), amount); + } + + function _delete( + Controller controller, + Context context, + Recipient recipient + ) private { + delete _balances[controller][context][recipient]; + delete _flows[controller][context][recipient]; + } + function _checkLockInvariant(Lock memory lock) private pure { require(lock.expiry <= lock.maximum, ExpiryPastMaximum()); }