tx · H28GpQJ5S3Ai4vsExCsB1LFp7HjtCWitEUPXiMAinV6w

3NCJATKcGvC9HbmBJTbeyfcPMfPTYgtyRrk:  -0.03500000 Waves

2022.09.01 16:46 [2210141] smart account 3NCJATKcGvC9HbmBJTbeyfcPMfPTYgtyRrk > SELF 0.00000000 Waves

{ "type": 13, "id": "H28GpQJ5S3Ai4vsExCsB1LFp7HjtCWitEUPXiMAinV6w", "fee": 3500000, "feeAssetId": null, "timestamp": 1662039976410, "version": 2, "chainId": 84, "sender": "3NCJATKcGvC9HbmBJTbeyfcPMfPTYgtyRrk", "senderPublicKey": "Eqjmgsxu1W6LKavhwYC5Z9wLZR2CLWvYHVgfYNcwTQmH", "proofs": [ "3br49vA6wXUPh1GovnVTLgtnmryxCRhe2GP1thaQmfEBPt8vBZvH6GNLa6FHVbSYXV3wJTzwPhJD8SUVzRnxC5d7", "1JFXnwaykX9KhTdAvFPrai6BgC3wfiZJxZDCWnc3A67D69sjk4dFzaiT2azVS2k8N8SwoA9MzBPP9UvU6XZLqHw" ], "script": "base64:BgJXCAISBAoCEQESBQoDCAEEEgQKAgEEEgMKAQESBgoECAgBCBIECgIIARIECgIRARIFCgMBCAgSBQoDCAEBEgASABIECgIRBBIECgIBARIAEgASABIDCgEBWwAJUFJFQ0lTSU9OAMCEPQAFTUFYX0EAwIQ9AAxNQVhfQV9DSEFOR0UACgAIREVDSU1BTFMABgANTUlOX1JBTVBfVElNRQkAaQIAgKMFADwAB2tBc3NldHMCCWFzc2V0X2lkcwANa0Fzc2V0QmFsYW5jZQIIX2JhbGFuY2UAB2tBY3RpdmUCBmFjdGl2ZQAGa0NhdXNlAg5zaHV0ZG93bl9jYXVzZQANa1NoYXJlQXNzZXRJZAIOc2hhcmVfYXNzZXRfaWQAEWtTaGFyZUFzc2V0U3VwcGx5AhJzaGFyZV9hc3NldF9zdXBwbHkABGtGZWUCCmNvbW1pc3Npb24AEmtEQXBwVGhyZXNob2xkQ29lZgIRZEFwcFRocmVzaG9sZENvZWYADGtVU0ROQWRkcmVzcwIYc3Rha2luZ191c2RubnNidF9hZGRyZXNzAAprRGlzY291bnRzAglkaXNjb3VudHMAD2tEaXNjb3VudFZhbHVlcwIPZGlzY291bnRfdmFsdWVzAA5rVXNlclN3b3BJbkdvdgIMX1NXT1BfYW1vdW50AA1rRmlyc3RIYXJ2ZXN0Ag1maXJzdF9oYXJ2ZXN0ABNrRmlyc3RIYXJ2ZXN0SGVpZ2h0AhRmaXJzdF9oYXJ2ZXN0X2hlaWdodAALa1NoYXJlTGltaXQCHHNoYXJlX2xpbWl0X29uX2ZpcnN0X2hhcnZlc3QAC2tCYXNlUGVyaW9kAgtiYXNlX3BlcmlvZAANa1BlcmlvZExlbmd0aAINcGVyaW9kX2xlbmd0aAAMa1N0YXJ0SGVpZ2h0AgxzdGFydF9oZWlnaHQADWtBZG1pblB1YktleTECC2FkbWluX3B1Yl8xAA1rQWRtaW5QdWJLZXkyAgthZG1pbl9wdWJfMgANa0FkbWluUHViS2V5MwILYWRtaW5fcHViXzMAEmtBZG1pbkludm9rZVB1YktleQIQYWRtaW5faW52b2tlX3B1YgAQa01vbmV5Qm94QWRkcmVzcwIRbW9uZXlfYm94X2FkZHJlc3MAC2tHb3ZBZGRyZXNzAhJnb3Zlcm5hbmNlX2FkZHJlc3MADmtWb3RpbmdBZGRyZXNzAg52b3RpbmdfYWRkcmVzcwAPa0Zhcm1pbmdBZGRyZXNzAg9mYXJtaW5nX2FkZHJlc3MABm9yYWNsZQkBB0FkZHJlc3MBARoBVOlFqh6QLzqu8boO5i6akl8amITh82KzCAETZ2V0QmFzZTU4RnJvbU9yYWNsZQEDa2V5BAckbWF0Y2gwCQCdCAIFBm9yYWNsZQUDa2V5AwkAAQIFByRtYXRjaDACBlN0cmluZwQGc3RyaW5nBQckbWF0Y2gwCQDZBAEFBnN0cmluZwQHbm90aGluZwUHJG1hdGNoMAkAAgEJAKwCAgUDa2V5AghpcyBlbXB0eQAMYWRtaW5QdWJLZXkxCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFDWtBZG1pblB1YktleTEADGFkbWluUHViS2V5MgkBE2dldEJhc2U1OEZyb21PcmFjbGUBBQ1rQWRtaW5QdWJLZXkyAAxhZG1pblB1YktleTMJARNnZXRCYXNlNThGcm9tT3JhY2xlAQUNa0FkbWluUHViS2V5MwARYWRtaW5QdWJLZXlJbnZva2UJARNnZXRCYXNlNThGcm9tT3JhY2xlAQUSa0FkbWluSW52b2tlUHViS2V5AA9tb25leUJveEFkZHJlc3MJAQdBZGRyZXNzAQkBE2dldEJhc2U1OEZyb21PcmFjbGUBBRBrTW9uZXlCb3hBZGRyZXNzAApnb3ZBZGRyZXNzCQEHQWRkcmVzcwEJARNnZXRCYXNlNThGcm9tT3JhY2xlAQULa0dvdkFkZHJlc3MAEnN0YWtpbmdVU0ROQWRkcmVzcwkBB0FkZHJlc3MBCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFDGtVU0ROQWRkcmVzcwANdm90aW5nQWRkcmVzcwkBB0FkZHJlc3MBCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFDmtWb3RpbmdBZGRyZXNzAA5mYXJtaW5nQWRkcmVzcwkBB0FkZHJlc3MBCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFD2tGYXJtaW5nQWRkcmVzcwASY2FwTW9uZXlCb3hBZGRyZXNzCQEHQWRkcmVzcwEBGgFUXmlqF+mqIH0+j69gu0TO8ei+zt5lnFLzAARVU0ROASBvJKPKqzDcUimY6CxhWu5afyNNwi11u+mdqlTg0tAHwQANc3Rha2luZ0Fzc2V0cwkAzAgCCQDYBAEFBFVTRE4FA25pbAAKYmFzZVBlcmlvZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFDXZvdGluZ0FkZHJlc3MFC2tCYXNlUGVyaW9kAhFFbXB0eSBrQmFzZVBlcmlvZAALc3RhcnRIZWlnaHQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQ12b3RpbmdBZGRyZXNzBQxrU3RhcnRIZWlnaHQCEkVtcHR5IGtTdGFydEhlaWdodAAMcGVyaW9kTGVuZ3RoCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUNdm90aW5nQWRkcmVzcwUNa1BlcmlvZExlbmd0aAITRW1wdHkga1BlcmlvZExlbmd0aAAVZmlyc3RIYXJ2ZXN0RW5kUGVyaW9kCQBkAgkAZAIFCmJhc2VQZXJpb2QJAGkCCQBlAgUGaGVpZ2h0BQtzdGFydEhlaWdodAUMcGVyaW9kTGVuZ3RoAAMABmFjdGl2ZQkBEUBleHRyTmF0aXZlKDEwNTEpAgUEdGhpcwUHa0FjdGl2ZQAMc2hhcmVBc3NldElkCQDZBAEJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMFDWtTaGFyZUFzc2V0SWQAC3NoYXJlU3VwcGx5CQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzBRFrU2hhcmVBc3NldFN1cHBseQAJZmVlU2NhbGU2AMCEPQADZmVlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzBQRrRmVlAA1mZWVHb3Zlcm5hbmNlCQBrAwAoBQlmZWVTY2FsZTYAZAAJaW5pdGlhbF9BCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzAglpbml0aWFsX0EACGZ1dHVyZV9BCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzAghmdXR1cmVfQQAOaW5pdGlhbF9BX3RpbWUJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwIOaW5pdGlhbF9BX3RpbWUAAAANZnV0dXJlX0FfdGltZQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzAg1mdXR1cmVfQV90aW1lAAAACGFzc2V0SWRzCQC1CQIJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMFB2tBc3NldHMCASwABm5Db2lucwkAkAMBBQhhc3NldElkcwEHc3VzcGVuZAEFY2F1c2UJAMwIAgkBDEJvb2xlYW5FbnRyeQIFB2tBY3RpdmUHCQDMCAIJAQtTdHJpbmdFbnRyeQIFBmtDYXVzZQUFY2F1c2UFA25pbAENdGhyb3dJc0FjdGl2ZQAJAAIBAhZEQXBwIGlzIGFscmVhZHkgYWN0aXZlAQhpc0FjdGl2ZQADBQZhY3RpdmUFBHVuaXQJAAIBAh9EQXBwIGlzIGluYWN0aXZlIGF0IHRoaXMgbW9tZW50AQtpc0FkbWluQ2FsbAEBaQMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFDGFkbWluUHViS2V5MQkAzAgCBQxhZG1pblB1YktleTIJAMwIAgUMYWRtaW5QdWJLZXkzBQNuaWwIBQFpD2NhbGxlclB1YmxpY0tleQUEdW5pdAkAAgECIU9ubHkgYWRtaW4gY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgEKaXNTZWxmQ2FsbAEBaQMJAAACBQR0aGlzCAUBaQZjYWxsZXIFBHVuaXQJAAIBAitPbmx5IGNvbnRyYWN0IGl0c2VsZiBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uAARiaWcyCQC2AgEAAgAOYmxvY2tUaW1lc3RhbXAFBmhlaWdodAEGYXNzZXJ0AQFhAwUBYQcGARRjYWxjdWxhdGVGZWVEaXNjb3VudAEIdXNlckFkZHIECnN3b3BBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUKZ292QWRkcmVzcwkArAICCQClCAEFCHVzZXJBZGRyBQ5rVXNlclN3b3BJbkdvdgAABA5kaXNjb3VudFZhbHVlcwkAtQkCCQERQGV4dHJOYXRpdmUoMTA1MykCBQZvcmFjbGUFD2tEaXNjb3VudFZhbHVlcwIBLAQJZGlzY291bnRzCQC1CQIJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBm9yYWNsZQUKa0Rpc2NvdW50cwIBLAMDCQBnAgUKc3dvcEFtb3VudAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDmRpc2NvdW50VmFsdWVzAAAJAGYCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUOZGlzY291bnRWYWx1ZXMAAQUKc3dvcEFtb3VudAcJAGUCBQlmZWVTY2FsZTYJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQlkaXNjb3VudHMAAAMDCQBnAgUKc3dvcEFtb3VudAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDmRpc2NvdW50VmFsdWVzAAEJAGYCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUOZGlzY291bnRWYWx1ZXMAAgUKc3dvcEFtb3VudAcJAGUCBQlmZWVTY2FsZTYJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQlkaXNjb3VudHMAAQMDCQBnAgUKc3dvcEFtb3VudAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDmRpc2NvdW50VmFsdWVzAAIJAGYCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUOZGlzY291bnRWYWx1ZXMAAwUKc3dvcEFtb3VudAcJAGUCBQlmZWVTY2FsZTYJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQlkaXNjb3VudHMAAgMDCQBnAgUKc3dvcEFtb3VudAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDmRpc2NvdW50VmFsdWVzAAMJAGYCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUOZGlzY291bnRWYWx1ZXMABAUKc3dvcEFtb3VudAcJAGUCBQlmZWVTY2FsZTYJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQlkaXNjb3VudHMAAwMJAGcCBQpzd29wQW1vdW50CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUOZGlzY291bnRWYWx1ZXMABAkAZQIFCWZlZVNjYWxlNgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCWRpc2NvdW50cwAEBQlmZWVTY2FsZTYBAl9BAAQCdDEFDWZ1dHVyZV9BX3RpbWUEAkExBQhmdXR1cmVfQQMJAGYCBQJ0MQUOYmxvY2tUaW1lc3RhbXAEAkEwBQlpbml0aWFsX0EEAnQwBQ5pbml0aWFsX0FfdGltZQMJAGYCBQJBMQUCQTAJAGQCBQJBMAkAaQIJAGgCCQBlAgUCQTEFAkEwCQBlAgUOYmxvY2tUaW1lc3RhbXAFAnQwCQBlAgUCdDEFAnQwCQBlAgUCQTAJAGkCCQBoAgkAZQIFAkEwBQJBMQkAZQIFDmJsb2NrVGltZXN0YW1wBQJ0MAkAZQIF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X3JlZHVjZWRfaQkAkQMCBQp4cF9yZWR1Y2VkBQFpBAJkeQkAZQIJAGUCBQx4cF9yZWR1Y2VkX2kJAQdnZXRfeV9EBAUDYW1wBQFpBQp4cF9yZWR1Y2VkBQJEMQABCQCUCgIFAmR5CQBlAgUEZHlfMAUCZHkBDWdldFN0ckFzc2V0SWQBB2Fzc2V0SWQEByRtYXRjaDAFB2Fzc2V0SWQDCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQCaWQFByRtYXRjaDAJANgEAQUCaWQDCQABAgUHJG1hdGNoMAIEVW5pdAQFd2F2ZXMFByRtYXRjaDACBVdBVkVTCQACAQILTWF0Y2ggZXJyb3IBGGNhbGNTdGFraW5nRnVuY0FuZEFkZHJlcwIFc3Rha2UHYXNzZXRJZAMFBXN0YWtlCQCUCgICDGxvY2tOZXV0cmlubwUSc3Rha2luZ1VTRE5BZGRyZXNzCQCUCgICDnVubG9ja05ldXRyaW5vBRJzdGFraW5nVVNETkFkZHJlc3MBEWNhbGNTdGFraW5nUGFyYW1zAwVzdGFrZQZhbW91bnQHYXNzZXRJZAMFBXN0YWtlBA0kdDAxMTEyNDExMTkwCQEYY2FsY1N0YWtpbmdGdW5jQW5kQWRkcmVzAgUFc3Rha2UFB2Fzc2V0SWQEBGNhbGwIBQ0kdDAxMTEyNDExMTkwAl8xBAtzdGFraW5nQWRkcggFDSR0MDExMTI0MTExOTACXzIJAJYKBAUEY2FsbAULc3Rha2luZ0FkZHIFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUHYXNzZXRJZAUGYW1vdW50BQNuaWwEDSR0MDExMjc2MTEzNDIJARhjYWxjU3Rha2luZ0Z1bmNBbmRBZGRyZXMCBQVzdGFrZQUHYXNzZXRJZAQEY2FsbAgFDSR0MDExMjc2MTEzNDICXzEEC3N0YWtpbmdBZGRyCAUNJHQwMTEyNzYxMTM0MgJfMgkAlgoEBQRjYWxsBQtzdGFraW5nQWRkcgkAzAgCBQZhbW91bnQJAMwIAgkA2AQBBQdhc3NldElkBQNuaWwFA25pbAEFc3Rha2UCBmFtb3VudA1hc3NldElkU3RyaW5nAwkBD2NvbnRhaW5zRWxlbWVudAIFDXN0YWtpbmdBc3NldHMFDWFzc2V0SWRTdHJpbmcEDSR0MDExNTI5MTE2MzEJARFjYWxjU3Rha2luZ1BhcmFtcwMGBQZhbW91bnQJANkEAQUNYXNzZXRJZFN0cmluZwQEY2FsbAgFDSR0MDExNTI5MTE2MzECXzEEBGFkZHIIBQ0kdDAxMTUyOTExNjMxAl8yBAZwYXJhbXMIBQ0kdDAxMTUyOTExNjMxAl8zBAhwYXltZW50cwgFDSR0MDExNTI5MTE2MzECXzQJAPwHBAUEYWRkcgUEY2FsbAUGcGFyYW1zBQhwYXltZW50cwAAAQd1bnN0YWtlAgZhbW91bnQNYXNzZXRJZFN0cmluZwMJAQ9jb250YWluc0VsZW1lbnQCBQ1zdGFraW5nQXNzZXRzBQ1hc3NldElkU3RyaW5nBA0kdDAxMTgxNjExOTE5CQERY2FsY1N0YWtpbmdQYXJhbXMDBwUGYW1vdW50CQDZBAEFDWFzc2V0SWRTdHJpbmcEBGNhbGwIBQ0kdDAxMTgxNjExOTE5Al8xBARhZGRyCAUNJHQwMTE4MTYxMTkxOQJfMgQGcGFyYW1zCAUNJHQwMTE4MTYxMTkxOQJfMwQIcGF5bWVudHMIBQ0kdDAxMTgxNjExOTE5Al80CQD8BwQFBGFkZHIFBGNhbGwFBnBhcmFtcwUIcGF5bWVudHMAAAEMc3Rha2VkQW1vdW50AQdhc3NldElkBBZzdGFrZWRBbW91bnRDYWxjdWxhdGVkBAckbWF0Y2gwBQdhc3NldElkAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEA2FJZAUHJG1hdGNoMAMJAAACBQNhSWQFBFVTRE4JAJoIAgUSc3Rha2luZ1VTRE5BZGRyZXNzCQCsAgIJAKwCAgkArAICAgxycGRfYmFsYW5jZV8JANgEAQUDYUlkAgFfCQClCAEFBHRoaXMAAAMJAAECBQckbWF0Y2gwAgRVbml0AAAJAAIBAgtNYXRjaCBlcnJvcgQHJG1hdGNoMAUWc3Rha2VkQW1vdW50Q2FsY3VsYXRlZAMJAAECBQckbWF0Y2gwAgNJbnQEAWkFByRtYXRjaDAFAWkAAAEPY2hlY2tTdXNwaWNpb3VzAAQQY29udHJhY3RCYWxhbmNlcwkBA194cAAKAQxjaGVja0JhbGFuY2UCA2FjYwdhc3NldElkBA0kdDAxMjUzMDEyNTU1BQNhY2MECnN1c3BpY2lvdXMIBQ0kdDAxMjUzMDEyNTU1Al8xBAFpCAUNJHQwMTI1MzAxMjU1NQJfMgMFCnN1c3BpY2lvdXMJAJQKAgUKc3VzcGljaW91cwUBaQQIYUJhbGFuY2UJAGQCCQDwBwIFBHRoaXMJANkEAQUHYXNzZXRJZAkBDHN0YWtlZEFtb3VudAEJANkEAQUHYXNzZXRJZAMJAGYCCQCRAwIFEGNvbnRyYWN0QmFsYW5jZXMFAWkFCGFCYWxhbmNlCQCUCgIGBQFpCQCUCgIHCQBkAgUBaQABCgACJGwFCGFzc2V0SWRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCBwAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQxjaGVja0JhbGFuY2UCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDE1CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPARFzdXNwZW5kU3VzcGljaW91cwEBaQkBB3N1c3BlbmQBCQCsAgICHVN1c3BpY2lvdXMgc3RhdGUgd2l0aCBhc3NldDogCQCRAwIFCGFzc2V0SWRzBQFpAQ5yZXR1cm5QYXltZW50cwIGY2FsbGVyCHBheW1lbnRzCgENcGFyc2VQYXltZW50cwIDYWNjB3BheW1lbnQJAM0IAgUDYWNjCQEOU2NyaXB0VHJhbnNmZXIDBQZjYWxsZXIIBQdwYXltZW50BmFtb3VudAgFB3BheW1lbnQHYXNzZXRJZAoAAiRsBQhwYXltZW50cwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQENcGFyc2VQYXltZW50cwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTUJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8BEmNoZWNrREFwcFRocmVzaG9sZAELbmV3QmFsYW5jZXMEEWRBcHBUaHJlc2hvbGRDb2VmCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUEdGhpcwUSa0RBcHBUaHJlc2hvbGRDb2VmAhhObyBkQXBwVGhyZXNob2xkQ29lZiBrZXkEDnRocmVzaG9sZFNjYWxlAJBOBAptYXhCYWxhbmNlCQCWAwEFC25ld0JhbGFuY2VzBAptaW5CYWxhbmNlCQCXAwEFC25ld0JhbGFuY2VzBAVyYXRpbwkAawMFCm1heEJhbGFuY2UFDnRocmVzaG9sZFNjYWxlBQptaW5CYWxhbmNlAwkAZgIFBXJhdGlvCQBoAgURZEFwcFRocmVzaG9sZENvZWYFDnRocmVzaG9sZFNjYWxlCQACAQI4TmV3IGJhbGFuY2UgaW4gYXNzZXRzIG9mIHRoZSBEQXBwIGlzIGxlc3MgdGhhbiB0aHJlc2hvbGQHAQpjaGVja0NvaW5zAQhhc3NldElkcwQFY29pbnMJALUJAgUIYXNzZXRJZHMCASwKAQljaGVja0NvaW4CBWVycm9yB2Fzc2V0SWQEBWFzc2V0CQETdmFsdWVPckVycm9yTWVzc2FnZQIJANkEAQUHYXNzZXRJZAkArAICAhJmcm9tQmFzZTU4U3RyaW5nOiAFB2Fzc2V0SWQECGRlY2ltYWxzCAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDsBwEFBWFzc2V0CQCsAgICC2Fzc2V0SW5mbzogBQdhc3NldElkCGRlY2ltYWxzAwkBAiE9AgUIZGVjaW1hbHMFCERFQ0lNQUxTCQACAQIOd3JvbmcgZGVjaW1hbHMHCgACJGwFBWNvaW5zCgACJHMJAJADAQUCJGwKAAUkYWNjMAcKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCWNoZWNrQ29pbgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTUJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8RA21zZwEBRAICeHADYW1wBAFECQEOZ2V0X0RfaW50ZXJuYWwCBQJ4cAUDYW1wCQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQICAUQFAUQFA25pbAUBRANtc2cBBGluaXQDCGFzc2V0SWRzAl9BDGZpcnN0SGFydmVzdAMJAQEhAQkAnggBBQR0aGlzCQACAQITQWxyZWFkeSBpbml0aWFsaXplZAQJc2hhcmVOYW1lAgtzX011bHRpX1VTRAQQc2hhcmVEZXNjcmlwdGlvbgkArAICAkJTaGFyZVRva2VuIG9mIFN3b3BGaSBwcm90b2NvbCBmb3IgTXVsdGlTdGFibGUgVVNEIHBvb2wgYXQgYWRkcmVzcyAJAKUIAQUEdGhpcwQKaXNzdWVUb2tlbgkAwggFBQlzaGFyZU5hbWUFEHNoYXJlRGVzY3JpcHRpb24AAAAGBgQHdG9rZW5JZAkAuAgBBQppc3N1ZVRva2VuAwkBCmNoZWNrQ29pbnMBBQhhc3NldElkcwkBBXRocm93AAQJYmFzZUVudHJ5CQDMCAIJAQtTdHJpbmdFbnRyeQIFB2tBc3NldHMFCGFzc2V0SWRzCQDMCAIJAQxJbnRlZ2VyRW50cnkCAglpbml0aWFsX0EFAl9BCQDMCAIJAQxJbnRlZ2VyRW50cnkCAghmdXR1cmVfQQUCX0EJAMwIAgkBDEludGVnZXJFbnRyeQIFBGtGZWUJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBm9yYWNsZQINYmFzZV9mZWVfZmxhdAkAzAgCCQELU3RyaW5nRW50cnkCBQ1rU2hhcmVBc3NldElkCQDYBAEFB3Rva2VuSWQJAMwIAgkBDEludGVnZXJFbnRyeQIFEWtTaGFyZUFzc2V0U3VwcGx5AAAJAMwIAgkBDEludGVnZXJFbnRyeQIFEmtEQXBwVGhyZXNob2xkQ29lZgAPCQDMCAIJAQxCb29sZWFuRW50cnkCBQdrQWN0aXZlBgkAzAgCBQppc3N1ZVRva2VuBQNuaWwDBQxmaXJzdEhhcnZlc3QJAM4IAgUJYmFzZUVudHJ5CQDMCAIJAQxCb29sZWFuRW50cnkCBQ1rRmlyc3RIYXJ2ZXN0BQxmaXJzdEhhcnZlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIFE2tGaXJzdEhhcnZlc3RIZWlnaHQJAGQCBQtzdGFydEhlaWdodAkAaAIFFWZpcnN0SGFydmVzdEVuZFBlcmlvZAUMcGVyaW9kTGVuZ3RoBQNuaWwFCWJhc2VFbnRyeQNtc2cBDGFkZExpcXVpZGl0eQINbWluTWludEFtb3VudAxzdGFrZUZhcm1pbmcJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAEA2FtcAkBAl9BAAQCeHAJAQNfeHAABAJEMAMJAAACBQtzaGFyZVN1cHBseQAAAAAJAQdnZXRETWVtAgUCeHAFA2FtcAQIcGF5bWVudHMIBQNtc2cIcGF5bWVudHMEAW4JAJADAQUIcGF5bWVudHMKAQ12YWxpZFBheW1lbnRzAQFuAwkAZgIFAW4FBm5Db2lucwkAAgEJAKwCAgIQcGF5bWVudHMgc2l6ZSA+IAkApAMBBQZuQ29pbnMDCQBmAgABBQFuCQACAQIRcGF5bWVudHMgc2l6ZSA8IDEDAwkAAAIFC3NoYXJlU3VwcGx5AAAJAQIhPQIFBm5Db2lucwUBbgcJAAIBAiJpbml0aWFsIGRlcG9zaXQgcmVxdWlyZXMgYWxsIGNvaW5zCgEMcGF5bWFudFZhbGlkAgNhY2MHcGF5bWVudAMJAQ9jb250YWluc0VsZW1lbnQCBQhhc3NldElkcwkBDWdldFN0ckFzc2V0SWQBCAUHcGF5bWVudAdhc3NldElkBgkAAgECGEludmFsaWQgYXNzZXQgaW4gcGF5bWVu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aW9ucwgFDSR0MDE3NDUzMTc0OTQCXzIEAWkIBQ0kdDAxNzQ1MzE3NDk0Al8zAwkAZgIFC3NoYXJlU3VwcGx5AAAEBF9mZWUJAGkCCQBoAgkAbgQFA2ZlZQULZmVlRGlzY291bnQFCWZlZVNjYWxlNgUHQ0VJTElORwUGbkNvaW5zCQBoAgAECQBlAgUGbkNvaW5zAAEEBGZlZXMEDGlkZWFsQmFsYW5jZQkAawMFAkQxCQCRAwIFAnhwBQFpBQJEMAQKZGlmZmVyZW5jZQMJAGYCBQxpZGVhbEJhbGFuY2UFCm5ld0JhbGFuY2UJAGUCBQxpZGVhbEJhbGFuY2UFCm5ld0JhbGFuY2UJAGUCBQpuZXdCYWxhbmNlBQxpZGVhbEJhbGFuY2UJAGsDBQRfZmVlBQpkaWZmZXJlbmNlBQlmZWVTY2FsZTYEDmdvdmVybmFuY2VGZWVzCQBrAwUEZmVlcwUNZmVlR292ZXJuYW5jZQUJZmVlU2NhbGU2BAxmaW5hbEJhbGFuY2UJAGUCBQpuZXdCYWxhbmNlBQ5nb3Zlcm5hbmNlRmVlcwQQaW52YXJpYW50QmFsYW5jZQkAZQIFCm5ld0JhbGFuY2UFBGZlZXMEAnVzCQEHdW5zdGFrZQIFBGZlZXMJAJEDAgUIYXNzZXRJZHMFAWkDCQAAAgUCdXMFAnVzCQCVCgMJAM0IAgULaW52QmFsYW5jZXMFEGludmFyaWFudEJhbGFuY2UJAM4IAgUNc2NyaXB0QWN0aW9ucwkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBRJjYXBNb25leUJveEFkZHJlc3MJAGUCBQRmZWVzBQ5nb3Zlcm5hbmNlRmVlcwkA2QQBCQCRAwIFCGFzc2V0SWRzBQFpCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFD21vbmV5Qm94QWRkcmVzcwUOZ292ZXJuYW5jZUZlZXMJANkEAQkAkQMCBQhhc3NldElkcwUBaQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCRAwIFCGFzc2V0SWRzBQFpBQ1rQXNzZXRCYWxhbmNlBQxmaW5hbEJhbGFuY2UFA25pbAkAZAIFAWkAAQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAlQoDCQDNCAIFC2ludkJhbGFuY2VzBQpuZXdCYWxhbmNlCQDNCAIFDXNjcmlwdEFjdGlvbnMJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAJEDAgUIYXNzZXRJZHMFAWkFDWtBc3NldEJhbGFuY2UFCm5ld0JhbGFuY2UJAGQCBQFpAAEEDSR0MDE4ODMxMTg5MTkKAAIkbAULbmV3QmFsYW5jZXMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCVCgMFA25pbAUDbmlsAAAKAQUkZjFfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBEWNhbGNTY3JpcHRBY3Rpb25zAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYxXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxNQkBBSRmMV8yAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwQLaW52QmFsYW5jZXMIBQ0kdDAxODgzMTE4OTE5Al8xBA1zY3JpcHRBY3Rpb25zCAUNJHQwMTg4MzExODkxOQJfMgQCRDIJAQdnZXRETWVtAgULaW52QmFsYW5jZXMFA2FtcAQLbWludF9hbW91bnQDCQAAAgULc2hhcmVTdXBwbHkAAAUCRDEJAGsDBQtzaGFyZVN1cHBseQkAZQIFAkQyBQJEMAUCRDADCQEGYXNzZXJ0AQkAZwIFC21pbnRfYW1vdW50BQ1taW5NaW50QW1vdW50CQACAQIUU2xpcHBhZ2Ugc2NyZXdlZCB5b3UDBQxzdGFrZUZhcm1pbmcEAnJlCQD8BwQFBHRoaXMCDHJlaXNzdWVTaGFyZQkAzAgCBQttaW50X2Ftb3VudAUDbmlsBQNuaWwDCQAAAgUCcmUFAnJlBAFzCQD8BwQFDmZhcm1pbmdBZGRyZXNzAg9sb2NrU2hhcmVUb2tlbnMJAMwIAgkApQgBBQR0aGlzBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFDHNoYXJlQXNzZXRJZAULbWludF9hbW91bnQFA25pbAMJAAACBQFzBQFzCQDNCAIFDXNjcmlwdEFjdGlvbnMJAQxJbnRlZ2VyRW50cnkCBRFrU2hhcmVBc3NldFN1cHBseQkAZAIFC3NoYXJlU3VwcGx5BQttaW50X2Ftb3VudAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAzggCBQ1zY3JpcHRBY3Rpb25zCQDMCAIJAQdSZWlzc3VlAwUMc2hhcmVBc3NldElkBQttaW50X2Ftb3VudAYJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFA21zZwZjYWxsZXIFC21pbnRfYW1vdW50BQxzaGFyZUFzc2V0SWQJAMwIAgkBDEludGVnZXJFbnRyeQIFEWtTaGFyZUFzc2V0U3VwcGx5CQBkAgULc2hhcmVTdXBwbHkFC21pbnRfYW1vdW50BQNuaWwDbXNnAQxyZWlzc3VlU2hhcmUBBmFtb3VudAkBC3ZhbHVlT3JFbHNlAgkBCmlzU2VsZkNhbGwBBQNtc2cJAMwIAgkBB1JlaXNzdWUDBQxzaGFyZUFzc2V0SWQFBmFtb3VudAYFA25pbANtc2cBBWdldER5BAlhc3NldEZyb20HYXNzZXRUbwJkeAt1c2VyQWRkcmVzcwQCeHAJAQNfeHAABAlmcm9tSW5kZXgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAzwgCBQhhc3NldElkcwUJYXNzZXRGcm9tAhB1bmtub3duIHRva2VuIGluBAd0b0luZGV4CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAM8IAgUIYXNzZXRJZHMFB2Fzc2V0VG8CEXVua25vd24gdG9rZW4gb3V0BAF4CQBkAgkAkQMCBQJ4cAUJZnJvbUluZGV4BQJkeAQBeQkBBGdldFkEBQlmcm9tSW5kZXgFB3RvSW5kZXgFAXgFAnhwBAJkeQkAZQIJAGUCCQCRAwIFAnhwBQd0b0luZGV4BQF5AAEEC2ZlZURpc2NvdW50CQEUY2FsY3VsYXRlRmVlRGlzY291bnQBCQEHQWRkcmVzcwEJANkEAQULdXNlckFkZHJlc3MEBF9mZWUJAGsDCQBuBAUDZmVlBQtmZWVEaXNjb3VudAUJZmVlU2NhbGU2BQdDRUlMSU5HBQJkeQUJZmVlU2NhbGU2CQCUCgIFA25pbAkAlAoCCQBlAgUCZHkFBF9mZWUFBF9mZWUDbXNnAQhleGNoYW5nZQIIdG9rZW5PdXQGbWluX2R5CQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUAAwkBAiE9AgkAkAMBCAUDbXNnCHBheW1lbnRzAAEJAAIBAhNzaXplKHBheW1lbnRzKSAhPSAxBApzdXNwaWNpb3VzCQEPY2hlY2tTdXNwaWNpb3VzAAMIBQpzdXNwaWNpb3VzAl8xCQDOCAIJARFzdXNwZW5kU3VzcGljaW91cwEIBQpzdXNwaWNpb3VzAl8yCQEOcmV0dXJuUGF5bWVudHMCCAUDbXNnBmNhbGxlcggFA21zZwhwYXltZW50cwQHcGF5bWVudAkAkQMCCAUDbXNnCHBheW1lbnRzAAAEB3Rva2VuSW4JAQ1nZXRTdHJBc3NldElkAQgFB3BheW1lbnQHYXNzZXRJZAQLdG9rZW5PdXRCNTgJANkEAQUIdG9rZW5PdXQEAmR4CAUHcGF5bWVudAZhbW91bnQECWZyb21JbmRleAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDPCAIFCGFzc2V0SWRzBQd0b2tlbkluAhB1bmtub3duIHRva2VuIGluBAd0b0luZGV4CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAM8IAgUIYXNzZXRJZHMFCHRva2VuT3V0AhF1bmtub3duIHRva2VuIG91dAQCeHAJAQNfeHAABAF4CQBkAgkAkQMCBQJ4cAUJZnJvbUluZGV4BQJkeAQBeQkBBGdldFkEBQlmcm9tSW5kZXgFB3RvSW5kZXgFAXgFAnhwBANfZHkJAGUCCQBlAgkAkQMCBQJ4cAUHdG9JbmRleAUBeQABBAtmZWVEaXNjb3VudAkBFGNhbGN1bGF0ZUZlZURpc2NvdW50AQgFA21zZwZjYWxsZXIEBF9mZWUJAGsDBQNfZHkJAG4EBQNmZWUFC2ZlZURpc2NvdW50BQlmZWVTY2FsZTYFB0NFSUxJTkcFCWZlZVNjYWxlNgQCZHkJAGUCBQNfZHkFBF9mZWUEDmdvdmVybmFuY2VGZWVzCQBrAwUEX2ZlZQUNZmVlR292ZXJuYW5jZQUJZmVlU2NhbGU2AwkBBmFzc2VydAEJAGcCBQJkeQUGbWluX2R5CQACAQIuRXhjaGFuZ2UgcmVzdWx0ZWQgaW4gZmV3ZXIgY29pbnMgdGhhbiBleHBlY3RlZAoBD21ha2VOZXdCYWxhbmNlcwIDYWNjDHRva2VuQmFsYW5jZQQNJHQwMjE2MzMyMTY1OQUDYWNjBAtuZXdCYWxhbmNlcwgFDSR0MDIxNjMzMjE2NTkCXzEEAWkIBQ0kdDAyMTYzMzIxNjU5Al8yAwkAAAIFAWkFCWZyb21JbmRleAkAlAoCCQDNCAIFC25ld0JhbGFuY2VzCQBkAgUMdG9rZW5CYWxhbmNlBQJkeAkAZAIFAWkAAQMJAAACBQFpBQd0b0luZGV4CQCUCgIJAM0IAgULbmV3QmFsYW5jZXMJAGUCBQx0b2tlbkJhbGFuY2UFA19keQkAZAIFAWkAAQkAlAoCCQDNCAIFC25ld0JhbGFuY2VzBQx0b2tlbkJhbGFuY2UJAGQCBQFpAAEEDSR0MDIxOTE2MjE5NzcKAAIkbAUCeHAKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIFA25pbAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQ9tYWtlTmV3QmFsYW5jZXMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDE1CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPBAtuZXdCYWxhbmNlcwgFDSR0MDIxOTE2MjE5NzcCXzEEAWkIBQ0kdDAyMTkxNjIxOTc3Al8yAwkBEmNoZWNrREFwcFRocmVzaG9sZAEFC25ld0JhbGFuY2VzCQEFdGhyb3cABAFzCQEFc3Rha2UCCAUHcGF5bWVudAZhbW91bnQJAQ1nZXRTdHJBc3NldElkAQgFB3BheW1lbnQHYXNzZXRJZAMJAAACBQFzBQFzBAJ1cwkBB3Vuc3Rha2UCBQNfZHkFCHRva2VuT3V0AwkAAAIFAnVzBQJ1cwkAlAoCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFB3Rva2VuSW4FDWtBc3NldEJhbGFuY2UFAXgJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIdG9rZW5PdXQFDWtBc3NldEJhbGFuY2UJAGUCCQCRAwIFAnhwBQd0b0luZGV4BQNfZHkJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFA21zZwZjYWxsZXIFAmR5BQt0b2tlbk91dEI1OAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQ9tb25leUJveEFkZHJlc3MFDmdvdmVybmFuY2VGZWVzBQt0b2tlbk91dEI1OAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBRJjYXBNb25leUJveEFkZHJlc3MJAGUCBQRfZmVlBQ5nb3Zlcm5hbmNlRmVlcwULdG9rZW5PdXRCNTgFA25pbAkAlAoCBQJkeQULdG9rZW5PdXRCNTgJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4DbXNnAQh3aXRoZHJhdwIKbWluQW1vdW50cwx1bmxvY2tBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQADCQECIT0CCQCQAwEIBQNtc2cIcGF5bWVudHMAAQkAAgECE3NpemUocGF5bWVudHMpICE9IDEECnN1c3BpY2lvdXMJAQ9jaGVja1N1c3BpY2lvdXMAAwgFCnN1c3BpY2lvdXMCXzEJAM4IAgkBEXN1c3BlbmRTdXNwaWNpb3VzAQgFCnN1c3BpY2lvdXMCXzIJAQ5yZXR1cm5QYXltZW50cwIIBQNtc2cGY2FsbGVyCAUDbXNnCHBheW1lbnRzBAdwYXltZW50CQCRAwIIBQNtc2cIcGF5bWVudHMAAAQHdG9rZW5JbggFB3BheW1lbnQHYXNzZXRJZAMJAQIhPQIFB3Rva2VuSW4FDHNoYXJlQXNzZXRJZAkAAgECDXVua25vd24gdG9rZW4EB19hbW91bnQIBQdwYXltZW50BmFtb3VudAQMdG90YWxfc3VwcGx5BQtzaGFyZVN1cHBseQQGdW5sb2NrAwkAZgIFDHVubG9ja0Ftb3VudAAACQD8BwQFDmZhcm1pbmdBZGRyZXNzAhN3aXRoZHJhd1NoYXJlVG9rZW5zCQDMCAIJAKUIAQUEdGhpcwkAzAgCBQx1bmxvY2tBbW91bnQFA25pbAUDbmlsAAADCQAAAgUGdW5sb2NrBQZ1bmxvY2sEDndpdGhkcmF3QW1vdW50CQBkAgUHX2Ftb3VudAUMdW5sb2NrQW1vdW50CgERY2FsY1NjcmlwdEFjdGlvbnMCA2FjYwdiYWxhbmNlBA0kdDAyMzM2MzIzMzkxBQNhY2MEDXNjcmlwdEFjdGlvbnMIBQ0kdDAyMzM2MzIzMzkxAl8xBAFpCAUNJHQwMjMzNjMyMzM5MQJfMgQHd0Ftb3VudAkAawMFB2JhbGFuY2UFDndpdGhkcmF3QW1vdW50BQx0b3RhbF9zdXBwbHkDCQEGYXNzZXJ0AQkAZwIFB3dBbW91bnQJAJEDAgUKbWluQW1vdW50cwUBaQkAAgECMFdpdGhkcmF3YWwgcmVzdWx0ZWQgaW4gZmV3ZXIgY29pbnMgdGhhbiBleHBlY3RlZAQCdXMJAQd1bnN0YWtlAgUHd0Ftb3VudAkAkQMCBQhhc3NldElkcwUBaQMJAAACBQJ1cwUCdXMJAJQKAgkAzggCBQ1zY3JpcHRBY3Rpb25zCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAJEDAgUIYXNzZXRJZHMFAWkFDWtBc3NldEJhbGFuY2UJAGUCBQdiYWxhbmNlBQd3QW1vdW50CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQNtc2cGY2FsbGVyBQd3QW1vdW50CQDZBAEJAJEDAgUIYXNzZXRJZHMFAWkFA25pbAkAZAIFAWkAAQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgQNJHQwMjM4ODEyMzk0OQoAAiRsCQEDX3hwAAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgUDbmlsAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBEWNhbGNTY3JpcHRBY3Rpb25zAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxNQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwQNc2NyaXB0QWN0aW9ucwgFDSR0MDIzODgxMjM5NDkCXzEEAWkIBQ0kdDAyMzg4MTIzOTQ5Al8yCQDOCAIFDXNjcmlwdEFjdGlvbnMJAMwIAgkBBEJ1cm4CBQxzaGFyZUFzc2V0SWQFDndpdGhkcmF3QW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRFrU2hhcmVBc3NldFN1cHBseQkAZQIFC3NoYXJlU3VwcGx5BQ53aXRoZHJhd0Ftb3VudAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuA21zZwETY2FsY1dpdGhkcmF3T25lQ29pbgMLdG9rZW5BbW91bnQIdG9rZW5PdXQEdXNlcgQBaQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDPCAIFCGFzc2V0SWRzBQh0b2tlbk91dAIRdW5rbm93biB0b2tlbiBvdXQJAJQKAgUDbmlsCAkBFF9jYWxjV2l0aGRyYXdPbmVDb2luBAkBA194cAAFC3Rva2VuQW1vdW50BQFpCQEHQWRkcmVzcwEJANkEAQUEdXNlcgJfMQNtc2cBD3dpdGhkcmF3T25lQ29pbgMIdG9rZW5PdXQJbWluQW1vdW50DHVubG9ja0Ftb3VudAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAMJAQIhPQIJAJADAQgFA21zZwhwYXltZW50cwABCQACAQITc2l6ZShwYXltZW50cykgIT0gMQQKc3VzcGljaW91cwkBD2NoZWNrU3VzcGljaW91cwADCAUKc3VzcGljaW91cwJfMQkAzggCCQERc3VzcGVuZFN1c3BpY2lvdXMBCAUKc3VzcGljaW91cwJfMgkBDnJldHVyblBheW1lbnRzAggFA21zZwZjYWxsZXIIBQNtc2cIcGF5bWVudHMEB3BheW1lbnQJAJEDAggFA21zZwhwYXltZW50cwAABAd0b2tlbkluCAUHcGF5bWVudAdhc3NldElkAwkBAiE9AgUHdG9rZW5JbgUMc2hhcmVBc3NldElkCQACAQINdW5rbm93biB0b2tlbgQIb3V0SW5kZXgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAzwgCBQhhc3NldElkcwUIdG9rZW5PdXQCEXVua25vd24gdG9rZW4gb3V0BAxfdG9rZW5BbW91bnQIBQdwYXltZW50BmFtb3VudAQGdW5sb2NrAwkAZgIFDHVubG9ja0Ftb3VudAAACQD8BwQFDmZhcm1pbmdBZGRyZXNzAhN3aXRoZHJhd1NoYXJlVG9rZW5zCQDMCAIJAKUIAQUEdGhpcwkAzAgCBQx1bmxvY2tBbW91bnQFA25pbAUDbmlsAAADCQAAAgUGdW5sb2NrBQZ1bmxvY2sEDndpdGhkcmF3QW1vdW50CQBkAgUMX3Rva2VuQW1vdW50BQx1bmxvY2tBbW91bnQEAnhwCQEDX3hwAAQNJHQwMjUxODAyNTI2MQkBFF9jYWxjV2l0aGRyYXdPbmVDb2luBAUCeHAFDndpdGhkcmF3QW1vdW50BQhvdXRJbmRleAgFA21zZwZjYWxsZXIEAmR5CAUNJHQwMjUxODAyNTI2MQJfMQQGZHlfZmVlCAUNJHQwMjUxODAyNTI2MQJfMgMJAQZhc3NlcnQBCQBnAgUCZHkFCW1pbkFtb3VudAkAAgECGE5vdCBlbm91Z2ggY29pbnMgcmVtb3ZlZAQOZ292ZXJuYW5jZUZlZXMJAGsDBQZkeV9mZWUFDWZlZUdvdmVybmFuY2UFCWZlZVNjYWxlNgQKZHlfYW5kX2ZlZQkAZAIFAmR5BQZkeV9mZWUKAQ9tYWtlTmV3QmFsYW5jZXMCA2FjYwx0b2tlbkJhbGFuY2UEDSR0MDI1NTE5MjU1NDUFA2FjYwQLbmV3QmFsYW5jZXMIBQ0kdDAyNTUxOTI1NTQ1Al8xBAFpCAUNJHQwMjU1MTkyNTU0NQJfMgMJAAACBQFpBQhvdXRJbmRleAkAlAoCCQDNCAIFC25ld0JhbGFuY2VzCQBlAgUMdG9rZW5CYWxhbmNlBQpkeV9hbmRfZmVlCQBkAgUBaQABCQCUCgIJAM0IAgULbmV3QmFsYW5jZXMFDHRva2VuQmFsYW5jZQkAZAIFAWkAAQQNJHQwMjU3MTcyNTc3OAoAAiRsBQJ4cAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgUDbmlsAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBD21ha2VOZXdCYWxhbmNlcwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTUJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8EC25ld0JhbGFuY2VzCAUNJHQwMjU3MTcyNTc3OAJfMQQBdggFDSR0MDI1NzE3MjU3NzgCXzIDCQESY2hlY2tEQXBwVGhyZXNob2xkAQULbmV3QmFsYW5jZXMJAQV0aHJvdwAEAnVzCQEHdW5zdGFrZQIFCmR5X2FuZF9mZWUFCHRva2VuT3V0AwkAAAIFAnVzBQJ1cwkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUDbXNnBmNhbGxlcgUCZHkJANkEAQUIdG9rZW5PdXQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkAkQMCBQhhc3NldElkcwUIb3V0SW5kZXgFDWtBc3NldEJhbGFuY2UJAGUCCQCRAwIFAnhwBQhvdXRJbmRleAUKZHlfYW5kX2ZlZQkAzAgCCQEEQnVybgIFDHNoYXJlQXNzZXRJZAUOd2l0aGRyYXdBbW91bnQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUPbW9uZXlCb3hBZGRyZXNzBQ5nb3Zlcm5hbmNlRmVlcwkA2QQBBQh0b2tlbk91dAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBRJjYXBNb25leUJveEFkZHJlc3MJAGUCBQZkeV9mZWUFDmdvdmVybmFuY2VGZWVzCQDZBAEFCHRva2VuT3V0CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRFrU2hhcmVBc3NldFN1cHBseQkAZQIFC3NoYXJlU3VwcGx5BQ53aXRoZHJhd0Ftb3VudAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuA21zZwEBQQAJAJQKAgUDbmlsCQECX0EAA21zZwEPZ2V0VmlydHVhbFByaWNlAAQBRAkBBWdldF9EAgkBA194cAAJAQJfQQAJAJQKAgUDbmlsCQBrAwUBRAUJUFJFQ0lTSU9OBQtzaGFyZVN1cHBseQNtc2cBD2NhbGNUb2tlbkFtb3VudAIHYW1vdW50cwdkZXBvc2l0BANhbXAJAQJfQQAECGJhbGFuY2VzCQEDX3hwAAQCRDAJAQdnZXRETWVtAgUIYmFsYW5jZXMFA2FtcAoBD2NhbGNOZXdCYWxhbmNlcwIDYWNjB2JhbGFuY2UEDSR0MDI2NzUzMjY3NzkFA2FjYwQLbmV3QmFsYW5jZXMIBQ0kdDAyNjc1MzI2Nzc5Al8xBAFpCAUNJHQwMjY3NTMyNjc3OQJfMgQKbmV3QmFsYW5jZQkAZAIFB2JhbGFuY2UDBQdkZXBvc2l0CQCRAwIFB2Ftb3VudHMFAWkJAQEtAQkAkQMCBQdhbW91bnRzBQFpCQCUCgIJAM0IAgULbmV3QmFsYW5jZXMFCm5ld0JhbGFuY2UJAGQCBQFpAAEEC25ld0JhbGFuY2VzCAoAAiRsBQhiYWxhbmNlcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgUDbmlsAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBD2NhbGNOZXdCYWxhbmNlcwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTUJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8CXzEEAkQxCQEHZ2V0RE1lbQIFC25ld0JhbGFuY2VzBQNhbXAEBGRpZmYDBQdkZXBvc2l0CQBlAgUCRDEFAkQwCQBlAgUCRDAFAkQxCQCUCgIFA25pbAkAawMFBGRpZmYFC3NoYXJlU3VwcGx5BQJEMANtc2cBBXJhbXBBAghfZnV0dXJlQQtfZnV0dXJlVGltZQkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUDbXNnAwkBBmFzc2VydAEJAGcCBQ5ibG9ja1RpbWVzdGFtcAkAZAIFDmluaXRpYWxfQV90aW1lBQ1NSU5fUkFNUF9USU1FCQACAQIJdG9vIG9mdGVuAwkBBmFzc2VydAEJAGcCBQtfZnV0dXJlVGltZQkAZAIFDmJsb2NrVGltZXN0YW1wBQ1NSU5fUkFNUF9USU1FCQACAQIRaW5zdWZmaWNpZW50IHRpbWUECl9pbml0aWFsX0EJAQJfQQADCQEGYXNzZXJ0AQMJAGYCBQhfZnV0dXJlQQAACQBmAgUFTUFYX0EFCF9mdXR1cmVBBwkAAgECEW91dCBvZiBiYXNlIHJhbmdlAwkBBmFzc2VydAEDAwkAZwIFCF9mdXR1cmVBBQpfaW5pdGlhbF9BCQBnAgkAaAIFCl9pbml0aWFsX0EFDE1BWF9BX0NIQU5HRQUIX2Z1dHVyZUEHBgMJAGYCBQpfaW5pdGlhbF9BBQhfZnV0dXJlQQkAZwIJAGgCBQhfZnV0dXJlQQUMTUFYX0FfQ0hBTkdFBQpfaW5pdGlhbF9BBwkAAgECDG91dCBvZiByYW5nZQkAzAgCCQEMSW50ZWdlckVudHJ5AgIJaW5pdGlhbF9BBQpfaW5pdGlhbF9BCQDMCAIJAQxJbnRlZ2VyRW50cnkCAghmdXR1cmVfQQUIX2Z1dHVyZUEJAMwIAgkBDEludGVnZXJFbnRyeQICDmluaXRpYWxfQV90aW1lBQ5ibG9ja1RpbWVzdGFtcAkAzAgCCQEMSW50ZWdlckVudHJ5AgINZnV0dXJlX0FfdGltZQULX2Z1dHVyZVRpbWUFA25pbANtc2cBCXN0b3BSYW1wQQAJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFA21zZwQIY3VycmVudEEJAQJfQQAJAMwIAgkBDEludGVnZXJFbnRyeQICCWluaXRpYWxfQQUIY3VycmVudEEJAMwIAgkBDEludGVnZXJFbnRyeQICCGZ1dHVyZV9BBQhjdXJyZW50QQkAzAgCCQEMSW50ZWdlckVudHJ5AgIOaW5pdGlhbF9BX3RpbWUFDmJsb2NrVGltZXN0YW1wCQDMCAIJAQxJbnRlZ2VyRW50cnkCAg1mdXR1cmVfQV90aW1lBQ5ibG9ja1RpbWVzdGFtcAUDbmlsA21zZwEIc2h1dGRvd24ACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQNtc2cDCQEBIQEFBmFjdGl2ZQkAAgEJAKwCAgIiREFwcCBpcyBhbHJlYWR5IHN1c3BlbmRlZC4gQ2F1c2U6IAkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBQZrQ2F1c2UCGnRoZSBjYXVzZSB3YXNuJ3Qgc3BlY2lmaWVkCQEHc3VzcGVuZAECD1BhdXNlZCBieSBhZG1pbgNtc2cBCGFjdGl2YXRlAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUDbXNnAwUGYWN0aXZlCQENdGhyb3dJc0FjdGl2ZQAJAMwIAgkBDEJvb2xlYW5FbnRyeQIFB2tBY3RpdmUGCQDMCAIJAQtEZWxldGVFbnRyeQEFBmtDYXVzZQUDbmlsA21zZwEYa2VlcExpbWl0Rm9yRmlyc3RIYXJ2ZXN0AQpzaGFyZUxpbWl0CQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQNtc2cJAMwIAgkBDEludGVnZXJFbnRyeQIFC2tTaGFyZUxpbWl0BQpzaGFyZUxpbWl0BQNuaWwBAnR4AQZ2ZXJpZnkABBNtdWx0aVNpZ25lZEJ5QWRtaW5zBBJhZG1pblB1YktleTFTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQxhZG1pblB1YktleTEAAQAABBJhZG1pblB1YktleTJTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwABBQxhZG1pblB1YktleTIAAQAABBJhZG1pblB1YktleTNTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwACBQxhZG1pblB1YktleTMAAQAACQBnAgkAZAIJAGQCBRJhZG1pblB1YktleTFTaWduZWQFEmFkbWluUHViS2V5MlNpZ25lZAUSYWRtaW5QdWJLZXkzU2lnbmVkAAIEByRtYXRjaDAFAnR4AwkAAQIFByRtYXRjaDACF0ludm9rZVNjcmlwdFRyYW5zYWN0aW9uBANpbnYFByRtYXRjaDAEE2NhbGxUYWtlSW50b0FjY291bnQDCQAAAggFA2ludgRkQXBwBQR0aGlzCQAAAggFA2ludghmdW5jdGlvbgIZdGFrZUludG9BY2NvdW50RXh0cmFGdW5kcwcEDXNpZ25lZEJ5QWRtaW4DAwMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFDGFkbWluUHViS2V5MQYJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFDGFkbWluUHViS2V5MgYJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFDGFkbWluUHViS2V5MwYJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFEWFkbWluUHViS2V5SW52b2tlAwMFE2NhbGxUYWtlSW50b0FjY291bnQFDXNpZ25lZEJ5QWRtaW4HBgUTbXVsdGlTaWduZWRCeUFkbWlucwUTbXVsdGlTaWduZWRCeUFkbWluc5NhKPc=", "height": 2210141, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: FQCe87NV6PPjKfFyBWiGQeHMgtrfce1jK6UmqengBY8j Next: none Diff:
OldNewDifferences
285285 else $Tuple2(D, false)
286286 }
287287
288- let $t066296741 = {
288+ let $t066376749 = {
289289 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
290290 let $s = size($l)
291291 let $acc0 = $Tuple2(toBigInt(S), false)
299299
300300 $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)
301301 }
302- let D = $t066296741._1
303- let finished = $t066296741._2
302+ let D = $t066376749._1
303+ let finished = $t066376749._2
304304 if ((finished == false))
305305 then throw(("get_D() not finished with " + toString(D)))
306306 else toInt(D)
326326 let D = get_D(xp_, amp)
327327 let Ann = (amp * nCoins)
328328 func S_c (acc,i) = {
329- let $t073127329 = acc
330- let S_ = $t073127329._1
331- let c = $t073127329._2
329+ let $t073207337 = acc
330+ let S_ = $t073207337._1
331+ let c = $t073207337._2
332332 let x_ = if ((in == i))
333333 then x
334334 else xp_[i]
339339 else $Tuple2(S_, c)
340340 }
341341
342- let $t075377638 = {
342+ let $t075457646 = {
343343 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
344344 let $s = size($l)
345345 let $acc0 = $Tuple2(0, toBigInt(D))
353353
354354 $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)
355355 }
356- let S_ = $t075377638._1
357- let c_ = $t075377638._2
356+ let S_ = $t075457646._1
357+ let c_ = $t075457646._2
358358 let c = fraction(c_, toBigInt(D), toBigInt((Ann * nCoins)))
359359 let bD = toBigInt(((S_ + (D / Ann)) - D))
360360 func y_proc (acc,_i) = if ((acc._2 == true))
371371 else $Tuple2(y, false)
372372 }
373373
374- let $t081208237 = {
374+ let $t081288245 = {
375375 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
376376 let $s = size($l)
377377 let $acc0 = $Tuple2(toBigInt(D), false)
385385
386386 $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)
387387 }
388- let y = $t081208237._1
389- let finished = $t081208237._2
388+ let y = $t081288245._1
389+ let finished = $t081288245._2
390390 if ((finished == false))
391391 then throw(("getY() not finished with " + toString(y)))
392392 else toInt(y)
400400 else {
401401 let Ann = (A_ * nCoins)
402402 func S_c (acc,i) = {
403- let $t086168633 = acc
404- let S_ = $t086168633._1
405- let c = $t086168633._2
403+ let $t086248641 = acc
404+ let S_ = $t086248641._1
405+ let c = $t086248641._2
406406 let x_ = if (if ((in != i))
407407 then (nCoins > i)
408408 else false)
415415 else $Tuple2(S_, c)
416416 }
417417
418- let $t088538954 = {
418+ let $t088618962 = {
419419 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
420420 let $s = size($l)
421421 let $acc0 = $Tuple2(0, toBigInt(D))
429429
430430 $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)
431431 }
432- let S_ = $t088538954._1
433- let c_ = $t088538954._2
432+ let S_ = $t088618962._1
433+ let c_ = $t088618962._2
434434 let c = fraction(c_, toBigInt(D), toBigInt((Ann * nCoins)))
435435 let bD = toBigInt(((S_ + (D / Ann)) - D))
436436 func y_D_proc (acc,i) = if ((acc._2 == true))
447447 else $Tuple2(y, false)
448448 }
449449
450- let $t094379556 = {
450+ let $t094459564 = {
451451 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
452452 let $s = size($l)
453453 let $acc0 = $Tuple2(toBigInt(D), false)
461461
462462 $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)
463463 }
464- let y = $t094379556._1
465- let finished = $t094379556._2
464+ let y = $t094459564._1
465+ let finished = $t094459564._2
466466 if ((finished == false))
467467 then throw(("get_y_D() not finished with " + toString(y)))
468468 else toInt(y)
479479 let new_y = get_y_D(amp, i, xp, D1)
480480 let dy_0 = (xp[i] - new_y)
481481 func xp_reduced_proc (acc,xp_j) = {
482- let $t01019710226 = acc
483- let xp_reduced = $t01019710226._1
484- let index = $t01019710226._2
482+ let $t01020510234 = acc
483+ let xp_reduced = $t01020510234._1
484+ let index = $t01020510234._2
485485 let dx_expected = if ((index == i))
486486 then (fraction(xp_j, D1, D0) - new_y)
487487 else (xp_j - fraction(xp_j, D1, D0))
488488 $Tuple2((xp_reduced :+ (xp_j - fraction(_fee, dx_expected, feeScale6))), (index + 1))
489489 }
490490
491- let $t01048810552 = {
491+ let $t01049610560 = {
492492 let $l = xp
493493 let $s = size($l)
494494 let $acc0 = $Tuple2(nil, 0)
502502
503503 $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)
504504 }
505- let xp_reduced = $t01048810552._1
506- let index = $t01048810552._2
505+ let xp_reduced = $t01049610560._1
506+ let index = $t01049610560._2
507507 let xp_reduced_i = xp_reduced[i]
508508 let dy = ((xp_reduced_i - get_y_D(amp, i, xp_reduced, D1)) - 1)
509509 $Tuple2(dy, (dy_0 - dy))
527527
528528 func calcStakingParams (stake,amount,assetId) = if (stake)
529529 then {
530- let $t01111611182 = calcStakingFuncAndAddres(stake, assetId)
531- let call = $t01111611182._1
532- let stakingAddr = $t01111611182._2
530+ let $t01112411190 = calcStakingFuncAndAddres(stake, assetId)
531+ let call = $t01112411190._1
532+ let stakingAddr = $t01112411190._2
533533 $Tuple4(call, stakingAddr, nil, [AttachedPayment(assetId, amount)])
534534 }
535535 else {
536- let $t01126811334 = calcStakingFuncAndAddres(stake, assetId)
537- let call = $t01126811334._1
538- let stakingAddr = $t01126811334._2
536+ let $t01127611342 = calcStakingFuncAndAddres(stake, assetId)
537+ let call = $t01127611342._1
538+ let stakingAddr = $t01127611342._2
539539 $Tuple4(call, stakingAddr, [amount, toBase58String(assetId)], nil)
540540 }
541541
542542
543543 func stake (amount,assetIdString) = if (containsElement(stakingAssets, assetIdString))
544544 then {
545- let $t01152111623 = calcStakingParams(true, amount, fromBase58String(assetIdString))
546- let call = $t01152111623._1
547- let addr = $t01152111623._2
548- let params = $t01152111623._3
549- let payments = $t01152111623._4
545+ let $t01152911631 = calcStakingParams(true, amount, fromBase58String(assetIdString))
546+ let call = $t01152911631._1
547+ let addr = $t01152911631._2
548+ let params = $t01152911631._3
549+ let payments = $t01152911631._4
550550 invoke(addr, call, params, payments)
551551 }
552552 else 0
554554
555555 func unstake (amount,assetIdString) = if (containsElement(stakingAssets, assetIdString))
556556 then {
557- let $t01180811911 = calcStakingParams(false, amount, fromBase58String(assetIdString))
558- let call = $t01180811911._1
559- let addr = $t01180811911._2
560- let params = $t01180811911._3
561- let payments = $t01180811911._4
557+ let $t01181611919 = calcStakingParams(false, amount, fromBase58String(assetIdString))
558+ let call = $t01181611919._1
559+ let addr = $t01181611919._2
560+ let params = $t01181611919._3
561+ let payments = $t01181611919._4
562562 invoke(addr, call, params, payments)
563563 }
564564 else 0
587587 func checkSuspicious () = {
588588 let contractBalances = _xp()
589589 func checkBalance (acc,assetId) = {
590- let $t01252212547 = acc
591- let suspicious = $t01252212547._1
592- let i = $t01252212547._2
590+ let $t01253012555 = acc
591+ let suspicious = $t01253012555._1
592+ let i = $t01253012555._2
593593 if (suspicious)
594594 then $Tuple2(suspicious, i)
595595 else {
746746 else {
747747 let paymentsSize = size(payments)
748748 func parsePayments (acc,assetId) = {
749- let $t01661916648 = acc
750- let newBalances = $t01661916648._1
751- let i = $t01661916648._2
752- let j = $t01661916648._3
749+ let $t01663016659 = acc
750+ let newBalances = $t01663016659._1
751+ let i = $t01663016659._2
752+ let j = $t01663016659._3
753753 if (if ((paymentsSize > j))
754754 then (getStrAssetId(payments[j].assetId) == assetId)
755755 else false)
762762 else $Tuple3((newBalances :+ xp[i]), (i + 1), j)
763763 }
764764
765- let $t01695417040 = {
765+ let $t01696517051 = {
766766 let $l = assetIds
767767 let $s = size($l)
768768 let $acc0 = $Tuple3(nil, 0, 0)
776776
777777 $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)
778778 }
779- let newBalances = $t01695417040._1
780- let k = $t01695417040._2
781- let parsedPayments = $t01695417040._3
782- if (((paymentsSize - 1) > parsedPayments))
779+ let newBalances = $t01696517051._1
780+ let k = $t01696517051._2
781+ let parsedPayments = $t01696517051._3
782+ if ((paymentsSize > parsedPayments))
783783 then throw("Incorect payments order")
784784 else if (checkDAppThreshold(newBalances))
785785 then throw()
790790 else {
791791 let feeDiscount = calculateFeeDiscount(msg.caller)
792792 func calcScriptActions (acc,newBalance) = {
793- let $t01744517486 = acc
794- let invBalances = $t01744517486._1
795- let scriptActions = $t01744517486._2
796- let i = $t01744517486._3
793+ let $t01745317494 = acc
794+ let invBalances = $t01745317494._1
795+ let scriptActions = $t01745317494._2
796+ let i = $t01745317494._3
797797 if ((shareSupply > 0))
798798 then {
799799 let _fee = ((fraction(fee, feeDiscount, feeScale6, CEILING) * nCoins) / (4 * (nCoins - 1)))
815815 else $Tuple3((invBalances :+ newBalance), (scriptActions :+ IntegerEntry((assetIds[i] + kAssetBalance), newBalance)), (i + 1))
816816 }
817817
818- let $t01882318911 = {
818+ let $t01883118919 = {
819819 let $l = newBalances
820820 let $s = size($l)
821821 let $acc0 = $Tuple3(nil, nil, 0)
829829
830830 $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)
831831 }
832- let invBalances = $t01882318911._1
833- let scriptActions = $t01882318911._2
832+ let invBalances = $t01883118919._1
833+ let scriptActions = $t01883118919._2
834834 let D2 = getDMem(invBalances, amp)
835835 let mint_amount = if ((shareSupply == 0))
836836 then D1
904904 then throw("Exchange resulted in fewer coins than expected")
905905 else {
906906 func makeNewBalances (acc,tokenBalance) = {
907- let $t02162321649 = acc
908- let newBalances = $t02162321649._1
909- let i = $t02162321649._2
907+ let $t02163321659 = acc
908+ let newBalances = $t02163321659._1
909+ let i = $t02163321659._2
910910 if ((i == fromIndex))
911911 then $Tuple2((newBalances :+ (tokenBalance + dx)), (i + 1))
912912 else if ((i == toIndex))
914914 else $Tuple2((newBalances :+ tokenBalance), (i + 1))
915915 }
916916
917- let $t02190021961 = {
917+ let $t02191621977 = {
918918 let $l = xp
919919 let $s = size($l)
920920 let $acc0 = $Tuple2(nil, 0)
928928
929929 $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)
930930 }
931- let newBalances = $t02190021961._1
932- let i = $t02190021961._2
931+ let newBalances = $t02191621977._1
932+ let i = $t02191621977._2
933933 if (checkDAppThreshold(newBalances))
934934 then throw()
935935 else {
971971 then {
972972 let withdrawAmount = (_amount + unlockAmount)
973973 func calcScriptActions (acc,balance) = {
974- let $t02334723375 = acc
975- let scriptActions = $t02334723375._1
976- let i = $t02334723375._2
974+ let $t02336323391 = acc
975+ let scriptActions = $t02336323391._1
976+ let i = $t02336323391._2
977977 let wAmount = fraction(balance, withdrawAmount, total_supply)
978978 if (assert((wAmount >= minAmounts[i])))
979979 then throw("Withdrawal resulted in fewer coins than expected")
985985 }
986986 }
987987
988- let $t02386523933 = {
988+ let $t02388123949 = {
989989 let $l = _xp()
990990 let $s = size($l)
991991 let $acc0 = $Tuple2(nil, 0)
999999
10001000 $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)
10011001 }
1002- let scriptActions = $t02386523933._1
1003- let i = $t02386523933._2
1002+ let scriptActions = $t02388123949._1
1003+ let i = $t02388123949._2
10041004 (scriptActions ++ [Burn(shareAssetId, withdrawAmount), IntegerEntry(kShareAssetSupply, (shareSupply - withdrawAmount))])
10051005 }
10061006 else throw("Strict value is not equal to itself.")
10401040 then {
10411041 let withdrawAmount = (_tokenAmount + unlockAmount)
10421042 let xp = _xp()
1043- let $t02516425245 = _calcWithdrawOneCoin(xp, withdrawAmount, outIndex, msg.caller)
1044- let dy = $t02516425245._1
1045- let dy_fee = $t02516425245._2
1043+ let $t02518025261 = _calcWithdrawOneCoin(xp, withdrawAmount, outIndex, msg.caller)
1044+ let dy = $t02518025261._1
1045+ let dy_fee = $t02518025261._2
10461046 if (assert((dy >= minAmount)))
10471047 then throw("Not enough coins removed")
10481048 else {
10491049 let governanceFees = fraction(dy_fee, feeGovernance, feeScale6)
10501050 let dy_and_fee = (dy + dy_fee)
10511051 func makeNewBalances (acc,tokenBalance) = {
1052- let $t02550325529 = acc
1053- let newBalances = $t02550325529._1
1054- let i = $t02550325529._2
1052+ let $t02551925545 = acc
1053+ let newBalances = $t02551925545._1
1054+ let i = $t02551925545._2
10551055 if ((i == outIndex))
10561056 then $Tuple2((newBalances :+ (tokenBalance - dy_and_fee)), (i + 1))
10571057 else $Tuple2((newBalances :+ tokenBalance), (i + 1))
10581058 }
10591059
1060- let $t02569625757 = {
1060+ let $t02571725778 = {
10611061 let $l = xp
10621062 let $s = size($l)
10631063 let $acc0 = $Tuple2(nil, 0)
10711071
10721072 $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)
10731073 }
1074- let newBalances = $t02569625757._1
1075- let i = $t02569625757._2
1074+ let newBalances = $t02571725778._1
1075+ let v = $t02571725778._2
10761076 if (checkDAppThreshold(newBalances))
10771077 then throw()
10781078 else {
10791079 let us = unstake(dy_and_fee, tokenOut)
10801080 if ((us == us))
1081- 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))]
1081+ then [ScriptTransfer(msg.caller, dy, fromBase58String(tokenOut)), IntegerEntry((assetIds[outIndex] + kAssetBalance), (xp[outIndex] - dy_and_fee)), Burn(shareAssetId, withdrawAmount), ScriptTransfer(moneyBoxAddress, governanceFees, fromBase58String(tokenOut)), ScriptTransfer(capMoneyBoxAddress, (dy_fee - governanceFees), fromBase58String(tokenOut)), IntegerEntry(kShareAssetSupply, (shareSupply - withdrawAmount))]
10821082 else throw("Strict value is not equal to itself.")
10831083 }
10841084 }
11091109 let balances = _xp()
11101110 let D0 = getDMem(balances, amp)
11111111 func calcNewBalances (acc,balance) = {
1112- let $t02671826744 = acc
1113- let newBalances = $t02671826744._1
1114- let i = $t02671826744._2
1112+ let $t02675326779 = acc
1113+ let newBalances = $t02675326779._1
1114+ let i = $t02675326779._2
11151115 let newBalance = (balance + (if (deposit)
11161116 then amounts[i]
11171117 else -(amounts[i])))
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let PRECISION = 1000000
55
66 let MAX_A = 1000000
77
88 let MAX_A_CHANGE = 10
99
1010 let DECIMALS = 6
1111
1212 let MIN_RAMP_TIME = (86400 / 60)
1313
1414 let kAssets = "asset_ids"
1515
1616 let kAssetBalance = "_balance"
1717
1818 let kActive = "active"
1919
2020 let kCause = "shutdown_cause"
2121
2222 let kShareAssetId = "share_asset_id"
2323
2424 let kShareAssetSupply = "share_asset_supply"
2525
2626 let kFee = "commission"
2727
2828 let kDAppThresholdCoef = "dAppThresholdCoef"
2929
3030 let kUSDNAddress = "staking_usdnnsbt_address"
3131
3232 let kDiscounts = "discounts"
3333
3434 let kDiscountValues = "discount_values"
3535
3636 let kUserSwopInGov = "_SWOP_amount"
3737
3838 let kFirstHarvest = "first_harvest"
3939
4040 let kFirstHarvestHeight = "first_harvest_height"
4141
4242 let kShareLimit = "share_limit_on_first_harvest"
4343
4444 let kBasePeriod = "base_period"
4545
4646 let kPeriodLength = "period_length"
4747
4848 let kStartHeight = "start_height"
4949
5050 let kAdminPubKey1 = "admin_pub_1"
5151
5252 let kAdminPubKey2 = "admin_pub_2"
5353
5454 let kAdminPubKey3 = "admin_pub_3"
5555
5656 let kAdminInvokePubKey = "admin_invoke_pub"
5757
5858 let kMoneyBoxAddress = "money_box_address"
5959
6060 let kGovAddress = "governance_address"
6161
6262 let kVotingAddress = "voting_address"
6363
6464 let kFarmingAddress = "farming_address"
6565
6666 let oracle = Address(base58'3NBBWfzZtZtszaXbitTKnrB2xXwv26Bn7H9')
6767
6868 func getBase58FromOracle (key) = match getString(oracle, key) {
6969 case string: String =>
7070 fromBase58String(string)
7171 case nothing =>
7272 throw((key + "is empty"))
7373 }
7474
7575
7676 let adminPubKey1 = getBase58FromOracle(kAdminPubKey1)
7777
7878 let adminPubKey2 = getBase58FromOracle(kAdminPubKey2)
7979
8080 let adminPubKey3 = getBase58FromOracle(kAdminPubKey3)
8181
8282 let adminPubKeyInvoke = getBase58FromOracle(kAdminInvokePubKey)
8383
8484 let moneyBoxAddress = Address(getBase58FromOracle(kMoneyBoxAddress))
8585
8686 let govAddress = Address(getBase58FromOracle(kGovAddress))
8787
8888 let stakingUSDNAddress = Address(getBase58FromOracle(kUSDNAddress))
8989
9090 let votingAddress = Address(getBase58FromOracle(kVotingAddress))
9191
9292 let farmingAddress = Address(getBase58FromOracle(kFarmingAddress))
9393
9494 let capMoneyBoxAddress = Address(base58'3MxXHaGvmKQHH3kNrPBunhve1sDXf7M5RZt')
9595
9696 let USDN = base58'8UrfDVd5GreeUwm7uPk7eYz1eMv376kzR52C6sANPkwS'
9797
9898 let stakingAssets = [toBase58String(USDN)]
9999
100100 let basePeriod = valueOrErrorMessage(getInteger(votingAddress, kBasePeriod), "Empty kBasePeriod")
101101
102102 let startHeight = valueOrErrorMessage(getInteger(votingAddress, kStartHeight), "Empty kStartHeight")
103103
104104 let periodLength = valueOrErrorMessage(getInteger(votingAddress, kPeriodLength), "Empty kPeriodLength")
105105
106106 let firstHarvestEndPeriod = ((basePeriod + ((height - startHeight) / periodLength)) + 3)
107107
108108 let active = getBooleanValue(this, kActive)
109109
110110 let shareAssetId = fromBase58String(getStringValue(this, kShareAssetId))
111111
112112 let shareSupply = getIntegerValue(this, kShareAssetSupply)
113113
114114 let feeScale6 = 1000000
115115
116116 let fee = getIntegerValue(this, kFee)
117117
118118 let feeGovernance = fraction(40, feeScale6, 100)
119119
120120 let initial_A = getIntegerValue(this, "initial_A")
121121
122122 let future_A = getIntegerValue(this, "future_A")
123123
124124 let initial_A_time = valueOrElse(getInteger(this, "initial_A_time"), 0)
125125
126126 let future_A_time = valueOrElse(getInteger(this, "future_A_time"), 0)
127127
128128 let assetIds = split(getStringValue(this, kAssets), ",")
129129
130130 let nCoins = size(assetIds)
131131
132132 func suspend (cause) = [BooleanEntry(kActive, false), StringEntry(kCause, cause)]
133133
134134
135135 func throwIsActive () = throw("DApp is already active")
136136
137137
138138 func isActive () = if (active)
139139 then unit
140140 else throw("DApp is inactive at this moment")
141141
142142
143143 func isAdminCall (i) = if (containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey))
144144 then unit
145145 else throw("Only admin can call this function")
146146
147147
148148 func isSelfCall (i) = if ((this == i.caller))
149149 then unit
150150 else throw("Only contract itself can call this function")
151151
152152
153153 let big2 = toBigInt(2)
154154
155155 let blockTimestamp = height
156156
157157 func assert (a) = if (a)
158158 then false
159159 else true
160160
161161
162162 func calculateFeeDiscount (userAddr) = {
163163 let swopAmount = valueOrElse(getInteger(govAddress, (toString(userAddr) + kUserSwopInGov)), 0)
164164 let discountValues = split(getStringValue(oracle, kDiscountValues), ",")
165165 let discounts = split(getStringValue(oracle, kDiscounts), ",")
166166 if (if ((swopAmount >= parseIntValue(discountValues[0])))
167167 then (parseIntValue(discountValues[1]) > swopAmount)
168168 else false)
169169 then (feeScale6 - parseIntValue(discounts[0]))
170170 else if (if ((swopAmount >= parseIntValue(discountValues[1])))
171171 then (parseIntValue(discountValues[2]) > swopAmount)
172172 else false)
173173 then (feeScale6 - parseIntValue(discounts[1]))
174174 else if (if ((swopAmount >= parseIntValue(discountValues[2])))
175175 then (parseIntValue(discountValues[3]) > swopAmount)
176176 else false)
177177 then (feeScale6 - parseIntValue(discounts[2]))
178178 else if (if ((swopAmount >= parseIntValue(discountValues[3])))
179179 then (parseIntValue(discountValues[4]) > swopAmount)
180180 else false)
181181 then (feeScale6 - parseIntValue(discounts[3]))
182182 else if ((swopAmount >= parseIntValue(discountValues[4])))
183183 then (feeScale6 - parseIntValue(discounts[4]))
184184 else feeScale6
185185 }
186186
187187
188188 func _A () = {
189189 let t1 = future_A_time
190190 let A1 = future_A
191191 if ((t1 > blockTimestamp))
192192 then {
193193 let A0 = initial_A
194194 let t0 = initial_A_time
195195 if ((A1 > A0))
196196 then (A0 + (((A1 - A0) * (blockTimestamp - t0)) / (t1 - t0)))
197197 else (A0 - (((A0 - A1) * (blockTimestamp - t0)) / (t1 - t0)))
198198 }
199199 else A1
200200 }
201201
202202
203203 func _xp () = {
204204 func assetBalances (acc,assetId) = (acc :+ valueOrElse(getInteger(this, (assetId + kAssetBalance)), 0))
205205
206206 let $l = assetIds
207207 let $s = size($l)
208208 let $acc0 = nil
209209 func $f0_1 ($a,$i) = if (($i >= $s))
210210 then $a
211211 else assetBalances($a, $l[$i])
212212
213213 func $f0_2 ($a,$i) = if (($i >= $s))
214214 then $a
215215 else throw("List size exceeds 15")
216216
217217 $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)
218218 }
219219
220220
221221 func _xp_mem (xp) = xp
222222
223223
224224 func sumList (acc,element) = (acc + element)
225225
226226
227227 func get_D (xp,amp) = {
228228 let @ = invoke(this, "D", [xp, amp], nil)
229229 if ($isInstanceOf(@, "Int"))
230230 then @
231231 else throw(($getType(invoke(this, "D", [xp, amp], nil)) + " couldn't be cast to Int"))
232232 }
233233
234234
235235 func get_D_internal (xp,amp) = {
236236 let S = {
237237 let $l = xp
238238 let $s = size($l)
239239 let $acc0 = 0
240240 func $f0_1 ($a,$i) = if (($i >= $s))
241241 then $a
242242 else sumList($a, $l[$i])
243243
244244 func $f0_2 ($a,$i) = if (($i >= $s))
245245 then $a
246246 else throw("List size exceeds 15")
247247
248248 $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)
249249 }
250250 if ((S == 0))
251251 then 0
252252 else {
253253 let Ann = (amp * nCoins)
254254 let AnnS = (toBigInt(Ann) * toBigInt(S))
255255 let Ann1 = toBigInt((Ann - 1))
256256 func Dproc (acc,i) = if ((acc._2 == true))
257257 then acc
258258 else {
259259 let Dprev = acc._1
260260 func D_PProc (D_P,i) = if ((nCoins > i))
261261 then ((D_P * Dprev) / (toBigInt(xp[i]) * toBigInt(nCoins)))
262262 else D_P
263263
264264 let D_P = {
265265 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
266266 let $s = size($l)
267267 let $acc0 = Dprev
268268 func $f1_1 ($a,$i) = if (($i >= $s))
269269 then $a
270270 else D_PProc($a, $l[$i])
271271
272272 func $f1_2 ($a,$i) = if (($i >= $s))
273273 then $a
274274 else throw("List size exceeds 15")
275275
276276 $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)
277277 }
278278 let D = fraction((AnnS + (toBigInt(nCoins) * D_P)), Dprev, ((Ann1 * Dprev) + (toBigInt((nCoins + 1)) * D_P)))
279279 if ((D > Dprev))
280280 then if ((1 >= toInt((D - Dprev))))
281281 then $Tuple2(D, true)
282282 else $Tuple2(D, false)
283283 else if ((1 >= toInt((Dprev - D))))
284284 then $Tuple2(D, true)
285285 else $Tuple2(D, false)
286286 }
287287
288- let $t066296741 = {
288+ let $t066376749 = {
289289 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
290290 let $s = size($l)
291291 let $acc0 = $Tuple2(toBigInt(S), false)
292292 func $f1_1 ($a,$i) = if (($i >= $s))
293293 then $a
294294 else Dproc($a, $l[$i])
295295
296296 func $f1_2 ($a,$i) = if (($i >= $s))
297297 then $a
298298 else throw("List size exceeds 15")
299299
300300 $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)
301301 }
302- let D = $t066296741._1
303- let finished = $t066296741._2
302+ let D = $t066376749._1
303+ let finished = $t066376749._2
304304 if ((finished == false))
305305 then throw(("get_D() not finished with " + toString(D)))
306306 else toInt(D)
307307 }
308308 }
309309
310310
311311 func getDMem (xp,amp) = get_D(_xp_mem(xp), amp)
312312
313313
314314 func getY (in,out,x,xp_) = if (assert((in != out)))
315315 then throw("same coin")
316316 else if (assert(if ((out >= 0))
317317 then (in >= 0)
318318 else false))
319319 then throw("below zero")
320320 else if (assert(if ((nCoins > out))
321321 then (nCoins > in)
322322 else false))
323323 then throw("above N_COINS")
324324 else {
325325 let amp = _A()
326326 let D = get_D(xp_, amp)
327327 let Ann = (amp * nCoins)
328328 func S_c (acc,i) = {
329- let $t073127329 = acc
330- let S_ = $t073127329._1
331- let c = $t073127329._2
329+ let $t073207337 = acc
330+ let S_ = $t073207337._1
331+ let c = $t073207337._2
332332 let x_ = if ((in == i))
333333 then x
334334 else xp_[i]
335335 if (if ((i != out))
336336 then (nCoins > i)
337337 else false)
338338 then $Tuple2((S_ + x_), fraction(c, toBigInt(D), toBigInt((x_ * nCoins))))
339339 else $Tuple2(S_, c)
340340 }
341341
342- let $t075377638 = {
342+ let $t075457646 = {
343343 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
344344 let $s = size($l)
345345 let $acc0 = $Tuple2(0, toBigInt(D))
346346 func $f0_1 ($a,$i) = if (($i >= $s))
347347 then $a
348348 else S_c($a, $l[$i])
349349
350350 func $f0_2 ($a,$i) = if (($i >= $s))
351351 then $a
352352 else throw("List size exceeds 15")
353353
354354 $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)
355355 }
356- let S_ = $t075377638._1
357- let c_ = $t075377638._2
356+ let S_ = $t075457646._1
357+ let c_ = $t075457646._2
358358 let c = fraction(c_, toBigInt(D), toBigInt((Ann * nCoins)))
359359 let bD = toBigInt(((S_ + (D / Ann)) - D))
360360 func y_proc (acc,_i) = if ((acc._2 == true))
361361 then acc
362362 else {
363363 let y_prev = acc._1
364364 let y = (((y_prev * y_prev) + c) / ((big2 * y_prev) + bD))
365365 if ((y > y_prev))
366366 then if ((1 >= toInt((y - y_prev))))
367367 then $Tuple2(y, true)
368368 else $Tuple2(y, false)
369369 else if ((1 >= toInt((y_prev - y))))
370370 then $Tuple2(y, true)
371371 else $Tuple2(y, false)
372372 }
373373
374- let $t081208237 = {
374+ let $t081288245 = {
375375 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
376376 let $s = size($l)
377377 let $acc0 = $Tuple2(toBigInt(D), false)
378378 func $f1_1 ($a,$i) = if (($i >= $s))
379379 then $a
380380 else y_proc($a, $l[$i])
381381
382382 func $f1_2 ($a,$i) = if (($i >= $s))
383383 then $a
384384 else throw("List size exceeds 16")
385385
386386 $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)
387387 }
388- let y = $t081208237._1
389- let finished = $t081208237._2
388+ let y = $t081288245._1
389+ let finished = $t081288245._2
390390 if ((finished == false))
391391 then throw(("getY() not finished with " + toString(y)))
392392 else toInt(y)
393393 }
394394
395395
396396 func get_y_D (A_,in,xp,D) = if (assert((in >= 0)))
397397 then throw("i below zero")
398398 else if (assert((nCoins > in)))
399399 then throw("i above N_COINS")
400400 else {
401401 let Ann = (A_ * nCoins)
402402 func S_c (acc,i) = {
403- let $t086168633 = acc
404- let S_ = $t086168633._1
405- let c = $t086168633._2
403+ let $t086248641 = acc
404+ let S_ = $t086248641._1
405+ let c = $t086248641._2
406406 let x_ = if (if ((in != i))
407407 then (nCoins > i)
408408 else false)
409409 then xp[i]
410410 else 0
411411 if (if ((nCoins > i))
412412 then (in != i)
413413 else false)
414414 then $Tuple2((S_ + x_), fraction(c, toBigInt(D), toBigInt((x_ * nCoins))))
415415 else $Tuple2(S_, c)
416416 }
417417
418- let $t088538954 = {
418+ let $t088618962 = {
419419 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
420420 let $s = size($l)
421421 let $acc0 = $Tuple2(0, toBigInt(D))
422422 func $f0_1 ($a,$i) = if (($i >= $s))
423423 then $a
424424 else S_c($a, $l[$i])
425425
426426 func $f0_2 ($a,$i) = if (($i >= $s))
427427 then $a
428428 else throw("List size exceeds 15")
429429
430430 $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)
431431 }
432- let S_ = $t088538954._1
433- let c_ = $t088538954._2
432+ let S_ = $t088618962._1
433+ let c_ = $t088618962._2
434434 let c = fraction(c_, toBigInt(D), toBigInt((Ann * nCoins)))
435435 let bD = toBigInt(((S_ + (D / Ann)) - D))
436436 func y_D_proc (acc,i) = if ((acc._2 == true))
437437 then acc
438438 else {
439439 let y_prev = acc._1
440440 let y = (((y_prev * y_prev) + c) / ((big2 * y_prev) + bD))
441441 if ((y > y_prev))
442442 then if ((1 >= toInt((y - y_prev))))
443443 then $Tuple2(y, true)
444444 else $Tuple2(y, false)
445445 else if ((1 >= toInt((y_prev - y))))
446446 then $Tuple2(y, true)
447447 else $Tuple2(y, false)
448448 }
449449
450- let $t094379556 = {
450+ let $t094459564 = {
451451 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
452452 let $s = size($l)
453453 let $acc0 = $Tuple2(toBigInt(D), false)
454454 func $f1_1 ($a,$i) = if (($i >= $s))
455455 then $a
456456 else y_D_proc($a, $l[$i])
457457
458458 func $f1_2 ($a,$i) = if (($i >= $s))
459459 then $a
460460 else throw("List size exceeds 16")
461461
462462 $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)
463463 }
464- let y = $t094379556._1
465- let finished = $t094379556._2
464+ let y = $t094459564._1
465+ let finished = $t094459564._2
466466 if ((finished == false))
467467 then throw(("get_y_D() not finished with " + toString(y)))
468468 else toInt(y)
469469 }
470470
471471
472472 func _calcWithdrawOneCoin (xp,_token_amount,i,caller) = {
473473 let feeDiscount = calculateFeeDiscount(caller)
474474 let amp = _A()
475475 let _fee = ((fraction(fee, feeDiscount, feeScale6, CEILING) * nCoins) / (4 * (nCoins - 1)))
476476 let total_supply = shareSupply
477477 let D0 = get_D(xp, amp)
478478 let D1 = (D0 - fraction(_token_amount, D0, total_supply))
479479 let new_y = get_y_D(amp, i, xp, D1)
480480 let dy_0 = (xp[i] - new_y)
481481 func xp_reduced_proc (acc,xp_j) = {
482- let $t01019710226 = acc
483- let xp_reduced = $t01019710226._1
484- let index = $t01019710226._2
482+ let $t01020510234 = acc
483+ let xp_reduced = $t01020510234._1
484+ let index = $t01020510234._2
485485 let dx_expected = if ((index == i))
486486 then (fraction(xp_j, D1, D0) - new_y)
487487 else (xp_j - fraction(xp_j, D1, D0))
488488 $Tuple2((xp_reduced :+ (xp_j - fraction(_fee, dx_expected, feeScale6))), (index + 1))
489489 }
490490
491- let $t01048810552 = {
491+ let $t01049610560 = {
492492 let $l = xp
493493 let $s = size($l)
494494 let $acc0 = $Tuple2(nil, 0)
495495 func $f0_1 ($a,$i) = if (($i >= $s))
496496 then $a
497497 else xp_reduced_proc($a, $l[$i])
498498
499499 func $f0_2 ($a,$i) = if (($i >= $s))
500500 then $a
501501 else throw("List size exceeds 15")
502502
503503 $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)
504504 }
505- let xp_reduced = $t01048810552._1
506- let index = $t01048810552._2
505+ let xp_reduced = $t01049610560._1
506+ let index = $t01049610560._2
507507 let xp_reduced_i = xp_reduced[i]
508508 let dy = ((xp_reduced_i - get_y_D(amp, i, xp_reduced, D1)) - 1)
509509 $Tuple2(dy, (dy_0 - dy))
510510 }
511511
512512
513513 func getStrAssetId (assetId) = match assetId {
514514 case id: ByteVector =>
515515 toBase58String(id)
516516 case waves: Unit =>
517517 "WAVES"
518518 case _ =>
519519 throw("Match error")
520520 }
521521
522522
523523 func calcStakingFuncAndAddres (stake,assetId) = if (stake)
524524 then $Tuple2("lockNeutrino", stakingUSDNAddress)
525525 else $Tuple2("unlockNeutrino", stakingUSDNAddress)
526526
527527
528528 func calcStakingParams (stake,amount,assetId) = if (stake)
529529 then {
530- let $t01111611182 = calcStakingFuncAndAddres(stake, assetId)
531- let call = $t01111611182._1
532- let stakingAddr = $t01111611182._2
530+ let $t01112411190 = calcStakingFuncAndAddres(stake, assetId)
531+ let call = $t01112411190._1
532+ let stakingAddr = $t01112411190._2
533533 $Tuple4(call, stakingAddr, nil, [AttachedPayment(assetId, amount)])
534534 }
535535 else {
536- let $t01126811334 = calcStakingFuncAndAddres(stake, assetId)
537- let call = $t01126811334._1
538- let stakingAddr = $t01126811334._2
536+ let $t01127611342 = calcStakingFuncAndAddres(stake, assetId)
537+ let call = $t01127611342._1
538+ let stakingAddr = $t01127611342._2
539539 $Tuple4(call, stakingAddr, [amount, toBase58String(assetId)], nil)
540540 }
541541
542542
543543 func stake (amount,assetIdString) = if (containsElement(stakingAssets, assetIdString))
544544 then {
545- let $t01152111623 = calcStakingParams(true, amount, fromBase58String(assetIdString))
546- let call = $t01152111623._1
547- let addr = $t01152111623._2
548- let params = $t01152111623._3
549- let payments = $t01152111623._4
545+ let $t01152911631 = calcStakingParams(true, amount, fromBase58String(assetIdString))
546+ let call = $t01152911631._1
547+ let addr = $t01152911631._2
548+ let params = $t01152911631._3
549+ let payments = $t01152911631._4
550550 invoke(addr, call, params, payments)
551551 }
552552 else 0
553553
554554
555555 func unstake (amount,assetIdString) = if (containsElement(stakingAssets, assetIdString))
556556 then {
557- let $t01180811911 = calcStakingParams(false, amount, fromBase58String(assetIdString))
558- let call = $t01180811911._1
559- let addr = $t01180811911._2
560- let params = $t01180811911._3
561- let payments = $t01180811911._4
557+ let $t01181611919 = calcStakingParams(false, amount, fromBase58String(assetIdString))
558+ let call = $t01181611919._1
559+ let addr = $t01181611919._2
560+ let params = $t01181611919._3
561+ let payments = $t01181611919._4
562562 invoke(addr, call, params, payments)
563563 }
564564 else 0
565565
566566
567567 func stakedAmount (assetId) = {
568568 let stakedAmountCalculated = match assetId {
569569 case aId: ByteVector =>
570570 if ((aId == USDN))
571571 then getInteger(stakingUSDNAddress, ((("rpd_balance_" + toBase58String(aId)) + "_") + toString(this)))
572572 else 0
573573 case _: Unit =>
574574 0
575575 case _ =>
576576 throw("Match error")
577577 }
578578 match stakedAmountCalculated {
579579 case i: Int =>
580580 i
581581 case _ =>
582582 0
583583 }
584584 }
585585
586586
587587 func checkSuspicious () = {
588588 let contractBalances = _xp()
589589 func checkBalance (acc,assetId) = {
590- let $t01252212547 = acc
591- let suspicious = $t01252212547._1
592- let i = $t01252212547._2
590+ let $t01253012555 = acc
591+ let suspicious = $t01253012555._1
592+ let i = $t01253012555._2
593593 if (suspicious)
594594 then $Tuple2(suspicious, i)
595595 else {
596596 let aBalance = (assetBalance(this, fromBase58String(assetId)) + stakedAmount(fromBase58String(assetId)))
597597 if ((contractBalances[i] > aBalance))
598598 then $Tuple2(true, i)
599599 else $Tuple2(false, (i + 1))
600600 }
601601 }
602602
603603 let $l = assetIds
604604 let $s = size($l)
605605 let $acc0 = $Tuple2(false, 0)
606606 func $f0_1 ($a,$i) = if (($i >= $s))
607607 then $a
608608 else checkBalance($a, $l[$i])
609609
610610 func $f0_2 ($a,$i) = if (($i >= $s))
611611 then $a
612612 else throw("List size exceeds 15")
613613
614614 $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)
615615 }
616616
617617
618618 func suspendSuspicious (i) = suspend(("Suspicious state with asset: " + assetIds[i]))
619619
620620
621621 func returnPayments (caller,payments) = {
622622 func parsePayments (acc,payment) = (acc :+ ScriptTransfer(caller, payment.amount, payment.assetId))
623623
624624 let $l = payments
625625 let $s = size($l)
626626 let $acc0 = nil
627627 func $f0_1 ($a,$i) = if (($i >= $s))
628628 then $a
629629 else parsePayments($a, $l[$i])
630630
631631 func $f0_2 ($a,$i) = if (($i >= $s))
632632 then $a
633633 else throw("List size exceeds 15")
634634
635635 $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)
636636 }
637637
638638
639639 func checkDAppThreshold (newBalances) = {
640640 let dAppThresholdCoef = valueOrErrorMessage(getInteger(this, kDAppThresholdCoef), "No dAppThresholdCoef key")
641641 let thresholdScale = 10000
642642 let maxBalance = max(newBalances)
643643 let minBalance = min(newBalances)
644644 let ratio = fraction(maxBalance, thresholdScale, minBalance)
645645 if ((ratio > (dAppThresholdCoef * thresholdScale)))
646646 then throw("New balance in assets of the DApp is less than threshold")
647647 else false
648648 }
649649
650650
651651 func checkCoins (assetIds) = {
652652 let coins = split(assetIds, ",")
653653 func checkCoin (error,assetId) = {
654654 let asset = valueOrErrorMessage(fromBase58String(assetId), ("fromBase58String: " + assetId))
655655 let decimals = valueOrErrorMessage(assetInfo(asset), ("assetInfo: " + assetId)).decimals
656656 if ((decimals != DECIMALS))
657657 then throw("wrong decimals")
658658 else false
659659 }
660660
661661 let $l = coins
662662 let $s = size($l)
663663 let $acc0 = false
664664 func $f0_1 ($a,$i) = if (($i >= $s))
665665 then $a
666666 else checkCoin($a, $l[$i])
667667
668668 func $f0_2 ($a,$i) = if (($i >= $s))
669669 then $a
670670 else throw("List size exceeds 15")
671671
672672 $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)
673673 }
674674
675675
676676 @Callable(msg)
677677 func D (xp,amp) = {
678678 let D = get_D_internal(xp, amp)
679679 $Tuple2([IntegerEntry("D", D)], D)
680680 }
681681
682682
683683
684684 @Callable(msg)
685685 func init (assetIds,_A,firstHarvest) = if (!(isDataStorageUntouched(this)))
686686 then throw("Already initialized")
687687 else {
688688 let shareName = "s_Multi_USD"
689689 let shareDescription = ("ShareToken of SwopFi protocol for MultiStable USD pool at address " + toString(this))
690690 let issueToken = Issue(shareName, shareDescription, 0, 6, true)
691691 let tokenId = calculateAssetId(issueToken)
692692 if (checkCoins(assetIds))
693693 then throw()
694694 else {
695695 let baseEntry = [StringEntry(kAssets, assetIds), 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]
696696 if (firstHarvest)
697697 then (baseEntry ++ [BooleanEntry(kFirstHarvest, firstHarvest), IntegerEntry(kFirstHarvestHeight, (startHeight + (firstHarvestEndPeriod * periodLength)))])
698698 else baseEntry
699699 }
700700 }
701701
702702
703703
704704 @Callable(msg)
705705 func addLiquidity (minMintAmount,stakeFarming) = valueOrElse(isActive(), {
706706 let amp = _A()
707707 let xp = _xp()
708708 let D0 = if ((shareSupply == 0))
709709 then 0
710710 else getDMem(xp, amp)
711711 let payments = msg.payments
712712 let n = size(payments)
713713 func validPayments (n) = if ((n > nCoins))
714714 then throw(("payments size > " + toString(nCoins)))
715715 else if ((1 > n))
716716 then throw("payments size < 1")
717717 else if (if ((shareSupply == 0))
718718 then (nCoins != n)
719719 else false)
720720 then throw("initial deposit requires all coins")
721721 else {
722722 func paymantValid (acc,payment) = if (containsElement(assetIds, getStrAssetId(payment.assetId)))
723723 then true
724724 else throw("Invalid asset in payment")
725725
726726 let $l = payments
727727 let $s = size($l)
728728 let $acc0 = false
729729 func $f0_1 ($a,$i) = if (($i >= $s))
730730 then $a
731731 else paymantValid($a, $l[$i])
732732
733733 func $f0_2 ($a,$i) = if (($i >= $s))
734734 then $a
735735 else throw("List size exceeds 15")
736736
737737 $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)
738738 }
739739
740740 if (!(validPayments(n)))
741741 then throw()
742742 else {
743743 let suspicious = checkSuspicious()
744744 if (suspicious._1)
745745 then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.caller, payments))
746746 else {
747747 let paymentsSize = size(payments)
748748 func parsePayments (acc,assetId) = {
749- let $t01661916648 = acc
750- let newBalances = $t01661916648._1
751- let i = $t01661916648._2
752- let j = $t01661916648._3
749+ let $t01663016659 = acc
750+ let newBalances = $t01663016659._1
751+ let i = $t01663016659._2
752+ let j = $t01663016659._3
753753 if (if ((paymentsSize > j))
754754 then (getStrAssetId(payments[j].assetId) == assetId)
755755 else false)
756756 then {
757757 let s = stake(payments[j].amount, getStrAssetId(payments[j].assetId))
758758 if ((s == s))
759759 then $Tuple3((newBalances :+ (xp[i] + payments[j].amount)), (i + 1), (j + 1))
760760 else throw("Strict value is not equal to itself.")
761761 }
762762 else $Tuple3((newBalances :+ xp[i]), (i + 1), j)
763763 }
764764
765- let $t01695417040 = {
765+ let $t01696517051 = {
766766 let $l = assetIds
767767 let $s = size($l)
768768 let $acc0 = $Tuple3(nil, 0, 0)
769769 func $f0_1 ($a,$i) = if (($i >= $s))
770770 then $a
771771 else parsePayments($a, $l[$i])
772772
773773 func $f0_2 ($a,$i) = if (($i >= $s))
774774 then $a
775775 else throw("List size exceeds 15")
776776
777777 $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)
778778 }
779- let newBalances = $t01695417040._1
780- let k = $t01695417040._2
781- let parsedPayments = $t01695417040._3
782- if (((paymentsSize - 1) > parsedPayments))
779+ let newBalances = $t01696517051._1
780+ let k = $t01696517051._2
781+ let parsedPayments = $t01696517051._3
782+ if ((paymentsSize > parsedPayments))
783783 then throw("Incorect payments order")
784784 else if (checkDAppThreshold(newBalances))
785785 then throw()
786786 else {
787787 let D1 = getDMem(newBalances, amp)
788788 if (assert((D1 > D0)))
789789 then throw("D1 > D0")
790790 else {
791791 let feeDiscount = calculateFeeDiscount(msg.caller)
792792 func calcScriptActions (acc,newBalance) = {
793- let $t01744517486 = acc
794- let invBalances = $t01744517486._1
795- let scriptActions = $t01744517486._2
796- let i = $t01744517486._3
793+ let $t01745317494 = acc
794+ let invBalances = $t01745317494._1
795+ let scriptActions = $t01745317494._2
796+ let i = $t01745317494._3
797797 if ((shareSupply > 0))
798798 then {
799799 let _fee = ((fraction(fee, feeDiscount, feeScale6, CEILING) * nCoins) / (4 * (nCoins - 1)))
800800 let fees = {
801801 let idealBalance = fraction(D1, xp[i], D0)
802802 let difference = if ((idealBalance > newBalance))
803803 then (idealBalance - newBalance)
804804 else (newBalance - idealBalance)
805805 fraction(_fee, difference, feeScale6)
806806 }
807807 let governanceFees = fraction(fees, feeGovernance, feeScale6)
808808 let finalBalance = (newBalance - governanceFees)
809809 let invariantBalance = (newBalance - fees)
810810 let us = unstake(fees, assetIds[i])
811811 if ((us == us))
812812 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))
813813 else throw("Strict value is not equal to itself.")
814814 }
815815 else $Tuple3((invBalances :+ newBalance), (scriptActions :+ IntegerEntry((assetIds[i] + kAssetBalance), newBalance)), (i + 1))
816816 }
817817
818- let $t01882318911 = {
818+ let $t01883118919 = {
819819 let $l = newBalances
820820 let $s = size($l)
821821 let $acc0 = $Tuple3(nil, nil, 0)
822822 func $f1_1 ($a,$i) = if (($i >= $s))
823823 then $a
824824 else calcScriptActions($a, $l[$i])
825825
826826 func $f1_2 ($a,$i) = if (($i >= $s))
827827 then $a
828828 else throw("List size exceeds 15")
829829
830830 $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)
831831 }
832- let invBalances = $t01882318911._1
833- let scriptActions = $t01882318911._2
832+ let invBalances = $t01883118919._1
833+ let scriptActions = $t01883118919._2
834834 let D2 = getDMem(invBalances, amp)
835835 let mint_amount = if ((shareSupply == 0))
836836 then D1
837837 else fraction(shareSupply, (D2 - D0), D0)
838838 if (assert((mint_amount >= minMintAmount)))
839839 then throw("Slippage screwed you")
840840 else if (stakeFarming)
841841 then {
842842 let re = invoke(this, "reissueShare", [mint_amount], nil)
843843 if ((re == re))
844844 then {
845845 let s = invoke(farmingAddress, "lockShareTokens", [toString(this)], [AttachedPayment(shareAssetId, mint_amount)])
846846 if ((s == s))
847847 then (scriptActions :+ IntegerEntry(kShareAssetSupply, (shareSupply + mint_amount)))
848848 else throw("Strict value is not equal to itself.")
849849 }
850850 else throw("Strict value is not equal to itself.")
851851 }
852852 else (scriptActions ++ [Reissue(shareAssetId, mint_amount, true), ScriptTransfer(msg.caller, mint_amount, shareAssetId), IntegerEntry(kShareAssetSupply, (shareSupply + mint_amount))])
853853 }
854854 }
855855 }
856856 }
857857 })
858858
859859
860860
861861 @Callable(msg)
862862 func reissueShare (amount) = valueOrElse(isSelfCall(msg), [Reissue(shareAssetId, amount, true)])
863863
864864
865865
866866 @Callable(msg)
867867 func getDy (assetFrom,assetTo,dx,userAddress) = {
868868 let xp = _xp()
869869 let fromIndex = valueOrErrorMessage(indexOf(assetIds, assetFrom), "unknown token in")
870870 let toIndex = valueOrErrorMessage(indexOf(assetIds, assetTo), "unknown token out")
871871 let x = (xp[fromIndex] + dx)
872872 let y = getY(fromIndex, toIndex, x, xp)
873873 let dy = ((xp[toIndex] - y) - 1)
874874 let feeDiscount = calculateFeeDiscount(Address(fromBase58String(userAddress)))
875875 let _fee = fraction(fraction(fee, feeDiscount, feeScale6, CEILING), dy, feeScale6)
876876 $Tuple2(nil, $Tuple2((dy - _fee), _fee))
877877 }
878878
879879
880880
881881 @Callable(msg)
882882 func exchange (tokenOut,min_dy) = valueOrElse(isActive(), if ((size(msg.payments) != 1))
883883 then throw("size(payments) != 1")
884884 else {
885885 let suspicious = checkSuspicious()
886886 if (suspicious._1)
887887 then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.caller, msg.payments))
888888 else {
889889 let payment = msg.payments[0]
890890 let tokenIn = getStrAssetId(payment.assetId)
891891 let tokenOutB58 = fromBase58String(tokenOut)
892892 let dx = payment.amount
893893 let fromIndex = valueOrErrorMessage(indexOf(assetIds, tokenIn), "unknown token in")
894894 let toIndex = valueOrErrorMessage(indexOf(assetIds, tokenOut), "unknown token out")
895895 let xp = _xp()
896896 let x = (xp[fromIndex] + dx)
897897 let y = getY(fromIndex, toIndex, x, xp)
898898 let _dy = ((xp[toIndex] - y) - 1)
899899 let feeDiscount = calculateFeeDiscount(msg.caller)
900900 let _fee = fraction(_dy, fraction(fee, feeDiscount, feeScale6, CEILING), feeScale6)
901901 let dy = (_dy - _fee)
902902 let governanceFees = fraction(_fee, feeGovernance, feeScale6)
903903 if (assert((dy >= min_dy)))
904904 then throw("Exchange resulted in fewer coins than expected")
905905 else {
906906 func makeNewBalances (acc,tokenBalance) = {
907- let $t02162321649 = acc
908- let newBalances = $t02162321649._1
909- let i = $t02162321649._2
907+ let $t02163321659 = acc
908+ let newBalances = $t02163321659._1
909+ let i = $t02163321659._2
910910 if ((i == fromIndex))
911911 then $Tuple2((newBalances :+ (tokenBalance + dx)), (i + 1))
912912 else if ((i == toIndex))
913913 then $Tuple2((newBalances :+ (tokenBalance - _dy)), (i + 1))
914914 else $Tuple2((newBalances :+ tokenBalance), (i + 1))
915915 }
916916
917- let $t02190021961 = {
917+ let $t02191621977 = {
918918 let $l = xp
919919 let $s = size($l)
920920 let $acc0 = $Tuple2(nil, 0)
921921 func $f0_1 ($a,$i) = if (($i >= $s))
922922 then $a
923923 else makeNewBalances($a, $l[$i])
924924
925925 func $f0_2 ($a,$i) = if (($i >= $s))
926926 then $a
927927 else throw("List size exceeds 15")
928928
929929 $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)
930930 }
931- let newBalances = $t02190021961._1
932- let i = $t02190021961._2
931+ let newBalances = $t02191621977._1
932+ let i = $t02191621977._2
933933 if (checkDAppThreshold(newBalances))
934934 then throw()
935935 else {
936936 let s = stake(payment.amount, getStrAssetId(payment.assetId))
937937 if ((s == s))
938938 then {
939939 let us = unstake(_dy, tokenOut)
940940 if ((us == us))
941941 then $Tuple2([IntegerEntry((tokenIn + kAssetBalance), x), IntegerEntry((tokenOut + kAssetBalance), (xp[toIndex] - _dy)), ScriptTransfer(msg.caller, dy, tokenOutB58), ScriptTransfer(moneyBoxAddress, governanceFees, tokenOutB58), ScriptTransfer(capMoneyBoxAddress, (_fee - governanceFees), tokenOutB58)], $Tuple2(dy, tokenOutB58))
942942 else throw("Strict value is not equal to itself.")
943943 }
944944 else throw("Strict value is not equal to itself.")
945945 }
946946 }
947947 }
948948 })
949949
950950
951951
952952 @Callable(msg)
953953 func withdraw (minAmounts,unlockAmount) = valueOrElse(isActive(), if ((size(msg.payments) != 1))
954954 then throw("size(payments) != 1")
955955 else {
956956 let suspicious = checkSuspicious()
957957 if (suspicious._1)
958958 then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.caller, msg.payments))
959959 else {
960960 let payment = msg.payments[0]
961961 let tokenIn = payment.assetId
962962 if ((tokenIn != shareAssetId))
963963 then throw("unknown token")
964964 else {
965965 let _amount = payment.amount
966966 let total_supply = shareSupply
967967 let unlock = if ((unlockAmount > 0))
968968 then invoke(farmingAddress, "withdrawShareTokens", [toString(this), unlockAmount], nil)
969969 else 0
970970 if ((unlock == unlock))
971971 then {
972972 let withdrawAmount = (_amount + unlockAmount)
973973 func calcScriptActions (acc,balance) = {
974- let $t02334723375 = acc
975- let scriptActions = $t02334723375._1
976- let i = $t02334723375._2
974+ let $t02336323391 = acc
975+ let scriptActions = $t02336323391._1
976+ let i = $t02336323391._2
977977 let wAmount = fraction(balance, withdrawAmount, total_supply)
978978 if (assert((wAmount >= minAmounts[i])))
979979 then throw("Withdrawal resulted in fewer coins than expected")
980980 else {
981981 let us = unstake(wAmount, assetIds[i])
982982 if ((us == us))
983983 then $Tuple2((scriptActions ++ [IntegerEntry((assetIds[i] + kAssetBalance), (balance - wAmount)), ScriptTransfer(msg.caller, wAmount, fromBase58String(assetIds[i]))]), (i + 1))
984984 else throw("Strict value is not equal to itself.")
985985 }
986986 }
987987
988- let $t02386523933 = {
988+ let $t02388123949 = {
989989 let $l = _xp()
990990 let $s = size($l)
991991 let $acc0 = $Tuple2(nil, 0)
992992 func $f0_1 ($a,$i) = if (($i >= $s))
993993 then $a
994994 else calcScriptActions($a, $l[$i])
995995
996996 func $f0_2 ($a,$i) = if (($i >= $s))
997997 then $a
998998 else throw("List size exceeds 15")
999999
10001000 $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)
10011001 }
1002- let scriptActions = $t02386523933._1
1003- let i = $t02386523933._2
1002+ let scriptActions = $t02388123949._1
1003+ let i = $t02388123949._2
10041004 (scriptActions ++ [Burn(shareAssetId, withdrawAmount), IntegerEntry(kShareAssetSupply, (shareSupply - withdrawAmount))])
10051005 }
10061006 else throw("Strict value is not equal to itself.")
10071007 }
10081008 }
10091009 })
10101010
10111011
10121012
10131013 @Callable(msg)
10141014 func calcWithdrawOneCoin (tokenAmount,tokenOut,user) = {
10151015 let i = valueOrErrorMessage(indexOf(assetIds, tokenOut), "unknown token out")
10161016 $Tuple2(nil, _calcWithdrawOneCoin(_xp(), tokenAmount, i, Address(fromBase58String(user)))._1)
10171017 }
10181018
10191019
10201020
10211021 @Callable(msg)
10221022 func withdrawOneCoin (tokenOut,minAmount,unlockAmount) = valueOrElse(isActive(), if ((size(msg.payments) != 1))
10231023 then throw("size(payments) != 1")
10241024 else {
10251025 let suspicious = checkSuspicious()
10261026 if (suspicious._1)
10271027 then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.caller, msg.payments))
10281028 else {
10291029 let payment = msg.payments[0]
10301030 let tokenIn = payment.assetId
10311031 if ((tokenIn != shareAssetId))
10321032 then throw("unknown token")
10331033 else {
10341034 let outIndex = valueOrErrorMessage(indexOf(assetIds, tokenOut), "unknown token out")
10351035 let _tokenAmount = payment.amount
10361036 let unlock = if ((unlockAmount > 0))
10371037 then invoke(farmingAddress, "withdrawShareTokens", [toString(this), unlockAmount], nil)
10381038 else 0
10391039 if ((unlock == unlock))
10401040 then {
10411041 let withdrawAmount = (_tokenAmount + unlockAmount)
10421042 let xp = _xp()
1043- let $t02516425245 = _calcWithdrawOneCoin(xp, withdrawAmount, outIndex, msg.caller)
1044- let dy = $t02516425245._1
1045- let dy_fee = $t02516425245._2
1043+ let $t02518025261 = _calcWithdrawOneCoin(xp, withdrawAmount, outIndex, msg.caller)
1044+ let dy = $t02518025261._1
1045+ let dy_fee = $t02518025261._2
10461046 if (assert((dy >= minAmount)))
10471047 then throw("Not enough coins removed")
10481048 else {
10491049 let governanceFees = fraction(dy_fee, feeGovernance, feeScale6)
10501050 let dy_and_fee = (dy + dy_fee)
10511051 func makeNewBalances (acc,tokenBalance) = {
1052- let $t02550325529 = acc
1053- let newBalances = $t02550325529._1
1054- let i = $t02550325529._2
1052+ let $t02551925545 = acc
1053+ let newBalances = $t02551925545._1
1054+ let i = $t02551925545._2
10551055 if ((i == outIndex))
10561056 then $Tuple2((newBalances :+ (tokenBalance - dy_and_fee)), (i + 1))
10571057 else $Tuple2((newBalances :+ tokenBalance), (i + 1))
10581058 }
10591059
1060- let $t02569625757 = {
1060+ let $t02571725778 = {
10611061 let $l = xp
10621062 let $s = size($l)
10631063 let $acc0 = $Tuple2(nil, 0)
10641064 func $f0_1 ($a,$i) = if (($i >= $s))
10651065 then $a
10661066 else makeNewBalances($a, $l[$i])
10671067
10681068 func $f0_2 ($a,$i) = if (($i >= $s))
10691069 then $a
10701070 else throw("List size exceeds 15")
10711071
10721072 $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)
10731073 }
1074- let newBalances = $t02569625757._1
1075- let i = $t02569625757._2
1074+ let newBalances = $t02571725778._1
1075+ let v = $t02571725778._2
10761076 if (checkDAppThreshold(newBalances))
10771077 then throw()
10781078 else {
10791079 let us = unstake(dy_and_fee, tokenOut)
10801080 if ((us == us))
1081- 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))]
1081+ then [ScriptTransfer(msg.caller, dy, fromBase58String(tokenOut)), IntegerEntry((assetIds[outIndex] + kAssetBalance), (xp[outIndex] - dy_and_fee)), Burn(shareAssetId, withdrawAmount), ScriptTransfer(moneyBoxAddress, governanceFees, fromBase58String(tokenOut)), ScriptTransfer(capMoneyBoxAddress, (dy_fee - governanceFees), fromBase58String(tokenOut)), IntegerEntry(kShareAssetSupply, (shareSupply - withdrawAmount))]
10821082 else throw("Strict value is not equal to itself.")
10831083 }
10841084 }
10851085 }
10861086 else throw("Strict value is not equal to itself.")
10871087 }
10881088 }
10891089 })
10901090
10911091
10921092
10931093 @Callable(msg)
10941094 func A () = $Tuple2(nil, _A())
10951095
10961096
10971097
10981098 @Callable(msg)
10991099 func getVirtualPrice () = {
11001100 let D = get_D(_xp(), _A())
11011101 $Tuple2(nil, fraction(D, PRECISION, shareSupply))
11021102 }
11031103
11041104
11051105
11061106 @Callable(msg)
11071107 func calcTokenAmount (amounts,deposit) = {
11081108 let amp = _A()
11091109 let balances = _xp()
11101110 let D0 = getDMem(balances, amp)
11111111 func calcNewBalances (acc,balance) = {
1112- let $t02671826744 = acc
1113- let newBalances = $t02671826744._1
1114- let i = $t02671826744._2
1112+ let $t02675326779 = acc
1113+ let newBalances = $t02675326779._1
1114+ let i = $t02675326779._2
11151115 let newBalance = (balance + (if (deposit)
11161116 then amounts[i]
11171117 else -(amounts[i])))
11181118 $Tuple2((newBalances :+ newBalance), (i + 1))
11191119 }
11201120
11211121 let newBalances = ( let $l = balances
11221122 let $s = size($l)
11231123 let $acc0 = $Tuple2(nil, 0)
11241124 func $f0_1 ($a,$i) = if (($i >= $s))
11251125 then $a
11261126 else calcNewBalances($a, $l[$i])
11271127
11281128 func $f0_2 ($a,$i) = if (($i >= $s))
11291129 then $a
11301130 else throw("List size exceeds 15")
11311131
11321132 $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
11331133 let D1 = getDMem(newBalances, amp)
11341134 let diff = if (deposit)
11351135 then (D1 - D0)
11361136 else (D0 - D1)
11371137 $Tuple2(nil, fraction(diff, shareSupply, D0))
11381138 }
11391139
11401140
11411141
11421142 @Callable(msg)
11431143 func rampA (_futureA,_futureTime) = valueOrElse(isActive(), valueOrElse(isAdminCall(msg), if (assert((blockTimestamp >= (initial_A_time + MIN_RAMP_TIME))))
11441144 then throw("too often")
11451145 else if (assert((_futureTime >= (blockTimestamp + MIN_RAMP_TIME))))
11461146 then throw("insufficient time")
11471147 else {
11481148 let _initial_A = _A()
11491149 if (assert(if ((_futureA > 0))
11501150 then (MAX_A > _futureA)
11511151 else false))
11521152 then throw("out of base range")
11531153 else if (assert(if (if ((_futureA >= _initial_A))
11541154 then ((_initial_A * MAX_A_CHANGE) >= _futureA)
11551155 else false)
11561156 then true
11571157 else if ((_initial_A > _futureA))
11581158 then ((_futureA * MAX_A_CHANGE) >= _initial_A)
11591159 else false))
11601160 then throw("out of range")
11611161 else [IntegerEntry("initial_A", _initial_A), IntegerEntry("future_A", _futureA), IntegerEntry("initial_A_time", blockTimestamp), IntegerEntry("future_A_time", _futureTime)]
11621162 }))
11631163
11641164
11651165
11661166 @Callable(msg)
11671167 func stopRampA () = valueOrElse(isActive(), valueOrElse(isAdminCall(msg), {
11681168 let currentA = _A()
11691169 [IntegerEntry("initial_A", currentA), IntegerEntry("future_A", currentA), IntegerEntry("initial_A_time", blockTimestamp), IntegerEntry("future_A_time", blockTimestamp)]
11701170 }))
11711171
11721172
11731173
11741174 @Callable(msg)
11751175 func shutdown () = valueOrElse(isAdminCall(msg), if (!(active))
11761176 then throw(("DApp is already suspended. Cause: " + valueOrElse(getString(this, kCause), "the cause wasn't specified")))
11771177 else suspend("Paused by admin"))
11781178
11791179
11801180
11811181 @Callable(msg)
11821182 func activate () = valueOrElse(isAdminCall(msg), if (active)
11831183 then throwIsActive()
11841184 else [BooleanEntry(kActive, true), DeleteEntry(kCause)])
11851185
11861186
11871187
11881188 @Callable(msg)
11891189 func keepLimitForFirstHarvest (shareLimit) = valueOrElse(isActive(), valueOrElse(isAdminCall(msg), [IntegerEntry(kShareLimit, shareLimit)]))
11901190
11911191
11921192 @Verifier(tx)
11931193 func verify () = {
11941194 let multiSignedByAdmins = {
11951195 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
11961196 then 1
11971197 else 0
11981198 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
11991199 then 1
12001200 else 0
12011201 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
12021202 then 1
12031203 else 0
12041204 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
12051205 }
12061206 match tx {
12071207 case inv: InvokeScriptTransaction =>
12081208 let callTakeIntoAccount = if ((inv.dApp == this))
12091209 then (inv.function == "takeIntoAccountExtraFunds")
12101210 else false
12111211 let signedByAdmin = if (if (if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
12121212 then true
12131213 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey2))
12141214 then true
12151215 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey3))
12161216 then true
12171217 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKeyInvoke)
12181218 if (if (callTakeIntoAccount)
12191219 then signedByAdmin
12201220 else false)
12211221 then true
12221222 else multiSignedByAdmins
12231223 case _ =>
12241224 multiSignedByAdmins
12251225 }
12261226 }
12271227

github/deemru/w8io/169f3d6 
211.54 ms