tx · AC5nvQNEV3xTDZp4XrdVKkmYkKDXVsf7JrbU7A96AaCK

3MwstV5kwngSR99soeemi1AV7VXiZXRHVnX:  -0.03200000 Waves

2022.08.31 12:23 [2208437] smart account 3MwstV5kwngSR99soeemi1AV7VXiZXRHVnX > SELF 0.00000000 Waves

{ "type": 13, "id": "AC5nvQNEV3xTDZp4XrdVKkmYkKDXVsf7JrbU7A96AaCK", "fee": 3200000, "feeAssetId": null, "timestamp": 1661937824559, "version": 2, "chainId": 84, "sender": "3MwstV5kwngSR99soeemi1AV7VXiZXRHVnX", "senderPublicKey": "7kYMgWAteuXyagbkwuPuripHt5mbmodGS8SuEhyXSgBY", "proofs": [ "2hBr8bFwcmNucK8fN44HNkqR44pLfmsngCviW7C8Bcjh9iHTJ8kz6APv1g6C3Jie2Y8rZ57NCALrqDvZxiyMZhsG" ], "script": "base64:BgJXCAISBAoCEQESBQoDCAEEEgQKAgEEEgMKAQESBgoECAgBCBIECgIIARIECgIRARIFCgMBCAgSBQoDCAEBEgASABIECgIRBBIECgIBARIAEgASABIDCgEBWQAJUFJFQ0lTSU9OAMCEPQAFTUFYX0EAwIQ9AAxNQVhfQV9DSEFOR0UACgANTUlOX1JBTVBfVElNRQkAaQIAgKMFADwAB2tBc3NldHMCCWFzc2V0X2lkcwANa0Fzc2V0QmFsYW5jZQIIX2JhbGFuY2UAB2tBY3RpdmUCBmFjdGl2ZQAGa0NhdXNlAg5zaHV0ZG93bl9jYXVzZQANa1NoYXJlQXNzZXRJZAIOc2hhcmVfYXNzZXRfaWQAEWtTaGFyZUFzc2V0U3VwcGx5AhJzaGFyZV9hc3NldF9zdXBwbHkABGtGZWUCCmNvbW1pc3Npb24AEmtEQXBwVGhyZXNob2xkQ29lZgIRZEFwcFRocmVzaG9sZENvZWYADGtVU0ROQWRkcmVzcwIYc3Rha2luZ191c2RubnNidF9hZGRyZXNzAAprRGlzY291bnRzAglkaXNjb3VudHMAD2tEaXNjb3VudFZhbHVlcwIPZGlzY291bnRfdmFsdWVzAA5rVXNlclN3b3BJbkdvdgIMX1NXT1BfYW1vdW50AA1rRmlyc3RIYXJ2ZXN0Ag1maXJzdF9oYXJ2ZXN0ABNrRmlyc3RIYXJ2ZXN0SGVpZ2h0AhRmaXJzdF9oYXJ2ZXN0X2hlaWdodAALa1NoYXJlTGltaXQCHHNoYXJlX2xpbWl0X29uX2ZpcnN0X2hhcnZlc3QAC2tCYXNlUGVyaW9kAgtiYXNlX3BlcmlvZAANa1BlcmlvZExlbmd0aAINcGVyaW9kX2xlbmd0aAAMa1N0YXJ0SGVpZ2h0AgxzdGFydF9oZWlnaHQADWtBZG1pblB1YktleTECC2FkbWluX3B1Yl8xAA1rQWRtaW5QdWJLZXkyAgthZG1pbl9wdWJfMgANa0FkbWluUHViS2V5MwILYWRtaW5fcHViXzMAEmtBZG1pbkludm9rZVB1YktleQIQYWRtaW5faW52b2tlX3B1YgAQa01vbmV5Qm94QWRkcmVzcwIRbW9uZXlfYm94X2FkZHJlc3MAC2tHb3ZBZGRyZXNzAhJnb3Zlcm5hbmNlX2FkZHJlc3MADmtWb3RpbmdBZGRyZXNzAg52b3RpbmdfYWRkcmVzcwAPa0Zhcm1pbmdBZGRyZXNzAg9mYXJtaW5nX2FkZHJlc3MABm9yYWNsZQkBB0FkZHJlc3MBARoBVOlFqh6QLzqu8boO5i6akl8amITh82KzCAETZ2V0QmFzZTU4RnJvbU9yYWNsZQEDa2V5BAckbWF0Y2gwCQCdCAIFBm9yYWNsZQUDa2V5AwkAAQIFByRtYXRjaDACBlN0cmluZwQGc3RyaW5nBQckbWF0Y2gwCQDZBAEFBnN0cmluZwQHbm90aGluZwUHJG1hdGNoMAkAAgEJAKwCAgUDa2V5AghpcyBlbXB0eQAMYWRtaW5QdWJLZXkxCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFDWtBZG1pblB1YktleTEADGFkbWluUHViS2V5MgkBE2dldEJhc2U1OEZyb21PcmFjbGUBBQ1rQWRtaW5QdWJLZXkyAAxhZG1pblB1YktleTMJARNnZXRCYXNlNThGcm9tT3JhY2xlAQUNa0FkbWluUHViS2V5MwARYWRtaW5QdWJLZXlJbnZva2UJARNnZXRCYXNlNThGcm9tT3JhY2xlAQUSa0FkbWluSW52b2tlUHViS2V5AA9tb25leUJveEFkZHJlc3MJAQdBZGRyZXNzAQkBE2dldEJhc2U1OEZyb21PcmFjbGUBBRBrTW9uZXlCb3hBZGRyZXNzAApnb3ZBZGRyZXNzCQEHQWRkcmVzcwEJARNnZXRCYXNlNThGcm9tT3JhY2xlAQULa0dvdkFkZHJlc3MAEnN0YWtpbmdVU0ROQWRkcmVzcwkBB0FkZHJlc3MBCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFDGtVU0ROQWRkcmVzcwANdm90aW5nQWRkcmVzcwkBB0FkZHJlc3MBCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFDmtWb3RpbmdBZGRyZXNzAA5mYXJtaW5nQWRkcmVzcwkBB0FkZHJlc3MBCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFD2tGYXJtaW5nQWRkcmVzcwASY2FwTW9uZXlCb3hBZGRyZXNzCQEHQWRkcmVzcwEBGgFUXmlqF+mqIH0+j69gu0TO8ei+zt5lnFLzAARVU0ROASBvJKPKqzDcUimY6CxhWu5afyNNwi11u+mdqlTg0tAHwQANc3Rha2luZ0Fzc2V0cwkAzAgCCQDYBAEFBFVTRE4FA25pbAAKYmFzZVBlcmlvZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFDXZvdGluZ0FkZHJlc3MFC2tCYXNlUGVyaW9kAhFFbXB0eSBrQmFzZVBlcmlvZAALc3RhcnRIZWlnaHQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQ12b3RpbmdBZGRyZXNzBQxrU3RhcnRIZWlnaHQCEkVtcHR5IGtTdGFydEhlaWdodAAMcGVyaW9kTGVuZ3RoCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUNdm90aW5nQWRkcmVzcwUNa1BlcmlvZExlbmd0aAITRW1wdHkga1BlcmlvZExlbmd0aAAVZmlyc3RIYXJ2ZXN0RW5kUGVyaW9kCQBkAgkAZAIFCmJhc2VQZXJpb2QJAGkCCQBlAgUGaGVpZ2h0BQtzdGFydEhlaWdodAUMcGVyaW9kTGVuZ3RoAAMABmFjdGl2ZQkBEUBleHRyTmF0aXZlKDEwNTEpAgUEdGhpcwUHa0FjdGl2ZQAMc2hhcmVBc3NldElkCQDZBAEJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMFDWtTaGFyZUFzc2V0SWQAC3NoYXJlU3VwcGx5CQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzBRFrU2hhcmVBc3NldFN1cHBseQAJZmVlU2NhbGU2AMCEPQADZmVlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzBQRrRmVlAA1mZWVHb3Zlcm5hbmNlCQBrAwAoBQlmZWVTY2FsZTYAZAAJaW5pdGlhbF9BCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzAglpbml0aWFsX0EACGZ1dHVyZV9BCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzAghmdXR1cmVfQQAOaW5pdGlhbF9BX3RpbWUJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwIOaW5pdGlhbF9BX3RpbWUAAAANZnV0dXJlX0FfdGltZQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzAg1mdXR1cmVfQV90aW1lAAAACGFzc2V0SWRzCQC1CQIJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMFB2tBc3NldHMCASwABm5Db2lucwkAkAMBBQhhc3NldElkcwEHc3VzcGVuZAEFY2F1c2UJAMwIAgkBDEJvb2xlYW5FbnRyeQIFB2tBY3RpdmUHCQDMCAIJAQtTdHJpbmdFbnRyeQIFBmtDYXVzZQUFY2F1c2UFA25pbAENdGhyb3dJc0FjdGl2ZQAJAAIBAhZEQXBwIGlzIGFscmVhZHkgYWN0aXZlAQhpc0FjdGl2ZQADBQZhY3RpdmUFBHVuaXQJAAIBAh9EQXBwIGlzIGluYWN0aXZlIGF0IHRoaXMgbW9tZW50AQtpc0FkbWluQ2FsbAEBaQMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFDGFkbWluUHViS2V5MQkAzAgCBQxhZG1pblB1YktleTIJAMwIAgUMYWRtaW5QdWJLZXkzBQNuaWwIBQFpD2NhbGxlclB1YmxpY0tleQUEdW5pdAkAAgECIU9ubHkgYWRtaW4gY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgEKaXNTZWxmQ2FsbAEBaQMJAAACBQR0aGlzCAUBaQZjYWxsZXIFBHVuaXQJAAIBAitPbmx5IGNvbnRyYWN0IGl0c2VsZiBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uAARiaWcyCQC2AgEAAgAOYmxvY2tUaW1lc3RhbXAFBmhlaWdodAEGYXNzZXJ0AQFhAwUBYQcGARRjYWxjdWxhdGVGZWVEaXNjb3VudAEIdXNlckFkZHIECnN3b3BBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUKZ292QWRkcmVzcwkArAICCQClCAEFCHVzZXJBZGRyBQ5rVXNlclN3b3BJbkdvdgAABA5kaXNjb3VudFZhbHVlcwkAtQkCCQERQGV4dHJOYXRpdmUoMTA1MykCBQZvcmFjbGUFD2tEaXNjb3VudFZhbHVlcwIBLAQJZGlzY291bnRzCQC1CQIJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBm9yYWNsZQUKa0Rpc2NvdW50cwIBLAMDCQBnAgUKc3dvcEFtb3VudAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDmRpc2NvdW50VmFsdWVzAAAJAGYCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUOZGlzY291bnRWYWx1ZXMAAQUKc3dvcEFtb3VudAcJAGUCBQlmZWVTY2FsZTYJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQlkaXNjb3VudHMAAAMDCQBnAgUKc3dvcEFtb3VudAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDmRpc2NvdW50VmFsdWVzAAEJAGYCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUOZGlzY291bnRWYWx1ZXMAAgUKc3dvcEFtb3VudAcJAGUCBQlmZWVTY2FsZTYJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQlkaXNjb3VudHMAAQMDCQBnAgUKc3dvcEFtb3VudAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDmRpc2NvdW50VmFsdWVzAAIJAGYCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUOZGlzY291bnRWYWx1ZXMAAwUKc3dvcEFtb3VudAcJAGUCBQlmZWVTY2FsZTYJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQlkaXNjb3VudHMAAgMDCQBnAgUKc3dvcEFtb3VudAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDmRpc2NvdW50VmFsdWVzAAMJAGYCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUOZGlzY291bnRWYWx1ZXMABAUKc3dvcEFtb3VudAcJAGUCBQlmZWVTY2FsZTYJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQlkaXNjb3VudHMAAwMJAGcCBQpzd29wQW1vdW50CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUOZGlzY291bnRWYWx1ZXMABAkAZQIFCWZlZVNjYWxlNgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCWRpc2NvdW50cwAEBQlmZWVTY2FsZTYBAl9BAAQCdDEFDWZ1dHVyZV9BX3RpbWUEAkExBQhmdXR1cmVfQQMJAGYCBQJ0MQUOYmxvY2tUaW1lc3RhbXAEAkEwBQlpbml0aWFsX0EEAnQwBQ5pbml0aWFsX0FfdGltZQMJAGYCBQJBMQUCQTAJAGQCBQJBMAkAaQIJAGgCCQBlAgUCQTEFAkEwCQBlAgUOYmxvY2tUaW1lc3RhbXAFAnQwCQBlAgUCdDEFAnQwCQBlAgUCQTAJAGkCCQBoAgkAZQIFAkEwBQJBMQkAZQIFDmJsb2NrVGltZXN0YW1wBQJ0MAkAZQIFAnQxBQJ0MAUCQTEB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kQMCBQp4cF9yZWR1Y2VkBQFpBAJkeQkAZQIJAGUCBQx4cF9yZWR1Y2VkX2kJAQdnZXRfeV9EBAUDYW1wBQFpBQp4cF9yZWR1Y2VkBQJEMQABCQCUCgIFAmR5CQBlAgUEZHlfMAUCZHkBDWdldFN0ckFzc2V0SWQBB2Fzc2V0SWQEByRtYXRjaDAFB2Fzc2V0SWQDCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQCaWQFByRtYXRjaDAJANgEAQUCaWQDCQABAgUHJG1hdGNoMAIEVW5pdAQFd2F2ZXMFByRtYXRjaDACBVdBVkVTCQACAQILTWF0Y2ggZXJyb3IBGGNhbGNTdGFraW5nRnVuY0FuZEFkZHJlcwIFc3Rha2UHYXNzZXRJZAMFBXN0YWtlCQCUCgICDGxvY2tOZXV0cmlubwUSc3Rha2luZ1VTRE5BZGRyZXNzCQCUCgICDnVubG9ja05ldXRyaW5vBRJzdGFraW5nVVNETkFkZHJlc3MBEWNhbGNTdGFraW5nUGFyYW1zAwVzdGFrZQZhbW91bnQHYXNzZXRJZAMFBXN0YWtlBA0kdDAxMTA5OTExMTY1CQEYY2FsY1N0YWtpbmdGdW5jQW5kQWRkcmVzAgUFc3Rha2UFB2Fzc2V0SWQEBGNhbGwIBQ0kdDAxMTA5OTExMTY1Al8xBAtzdGFraW5nQWRkcggFDSR0MDExMDk5MTExNjUCXzIJAJYKBAUEY2FsbAULc3Rha2luZ0FkZHIFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUHYXNzZXRJZAUGYW1vdW50BQNuaWwEDSR0MDExMjUxMTEzMTcJARhjYWxjU3Rha2luZ0Z1bmNBbmRBZGRyZXMCBQVzdGFrZQUHYXNzZXRJZAQEY2FsbAgFDSR0MDExMjUxMTEzMTcCXzEEC3N0YWtpbmdBZGRyCAUNJHQwMTEyNTExMTMxNwJfMgkAlgoEBQRjYWxsBQtzdGFraW5nQWRkcgkAzAgCBQZhbW91bnQJAMwIAgkA2AQBBQdhc3NldElkBQNuaWwFA25pbAEFc3Rha2UCBmFtb3VudA1hc3NldElkU3RyaW5nAwkBD2NvbnRhaW5zRWxlbWVudAIFDXN0YWtpbmdBc3NldHMFDWFzc2V0SWRTdHJpbmcEDSR0MDExNTA0MTE2MDYJARFjYWxjU3Rha2luZ1BhcmFtcwMGBQZhbW91bnQJANkEAQUNYXNzZXRJZFN0cmluZwQEY2FsbAgFDSR0MDExNTA0MTE2MDYCXzEEBGFkZHIIBQ0kdDAxMTUwNDExNjA2Al8yBAZwYXJhbXMIBQ0kdDAxMTUwNDExNjA2Al8zBAhwYXltZW50cwgFDSR0MDExNTA0MTE2MDYCXzQJAPwHBAUEYWRkcgUEY2FsbAUGcGFyYW1zBQhwYXltZW50cwAAAQd1bnN0YWtlAgZhbW91bnQNYXNzZXRJZFN0cmluZwMJAQ9jb250YWluc0VsZW1lbnQCBQ1zdGFraW5nQXNzZXRzBQ1hc3NldElkU3RyaW5nBA0kdDAxMTc5MTExODk0CQERY2FsY1N0YWtpbmdQYXJhbXMDBwUGYW1vdW50CQDZBAEFDWFzc2V0SWRTdHJpbmcEBGNhbGwIBQ0kdDAxMTc5MTExODk0Al8xBARhZGRyCAUNJHQwMTE3OTExMTg5NAJfMgQGcGFyYW1zCAUNJHQwMTE3OTExMTg5NAJfMwQIcGF5bWVudHMIBQ0kdDAxMTc5MTExODk0Al80CQD8BwQFBGFkZHIFBGNhbGwFBnBhcmFtcwUIcGF5bWVudHMAAAEMc3Rha2VkQW1vdW50AQdhc3NldElkBBZzdGFrZWRBbW91bnRDYWxjdWxhdGVkBAckbWF0Y2gwBQdhc3NldElkAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEA2FJZAUHJG1hdGNoMAMJAAACBQNhSWQFBFVTRE4JAJoIAgUSc3Rha2luZ1VTRE5BZGRyZXNzCQCsAgIJAKwCAgkArAICAgxycGRfYmFsYW5jZV8JANgEAQUDYUlkAgFfCQClCAEFBHRoaXMAAAMJAAECBQckbWF0Y2gwAgRVbml0AAAJAAIBAgtNYXRjaCBlcnJvcgQHJG1hdGNoMAUWc3Rha2VkQW1vdW50Q2FsY3VsYXRlZAMJAAECBQckbWF0Y2gwAgNJbnQEAWkFByRtYXRjaDAFAWkAAAEPY2hlY2tTdXNwaWNpb3VzAAQQY29udHJhY3RCYWxhbmNlcwkBA194cAAKAQxjaGVja0JhbGFuY2UCA2FjYwdhc3NldElkBA0kdDAxMjUwNTEyNTMwBQNhY2MECnN1c3BpY2lvdXMIBQ0kdDAxMjUwNTEyNTMwAl8xBAFpCAUNJHQwMTI1MDUxMjUzMAJfMgMFCnN1c3BpY2lvdXMJAJQKAgUKc3VzcGljaW91cwUBaQQIYUJhbGFuY2UJAGQCCQDwBwIFBHRoaXMJANkEAQUHYXNzZXRJZAkBDHN0YWtlZEFtb3VudAEJANkEAQUHYXNzZXRJZAMJAGYCCQCRAwIFEGNvbnRyYWN0QmFsYW5jZXMFAWkFCGFCYWxhbmNlCQCUCgIGBQFpCQCUCgIHCQBkAgUBaQABCgACJGwFCGFzc2V0SWRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCBwAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQxjaGVja0JhbGFuY2UCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDE1CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPARFzdXNwZW5kU3VzcGljaW91cwEBaQkBB3N1c3BlbmQBCQCsAgICHVN1c3BpY2lvdXMgc3RhdGUgd2l0aCBhc3NldDogCQCRAwIFCGFzc2V0SWRzBQFpAQ5yZXR1cm5QYXltZW50cwIGY2FsbGVyCHBheW1lbnRzCgENcGFyc2VQYXltZW50cwIDYWNjB3BheW1lbnQJAM0IAgUDYWNjCQEOU2NyaXB0VHJhbnNmZXIDBQZjYWxsZXIIBQdwYXltZW50BmFtb3VudAgFB3BheW1lbnQHYXNzZXRJZAoAAiRsBQhwYXltZW50cwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQENcGFyc2VQYXltZW50cwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTUJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8BEmNoZWNrREFwcFRocmVzaG9sZAELbmV3QmFsYW5jZXMEEWRBcHBUaHJlc2hvbGRDb2VmCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUEdGhpcwUSa0RBcHBUaHJlc2hvbGRDb2VmAhhObyBkQXBwVGhyZXNob2xkQ29lZiBrZXkEDnRocmVzaG9sZFNjYWxlAJBOCgEPaXRlckFsbEJhbGFuY2VzAgNhY2MMdG9rZW5CYWxhbmNlBA0kdDAxMzUwOTEzNTUwBQNhY2MEDnRocmVzaG9sZEVycm9yCAUNJHQwMTM1MDkxMzU1MAJfMQQNY3V0ZWRCYWxhbmNlcwgFDSR0MDEzNTA5MTM1NTACXzIKARFpdGVyQ3V0ZWRCYWxhbmNlcwIKY2hlY2tSYXRpbw5jaGVja2VkQmFsYW5jZQQFcmF0aW8JAGsDBQx0b2tlbkJhbGFuY2UFDnRocmVzaG9sZFNjYWxlBQ5jaGVja2VkQmFsYW5jZQMDCQBmAgUFcmF0aW8JAGgCBRFkQXBwVGhyZXNob2xkQ29lZgUOdGhyZXNob2xkU2NhbGUGCQBmAgkAawMAAQUOdGhyZXNob2xkU2NhbGUFEWRBcHBUaHJlc2hvbGRDb2VmBQVyYXRpbwkAAgECOE5ldyBiYWxhbmNlIGluIGFzc2V0cyBvZiB0aGUgREFwcCBpcyBsZXNzIHRoYW4gdGhyZXNob2xkBwkAlAoCCgACJGwFDWN1dGVkQmFsYW5jZXMKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQ50aHJlc2hvbGRFcnJvcgoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQERaXRlckN1dGVkQmFsYW5jZXMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDE1CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPCQDRCAIFDWN1dGVkQmFsYW5jZXMAAAQNJHQwMTQwNzIxNDE3NQoAAiRsBQtuZXdCYWxhbmNlcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgcJANEIAgULbmV3QmFsYW5jZXMAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEPaXRlckFsbEJhbGFuY2VzAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxNQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwQOdGhyZXNob2xkRXJyb3IIBQ0kdDAxNDA3MjE0MTc1Al8xBAFiCAUNJHQwMTQwNzIxNDE3NQJfMgUOdGhyZXNob2xkRXJyb3IRA21zZwEBRAICeHADYW1wBAFECQEOZ2V0X0RfaW50ZXJuYWwCBQJ4cAUDYW1wCQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQICAUQFAUQFA25pbAUBRANtc2cBBGluaXQDBWNvaW5zAl9BDGZpcnN0SGFydmVzdAMJAQEhAQkAnggBBQR0aGlzCQACAQITQWxyZWFkeSBpbml0aWFsaXplZAQJc2hhcmVOYW1lAgtzX011bHRpX1VTRAQQc2hhcmVEZXNjcmlwdGlvbgkArAICAkJTaGFyZVRva2VuIG9mIFN3b3BGaSBwcm90b2NvbCBmb3IgTXVsdGlTdGFibGUgVVNEIHBvb2wgYXQgYWRkcmVzcyAJAKUIAQUEdGhpcwQKaXNzdWVUb2tlbgkAwggFBQlzaGFyZU5hbWUFEHNoYXJlRGVzY3JpcHRpb24AAAAGBgQHdG9rZW5JZAkAuAgBBQppc3N1ZVRva2VuBAliYXNlRW50cnkJAMwIAgkBC1N0cmluZ0VudHJ5AgUHa0Fzc2V0cwUFY29pbnMJAMwIAgkBDEludGVnZXJFbnRyeQICCWluaXRpYWxfQQUCX0EJAMwIAgkBDEludGVnZXJFbnRyeQICCGZ1dHVyZV9BBQJfQQkAzAgCCQEMSW50ZWdlckVudHJ5AgUEa0ZlZQkBEUBleHRyTmF0aXZlKDEwNTApAgUGb3JhY2xlAg1iYXNlX2ZlZV9mbGF0CQDMCAIJAQtTdHJpbmdFbnRyeQIFDWtTaGFyZUFzc2V0SWQJANgEAQUHdG9rZW5JZAkAzAgCCQEMSW50ZWdlckVudHJ5AgURa1NoYXJlQXNzZXRTdXBwbHkAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgUSa0RBcHBUaHJlc2hvbGRDb2VmAA8JAMwIAgkBDEJvb2xlYW5FbnRyeQIFB2tBY3RpdmUGCQDMCAIFCmlzc3VlVG9rZW4FA25pbAMFDGZpcnN0SGFydmVzdAkAzggCBQliYXNlRW50cnkJAMwIAgkBDEJvb2xlYW5FbnRyeQIFDWtGaXJzdEhhcnZlc3QFDGZpcnN0SGFydmVzdAkAzAgCCQEMSW50ZWdlckVudHJ5AgUTa0ZpcnN0SGFydmVzdEhlaWdodAkAZAIFC3N0YXJ0SGVpZ2h0CQBoAgUVZmlyc3RIYXJ2ZXN0RW5kUGVyaW9kBQxwZXJpb2RMZW5ndGgFA25pbAUJYmFzZUVudHJ5A21zZwEMYWRkTGlxdWlkaXR5Ag1taW5NaW50QW1vdW50DHN0YWtlRmFybWluZwkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAQDYW1wCQECX0EABAJ4cAkBA194cAAEAkQwAwkAAAIFC3NoYXJlU3VwcGx5AAAAAAkBB2dldERNZW0CBQJ4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YXJzZWRQYXltZW50cwgFDSR0MDE2OTE2MTcwMDICXzMDCQBmAgkAZQIFDHBheW1lbnRzU2l6ZQABBQ5wYXJzZWRQYXltZW50cwkAAgECF0luY29yZWN0IHBheW1lbnRzIG9yZGVyAwkBEmNoZWNrREFwcFRocmVzaG9sZAEFC25ld0JhbGFuY2VzCQEFdGhyb3cABAJEMQkBB2dldERNZW0CBQtuZXdCYWxhbmNlcwUDYW1wAwkBBmFzc2VydAEJAGYCBQJEMQUCRDAJAAIBAgdEMSA+IEQwBAtmZWVEaXNjb3VudAkBFGNhbGN1bGF0ZUZlZURpc2NvdW50AQgFA21zZwZjYWxsZXIKARFjYWxjU2NyaXB0QWN0aW9ucwIDYWNjCm5ld0JhbGFuY2UEDSR0MDE3NDA3MTc0NDgFA2FjYwQLaW52QmFsYW5jZXMIBQ0kdDAxNzQwNzE3NDQ4Al8xBA1zY3JpcHRBY3Rpb25zCAUNJHQwMTc0MDcxNzQ0OAJfMgQBaQgFDSR0MDE3NDA3MTc0NDgCXzMDCQBmAgULc2hhcmVTdXBwbHkAAAQEX2ZlZQkAaQIJAGgCCQBuBAUDZmVlBQtmZWVEaXNjb3VudAUJZmVlU2NhbGU2BQdDRUlMSU5HBQZuQ29pbnMJAGgCAAQJAGUCBQZuQ29pbnMAAQQEZmVlcwQMaWRlYWxCYWxhbmNlCQBrAwUCRDEJAJEDAgUCeHAFAWkFAkQwBApkaWZmZXJlbmNlAwkAZgIFDGlkZWFsQmFsYW5jZQUKbmV3QmFsYW5jZQkAZQIFDGlkZWFsQmFsYW5jZQUKbmV3QmFsYW5jZQkAZQIFCm5ld0JhbGFuY2UFDGlkZWFsQmFsYW5jZQkAawMFBF9mZWUFCmRpZmZlcmVuY2UFCWZlZVNjYWxlNgQOZ292ZXJuYW5jZUZlZXMJAGsDBQRmZWVzBQ1mZWVHb3Zlcm5hbmNlBQlmZWVTY2FsZTYEDGZpbmFsQmFsYW5jZQkAZQIFCm5ld0JhbGFuY2UFDmdvdmVybmFuY2VGZWVzBBBpbnZhcmlhbnRCYWxhbmNlCQBlAgUKbmV3QmFsYW5jZQUEZmVlcwQCdXMJAQd1bnN0YWtlAgUEZmVlcwkAkQMCBQhhc3NldElkcwUBaQMJAAACBQJ1cwUCdXMJAJUKAwkAzQgCBQtpbnZCYWxhbmNlcwUQaW52YXJpYW50QmFsYW5jZQkAzggCBQ1zY3JpcHRBY3Rpb25zCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFEmNhcE1vbmV5Qm94QWRkcmVzcwkAZQIFBGZlZXMFDmdvdmVybmFuY2VGZWVzCQDZBAEJAJEDAgUIYXNzZXRJZHMFAWkJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUPbW9uZXlCb3hBZGRyZXNzBQ5nb3Zlcm5hbmNlRmVlcwkA2QQBCQCRAwIFCGFzc2V0SWRzBQFpCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAJEDAgUIYXNzZXRJZHMFAWkFDWtBc3NldEJhbGFuY2UFDGZpbmFsQmFsYW5jZQUDbmlsCQBkAgUBaQABCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQCVCgMJAM0IAgULaW52QmFsYW5jZXMFCm5ld0JhbGFuY2UJAM0IAgUNc2NyaXB0QWN0aW9ucwkBDEludGVnZXJFbnRyeQIJAKwCAgkAkQMCBQhhc3NldElkcwUBaQUNa0Fzc2V0QmFsYW5jZQUKbmV3QmFsYW5jZQkAZAIFAWkAAQQNJHQwMTg3ODUxODg3MwoAAiRsBQtuZXdCYWxhbmNlcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJUKAwUDbmlsBQNuaWwAAAoBBSRmMV8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQERY2FsY1NjcmlwdEFjdGlvbnMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjFfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDE1CQEFJGYxXzICCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPBAtpbnZCYWxhbmNlcwgFDSR0MDE4Nzg1MTg4NzMCXzEEDXNjcmlwdEFjdGlvbnMIBQ0kdDAxODc4NTE4ODczAl8yBAJEMgkBB2dldERNZW0CBQtpbnZCYWxhbmNlcwUDYW1wBAttaW50X2Ftb3VudAMJAAACBQtzaGFyZVN1cHBseQAABQJEMQkAawMFC3NoYXJlU3VwcGx5CQBlAgUCRDIFAkQwBQJEMAMJAQZhc3NlcnQBCQBnAgULbWludF9hbW91bnQFDW1pbk1pbnRBbW91bnQJAAIBAhRTbGlwcGFnZSBzY3Jld2VkIHlvdQMFDHN0YWtlRmFybWluZwQCcmUJAPwHBAUEdGhpcwIMcmVpc3N1ZVNoYXJlCQDMCAIFC21pbnRfYW1vdW50BQNuaWwFA25pbAMJAAACBQJyZQUCcmUEAXMJAPwHBAUOZmFybWluZ0FkZHJlc3MCD2xvY2tTaGFyZVRva2VucwkAzAgCCQClCAEFBHRoaXMFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUMc2hhcmVBc3NldElkBQttaW50X2Ftb3VudAUDbmlsAwkAAAIFAXMFAXMJAM0IAgUNc2NyaXB0QWN0aW9ucwkBDEludGVnZXJFbnRyeQIFEWtTaGFyZUFzc2V0U3VwcGx5CQBkAgULc2hhcmVTdXBwbHkFC21pbnRfYW1vdW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQDOCAIFDXNjcmlwdEFjdGlvbnMJAMwIAgkBB1JlaXNzdWUDBQxzaGFyZUFzc2V0SWQFC21pbnRfYW1vdW50BgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUDbXNnBmNhbGxlcgULbWludF9hbW91bnQFDHNoYXJlQXNzZXRJZAkAzAgCCQEMSW50ZWdlckVudHJ5AgURa1NoYXJlQXNzZXRTdXBwbHkJAGQCBQtzaGFyZVN1cHBseQULbWludF9hbW91bnQFA25pbANtc2cBDHJlaXNzdWVTaGFyZQEGYW1vdW50CQELdmFsdWVPckVsc2UCCQEKaXNTZWxmQ2FsbAEFA21zZwkAzAgCCQEHUmVpc3N1ZQMFDHNoYXJlQXNzZXRJZAUGYW1vdW50BgUDbmlsA21zZwEFZ2V0RHkECWFzc2V0RnJvbQdhc3NldFRvAmR4C3VzZXJBZGRyZXNzBAJ4cAkBA194cAAECWZyb21JbmRleAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDPCAIFCGFzc2V0SWRzBQlhc3NldEZyb20CEHVua25vd24gdG9rZW4gaW4EB3RvSW5kZXgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAzwgCBQhhc3NldElkcwUHYXNzZXRUbwIRdW5rbm93biB0b2tlbiBvdXQEAXgJAGQCCQCRAwIFAnhwBQlmcm9tSW5kZXgFAmR4BAF5CQEEZ2V0WQQFCWZyb21JbmRleAUHdG9JbmRleAUBeAUCeHAEAmR5CQBlAgkAZQIJAJEDAgUCeHAFB3RvSW5kZXgFAXkAAQQLZmVlRGlzY291bnQJARRjYWxjdWxhdGVGZWVEaXNjb3VudAEJAQdBZGRyZXNzAQkA2QQBBQt1c2VyQWRkcmVzcwQEX2ZlZQkAawMJAG4EBQNmZWUFC2ZlZURpc2NvdW50BQlmZWVTY2FsZTYFB0NFSUxJTkcFAmR5BQlmZWVTY2FsZTYJAJQKAgUDbmlsCQCUCgIJAGUCBQJkeQUEX2ZlZQUEX2ZlZQNtc2cBCGV4Y2hhbmdlAgh0b2tlbk91dAZtaW5fZHkJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQADCQECIT0CCQCQAwEIBQNtc2cIcGF5bWVudHMAAQkAAgECE3NpemUocGF5bWVudHMpICE9IDEECnN1c3BpY2lvdXMJAQ9jaGVja1N1c3BpY2lvdXMAAwgFCnN1c3BpY2lvdXMCXzEJAM4IAgkBEXN1c3BlbmRTdXNwaWNpb3VzAQgFCnN1c3BpY2lvdXMCXzIJAQ5yZXR1cm5QYXltZW50cwIIBQNtc2cGY2FsbGVyCAUDbXNnCHBheW1lbnRzBAdwYXltZW50CQCRAwIIBQNtc2cIcGF5bWVudHMAAAQHdG9rZW5JbgkBDWdldFN0ckFzc2V0SWQBCAUHcGF5bWVudAdhc3NldElkBAt0b2tlbk91dEI1OAkA2QQBBQh0b2tlbk91dAQCZHgIBQdwYXltZW50BmFtb3VudAQJZnJvbUluZGV4CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAM8IAgUIYXNzZXRJZHMFB3Rva2VuSW4CEHVua25vd24gdG9rZW4gaW4EB3RvSW5kZXgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAzwgCBQhhc3NldElkcwUIdG9rZW5PdXQCEXVua25vd24gdG9rZW4gb3V0BAJ4cAkBA194cAAEAXgJAGQCCQCRAwIFAnhwBQlmcm9tSW5kZXgFAmR4BAF5CQEEZ2V0WQQFCWZyb21JbmRleAUHdG9JbmRleAUBeAUCeHAEA19keQkAZQIJAGUCCQCRAwIFAnhwBQd0b0luZGV4BQF5AAEEC2ZlZURpc2NvdW50CQEUY2FsY3VsYXRlRmVlRGlzY291bnQBCAUDbXNnBmNhbGxlcgQEX2ZlZQkAawMFA19keQkAbgQFA2ZlZQULZmVlRGlzY291bnQFCWZlZVNjYWxlNgUHQ0VJTElORwUJZmVlU2NhbGU2BAJkeQkAZQIFA19keQUEX2ZlZQQOZ292ZXJuYW5jZUZlZXMJAGsDBQRfZmVlBQ1mZWVHb3Zlcm5hbmNlBQlmZWVTY2FsZTYDCQEGYXNzZXJ0AQkAZwIFAmR5BQZtaW5fZHkJAAIBAi5FeGNoYW5nZSByZXN1bHRlZCBpbiBmZXdlciBjb2lucyB0aGFuIGV4cGVjdGVkCgEPbWFrZU5ld0JhbGFuY2VzAgNhY2MMdG9rZW5CYWxhbmNlBA0kdDAyMTU4NTIxNjExBQNhY2MEC25ld0JhbGFuY2VzCAUNJHQwMjE1ODUyMTYxMQJfMQQBaQgFDSR0MDIxNTg1MjE2MTECXzIDCQAAAgUBaQUJZnJvbUluZGV4CQCUCgIJAM0IAgULbmV3QmFsYW5jZXMJAGQCBQx0b2tlbkJhbGFuY2UFAmR4CQBkAgUBaQABAwkAAAIFAWkFB3RvSW5kZXgJAJQKAgkAzQgCBQtuZXdCYWxhbmNlcwkAZAIFDHRva2VuQmFsYW5jZQUCZHkJAGQCBQFpAAEJAJQKAgkAzQgCBQtuZXdCYWxhbmNlcwUMdG9rZW5CYWxhbmNlCQBkAgUBaQABBA0kdDAyMTg2MTIxOTIyCgACJGwFAnhwCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCBQNuaWwAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEPbWFrZU5ld0JhbGFuY2VzAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxNQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwQLbmV3QmFsYW5jZXMIBQ0kdDAyMTg2MTIxOTIyAl8xBAFpCAUNJHQwMjE4NjEyMTkyMgJfMgMJARJjaGVja0RBcHBUaHJlc2hvbGQBBQtuZXdCYWxhbmNlcwkBBXRocm93AAQBcwkBBXN0YWtlAggFB3BheW1lbnQGYW1vdW50CQENZ2V0U3RyQXNzZXRJZAEIBQdwYXltZW50B2Fzc2V0SWQDCQAAAgUBcwUBcwQCdXMJAQd1bnN0YWtlAgkAZAIFAmR5BQRfZmVlBQh0b2tlbk91dAMJAAACBQJ1cwUCdXMJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQd0b2tlbkluBQ1rQXNzZXRCYWxhbmNlBQF4CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHRva2VuT3V0BQ1rQXNzZXRCYWxhbmNlCQBlAgkAZQIJAJEDAgUCeHAFB3RvSW5kZXgFAmR5BQ5nb3Zlcm5hbmNlRmVlcwkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUDbXNnBmNhbGxlcgUCZHkFC3Rva2VuT3V0QjU4CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFD21vbmV5Qm94QWRkcmVzcwUOZ292ZXJuYW5jZUZlZXMFC3Rva2VuT3V0QjU4CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFD21vbmV5Qm94QWRkcmVzcwkAZQIFBF9mZWUFDmdvdmVybmFuY2VGZWVzBQt0b2tlbk91dEI1OAUDbmlsCQCUCgIFAmR5BQt0b2tlbk91dEI1OAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgNtc2cBCHdpdGhkcmF3AgptaW5BbW91bnRzDHVubG9ja0Ftb3VudAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAMJAQIhPQIJAJADAQgFA21zZwhwYXltZW50cwABCQACAQITc2l6ZShwYXltZW50cykgIT0gMQQKc3VzcGljaW91cwkBD2NoZWNrU3VzcGljaW91cwADCAUKc3VzcGljaW91cwJfMQkAzggCCQERc3VzcGVuZFN1c3BpY2lvdXMBCAUKc3VzcGljaW91cwJfMgkBDnJldHVyblBheW1lbnRzAggFA21zZwZjYWxsZXIIBQNtc2cIcGF5bWVudHMEB3BheW1lbnQJAJEDAggFA21zZwhwYXltZW50cwAABAd0b2tlbkluCAUHcGF5bWVudAdhc3NldElkAwkBAiE9AgUHdG9rZW5JbgUMc2hhcmVBc3NldElkCQACAQINdW5rbm93biB0b2tlbgQHX2Ftb3VudAgFB3BheW1lbnQGYW1vdW50BAx0b3RhbF9zdXBwbHkFC3NoYXJlU3VwcGx5BAZ1bmxvY2sDCQBmAgUMdW5sb2NrQW1vdW50AAAJAPwHBAUOZmFybWluZ0FkZHJlc3MCE3dpdGhkcmF3U2hhcmVUb2tlbnMJAMwIAgkApQgBBQR0aGlzCQDMCAIFDHVubG9ja0Ftb3VudAUDbmlsBQNuaWwAAAMJAAACBQZ1bmxvY2sFBnVubG9jawQOd2l0aGRyYXdBbW91bnQJAGQCBQdfYW1vdW50BQx1bmxvY2tBbW91bnQKARFjYWxjU2NyaXB0QWN0aW9ucwIDYWNjB2JhbGFuY2UEDSR0MDIzMzI3MjMzNTUFA2FjYwQNc2NyaXB0QWN0aW9ucwgFDSR0MDIzMzI3MjMzNTUCXzEEAWkIBQ0kdDAyMzMyNzIzMzU1Al8yBAd3QW1vdW50CQBrAwUHYmFsYW5jZQUOd2l0aGRyYXdBbW91bnQFDHRvdGFsX3N1cHBseQMJAQZhc3NlcnQBCQBnAgUHd0Ftb3VudAkAkQMCBQptaW5BbW91bnRzBQFpCQACAQIwV2l0aGRyYXdhbCByZXN1bHRlZCBpbiBmZXdlciBjb2lucyB0aGFuIGV4cGVjdGVkBAJ1cwkBB3Vuc3Rha2UCBQd3QW1vdW50CQCRAwIFCGFzc2V0SWRzBQFpAwkAAAIFAnVzBQJ1cwkAlAoCCQDOCAIFDXNjcmlwdEFjdGlvbnMJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkAkQMCBQhhc3NldElkcwUBaQUNa0Fzc2V0QmFsYW5jZQkAZQIFB2JhbGFuY2UFB3dBbW91bnQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFA21zZwZjYWxsZXIFB3dBbW91bnQJANkEAQkAkQMCBQhhc3NldElkcwUBaQUDbmlsCQBkAgUBaQABCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBA0kdDAyMzg0NTIzOTEzCgACJGwJAQNfeHAACgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCBQNuaWwAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQERY2FsY1NjcmlwdEFjdGlvbnMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDE1CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPBA1zY3JpcHRBY3Rpb25zCAUNJHQwMjM4NDUyMzkxMwJfMQQBaQgFDSR0MDIzODQ1MjM5MTMCXzIJAM4IAgUNc2NyaXB0QWN0aW9ucwkAzAgCCQEEQnVybgIFDHNoYXJlQXNzZXRJZAUOd2l0aGRyYXdBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIFEWtTaGFyZUFzc2V0U3VwcGx5CQBlAgULc2hhcmVTdXBwbHkFDndpdGhkcmF3QW1vdW50BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4DbXNnARNjYWxjV2l0aGRyYXdPbmVDb2luAwt0b2tlbkFtb3VudAh0b2tlbk91dAR1c2VyBAFpCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAM8IAgUIYXNzZXRJZHMFCHRva2VuT3V0AhF1bmtub3duIHRva2VuIG91dAkAlAoCBQNuaWwICQEUX2NhbGNXaXRoZHJhd09uZUNvaW4ECQEDX3hwAAULdG9rZW5BbW91bnQFAWkJAQdBZGRyZXNzAQkA2QQBBQR1c2VyAl8xA21zZwEPd2l0aGRyYXdPbmVDb2luAwh0b2tlbk91dAltaW5BbW91bnQMdW5sb2NrQW1vdW50CQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUAAwkBAiE9AgkAkAMBCAUDbXNnCHBheW1lbnRzAAEJAAIBAhNzaXplKHBheW1lbnRzKSAhPSAxBApzdXNwaWNpb3VzCQEPY2hlY2tTdXNwaWNpb3VzAAMIBQpzdXNwaWNpb3VzAl8xCQDOCAIJARFzdXNwZW5kU3VzcGljaW91cwEIBQpzdXNwaWNpb3VzAl8yCQEOcmV0dXJuUGF5bWVudHMCCAUDbXNnBmNhbGxlcggFA21zZwhwYXltZW50cwQHcGF5bWVudAkAkQMCCAUDbXNnCHBheW1lbnRzAAAEB3Rva2VuSW4IBQdwYXltZW50B2Fzc2V0SWQDCQECIT0CBQd0b2tlbkluBQxzaGFyZUFzc2V0SWQJAAIBAg11bmtub3duIHRva2VuBAhvdXRJbmRleAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDPCAIFCGFzc2V0SWRzBQh0b2tlbk91dAIRdW5rbm93biB0b2tlbiBvdXQEDF90b2tlbkFtb3VudAgFB3BheW1lbnQGYW1vdW50BAZ1bmxvY2sDCQBmAgUMdW5sb2NrQW1vdW50AAAJAPwHBAUOZmFybWluZ0FkZHJlc3MCE3dpdGhkcmF3U2hhcmVUb2tlbnMJAMwIAgkApQgBBQR0aGlzCQDMCAIFDHVubG9ja0Ftb3VudAUDbmlsBQNuaWwAAAMJAAACBQZ1bmxvY2sFBnVubG9jawQOd2l0aGRyYXdBbW91bnQJAGQCBQxfdG9rZW5BbW91bnQFDHVubG9ja0Ftb3VudAQCeHAJAQNfeHAABA0kdDAyNTE0NDI1MjI1CQEUX2NhbGNXaXRoZHJhd09uZUNvaW4EBQJ4cAUOd2l0aGRyYXdBbW91bnQFCG91dEluZGV4CAUDbXNnBmNhbGxlcgQCZHkIBQ0kdDAyNTE0NDI1MjI1Al8xBAZkeV9mZWUIBQ0kdDAyNTE0NDI1MjI1Al8yAwkBBmFzc2VydAEJAGcCBQJkeQUJbWluQW1vdW50CQACAQIYTm90IGVub3VnaCBjb2lucyByZW1vdmVkBA5nb3Zlcm5hbmNlRmVlcwkAawMFBmR5X2ZlZQUNZmVlR292ZXJuYW5jZQUJZmVlU2NhbGU2BApkeV9hbmRfZmVlCQBkAgUCZHkFBmR5X2ZlZQoBD21ha2VOZXdCYWxhbmNlcwIDYWNjDHRva2VuQmFsYW5jZQQNJHQwMjU0ODMyNTUwOQUDYWNjBAtuZXdCYWxhbmNlcwgFDSR0MDI1NDgzMjU1MDkCXzEEAWkIBQ0kdDAyNTQ4MzI1NTA5Al8yAwkAAAIFAWkFCG91dEluZGV4CQCUCgIJAM0IAgULbmV3QmFsYW5jZXMJAGUCBQx0b2tlbkJhbGFuY2UFCmR5X2FuZF9mZWUJAGQCBQFpAAEJAJQKAgkAzQgCBQtuZXdCYWxhbmNlcwUMdG9rZW5CYWxhbmNlCQBkAgUBaQABBA0kdDAyNTY3NjI1NzM3CgACJGwFAnhwCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCBQNuaWwAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEPbWFrZU5ld0JhbGFuY2VzAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxNQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwQLbmV3QmFsYW5jZXMIBQ0kdDAyNTY3NjI1NzM3Al8xBAFpCAUNJHQwMjU2NzYyNTczNwJfMgMJARJjaGVja0RBcHBUaHJlc2hvbGQBBQtuZXdCYWxhbmNlcwkBBXRocm93AAQCdXMJAQd1bnN0YWtlAgUKZHlfYW5kX2ZlZQUIdG9rZW5PdXQDCQAAAgUCdXMFAnVzCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQNtc2cGY2FsbGVyBQJkeQkA2QQBBQh0b2tlbk91dAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCRAwIFCGFzc2V0SWRzBQFpBQ1rQXNzZXRCYWxhbmNlCQBlAgkAkQMCBQJ4cAUBaQUKZHlfYW5kX2ZlZQkAzAgCCQEEQnVybgIFDHNoYXJlQXNzZXRJZAUOd2l0aGRyYXdBbW91bnQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUPbW9uZXlCb3hBZGRyZXNzBQ5nb3Zlcm5hbmNlRmVlcwkA2QQBBQh0b2tlbk91dAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBRJjYXBNb25leUJveEFkZHJlc3MJAGUCBQZkeV9mZWUFDmdvdmVybmFuY2VGZWVzCQDZBAEFCHRva2VuT3V0CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRFrU2hhcmVBc3NldFN1cHBseQkAZQIFC3NoYXJlU3VwcGx5BQ53aXRoZHJhd0Ftb3VudAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuA21zZwEBQQAJAJQKAgUDbmlsCQECX0EAA21zZwEPZ2V0VmlydHVhbFByaWNlAAQBRAkBBWdldF9EAgkBA194cAAJAQJfQQAJAJQKAgUDbmlsCQBrAwUBRAUJUFJFQ0lTSU9OBQtzaGFyZVN1cHBseQNtc2cBD2NhbGNUb2tlbkFtb3VudAIHYW1vdW50cwdkZXBvc2l0BANhbXAJAQJfQQAECGJhbGFuY2VzCQEDX3hwAAQCRDAJAQdnZXRETWVtAgUIYmFsYW5jZXMFA2FtcAoBD2NhbGNOZXdCYWxhbmNlcwIDYWNjB2JhbGFuY2UEDSR0MDI2Njk4MjY3MjQFA2FjYwQLbmV3QmFsYW5jZXMIBQ0kdDAyNjY5ODI2NzI0Al8xBAFpCAUNJHQwMjY2OTgyNjcyNAJfMgQKbmV3QmFsYW5jZQkAZAIFB2JhbGFuY2UDBQdkZXBvc2l0CQCRAwIFB2Ftb3VudHMFAWkJAQEtAQkAkQMCBQdhbW91bnRzBQFpCQCUCgIJAM0IAgULbmV3QmFsYW5jZXMFCm5ld0JhbGFuY2UJAGQCBQFpAAEEC25ld0JhbGFuY2VzCAoAAiRsBQhiYWxhbmNlcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgUDbmlsAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBD2NhbGNOZXdCYWxhbmNlcwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTUJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8CXzEEAkQxCQEHZ2V0RE1lbQIFC25ld0JhbGFuY2VzBQNhbXAEBGRpZmYDBQdkZXBvc2l0CQBlAgUCRDEFAkQwCQBlAgUCRDAFAkQxCQCUCgIFA25pbAkAawMFBGRpZmYFC3NoYXJlU3VwcGx5BQJEMANtc2cBBXJhbXBBAghfZnV0dXJlQQtfZnV0dXJlVGltZQkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUDbXNnAwkBBmFzc2VydAEJAGcCBQ5ibG9ja1RpbWVzdGFtcAkAZAIFDmluaXRpYWxfQV90aW1lBQ1NSU5fUkFNUF9USU1FCQACAQIJdG9vIG9mdGVuAwkBBmFzc2VydAEJAGcCBQtfZnV0dXJlVGltZQkAZAIFDmJsb2NrVGltZXN0YW1wBQ1NSU5fUkFNUF9USU1FCQACAQIRaW5zdWZmaWNpZW50IHRpbWUECl9pbml0aWFsX0EJAQJfQQADCQEGYXNzZXJ0AQMJAGYCBQhfZnV0dXJlQQAACQBmAgUFTUFYX0EFCF9mdXR1cmVBBwkAAgECEW91dCBvZiBiYXNlIHJhbmdlAwkBBmFzc2VydAEDAwkAZwIFCF9mdXR1cmVBBQpfaW5pdGlhbF9BCQBnAgkAaAIFCl9pbml0aWFsX0EFDE1BWF9BX0NIQU5HRQUIX2Z1dHVyZUEHBgMJAGYCBQpfaW5pdGlhbF9BBQhfZnV0dXJlQQkAZwIJAGgCBQhfZnV0dXJlQQUMTUFYX0FfQ0hBTkdFBQpfaW5pdGlhbF9BBwkAAgECDG91dCBvZiByYW5nZQkAzAgCCQEMSW50ZWdlckVudHJ5AgIJaW5pdGlhbF9BBQpfaW5pdGlhbF9BCQDMCAIJAQxJbnRlZ2VyRW50cnkCAghmdXR1cmVfQQUIX2Z1dHVyZUEJAMwIAgkBDEludGVnZXJFbnRyeQICDmluaXRpYWxfQV90aW1lBQ5ibG9ja1RpbWVzdGFtcAkAzAgCCQEMSW50ZWdlckVudHJ5AgINZnV0dXJlX0FfdGltZQULX2Z1dHVyZVRpbWUFA25pbANtc2cBCXN0b3BSYW1wQQAJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFA21zZwQIY3VycmVudEEJAQJfQQAJAMwIAgkBDEludGVnZXJFbnRyeQICCWluaXRpYWxfQQUIY3VycmVudEEJAMwIAgkBDEludGVnZXJFbnRyeQICCGZ1dHVyZV9BBQhjdXJyZW50QQkAzAgCCQEMSW50ZWdlckVudHJ5AgIOaW5pdGlhbF9BX3RpbWUFDmJsb2NrVGltZXN0YW1wCQDMCAIJAQxJbnRlZ2VyRW50cnkCAg1mdXR1cmVfQV90aW1lBQ5ibG9ja1RpbWVzdGFtcAUDbmlsA21zZwEIc2h1dGRvd24ACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQNtc2cDCQEBIQEFBmFjdGl2ZQkAAgEJAKwCAgIiREFwcCBpcyBhbHJlYWR5IHN1c3BlbmRlZC4gQ2F1c2U6IAkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBQZrQ2F1c2UCGnRoZSBjYXVzZSB3YXNuJ3Qgc3BlY2lmaWVkCQEHc3VzcGVuZAECD1BhdXNlZCBieSBhZG1pbgNtc2cBCGFjdGl2YXRlAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUDbXNnAwUGYWN0aXZlCQENdGhyb3dJc0FjdGl2ZQAJAMwIAgkBDEJvb2xlYW5FbnRyeQIFB2tBY3RpdmUGCQDMCAIJAQtEZWxldGVFbnRyeQEFBmtDYXVzZQUDbmlsA21zZwEYa2VlcExpbWl0Rm9yRmlyc3RIYXJ2ZXN0AQpzaGFyZUxpbWl0CQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQNtc2cJAMwIAgkBDEludGVnZXJFbnRyeQIFC2tTaGFyZUxpbWl0BQpzaGFyZUxpbWl0BQNuaWwBAnR4AQZ2ZXJpZnkABBNtdWx0aVNpZ25lZEJ5QWRtaW5zBBJhZG1pblB1YktleTFTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQxhZG1pblB1YktleTEAAQAABBJhZG1pblB1YktleTJTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwABBQxhZG1pblB1YktleTIAAQAABBJhZG1pblB1YktleTNTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwACBQxhZG1pblB1YktleTMAAQAACQBnAgkAZAIJAGQCBRJhZG1pblB1YktleTFTaWduZWQFEmFkbWluUHViS2V5MlNpZ25lZAUSYWRtaW5QdWJLZXkzU2lnbmVkAAIEByRtYXRjaDAFAnR4AwkAAQIFByRtYXRjaDACF0ludm9rZVNjcmlwdFRyYW5zYWN0aW9uBANpbnYFByRtYXRjaDAEE2NhbGxUYWtlSW50b0FjY291bnQDCQAAAggFA2ludgRkQXBwBQR0aGlzCQAAAggFA2ludghmdW5jdGlvbgIZdGFrZUludG9BY2NvdW50RXh0cmFGdW5kcwcEDXNpZ25lZEJ5QWRtaW4DAwMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFDGFkbWluUHViS2V5MQYJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFDGFkbWluUHViS2V5MgYJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFDGFkbWluUHViS2V5MwYJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFEWFkbWluUHViS2V5SW52b2tlAwMFE2NhbGxUYWtlSW50b0FjY291bnQFDXNpZ25lZEJ5QWRtaW4HBgUTbXVsdGlTaWduZWRCeUFkbWlucwUTbXVsdGlTaWduZWRCeUFkbWluc1EK0XA=", "height": 2208437, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: none Next: 4AuVnjMa3L4kzTpKR6YDskDiEcWCKdMEKcxwMQw6KTaA Full:
OldNewDifferences
1-# no script
1+{-# STDLIB_VERSION 6 #-}
2+{-# SCRIPT_TYPE ACCOUNT #-}
3+{-# CONTENT_TYPE DAPP #-}
4+let PRECISION = 1000000
5+
6+let MAX_A = 1000000
7+
8+let MAX_A_CHANGE = 10
9+
10+let MIN_RAMP_TIME = (86400 / 60)
11+
12+let kAssets = "asset_ids"
13+
14+let kAssetBalance = "_balance"
15+
16+let kActive = "active"
17+
18+let kCause = "shutdown_cause"
19+
20+let kShareAssetId = "share_asset_id"
21+
22+let kShareAssetSupply = "share_asset_supply"
23+
24+let kFee = "commission"
25+
26+let kDAppThresholdCoef = "dAppThresholdCoef"
27+
28+let kUSDNAddress = "staking_usdnnsbt_address"
29+
30+let kDiscounts = "discounts"
31+
32+let kDiscountValues = "discount_values"
33+
34+let kUserSwopInGov = "_SWOP_amount"
35+
36+let kFirstHarvest = "first_harvest"
37+
38+let kFirstHarvestHeight = "first_harvest_height"
39+
40+let kShareLimit = "share_limit_on_first_harvest"
41+
42+let kBasePeriod = "base_period"
43+
44+let kPeriodLength = "period_length"
45+
46+let kStartHeight = "start_height"
47+
48+let kAdminPubKey1 = "admin_pub_1"
49+
50+let kAdminPubKey2 = "admin_pub_2"
51+
52+let kAdminPubKey3 = "admin_pub_3"
53+
54+let kAdminInvokePubKey = "admin_invoke_pub"
55+
56+let kMoneyBoxAddress = "money_box_address"
57+
58+let kGovAddress = "governance_address"
59+
60+let kVotingAddress = "voting_address"
61+
62+let kFarmingAddress = "farming_address"
63+
64+let oracle = Address(base58'3NBBWfzZtZtszaXbitTKnrB2xXwv26Bn7H9')
65+
66+func getBase58FromOracle (key) = match getString(oracle, key) {
67+ case string: String =>
68+ fromBase58String(string)
69+ case nothing =>
70+ throw((key + "is empty"))
71+}
72+
73+
74+let adminPubKey1 = getBase58FromOracle(kAdminPubKey1)
75+
76+let adminPubKey2 = getBase58FromOracle(kAdminPubKey2)
77+
78+let adminPubKey3 = getBase58FromOracle(kAdminPubKey3)
79+
80+let adminPubKeyInvoke = getBase58FromOracle(kAdminInvokePubKey)
81+
82+let moneyBoxAddress = Address(getBase58FromOracle(kMoneyBoxAddress))
83+
84+let govAddress = Address(getBase58FromOracle(kGovAddress))
85+
86+let stakingUSDNAddress = Address(getBase58FromOracle(kUSDNAddress))
87+
88+let votingAddress = Address(getBase58FromOracle(kVotingAddress))
89+
90+let farmingAddress = Address(getBase58FromOracle(kFarmingAddress))
91+
92+let capMoneyBoxAddress = Address(base58'3MxXHaGvmKQHH3kNrPBunhve1sDXf7M5RZt')
93+
94+let USDN = base58'8UrfDVd5GreeUwm7uPk7eYz1eMv376kzR52C6sANPkwS'
95+
96+let stakingAssets = [toBase58String(USDN)]
97+
98+let basePeriod = valueOrErrorMessage(getInteger(votingAddress, kBasePeriod), "Empty kBasePeriod")
99+
100+let startHeight = valueOrErrorMessage(getInteger(votingAddress, kStartHeight), "Empty kStartHeight")
101+
102+let periodLength = valueOrErrorMessage(getInteger(votingAddress, kPeriodLength), "Empty kPeriodLength")
103+
104+let firstHarvestEndPeriod = ((basePeriod + ((height - startHeight) / periodLength)) + 3)
105+
106+let active = getBooleanValue(this, kActive)
107+
108+let shareAssetId = fromBase58String(getStringValue(this, kShareAssetId))
109+
110+let shareSupply = getIntegerValue(this, kShareAssetSupply)
111+
112+let feeScale6 = 1000000
113+
114+let fee = getIntegerValue(this, kFee)
115+
116+let feeGovernance = fraction(40, feeScale6, 100)
117+
118+let initial_A = getIntegerValue(this, "initial_A")
119+
120+let future_A = getIntegerValue(this, "future_A")
121+
122+let initial_A_time = valueOrElse(getInteger(this, "initial_A_time"), 0)
123+
124+let future_A_time = valueOrElse(getInteger(this, "future_A_time"), 0)
125+
126+let assetIds = split(getStringValue(this, kAssets), ",")
127+
128+let nCoins = size(assetIds)
129+
130+func suspend (cause) = [BooleanEntry(kActive, false), StringEntry(kCause, cause)]
131+
132+
133+func throwIsActive () = throw("DApp is already active")
134+
135+
136+func isActive () = if (active)
137+ then unit
138+ else throw("DApp is inactive at this moment")
139+
140+
141+func isAdminCall (i) = if (containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey))
142+ then unit
143+ else throw("Only admin can call this function")
144+
145+
146+func isSelfCall (i) = if ((this == i.caller))
147+ then unit
148+ else throw("Only contract itself can call this function")
149+
150+
151+let big2 = toBigInt(2)
152+
153+let blockTimestamp = height
154+
155+func assert (a) = if (a)
156+ then false
157+ else true
158+
159+
160+func calculateFeeDiscount (userAddr) = {
161+ let swopAmount = valueOrElse(getInteger(govAddress, (toString(userAddr) + kUserSwopInGov)), 0)
162+ let discountValues = split(getStringValue(oracle, kDiscountValues), ",")
163+ let discounts = split(getStringValue(oracle, kDiscounts), ",")
164+ if (if ((swopAmount >= parseIntValue(discountValues[0])))
165+ then (parseIntValue(discountValues[1]) > swopAmount)
166+ else false)
167+ then (feeScale6 - parseIntValue(discounts[0]))
168+ else if (if ((swopAmount >= parseIntValue(discountValues[1])))
169+ then (parseIntValue(discountValues[2]) > swopAmount)
170+ else false)
171+ then (feeScale6 - parseIntValue(discounts[1]))
172+ else if (if ((swopAmount >= parseIntValue(discountValues[2])))
173+ then (parseIntValue(discountValues[3]) > swopAmount)
174+ else false)
175+ then (feeScale6 - parseIntValue(discounts[2]))
176+ else if (if ((swopAmount >= parseIntValue(discountValues[3])))
177+ then (parseIntValue(discountValues[4]) > swopAmount)
178+ else false)
179+ then (feeScale6 - parseIntValue(discounts[3]))
180+ else if ((swopAmount >= parseIntValue(discountValues[4])))
181+ then (feeScale6 - parseIntValue(discounts[4]))
182+ else feeScale6
183+ }
184+
185+
186+func _A () = {
187+ let t1 = future_A_time
188+ let A1 = future_A
189+ if ((t1 > blockTimestamp))
190+ then {
191+ let A0 = initial_A
192+ let t0 = initial_A_time
193+ if ((A1 > A0))
194+ then (A0 + (((A1 - A0) * (blockTimestamp - t0)) / (t1 - t0)))
195+ else (A0 - (((A0 - A1) * (blockTimestamp - t0)) / (t1 - t0)))
196+ }
197+ else A1
198+ }
199+
200+
201+func _xp () = {
202+ func assetBalances (acc,assetId) = (acc :+ valueOrElse(getInteger(this, (assetId + kAssetBalance)), 0))
203+
204+ let $l = assetIds
205+ let $s = size($l)
206+ let $acc0 = nil
207+ func $f0_1 ($a,$i) = if (($i >= $s))
208+ then $a
209+ else assetBalances($a, $l[$i])
210+
211+ func $f0_2 ($a,$i) = if (($i >= $s))
212+ then $a
213+ else throw("List size exceeds 15")
214+
215+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
216+ }
217+
218+
219+func _xp_mem (xp) = xp
220+
221+
222+func sumList (acc,element) = (acc + element)
223+
224+
225+func get_D (xp,amp) = {
226+ let @ = invoke(this, "D", [xp, amp], nil)
227+ if ($isInstanceOf(@, "Int"))
228+ then @
229+ else throw(($getType(invoke(this, "D", [xp, amp], nil)) + " couldn't be cast to Int"))
230+ }
231+
232+
233+func get_D_internal (xp,amp) = {
234+ let S = {
235+ let $l = xp
236+ let $s = size($l)
237+ let $acc0 = 0
238+ func $f0_1 ($a,$i) = if (($i >= $s))
239+ then $a
240+ else sumList($a, $l[$i])
241+
242+ func $f0_2 ($a,$i) = if (($i >= $s))
243+ then $a
244+ else throw("List size exceeds 15")
245+
246+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
247+ }
248+ if ((S == 0))
249+ then 0
250+ else {
251+ let Ann = (amp * nCoins)
252+ let AnnS = (toBigInt(Ann) * toBigInt(S))
253+ let Ann1 = toBigInt((Ann - 1))
254+ func Dproc (acc,i) = if ((acc._2 == true))
255+ then acc
256+ else {
257+ let Dprev = acc._1
258+ func D_PProc (D_P,i) = if ((nCoins > i))
259+ then ((D_P * Dprev) / (toBigInt(xp[i]) * toBigInt(nCoins)))
260+ else D_P
261+
262+ let D_P = {
263+ let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
264+ let $s = size($l)
265+ let $acc0 = Dprev
266+ func $f1_1 ($a,$i) = if (($i >= $s))
267+ then $a
268+ else D_PProc($a, $l[$i])
269+
270+ func $f1_2 ($a,$i) = if (($i >= $s))
271+ then $a
272+ else throw("List size exceeds 15")
273+
274+ $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
275+ }
276+ let D = fraction((AnnS + (toBigInt(nCoins) * D_P)), Dprev, ((Ann1 * Dprev) + (toBigInt((nCoins + 1)) * D_P)))
277+ if ((D > Dprev))
278+ then if ((1 >= toInt((D - Dprev))))
279+ then $Tuple2(D, true)
280+ else $Tuple2(D, false)
281+ else if ((1 >= toInt((Dprev - D))))
282+ then $Tuple2(D, true)
283+ else $Tuple2(D, false)
284+ }
285+
286+ let $t066126724 = {
287+ let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
288+ let $s = size($l)
289+ let $acc0 = $Tuple2(toBigInt(S), false)
290+ func $f1_1 ($a,$i) = if (($i >= $s))
291+ then $a
292+ else Dproc($a, $l[$i])
293+
294+ func $f1_2 ($a,$i) = if (($i >= $s))
295+ then $a
296+ else throw("List size exceeds 15")
297+
298+ $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
299+ }
300+ let D = $t066126724._1
301+ let finished = $t066126724._2
302+ if ((finished == false))
303+ then throw(("get_D() not finished with " + toString(D)))
304+ else toInt(D)
305+ }
306+ }
307+
308+
309+func getDMem (xp,amp) = get_D(_xp_mem(xp), amp)
310+
311+
312+func getY (in,out,x,xp_) = if (assert((in != out)))
313+ then throw("same coin")
314+ else if (assert(if ((out >= 0))
315+ then (in >= 0)
316+ else false))
317+ then throw("below zero")
318+ else if (assert(if ((nCoins > out))
319+ then (nCoins > in)
320+ else false))
321+ then throw("above N_COINS")
322+ else {
323+ let amp = _A()
324+ let D = get_D(xp_, amp)
325+ let Ann = (amp * nCoins)
326+ func S_c (acc,i) = {
327+ let $t072957312 = acc
328+ let S_ = $t072957312._1
329+ let c = $t072957312._2
330+ let x_ = if ((in == i))
331+ then x
332+ else xp_[i]
333+ if (if ((i != out))
334+ then (nCoins > i)
335+ else false)
336+ then $Tuple2((S_ + x_), fraction(c, toBigInt(D), toBigInt((x_ * nCoins))))
337+ else $Tuple2(S_, c)
338+ }
339+
340+ let $t075207621 = {
341+ let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
342+ let $s = size($l)
343+ let $acc0 = $Tuple2(0, toBigInt(D))
344+ func $f0_1 ($a,$i) = if (($i >= $s))
345+ then $a
346+ else S_c($a, $l[$i])
347+
348+ func $f0_2 ($a,$i) = if (($i >= $s))
349+ then $a
350+ else throw("List size exceeds 15")
351+
352+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
353+ }
354+ let S_ = $t075207621._1
355+ let c_ = $t075207621._2
356+ let c = fraction(c_, toBigInt(D), toBigInt((Ann * nCoins)))
357+ let bD = toBigInt(((S_ + (D / Ann)) - D))
358+ func y_proc (acc,_i) = if ((acc._2 == true))
359+ then acc
360+ else {
361+ let y_prev = acc._1
362+ let y = (((y_prev * y_prev) + c) / ((big2 * y_prev) + bD))
363+ if ((y > y_prev))
364+ then if ((1 >= toInt((y - y_prev))))
365+ then $Tuple2(y, true)
366+ else $Tuple2(y, false)
367+ else if ((1 >= toInt((y_prev - y))))
368+ then $Tuple2(y, true)
369+ else $Tuple2(y, false)
370+ }
371+
372+ let $t081038220 = {
373+ let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
374+ let $s = size($l)
375+ let $acc0 = $Tuple2(toBigInt(D), false)
376+ func $f1_1 ($a,$i) = if (($i >= $s))
377+ then $a
378+ else y_proc($a, $l[$i])
379+
380+ func $f1_2 ($a,$i) = if (($i >= $s))
381+ then $a
382+ else throw("List size exceeds 16")
383+
384+ $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16)
385+ }
386+ let y = $t081038220._1
387+ let finished = $t081038220._2
388+ if ((finished == false))
389+ then throw(("getY() not finished with " + toString(y)))
390+ else toInt(y)
391+ }
392+
393+
394+func get_y_D (A_,in,xp,D) = if (assert((in >= 0)))
395+ then throw("i below zero")
396+ else if (assert((nCoins > in)))
397+ then throw("i above N_COINS")
398+ else {
399+ let Ann = (A_ * nCoins)
400+ func S_c (acc,i) = {
401+ let $t085998616 = acc
402+ let S_ = $t085998616._1
403+ let c = $t085998616._2
404+ let x_ = if (if ((in != i))
405+ then (nCoins > i)
406+ else false)
407+ then xp[i]
408+ else 0
409+ if (if ((nCoins > i))
410+ then (in != i)
411+ else false)
412+ then $Tuple2((S_ + x_), fraction(c, toBigInt(D), toBigInt((x_ * nCoins))))
413+ else $Tuple2(S_, c)
414+ }
415+
416+ let $t088368937 = {
417+ let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
418+ let $s = size($l)
419+ let $acc0 = $Tuple2(0, toBigInt(D))
420+ func $f0_1 ($a,$i) = if (($i >= $s))
421+ then $a
422+ else S_c($a, $l[$i])
423+
424+ func $f0_2 ($a,$i) = if (($i >= $s))
425+ then $a
426+ else throw("List size exceeds 15")
427+
428+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
429+ }
430+ let S_ = $t088368937._1
431+ let c_ = $t088368937._2
432+ let c = fraction(c_, toBigInt(D), toBigInt((Ann * nCoins)))
433+ let bD = toBigInt(((S_ + (D / Ann)) - D))
434+ func y_D_proc (acc,i) = if ((acc._2 == true))
435+ then acc
436+ else {
437+ let y_prev = acc._1
438+ let y = (((y_prev * y_prev) + c) / ((big2 * y_prev) + bD))
439+ if ((y > y_prev))
440+ then if ((1 >= toInt((y - y_prev))))
441+ then $Tuple2(y, true)
442+ else $Tuple2(y, false)
443+ else if ((1 >= toInt((y_prev - y))))
444+ then $Tuple2(y, true)
445+ else $Tuple2(y, false)
446+ }
447+
448+ let $t094209539 = {
449+ let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
450+ let $s = size($l)
451+ let $acc0 = $Tuple2(toBigInt(D), false)
452+ func $f1_1 ($a,$i) = if (($i >= $s))
453+ then $a
454+ else y_D_proc($a, $l[$i])
455+
456+ func $f1_2 ($a,$i) = if (($i >= $s))
457+ then $a
458+ else throw("List size exceeds 16")
459+
460+ $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16)
461+ }
462+ let y = $t094209539._1
463+ let finished = $t094209539._2
464+ if ((finished == false))
465+ then throw(("get_y_D() not finished with " + toString(y)))
466+ else toInt(y)
467+ }
468+
469+
470+func _calcWithdrawOneCoin (xp,_token_amount,i,caller) = {
471+ let feeDiscount = calculateFeeDiscount(caller)
472+ let amp = _A()
473+ let _fee = ((fraction(fee, feeDiscount, feeScale6, CEILING) * nCoins) / (4 * (nCoins - 1)))
474+ let total_supply = shareSupply
475+ let D0 = get_D(xp, amp)
476+ let D1 = (D0 - fraction(_token_amount, D0, total_supply))
477+ let new_y = get_y_D(amp, i, xp, D1)
478+ let dy_0 = (xp[i] - new_y)
479+ func xp_reduced_proc (acc,xp_j) = {
480+ let $t01018010209 = acc
481+ let xp_reduced = $t01018010209._1
482+ let index = $t01018010209._2
483+ let dx_expected = if ((index == i))
484+ then (fraction(xp_j, D1, D0) - new_y)
485+ else (xp_j - fraction(xp_j, D1, D0))
486+ $Tuple2((xp_reduced :+ (xp_j - fraction(_fee, dx_expected, feeScale6))), (index + 1))
487+ }
488+
489+ let $t01047110535 = {
490+ let $l = xp
491+ let $s = size($l)
492+ let $acc0 = $Tuple2(nil, 0)
493+ func $f0_1 ($a,$i) = if (($i >= $s))
494+ then $a
495+ else xp_reduced_proc($a, $l[$i])
496+
497+ func $f0_2 ($a,$i) = if (($i >= $s))
498+ then $a
499+ else throw("List size exceeds 15")
500+
501+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
502+ }
503+ let xp_reduced = $t01047110535._1
504+ let index = $t01047110535._2
505+ let xp_reduced_i = xp_reduced[i]
506+ let dy = ((xp_reduced_i - get_y_D(amp, i, xp_reduced, D1)) - 1)
507+ $Tuple2(dy, (dy_0 - dy))
508+ }
509+
510+
511+func getStrAssetId (assetId) = match assetId {
512+ case id: ByteVector =>
513+ toBase58String(id)
514+ case waves: Unit =>
515+ "WAVES"
516+ case _ =>
517+ throw("Match error")
518+}
519+
520+
521+func calcStakingFuncAndAddres (stake,assetId) = if (stake)
522+ then $Tuple2("lockNeutrino", stakingUSDNAddress)
523+ else $Tuple2("unlockNeutrino", stakingUSDNAddress)
524+
525+
526+func calcStakingParams (stake,amount,assetId) = if (stake)
527+ then {
528+ let $t01109911165 = calcStakingFuncAndAddres(stake, assetId)
529+ let call = $t01109911165._1
530+ let stakingAddr = $t01109911165._2
531+ $Tuple4(call, stakingAddr, nil, [AttachedPayment(assetId, amount)])
532+ }
533+ else {
534+ let $t01125111317 = calcStakingFuncAndAddres(stake, assetId)
535+ let call = $t01125111317._1
536+ let stakingAddr = $t01125111317._2
537+ $Tuple4(call, stakingAddr, [amount, toBase58String(assetId)], nil)
538+ }
539+
540+
541+func stake (amount,assetIdString) = if (containsElement(stakingAssets, assetIdString))
542+ then {
543+ let $t01150411606 = calcStakingParams(true, amount, fromBase58String(assetIdString))
544+ let call = $t01150411606._1
545+ let addr = $t01150411606._2
546+ let params = $t01150411606._3
547+ let payments = $t01150411606._4
548+ invoke(addr, call, params, payments)
549+ }
550+ else 0
551+
552+
553+func unstake (amount,assetIdString) = if (containsElement(stakingAssets, assetIdString))
554+ then {
555+ let $t01179111894 = calcStakingParams(false, amount, fromBase58String(assetIdString))
556+ let call = $t01179111894._1
557+ let addr = $t01179111894._2
558+ let params = $t01179111894._3
559+ let payments = $t01179111894._4
560+ invoke(addr, call, params, payments)
561+ }
562+ else 0
563+
564+
565+func stakedAmount (assetId) = {
566+ let stakedAmountCalculated = match assetId {
567+ case aId: ByteVector =>
568+ if ((aId == USDN))
569+ then getInteger(stakingUSDNAddress, ((("rpd_balance_" + toBase58String(aId)) + "_") + toString(this)))
570+ else 0
571+ case _: Unit =>
572+ 0
573+ case _ =>
574+ throw("Match error")
575+ }
576+ match stakedAmountCalculated {
577+ case i: Int =>
578+ i
579+ case _ =>
580+ 0
581+ }
582+ }
583+
584+
585+func checkSuspicious () = {
586+ let contractBalances = _xp()
587+ func checkBalance (acc,assetId) = {
588+ let $t01250512530 = acc
589+ let suspicious = $t01250512530._1
590+ let i = $t01250512530._2
591+ if (suspicious)
592+ then $Tuple2(suspicious, i)
593+ else {
594+ let aBalance = (assetBalance(this, fromBase58String(assetId)) + stakedAmount(fromBase58String(assetId)))
595+ if ((contractBalances[i] > aBalance))
596+ then $Tuple2(true, i)
597+ else $Tuple2(false, (i + 1))
598+ }
599+ }
600+
601+ let $l = assetIds
602+ let $s = size($l)
603+ let $acc0 = $Tuple2(false, 0)
604+ func $f0_1 ($a,$i) = if (($i >= $s))
605+ then $a
606+ else checkBalance($a, $l[$i])
607+
608+ func $f0_2 ($a,$i) = if (($i >= $s))
609+ then $a
610+ else throw("List size exceeds 15")
611+
612+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
613+ }
614+
615+
616+func suspendSuspicious (i) = suspend(("Suspicious state with asset: " + assetIds[i]))
617+
618+
619+func returnPayments (caller,payments) = {
620+ func parsePayments (acc,payment) = (acc :+ ScriptTransfer(caller, payment.amount, payment.assetId))
621+
622+ let $l = payments
623+ let $s = size($l)
624+ let $acc0 = nil
625+ func $f0_1 ($a,$i) = if (($i >= $s))
626+ then $a
627+ else parsePayments($a, $l[$i])
628+
629+ func $f0_2 ($a,$i) = if (($i >= $s))
630+ then $a
631+ else throw("List size exceeds 15")
632+
633+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
634+ }
635+
636+
637+func checkDAppThreshold (newBalances) = {
638+ let dAppThresholdCoef = valueOrErrorMessage(getInteger(this, kDAppThresholdCoef), "No dAppThresholdCoef key")
639+ let thresholdScale = 10000
640+ func iterAllBalances (acc,tokenBalance) = {
641+ let $t01350913550 = acc
642+ let thresholdError = $t01350913550._1
643+ let cutedBalances = $t01350913550._2
644+ func iterCutedBalances (checkRatio,checkedBalance) = {
645+ let ratio = fraction(tokenBalance, thresholdScale, checkedBalance)
646+ if (if ((ratio > (dAppThresholdCoef * thresholdScale)))
647+ then true
648+ else (fraction(1, thresholdScale, dAppThresholdCoef) > ratio))
649+ then throw("New balance in assets of the DApp is less than threshold")
650+ else false
651+ }
652+
653+ $Tuple2({
654+ let $l = cutedBalances
655+ let $s = size($l)
656+ let $acc0 = thresholdError
657+ func $f0_1 ($a,$i) = if (($i >= $s))
658+ then $a
659+ else iterCutedBalances($a, $l[$i])
660+
661+ func $f0_2 ($a,$i) = if (($i >= $s))
662+ then $a
663+ else throw("List size exceeds 15")
664+
665+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
666+ }, removeByIndex(cutedBalances, 0))
667+ }
668+
669+ let $t01407214175 = {
670+ let $l = newBalances
671+ let $s = size($l)
672+ let $acc0 = $Tuple2(false, removeByIndex(newBalances, 0))
673+ func $f0_1 ($a,$i) = if (($i >= $s))
674+ then $a
675+ else iterAllBalances($a, $l[$i])
676+
677+ func $f0_2 ($a,$i) = if (($i >= $s))
678+ then $a
679+ else throw("List size exceeds 15")
680+
681+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
682+ }
683+ let thresholdError = $t01407214175._1
684+ let b = $t01407214175._2
685+ thresholdError
686+ }
687+
688+
689+@Callable(msg)
690+func D (xp,amp) = {
691+ let D = get_D_internal(xp, amp)
692+ $Tuple2([IntegerEntry("D", D)], D)
693+ }
694+
695+
696+
697+@Callable(msg)
698+func init (coins,_A,firstHarvest) = if (!(isDataStorageUntouched(this)))
699+ then throw("Already initialized")
700+ else {
701+ let shareName = "s_Multi_USD"
702+ let shareDescription = ("ShareToken of SwopFi protocol for MultiStable USD pool at address " + toString(this))
703+ let issueToken = Issue(shareName, shareDescription, 0, 6, true)
704+ let tokenId = calculateAssetId(issueToken)
705+ let baseEntry = [StringEntry(kAssets, coins), IntegerEntry("initial_A", _A), IntegerEntry("future_A", _A), IntegerEntry(kFee, getIntegerValue(oracle, "base_fee_flat")), StringEntry(kShareAssetId, toBase58String(tokenId)), IntegerEntry(kShareAssetSupply, 0), IntegerEntry(kDAppThresholdCoef, 15), BooleanEntry(kActive, true), issueToken]
706+ if (firstHarvest)
707+ then (baseEntry ++ [BooleanEntry(kFirstHarvest, firstHarvest), IntegerEntry(kFirstHarvestHeight, (startHeight + (firstHarvestEndPeriod * periodLength)))])
708+ else baseEntry
709+ }
710+
711+
712+
713+@Callable(msg)
714+func addLiquidity (minMintAmount,stakeFarming) = valueOrElse(isActive(), {
715+ let amp = _A()
716+ let xp = _xp()
717+ let D0 = if ((shareSupply == 0))
718+ then 0
719+ else getDMem(xp, amp)
720+ let payments = msg.payments
721+ let n = size(payments)
722+ func validPayments (n) = if ((n > nCoins))
723+ then throw(("payments size > " + toString(nCoins)))
724+ else if ((1 > n))
725+ then throw("payments size < 1")
726+ else if (if ((shareSupply == 0))
727+ then (nCoins != n)
728+ else false)
729+ then throw("initial deposit requires all coins")
730+ else {
731+ func paymantValid (acc,payment) = if (containsElement(assetIds, getStrAssetId(payment.assetId)))
732+ then true
733+ else throw("Invalid asset in payment")
734+
735+ let $l = payments
736+ let $s = size($l)
737+ let $acc0 = false
738+ func $f0_1 ($a,$i) = if (($i >= $s))
739+ then $a
740+ else paymantValid($a, $l[$i])
741+
742+ func $f0_2 ($a,$i) = if (($i >= $s))
743+ then $a
744+ else throw("List size exceeds 15")
745+
746+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
747+ }
748+
749+ if (!(validPayments(n)))
750+ then throw()
751+ else {
752+ let suspicious = checkSuspicious()
753+ if (suspicious._1)
754+ then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.caller, payments))
755+ else {
756+ let paymentsSize = size(payments)
757+ func parsePayments (acc,assetId) = {
758+ let $t01658116610 = acc
759+ let newBalances = $t01658116610._1
760+ let i = $t01658116610._2
761+ let j = $t01658116610._3
762+ if (if ((paymentsSize > j))
763+ then (getStrAssetId(payments[j].assetId) == assetId)
764+ else false)
765+ then {
766+ let s = stake(payments[j].amount, getStrAssetId(payments[j].assetId))
767+ if ((s == s))
768+ then $Tuple3((newBalances :+ (xp[i] + payments[j].amount)), (i + 1), (j + 1))
769+ else throw("Strict value is not equal to itself.")
770+ }
771+ else $Tuple3((newBalances :+ xp[i]), (i + 1), j)
772+ }
773+
774+ let $t01691617002 = {
775+ let $l = assetIds
776+ let $s = size($l)
777+ let $acc0 = $Tuple3(nil, 0, 0)
778+ func $f0_1 ($a,$i) = if (($i >= $s))
779+ then $a
780+ else parsePayments($a, $l[$i])
781+
782+ func $f0_2 ($a,$i) = if (($i >= $s))
783+ then $a
784+ else throw("List size exceeds 15")
785+
786+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
787+ }
788+ let newBalances = $t01691617002._1
789+ let k = $t01691617002._2
790+ let parsedPayments = $t01691617002._3
791+ if (((paymentsSize - 1) > parsedPayments))
792+ then throw("Incorect payments order")
793+ else if (checkDAppThreshold(newBalances))
794+ then throw()
795+ else {
796+ let D1 = getDMem(newBalances, amp)
797+ if (assert((D1 > D0)))
798+ then throw("D1 > D0")
799+ else {
800+ let feeDiscount = calculateFeeDiscount(msg.caller)
801+ func calcScriptActions (acc,newBalance) = {
802+ let $t01740717448 = acc
803+ let invBalances = $t01740717448._1
804+ let scriptActions = $t01740717448._2
805+ let i = $t01740717448._3
806+ if ((shareSupply > 0))
807+ then {
808+ let _fee = ((fraction(fee, feeDiscount, feeScale6, CEILING) * nCoins) / (4 * (nCoins - 1)))
809+ let fees = {
810+ let idealBalance = fraction(D1, xp[i], D0)
811+ let difference = if ((idealBalance > newBalance))
812+ then (idealBalance - newBalance)
813+ else (newBalance - idealBalance)
814+ fraction(_fee, difference, feeScale6)
815+ }
816+ let governanceFees = fraction(fees, feeGovernance, feeScale6)
817+ let finalBalance = (newBalance - governanceFees)
818+ let invariantBalance = (newBalance - fees)
819+ let us = unstake(fees, assetIds[i])
820+ if ((us == us))
821+ then $Tuple3((invBalances :+ invariantBalance), (scriptActions ++ [ScriptTransfer(capMoneyBoxAddress, (fees - governanceFees), fromBase58String(assetIds[i])), ScriptTransfer(moneyBoxAddress, governanceFees, fromBase58String(assetIds[i])), IntegerEntry((assetIds[i] + kAssetBalance), finalBalance)]), (i + 1))
822+ else throw("Strict value is not equal to itself.")
823+ }
824+ else $Tuple3((invBalances :+ newBalance), (scriptActions :+ IntegerEntry((assetIds[i] + kAssetBalance), newBalance)), (i + 1))
825+ }
826+
827+ let $t01878518873 = {
828+ let $l = newBalances
829+ let $s = size($l)
830+ let $acc0 = $Tuple3(nil, nil, 0)
831+ func $f1_1 ($a,$i) = if (($i >= $s))
832+ then $a
833+ else calcScriptActions($a, $l[$i])
834+
835+ func $f1_2 ($a,$i) = if (($i >= $s))
836+ then $a
837+ else throw("List size exceeds 15")
838+
839+ $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
840+ }
841+ let invBalances = $t01878518873._1
842+ let scriptActions = $t01878518873._2
843+ let D2 = getDMem(invBalances, amp)
844+ let mint_amount = if ((shareSupply == 0))
845+ then D1
846+ else fraction(shareSupply, (D2 - D0), D0)
847+ if (assert((mint_amount >= minMintAmount)))
848+ then throw("Slippage screwed you")
849+ else if (stakeFarming)
850+ then {
851+ let re = invoke(this, "reissueShare", [mint_amount], nil)
852+ if ((re == re))
853+ then {
854+ let s = invoke(farmingAddress, "lockShareTokens", [toString(this)], [AttachedPayment(shareAssetId, mint_amount)])
855+ if ((s == s))
856+ then (scriptActions :+ IntegerEntry(kShareAssetSupply, (shareSupply + mint_amount)))
857+ else throw("Strict value is not equal to itself.")
858+ }
859+ else throw("Strict value is not equal to itself.")
860+ }
861+ else (scriptActions ++ [Reissue(shareAssetId, mint_amount, true), ScriptTransfer(msg.caller, mint_amount, shareAssetId), IntegerEntry(kShareAssetSupply, (shareSupply + mint_amount))])
862+ }
863+ }
864+ }
865+ }
866+ })
867+
868+
869+
870+@Callable(msg)
871+func reissueShare (amount) = valueOrElse(isSelfCall(msg), [Reissue(shareAssetId, amount, true)])
872+
873+
874+
875+@Callable(msg)
876+func getDy (assetFrom,assetTo,dx,userAddress) = {
877+ let xp = _xp()
878+ let fromIndex = valueOrErrorMessage(indexOf(assetIds, assetFrom), "unknown token in")
879+ let toIndex = valueOrErrorMessage(indexOf(assetIds, assetTo), "unknown token out")
880+ let x = (xp[fromIndex] + dx)
881+ let y = getY(fromIndex, toIndex, x, xp)
882+ let dy = ((xp[toIndex] - y) - 1)
883+ let feeDiscount = calculateFeeDiscount(Address(fromBase58String(userAddress)))
884+ let _fee = fraction(fraction(fee, feeDiscount, feeScale6, CEILING), dy, feeScale6)
885+ $Tuple2(nil, $Tuple2((dy - _fee), _fee))
886+ }
887+
888+
889+
890+@Callable(msg)
891+func exchange (tokenOut,min_dy) = valueOrElse(isActive(), if ((size(msg.payments) != 1))
892+ then throw("size(payments) != 1")
893+ else {
894+ let suspicious = checkSuspicious()
895+ if (suspicious._1)
896+ then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.caller, msg.payments))
897+ else {
898+ let payment = msg.payments[0]
899+ let tokenIn = getStrAssetId(payment.assetId)
900+ let tokenOutB58 = fromBase58String(tokenOut)
901+ let dx = payment.amount
902+ let fromIndex = valueOrErrorMessage(indexOf(assetIds, tokenIn), "unknown token in")
903+ let toIndex = valueOrErrorMessage(indexOf(assetIds, tokenOut), "unknown token out")
904+ let xp = _xp()
905+ let x = (xp[fromIndex] + dx)
906+ let y = getY(fromIndex, toIndex, x, xp)
907+ let _dy = ((xp[toIndex] - y) - 1)
908+ let feeDiscount = calculateFeeDiscount(msg.caller)
909+ let _fee = fraction(_dy, fraction(fee, feeDiscount, feeScale6, CEILING), feeScale6)
910+ let dy = (_dy - _fee)
911+ let governanceFees = fraction(_fee, feeGovernance, feeScale6)
912+ if (assert((dy >= min_dy)))
913+ then throw("Exchange resulted in fewer coins than expected")
914+ else {
915+ func makeNewBalances (acc,tokenBalance) = {
916+ let $t02158521611 = acc
917+ let newBalances = $t02158521611._1
918+ let i = $t02158521611._2
919+ if ((i == fromIndex))
920+ then $Tuple2((newBalances :+ (tokenBalance + dx)), (i + 1))
921+ else if ((i == toIndex))
922+ then $Tuple2((newBalances :+ (tokenBalance + dy)), (i + 1))
923+ else $Tuple2((newBalances :+ tokenBalance), (i + 1))
924+ }
925+
926+ let $t02186121922 = {
927+ let $l = xp
928+ let $s = size($l)
929+ let $acc0 = $Tuple2(nil, 0)
930+ func $f0_1 ($a,$i) = if (($i >= $s))
931+ then $a
932+ else makeNewBalances($a, $l[$i])
933+
934+ func $f0_2 ($a,$i) = if (($i >= $s))
935+ then $a
936+ else throw("List size exceeds 15")
937+
938+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
939+ }
940+ let newBalances = $t02186121922._1
941+ let i = $t02186121922._2
942+ if (checkDAppThreshold(newBalances))
943+ then throw()
944+ else {
945+ let s = stake(payment.amount, getStrAssetId(payment.assetId))
946+ if ((s == s))
947+ then {
948+ let us = unstake((dy + _fee), tokenOut)
949+ if ((us == us))
950+ then $Tuple2([IntegerEntry((tokenIn + kAssetBalance), x), IntegerEntry((tokenOut + kAssetBalance), ((xp[toIndex] - dy) - governanceFees)), ScriptTransfer(msg.caller, dy, tokenOutB58), ScriptTransfer(moneyBoxAddress, governanceFees, tokenOutB58), ScriptTransfer(moneyBoxAddress, (_fee - governanceFees), tokenOutB58)], $Tuple2(dy, tokenOutB58))
951+ else throw("Strict value is not equal to itself.")
952+ }
953+ else throw("Strict value is not equal to itself.")
954+ }
955+ }
956+ }
957+ })
958+
959+
960+
961+@Callable(msg)
962+func withdraw (minAmounts,unlockAmount) = valueOrElse(isActive(), if ((size(msg.payments) != 1))
963+ then throw("size(payments) != 1")
964+ else {
965+ let suspicious = checkSuspicious()
966+ if (suspicious._1)
967+ then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.caller, msg.payments))
968+ else {
969+ let payment = msg.payments[0]
970+ let tokenIn = payment.assetId
971+ if ((tokenIn != shareAssetId))
972+ then throw("unknown token")
973+ else {
974+ let _amount = payment.amount
975+ let total_supply = shareSupply
976+ let unlock = if ((unlockAmount > 0))
977+ then invoke(farmingAddress, "withdrawShareTokens", [toString(this), unlockAmount], nil)
978+ else 0
979+ if ((unlock == unlock))
980+ then {
981+ let withdrawAmount = (_amount + unlockAmount)
982+ func calcScriptActions (acc,balance) = {
983+ let $t02332723355 = acc
984+ let scriptActions = $t02332723355._1
985+ let i = $t02332723355._2
986+ let wAmount = fraction(balance, withdrawAmount, total_supply)
987+ if (assert((wAmount >= minAmounts[i])))
988+ then throw("Withdrawal resulted in fewer coins than expected")
989+ else {
990+ let us = unstake(wAmount, assetIds[i])
991+ if ((us == us))
992+ then $Tuple2((scriptActions ++ [IntegerEntry((assetIds[i] + kAssetBalance), (balance - wAmount)), ScriptTransfer(msg.caller, wAmount, fromBase58String(assetIds[i]))]), (i + 1))
993+ else throw("Strict value is not equal to itself.")
994+ }
995+ }
996+
997+ let $t02384523913 = {
998+ let $l = _xp()
999+ let $s = size($l)
1000+ let $acc0 = $Tuple2(nil, 0)
1001+ func $f0_1 ($a,$i) = if (($i >= $s))
1002+ then $a
1003+ else calcScriptActions($a, $l[$i])
1004+
1005+ func $f0_2 ($a,$i) = if (($i >= $s))
1006+ then $a
1007+ else throw("List size exceeds 15")
1008+
1009+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
1010+ }
1011+ let scriptActions = $t02384523913._1
1012+ let i = $t02384523913._2
1013+ (scriptActions ++ [Burn(shareAssetId, withdrawAmount), IntegerEntry(kShareAssetSupply, (shareSupply - withdrawAmount))])
1014+ }
1015+ else throw("Strict value is not equal to itself.")
1016+ }
1017+ }
1018+ })
1019+
1020+
1021+
1022+@Callable(msg)
1023+func calcWithdrawOneCoin (tokenAmount,tokenOut,user) = {
1024+ let i = valueOrErrorMessage(indexOf(assetIds, tokenOut), "unknown token out")
1025+ $Tuple2(nil, _calcWithdrawOneCoin(_xp(), tokenAmount, i, Address(fromBase58String(user)))._1)
1026+ }
1027+
1028+
1029+
1030+@Callable(msg)
1031+func withdrawOneCoin (tokenOut,minAmount,unlockAmount) = valueOrElse(isActive(), if ((size(msg.payments) != 1))
1032+ then throw("size(payments) != 1")
1033+ else {
1034+ let suspicious = checkSuspicious()
1035+ if (suspicious._1)
1036+ then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.caller, msg.payments))
1037+ else {
1038+ let payment = msg.payments[0]
1039+ let tokenIn = payment.assetId
1040+ if ((tokenIn != shareAssetId))
1041+ then throw("unknown token")
1042+ else {
1043+ let outIndex = valueOrErrorMessage(indexOf(assetIds, tokenOut), "unknown token out")
1044+ let _tokenAmount = payment.amount
1045+ let unlock = if ((unlockAmount > 0))
1046+ then invoke(farmingAddress, "withdrawShareTokens", [toString(this), unlockAmount], nil)
1047+ else 0
1048+ if ((unlock == unlock))
1049+ then {
1050+ let withdrawAmount = (_tokenAmount + unlockAmount)
1051+ let xp = _xp()
1052+ let $t02514425225 = _calcWithdrawOneCoin(xp, withdrawAmount, outIndex, msg.caller)
1053+ let dy = $t02514425225._1
1054+ let dy_fee = $t02514425225._2
1055+ if (assert((dy >= minAmount)))
1056+ then throw("Not enough coins removed")
1057+ else {
1058+ let governanceFees = fraction(dy_fee, feeGovernance, feeScale6)
1059+ let dy_and_fee = (dy + dy_fee)
1060+ func makeNewBalances (acc,tokenBalance) = {
1061+ let $t02548325509 = acc
1062+ let newBalances = $t02548325509._1
1063+ let i = $t02548325509._2
1064+ if ((i == outIndex))
1065+ then $Tuple2((newBalances :+ (tokenBalance - dy_and_fee)), (i + 1))
1066+ else $Tuple2((newBalances :+ tokenBalance), (i + 1))
1067+ }
1068+
1069+ let $t02567625737 = {
1070+ let $l = xp
1071+ let $s = size($l)
1072+ let $acc0 = $Tuple2(nil, 0)
1073+ func $f0_1 ($a,$i) = if (($i >= $s))
1074+ then $a
1075+ else makeNewBalances($a, $l[$i])
1076+
1077+ func $f0_2 ($a,$i) = if (($i >= $s))
1078+ then $a
1079+ else throw("List size exceeds 15")
1080+
1081+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
1082+ }
1083+ let newBalances = $t02567625737._1
1084+ let i = $t02567625737._2
1085+ if (checkDAppThreshold(newBalances))
1086+ then throw()
1087+ else {
1088+ let us = unstake(dy_and_fee, tokenOut)
1089+ if ((us == us))
1090+ then [ScriptTransfer(msg.caller, dy, fromBase58String(tokenOut)), IntegerEntry((assetIds[i] + kAssetBalance), (xp[i] - dy_and_fee)), Burn(shareAssetId, withdrawAmount), ScriptTransfer(moneyBoxAddress, governanceFees, fromBase58String(tokenOut)), ScriptTransfer(capMoneyBoxAddress, (dy_fee - governanceFees), fromBase58String(tokenOut)), IntegerEntry(kShareAssetSupply, (shareSupply - withdrawAmount))]
1091+ else throw("Strict value is not equal to itself.")
1092+ }
1093+ }
1094+ }
1095+ else throw("Strict value is not equal to itself.")
1096+ }
1097+ }
1098+ })
1099+
1100+
1101+
1102+@Callable(msg)
1103+func A () = $Tuple2(nil, _A())
1104+
1105+
1106+
1107+@Callable(msg)
1108+func getVirtualPrice () = {
1109+ let D = get_D(_xp(), _A())
1110+ $Tuple2(nil, fraction(D, PRECISION, shareSupply))
1111+ }
1112+
1113+
1114+
1115+@Callable(msg)
1116+func calcTokenAmount (amounts,deposit) = {
1117+ let amp = _A()
1118+ let balances = _xp()
1119+ let D0 = getDMem(balances, amp)
1120+ func calcNewBalances (acc,balance) = {
1121+ let $t02669826724 = acc
1122+ let newBalances = $t02669826724._1
1123+ let i = $t02669826724._2
1124+ let newBalance = (balance + (if (deposit)
1125+ then amounts[i]
1126+ else -(amounts[i])))
1127+ $Tuple2((newBalances :+ newBalance), (i + 1))
1128+ }
1129+
1130+ let newBalances = ( let $l = balances
1131+ let $s = size($l)
1132+ let $acc0 = $Tuple2(nil, 0)
1133+ func $f0_1 ($a,$i) = if (($i >= $s))
1134+ then $a
1135+ else calcNewBalances($a, $l[$i])
1136+
1137+ func $f0_2 ($a,$i) = if (($i >= $s))
1138+ then $a
1139+ else throw("List size exceeds 15")
1140+
1141+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15))._1
1142+ let D1 = getDMem(newBalances, amp)
1143+ let diff = if (deposit)
1144+ then (D1 - D0)
1145+ else (D0 - D1)
1146+ $Tuple2(nil, fraction(diff, shareSupply, D0))
1147+ }
1148+
1149+
1150+
1151+@Callable(msg)
1152+func rampA (_futureA,_futureTime) = valueOrElse(isActive(), valueOrElse(isAdminCall(msg), if (assert((blockTimestamp >= (initial_A_time + MIN_RAMP_TIME))))
1153+ then throw("too often")
1154+ else if (assert((_futureTime >= (blockTimestamp + MIN_RAMP_TIME))))
1155+ then throw("insufficient time")
1156+ else {
1157+ let _initial_A = _A()
1158+ if (assert(if ((_futureA > 0))
1159+ then (MAX_A > _futureA)
1160+ else false))
1161+ then throw("out of base range")
1162+ else if (assert(if (if ((_futureA >= _initial_A))
1163+ then ((_initial_A * MAX_A_CHANGE) >= _futureA)
1164+ else false)
1165+ then true
1166+ else if ((_initial_A > _futureA))
1167+ then ((_futureA * MAX_A_CHANGE) >= _initial_A)
1168+ else false))
1169+ then throw("out of range")
1170+ else [IntegerEntry("initial_A", _initial_A), IntegerEntry("future_A", _futureA), IntegerEntry("initial_A_time", blockTimestamp), IntegerEntry("future_A_time", _futureTime)]
1171+ }))
1172+
1173+
1174+
1175+@Callable(msg)
1176+func stopRampA () = valueOrElse(isActive(), valueOrElse(isAdminCall(msg), {
1177+ let currentA = _A()
1178+[IntegerEntry("initial_A", currentA), IntegerEntry("future_A", currentA), IntegerEntry("initial_A_time", blockTimestamp), IntegerEntry("future_A_time", blockTimestamp)]
1179+ }))
1180+
1181+
1182+
1183+@Callable(msg)
1184+func shutdown () = valueOrElse(isAdminCall(msg), if (!(active))
1185+ then throw(("DApp is already suspended. Cause: " + valueOrElse(getString(this, kCause), "the cause wasn't specified")))
1186+ else suspend("Paused by admin"))
1187+
1188+
1189+
1190+@Callable(msg)
1191+func activate () = valueOrElse(isAdminCall(msg), if (active)
1192+ then throwIsActive()
1193+ else [BooleanEntry(kActive, true), DeleteEntry(kCause)])
1194+
1195+
1196+
1197+@Callable(msg)
1198+func keepLimitForFirstHarvest (shareLimit) = valueOrElse(isActive(), valueOrElse(isAdminCall(msg), [IntegerEntry(kShareLimit, shareLimit)]))
1199+
1200+
1201+@Verifier(tx)
1202+func verify () = {
1203+ let multiSignedByAdmins = {
1204+ let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
1205+ then 1
1206+ else 0
1207+ let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
1208+ then 1
1209+ else 0
1210+ let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
1211+ then 1
1212+ else 0
1213+ (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
1214+ }
1215+ match tx {
1216+ case inv: InvokeScriptTransaction =>
1217+ let callTakeIntoAccount = if ((inv.dApp == this))
1218+ then (inv.function == "takeIntoAccountExtraFunds")
1219+ else false
1220+ let signedByAdmin = if (if (if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
1221+ then true
1222+ else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey2))
1223+ then true
1224+ else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey3))
1225+ then true
1226+ else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKeyInvoke)
1227+ if (if (callTakeIntoAccount)
1228+ then signedByAdmin
1229+ else false)
1230+ then true
1231+ else multiSignedByAdmins
1232+ case _ =>
1233+ multiSignedByAdmins
1234+ }
1235+ }
1236+

github/deemru/w8io/873ac7e 
65.23 ms