From 1a5d1206e27b698c2a026c2f8deedc3a78da99cf Mon Sep 17 00:00:00 2001
From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com>
Date: Sat, 23 Jul 2022 15:02:26 -0500
Subject: [PATCH] feat: speedup epoch distribution, superfluid component
 (backport #2214) (#2215)

* feat: speedup epoch distribution, superfluid component (#2214)

* Speedup epoch distribution, superfluid component

* changelog entries

* lint

Co-authored-by: Dev Ojha <dojha@berkeley.edu>
(cherry picked from commit 3cdfbccd2957e78e8a62877b47941a8e1cee537d)

# Conflicts:
#	CHANGELOG.md
#	x/incentives/keeper/distribute.go

* merge conflicts

* Update CHANGELOG.md

* Update CHANGELOG.md

Co-authored-by: Adam Tucker <adam@osmosis.team>
Co-authored-by: Adam Tucker <adamleetucker@outlook.com>
---
 CHANGELOG.md                      |  7 +++++--
 x/incentives/keeper/distribute.go | 35 +++++++++++++++++++++++--------
 2 files changed, 31 insertions(+), 11 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index ae0b7439d..b840983fd 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -40,6 +40,11 @@ All notable changes to this project will be documented in this file.
 The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
 and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
 
+## v10.1.1
+
+#### Improvements
+* [#2214](https://github.com/osmosis-labs/osmosis/pull/2214) Speedup epoch distribution, superfluid component
+
 ## v10.1.0
 
 #### Bug Fixes
@@ -90,8 +95,6 @@ This release contains minor CLI bug fixes.
 * [1698](https://github.com/osmosis-labs/osmosis/pull/1698) Register wasm snapshotter extension.
 * [1931](https://github.com/osmosis-labs/osmosis/pull/1931) Add explicit check for input denoms to `CalcJoinPoolShares`
 
-
-
 ## [v9.0.0 - Nitrogen](https://github.com/osmosis-labs/osmosis/releases/tag/v9.0.0)
 
 The Nitrogen release brings with it a number of features enabling further cosmwasm development work in Osmosis.
diff --git a/x/incentives/keeper/distribute.go b/x/incentives/keeper/distribute.go
index 57c96e9d7..46b935b2a 100644
--- a/x/incentives/keeper/distribute.go
+++ b/x/incentives/keeper/distribute.go
@@ -227,20 +227,37 @@ func (k Keeper) doDistributionSends(ctx sdk.Context, distrs *distributionInfo) e
 func (k Keeper) distributeSyntheticInternal(
 	ctx sdk.Context, gauge types.Gauge, locks []lockuptypes.PeriodLock, distrInfo *distributionInfo,
 ) (sdk.Coins, error) {
-	denom := gauge.DistributeTo.Denom
-
-	qualifiedLocks := make([]lockuptypes.PeriodLock, 0, len(locks))
+	qualifiedLocks := k.lk.GetLocksLongerThanDurationDenom(ctx, gauge.DistributeTo.Denom, gauge.DistributeTo.Duration)
+
+	// map from lockID to present index in resultant list
+	// to be state compatible with what we had before, we iterate over locks, to get qualified locks
+	// to be in the same order as what is present in locks.
+	// in a future release, we can just use qualified locks directly.
+	type lockIndexPair struct {
+		lock  lockuptypes.PeriodLock
+		index int
+	}
+	qualifiedLocksMap := make(map[uint64]lockIndexPair, len(qualifiedLocks))
+	for _, lock := range qualifiedLocks {
+		qualifiedLocksMap[lock.ID] = lockIndexPair{lock, -1}
+	}
+	curIndex := 0
 	for _, lock := range locks {
-		// See if this lock has a synthetic lockup. If so, err == nil, and we add to qualifiedLocks
-		// otherwise it does not, and we continue.
-		_, err := k.lk.GetSyntheticLockup(ctx, lock.ID, denom)
-		if err != nil {
+		if v, ok := qualifiedLocksMap[lock.ID]; ok {
+			qualifiedLocksMap[lock.ID] = lockIndexPair{v.lock, curIndex}
+			curIndex += 1
+		}
+	}
+
+	sortedAndTrimmedQualifiedLocks := make([]lockuptypes.PeriodLock, curIndex)
+	for _, v := range qualifiedLocksMap {
+		if v.index < 0 {
 			continue
 		}
-		qualifiedLocks = append(qualifiedLocks, lock)
+		sortedAndTrimmedQualifiedLocks[v.index] = v.lock
 	}
 
-	return k.distributeInternal(ctx, gauge, qualifiedLocks, distrInfo)
+	return k.distributeInternal(ctx, gauge, sortedAndTrimmedQualifiedLocks, distrInfo)
 }
 
 // distributeInternal runs the distribution logic for a gauge, and adds the sends to
-- 
GitLab