tx · 4M8AEUuhVe2LGh2AJayJAGKCnMvfzgTKfU11XeJZbQcC

3NBqs2vfpyT5cMdUJ97mEJ1Ycp2y8GbAZDA:  -0.01300000 Waves

2023.04.17 15:15 [2538555] smart account 3NBqs2vfpyT5cMdUJ97mEJ1Ycp2y8GbAZDA > SELF 0.00000000 Waves

{ "type": 13, "id": "4M8AEUuhVe2LGh2AJayJAGKCnMvfzgTKfU11XeJZbQcC", "fee": 1300000, "feeAssetId": null, "timestamp": 1681733756050, "version": 2, "chainId": 84, "sender": "3NBqs2vfpyT5cMdUJ97mEJ1Ycp2y8GbAZDA", "senderPublicKey": "H19CeJVbUnfsK8EYs8K6fHxwBH7pLyxw8WCDFu7D4rGQ", "proofs": [ "2DQY7R1SVSf9bmP5gz4KnsWG39aEguD6jyjamBRsZYtgLRtSWANNLTwe1QUG1ubmCwCnLuQTkAYNctkDbkQ2qDxm" ], "script": "base64:BgK6DQgCEgkKBwgBAQEBAQgSAwoBCBIDCgEBEgASABIDCgEIEgASACIDU0VQIgd3cmFwRXJyIgNtc2ciCHRocm93RXJyIg9nZXRTdHJpbmdPckZhaWwiB2FkZHJlc3MiA2tleSIRa2V5RmFjdG9yeUFkZHJlc3MiGWtleVZvdGluZ1ZlcmlmaWVkQ29udHJhY3QiImtleVZvdGluZ0VtaXNzaW9uQ2FuZGlkYXRlQ29udHJhY3QiFGtleVVzZXJQb29sc0NvbnRyYWN0IhZ2b3RpbmdWZXJpZmllZENvbnRyYWN0Ih92b3RpbmdFbWlzc2lvbkNhbmRpZGF0ZUNvbnRyYWN0IhF1c2VyUG9vbHNDb250cmFjdCIYSWR4RmFjdG9yeUNmZ1N0YWtpbmdEYXBwIhlJZHhGYWN0b3J5Q2ZnQm9vc3RpbmdEYXBwIhRJZHhGYWN0b3J5Q2ZnSWRvRGFwcCIVSWR4RmFjdG9yeUNmZ1RlYW1EYXBwIhlJZHhGYWN0b3J5Q2ZnRW1pc3Npb25EYXBwIhVJZHhGYWN0b3J5Q2ZnUmVzdERhcHAiGUlkeEZhY3RvcnlDZmdTbGlwcGFnZURhcHAiGklkeEZhY3RvcnlDZmdHd3hSZXdhcmREYXBwIg1rZXlGYWN0b3J5Q2ZnIhprZXlGYWN0b3J5THAyQXNzZXRzTWFwcGluZyIKbHBBc3NldFN0ciIQa2V5RmFjdG9yeUxwTGlzdCIma2V5RmFjdG9yeUxwQXNzZXRUb1Bvb2xDb250cmFjdEFkZHJlc3MiFGtleUZhY3RvcnlQb29sV2VpZ2h0Ig9jb250cmFjdEFkZHJlc3MiGHJlYWRGYWN0b3J5QWRkcmVzc09yRmFpbCIKcmVhZExwTGlzdCIUcmVhZEZhY3RvcnlDZmdPckZhaWwiB2ZhY3RvcnkiGGdldEJvb3N0aW5nQWRkcmVzc09yRmFpbCIKZmFjdG9yeUNmZyIYZ2V0RW1pc3Npb25BZGRyZXNzT3JGYWlsIhdnZXRTdGFraW5nQWRkcmVzc09yRmFpbCIZZ2V0R3d4UmV3YXJkQWRkcmVzc09yRmFpbCIJa2V5Q29uZmlnIhlrZXlSYXRlUGVyQmxvY2tNYXhDdXJyZW50IhtrZXlSYXRlUGVyQmxvY2tNYXhTdGFydEZyb20iCXRpbWVzdGFtcCIFYmxvY2siFmtleVJhdGVQZXJCbG9ja0N1cnJlbnQiE2tleVJhdGVQZXJCbG9ja05leHQiGGtleVJhdGVQZXJCbG9ja1N0YXJ0RnJvbSIVa2V5RW1pc3Npb25TdGFydEJsb2NrIhtrZXlFbWlzc2lvbkR1cmF0aW9uSW5CbG9ja3MiE2tleUVtaXNzaW9uRW5kQmxvY2siDWtleUJvb3N0Q29lZmYiEWJvb3N0Q29lZmZEZWZhdWx0Igpib29zdENvZWZmIhprZXlHd3hIb2xkZXJzUmV3YXJkQ3VycmVudCIXa2V5R3d4SG9sZGVyc1Jld2FyZE5leHQiE2tleU1hbmFnZXJQdWJsaWNLZXkiGmtleVBlbmRpbmdNYW5hZ2VyUHVibGljS2V5IhZtYW5hZ2VyUHVibGljS2V5T3JVbml0IgckbWF0Y2gwIgFzIh1wZW5kaW5nTWFuYWdlclB1YmxpY0tleU9yVW5pdCILbXVzdE1hbmFnZXIiAWkiAnBkIgJwayIOZmFjdG9yeUFkZHJlc3MiD3JhdGVQZXJCbG9ja01heCIMcmF0ZVBlckJsb2NrIhJlbWlzc2lvblN0YXJ0QmxvY2siEGVtaXNzaW9uRHVyYXRpb24iFmVtaXNzaW9uU3RhcnRUaW1lc3RhbXAiDHd4QXNzZXRJZFN0ciILY2hlY2tDYWxsZXIiGXZvdGluZ1ZlcmlmaWVkQ29udHJhY3RQcm0iBmFtb3VudCIPZmFjdG9yeUNvbnRyYWN0Ig9zdGFraW5nQ29udHJhY3QiEmd3eFJld2FyZHNDb250cmFjdCIGY2FsbGVyIgl3eEFzc2V0SWQiEGJvb3N0aW5nQ29udHJhY3QiA3BtdCIHYXNzZXRJZCIJcG10QW1vdW50IhZnd3hIb2xkZXJSZXdhcmRDdXJyZW50IhNnd3hIb2xkZXJSZXdhcmROZXh0IgdhY3Rpb25zIhdwZW5kaW5nTWFuYWdlclB1YmxpY0tleSIVY2hlY2tNYW5hZ2VyUHVibGljS2V5IgJwbSIFaGFzUE0iB2NoZWNrUE0iAnR4IgZ2ZXJpZnkiD3RhcmdldFB1YmxpY0tleTIAAWECAl9fAQFiAQFjCQC5CQIJAMwIAgIOZW1pc3Npb24ucmlkZToJAMwIAgkApQgBBQR0aGlzCQDMCAIFAWMFA25pbAIBIAEBZAEBYwkAAgEJAQFiAQUBYwEBZQIBZgFnCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUBZgUBZwkBAWIBCQCsAgIJAKwCAgIPbWFuZGF0b3J5IHRoaXMuBQFnAg8gaXMgbm90IGRlZmluZWQBAWgAAhwlcyVzX19jb25maWdfX2ZhY3RvcnlBZGRyZXNzAAFpAiQlcyVzX19jb25maWdfX3ZvdGluZ1ZlcmlmaWVkQ29udHJhY3QAAWoCLSVzJXNfX2NvbmZpZ19fdm90aW5nRW1pc3Npb25DYW5kaWRhdGVDb250cmFjdAABawIfJXMlc19fY29uZmlnX191c2VyUG9vbHNDb250cmFjdAABbAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBAWUCBQR0aGlzBQFpAAFtCQERQGV4dHJOYXRpdmUoMTA2MikBCQEBZQIFBHRoaXMFAWoAAW4JARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQFlAgUEdGhpcwUBawABbwABAAFwAAIAAXEAAwABcgAEAAFzAAUAAXQABgABdQAHAAF2AAoBAXcAAhElc19fZmFjdG9yeUNvbmZpZwEBeAEBeQkAuQkCCQDMCAICBiVzJXMlcwkAzAgCBQF5CQDMCAICHm1hcHBpbmdzX19scEFzc2V0MlBvb2xDb250cmFjdAUDbmlsBQFhAQF6AAIQJXNfX2xwVG9rZW5zTGlzdAEBQQEBeQkAuQkCCQDMCAICBiVzJXMlcwkAzAgCBQF5CQDMCAICHm1hcHBpbmdzX19scEFzc2V0MlBvb2xDb250cmFjdAUDbmlsBQFhAQFCAQFDCQC5CQIJAMwIAgIEJXMlcwkAzAgCAgpwb29sV2VpZ2h0CQDMCAIFAUMFA25pbAUBYQEBRAAJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQFlAgUEdGhpcwkBAWgAAQFFAAkAtQkCCQELdmFsdWVPckVsc2UCCQCdCAIJAQFEAAkBAXoAAgAFAWEBAUYBAUcJALUJAgkBAWUCBQFHCQEBdwAFAWEBAUgBAUkJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAJEDAgUBSQUBcAEBSgEBSQkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQFJBQFzAQFLAQFJCQERQGV4dHJOYXRpdmUoMTA2MikBCQCRAwIFAUkFAW8BAUwBAUkJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAJEDAgUBSQUBdgEBTQACCiVzX19jb25maWcBAU4AAh4lcyVzX19yYXRlUGVyQmxvY2tNYXhfX2N1cnJlbnQBAU8CAVABUQkAuQkCCQDMCAICICVzJXMlZCVkX19yYXRlUGVyQmxvY2tNYXhfX3N0YXJ0CQDMCAIJAKQDAQUBUAkAzAgCCQCkAwEFAVEFA25pbAUBYQEBUgACGyVzJXNfX3JhdGVQZXJCbG9ja19fY3VycmVudAEBUwACGCVzJXNfX3JhdGVQZXJCbG9ja19fbmV4dAEBVAIBUAFRCQC5CQIJAMwIAgIdJXMlcyVkJWRfX3JhdGVQZXJCbG9ja19fc3RhcnQJAMwIAgkApAMBBQFQCQDMCAIJAKQDAQUBUQUDbmlsBQFhAQFVAAIaJXMlc19fZW1pc3Npb25fX3N0YXJ0QmxvY2sBAVYAAhglcyVzX19lbWlzc2lvbl9fZHVyYXRpb24BAVcAAhglcyVzX19lbWlzc2lvbl9fZW5kQmxvY2sBAVgAAg4lc19fYm9vc3RDb2VmZgABWQADAAFaCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAQFYAAUBWQECYWEAAh8lcyVzX19nd3hIb2xkZXJzUmV3YXJkX19jdXJyZW50AQJhYgACHCVzJXNfX2d3eEhvbGRlcnNSZXdhcmRfX25leHQBAmFjAAIUJXNfX21hbmFnZXJQdWJsaWNLZXkBAmFkAAIbJXNfX3BlbmRpbmdNYW5hZ2VyUHVibGljS2V5AQJhZQAEAmFmCQCiCAEJAQJhYwADCQABAgUCYWYCBlN0cmluZwQCYWcFAmFmCQDZBAEFAmFnAwkAAQIFAmFmAgRVbml0BQR1bml0CQACAQILTWF0Y2ggZXJyb3IBAmFoAAQCYWYJAKIIAQkBAmFkAAMJAAECBQJhZgIGU3RyaW5nBAJhZwUCYWYJANkEAQUCYWcDCQABAgUCYWYCBFVuaXQFBHVuaXQJAAIBAgtNYXRjaCBlcnJvcgECYWkBAmFqBAJhawkBAWQBAhFQZXJtaXNzaW9uIGRlbmllZAQCYWYJAQJhZQADCQABAgUCYWYCCkJ5dGVWZWN0b3IEAmFsBQJhZgMJAAACCAUCYWoPY2FsbGVyUHVibGljS2V5BQJhbAYFAmFrAwkAAQIFAmFmAgRVbml0AwkAAAIIBQJhagZjYWxsZXIFBHRoaXMGBQJhawkAAgECC01hdGNoIGVycm9yCAJhagELY29uc3RydWN0b3IHAmFtAmFuAmFvAmFwAmFxAmFyAmFzBAJhdAkBAmFpAQUCYWoDCQAAAgUCYXQFAmF0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBTwIFAmFyBQJhcAUCYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAQFOAAUCYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAQFUAgUCYXIFAmFwBQJhbwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAVIABQJhbwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAVUABQJhcAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAVYABQJhcQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAVcACQBkAgUCYXAFAmFxCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFoAAUCYW0JAMwIAgkBC1N0cmluZ0VudHJ5AgkBAU0ACQCsAgICBCVzX18FAmFzBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CYWoBDWNvbnN0cnVjdG9yVjIBAmF1BAJhdAkBAmFpAQUCYWoDCQAAAgUCYXQFAmF0CQCUCgIJAMwIAgkBC1N0cmluZ0VudHJ5AgUBaQUCYXUFA25pbAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJhagEEZW1pdAECYXYDCQBnAgAABQJhdgkAlAoCBQNuaWwFA25pbAQCYXcJAQFEAAQBSQkBAUYBBQJhdwQCYXgJAQFLAQUBSQQCYXkJAQFMAQUBSQQCYXoIBQJhagZjYWxsZXIDAwkBAiE9AgUCYXoFAmF4CQECIT0CBQJhegUCYXkHCQEBZAECEnBlcm1pc3Npb25zIGRlbmllZAQCYXMJAJEDAgkAtQkCCQEBZQIFBHRoaXMJAQFNAAUBYQABBAJhQQkA2QQBBQJhcwkAlAoCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFAmF6BQJhdgUCYUEFA25pbAkAzAgCBQJhQQUDbmlsAmFqAQRidXJuAAQCYXcJAQFEAAQBSQkBAUYBBQJhdwQCYUIJAQFIAQUBSQMJAQIhPQIJAJADAQgFAmFqCHBheW1lbnRzAAEJAQFkAQIcZXhhY3Qgb25lIHBheW1lbnQgaXMgYWxsb3dlZAQCYUMJAJEDAggFAmFqCHBheW1lbnRzAAAEAmFECQEFdmFsdWUBCAUCYUMHYXNzZXRJZAQCYUUIBQJhQwZhbW91bnQEAmFBCQDZBAEJAJEDAgkAtQkCCQEBZQIFBHRoaXMJAQFNAAUBYQABAwkBAiE9AgUCYUQFAmFBCQEBZAECG2ludmFsaWQgd3hBc3NldElkIGlzIHBhc3NlZAMJAQEhAQkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgUCYUIJAMwIAgUBbAkAzAgCBQFtCQDMCAIFAW4FA25pbAgFAmFqBmNhbGxlcgkBAWQBAhJwZXJtaXNzaW9ucyBkZW5pZWQJAMwIAgkBBEJ1cm4CBQJhRAUCYUUJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICAhclcyVzJXNfX2hpc3RvcnlfX2J1cm5fXwkA2AQBCAUCYWoNdHJhbnNhY3Rpb25JZAkAuQkCCQDMCAICBiVkJWQlZAkAzAgCCQCkAwEFBmhlaWdodAkAzAgCCQCkAwEIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQDMCAIJAKQDAQUCYUUFA25pbAUBYQUDbmlsAmFqARZnd3hIb2xkZXJzUmV3YXJkVXBkYXRlAAQCYXcJAQFEAAQBSQkBAUYBBQJhdwQCYXkJAQFMAQUBSQQCYXQDCQAAAggFAmFqBmNhbGxlcgUCYXkGCQECYWkBBQJhagMJAAACBQJhdAUCYXQEAmFGCQELdmFsdWVPckVsc2UCCQCfCAEJAQJhYQAAAAQCYUcJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBAmFiAAUCYUYEAmFIAwkAAAIFAmFGBQJhRwUDbmlsCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECYWEABQJhRwkAzAgCCQELRGVsZXRlRW50cnkBCQECYWIABQNuaWwJAJQKAgUCYUgFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CYWoBCnNldE1hbmFnZXIBAmFJBAJhdAkBAmFpAQUCYWoDCQAAAgUCYXQFAmF0BAJhSgkA2QQBBQJhSQMJAAACBQJhSgUCYUoJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFkAAUCYUkFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJhagEOY29uZmlybU1hbmFnZXIABAJhSwkBAmFoAAQCYUwDCQEJaXNEZWZpbmVkAQUCYUsGCQEBZAECEk5vIHBlbmRpbmcgbWFuYWdlcgMJAAACBQJhTAUCYUwEAmFNAwkAAAIIBQJhag9jYWxsZXJQdWJsaWNLZXkJAQV2YWx1ZQEFAmFLBgkBAWQBAhtZb3UgYXJlIG5vdCBwZW5kaW5nIG1hbmFnZXIDCQAAAgUCYU0FAmFNCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhYwAJANgEAQkBBXZhbHVlAQUCYUsJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAmFkAAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmFqARVnZXRCb29zdENvZWZmUkVBRE9OTFkACQCUCgIFA25pbAUBWgECYU4BAmFPAAQCYVAEAmFmCQECYWUAAwkAAQIFAmFmAgpCeXRlVmVjdG9yBAJhbAUCYWYFAmFsAwkAAQIFAmFmAgRVbml0CAUCYU4Pc2VuZGVyUHVibGljS2V5CQACAQILTWF0Y2ggZXJyb3IJAPQDAwgFAmFOCWJvZHlCeXRlcwkAkQMCCAUCYU4GcHJvb2ZzAAAFAmFQ6Ar5nw==", "height": 2538555, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 7A5u8p8xKPJ1cD8oHe5VmfWhFYW1wU213LEv7ycbEKrC Next: 4okyA9gs8PXLfYhfdto5m9HMC1pvQetxUbfMY5H9S82o Diff:
OldNewDifferences
1-{-# STDLIB_VERSION 5 #-}
1+{-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let SEP = "__"
9191 func keyRatePerBlockCurrent () = "%s%s__ratePerBlock__current"
9292
9393
94+func keyRatePerBlockNext () = "%s%s__ratePerBlock__next"
95+
96+
9497 func keyRatePerBlockStartFrom (timestamp,block) = makeString(["%s%s%d%d__ratePerBlock__start", toString(timestamp), toString(block)], SEP)
9598
9699
109112 let boostCoeffDefault = 3
110113
111114 let boostCoeff = valueOrElse(getInteger(this, keyBoostCoeff()), boostCoeffDefault)
115+
116+func keyGwxHoldersRewardCurrent () = "%s%s__gwxHoldersReward__current"
117+
118+
119+func keyGwxHoldersRewardNext () = "%s%s__gwxHoldersReward__next"
120+
112121
113122 func keyManagerPublicKey () = "%s__managerPublicKey"
114123
218227
219228
220229 @Callable(i)
230+func gwxHoldersRewardUpdate () = {
231+ let factoryContract = readFactoryAddressOrFail()
232+ let factoryCfg = readFactoryCfgOrFail(factoryContract)
233+ let gwxRewardsContract = getGwxRewardAddressOrFail(factoryCfg)
234+ let checkCaller = if ((i.caller == gwxRewardsContract))
235+ then true
236+ else mustManager(i)
237+ if ((checkCaller == checkCaller))
238+ then {
239+ let gwxHolderRewardCurrent = valueOrElse(getInteger(keyGwxHoldersRewardCurrent()), 0)
240+ let gwxHolderRewardNext = valueOrElse(getInteger(keyGwxHoldersRewardNext()), gwxHolderRewardCurrent)
241+ let actions = if ((gwxHolderRewardCurrent == gwxHolderRewardNext))
242+ then nil
243+ else [IntegerEntry(keyGwxHoldersRewardCurrent(), gwxHolderRewardNext), DeleteEntry(keyGwxHoldersRewardNext())]
244+ $Tuple2(actions, unit)
245+ }
246+ else throw("Strict value is not equal to itself.")
247+ }
248+
249+
250+
251+@Callable(i)
221252 func setManager (pendingManagerPublicKey) = {
222253 let checkCaller = mustManager(i)
223254 if ((checkCaller == checkCaller))
Full:
OldNewDifferences
1-{-# STDLIB_VERSION 5 #-}
1+{-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let SEP = "__"
55
66 func wrapErr (msg) = makeString(["emission.ride:", toString(this), msg], " ")
77
88
99 func throwErr (msg) = throw(wrapErr(msg))
1010
1111
1212 func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), wrapErr((("mandatory this." + key) + " is not defined")))
1313
1414
1515 func keyFactoryAddress () = "%s%s__config__factoryAddress"
1616
1717
1818 let keyVotingVerifiedContract = "%s%s__config__votingVerifiedContract"
1919
2020 let keyVotingEmissionCandidateContract = "%s%s__config__votingEmissionCandidateContract"
2121
2222 let keyUserPoolsContract = "%s%s__config__userPoolsContract"
2323
2424 let votingVerifiedContract = addressFromStringValue(getStringOrFail(this, keyVotingVerifiedContract))
2525
2626 let votingEmissionCandidateContract = addressFromStringValue(getStringOrFail(this, keyVotingEmissionCandidateContract))
2727
2828 let userPoolsContract = addressFromStringValue(getStringOrFail(this, keyUserPoolsContract))
2929
3030 let IdxFactoryCfgStakingDapp = 1
3131
3232 let IdxFactoryCfgBoostingDapp = 2
3333
3434 let IdxFactoryCfgIdoDapp = 3
3535
3636 let IdxFactoryCfgTeamDapp = 4
3737
3838 let IdxFactoryCfgEmissionDapp = 5
3939
4040 let IdxFactoryCfgRestDapp = 6
4141
4242 let IdxFactoryCfgSlippageDapp = 7
4343
4444 let IdxFactoryCfgGwxRewardDapp = 10
4545
4646 func keyFactoryCfg () = "%s__factoryConfig"
4747
4848
4949 func keyFactoryLp2AssetsMapping (lpAssetStr) = makeString(["%s%s%s", lpAssetStr, "mappings__lpAsset2PoolContract"], SEP)
5050
5151
5252 func keyFactoryLpList () = "%s__lpTokensList"
5353
5454
5555 func keyFactoryLpAssetToPoolContractAddress (lpAssetStr) = makeString(["%s%s%s", lpAssetStr, "mappings__lpAsset2PoolContract"], SEP)
5656
5757
5858 func keyFactoryPoolWeight (contractAddress) = makeString(["%s%s", "poolWeight", contractAddress], SEP)
5959
6060
6161 func readFactoryAddressOrFail () = addressFromStringValue(getStringOrFail(this, keyFactoryAddress()))
6262
6363
6464 func readLpList () = split(valueOrElse(getString(readFactoryAddressOrFail(), keyFactoryLpList()), ""), SEP)
6565
6666
6767 func readFactoryCfgOrFail (factory) = split(getStringOrFail(factory, keyFactoryCfg()), SEP)
6868
6969
7070 func getBoostingAddressOrFail (factoryCfg) = addressFromStringValue(factoryCfg[IdxFactoryCfgBoostingDapp])
7171
7272
7373 func getEmissionAddressOrFail (factoryCfg) = addressFromStringValue(factoryCfg[IdxFactoryCfgEmissionDapp])
7474
7575
7676 func getStakingAddressOrFail (factoryCfg) = addressFromStringValue(factoryCfg[IdxFactoryCfgStakingDapp])
7777
7878
7979 func getGwxRewardAddressOrFail (factoryCfg) = addressFromStringValue(factoryCfg[IdxFactoryCfgGwxRewardDapp])
8080
8181
8282 func keyConfig () = "%s__config"
8383
8484
8585 func keyRatePerBlockMaxCurrent () = "%s%s__ratePerBlockMax__current"
8686
8787
8888 func keyRatePerBlockMaxStartFrom (timestamp,block) = makeString(["%s%s%d%d__ratePerBlockMax__start", toString(timestamp), toString(block)], SEP)
8989
9090
9191 func keyRatePerBlockCurrent () = "%s%s__ratePerBlock__current"
9292
9393
94+func keyRatePerBlockNext () = "%s%s__ratePerBlock__next"
95+
96+
9497 func keyRatePerBlockStartFrom (timestamp,block) = makeString(["%s%s%d%d__ratePerBlock__start", toString(timestamp), toString(block)], SEP)
9598
9699
97100 func keyEmissionStartBlock () = "%s%s__emission__startBlock"
98101
99102
100103 func keyEmissionDurationInBlocks () = "%s%s__emission__duration"
101104
102105
103106 func keyEmissionEndBlock () = "%s%s__emission__endBlock"
104107
105108
106109 func keyBoostCoeff () = "%s__boostCoeff"
107110
108111
109112 let boostCoeffDefault = 3
110113
111114 let boostCoeff = valueOrElse(getInteger(this, keyBoostCoeff()), boostCoeffDefault)
115+
116+func keyGwxHoldersRewardCurrent () = "%s%s__gwxHoldersReward__current"
117+
118+
119+func keyGwxHoldersRewardNext () = "%s%s__gwxHoldersReward__next"
120+
112121
113122 func keyManagerPublicKey () = "%s__managerPublicKey"
114123
115124
116125 func keyPendingManagerPublicKey () = "%s__pendingManagerPublicKey"
117126
118127
119128 func managerPublicKeyOrUnit () = match getString(keyManagerPublicKey()) {
120129 case s: String =>
121130 fromBase58String(s)
122131 case _: Unit =>
123132 unit
124133 case _ =>
125134 throw("Match error")
126135 }
127136
128137
129138 func pendingManagerPublicKeyOrUnit () = match getString(keyPendingManagerPublicKey()) {
130139 case s: String =>
131140 fromBase58String(s)
132141 case _: Unit =>
133142 unit
134143 case _ =>
135144 throw("Match error")
136145 }
137146
138147
139148 func mustManager (i) = {
140149 let pd = throwErr("Permission denied")
141150 match managerPublicKeyOrUnit() {
142151 case pk: ByteVector =>
143152 if ((i.callerPublicKey == pk))
144153 then true
145154 else pd
146155 case _: Unit =>
147156 if ((i.caller == this))
148157 then true
149158 else pd
150159 case _ =>
151160 throw("Match error")
152161 }
153162 }
154163
155164
156165 @Callable(i)
157166 func constructor (factoryAddress,ratePerBlockMax,ratePerBlock,emissionStartBlock,emissionDuration,emissionStartTimestamp,wxAssetIdStr) = {
158167 let checkCaller = mustManager(i)
159168 if ((checkCaller == checkCaller))
160169 then [IntegerEntry(keyRatePerBlockMaxStartFrom(emissionStartTimestamp, emissionStartBlock), ratePerBlockMax), IntegerEntry(keyRatePerBlockMaxCurrent(), ratePerBlockMax), IntegerEntry(keyRatePerBlockStartFrom(emissionStartTimestamp, emissionStartBlock), ratePerBlock), IntegerEntry(keyRatePerBlockCurrent(), ratePerBlock), IntegerEntry(keyEmissionStartBlock(), emissionStartBlock), IntegerEntry(keyEmissionDurationInBlocks(), emissionDuration), IntegerEntry(keyEmissionEndBlock(), (emissionStartBlock + emissionDuration)), StringEntry(keyFactoryAddress(), factoryAddress), StringEntry(keyConfig(), ("%s__" + wxAssetIdStr))]
161170 else throw("Strict value is not equal to itself.")
162171 }
163172
164173
165174
166175 @Callable(i)
167176 func constructorV2 (votingVerifiedContractPrm) = {
168177 let checkCaller = mustManager(i)
169178 if ((checkCaller == checkCaller))
170179 then $Tuple2([StringEntry(keyVotingVerifiedContract, votingVerifiedContractPrm)], unit)
171180 else throw("Strict value is not equal to itself.")
172181 }
173182
174183
175184
176185 @Callable(i)
177186 func emit (amount) = if ((0 >= amount))
178187 then $Tuple2(nil, nil)
179188 else {
180189 let factoryContract = readFactoryAddressOrFail()
181190 let factoryCfg = readFactoryCfgOrFail(factoryContract)
182191 let stakingContract = getStakingAddressOrFail(factoryCfg)
183192 let gwxRewardsContract = getGwxRewardAddressOrFail(factoryCfg)
184193 let caller = i.caller
185194 if (if ((caller != stakingContract))
186195 then (caller != gwxRewardsContract)
187196 else false)
188197 then throwErr("permissions denied")
189198 else {
190199 let wxAssetIdStr = split(getStringOrFail(this, keyConfig()), SEP)[1]
191200 let wxAssetId = fromBase58String(wxAssetIdStr)
192201 $Tuple2([ScriptTransfer(caller, amount, wxAssetId)], [wxAssetId])
193202 }
194203 }
195204
196205
197206
198207 @Callable(i)
199208 func burn () = {
200209 let factoryContract = readFactoryAddressOrFail()
201210 let factoryCfg = readFactoryCfgOrFail(factoryContract)
202211 let boostingContract = getBoostingAddressOrFail(factoryCfg)
203212 if ((size(i.payments) != 1))
204213 then throwErr("exact one payment is allowed")
205214 else {
206215 let pmt = i.payments[0]
207216 let assetId = value(pmt.assetId)
208217 let pmtAmount = pmt.amount
209218 let wxAssetId = fromBase58String(split(getStringOrFail(this, keyConfig()), SEP)[1])
210219 if ((assetId != wxAssetId))
211220 then throwErr("invalid wxAssetId is passed")
212221 else if (!(containsElement([boostingContract, votingVerifiedContract, votingEmissionCandidateContract, userPoolsContract], i.caller)))
213222 then throwErr("permissions denied")
214223 else [Burn(assetId, pmtAmount), StringEntry(("%s%s%s__history__burn__" + toBase58String(i.transactionId)), makeString(["%d%d%d", toString(height), toString(lastBlock.timestamp), toString(pmtAmount)], SEP))]
215224 }
216225 }
217226
218227
219228
220229 @Callable(i)
230+func gwxHoldersRewardUpdate () = {
231+ let factoryContract = readFactoryAddressOrFail()
232+ let factoryCfg = readFactoryCfgOrFail(factoryContract)
233+ let gwxRewardsContract = getGwxRewardAddressOrFail(factoryCfg)
234+ let checkCaller = if ((i.caller == gwxRewardsContract))
235+ then true
236+ else mustManager(i)
237+ if ((checkCaller == checkCaller))
238+ then {
239+ let gwxHolderRewardCurrent = valueOrElse(getInteger(keyGwxHoldersRewardCurrent()), 0)
240+ let gwxHolderRewardNext = valueOrElse(getInteger(keyGwxHoldersRewardNext()), gwxHolderRewardCurrent)
241+ let actions = if ((gwxHolderRewardCurrent == gwxHolderRewardNext))
242+ then nil
243+ else [IntegerEntry(keyGwxHoldersRewardCurrent(), gwxHolderRewardNext), DeleteEntry(keyGwxHoldersRewardNext())]
244+ $Tuple2(actions, unit)
245+ }
246+ else throw("Strict value is not equal to itself.")
247+ }
248+
249+
250+
251+@Callable(i)
221252 func setManager (pendingManagerPublicKey) = {
222253 let checkCaller = mustManager(i)
223254 if ((checkCaller == checkCaller))
224255 then {
225256 let checkManagerPublicKey = fromBase58String(pendingManagerPublicKey)
226257 if ((checkManagerPublicKey == checkManagerPublicKey))
227258 then [StringEntry(keyPendingManagerPublicKey(), pendingManagerPublicKey)]
228259 else throw("Strict value is not equal to itself.")
229260 }
230261 else throw("Strict value is not equal to itself.")
231262 }
232263
233264
234265
235266 @Callable(i)
236267 func confirmManager () = {
237268 let pm = pendingManagerPublicKeyOrUnit()
238269 let hasPM = if (isDefined(pm))
239270 then true
240271 else throwErr("No pending manager")
241272 if ((hasPM == hasPM))
242273 then {
243274 let checkPM = if ((i.callerPublicKey == value(pm)))
244275 then true
245276 else throwErr("You are not pending manager")
246277 if ((checkPM == checkPM))
247278 then [StringEntry(keyManagerPublicKey(), toBase58String(value(pm))), DeleteEntry(keyPendingManagerPublicKey())]
248279 else throw("Strict value is not equal to itself.")
249280 }
250281 else throw("Strict value is not equal to itself.")
251282 }
252283
253284
254285
255286 @Callable(i)
256287 func getBoostCoeffREADONLY () = $Tuple2(nil, boostCoeff)
257288
258289
259290 @Verifier(tx)
260291 func verify () = {
261292 let targetPublicKey = match managerPublicKeyOrUnit() {
262293 case pk: ByteVector =>
263294 pk
264295 case _: Unit =>
265296 tx.senderPublicKey
266297 case _ =>
267298 throw("Match error")
268299 }
269300 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
270301 }
271302

github/deemru/w8io/3ef1775 
52.35 ms