@@ -122,44 +122,55 @@ library SuperTokenV1Library {
122122 /**
123123 * @dev get flow rate between two accounts for given token
124124 * @param token The token used in flow
125- * @param sender The sender of the flow
125+ * @param senderOrPool The sender or pool sending the flow
126126 * @param receiverOrPool The receiver or pool receiving or distributing the flow
127- * @return flowRate The flow rate
128- * Note: edge case: if a CFA stream is going to a pool, it will return 0.
127+ * @return flowRate The flowrate
128+ * Note: this method auto-detects if it shall look at CFA or GDA flows.
129+ * For GDA flows, either sender or receiver need to be a pool.
129130 */
130- function getFlowRate (ISuperToken token , address sender , address receiverOrPool )
131+ function getFlowRate (ISuperToken token , address senderOrPool , address receiverOrPool )
131132 internal view returns (int96 flowRate )
132133 {
134+ // GDA account (distributor) -> pool
133135 if (_isPool (token, receiverOrPool)) {
134136 (, IGeneralDistributionAgreementV1 gda ) = _getHostAndGDA (token);
135- (, flowRate,) = gda.getFlow (token, sender, ISuperfluidPool (receiverOrPool));
137+ (, flowRate,) = gda.getFlow (token, senderOrPool, ISuperfluidPool (receiverOrPool));
138+ // GDA pool -> account (pool member)
139+ } else if (_isPool (token, senderOrPool)) {
140+ flowRate = ISuperfluidPool (senderOrPool).getMemberFlowRate (receiverOrPool);
141+ // CFA account -> account
136142 } else {
137143 (, IConstantFlowAgreementV1 cfa ) = _getHostAndCFA (token);
138- (, flowRate, , ) = cfa.getFlow (token, sender , receiverOrPool);
144+ (, flowRate, , ) = cfa.getFlow (token, senderOrPool , receiverOrPool);
139145 }
140146 }
141147
142148 /**
143- * @dev get flow info between an account and another account or pool for given token
149+ * @dev get flow info between an account or pool and another account or pool for given token
144150 * @param token The token used in flow
145- * @param sender The sender of the flow
151+ * @param senderOrPool The sender or pool sending the flow
146152 * @param receiverOrPool The receiver or pool receiving or distributing the flow
147- * @return lastUpdated Timestamp of flow creation or last flowrate change
148- * @return flowRate The flow rate
149- * @return deposit The amount of deposit the flow
150- * @return owedDeposit The amount of owed deposit of the flow
151- * Note: edge case: a CFA stream going to a pool will not be "seen".
153+ * @return lastUpdated Timestamp of flow creation or last flowrate change. Not set if the sender is a pool.
154+ * @return flowRate The flow rate.
155+ * @return deposit The amount of deposit of the flow.
156+ * @return owedDeposit The amount of owed deposit of the flow.
152157 */
153- function getFlowInfo (ISuperToken token , address sender , address receiverOrPool )
158+ function getFlowInfo (ISuperToken token , address senderOrPool , address receiverOrPool )
154159 internal view
155160 returns (uint256 lastUpdated , int96 flowRate , uint256 deposit , uint256 owedDeposit )
156161 {
162+ // GDA account (distributor) -> pool
157163 if (_isPool (token, receiverOrPool)) {
158164 (, IGeneralDistributionAgreementV1 gda ) = _getHostAndGDA (token);
159- (lastUpdated, flowRate, deposit) = gda.getFlow (token, sender, ISuperfluidPool (receiverOrPool));
165+ (lastUpdated, flowRate, deposit) = gda.getFlow (token, senderOrPool, ISuperfluidPool (receiverOrPool));
166+ // GDA pool -> account (pool member)
167+ } else if (_isPool (token, senderOrPool)) {
168+ flowRate = ISuperfluidPool (senderOrPool).getMemberFlowRate (receiverOrPool);
169+ // deposit and lastUpdated are not set in this case
170+ // CFA account -> account
160171 } else {
161172 (, IConstantFlowAgreementV1 cfa ) = _getHostAndCFA (token);
162- (lastUpdated, flowRate, deposit, owedDeposit) = cfa.getFlow (token, sender , receiverOrPool);
173+ (lastUpdated, flowRate, deposit, owedDeposit) = cfa.getFlow (token, senderOrPool , receiverOrPool);
163174 }
164175 }
165176
0 commit comments