2025-02-04 16:10:40 +01:00
|
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
|
pragma solidity 0.8.28;
|
|
|
|
|
|
2025-02-05 13:56:15 +01:00
|
|
|
import "./TokenFlows.sol";
|
|
|
|
|
import "./Timestamps.sol";
|
2025-02-04 16:10:40 +01:00
|
|
|
|
|
|
|
|
struct Account {
|
2025-02-05 13:56:15 +01:00
|
|
|
Balance balance;
|
|
|
|
|
Flow flow;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
struct Balance {
|
2025-02-04 16:10:40 +01:00
|
|
|
uint128 available;
|
|
|
|
|
uint128 designated;
|
2025-02-05 13:56:15 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
struct Flow {
|
|
|
|
|
TokensPerSecond outgoing;
|
|
|
|
|
TokensPerSecond incoming;
|
|
|
|
|
Timestamp updated;
|
2025-02-04 16:10:40 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
library Accounts {
|
2025-02-05 13:56:15 +01:00
|
|
|
using Accounts for Account;
|
|
|
|
|
using TokenFlows for TokensPerSecond;
|
|
|
|
|
using Timestamps for Timestamp;
|
|
|
|
|
|
|
|
|
|
function isSolventAt(
|
2025-02-04 16:10:40 +01:00
|
|
|
Account memory account,
|
|
|
|
|
Timestamp timestamp
|
|
|
|
|
) internal pure returns (bool) {
|
2025-02-05 13:56:15 +01:00
|
|
|
Duration duration = account.flow.updated.until(timestamp);
|
|
|
|
|
uint128 outgoing = account.flow.outgoing.accumulate(duration);
|
|
|
|
|
return outgoing <= account.balance.available;
|
2025-02-04 16:10:40 +01:00
|
|
|
}
|
|
|
|
|
|
2025-02-05 13:56:15 +01:00
|
|
|
function update(Account memory account, Timestamp timestamp) internal pure {
|
|
|
|
|
Duration duration = account.flow.updated.until(timestamp);
|
|
|
|
|
account.balance.available -= account.flow.outgoing.accumulate(duration);
|
|
|
|
|
account.balance.designated += account.flow.incoming.accumulate(duration);
|
|
|
|
|
account.flow.updated = timestamp;
|
2025-02-04 16:10:40 +01:00
|
|
|
}
|
|
|
|
|
|
2025-02-05 13:56:15 +01:00
|
|
|
function flowIn(Account memory account, TokensPerSecond rate) internal view {
|
|
|
|
|
account.update(Timestamps.currentTime());
|
|
|
|
|
account.flow.incoming = account.flow.incoming + rate;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function flowOut(Account memory account, TokensPerSecond rate) internal view {
|
|
|
|
|
account.update(Timestamps.currentTime());
|
|
|
|
|
if (rate <= account.flow.incoming) {
|
|
|
|
|
account.flow.incoming = account.flow.incoming - rate;
|
|
|
|
|
} else {
|
|
|
|
|
account.flow.outgoing = account.flow.outgoing + rate;
|
|
|
|
|
account.flow.outgoing = account.flow.outgoing - account.flow.incoming;
|
|
|
|
|
account.flow.incoming = TokensPerSecond.wrap(0);
|
|
|
|
|
}
|
2025-02-04 16:10:40 +01:00
|
|
|
}
|
|
|
|
|
}
|