Kind Realm (renderable)
Name v1
Namespace gnoswap / launchpad
Exported functions 1
Module gno.land/r/gnoswap/launchpad/v1
gno 0.9 launchpad_deposit.gno gno
⧉
1 package launchpad 2 3 import ( 4 "chain" 5 "chain/runtime" 6 "time" 7 8 NewLaunchpadV1 (launchpadStore interface {GetDepositCounter func() *gno.land/r/gnoswap/launchpad.Counter; GetDeposits func() *gno.land/p/nt/bptree/v0.BPTree; GetProjectRecipients func() *gno.land/p/nt/bptree/v0.BPTree; GetProjectTierRewardManagers func() *gno.land/p/nt/bptree/v0.BPTree; GetProjects func() *gno.land/p/nt/bptree/v0.BPTree; GetTotalGNSStakedAmount func() int64; HasDepositCounterStoreKey func() bool; HasDepositsKey func() bool; HasProjectRecipientsKey func() bool; HasProjectTierRewardManagersKey func() bool; HasProjectsKey func() bool; HasTotalGNSStakedAmountKey func() bool; NextDepositID func() string; SetDepositCounter func(int, .uverse.realm, *gno.land/r/gnoswap/launchpad.Counter) .uverse.error; SetDeposits func(int, .uverse.realm, *gno.land/p/nt/bptree/v0.BPTree) .uverse.error; SetProjectRecipients func(int, .uverse.realm, *gno.land/p/nt/bptree/v0.BPTree) .uverse.error; SetProjectTierRewardManagers func(int, .uverse.realm, *gno.land/p/nt/bptree/v0.BPTree) .uverse.error; SetProjects func(int, .uverse.realm, *gno.land/p/nt/bptree/v0.BPTree) .uverse.error; SetTotalGNSStakedAmount func(int, .uverse.realm, int64) .uverse.error}) interface {CollectDepositGns func(int, .uverse.realm, string) (int64, .uverse.error); CollectEmissionReward func(int, .uverse.realm); CollectProtocolFee func(int, .uverse.realm); CollectProtocolFeeReward func(int, .uverse.realm, string); CollectRewardByDepositId func(int, .uverse.realm, string) int64; CreateProject func(int, .uverse.realm, string, string, .uverse.address, int64, string, string, int64, int64, int64, int64) string; DepositGns func(int, .uverse.realm, string, int64, string) string; GetCurrentDepositId func() int64; GetDeposit func(string) (gno.land/r/gnoswap/launchpad.Deposit, .uverse.error); GetDepositAmount func(string) (int64, .uverse.error); GetDepositCount func() int; GetDepositCreatedAt func(string) (int64, .uverse.error); GetDepositCreatedHeight func(string) (int64, .uverse.error); GetDepositEndTime func(string) (int64, .uverse.error); GetDepositProjectID func(string) (string, .uverse.error); GetDepositProjectTierID func(string) (string, .uverse.error); GetDepositTier func(string) (int64, .uverse.error); GetDepositWithdrawnHeight func(string) (int64, .uverse.error); GetDepositWithdrawnTime func(string) (int64, .uverse.error); GetProjectActiveStatus func(string) (bool, .uverse.error); GetProjectCondition func(string, string) (*gno.land/r/gnoswap/launchpad.ProjectCondition, .uverse.error); GetProjectCreatedAt func(string) (int64, .uverse.error); GetProjectCreatedHeight func(string) (int64, .uverse.error); GetProjectDepositAmount func(string) (int64, .uverse.error); GetProjectName func(string) (string, .uverse.error); GetProjectRecipient func(string) (.uverse.address, .uverse.error); GetProjectTier func(string, int64) (*gno.land/r/gnoswap/launchpad.ProjectTier, .uverse.error); GetProjectTierDistributeAmountPerSecondX128 func(string, int64) (*gno.land/p/gnoswap/uint256/v1.Uint, .uverse.error); GetProjectTierEndTime func(string, int64) (int64, .uverse.error); GetProjectTierRewardAccumulatedDistributeAmount func(string) (int64, .uverse.error); GetProjectTierRewardAccumulatedRewardPerDepositX128 func(string) (*gno.land/p/gnoswap/uint256/v1.Uint, .uverse.error); GetProjectTierRewardAccumulatedTime func(string) (int64, .uverse.error); GetProjectTierRewardClaimableDuration func(string) (int64, .uverse.error); GetProjectTierRewardDistributeAmountPerSecondX128 func(string) (*gno.land/p/gnoswap/uint256/v1.Uint, .uverse.error); GetProjectTierRewardDistributeEndTime func(string) (int64, .uverse.error); GetProjectTierRewardDistributeStartTime func(string) (int64, .uverse.error); GetProjectTierRewardManager func(string) (*gno.land/r/gnoswap/launchpad.RewardManager, .uverse.error); GetProjectTierRewardManagerCount func() int; GetProjectTierRewardTotalClaimedAmount func(string) (int64, .uverse.error); GetProjectTierRewardTotalDistributeAmount func(string) (int64, .uverse.error); GetProjectTierRewards func(string, int64) *gno.land/p/nt/bptree/rotree/v0.ReadOnlyTree; GetProjectTierStartTime func(string, int64) (int64, .uverse.error); GetProjectTierTotalCollectedAmount func(string, int64) (int64, .uverse.error); GetProjectTierTotalDepositAmount func(string, int64) (int64, .uverse.error); GetProjectTierTotalDepositCount func(string, int64) (int64, .uverse.error); GetProjectTierTotalDistributeAmount func(string, int64) (int64, .uverse.error); GetProjectTierTotalWithdrawAmount func(string, int64) (int64, .uverse.error); GetProjectTierTotalWithdrawCount func(string, int64) (int64, .uverse.error); GetProjectTiersRatios func(string) (map[int64]int64, .uverse.error); GetProjectTokenPath func(string) (string, .uverse.error); GetProjects func() *gno.land/p/nt/bptree/rotree/v0.ReadOnlyTree; GetRewardState func(string, string) (*gno.land/r/gnoswap/launchpad.RewardState, .uverse.error); GetTotalGNSStakedAmount func() int64; Render func(string) string; TransferLeftFromProjectByAdmin func(int, .uverse.realm, string, .uverse.address) int64}
Signatures reconstructed verbatim from vm/qfuncs — interface params keep their inline definitions.
Render unavailable
rate limit exceeded — the render query is served by the Gnoland archive RPC.
vm/qrender output, sanitized (docs/render-security.md) and displayed in an empty-sandbox iframe — scripts, forms and popups cannot run. Links stay inert in-preview; right-click to open.
"gno.land/r/gnoswap/access/v1"
9
10 gnsmath "gno.land/p/gnoswap/gnsmath/v1"
11 "gno.land/p/gnoswap/utils/v1"
12
13 "gno.land/r/gnoswap/common"
14 "gno.land/r/gnoswap/emission"
15 "gno.land/r/gnoswap/gns"
16 gov_staker "gno.land/r/gnoswap/gov/staker"
17 "gno.land/r/gnoswap/gov/xgns"
18 "gno.land/r/gnoswap/halt/v1"
19 "gno.land/r/gnoswap/launchpad"
20 "gno.land/r/gnoswap/referral/v1"
21 )
22
23 // DepositGns deposits GNS tokens to a launchpad project tier.
24 //
25 // Parameters:
26 // - _: leading integer discriminator for the forwarded realm call; callers pass 0.
27 // - rlm: propagated realm context; the implementation validates it is the current realm.
28 // - targetProjectTierID: project-tier identifier in `{projectID}:{tierDuration}` form.
29 // - depositAmount: amount of GNS to deposit into the tier.
30 // - referrer: optional referral address associated with the deposit.
31 //
32 // Returns:
33 // - depositID: identifier assigned to the newly created deposit.
34 func (lp *launchpadV1) DepositGns(_ int , rlm realm, targetProjectTierID string , depositAmount int64 , referrer string ) string {
35 access.AssertIsRlmCurrent( 0 , rlm)
36
37 halt.AssertIsNotHaltedLaunchpad()
38
39 previousRealm := rlm.Previous()
40
41 assertIsValidAmount(depositAmount)
42
43 emission.MintAndDistributeGns(cross(rlm))
44
45 projectID, tierDuration := parseProjectTierID(targetProjectTierID)
46 caller := previousRealm.Address()
47
48 project, err := lp.getProject(projectID)
49 if err != nil {
50 panic(err.Error())
51 }
52
53 beforeTotalGNSStakedAmount := lp.store.GetTotalGNSStakedAmount()
54
55 deposit, rewardState, isFirstDeposit, distributeAmountPerSecondX128, err := lp.depositGns(
56 0 ,
57 rlm,
58 project,
59 tierDuration,
60 depositAmount,
61 caller,
62 )
63 if err != nil {
64 panic(err.Error())
65 }
66
67 afterTotalGNSStakedAmount := gnsmath.SafeAddInt64(beforeTotalGNSStakedAmount, depositAmount)
68 if err := lp.store.SetTotalGNSStakedAmount( 0 , rlm, afterTotalGNSStakedAmount); err != nil {
69 panic(err.Error())
70 }
71
72 actualReferrer := referral.TryRegister(cross(rlm), caller, referrer)
73
74 if isFirstDeposit {
75 chain.Emit(
76 "FirstDepositForProjectTier" ,
77 "prevAddr" , previousRealm.Address().String(),
78 "prevRealm" , previousRealm.PkgPath(),
79 "targetProjectTierId" , targetProjectTierID,
80 "amount" , utils.FormatInt(depositAmount),
81 "depositId" , deposit.ID(),
82 "claimableTime" , utils.FormatInt(rewardState.ClaimableTime()),
83 "tierAmountPerSecondX128" , distributeAmountPerSecondX128,
84 "totalGNSStakedAmount" , utils.FormatInt(afterTotalGNSStakedAmount),
85 "recipient" , project.Recipient().String(),
86 )
87 }
88
89 chain.Emit(
90 "DepositGns" ,
91 "prevAddr" , previousRealm.Address().String(),
92 "prevRealm" , previousRealm.PkgPath(),
93 "targetProjectTierId" , targetProjectTierID,
94 "amount" , utils.FormatInt(depositAmount),
95 "depositId" , deposit.ID(),
96 "claimableTime" , utils.FormatInt(rewardState.ClaimableTime()),
97 "referrer" , actualReferrer,
98 "totalGNSStakedAmount" , utils.FormatInt(afterTotalGNSStakedAmount),
99 "recipient" , project.Recipient().String(),
100 )
101
102 launchpadAddress := rlm.Address()
103
104 // stake governance token to the project
105 err = lp.stakeGovernance( 0 , rlm, project.Recipient(), depositAmount, launchpadAddress, caller)
106 if err != nil {
107 panic(err.Error())
108 }
109
110 return deposit.ID()
111 }
112
113 // depositGns deposits GNS to a project tier.
114 func (lp *launchpadV1) depositGns(
115 _ int ,
116 rlm realm,
117 project *launchpad.Project,
118 tierDuration int64 ,
119 depositAmount int64 ,
120 callerAddress address,
121 ) (launchpad.Deposit, *launchpad.RewardState, bool , string , error ) {
122 balanceOfFn := func (tokenPath string , caller address) int64 {
123 if tokenPath == GOV_XGNS_PATH {
124 return xgns.BalanceOf(caller)
125 }
126
127 return common.BalanceOf(tokenPath, caller)
128 }
129
130 err := checkProjectConditions(project, callerAddress, balanceOfFn)
131 if err != nil {
132 return launchpad.DefaultDeposit(), nil , false , "" , err
133 }
134
135 projectTier, err := getProjectTier(project, tierDuration)
136 if err != nil {
137 return launchpad.DefaultDeposit(), nil , false , "" , err
138 }
139
140 currentTime := time.Now().Unix()
141 currentHeight := runtime.ChainHeight()
142
143 if !projectTier.IsActivated(currentTime) {
144 return launchpad.DefaultDeposit(), nil , false , "" , makeErrorWithDetails(errInactiveProject, project.ID())
145 }
146
147 depositID := lp.nextDepositID()
148 deposit := launchpad.MakeDeposit(
149 depositID,
150 project.ID(),
151 tierDuration,
152 callerAddress,
153 depositAmount,
154 currentHeight,
155 currentTime,
156 projectTier.EndTime(),
157 )
158
159 // Store a value in the deposits tree and persist later updates explicitly.
160 deposits := lp.store.GetDeposits()
161 deposits.Set(depositID, deposit)
162
163 rewardManager, err := lp.getProjectTierRewardManager(projectTier.ID())
164 if err != nil {
165 return launchpad.DefaultDeposit(), nil , false , "" , err
166 }
167
168 isFirstDeposit := !isRewardManagerInitialized(rewardManager)
169
170 // update rewards before adding deposit to reward manager
171 err = updateRewardPerDepositX128(rewardManager, getTierCurrentDepositAmount(projectTier), currentTime)
172 if err != nil {
173 return launchpad.DefaultDeposit(), nil , false , "" , err
174 }
175
176 // add reward state to reward manager
177 rewardState := addRewardStateByDeposit(rewardManager, deposit)
178
179 // update tier data after adding reward state to reward manager
180 depositToTier(projectTier, deposit)
181 project.SetTier(tierDuration, projectTier)
182
183 // Save the modified state back
184 if err := lp.store.SetDeposits( 0 , rlm, deposits); err != nil {
185 return launchpad.DefaultDeposit(), nil , false , "" , err
186 }
187
188 emitUpdateLaunchpadRewardAccumulation(projectTier.ID(), rewardManager, getTierCurrentDepositAmount(projectTier))
189
190 return deposit,
191 rewardState,
192 isFirstDeposit,
193 rewardManager.DistributeAmountPerSecondX128().ToString(),
194 nil
195 }
196
197 // stakeGovernance stakes governance token to the project.
198 func (lp *launchpadV1) stakeGovernance(_ int , rlm realm, recipient address, depositAmount int64 , launchpadAddress address, callerAddress address) error {
199 gov_staker.SetAmountByProjectWallet(cross(rlm), recipient, depositAmount, true )
200
201 gns.TransferFrom(
202 cross(rlm),
203 callerAddress,
204 launchpadAddress,
205 depositAmount,
206 )
207
208 return nil
209 }
210