tx · U2iTDoJ8YUy9yQNb8ZqVY294QPq4JhkeFSX2XuyNiKn

3NBZkTq4XgvS9cWHQPutnUm3C1ZS4tDMqJa:  -0.14000000 Waves

2022.10.18 17:25 [2277954] smart account 3NBZkTq4XgvS9cWHQPutnUm3C1ZS4tDMqJa > SELF 0.00000000 Waves

{ "type": 13, "id": "U2iTDoJ8YUy9yQNb8ZqVY294QPq4JhkeFSX2XuyNiKn", "fee": 14000000, "feeAssetId": null, "timestamp": 1666103179919, "version": 2, "chainId": 84, "sender": "3NBZkTq4XgvS9cWHQPutnUm3C1ZS4tDMqJa", "senderPublicKey": "HJ4MXkC5hCwrUSxdnzS5VVpQGe5zYXcUVukdiKcGNVnV", "proofs": [ "3B7Sj578vbvMbQMznmDwNZMeM5BkoXYPDDu5Sfm4GwmN8vAjksEW4o67k6HacyecRpZ1rh13YQLjKxjtrD9XyWL9", "MjgBpcqGaDrbDPgHMnbEDtZqQZYSNNrt2UL6LC6ZKLvL3WuvTydHXLP6cWdJJCurSYPZJbWGpqUxMo8x8APvXFY" ], "script": "base64:BgIMCAISBAoCCAESABIALAAHa0FjdGl2ZQIGYWN0aXZlAA1rZXlBY3RpdmVHbG9iAhRhY3RpdmVfYWxsX2NvbnRyYWN0cwAGa0NhdXNlAg5zaHV0ZG93bl9jYXVzZQANa1VzZXJQb29sVm90ZQIQX3VzZXJfdm90ZV9nU1dPUAAOa1VzZXJUb3RhbFZvdGUCFl91c2VyX3RvdGFsX3ZvdGVfZ1NXT1AACWtQb29sVm90ZQIQX3Bvb2xfdm90ZV9nU1dPUAAKa1RvdGFsVm90ZQIQdG90YWxfdm90ZV9nU1dPUAAQa0hhcnZlc3RQb29sVm90ZQIYX2hhcnZlc3RfcG9vbF92b3RlX2dTV09QABRrSGFydmVzdFVzZXJQb29sVm90ZQIdX2hhcnZlc3RfdXNlcl9wb29sX3ZvdGVfZ1NXT1AADGtTdGFydEhlaWdodAIMc3RhcnRfaGVpZ2h0AAtrQmFzZVBlcmlvZAILYmFzZV9wZXJpb2QADWtQZXJpb2RMZW5ndGgCDXBlcmlvZF9sZW5ndGgADWtBZG1pblB1YktleTECC2FkbWluX3B1Yl8xAA1rQWRtaW5QdWJLZXkyAgthZG1pbl9wdWJfMgANa0FkbWluUHViS2V5MwILYWRtaW5fcHViXzMADGtGYXJtaW5nQWRkcgIPZmFybWluZ19hZGRyZXNzAAtrR292QWRkcmVzcwISZ292ZXJuYW5jZV9hZGRyZXNzABprUG9vbEZpcnN0SGFydmVzdEVuZEhlaWdodAIUZmlyc3RfaGFydmVzdF9oZWlnaHQACmtQb29sU3RydWMCC19wb29sX3N0cnVjAA5rVXNlclBvb2xTdHJ1YwIQX3VzZXJfcG9vbF9zdHJ1YwAPa1VzZXJUb3RhbFN0cnVjAhFfdXNlcl90b3RhbF9zdHJ1YwALa1RvdGFsU3RydWMCC3RvdGFsX3N0cnVjABtrSGFydmVzdFBvb2xBY3RpdmVWb3RlU3RydWMCHl9oYXJ2ZXN0X3Bvb2xfYWN0aXZlVm90ZV9zdHJ1YwAfa0hhcnZlc3RVc2VyUG9vbEFjdGl2ZVZvdGVTdHJ1YwIjX2hhcnZlc3RfdXNlcl9wb29sX2FjdGl2ZVZvdGVfc3RydWMABm9yYWNsZQkBB0FkZHJlc3MBARoBVEgTlwzA0zPMJTKAtin3p2RogKvjzHtLmQAGYWN0aXZlCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFB2tBY3RpdmUGAAphY3RpdmVHbG9iCQELdmFsdWVPckVsc2UCCQCbCAIFBm9yYWNsZQUNa2V5QWN0aXZlR2xvYgYACmJhc2VQZXJpb2QJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQR0aGlzBQtrQmFzZVBlcmlvZAIRRW1wdHkga0Jhc2VQZXJpb2QAC3N0YXJ0SGVpZ2h0CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUEdGhpcwUMa1N0YXJ0SGVpZ2h0AhJFbXB0eSBrU3RhcnRIZWlnaHQADHBlcmlvZExlbmd0aAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFBHRoaXMFDWtQZXJpb2RMZW5ndGgCE0VtcHR5IGtQZXJpb2RMZW5ndGgBE2dldEJhc2U1OEZyb21PcmFjbGUBA2tleQQHJG1hdGNoMAkAnQgCBQZvcmFjbGUFA2tleQMJAAECBQckbWF0Y2gwAgZTdHJpbmcEBnN0cmluZwUHJG1hdGNoMAkA2QQBBQZzdHJpbmcEB25vdGhpbmcFByRtYXRjaDAJAAIBCQCsAgIFA2tleQIIaXMgZW1wdHkADGFkbWluUHViS2V5MQkBE2dldEJhc2U1OEZyb21PcmFjbGUBBQ1rQWRtaW5QdWJLZXkxAAxhZG1pblB1YktleTIJARNnZXRCYXNlNThGcm9tT3JhY2xlAQUNa0FkbWluUHViS2V5MgAMYWRtaW5QdWJLZXkzCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFDWtBZG1pblB1YktleTMACmdvdkFkZHJlc3MJAQdBZGRyZXNzAQkBE2dldEJhc2U1OEZyb21PcmFjbGUBBQtrR292QWRkcmVzcwALZmFybWluZ0FkZHIJAQdBZGRyZXNzAQkBE2dldEJhc2U1OEZyb21PcmFjbGUBBQxrRmFybWluZ0FkZHIACmN1cnJQZXJpb2QJAGQCBQpiYXNlUGVyaW9kCQBpAgkAZQIFBmhlaWdodAULc3RhcnRIZWlnaHQFDHBlcmlvZExlbmd0aAEIaXNBY3RpdmUAAwMFBmFjdGl2ZQUKYWN0aXZlR2xvYgcFBHVuaXQJAAIBAh9EQXBwIGlzIGluYWN0aXZlIGF0IHRoaXMgbW9tZW50AQtpc0FkbWluQ2FsbAEBaQMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFDGFkbWluUHViS2V5MQkAzAgCBQxhZG1pblB1YktleTIJAMwIAgUMYWRtaW5QdWJLZXkzBQNuaWwIBQFpD2NhbGxlclB1YmxpY0tleQUEdW5pdAkAAgECIU9ubHkgYWRtaW4gY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgEUaXNDYWxsZXJJbkdvdmVybmFuY2UBBHVzZXIJAGYCCQELdmFsdWVPckVsc2UCCQCaCAIFCmdvdkFkZHJlc3MJAKwCAgkApQgBBQR1c2VyAgxfU1dPUF9hbW91bnQAAAAAARJpc1Bvb2xJbkdvdmVybmFuY2UBC3Bvb2xBZGRyZXNzCQEJaXNEZWZpbmVkAQkAmggCBQpnb3ZBZGRyZXNzCQCsAgIFC3Bvb2xBZGRyZXNzAh1fY3VycmVudF9wb29sX2ZyYWN0aW9uX3Jld2FyZAEeZ2V0UG9vbEZpcnN0SGFydmVzdFN0YXJ0SGVpZ2h0AQtwb29sQWRkcmVzcwkAZQIJAQt2YWx1ZU9yRWxzZQIJAJoIAgkBB0FkZHJlc3MBCQDZBAEFC3Bvb2xBZGRyZXNzBRprUG9vbEZpcnN0SGFydmVzdEVuZEhlaWdodAAABQxwZXJpb2RMZW5ndGgBB3N1c3BlbmQBBWNhdXNlCQDMCAIJAQxCb29sZWFuRW50cnkCBQdrQWN0aXZlBwkAzAgCCQELU3RyaW5nRW50cnkCBQZrQ2F1c2UFBWNhdXNlBQNuaWwBD2NhbGNEZWxldGVFbnRyeQIGY2FsbGVyC3Bvb2xBZGRyZXNzCgEOZGVsZXRlSWZFeGlzdHMCBGxpc3QDa2V5AwkBCWlzRGVmaW5lZAEJAJoIAgUEdGhpcwUDa2V5CQDNCAIFBGxpc3QJAQtEZWxldGVFbnRyeQEFA2tleQUEbGlzdAkBDmRlbGV0ZUlmRXhpc3RzAgkBDmRlbGV0ZUlmRXhpc3RzAgkBDmRlbGV0ZUlmRXhpc3RzAgkBDmRlbGV0ZUlmRXhpc3RzAgkBDmRlbGV0ZUlmRXhpc3RzAgkBDmRlbGV0ZUlmRXhpc3RzAgUDbmlsCQCsAgIJAKwCAgkArAICBQZjYWxsZXICAV8FC3Bvb2xBZGRyZXNzBQ5rVXNlclBvb2xTdHJ1YwkArAICBQZjYWxsZXIFD2tVc2VyVG90YWxTdHJ1YwkArAICBQtwb29sQWRkcmVzcwUKa1Bvb2xTdHJ1YwULa1RvdGFsU3RydWMJAKwCAgULcG9vbEFkZHJlc3MFG2tIYXJ2ZXN0UG9vbEFjdGl2ZVZvdGVTdHJ1YwkArAICCQCsAgIJAKwCAgUGY2FsbGVyAgFfBQtwb29sQWRkcmVzcwUfa0hhcnZlc3RVc2VyUG9vbEFjdGl2ZVZvdGVTdHJ1YwMBaQEOdm90ZVBvb2xXZWlnaHQCC3Bvb2xBZGRyZXNzD3VzZXJQb29sVm90ZU5ldwkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAMJAQEhAQkBEmlzUG9vbEluR292ZXJuYW5jZQEFC3Bvb2xBZGRyZXNzCQACAQIjVGhpcyBwb29sIGlzIG5vdCBpbiBHb3Zlcm5hbmNlIGRBcHAEFHVzZXJTV09QaW5Hb3Zlcm5hbmNlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUKZ292QWRkcmVzcwkArAICCQClCAEIBQFpBmNhbGxlcgIMX1NXT1BfYW1vdW50AiJFbXB0eSBfU1dPUF9hbW91bnQgYXQgZ292LiBhZGRyZXNzBBV1c2VyR1NXT1BpbkdvdmVybmFuY2UJAQt2YWx1ZU9yRWxzZQIJAJoIAgUKZ292QWRkcmVzcwkArAICCQClCAEIBQFpBmNhbGxlcgINX0dTd29wX2Ftb3VudAUUdXNlclNXT1BpbkdvdmVybmFuY2UEDHVzZXJQb29sVm90ZQMJAQlpc0RlZmluZWQBCQCdCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfBQtwb29sQWRkcmVzcwUOa1VzZXJQb29sU3RydWMJAQ1wYXJzZUludFZhbHVlAQkAkQMCCQC1CQIJAQV2YWx1ZQEJAJ0IAgUEdGhpcwkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8FC3Bvb2xBZGRyZXNzBQ5rVXNlclBvb2xTdHJ1YwIBXwAACQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfBQtwb29sQWRkcmVzcwUNa1VzZXJQb29sVm90ZQAABA11c2VyVG90YWxWb3RlAwkBCWlzRGVmaW5lZAEJAJ0IAgUEdGhpcwkArAICCQClCAEIBQFpBmNhbGxlcgUPa1VzZXJUb3RhbFN0cnVjCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgkAtQkCCQEFdmFsdWUBCQCdCAIFBHRoaXMJAKwCAgkApQgBCAUBaQZjYWxsZXIFD2tVc2VyVG90YWxTdHJ1YwIBXwAACQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkApQgBCAUBaQZjYWxsZXIFDmtVc2VyVG90YWxWb3RlAAAECHBvb2xWb3RlAwkBCWlzRGVmaW5lZAEJAJ0IAgUEdGhpcwkArAICBQtwb29sQWRkcmVzcwUKa1Bvb2xTdHJ1YwkBDXBhcnNlSW50VmFsdWUBCQCRAwIJALUJAgkBBXZhbHVlAQkAnQgCBQR0aGlzCQCsAgIFC3Bvb2xBZGRyZXNzBQprUG9vbFN0cnVjAgFfAAAJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQtwb29sQWRkcmVzcwUJa1Bvb2xWb3RlAAAECXRvdGFsVm90ZQMJAQlpc0RlZmluZWQBCQCdCAIFBHRoaXMFC2tUb3RhbFN0cnVjCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgkAtQkCCQEFdmFsdWUBCQCdCAIFBHRoaXMFC2tUb3RhbFN0cnVjAgFfAAAJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUKa1RvdGFsVm90ZQAABAxwb29sVm90ZURpZmYJAGUCBQ91c2VyUG9vbFZvdGVOZXcFDHVzZXJQb29sVm90ZQQQdXNlclRvdGFsVm90ZU5ldwkAZAIFDXVzZXJUb3RhbFZvdGUFDHBvb2xWb3RlRGlmZgMJAGYCBRB1c2VyVG90YWxWb3RlTmV3BRV1c2VyR1NXT1BpbkdvdmVybmFuY2UJAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgUgaGFzIAkApAMBBRV1c2VyR1NXT1BpbkdvdmVybmFuY2UCKiBHU1dPUCBpbiBnb3Zlcm5hbmNlLiBOZXcgR1NXT1AgaW4gdm90aW5nIAkApAMBBRB1c2VyVG90YWxWb3RlTmV3AwkAZgIAAAUQdXNlclRvdGFsVm90ZU5ldwkAAgECHE5ldyB1c2VyVG90YWxWb3RlU1dPUG5ldyA8IDADCQBmAgAABQ91c2VyUG9vbFZvdGVOZXcJAAIBAhtOZXcgdXNlclBvb2xWb3RlU1dPUG5ldyA8IDAEDnJlbW92ZVBvb2xWb3RlCQEBLQEFDHBvb2xWb3RlRGlmZgQLcG9vbFZvdGVOZXcDCQBnAgUPdXNlclBvb2xWb3RlTmV3BQx1c2VyUG9vbFZvdGUJAGQCBQhwb29sVm90ZQUMcG9vbFZvdGVEaWZmCQBlAgUIcG9vbFZvdGUFDnJlbW92ZVBvb2xWb3RlBAx0b3RhbFZvdGVOZXcDCQBnAgUPdXNlclBvb2xWb3RlTmV3BQx1c2VyUG9vbFZvdGUJAGQCBQl0b3RhbFZvdGUFDHBvb2xWb3RlRGlmZgkAZQIFCXRvdGFsVm90ZQUOcmVtb3ZlUG9vbFZvdGUDAwkAZgIAAAULcG9vbFZvdGVOZXcGCQBmAgAABQx0b3RhbFZvdGVOZXcJAAIBAh9PbmUgb3IgbW9yZSB2YWx1ZXMgYXJlIG5lZ2F0aXZlBA5oYXJ2ZXN0RW50cmllcwMJAGYCBQZoZWlnaHQJAR5nZXRQb29sRmlyc3RIYXJ2ZXN0U3RhcnRIZWlnaHQBBQtwb29sQWRkcmVzcwkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQtwb29sQWRkcmVzcwUQa0hhcnZlc3RQb29sVm90ZQULcG9vbFZvdGVOZXcJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfBQtwb29sQWRkcmVzcwUUa0hhcnZlc3RVc2VyUG9vbFZvdGUFD3VzZXJQb29sVm90ZU5ldwUDbmlsBQNuaWwEB3VwVUludHIJAPwHBAULZmFybWluZ0FkZHICF3VwZGF0ZVVzZXJCb29zdEludGVyZXN0CQDMCAIFC3Bvb2xBZGRyZXNzCQDMCAIJAKUIAQgFAWkGY2FsbGVyBQNuaWwFA25pbAMJAAACBQd1cFVJbnRyBQd1cFVJbnRyCQDOCAIJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8FC3Bvb2xBZGRyZXNzBQ1rVXNlclBvb2xWb3RlBQ91c2VyUG9vbFZvdGVOZXcJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkApQgBCAUBaQZjYWxsZXIFDmtVc2VyVG90YWxWb3RlBRB1c2VyVG90YWxWb3RlTmV3CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFC3Bvb2xBZGRyZXNzBQlrUG9vbFZvdGUFC3Bvb2xWb3RlTmV3CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQprVG90YWxWb3RlBQx0b3RhbFZvdGVOZXcFA25pbAkBD2NhbGNEZWxldGVFbnRyeQIJAKUIAQgFAWkGY2FsbGVyBQtwb29sQWRkcmVzcwUOaGFydmVzdEVudHJpZXMJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEIc2h1dGRvd24ACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpAwkBASEBBQZhY3RpdmUJAAIBCQCsAgICIkRBcHAgaXMgYWxyZWFkeSBzdXNwZW5kZWQuIENhdXNlOiAJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwUGa0NhdXNlAhp0aGUgY2F1c2Ugd2Fzbid0IHNwZWNpZmllZAkBB3N1c3BlbmQBAg9QYXVzZWQgYnkgYWRtaW4BaQEIYWN0aXZhdGUACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpAwUGYWN0aXZlCQACAQIWREFwcCBpcyBhbHJlYWR5IGFjdGl2ZQkAzAgCCQEMQm9vbGVhbkVudHJ5AgUHa0FjdGl2ZQYJAMwIAgkBC0RlbGV0ZUVudHJ5AQUGa0NhdXNlBQNuaWwBAnR4AQZ2ZXJpZnkABBJhZG1pblB1YktleTFTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQxhZG1pblB1YktleTEAAQAABBJhZG1pblB1YktleTJTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwABBQxhZG1pblB1YktleTIAAQAABBJhZG1pblB1YktleTNTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwACBQxhZG1pblB1YktleTMAAQAACQBnAgkAZAIJAGQCBRJhZG1pblB1YktleTFTaWduZWQFEmFkbWluUHViS2V5MlNpZ25lZAUSYWRtaW5QdWJLZXkzU2lnbmVkAAJd5nMr", "height": 2277954, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 9AxvRwgi5vFDHyjEHpcLNGAEyqZ9rCvSqPT4fucGz2jX Next: Fqj6uWC9eK7VDxUzznFuWSET2paGFLyG25811mqBD9ZH Diff:
OldNewDifferences
1-{-# STDLIB_VERSION 5 #-}
1+{-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let keyActive = "active"
4+let kActive = "active"
55
6-let keyCause = "shutdown_cause"
6+let keyActiveGlob = "active_all_contracts"
77
8-let kUserPoolVoteSWOP = "_vote"
8+let kCause = "shutdown_cause"
99
10-let kUserPoolStruc = "_user_pool_struc"
10+let kUserPoolVote = "_user_vote_gSWOP"
1111
12-let kUserTotalVoteSWOP = "_user_total_SWOP_vote"
12+let kUserTotalVote = "_user_total_vote_gSWOP"
1313
14-let kUserTotalStruc = "_user_total_struc"
14+let kPoolVote = "_pool_vote_gSWOP"
1515
16-let kPoolVoteSWOP = "_vote_SWOP"
16+let kTotalVote = "total_vote_gSWOP"
1717
18-let kPoolStruc = "_pool_struc"
18+let kHarvestPoolVote = "_harvest_pool_vote_gSWOP"
1919
20-let kTotalVoteSWOP = "total_vote_SWOP"
21-
22-let kTotalStruc = "total_struc"
23-
24-let keyAdminPubKey1 = "admin_pub_1"
25-
26-let keyAdminPubKey2 = "admin_pub_2"
27-
28-let keyAdminPubKey3 = "admin_pub_3"
29-
30-let kHarvestPoolActiveVoteStruc = "_harvest_pool_activeVote_struc"
31-
32-let kHarvestUserPoolActiveVoteStruc = "_harvest_user_pool_activeVote_struc"
20+let kHarvestUserPoolVote = "_harvest_user_pool_vote_gSWOP"
3321
3422 let kStartHeight = "start_height"
3523
3725
3826 let kPeriodLength = "period_length"
3927
40-let kDurationFullVotePower = "duration_full_vote_power"
28+let kAdminPubKey1 = "admin_pub_1"
4129
42-let kMinVotePower = "min_vote_power"
30+let kAdminPubKey2 = "admin_pub_2"
4331
44-let scale8 = 100000000
32+let kAdminPubKey3 = "admin_pub_3"
4533
46-let active = valueOrElse(getBoolean(this, keyActive), true)
34+let kFarmingAddr = "farming_address"
35+
36+let kGovAddress = "governance_address"
37+
38+let kPoolFirstHarvestEndHeight = "first_harvest_height"
39+
40+let kPoolStruc = "_pool_struc"
41+
42+let kUserPoolStruc = "_user_pool_struc"
43+
44+let kUserTotalStruc = "_user_total_struc"
45+
46+let kTotalStruc = "total_struc"
47+
48+let kHarvestPoolActiveVoteStruc = "_harvest_pool_activeVote_struc"
49+
50+let kHarvestUserPoolActiveVoteStruc = "_harvest_user_pool_activeVote_struc"
51+
52+let oracle = Address(base58'3MvVBtsXroQpy1tsPw21TU2ET9A8WfmrNjz')
53+
54+let active = valueOrElse(getBoolean(this, kActive), true)
55+
56+let activeGlob = valueOrElse(getBoolean(oracle, keyActiveGlob), true)
4757
4858 let basePeriod = valueOrErrorMessage(getInteger(this, kBasePeriod), "Empty kBasePeriod")
4959
5161
5262 let periodLength = valueOrErrorMessage(getInteger(this, kPeriodLength), "Empty kPeriodLength")
5363
54-let durationFullVotePower = valueOrErrorMessage(getInteger(this, kDurationFullVotePower), "Empty kDurationFullVotePower")
55-
56-let minVotePower = valueOrErrorMessage(getInteger(this, kMinVotePower), "Empty kMinVotePower")
57-
58-let govAddr = Address(base58'3N8E9LU71MDkdP8FWtbP4TBXCNhoc15hWfs')
59-
60-let oracle = Address(base58'3MvVBtsXroQpy1tsPw21TU2ET9A8WfmrNjz')
61-
62-func getAdminPub (keyAdminPub) = match getString(oracle, keyAdminPub) {
64+func getBase58FromOracle (key) = match getString(oracle, key) {
6365 case string: String =>
6466 fromBase58String(string)
6567 case nothing =>
66- throw("Admin public key is empty")
68+ throw((key + "is empty"))
6769 }
6870
6971
70-let adminPubKey1 = getAdminPub(keyAdminPubKey1)
72+let adminPubKey1 = getBase58FromOracle(kAdminPubKey1)
7173
72-let adminPubKey2 = getAdminPub(keyAdminPubKey2)
74+let adminPubKey2 = getBase58FromOracle(kAdminPubKey2)
7375
74-let adminPubKey3 = getAdminPub(keyAdminPubKey3)
76+let adminPubKey3 = getBase58FromOracle(kAdminPubKey3)
7577
76-let adminPubKeyStartStop = base58'Kn7NpzaG12dLZgcHf2ipUftU6hbJygmrhFqQYE4B7ZK'
78+let govAddress = Address(getBase58FromOracle(kGovAddress))
79+
80+let farmingAddr = Address(getBase58FromOracle(kFarmingAddr))
7781
7882 let currPeriod = (basePeriod + ((height - startHeight) / periodLength))
7983
80-func isActive () = if (active)
84+func isActive () = if (if (active)
85+ then activeGlob
86+ else false)
8187 then unit
8288 else throw("DApp is inactive at this moment")
8389
8490
85-func suspend (cause) = [BooleanEntry(keyActive, false), StringEntry(keyCause, cause)]
91+func isAdminCall (i) = if (containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey))
92+ then unit
93+ else throw("Only admin can call this function")
8694
8795
88-func isCallerInGovernance (user) = if ((valueOrElse(getInteger(govAddr, (toString(user) + "_SWOP_amount")), 0) > 0))
89- then true
90- else false
96+func isCallerInGovernance (user) = (valueOrElse(getInteger(govAddress, (toString(user) + "_SWOP_amount")), 0) > 0)
9197
9298
93-func isPoolInGovernance (poolAddress) = isDefined(getInteger(govAddr, (poolAddress + "_current_pool_fraction_reward")))
99+func isPoolInGovernance (poolAddress) = isDefined(getInteger(govAddress, (poolAddress + "_current_pool_fraction_reward")))
94100
95101
96-func votingCoef () = {
97- let votingDuration = (height - (startHeight + (currPeriod * periodLength)))
98- if ((durationFullVotePower > votingDuration))
99- then scale8
100- else {
101- let x1 = durationFullVotePower
102- let y1 = scale8
103- let x2 = periodLength
104- let y2 = minVotePower
105- let k = (((y2 - y1) * scale8) / (x2 - x1))
106- let b = ((y1 * scale8) - (k * x1))
107- (((votingDuration * k) / scale8) + (b / scale8))
108- }
109- }
102+func getPoolFirstHarvestStartHeight (poolAddress) = (valueOrElse(getInteger(Address(fromBase58String(poolAddress)), kPoolFirstHarvestEndHeight), 0) - periodLength)
110103
111104
112-func calcDeleteEntry (caller,poolAddress,userPoolVoteSWOPnew) = {
105+func suspend (cause) = [BooleanEntry(kActive, false), StringEntry(kCause, cause)]
106+
107+
108+func calcDeleteEntry (caller,poolAddress) = {
113109 func deleteIfExists (list,key) = if (isDefined(getInteger(this, key)))
114110 then (list :+ DeleteEntry(key))
115111 else list
116112
117- deleteIfExists(deleteIfExists(deleteIfExists(deleteIfExists(nil, (((caller + "_") + poolAddress) + kUserPoolVoteSWOP)), (caller + kUserTotalVoteSWOP)), (poolAddress + kPoolVoteSWOP)), kTotalVoteSWOP)
113+ deleteIfExists(deleteIfExists(deleteIfExists(deleteIfExists(deleteIfExists(deleteIfExists(nil, (((caller + "_") + poolAddress) + kUserPoolStruc)), (caller + kUserTotalStruc)), (poolAddress + kPoolStruc)), kTotalStruc), (poolAddress + kHarvestPoolActiveVoteStruc)), (((caller + "_") + poolAddress) + kHarvestUserPoolActiveVoteStruc))
118114 }
119115
120116
121117 @Callable(i)
122-func votePoolWeight (poolAddressesL,poolsVoteSWOPNewL) = valueOrElse(isActive(), if (if ((size(poolAddressesL) > 1))
123- then true
124- else (size(poolsVoteSWOPNewL) > 1))
125- then throw("poolAddressesL.size > 1 or poolsVoteSWOPNewL.size > 1")
118+func votePoolWeight (poolAddress,userPoolVoteNew) = valueOrElse(isActive(), if (!(isPoolInGovernance(poolAddress)))
119+ then throw("This pool is not in Governance dApp")
126120 else {
127- let poolAddress = poolAddressesL[0]
128- let userPoolVoteSWOPnew = poolsVoteSWOPNewL[0]
129- if (!(isPoolInGovernance(poolAddress)))
130- then throw("This pool has no _current_pool_fraction_reward in Governance dApp")
131- else {
132- let userSWOPinGovernance = valueOrErrorMessage(getInteger(govAddr, (toString(i.caller) + "_SWOP_amount")), "Empty _SWOP_amount at gov. address")
133- let $t042184849 = if (isDefined(getString(this, (((toString(i.caller) + "_") + poolAddress) + kUserPoolStruc))))
134- then {
135- let data = split(valueOrErrorMessage(getString(this, (((toString(i.caller) + "_") + poolAddress) + kUserPoolStruc)), "Empty kUserPoolStruc"), "_")
136- $Tuple4(parseIntValue(data[0]), parseIntValue(data[1]), parseIntValue(data[2]), parseIntValue(data[3]))
121+ let userSWOPinGovernance = valueOrErrorMessage(getInteger(govAddress, (toString(i.caller) + "_SWOP_amount")), "Empty _SWOP_amount at gov. address")
122+ let userGSWOPinGovernance = valueOrElse(getInteger(govAddress, (toString(i.caller) + "_GSwop_amount")), userSWOPinGovernance)
123+ let userPoolVote = if (isDefined(getString(this, (((toString(i.caller) + "_") + poolAddress) + kUserPoolStruc))))
124+ then parseIntValue(split(value(getString(this, (((toString(i.caller) + "_") + poolAddress) + kUserPoolStruc))), "_")[0])
125+ else valueOrElse(getInteger(this, (((toString(i.caller) + "_") + poolAddress) + kUserPoolVote)), 0)
126+ let userTotalVote = if (isDefined(getString(this, (toString(i.caller) + kUserTotalStruc))))
127+ then parseIntValue(split(value(getString(this, (toString(i.caller) + kUserTotalStruc))), "_")[0])
128+ else valueOrElse(getInteger(this, (toString(i.caller) + kUserTotalVote)), 0)
129+ let poolVote = if (isDefined(getString(this, (poolAddress + kPoolStruc))))
130+ then parseIntValue(split(value(getString(this, (poolAddress + kPoolStruc))), "_")[0])
131+ else valueOrElse(getInteger(this, (poolAddress + kPoolVote)), 0)
132+ let totalVote = if (isDefined(getString(this, kTotalStruc)))
133+ then parseIntValue(split(value(getString(this, kTotalStruc)), "_")[0])
134+ else valueOrElse(getInteger(this, kTotalVote), 0)
135+ let poolVoteDiff = (userPoolVoteNew - userPoolVote)
136+ let userTotalVoteNew = (userTotalVote + poolVoteDiff)
137+ if ((userTotalVoteNew > userGSWOPinGovernance))
138+ then throw(((((toString(i.caller) + " has ") + toString(userGSWOPinGovernance)) + " GSWOP in governance. New GSWOP in voting ") + toString(userTotalVoteNew)))
139+ else if ((0 > userTotalVoteNew))
140+ then throw("New userTotalVoteSWOPnew < 0")
141+ else if ((0 > userPoolVoteNew))
142+ then throw("New userPoolVoteSWOPnew < 0")
143+ else {
144+ let removePoolVote = -(poolVoteDiff)
145+ let poolVoteNew = if ((userPoolVoteNew >= userPoolVote))
146+ then (poolVote + poolVoteDiff)
147+ else (poolVote - removePoolVote)
148+ let totalVoteNew = if ((userPoolVoteNew >= userPoolVote))
149+ then (totalVote + poolVoteDiff)
150+ else (totalVote - removePoolVote)
151+ if (if ((0 > poolVoteNew))
152+ then true
153+ else (0 > totalVoteNew))
154+ then throw("One or more values are negative")
155+ else {
156+ let harvestEntries = if ((height > getPoolFirstHarvestStartHeight(poolAddress)))
157+ then [IntegerEntry((poolAddress + kHarvestPoolVote), poolVoteNew), IntegerEntry((((toString(i.caller) + "_") + poolAddress) + kHarvestUserPoolVote), userPoolVoteNew)]
158+ else nil
159+ let upUIntr = invoke(farmingAddr, "updateUserBoostInterest", [poolAddress, toString(i.caller)], nil)
160+ if ((upUIntr == upUIntr))
161+ then (([IntegerEntry((((toString(i.caller) + "_") + poolAddress) + kUserPoolVote), userPoolVoteNew), IntegerEntry((toString(i.caller) + kUserTotalVote), userTotalVoteNew), IntegerEntry((poolAddress + kPoolVote), poolVoteNew), IntegerEntry(kTotalVote, totalVoteNew)] ++ calcDeleteEntry(toString(i.caller), poolAddress)) ++ harvestEntries)
162+ else throw("Strict value is not equal to itself.")
163+ }
137164 }
138- else {
139- let uPoolVoteSWOP = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + poolAddress) + kUserPoolVoteSWOP)), 0)
140- $Tuple4(uPoolVoteSWOP, uPoolVoteSWOP, 0, 0)
141- }
142- let userPoolVoteSWOP = $t042184849._1
143- let userPoolActiveVoteSWOP = $t042184849._2
144- let userPoolVotePeriod = $t042184849._3
145- let userPoolFreezeSWOP = $t042184849._4
146- let $t048555361 = if (isDefined(getString(this, (toString(i.caller) + kUserTotalStruc))))
147- then {
148- let data = split(valueOrErrorMessage(getString(this, (toString(i.caller) + kUserTotalStruc)), "Empty kUserTotalStruc"), "_")
149- $Tuple3(parseIntValue(data[0]), parseIntValue(data[1]), parseIntValue(data[2]))
150- }
151- else {
152- let uPoolTotalSWOP = valueOrElse(getInteger(this, (toString(i.caller) + kUserTotalVoteSWOP)), 0)
153- $Tuple3(uPoolTotalSWOP, 0, 0)
154- }
155- let userTotalVoteSWOP = $t048555361._1
156- let userUnvoted = $t048555361._2
157- let userUnvotedPeriod = $t048555361._3
158- let $t053665832 = if (isDefined(getString(this, (poolAddress + kPoolStruc))))
159- then {
160- let data = split(valueOrErrorMessage(getString(this, (poolAddress + kPoolStruc)), "Empty kPoolStruc"), "_")
161- $Tuple3(parseIntValue(data[0]), parseIntValue(data[1]), parseIntValue(data[2]))
162- }
163- else {
164- let uPoolVoteSWOP = valueOrElse(getInteger(this, (poolAddress + kPoolVoteSWOP)), 0)
165- $Tuple4(uPoolVoteSWOP, uPoolVoteSWOP, 0, 0)
166- }
167- let poolVoteSWOP = $t053665832._1
168- let poolActiveSWOP = $t053665832._2
169- let poolPeriod = $t053665832._3
170- let $t058386272 = if (isDefined(getString(this, kTotalStruc)))
171- then {
172- let data = split(valueOrErrorMessage(getString(this, kTotalStruc), "Empty kTotalStruc"), "_")
173- $Tuple3(parseIntValue(data[0]), parseIntValue(data[1]), parseIntValue(data[2]))
174- }
175- else {
176- let uTotalVoteSWOP = valueOrElse(getInteger(this, kTotalVoteSWOP), 0)
177- $Tuple4(uTotalVoteSWOP, uTotalVoteSWOP, 0, 0)
178- }
179- let totalVoteSWOP = $t058386272._1
180- let totalActiveSWOP = $t058386272._2
181- let totalPeriod = $t058386272._3
182- let poolVoteDiffSWOP = (userPoolVoteSWOPnew - userPoolVoteSWOP)
183- let userTotalVoteSWOPnew = (userTotalVoteSWOP + poolVoteDiffSWOP)
184- if (!(isCallerInGovernance(i.caller)))
185- then throw("This address has 0 SWOP in Governance dApp")
186- else if ((userTotalVoteSWOPnew > userSWOPinGovernance))
187- then throw(((((toString(this) + " has ") + toString(userSWOPinGovernance)) + " SWOP in governance. New SWOP in voting ") + toString(userTotalVoteSWOPnew)))
188- else if ((0 > userTotalVoteSWOPnew))
189- then throw("New userTotalVoteSWOPnew < 0")
190- else if ((0 > userPoolVoteSWOPnew))
191- then throw("New userPoolVoteSWOPnew < 0")
192- else {
193- let amountOfVoting = split(valueOrElse(getString(this, (((toString(i.caller) + "_") + poolAddress) + kUserPoolStruc)), ""), "_")
194- let amountPoolStract = split(valueOrElse(getString(this, (poolAddress + kPoolStruc)), ""), "_")
195- let harvestPoolActiveVoteStrucEntry = if (if ((valueOrElse(getString(this, (poolAddress + kPoolStruc)), "") != ""))
196- then (currPeriod != valueOrElse(parseInt(amountPoolStract[2]), 0))
197- else false)
198- then {
199- let harvestPoolActiveVoteStruc = ((amountPoolStract[1] + "_") + amountPoolStract[2])
200-[StringEntry((poolAddress + kHarvestPoolActiveVoteStruc), harvestPoolActiveVoteStruc)]
201- }
202- else nil
203- let harvestUserPoolActiveVoteStrucEntry = if (if ((valueOrElse(getString(this, (((toString(i.caller) + "_") + poolAddress) + kUserPoolStruc)), "") != ""))
204- then (currPeriod != valueOrElse(parseInt(amountOfVoting[2]), 0))
205- else false)
206- then {
207- let harvestUserPoolActiveVoteStruc = ((amountOfVoting[1] + "_") + amountOfVoting[2])
208-[StringEntry((((toString(i.caller) + "_") + poolAddress) + kHarvestUserPoolActiveVoteStruc), harvestUserPoolActiveVoteStruc)]
209- }
210- else nil
211- if ((userPoolVoteSWOPnew >= userPoolVoteSWOP))
212- then {
213- let coef = votingCoef()
214- let userPoolActiveVoteSWOPnew = if ((userPoolVotePeriod == currPeriod))
215- then (userPoolActiveVoteSWOP + fraction(poolVoteDiffSWOP, coef, scale8))
216- else (userPoolVoteSWOP + fraction(poolVoteDiffSWOP, coef, scale8))
217- let userPoolFreezeSWOPnew = if ((userPoolVotePeriod == currPeriod))
218- then userPoolFreezeSWOP
219- else userPoolVoteSWOP
220- let userUnvotedNew = if ((userUnvotedPeriod == currPeriod))
221- then max([0, (userUnvoted - poolVoteDiffSWOP)])
222- else 0
223- let userUnvotedPeriodNew = currPeriod
224- let userPoolStrucNew = ((((((toString(userPoolVoteSWOPnew) + "_") + toString(userPoolActiveVoteSWOPnew)) + "_") + toString(currPeriod)) + "_") + toString(userPoolFreezeSWOPnew))
225- let userPoolEntry = [StringEntry((((toString(i.caller) + "_") + poolAddress) + kUserPoolStruc), userPoolStrucNew)]
226- let userTotalStrucNew = ((((toString(userTotalVoteSWOPnew) + "_") + toString(userUnvotedNew)) + "_") + toString(userUnvotedPeriodNew))
227- let userTotalEntry = [StringEntry((toString(i.caller) + kUserTotalStruc), userTotalStrucNew)]
228- let poolVoteSWOPnew = (poolVoteSWOP + poolVoteDiffSWOP)
229- let poolActiveSWOPnew = if ((poolPeriod == currPeriod))
230- then (poolActiveSWOP + fraction(poolVoteDiffSWOP, coef, scale8))
231- else (poolVoteSWOP + fraction(poolVoteDiffSWOP, coef, scale8))
232- let poolStrucNew = ((((toString(poolVoteSWOPnew) + "_") + toString(poolActiveSWOPnew)) + "_") + toString(currPeriod))
233- let poolEntry = [StringEntry((poolAddress + kPoolStruc), poolStrucNew)]
234- let totalVoteSWOPnew = (totalVoteSWOP + poolVoteDiffSWOP)
235- let totalActiveSWOPnew = if ((totalPeriod == currPeriod))
236- then (totalActiveSWOP + fraction(poolVoteDiffSWOP, coef, scale8))
237- else (totalVoteSWOP + fraction(poolVoteDiffSWOP, coef, scale8))
238- let totalStrucNew = ((((toString(totalVoteSWOPnew) + "_") + toString(totalActiveSWOPnew)) + "_") + toString(currPeriod))
239- let totalEntry = [StringEntry(kTotalStruc, totalStrucNew)]
240- ((((((userPoolEntry ++ userTotalEntry) ++ poolEntry) ++ totalEntry) ++ calcDeleteEntry(toString(i.caller), poolAddress, userPoolVoteSWOPnew)) ++ harvestPoolActiveVoteStrucEntry) ++ harvestUserPoolActiveVoteStrucEntry)
241- }
242- else {
243- let removePoolVote = -(poolVoteDiffSWOP)
244- let userPoolFreezeSWOPnew = if ((userPoolVotePeriod == currPeriod))
245- then userPoolFreezeSWOP
246- else userPoolVoteSWOP
247- let userPoolFreezeSWOP2 = min([userPoolFreezeSWOP, userPoolVoteSWOP])
248- let userPoolFreezeSWOPnew2 = min([userPoolFreezeSWOPnew, userPoolVoteSWOPnew])
249- let userPoolActiveVoteSWOPnew = (userPoolFreezeSWOPnew2 + (if (((userPoolVoteSWOP - userPoolFreezeSWOP) == 0))
250- then 0
251- else fraction((userPoolActiveVoteSWOP - userPoolFreezeSWOP), (userPoolVoteSWOPnew - userPoolFreezeSWOPnew2), (userPoolVoteSWOP - userPoolFreezeSWOP))))
252- let userPoolActiveVoteDiff = (userPoolActiveVoteSWOPnew - (if ((userPoolVotePeriod == currPeriod))
253- then userPoolActiveVoteSWOP
254- else userPoolVoteSWOP))
255- let newUnvoted = max([0, (removePoolVote - (if ((userPoolVotePeriod == currPeriod))
256- then (userPoolVoteSWOP - userPoolFreezeSWOP2)
257- else 0))])
258- let userUnvotedNew = (newUnvoted + (if ((userUnvotedPeriod == currPeriod))
259- then userUnvoted
260- else 0))
261- let userUnvotedPeriodNew = if ((newUnvoted > 0))
262- then currPeriod
263- else userUnvotedPeriod
264- let userPoolStrucNew = ((((((toString(userPoolVoteSWOPnew) + "_") + toString(userPoolActiveVoteSWOPnew)) + "_") + toString(currPeriod)) + "_") + toString(userPoolFreezeSWOPnew))
265- let userPoolEntry = [StringEntry((((toString(i.caller) + "_") + poolAddress) + kUserPoolStruc), userPoolStrucNew)]
266- let userTotalStrucNew = ((((toString(userTotalVoteSWOPnew) + "_") + toString(userUnvotedNew)) + "_") + toString(userUnvotedPeriodNew))
267- let userTotalEntry = [StringEntry((toString(i.caller) + kUserTotalStruc), userTotalStrucNew)]
268- let poolVoteSWOPnew = (poolVoteSWOP - removePoolVote)
269- let poolActiveSWOPnew = if ((poolPeriod == currPeriod))
270- then (poolActiveSWOP + userPoolActiveVoteDiff)
271- else (poolVoteSWOP + userPoolActiveVoteDiff)
272- let poolStrucNew = ((((toString(poolVoteSWOPnew) + "_") + toString(poolActiveSWOPnew)) + "_") + toString(currPeriod))
273- let poolEntry = [StringEntry((poolAddress + kPoolStruc), poolStrucNew)]
274- let totalVoteSWOPnew = (totalVoteSWOP - removePoolVote)
275- let totalActiveSWOPnew = if ((totalPeriod == currPeriod))
276- then (totalActiveSWOP + userPoolActiveVoteDiff)
277- else (totalVoteSWOP + userPoolActiveVoteDiff)
278- let totalStrucNew = ((((toString(totalVoteSWOPnew) + "_") + toString(totalActiveSWOPnew)) + "_") + toString(currPeriod))
279- let totalEntry = [StringEntry(kTotalStruc, totalStrucNew)]
280- let allNewValues = [currPeriod, userPoolFreezeSWOPnew, userPoolActiveVoteSWOPnew, userPoolFreezeSWOPnew, userUnvotedNew, userUnvotedPeriodNew, poolVoteSWOPnew, poolActiveSWOPnew, totalVoteSWOPnew, totalActiveSWOPnew]
281- if ((0 > min(allNewValues)))
282- then throw("One or more values are negative")
283- else ((((((userPoolEntry ++ userTotalEntry) ++ poolEntry) ++ totalEntry) ++ calcDeleteEntry(toString(i.caller), poolAddress, userPoolVoteSWOPnew)) ++ harvestPoolActiveVoteStrucEntry) ++ harvestUserPoolActiveVoteStrucEntry)
284- }
285- }
286- }
287165 })
288166
289167
290168
291169 @Callable(i)
292-func shutdown () = if (!(active))
293- then throw(("DApp is already suspended. Cause: " + valueOrElse(getString(this, keyCause), "the cause wasn't specified")))
294- else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStartStop], i.callerPublicKey)))
295- then throw("Only admin can call this function")
296- else suspend("Paused by admin")
170+func shutdown () = valueOrElse(isAdminCall(i), if (!(active))
171+ then throw(("DApp is already suspended. Cause: " + valueOrElse(getString(this, kCause), "the cause wasn't specified")))
172+ else suspend("Paused by admin"))
297173
298174
299175
300176 @Callable(i)
301-func activate () = if (active)
177+func activate () = valueOrElse(isAdminCall(i), if (active)
302178 then throw("DApp is already active")
303- else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStartStop], i.callerPublicKey)))
304- then throw("Only admin can call this function")
305- else [BooleanEntry(keyActive, true), DeleteEntry(keyCause)]
179+ else [BooleanEntry(kActive, true), DeleteEntry(kCause)])
306180
307181
308182 @Verifier(tx)
Full:
OldNewDifferences
1-{-# STDLIB_VERSION 5 #-}
1+{-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let keyActive = "active"
4+let kActive = "active"
55
6-let keyCause = "shutdown_cause"
6+let keyActiveGlob = "active_all_contracts"
77
8-let kUserPoolVoteSWOP = "_vote"
8+let kCause = "shutdown_cause"
99
10-let kUserPoolStruc = "_user_pool_struc"
10+let kUserPoolVote = "_user_vote_gSWOP"
1111
12-let kUserTotalVoteSWOP = "_user_total_SWOP_vote"
12+let kUserTotalVote = "_user_total_vote_gSWOP"
1313
14-let kUserTotalStruc = "_user_total_struc"
14+let kPoolVote = "_pool_vote_gSWOP"
1515
16-let kPoolVoteSWOP = "_vote_SWOP"
16+let kTotalVote = "total_vote_gSWOP"
1717
18-let kPoolStruc = "_pool_struc"
18+let kHarvestPoolVote = "_harvest_pool_vote_gSWOP"
1919
20-let kTotalVoteSWOP = "total_vote_SWOP"
21-
22-let kTotalStruc = "total_struc"
23-
24-let keyAdminPubKey1 = "admin_pub_1"
25-
26-let keyAdminPubKey2 = "admin_pub_2"
27-
28-let keyAdminPubKey3 = "admin_pub_3"
29-
30-let kHarvestPoolActiveVoteStruc = "_harvest_pool_activeVote_struc"
31-
32-let kHarvestUserPoolActiveVoteStruc = "_harvest_user_pool_activeVote_struc"
20+let kHarvestUserPoolVote = "_harvest_user_pool_vote_gSWOP"
3321
3422 let kStartHeight = "start_height"
3523
3624 let kBasePeriod = "base_period"
3725
3826 let kPeriodLength = "period_length"
3927
40-let kDurationFullVotePower = "duration_full_vote_power"
28+let kAdminPubKey1 = "admin_pub_1"
4129
42-let kMinVotePower = "min_vote_power"
30+let kAdminPubKey2 = "admin_pub_2"
4331
44-let scale8 = 100000000
32+let kAdminPubKey3 = "admin_pub_3"
4533
46-let active = valueOrElse(getBoolean(this, keyActive), true)
34+let kFarmingAddr = "farming_address"
35+
36+let kGovAddress = "governance_address"
37+
38+let kPoolFirstHarvestEndHeight = "first_harvest_height"
39+
40+let kPoolStruc = "_pool_struc"
41+
42+let kUserPoolStruc = "_user_pool_struc"
43+
44+let kUserTotalStruc = "_user_total_struc"
45+
46+let kTotalStruc = "total_struc"
47+
48+let kHarvestPoolActiveVoteStruc = "_harvest_pool_activeVote_struc"
49+
50+let kHarvestUserPoolActiveVoteStruc = "_harvest_user_pool_activeVote_struc"
51+
52+let oracle = Address(base58'3MvVBtsXroQpy1tsPw21TU2ET9A8WfmrNjz')
53+
54+let active = valueOrElse(getBoolean(this, kActive), true)
55+
56+let activeGlob = valueOrElse(getBoolean(oracle, keyActiveGlob), true)
4757
4858 let basePeriod = valueOrErrorMessage(getInteger(this, kBasePeriod), "Empty kBasePeriod")
4959
5060 let startHeight = valueOrErrorMessage(getInteger(this, kStartHeight), "Empty kStartHeight")
5161
5262 let periodLength = valueOrErrorMessage(getInteger(this, kPeriodLength), "Empty kPeriodLength")
5363
54-let durationFullVotePower = valueOrErrorMessage(getInteger(this, kDurationFullVotePower), "Empty kDurationFullVotePower")
55-
56-let minVotePower = valueOrErrorMessage(getInteger(this, kMinVotePower), "Empty kMinVotePower")
57-
58-let govAddr = Address(base58'3N8E9LU71MDkdP8FWtbP4TBXCNhoc15hWfs')
59-
60-let oracle = Address(base58'3MvVBtsXroQpy1tsPw21TU2ET9A8WfmrNjz')
61-
62-func getAdminPub (keyAdminPub) = match getString(oracle, keyAdminPub) {
64+func getBase58FromOracle (key) = match getString(oracle, key) {
6365 case string: String =>
6466 fromBase58String(string)
6567 case nothing =>
66- throw("Admin public key is empty")
68+ throw((key + "is empty"))
6769 }
6870
6971
70-let adminPubKey1 = getAdminPub(keyAdminPubKey1)
72+let adminPubKey1 = getBase58FromOracle(kAdminPubKey1)
7173
72-let adminPubKey2 = getAdminPub(keyAdminPubKey2)
74+let adminPubKey2 = getBase58FromOracle(kAdminPubKey2)
7375
74-let adminPubKey3 = getAdminPub(keyAdminPubKey3)
76+let adminPubKey3 = getBase58FromOracle(kAdminPubKey3)
7577
76-let adminPubKeyStartStop = base58'Kn7NpzaG12dLZgcHf2ipUftU6hbJygmrhFqQYE4B7ZK'
78+let govAddress = Address(getBase58FromOracle(kGovAddress))
79+
80+let farmingAddr = Address(getBase58FromOracle(kFarmingAddr))
7781
7882 let currPeriod = (basePeriod + ((height - startHeight) / periodLength))
7983
80-func isActive () = if (active)
84+func isActive () = if (if (active)
85+ then activeGlob
86+ else false)
8187 then unit
8288 else throw("DApp is inactive at this moment")
8389
8490
85-func suspend (cause) = [BooleanEntry(keyActive, false), StringEntry(keyCause, cause)]
91+func isAdminCall (i) = if (containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey))
92+ then unit
93+ else throw("Only admin can call this function")
8694
8795
88-func isCallerInGovernance (user) = if ((valueOrElse(getInteger(govAddr, (toString(user) + "_SWOP_amount")), 0) > 0))
89- then true
90- else false
96+func isCallerInGovernance (user) = (valueOrElse(getInteger(govAddress, (toString(user) + "_SWOP_amount")), 0) > 0)
9197
9298
93-func isPoolInGovernance (poolAddress) = isDefined(getInteger(govAddr, (poolAddress + "_current_pool_fraction_reward")))
99+func isPoolInGovernance (poolAddress) = isDefined(getInteger(govAddress, (poolAddress + "_current_pool_fraction_reward")))
94100
95101
96-func votingCoef () = {
97- let votingDuration = (height - (startHeight + (currPeriod * periodLength)))
98- if ((durationFullVotePower > votingDuration))
99- then scale8
100- else {
101- let x1 = durationFullVotePower
102- let y1 = scale8
103- let x2 = periodLength
104- let y2 = minVotePower
105- let k = (((y2 - y1) * scale8) / (x2 - x1))
106- let b = ((y1 * scale8) - (k * x1))
107- (((votingDuration * k) / scale8) + (b / scale8))
108- }
109- }
102+func getPoolFirstHarvestStartHeight (poolAddress) = (valueOrElse(getInteger(Address(fromBase58String(poolAddress)), kPoolFirstHarvestEndHeight), 0) - periodLength)
110103
111104
112-func calcDeleteEntry (caller,poolAddress,userPoolVoteSWOPnew) = {
105+func suspend (cause) = [BooleanEntry(kActive, false), StringEntry(kCause, cause)]
106+
107+
108+func calcDeleteEntry (caller,poolAddress) = {
113109 func deleteIfExists (list,key) = if (isDefined(getInteger(this, key)))
114110 then (list :+ DeleteEntry(key))
115111 else list
116112
117- deleteIfExists(deleteIfExists(deleteIfExists(deleteIfExists(nil, (((caller + "_") + poolAddress) + kUserPoolVoteSWOP)), (caller + kUserTotalVoteSWOP)), (poolAddress + kPoolVoteSWOP)), kTotalVoteSWOP)
113+ deleteIfExists(deleteIfExists(deleteIfExists(deleteIfExists(deleteIfExists(deleteIfExists(nil, (((caller + "_") + poolAddress) + kUserPoolStruc)), (caller + kUserTotalStruc)), (poolAddress + kPoolStruc)), kTotalStruc), (poolAddress + kHarvestPoolActiveVoteStruc)), (((caller + "_") + poolAddress) + kHarvestUserPoolActiveVoteStruc))
118114 }
119115
120116
121117 @Callable(i)
122-func votePoolWeight (poolAddressesL,poolsVoteSWOPNewL) = valueOrElse(isActive(), if (if ((size(poolAddressesL) > 1))
123- then true
124- else (size(poolsVoteSWOPNewL) > 1))
125- then throw("poolAddressesL.size > 1 or poolsVoteSWOPNewL.size > 1")
118+func votePoolWeight (poolAddress,userPoolVoteNew) = valueOrElse(isActive(), if (!(isPoolInGovernance(poolAddress)))
119+ then throw("This pool is not in Governance dApp")
126120 else {
127- let poolAddress = poolAddressesL[0]
128- let userPoolVoteSWOPnew = poolsVoteSWOPNewL[0]
129- if (!(isPoolInGovernance(poolAddress)))
130- then throw("This pool has no _current_pool_fraction_reward in Governance dApp")
131- else {
132- let userSWOPinGovernance = valueOrErrorMessage(getInteger(govAddr, (toString(i.caller) + "_SWOP_amount")), "Empty _SWOP_amount at gov. address")
133- let $t042184849 = if (isDefined(getString(this, (((toString(i.caller) + "_") + poolAddress) + kUserPoolStruc))))
134- then {
135- let data = split(valueOrErrorMessage(getString(this, (((toString(i.caller) + "_") + poolAddress) + kUserPoolStruc)), "Empty kUserPoolStruc"), "_")
136- $Tuple4(parseIntValue(data[0]), parseIntValue(data[1]), parseIntValue(data[2]), parseIntValue(data[3]))
121+ let userSWOPinGovernance = valueOrErrorMessage(getInteger(govAddress, (toString(i.caller) + "_SWOP_amount")), "Empty _SWOP_amount at gov. address")
122+ let userGSWOPinGovernance = valueOrElse(getInteger(govAddress, (toString(i.caller) + "_GSwop_amount")), userSWOPinGovernance)
123+ let userPoolVote = if (isDefined(getString(this, (((toString(i.caller) + "_") + poolAddress) + kUserPoolStruc))))
124+ then parseIntValue(split(value(getString(this, (((toString(i.caller) + "_") + poolAddress) + kUserPoolStruc))), "_")[0])
125+ else valueOrElse(getInteger(this, (((toString(i.caller) + "_") + poolAddress) + kUserPoolVote)), 0)
126+ let userTotalVote = if (isDefined(getString(this, (toString(i.caller) + kUserTotalStruc))))
127+ then parseIntValue(split(value(getString(this, (toString(i.caller) + kUserTotalStruc))), "_")[0])
128+ else valueOrElse(getInteger(this, (toString(i.caller) + kUserTotalVote)), 0)
129+ let poolVote = if (isDefined(getString(this, (poolAddress + kPoolStruc))))
130+ then parseIntValue(split(value(getString(this, (poolAddress + kPoolStruc))), "_")[0])
131+ else valueOrElse(getInteger(this, (poolAddress + kPoolVote)), 0)
132+ let totalVote = if (isDefined(getString(this, kTotalStruc)))
133+ then parseIntValue(split(value(getString(this, kTotalStruc)), "_")[0])
134+ else valueOrElse(getInteger(this, kTotalVote), 0)
135+ let poolVoteDiff = (userPoolVoteNew - userPoolVote)
136+ let userTotalVoteNew = (userTotalVote + poolVoteDiff)
137+ if ((userTotalVoteNew > userGSWOPinGovernance))
138+ then throw(((((toString(i.caller) + " has ") + toString(userGSWOPinGovernance)) + " GSWOP in governance. New GSWOP in voting ") + toString(userTotalVoteNew)))
139+ else if ((0 > userTotalVoteNew))
140+ then throw("New userTotalVoteSWOPnew < 0")
141+ else if ((0 > userPoolVoteNew))
142+ then throw("New userPoolVoteSWOPnew < 0")
143+ else {
144+ let removePoolVote = -(poolVoteDiff)
145+ let poolVoteNew = if ((userPoolVoteNew >= userPoolVote))
146+ then (poolVote + poolVoteDiff)
147+ else (poolVote - removePoolVote)
148+ let totalVoteNew = if ((userPoolVoteNew >= userPoolVote))
149+ then (totalVote + poolVoteDiff)
150+ else (totalVote - removePoolVote)
151+ if (if ((0 > poolVoteNew))
152+ then true
153+ else (0 > totalVoteNew))
154+ then throw("One or more values are negative")
155+ else {
156+ let harvestEntries = if ((height > getPoolFirstHarvestStartHeight(poolAddress)))
157+ then [IntegerEntry((poolAddress + kHarvestPoolVote), poolVoteNew), IntegerEntry((((toString(i.caller) + "_") + poolAddress) + kHarvestUserPoolVote), userPoolVoteNew)]
158+ else nil
159+ let upUIntr = invoke(farmingAddr, "updateUserBoostInterest", [poolAddress, toString(i.caller)], nil)
160+ if ((upUIntr == upUIntr))
161+ then (([IntegerEntry((((toString(i.caller) + "_") + poolAddress) + kUserPoolVote), userPoolVoteNew), IntegerEntry((toString(i.caller) + kUserTotalVote), userTotalVoteNew), IntegerEntry((poolAddress + kPoolVote), poolVoteNew), IntegerEntry(kTotalVote, totalVoteNew)] ++ calcDeleteEntry(toString(i.caller), poolAddress)) ++ harvestEntries)
162+ else throw("Strict value is not equal to itself.")
163+ }
137164 }
138- else {
139- let uPoolVoteSWOP = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + poolAddress) + kUserPoolVoteSWOP)), 0)
140- $Tuple4(uPoolVoteSWOP, uPoolVoteSWOP, 0, 0)
141- }
142- let userPoolVoteSWOP = $t042184849._1
143- let userPoolActiveVoteSWOP = $t042184849._2
144- let userPoolVotePeriod = $t042184849._3
145- let userPoolFreezeSWOP = $t042184849._4
146- let $t048555361 = if (isDefined(getString(this, (toString(i.caller) + kUserTotalStruc))))
147- then {
148- let data = split(valueOrErrorMessage(getString(this, (toString(i.caller) + kUserTotalStruc)), "Empty kUserTotalStruc"), "_")
149- $Tuple3(parseIntValue(data[0]), parseIntValue(data[1]), parseIntValue(data[2]))
150- }
151- else {
152- let uPoolTotalSWOP = valueOrElse(getInteger(this, (toString(i.caller) + kUserTotalVoteSWOP)), 0)
153- $Tuple3(uPoolTotalSWOP, 0, 0)
154- }
155- let userTotalVoteSWOP = $t048555361._1
156- let userUnvoted = $t048555361._2
157- let userUnvotedPeriod = $t048555361._3
158- let $t053665832 = if (isDefined(getString(this, (poolAddress + kPoolStruc))))
159- then {
160- let data = split(valueOrErrorMessage(getString(this, (poolAddress + kPoolStruc)), "Empty kPoolStruc"), "_")
161- $Tuple3(parseIntValue(data[0]), parseIntValue(data[1]), parseIntValue(data[2]))
162- }
163- else {
164- let uPoolVoteSWOP = valueOrElse(getInteger(this, (poolAddress + kPoolVoteSWOP)), 0)
165- $Tuple4(uPoolVoteSWOP, uPoolVoteSWOP, 0, 0)
166- }
167- let poolVoteSWOP = $t053665832._1
168- let poolActiveSWOP = $t053665832._2
169- let poolPeriod = $t053665832._3
170- let $t058386272 = if (isDefined(getString(this, kTotalStruc)))
171- then {
172- let data = split(valueOrErrorMessage(getString(this, kTotalStruc), "Empty kTotalStruc"), "_")
173- $Tuple3(parseIntValue(data[0]), parseIntValue(data[1]), parseIntValue(data[2]))
174- }
175- else {
176- let uTotalVoteSWOP = valueOrElse(getInteger(this, kTotalVoteSWOP), 0)
177- $Tuple4(uTotalVoteSWOP, uTotalVoteSWOP, 0, 0)
178- }
179- let totalVoteSWOP = $t058386272._1
180- let totalActiveSWOP = $t058386272._2
181- let totalPeriod = $t058386272._3
182- let poolVoteDiffSWOP = (userPoolVoteSWOPnew - userPoolVoteSWOP)
183- let userTotalVoteSWOPnew = (userTotalVoteSWOP + poolVoteDiffSWOP)
184- if (!(isCallerInGovernance(i.caller)))
185- then throw("This address has 0 SWOP in Governance dApp")
186- else if ((userTotalVoteSWOPnew > userSWOPinGovernance))
187- then throw(((((toString(this) + " has ") + toString(userSWOPinGovernance)) + " SWOP in governance. New SWOP in voting ") + toString(userTotalVoteSWOPnew)))
188- else if ((0 > userTotalVoteSWOPnew))
189- then throw("New userTotalVoteSWOPnew < 0")
190- else if ((0 > userPoolVoteSWOPnew))
191- then throw("New userPoolVoteSWOPnew < 0")
192- else {
193- let amountOfVoting = split(valueOrElse(getString(this, (((toString(i.caller) + "_") + poolAddress) + kUserPoolStruc)), ""), "_")
194- let amountPoolStract = split(valueOrElse(getString(this, (poolAddress + kPoolStruc)), ""), "_")
195- let harvestPoolActiveVoteStrucEntry = if (if ((valueOrElse(getString(this, (poolAddress + kPoolStruc)), "") != ""))
196- then (currPeriod != valueOrElse(parseInt(amountPoolStract[2]), 0))
197- else false)
198- then {
199- let harvestPoolActiveVoteStruc = ((amountPoolStract[1] + "_") + amountPoolStract[2])
200-[StringEntry((poolAddress + kHarvestPoolActiveVoteStruc), harvestPoolActiveVoteStruc)]
201- }
202- else nil
203- let harvestUserPoolActiveVoteStrucEntry = if (if ((valueOrElse(getString(this, (((toString(i.caller) + "_") + poolAddress) + kUserPoolStruc)), "") != ""))
204- then (currPeriod != valueOrElse(parseInt(amountOfVoting[2]), 0))
205- else false)
206- then {
207- let harvestUserPoolActiveVoteStruc = ((amountOfVoting[1] + "_") + amountOfVoting[2])
208-[StringEntry((((toString(i.caller) + "_") + poolAddress) + kHarvestUserPoolActiveVoteStruc), harvestUserPoolActiveVoteStruc)]
209- }
210- else nil
211- if ((userPoolVoteSWOPnew >= userPoolVoteSWOP))
212- then {
213- let coef = votingCoef()
214- let userPoolActiveVoteSWOPnew = if ((userPoolVotePeriod == currPeriod))
215- then (userPoolActiveVoteSWOP + fraction(poolVoteDiffSWOP, coef, scale8))
216- else (userPoolVoteSWOP + fraction(poolVoteDiffSWOP, coef, scale8))
217- let userPoolFreezeSWOPnew = if ((userPoolVotePeriod == currPeriod))
218- then userPoolFreezeSWOP
219- else userPoolVoteSWOP
220- let userUnvotedNew = if ((userUnvotedPeriod == currPeriod))
221- then max([0, (userUnvoted - poolVoteDiffSWOP)])
222- else 0
223- let userUnvotedPeriodNew = currPeriod
224- let userPoolStrucNew = ((((((toString(userPoolVoteSWOPnew) + "_") + toString(userPoolActiveVoteSWOPnew)) + "_") + toString(currPeriod)) + "_") + toString(userPoolFreezeSWOPnew))
225- let userPoolEntry = [StringEntry((((toString(i.caller) + "_") + poolAddress) + kUserPoolStruc), userPoolStrucNew)]
226- let userTotalStrucNew = ((((toString(userTotalVoteSWOPnew) + "_") + toString(userUnvotedNew)) + "_") + toString(userUnvotedPeriodNew))
227- let userTotalEntry = [StringEntry((toString(i.caller) + kUserTotalStruc), userTotalStrucNew)]
228- let poolVoteSWOPnew = (poolVoteSWOP + poolVoteDiffSWOP)
229- let poolActiveSWOPnew = if ((poolPeriod == currPeriod))
230- then (poolActiveSWOP + fraction(poolVoteDiffSWOP, coef, scale8))
231- else (poolVoteSWOP + fraction(poolVoteDiffSWOP, coef, scale8))
232- let poolStrucNew = ((((toString(poolVoteSWOPnew) + "_") + toString(poolActiveSWOPnew)) + "_") + toString(currPeriod))
233- let poolEntry = [StringEntry((poolAddress + kPoolStruc), poolStrucNew)]
234- let totalVoteSWOPnew = (totalVoteSWOP + poolVoteDiffSWOP)
235- let totalActiveSWOPnew = if ((totalPeriod == currPeriod))
236- then (totalActiveSWOP + fraction(poolVoteDiffSWOP, coef, scale8))
237- else (totalVoteSWOP + fraction(poolVoteDiffSWOP, coef, scale8))
238- let totalStrucNew = ((((toString(totalVoteSWOPnew) + "_") + toString(totalActiveSWOPnew)) + "_") + toString(currPeriod))
239- let totalEntry = [StringEntry(kTotalStruc, totalStrucNew)]
240- ((((((userPoolEntry ++ userTotalEntry) ++ poolEntry) ++ totalEntry) ++ calcDeleteEntry(toString(i.caller), poolAddress, userPoolVoteSWOPnew)) ++ harvestPoolActiveVoteStrucEntry) ++ harvestUserPoolActiveVoteStrucEntry)
241- }
242- else {
243- let removePoolVote = -(poolVoteDiffSWOP)
244- let userPoolFreezeSWOPnew = if ((userPoolVotePeriod == currPeriod))
245- then userPoolFreezeSWOP
246- else userPoolVoteSWOP
247- let userPoolFreezeSWOP2 = min([userPoolFreezeSWOP, userPoolVoteSWOP])
248- let userPoolFreezeSWOPnew2 = min([userPoolFreezeSWOPnew, userPoolVoteSWOPnew])
249- let userPoolActiveVoteSWOPnew = (userPoolFreezeSWOPnew2 + (if (((userPoolVoteSWOP - userPoolFreezeSWOP) == 0))
250- then 0
251- else fraction((userPoolActiveVoteSWOP - userPoolFreezeSWOP), (userPoolVoteSWOPnew - userPoolFreezeSWOPnew2), (userPoolVoteSWOP - userPoolFreezeSWOP))))
252- let userPoolActiveVoteDiff = (userPoolActiveVoteSWOPnew - (if ((userPoolVotePeriod == currPeriod))
253- then userPoolActiveVoteSWOP
254- else userPoolVoteSWOP))
255- let newUnvoted = max([0, (removePoolVote - (if ((userPoolVotePeriod == currPeriod))
256- then (userPoolVoteSWOP - userPoolFreezeSWOP2)
257- else 0))])
258- let userUnvotedNew = (newUnvoted + (if ((userUnvotedPeriod == currPeriod))
259- then userUnvoted
260- else 0))
261- let userUnvotedPeriodNew = if ((newUnvoted > 0))
262- then currPeriod
263- else userUnvotedPeriod
264- let userPoolStrucNew = ((((((toString(userPoolVoteSWOPnew) + "_") + toString(userPoolActiveVoteSWOPnew)) + "_") + toString(currPeriod)) + "_") + toString(userPoolFreezeSWOPnew))
265- let userPoolEntry = [StringEntry((((toString(i.caller) + "_") + poolAddress) + kUserPoolStruc), userPoolStrucNew)]
266- let userTotalStrucNew = ((((toString(userTotalVoteSWOPnew) + "_") + toString(userUnvotedNew)) + "_") + toString(userUnvotedPeriodNew))
267- let userTotalEntry = [StringEntry((toString(i.caller) + kUserTotalStruc), userTotalStrucNew)]
268- let poolVoteSWOPnew = (poolVoteSWOP - removePoolVote)
269- let poolActiveSWOPnew = if ((poolPeriod == currPeriod))
270- then (poolActiveSWOP + userPoolActiveVoteDiff)
271- else (poolVoteSWOP + userPoolActiveVoteDiff)
272- let poolStrucNew = ((((toString(poolVoteSWOPnew) + "_") + toString(poolActiveSWOPnew)) + "_") + toString(currPeriod))
273- let poolEntry = [StringEntry((poolAddress + kPoolStruc), poolStrucNew)]
274- let totalVoteSWOPnew = (totalVoteSWOP - removePoolVote)
275- let totalActiveSWOPnew = if ((totalPeriod == currPeriod))
276- then (totalActiveSWOP + userPoolActiveVoteDiff)
277- else (totalVoteSWOP + userPoolActiveVoteDiff)
278- let totalStrucNew = ((((toString(totalVoteSWOPnew) + "_") + toString(totalActiveSWOPnew)) + "_") + toString(currPeriod))
279- let totalEntry = [StringEntry(kTotalStruc, totalStrucNew)]
280- let allNewValues = [currPeriod, userPoolFreezeSWOPnew, userPoolActiveVoteSWOPnew, userPoolFreezeSWOPnew, userUnvotedNew, userUnvotedPeriodNew, poolVoteSWOPnew, poolActiveSWOPnew, totalVoteSWOPnew, totalActiveSWOPnew]
281- if ((0 > min(allNewValues)))
282- then throw("One or more values are negative")
283- else ((((((userPoolEntry ++ userTotalEntry) ++ poolEntry) ++ totalEntry) ++ calcDeleteEntry(toString(i.caller), poolAddress, userPoolVoteSWOPnew)) ++ harvestPoolActiveVoteStrucEntry) ++ harvestUserPoolActiveVoteStrucEntry)
284- }
285- }
286- }
287165 })
288166
289167
290168
291169 @Callable(i)
292-func shutdown () = if (!(active))
293- then throw(("DApp is already suspended. Cause: " + valueOrElse(getString(this, keyCause), "the cause wasn't specified")))
294- else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStartStop], i.callerPublicKey)))
295- then throw("Only admin can call this function")
296- else suspend("Paused by admin")
170+func shutdown () = valueOrElse(isAdminCall(i), if (!(active))
171+ then throw(("DApp is already suspended. Cause: " + valueOrElse(getString(this, kCause), "the cause wasn't specified")))
172+ else suspend("Paused by admin"))
297173
298174
299175
300176 @Callable(i)
301-func activate () = if (active)
177+func activate () = valueOrElse(isAdminCall(i), if (active)
302178 then throw("DApp is already active")
303- else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStartStop], i.callerPublicKey)))
304- then throw("Only admin can call this function")
305- else [BooleanEntry(keyActive, true), DeleteEntry(keyCause)]
179+ else [BooleanEntry(kActive, true), DeleteEntry(kCause)])
306180
307181
308182 @Verifier(tx)
309183 func verify () = {
310184 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
311185 then 1
312186 else 0
313187 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
314188 then 1
315189 else 0
316190 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
317191 then 1
318192 else 0
319193 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
320194 }
321195

github/deemru/w8io/169f3d6 
73.51 ms