tx · GqxVkacVNtCK7FQeJgVvFfRrxeh7SwmFKrMQeeEZy75J

3PAZsTidSJHjo1xxqY9t3Rvuk144u3EHQXQ:  -0.02600000 Waves

2023.10.02 20:58 [3847181] smart account 3PAZsTidSJHjo1xxqY9t3Rvuk144u3EHQXQ > SELF 0.00000000 Waves

{ "type": 13, "id": "GqxVkacVNtCK7FQeJgVvFfRrxeh7SwmFKrMQeeEZy75J", "fee": 2600000, "feeAssetId": null, "timestamp": 1696269503050, "version": 2, "chainId": 87, "sender": "3PAZsTidSJHjo1xxqY9t3Rvuk144u3EHQXQ", "senderPublicKey": "C58SydppP6AwzqeJE98CeJ547TRnjYSkmo5TkgwPSmNW", "proofs": [ "3PY863KN5Vy1qHmBHXZYXcgueoc6gk6CX1XtVymmxpBqefCb8kNCQiEWskxuCqrwUAXia4gHfqFgMcRmCZ9NfBQk", "58UVi5ckdzBUxfVBWHuJ4VDvp9J3iwuSYFFKqzhKqmM9fEjkQrbkt9Tbu989Piyf92jbNEssURSbsAFrmdusFVpa" ], "script": "base64:BgJDCAISBQoDCAgBEgASBgoECAgICBIDCgEIEgMKAQQSABIDCgEBEgASAwoBBBIECgIIARIFCgMEAQgSABIHCgUIAQEICDIACXN0YXJ0VHNNcwDo546s8jABF2NhbGN1bGF0ZURheXNTaW5jZVN0YXJ0AAQEZGlmZgkAZQIIBQlsYXN0QmxvY2sJdGltZXN0YW1wBQlzdGFydFRzTXMECmRheXNQYXNzZWQJAGkCBQRkaWZmCQBoAgCAowUA6AcFCmRheXNQYXNzZWQBCmFzSW50VHVwbGUBBXZhbHVlBAckbWF0Y2gwBQV2YWx1ZQMJAAECBQckbWF0Y2gwAgooSW50LCBJbnQpBANpbnQFByRtYXRjaDAFA2ludAkAAgECH1dyb25nIHR5cGUsIGV4cGVjdGVkOiBUdXBsZSBJbnQBEGdldE9yYWNsZUFkZHJlc3MACQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMCDXN0YXRpY19vcmFjbGUCEW9yYWNsZSBub3QgZm91bmQhAhZjb3VsZCBub3QgcGFyc2Ugb3JhY2xlAQ5nZXRGZWVzQWNjb3VudAAJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCCQEQZ2V0T3JhY2xlQWRkcmVzcwACFHN0YXRpY19mZWVBZ2dyZWdhdG9yAh9zdGF0aWNfZmVlQWdncmVnYXRvciBub3QgZm91bmQhAQ5nZXROb2RlQWNjb3VudAAJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCCQEQZ2V0T3JhY2xlQWRkcmVzcwACEnN0YXRpY19ub2RlQWRkcmVzcwIXbm9kZV9hZGRyZXNzIG5vdCBmb3VuZCEBDXRyeUdldEludGVnZXIBA2tleQQHJG1hdGNoMAkAmggCBQR0aGlzBQNrZXkDCQABAgUHJG1hdGNoMAIDSW50BAFiBQckbWF0Y2gwBQFiAAABDHRyeUdldEJpbmFyeQEDa2V5BAckbWF0Y2gwCQCcCAIFBHRoaXMFA2tleQMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAFiBQckbWF0Y2gwBQFiAQABDHRyeUdldFN0cmluZwEDa2V5BAckbWF0Y2gwCQCdCAIFBHRoaXMFA2tleQMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWIFByRtYXRjaDAFAWICAAEOZ2V0QXNzZXRTdHJpbmcBB2Fzc2V0SWQEByRtYXRjaDAFB2Fzc2V0SWQDCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQBYgUHJG1hdGNoMAkA2AQBBQFiAgVXQVZFUwENZ2V0QXNzZXRCeXRlcwEKYXNzZXRJZFN0cgMJAAACBQphc3NldElkU3RyAgVXQVZFUwUEdW5pdAkA2QQBBQphc3NldElkU3RyARNhZGRBc3NldEJ5dGVzVG9MaXN0AgVhY2N1bQRpdGVtCQDOCAIFBWFjY3VtCQDMCAIJAQ1nZXRBc3NldEJ5dGVzAQUEaXRlbQUDbmlsARRhZGRBc3NldFdlaWdodFRvTGlzdAIFYWNjdW0EaXRlbQkAzggCBQVhY2N1bQkAzAgCCQENdHJ5R2V0SW50ZWdlcgEJAKwCAgkArAICAgdzdGF0aWNfCQEOZ2V0QXNzZXRTdHJpbmcBBQRpdGVtAgdfd2VpZ2h0BQNuaWwBFmFkZEFzc2V0RGVjaW1hbHNUb0xpc3QCBWFjY3VtBGl0ZW0JAM4IAgUFYWNjdW0JAMwIAgkBDXRyeUdldEludGVnZXIBCQCsAgIJAKwCAgIHc3RhdGljXwkBDmdldEFzc2V0U3RyaW5nAQUEaXRlbQIJX2RlY2ltYWxzBQNuaWwBE2FkZEFzc2V0U2NhbGVUb0xpc3QCBWFjY3VtBGl0ZW0JAM4IAgUFYWNjdW0JAMwIAgkBDXRyeUdldEludGVnZXIBCQCsAgIJAKwCAgIHc3RhdGljXwkBDmdldEFzc2V0U3RyaW5nAQUEaXRlbQIGX3NjYWxlBQNuaWwBDGFkZEludFRvTGlzdAIFYWNjdW0EaXRlbQkAzggCBQVhY2N1bQkAzAgCCQENcGFyc2VJbnRWYWx1ZQEFBGl0ZW0FA25pbAEXcmV2ZW5ldUZvckRheUJ5QXNzZXRPdXQCA2RheQdhc3NldElkCQCsAgIJAKwCAgkArAICAgxyZXZlbmV1X2RheV8FB2Fzc2V0SWQCAV8JAKQDAQUDZGF5ARB2b2x1bWVGb3JEYXlCeUluAgNkYXkHYXNzZXRJZAkArAICCQCsAgIJAKwCAgILdm9sdW1lX2RheV8FB2Fzc2V0SWQCAV8JAKQDAQUDZGF5AAFUCQENdHJ5R2V0SW50ZWdlcgECE3N0YXRpY190b2tlbnNBbW91bnQACGFzc2V0SWRzCgACJGwJALUJAgkBDHRyeUdldFN0cmluZwECD3N0YXRpY190b2tlbklkcwIBLAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQETYWRkQXNzZXRCeXRlc1RvTGlzdAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgMwkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwANQXNzZXRzV2VpZ2h0cwoAAiRsBQhhc3NldElkcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMV8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEUYWRkQXNzZXRXZWlnaHRUb0xpc3QCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjFfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDMJAQUkZjFfMgIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIFBSRhY2MwAAAAAQACAAMACERlY2ltYWxzCgACJGwFCGFzc2V0SWRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYyXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJARZhZGRBc3NldERlY2ltYWxzVG9MaXN0AgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYyXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyAzCQEFJGYyXzICCQEFJGYyXzECCQEFJGYyXzECCQEFJGYyXzECBQUkYWNjMAAAAAEAAgADAAZTY2FsZXMKAAIkbAUIYXNzZXRJZHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjNfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBE2FkZEFzc2V0U2NhbGVUb0xpc3QCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjNfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDMJAQUkZjNfMgIJAQUkZjNfMQIJAQUkZjNfMQIJAQUkZjNfMQIFBSRhY2MwAAAAAQACAAMAB3N0YWtlSWQJAQx0cnlHZXRTdHJpbmcBAg1sYXN0X3N0YWtlX2lkAANGZWUJAQ10cnlHZXRJbnRlZ2VyAQIKc3RhdGljX2ZlZQAVQXNzZXRzV2VpZ2h0c0RlY2ltYWxzAAIABVNjYWxlAJBOAAZTY2FsZTgAgMLXLwAIRmVlU2NhbGUAkE4AEVBvb2xUb2tlbkRlY2ltYWxzAAgADlBvb2xUb2tlblNjYWxlCQBsBgAKAAAFEVBvb2xUb2tlbkRlY2ltYWxzAAAAAAUGSEFMRlVQAAxlYXJuZWRBc3NldHMFCGFzc2V0SWRzAQppc1NodXRkb3duAAQIc2h1dGRvd24DCQECIT0CCQEMdHJ5R2V0U3RyaW5nAQINc3RhdGljX29yYWNsZQIABAckbWF0Y2gwCQCbCAIJARBnZXRPcmFjbGVBZGRyZXNzAAIMYW1tX3NodXRkb3duAwkAAQIFByRtYXRjaDACB0Jvb2xlYW4EAXgFByRtYXRjaDAFAXgHBwQJc2h1dGRvd24yBAckbWF0Y2gwCQCbCAIFBHRoaXMCC2lzX3NodXRkb3duAwkAAQIFByRtYXRjaDACB0Jvb2xlYW4EAXgFByRtYXRjaDAFAXgHAwUIc2h1dGRvd24GBQlzaHV0ZG93bjIBCWNhblVwZGF0ZQADCQECIT0CCQEMdHJ5R2V0U3RyaW5nAQINc3RhdGljX29yYWNsZQIABAckbWF0Y2gwCQCbCAIJARBnZXRPcmFjbGVBZGRyZXNzAAIGYW1tX3R4AwkAAQIFByRtYXRjaDACB0Jvb2xlYW4EAXgFByRtYXRjaDAFAXgGBgEWZ2V0Q3VycmVudFRva2VuQmFsYW5jZQEJdG9rZW5UeXBlBAd0b2tlbklkCQEOZ2V0QXNzZXRTdHJpbmcBCQCRAwIFCGFzc2V0SWRzBQl0b2tlblR5cGUJAQ10cnlHZXRJbnRlZ2VyAQkArAICCQCsAgICB2dsb2JhbF8FB3Rva2VuSWQCCF9iYWxhbmNlARBjYWxjdWxhdGVQSXNzdWVkAgZhbW91bnQHdG9rZW5JZAQHUHN1cHBseQkBDXRyeUdldEludGVnZXIBAhdnbG9iYWxfcG9vbFRva2VuX2Ftb3VudAQHQmFsYW5jZQkBDXRyeUdldEludGVnZXIBCQCsAgIJAKwCAgIHZ2xvYmFsXwkBDmdldEFzc2V0U3RyaW5nAQUHdG9rZW5JZAIIX2JhbGFuY2UJAG4EBQZhbW91bnQFB1BzdXBwbHkFB0JhbGFuY2UFBERPV04BDWdldE1pblBJc3N1ZWQBCHBheW1lbnRzCgEHaGFuZGxlcgIFYWNjdW0HY3VycmVudAQHUElzc3VlZAkBEGNhbGN1bGF0ZVBJc3N1ZWQCCAUHY3VycmVudAZhbW91bnQIBQdjdXJyZW50B2Fzc2V0SWQDCQAAAgUHUElzc3VlZAAACQACAQIkb25lIG9mIHRoZSB0b2tlbnMgYW1vdW50cyBpcyB0b28gbG93AwMJAAACBQVhY2N1bQAABgkAZgIFBWFjY3VtBQdQSXNzdWVkBQdQSXNzdWVkBQVhY2N1bQQJbWluUElzc2VkCgACJGwFCHBheW1lbnRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAAACgEFJGY0XzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQdoYW5kbGVyAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGY0XzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyAzCQEFJGY0XzICCQEFJGY0XzECCQEFJGY0XzECCQEFJGY0XzECBQUkYWNjMAAAAAEAAgADBQltaW5QSXNzZWQBE2NoZWNrVG9rZW5zVmFsaWRpdHkBCHBheW1lbnRzCgEIaGFuZGxlcjECBWFjY3VtB3BheW1lbnQJAM4IAgUFYWNjdW0JAMwIAggFB3BheW1lbnQHYXNzZXRJZAUDbmlsBANpZHMKAAIkbAUIcGF5bWVudHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjRfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGhhbmRsZXIxAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGY0XzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyAzCQEFJGY0XzICCQEFJGY0XzECCQEFJGY0XzECCQEFJGY0XzECBQUkYWNjMAAAAAEAAgADAwkAAAIFA2lkcwUDaWRzCgEIaGFuZGxlcjICBWFjY3VtB2Fzc2V0SWQDCQECIT0CCQDPCAIFA2lkcwUHYXNzZXRJZAUEdW5pdAkAZAIFBWFjY3VtAAEJAAIBCQCsAgICFGFzc2V0IG5vdCBhdHRhY2hlZDogCQEOZ2V0QXNzZXRTdHJpbmcBBQdhc3NldElkBAZjaGVja3MKAAIkbAUIYXNzZXRJZHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwAAAKAQUkZjVfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGhhbmRsZXIyAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGY1XzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyAzCQEFJGY1XzICCQEFJGY1XzECCQEFJGY1XzECCQEFJGY1XzECBQUkYWNjMAAAAAEAAgADAwkAAAIFBmNoZWNrcwUGY2hlY2tzBgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEMc3Rha2VVbnN0YWtlAwVzdGFrZQZhbW91bnQHYXNzZXRJZAMDCQAAAgUHYXNzZXRJZAIFV0FWRVMJAGYCBQZhbW91bnQAAAcEDWxlYXNpbmdBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwIObGVhc2luZ19hbW91bnQAAAQObmV3TGVhc2VBbW91bnQDBQVzdGFrZQkAZAIFDWxlYXNpbmdBbW91bnQFBmFtb3VudAkAZQIFDWxlYXNpbmdBbW91bnQFBmFtb3VudAQIbmV3TGVhc2UJAMQIAgkBDmdldE5vZGVBY2NvdW50AAUObmV3TGVhc2VBbW91bnQECm5ld0xlYXNlSWQJALkIAQUIbmV3TGVhc2UEBGRhdGEJAMwIAgUIbmV3TGVhc2UJAMwIAgkBC1N0cmluZ0VudHJ5AgINbGFzdF9zdGFrZV9pZAkA2AQBBQpuZXdMZWFzZUlkCQDMCAIJAQxJbnRlZ2VyRW50cnkCAg5sZWFzaW5nX2Ftb3VudAUObmV3TGVhc2VBbW91bnQFA25pbAMJAQIhPQIFB3N0YWtlSWQCAAkAzggCCQDMCAIJAQtMZWFzZUNhbmNlbAEJANkEAQUHc3Rha2VJZAUDbmlsBQRkYXRhBQRkYXRhBQNuaWwBE2hhbmRsZVBvb2xUb2tlbnNBZGQEB1BJc3N1ZWQIcGF5bWVudHMLdXNlckFkZHJlc3MKbmVlZENoYW5nZQoBFWdldFRva2VuUGF5bWVudEFtb3VudAEHdG9rZW5JZAoBB2hhbmRsZXICBWFjY3VtB3BheW1lbnQDCQAAAggFB3BheW1lbnQHYXNzZXRJZAUHdG9rZW5JZAgFB3BheW1lbnQGYW1vdW50BQVhY2N1bQoAAiRsBQhwYXltZW50cwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAAAAoBBSRmNF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEHaGFuZGxlcgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmNF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgMwkBBSRmNF8yAgkBBSRmNF8xAgkBBSRmNF8xAgkBBSRmNF8xAgUFJGFjYzAAAAABAAIAAwoBEWhhbmRsZVRva2VuQ2hhbmdlAgVhY2N1bQd0b2tlbklkBAJCawkBDXRyeUdldEludGVnZXIBCQCsAgIJAKwCAgIHZ2xvYmFsXwkBDmdldEFzc2V0U3RyaW5nAQUHdG9rZW5JZAIIX2JhbGFuY2UEB1BTdXBwbHkJAQ10cnlHZXRJbnRlZ2VyAQIXZ2xvYmFsX3Bvb2xUb2tlbl9hbW91bnQEDXRva2VuRGVjaW1hbHMJAQ10cnlHZXRJbnRlZ2VyAQkArAICCQCsAgICB3N0YXRpY18JAQ5nZXRBc3NldFN0cmluZwEFB3Rva2VuSWQCBl9zY2FsZQQGRGtUZW1wCQBuBAkAZQIJAG4ECQBkAgUHUFN1cHBseQUHUElzc3VlZAUNdG9rZW5EZWNpbWFscwUHUFN1cHBseQUHQ0VJTElORwUNdG9rZW5EZWNpbWFscwUCQmsFDXRva2VuRGVjaW1hbHMFB0NFSUxJTkcEDXBheW1lbnRBbW91bnQJARVnZXRUb2tlblBheW1lbnRBbW91bnQBBQd0b2tlbklkBAJEawkAlwMBCQDMCAIFBkRrVGVtcAkAzAgCBQ1wYXltZW50QW1vdW50BQNuaWwECHRvUmV0dXJuCQBlAgMJAQIhPQIFDXBheW1lbnRBbW91bnQAAAUNcGF5bWVudEFtb3VudAAABQJEawQBdAMDBQpuZWVkQ2hhbmdlCQBmAgUIdG9SZXR1cm4AAAcJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwULdXNlckFkZHJlc3MFCHRvUmV0dXJuBQd0b2tlbklkBQNuaWwFA25pbAQQc3Rha2VVbnN0YWtlRGF0YQMJAAACCQEOZ2V0QXNzZXRTdHJpbmcBBQd0b2tlbklkAgVXQVZFUwkBDHN0YWtlVW5zdGFrZQMGBQJEawIFV0FWRVMFA25pbAkAzggCCQDOCAIJAM4IAgUFYWNjdW0FAXQFEHN0YWtlVW5zdGFrZURhdGEJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICAgdnbG9iYWxfCQEOZ2V0QXNzZXRTdHJpbmcBBQd0b2tlbklkAghfYmFsYW5jZQkAZAIFAkJrBQJEawUDbmlsCgACJGwFCGFzc2V0SWRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGY0XzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJARFoYW5kbGVUb2tlbkNoYW5nZQIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmNF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgMwkBBSRmNF8yAgkBBSRmNF8xAgkBBSRmNF8xAgkBBSRmNF8xAgUFJGFjYzAAAAABAAIAAwEWaGFuZGxlUG9vbFRva2Vuc1JlZGVlbQIJUFJlZGVlbWVkC3VzZXJBZGRyZXNzCgERaGFuZGxlVG9rZW5SZWRlZW0CBWFjY3VtB3Rva2VuSWQEAkJrCQENdHJ5R2V0SW50ZWdlcgEJAKwCAgkArAICAgdnbG9iYWxfCQEOZ2V0QXNzZXRTdHJpbmcBBQd0b2tlbklkAghfYmFsYW5jZQQHUFN1cHBseQkBDXRyeUdldEludGVnZXIBAhdnbG9iYWxfcG9vbFRva2VuX2Ftb3VudAQNdG9rZW5EZWNpbWFscwkBDXRyeUdldEludGVnZXIBCQCsAgIJAKwCAgIHc3RhdGljXwkBDmdldEFzc2V0U3RyaW5nAQUHdG9rZW5JZAIGX3NjYWxlBAZhbW91bnQJAKADAQkAvQIECQC4AgIJALYCAQUGU2NhbGU4CQC9AgQJALYCAQkAZQIFB1BTdXBwbHkFCVBSZWRlZW1lZAkAtgIBBQZTY2FsZTgJALYCAQUHUFN1cHBseQUHQ0VJTElORwkAtgIBBQJCawkAtgIBBQZTY2FsZTgFBERPV04EEHN0YWtlVW5zdGFrZURhdGEDCQAAAgkBDmdldEFzc2V0U3RyaW5nAQUHdG9rZW5JZAIFV0FWRVMJAQxzdGFrZVVuc3Rha2UDBwUGYW1vdW50AgVXQVZFUwUDbmlsCQDOCAIJAM4IAgUFYWNjdW0FEHN0YWtlVW5zdGFrZURhdGEJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICAgdnbG9iYWxfCQEOZ2V0QXNzZXRTdHJpbmcBBQd0b2tlbklkAghfYmFsYW5jZQkAZQIFAkJrBQZhbW91bnQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwULdXNlckFkZHJlc3MFBmFtb3VudAUHdG9rZW5JZAUDbmlsCgACJGwFCGFzc2V0SWRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGY0XzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJARFoYW5kbGVUb2tlblJlZGVlbQIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmNF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgMwkBBSRmNF8yAgkBBSRmNF8xAgkBBSRmNF8xAgkBBSRmNF8xAgUFJGFjYzAAAAABAAIAAwESY2FsY3VsYXRlT3V0QW1vdW50BQhBbW91bnRJbgdhc3NldEluCGFzc2V0T3V0CUJhbGFuY2VJbgpCYWxhbmNlT3V0BAdJbmRleEluCQEFdmFsdWUBCQDPCAIFCGFzc2V0SWRzBQdhc3NldEluBAhJbmRleE91dAkBBXZhbHVlAQkAzwgCBQhhc3NldElkcwUIYXNzZXRPdXQDCQAAAgUHSW5kZXhJbgUISW5kZXhPdXQJAAIBAhF3cm9uZyB0b2tlbnMgcGFpcgkAbgQFCkJhbGFuY2VPdXQJAGUCCQBoAgUGU2NhbGU4BQZTY2FsZTgJAKADAQkAdgYJAL0CBAkAtgIBBQlCYWxhbmNlSW4JALYCAQkAaAIFBlNjYWxlOAUGU2NhbGU4CQC2AgEJAGQCBQlCYWxhbmNlSW4FCEFtb3VudEluBQZIQUxGVVAAEAkAtgIBCQBrAwkAkQMCBQ1Bc3NldHNXZWlnaHRzBQdJbmRleEluAJBOCQCRAwIFDUFzc2V0c1dlaWdodHMFCEluZGV4T3V0AAQAEAUHQ0VJTElORwkAaAIFBlNjYWxlOAUGU2NhbGU4BQRET1dOARFjYWxjdWxhdGVNaW5Ub0dldAMGYXNzZXQxBmFzc2V0MgxhbW91bnRUb1N3YXAECWtCYWxhbmNlQQkArAICCQCsAgICB2dsb2JhbF8FBmFzc2V0MQIIX2JhbGFuY2UED0FfYXNzZXRfYmFsYW5jZQkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwUJa0JhbGFuY2VBBAlrQmFsYW5jZUIJAKwCAgkArAICAgdnbG9iYWxfBQZhc3NldDICCF9iYWxhbmNlBA9CX2Fzc2V0X2JhbGFuY2UJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMFCWtCYWxhbmNlQgQFdG9HZXQJARJjYWxjdWxhdGVPdXRBbW91bnQFBQxhbW91bnRUb1N3YXAJAQ1nZXRBc3NldEJ5dGVzAQUGYXNzZXQxCQENZ2V0QXNzZXRCeXRlcwEFBmFzc2V0MgUPQV9hc3NldF9iYWxhbmNlBQ9CX2Fzc2V0X2JhbGFuY2UECWZlZUFtb3VudAkAawMFBXRvR2V0BQNGZWUFCEZlZVNjYWxlAwkAAAIFCWZlZUFtb3VudAUJZmVlQW1vdW50BA5jbGVhbkFtb3VudE91dAkAZQIFBXRvR2V0BQlmZWVBbW91bnQDCQAAAgUOY2xlYW5BbW91bnRPdXQFDmNsZWFuQW1vdW50T3V0BQ5jbGVhbkFtb3VudE91dAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEPZ2V0VG9rZW5CYWxhbmNlAQdhc3NldElkBAckbWF0Y2gwBQdhc3NldElkAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAXQFByRtYXRjaDAJAPAHAgUEdGhpcwUBdAgJAO8HAQUEdGhpcwdyZWd1bGFyAR1jYWxjdWxhdGVDdXJyZW50QXNzZXRJbnRlcmVzdAQHYXNzZXRJZAphc3NldElkU3RyCGFCYWxhbmNlFnRva2VuRWFybmluZ3NMYXN0Q2hlY2sEC3RvdGFsU3Rha2VkCQENdHJ5R2V0SW50ZWdlcgECEmdsb2JhbF9pbmRleFN0YWtlZAQVdG9rZW5CYWxhbmNlTGFzdENoZWNrBRZ0b2tlbkVhcm5pbmdzTGFzdENoZWNrBBNjdXJyZW50QmFsYW5jZURlbHRhCQBlAgkBD2dldFRva2VuQmFsYW5jZQEFB2Fzc2V0SWQFCGFCYWxhbmNlBBRjdXJyZW50VG9rZW5FYXJuaW5ncwMJAGYCBRNjdXJyZW50QmFsYW5jZURlbHRhBRV0b2tlbkJhbGFuY2VMYXN0Q2hlY2sFE2N1cnJlbnRCYWxhbmNlRGVsdGEFFXRva2VuQmFsYW5jZUxhc3RDaGVjawQLbmV3RWFybmluZ3MJAGUCBRRjdXJyZW50VG9rZW5FYXJuaW5ncwUVdG9rZW5CYWxhbmNlTGFzdENoZWNrBAtuZXdJbnRlcmVzdAMJAAACBQt0b3RhbFN0YWtlZAAAAAAJAGsDBQtuZXdFYXJuaW5ncwUGU2NhbGU4BQt0b3RhbFN0YWtlZAQRbGFzdENoZWNrSW50ZXJlc3QJAQ10cnlHZXRJbnRlZ2VyAQkArAICCQCsAgICEWdsb2JhbF9sYXN0Q2hlY2tfBQphc3NldElkU3RyAglfaW50ZXJlc3QJAGQCBRFsYXN0Q2hlY2tJbnRlcmVzdAULbmV3SW50ZXJlc3QBC2NsYWltUmVzdWx0AQdhZGRyZXNzBAphZGRyZXNzU3RyCQClCAEFB2FkZHJlc3MEC3NoYXJlQW1vdW50CQENdHJ5R2V0SW50ZWdlcgEJAKwCAgUKYWRkcmVzc1N0cgIMX2luZGV4U3Rha2VkCgEHaGFuZGxlcgIFYWNjdW0HYXNzZXRJZAQKYXNzZXRJZFN0cgkBDmdldEFzc2V0U3RyaW5nAQUHYXNzZXRJZAQIYUJhbGFuY2UJAQ10cnlHZXRJbnRlZ2VyAQkArAICCQCsAgICB2dsb2JhbF8JAQ5nZXRBc3NldFN0cmluZwEFB2Fzc2V0SWQCCF9iYWxhbmNlBBZ0b2tlbkVhcm5pbmdzTGFzdENoZWNrCQENdHJ5R2V0SW50ZWdlcgEJAKwCAgkArAICAhFnbG9iYWxfbGFzdENoZWNrXwUKYXNzZXRJZFN0cgIJX2Vhcm5pbmdzBBRjdXJyZW50VG9rZW5JbnRlcmVzdAkBHWNhbGN1bGF0ZUN1cnJlbnRBc3NldEludGVyZXN0BAUHYXNzZXRJZAUKYXNzZXRJZFN0cgUIYUJhbGFuY2UFFnRva2VuRWFybmluZ3NMYXN0Q2hlY2sEFGN1cnJlbnRUb2tlbkVhcm5pbmdzCQCWAwEJAMwIAgUWdG9rZW5FYXJuaW5nc0xhc3RDaGVjawkAzAgCCQBlAgkBD2dldFRva2VuQmFsYW5jZQEFB2Fzc2V0SWQFCGFCYWxhbmNlBQNuaWwEDHJld2FyZEFtb3VudAkAawMFC3NoYXJlQW1vdW50CQBlAgUUY3VycmVudFRva2VuSW50ZXJlc3QJAQ10cnlHZXRJbnRlZ2VyAQkArAICCQCsAgIJAKwCAgUKYWRkcmVzc1N0cgILX2xhc3RDaGVja18FCmFzc2V0SWRTdHICCV9pbnRlcmVzdAUGU2NhbGU4BAh0cmFuc2ZlcgMJAAACBQxyZXdhcmRBbW91bnQAAAUDbmlsCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFB2FkZHJlc3MFDHJld2FyZEFtb3VudAUHYXNzZXRJZAUDbmlsBAdjbGFpbWVkCQENdHJ5R2V0SW50ZWdlcgEJAKwCAgkArAICCQCsAgIFCmFkZHJlc3NTdHICC19sYXN0Q2hlY2tfBQphc3NldElkU3RyAghfY2xhaW1lZAkAzggCCQDOCAIFBWFjY3VtBQh0cmFuc2ZlcgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgICEWdsb2JhbF9sYXN0Q2hlY2tfBQphc3NldElkU3RyAglfZWFybmluZ3MJAGUCBRRjdXJyZW50VG9rZW5FYXJuaW5ncwUMcmV3YXJkQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgIRZ2xvYmFsX2xhc3RDaGVja18FCmFzc2V0SWRTdHICCV9pbnRlcmVzdAUUY3VycmVudFRva2VuSW50ZXJlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIFCmFkZHJlc3NTdHICC19sYXN0Q2hlY2tfBQphc3NldElkU3RyAglfaW50ZXJlc3QFFGN1cnJlbnRUb2tlbkludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICBQphZGRyZXNzU3RyAgtfbGFzdENoZWNrXwUKYXNzZXRJZFN0cgIIX2NsYWltZWQJAGQCBQdjbGFpbWVkBQxyZXdhcmRBbW91bnQFA25pbAQFYWNjdW0KAAIkbAUMZWFybmVkQXNzZXRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGY0XzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQdoYW5kbGVyAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGY0XzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyAzCQEFJGY0XzICCQEFJGY0XzECCQEFJGY0XzECCQEFJGY0XzECBQUkYWNjMAAAAAEAAgADCQDOCAIFBWFjY3VtCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCmFkZHJlc3NTdHICCl9sYXN0Q2xhaW0IBQlsYXN0QmxvY2sJdGltZXN0YW1wBQNuaWwBEGluZGV4U3Rha2VSZXN1bHQCCmFkZHJlc3NTdHIGYW1vdW50BAJsaQkBC2NsYWltUmVzdWx0AQkBEUBleHRyTmF0aXZlKDEwNjIpAQUKYWRkcmVzc1N0cgkAzggCBQJsaQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQphZGRyZXNzU3RyAgxfaW5kZXhTdGFrZWQJAGQCCQENdHJ5R2V0SW50ZWdlcgEJAKwCAgUKYWRkcmVzc1N0cgIMX2luZGV4U3Rha2VkBQZhbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQICEmdsb2JhbF9pbmRleFN0YWtlZAkAZAIJAQ10cnlHZXRJbnRlZ2VyAQISZ2xvYmFsX2luZGV4U3Rha2VkBQZhbW91bnQFA25pbAEDc3VtAgVhY2N1bQFuCQBkAgUFYWNjdW0JAQ1wYXJzZUludFZhbHVlAQUBbgEbc2V0T3JhY2xlQWRkcmVzc0FuZEluaXRpYXRlAQdhZGRyZXNzCQDMCAIJAQtTdHJpbmdFbnRyeQICDXN0YXRpY19vcmFjbGUFB2FkZHJlc3MFA25pbAEJaXNUZXN0RW52AAQHdGVzdGVudgQHJG1hdGNoMAkAmwgCBQR0aGlzAgdURVNURU5WAwkAAQIFByRtYXRjaDACB0Jvb2xlYW4EAXgFByRtYXRjaDAFAXgHBQd0ZXN0ZW52DQFpAQxyZWFkT25seUZ1bmMDBmFzc2V0MQZhc3NldDIMYW1vdW50VG9Td2FwBAlhbW91bnRPdXQJARFjYWxjdWxhdGVNaW5Ub0dldAMFBmFzc2V0MQUGYXNzZXQyBQxhbW91bnRUb1N3YXAJAMwIAgkBDEludGVnZXJFbnRyeQICBURFQlVHBQlhbW91bnRPdXQFA25pbAFpAQp0b3BVcEZ1bmRzAAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECGFdyb25nIHBheW1lbnRzIGF0dGFjaGVkIQQHcGF5bWVudAkAkQMCCAUBaQhwYXltZW50cwAABAVhc3NldAgFB3BheW1lbnQHYXNzZXRJZAMJAAACCQDPCAIFCGFzc2V0SWRzBQVhc3NldAUEdW5pdAkAAgECFU5vdCBzdXBwb3J0ZWQgYXNzZXRJZAQGYW1vdW50CAUHcGF5bWVudAZhbW91bnQECGFCYWxhbmNlCQENdHJ5R2V0SW50ZWdlcgEJAKwCAgkArAICAgdnbG9iYWxfCQEOZ2V0QXNzZXRTdHJpbmcBBQVhc3NldAIIX2JhbGFuY2UEA2RheQkBF2NhbGN1bGF0ZURheXNTaW5jZVN0YXJ0AAQHcmV2ZW5ldQkBDXRyeUdldEludGVnZXIBCQEXcmV2ZW5ldUZvckRheUJ5QXNzZXRPdXQCBQNkYXkJAQ5nZXRBc3NldFN0cmluZwEFBWFzc2V0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgIHZ2xvYmFsXwkBDmdldEFzc2V0U3RyaW5nAQUFYXNzZXQCCF9iYWxhbmNlCQBkAgUIYUJhbGFuY2UFBmFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgIOZGF5c19zaW5jZV9hcHkFA2RheQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBF3JldmVuZXVGb3JEYXlCeUFzc2V0T3V0AgUDZGF5CQEOZ2V0QXNzZXRTdHJpbmcBBQVhc3NldAkAZAIFB3JldmVuZXUFBmFtb3VudAUDbmlsAWkBB3ByZUluaXQEC2Fzc2V0SWRzU3RyD2Fzc2V0V2VpZ2h0c1N0cg5iYXNlVG9rZW5JZFN0cgpwb29sRG9tYWluAwkBAiE9AgUEdGhpcwgFAWkGY2FsbGVyCQACAQIKYWRtaW4gb25seQMJAGYCCQCxAgEFCnBvb2xEb21haW4ADQkAAgECFXRvbyBsYXJnZSBwb29sIGRvbWFpbgQNYXNzZXRJZHNTdHJMaQkAtQkCBQthc3NldElkc1N0cgIBLAQKYXNzZXRJZHNMaQoAAiRsBQ1hc3NldElkc1N0ckxpCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGY0XzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJARNhZGRBc3NldEJ5dGVzVG9MaXN0AgUCJGEJAJEDAgUCJGwFAiRpCgEFJGY0XzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyAzCQEFJGY0XzICCQEFJGY0XzECCQEFJGY0XzECCQEFJGY0XzECBQUkYWNjMAAAAAEAAgADBBFhc3NldFdlaWdodHNTdHJMaQkAtQkCBQ9hc3NldFdlaWdodHNTdHICASwED2Fzc2V0V2VpZ2h0c1N1bQoAAiRsBRFhc3NldFdlaWdodHNTdHJMaQoAAiRzCQCQAwEFAiRsCgAFJGFjYzAAAAoBBSRmNV8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEDc3VtAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGY1XzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyAzCQEFJGY1XzICCQEFJGY1XzECCQEFJGY1XzECCQEFJGY1XzECBQUkYWNjMAAAAAEAAgADCgETYWRkVG9rZW5EYXRhRW50cmllcwIFYWNjdW0IYXNzZXROdW0DCQBnAgUIYXNzZXROdW0JAJADAQUKYXNzZXRJZHNMaQUFYWNjdW0EDWFzc2V0RGVjaW1hbHMEByRtYXRjaDAJAJEDAgUKYXNzZXRJZHNMaQUIYXNzZXROdW0DCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQBeAUHJG1hdGNoMAgJAQV2YWx1ZQEJAOwHAQkAkQMCBQphc3NldElkc0xpBQhhc3NldE51bQhkZWNpbWFscwAICQDOCAIFBWFjY3VtCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgIHc3RhdGljXwkAkQMCBQ1hc3NldElkc1N0ckxpBQhhc3NldE51bQIGX3NjYWxlCQBsBgAKAAAFDWFzc2V0RGVjaW1hbHMAAAAABQRET1dOCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgIHc3RhdGljXwkAkQMCBQ1hc3NldElkc1N0ckxpBQhhc3NldE51bQIJX2RlY2ltYWxzBQ1hc3NldERlY2ltYWxzCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgIHc3RhdGljXwkAkQMCBQ1hc3NldElkc1N0ckxpBQhhc3NldE51bQIHX3dlaWdodAkBBXZhbHVlAQkAtgkBCQCRAwIFEWFzc2V0V2VpZ2h0c1N0ckxpBQhhc3NldE51bQUDbmlsAwkBAiE9AgUPYXNzZXRXZWlnaHRzU3VtAGQJAAIBAilzdW0gb2YgdG9rZW4gd2VpZ2h0cyBtdXN0IGJlIGVxdWFsIHRvIDEwMAkAzggCCgACJGwJAMwIAgAACQDMCAIAAQkAzAgCAAIFA25pbAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmNl8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQETYWRkVG9rZW5EYXRhRW50cmllcwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmNl8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgMwkBBSRmNl8yAgkBBSRmNl8xAgkBBSRmNl8xAgkBBSRmNl8xAgUFJGFjYzAAAAABAAIAAwkAzAgCCQELU3RyaW5nRW50cnkCAg9zdGF0aWNfdG9rZW5JZHMFC2Fzc2V0SWRzU3RyCQDMCAIJAQtTdHJpbmdFbnRyeQICE3N0YXRpY190b2tlbldlaWdodHMFD2Fzc2V0V2VpZ2h0c1N0cgkAzAgCCQEMSW50ZWdlckVudHJ5AgITc3RhdGljX3Rva2Vuc0Ftb3VudAkAkAMBBQphc3NldElkc0xpCQDMCAIJAQtTdHJpbmdFbnRyeQICEXN0YXRpY19wb29sRG9tYWluBQpwb29sRG9tYWluCQDMCAIJAQtTdHJpbmdFbnRyeQICEnN0YXRpY19iYXNlVG9rZW5JZAUOYmFzZVRva2VuSWRTdHIJAMwIAgkBDEludGVnZXJFbnRyeQICCnN0YXRpY19mZWUAZAUDbmlsAWkBBGluaXQBBm9yYWNsZQoBC3ByZXBhcmVMaXN0AAoBB2hhbmRsZXICBWFjY3VtAW4JAM4IAgUFYWNjdW0JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICAgdnbG9iYWxfCQEOZ2V0QXNzZXRTdHJpbmcBCAUBbgdhc3NldElkAghfYmFsYW5jZQgFAW4GYW1vdW50BQNuaWwKAAIkbAgFAWkIcGF5bWVudHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjRfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBB2hhbmRsZXICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjRfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDMJAQUkZjRfMgIJAQUkZjRfMQIJAQUkZjRfMQIJAQUkZjRfMQIFBSRhY2MwAAAAAQACAAMKARljYWxjdWxhdGVQb29sVG9rZW5zQW1vdW50AQhwYXltZW50cwoBB2hhbmRsZXICBWFjY3VtA3BtdAQHYXNzZXRJZAgFA3BtdAdhc3NldElkCgEIaGFuZGxlcjICBWFjY3VtAW4DCQAAAgUBbgUHYXNzZXRJZAkBBXZhbHVlAQkAzwgCBQhhc3NldElkcwUBbgUFYWNjdW0EBVRva2VuCgACJGwFCGFzc2V0SWRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAABCgEFJGY0XzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhoYW5kbGVyMgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmNF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgMwkBBSRmNF8yAgkBBSRmNF8xAgkBBSRmNF8xAgkBBSRmNF8xAgUFJGFjYzAAAAABAAIAAwkAawMFBWFjY3VtCQBsBggFA3BtdAZhbW91bnQJAJEDAgUIRGVjaW1hbHMFBVRva2VuCQCRAwIFDUFzc2V0c1dlaWdodHMFBVRva2VuBRVBc3NldHNXZWlnaHRzRGVjaW1hbHMACAUFRkxPT1IFBlNjYWxlOAoAAiRsBQhwYXltZW50cwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFDlBvb2xUb2tlblNjYWxlCgEFJGY0XzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQdoYW5kbGVyAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGY0XzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyAzCQEFJGY0XzICCQEFJGY0XzECCQEFJGY0XzECCQEFJGY0XzECBQUkYWNjMAAAAAEAAgADAwkAZgIJAQ10cnlHZXRJbnRlZ2VyAQIQZ2xvYmFsX3dhc0luaXRlZAAACQACAQITcG9vbCBhbHJlYWR5IGluaXRlZAQRaW5pdGlhbFBvb2xUb2tlbnMJARljYWxjdWxhdGVQb29sVG9rZW5zQW1vdW50AQgFAWkIcGF5bWVudHMDCQAAAgURaW5pdGlhbFBvb2xUb2tlbnMAAAkAAgECMnlvdSBuZWVkIGEgYmlnZ2VyIHRva2VucyBhbW91bnQgdG8gbGF1bmNoIHRoZSBwb29sBA5wb29sVG9rZW5Jc3N1ZQkAwwgHCQCsAgICA1dEIAkBDHRyeUdldFN0cmluZwECEXN0YXRpY19wb29sRG9tYWluAg1XRCBwb29sIHRva2VuBRFpbml0aWFsUG9vbFRva2VucwURUG9vbFRva2VuRGVjaW1hbHMGBQR1bml0AAAEC3Bvb2xUb2tlbklkCQC4CAEFDnBvb2xUb2tlbklzc3VlCQDOCAIJAM4IAgkBC3ByZXBhcmVMaXN0AAkAzAgCBQ5wb29sVG9rZW5Jc3N1ZQkAzAgCCQEMSW50ZWdlckVudHJ5AgIXZ2xvYmFsX3Bvb2xUb2tlbl9hbW91bnQFEWluaXRpYWxQb29sVG9rZW5zCQDMCAIJAQxJbnRlZ2VyRW50cnkCAhBnbG9iYWxfd2FzSW5pdGVkAAEJAMwIAgkBC0JpbmFyeUVudHJ5AgITZ2xvYmFsX3Bvb2xUb2tlbl9pZAULcG9vbFRva2VuSWQJAMwIAgkBC1N0cmluZ0VudHJ5AgIWc3RhdGljX3Bvb2xUb2tlbl9pZFN0cgkBDmdldEFzc2V0U3RyaW5nAQULcG9vbFRva2VuSWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBRFpbml0aWFsUG9vbFRva2VucwULcG9vbFRva2VuSWQFA25pbAkBG3NldE9yYWNsZUFkZHJlc3NBbmRJbml0aWF0ZQEFBm9yYWNsZQFpAQ1nZW5lcmF0ZUluZGV4AQpuZWVkQ2hhbmdlAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwUBVAkAAgEJAKwCAgI7eW91IG5lZWQgdG8gYXR0YWNoIGFsbCBwb29sIHRva2Vucy4gYW1vdW50IG9mIHBvb2wgdG9rZW5zOiAJAKQDAQUBVAMJAQEhAQkBE2NoZWNrVG9rZW5zVmFsaWRpdHkBCAUBaQhwYXltZW50cwkAAgECFXdyb25nIGFzc2V0cyBhdHRhY2hlZAQHUElzc3VlZAkBDWdldE1pblBJc3N1ZWQBCAUBaQhwYXltZW50cwQHcmVpc3N1ZQkBB1JlaXNzdWUDCQERQGV4dHJOYXRpdmUoMTA1NykBAhNnbG9iYWxfcG9vbFRva2VuX2lkBQdQSXNzdWVkBgQGcmVzdWx0CQETaGFuZGxlUG9vbFRva2Vuc0FkZAQFB1BJc3N1ZWQIBQFpCHBheW1lbnRzCAUBaQxvcmlnaW5DYWxsZXIFCm5lZWRDaGFuZ2UJAJQKAgkAzggCBQZyZXN1bHQJAMwIAgUHcmVpc3N1ZQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFB1BJc3N1ZWQJAQx0cnlHZXRCaW5hcnkBAhNnbG9iYWxfcG9vbFRva2VuX2lkCQDMCAIJAQxJbnRlZ2VyRW50cnkCAhdnbG9iYWxfcG9vbFRva2VuX2Ftb3VudAkAZAIJAQ10cnlHZXRJbnRlZ2VyAQIXZ2xvYmFsX3Bvb2xUb2tlbl9hbW91bnQFB1BJc3N1ZWQFA25pbAUHUElzc3VlZAFpAQpzdGFrZUluZGV4AAQKYWRkcmVzc1N0cgkApQgBCAUBaQxvcmlnaW5DYWxsZXIEA3BtdAkAkQMCCAUBaQhwYXltZW50cwAAAwkBAiE9AgkBBXZhbHVlAQgFA3BtdAdhc3NldElkCQEMdHJ5R2V0QmluYXJ5AQITZ2xvYmFsX3Bvb2xUb2tlbl9pZAkAAgECFHdyb25nIGFzc2V0IGF0dGFjaGVkCQEQaW5kZXhTdGFrZVJlc3VsdAIFCmFkZHJlc3NTdHIIBQNwbXQGYW1vdW50AWkBDHVuc3Rha2VJbmRleAELc2hhcmVBbW91bnQECmFkZHJlc3NTdHIJAKUIAQgFAWkMb3JpZ2luQ2FsbGVyBA5zaGFyZUF2YWlsYWJsZQkBDXRyeUdldEludGVnZXIBCQCsAgIFCmFkZHJlc3NTdHICDF9pbmRleFN0YWtlZAMJAGYCBQtzaGFyZUFtb3VudAUOc2hhcmVBdmFpbGFibGUJAAIBAiV5b3UgZG9uJ3QgaGF2ZSBpbmRleCB0b2tlbnMgYXZhaWxhYmxlCQDOCAIJAQtjbGFpbVJlc3VsdAEIBQFpDG9yaWdpbkNhbGxlcgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQphZGRyZXNzU3RyAgxfaW5kZXhTdGFrZWQJAGUCBQ5zaGFyZUF2YWlsYWJsZQULc2hhcmVBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQICEmdsb2JhbF9pbmRleFN0YWtlZAkAZQIJAQ10cnlHZXRJbnRlZ2VyAQISZ2xvYmFsX2luZGV4U3Rha2VkBQtzaGFyZUFtb3VudAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFC3NoYXJlQW1vdW50CQERQGV4dHJOYXRpdmUoMTA1NykBAhNnbG9iYWxfcG9vbFRva2VuX2lkBQNuaWwBaQERY2xhaW1JbmRleFJld2FyZHMACQELY2xhaW1SZXN1bHQBCAUBaQZjYWxsZXIBaQELcmVkZWVtSW5kZXgBDHNlbmRUb09yaWdpbgQDcG10CQCRAwIIBQFpCHBheW1lbnRzAAADCQECIT0CCAUDcG10B2Fzc2V0SWQJAQx0cnlHZXRCaW5hcnkBAhNnbG9iYWxfcG9vbFRva2VuX2lkCQACAQIecGxlYXNlIGF0dGFjaCBwb29sIHNoYXJlIHRva2VuBAlQUmVkZWVtZWQIBQNwbXQGYW1vdW50BAZyZXN1bHQJARZoYW5kbGVQb29sVG9rZW5zUmVkZWVtAgUJUFJlZGVlbWVkAwUMc2VuZFRvT3JpZ2luCAUBaQxvcmlnaW5DYWxsZXIIBQFpBmNhbGxlcgkAzggCBQZyZXN1bHQJAMwIAgkBBEJ1cm4CCQEMdHJ5R2V0QmluYXJ5AQITZ2xvYmFsX3Bvb2xUb2tlbl9pZAUJUFJlZGVlbWVkCQDMCAIJAQxJbnRlZ2VyRW50cnkCAhdnbG9iYWxfcG9vbFRva2VuX2Ftb3VudAkAZQIJAQ10cnlHZXRJbnRlZ2VyAQIXZ2xvYmFsX3Bvb2xUb2tlbl9hbW91bnQFCVBSZWRlZW1lZAUDbmlsAWkBBHN3YXACCGFzc2V0T3V0B21pbmltdW0DCQEKaXNTaHV0ZG93bgAJAAIBAhpQb29sIGlzIGN1cnJlbnRseSBzaHV0ZG93bgQDcG10CQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAAECEFtb3VudEluCQEFdmFsdWUBCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAQHQXNzZXRJbggFA3BtdAdhc3NldElkBAppbnZva2VTd2FwCQEKYXNJbnRUdXBsZQEJAP0HBAUEdGhpcwIMc3dhcEludGVybmFsCQDMCAIFCGFzc2V0T3V0CQDMCAIFB21pbmltdW0JAMwIAgUIQW1vdW50SW4JAMwIAgkBDmdldEFzc2V0U3RyaW5nAQUHQXNzZXRJbgkAzAgCCQClCAEIBQFpBmNhbGxlcgUDbmlsBQNuaWwDCQAAAgUKaW52b2tlU3dhcAUKaW52b2tlU3dhcAQOY2xlYW5BbW91bnRPdXQIBQppbnZva2VTd2FwAl8xAwkAAAIFDmNsZWFuQW1vdW50T3V0BQ5jbGVhbkFtb3VudE91dAQJZmVlQW1vdW50CAUKaW52b2tlU3dhcAJfMgMJAAACBQlmZWVBbW91bnQFCWZlZUFtb3VudAQFdG9wVXAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBDmdldEZlZXNBY2NvdW50AAkAawMFCWZlZUFtb3VudAACAAQJAQ1nZXRBc3NldEJ5dGVzAQUIYXNzZXRPdXQFA25pbAMJAAACBQV0b3BVcAUFdG9wVXAJAJQKAgUFdG9wVXAFDmNsZWFuQW1vdW50T3V0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCGludGVybmFsAwVzdGFrZQZhbW91bnQHYXNzZXRJZAMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECC05vdCBhbGxvd2VkCQEMc3Rha2VVbnN0YWtlAwUFc3Rha2UFBmFtb3VudAUHYXNzZXRJZAFpAQhzdGFrZUFsbAAJAQxzdGFrZVVuc3Rha2UDBgkAZQIJAQ10cnlHZXRJbnRlZ2VyAQIUZ2xvYmFsX1dBVkVTX2JhbGFuY2UJAQ10cnlHZXRJbnRlZ2VyAQIObGVhc2luZ19hbW91bnQCBVdBVkVTAWkBDHN3YXBJbnRlcm5hbAUIYXNzZXRPdXQHbWluaW11bQhBbW91bnRJbgdBc3NldEluBmNhbGxlcgMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECG1lvdSBjYW50IGNhbGwgdGhpcyBkaXJlY3RseQQIQXNzZXRPdXQJAQ1nZXRBc3NldEJ5dGVzAQUIYXNzZXRPdXQEA2RheQkBF2NhbGN1bGF0ZURheXNTaW5jZVN0YXJ0AAQHcmV2ZW5ldQkBDXRyeUdldEludGVnZXIBCQEXcmV2ZW5ldUZvckRheUJ5QXNzZXRPdXQCBQNkYXkFCGFzc2V0T3V0BA5Bc3NldEluQmFsYW5jZQkBDXRyeUdldEludGVnZXIBCQCsAgIJAKwCAgIHZ2xvYmFsXwUHQXNzZXRJbgIIX2JhbGFuY2UDCQAAAgUOQXNzZXRJbkJhbGFuY2UFDkFzc2V0SW5CYWxhbmNlBA9Bc3NldE91dEJhbGFuY2UJAQ10cnlHZXRJbnRlZ2VyAQkArAICCQCsAgICB2dsb2JhbF8FCGFzc2V0T3V0AghfYmFsYW5jZQMJAAACBQ9Bc3NldE91dEJhbGFuY2UFD0Fzc2V0T3V0QmFsYW5jZQQJQW1vdW50T3V0CQESY2FsY3VsYXRlT3V0QW1vdW50BQUIQW1vdW50SW4JAQ1nZXRBc3NldEJ5dGVzAQUHQXNzZXRJbgUIQXNzZXRPdXQFDkFzc2V0SW5CYWxhbmNlBQ9Bc3NldE91dEJhbGFuY2UDCQAAAgUJQW1vdW50T3V0BQlBbW91bnRPdXQECWZlZUFtb3VudAkAawMFCUFtb3VudE91dAUDRmVlBQhGZWVTY2FsZQMJAAACBQlmZWVBbW91bnQFCWZlZUFtb3VudAQOY2xlYW5BbW91bnRPdXQJAGUCBQlBbW91bnRPdXQFCWZlZUFtb3VudAMJAAACBQ5jbGVhbkFtb3VudE91dAUOY2xlYW5BbW91bnRPdXQDCQBmAgUHbWluaW11bQUOY2xlYW5BbW91bnRPdXQJAAIBCQCsAgICK2Ftb3VudCB0byByZWNpZXZlIGlzIGxvd2VyIHRoYW4gZ2l2ZW4gb25lOiAJAKQDAQUOY2xlYW5BbW91bnRPdXQDCQBmAgAACQBlAgUPQXNzZXRPdXRCYWxhbmNlBQlBbW91bnRPdXQJAAIBAhtjb250cmFjdCBpcyBvdXQgb2YgcmVzZXJ2ZXMDCQAAAgUIQXNzZXRPdXQJAQ1nZXRBc3NldEJ5dGVzAQUHQXNzZXRJbgkAAgECGHRoaXMgc3dhcCBpcyBub3QgYWxsb3dlZAQJdm9sdW1lS2V5CQEQdm9sdW1lRm9yRGF5QnlJbgIFA2RheQUHQXNzZXRJbgQMbmV3QmFsYW5jZUluCQBkAgUOQXNzZXRJbkJhbGFuY2UFCEFtb3VudEluAwkAAAIFDG5ld0JhbGFuY2VJbgUMbmV3QmFsYW5jZUluBAVzdGFrZQkA/QcEBQR0aGlzAghpbnRlcm5hbAkAzAgCBgkAzAgCBQhBbW91bnRJbgkAzAgCBQdBc3NldEluBQNuaWwFA25pbAMJAAACBQVzdGFrZQUFc3Rha2UEDW5ld0JhbGFuY2VPdXQJAGUCBQ9Bc3NldE91dEJhbGFuY2UFCUFtb3VudE91dAMJAAACBQ1uZXdCYWxhbmNlT3V0BQ1uZXdCYWxhbmNlT3V0BAd1bnN0YWtlCQD9BwQFBHRoaXMCCGludGVybmFsCQDMCAIHCQDMCAIJAGQCBQ5jbGVhbkFtb3VudE91dAkAawMFCWZlZUFtb3VudAADAAQJAMwIAgUIYXNzZXRPdXQFA25pbAUDbmlsAwkAAAIFB3Vuc3Rha2UFB3Vuc3Rha2UJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgICB2dsb2JhbF8FCGFzc2V0T3V0AghfYmFsYW5jZQkAZAIFDW5ld0JhbGFuY2VPdXQJAGsDBQlmZWVBbW91bnQAAQAECQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEFBmNhbGxlcgUOY2xlYW5BbW91bnRPdXQFCEFzc2V0T3V0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgIHZ2xvYmFsXwUHQXNzZXRJbgIIX2JhbGFuY2UFDG5ld0JhbGFuY2VJbgkAzAgCCQEMSW50ZWdlckVudHJ5AgIOZGF5c19zaW5jZV9hcHkFA2RheQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBF3JldmVuZXVGb3JEYXlCeUFzc2V0T3V0AgUDZGF5BQhhc3NldE91dAkAZAIFB3JldmVuZXUFCWZlZUFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgUJdm9sdW1lS2V5BQhBbW91bnRJbgUDbmlsCQCUCgIFDmNsZWFuQW1vdW50T3V0BQlmZWVBbW91bnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAnR4AQZ2ZXJpZnkAAwkBCWlzVGVzdEVudgAJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAIBQJ0eA9zZW5kZXJQdWJsaWNLZXkECWZpcnN0VXNlcgEgURzk/Wb/EmnS8VoUnzuy4vQ7f8HLaCeiNF5sONdX3W0ECnNlY29uZFVzZXIBIMFs347t041zj4ui+fqJD/R1zUQbVHJSo7Sc0lakLeB1BAl0aGlyZFVzZXIBIOdb9I6q0vlJnm6EJrj5fh/cZ6h93Cu41Op7zfJoCsElBA9maXJzdFVzZXJTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQlmaXJzdFVzZXIAAQMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAEFCWZpcnN0VXNlcgABAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAgUJZmlyc3RVc2VyAAEAAAQQc2Vjb25kVXNlclNpZ25lZAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFCnNlY29uZFVzZXIAAQMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAEFCnNlY29uZFVzZXIAAQMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAIFCnNlY29uZFVzZXIAAQAABA90aGlyZFVzZXJTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQl0aGlyZFVzZXIAAQMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAEFCXRoaXJkVXNlcgABAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAgUJdGhpcmRVc2VyAAEAAAQPc2lnbmF0dXJlc0NvdW50CQBkAgkAZAIFD2ZpcnN0VXNlclNpZ25lZAUQc2Vjb25kVXNlclNpZ25lZAUPdGhpcmRVc2VyU2lnbmVkBAckbWF0Y2gwBQJ0eAkAZwIFD3NpZ25hdHVyZXNDb3VudAAC9BjUyg==", "height": 3847181, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: BQ467q3vvXV1dpWsZzFH1Wgn5SGcpZFwdRKJJTyGqec3 Next: GPw9BWntMZqhdRegxuBxFcUr5xanawRVTLKceWXY8ymG Diff:
OldNewDifferences
7979 func addIntToList (accum,item) = (accum ++ [parseIntValue(item)])
8080
8181
82-func reveneuForDayByAsset (day,assetId) = ((("reveneu_day_" + assetId) + "_") + toString(day))
82+func reveneuForDayByAssetOut (day,assetId) = ((("reveneu_day_" + assetId) + "_") + toString(day))
83+
84+
85+func volumeForDayByIn (day,assetId) = ((("volume_day_" + assetId) + "_") + toString(day))
8386
8487
8588 let T = tryGetInteger("static_tokensAmount")
511514 let amount = payment.amount
512515 let aBalance = tryGetInteger((("global_" + getAssetString(asset)) + "_balance"))
513516 let day = calculateDaysSinceStart()
514- let reveneu = tryGetInteger(reveneuForDayByAsset(day, getAssetString(asset)))
515-[IntegerEntry((("global_" + getAssetString(asset)) + "_balance"), (aBalance + amount)), IntegerEntry("days_since_apy", day), IntegerEntry(reveneuForDayByAsset(day, getAssetString(asset)), (reveneu + amount))]
517+ let reveneu = tryGetInteger(reveneuForDayByAssetOut(day, getAssetString(asset)))
518+[IntegerEntry((("global_" + getAssetString(asset)) + "_balance"), (aBalance + amount)), IntegerEntry("days_since_apy", day), IntegerEntry(reveneuForDayByAssetOut(day, getAssetString(asset)), (reveneu + amount))]
516519 }
517520 }
518521
764767 else {
765768 let AssetOut = getAssetBytes(assetOut)
766769 let day = calculateDaysSinceStart()
767- let reveneu = tryGetInteger(reveneuForDayByAsset(day, assetOut))
770+ let reveneu = tryGetInteger(reveneuForDayByAssetOut(day, assetOut))
768771 let AssetInBalance = tryGetInteger((("global_" + AssetIn) + "_balance"))
769772 if ((AssetInBalance == AssetInBalance))
770773 then {
786789 else if ((AssetOut == getAssetBytes(AssetIn)))
787790 then throw("this swap is not allowed")
788791 else {
792+ let volumeKey = volumeForDayByIn(day, AssetIn)
789793 let newBalanceIn = (AssetInBalance + AmountIn)
790794 if ((newBalanceIn == newBalanceIn))
791795 then {
797801 then {
798802 let unstake = reentrantInvoke(this, "internal", [false, (cleanAmountOut + fraction(feeAmount, 3, 4)), assetOut], nil)
799803 if ((unstake == unstake))
800- then $Tuple2([IntegerEntry((("global_" + assetOut) + "_balance"), (newBalanceOut + fraction(feeAmount, 1, 4))), ScriptTransfer(addressFromStringValue(caller), cleanAmountOut, AssetOut), IntegerEntry((("global_" + AssetIn) + "_balance"), newBalanceIn), IntegerEntry("days_since_apy", day), IntegerEntry(reveneuForDayByAsset(day, assetOut), reveneu)], $Tuple2(cleanAmountOut, feeAmount))
804+ then $Tuple2([IntegerEntry((("global_" + assetOut) + "_balance"), (newBalanceOut + fraction(feeAmount, 1, 4))), ScriptTransfer(addressFromStringValue(caller), cleanAmountOut, AssetOut), IntegerEntry((("global_" + AssetIn) + "_balance"), newBalanceIn), IntegerEntry("days_since_apy", day), IntegerEntry(reveneuForDayByAssetOut(day, assetOut), (reveneu + feeAmount)), IntegerEntry(volumeKey, AmountIn)], $Tuple2(cleanAmountOut, feeAmount))
801805 else throw("Strict value is not equal to itself.")
802806 }
803807 else throw("Strict value is not equal to itself.")
822826 func verify () = if (isTestEnv())
823827 then sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
824828 else {
825- let firstUser = base58'FzsTVRXqD46KW5yj6qGNVrsouvWjpCQvD1446A96iGt4'
829+ let firstUser = base58'6TdaXEfhnjYquvPf3yV7MFxt2CbgFmaqsvGwkKfXtKi4'
826830 let secondUser = base58'E23yUg8eun5nXB1nZRDf7RTyRADKxQhGNXdpTYonEvtU'
827831 let thirdUser = base58'Ga8WEBTPXbHuoXRD355mQ6ms8PsM2RFYKeA1mEP32CFe'
828832 let firstUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], firstUser))
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let startTsMs = 1679961601000
55
66 func calculateDaysSinceStart () = {
77 let diff = (lastBlock.timestamp - startTsMs)
88 let daysPassed = (diff / (86400 * 1000))
99 daysPassed
1010 }
1111
1212
1313 func asIntTuple (value) = match value {
1414 case int: (Int, Int) =>
1515 int
1616 case _ =>
1717 throw("Wrong type, expected: Tuple Int")
1818 }
1919
2020
2121 func getOracleAddress () = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(this, "static_oracle"), "oracle not found!")), "could not parse oracle")
2222
2323
2424 func getFeesAccount () = addressFromStringValue(valueOrErrorMessage(getString(getOracleAddress(), "static_feeAggregator"), "static_feeAggregator not found!"))
2525
2626
2727 func getNodeAccount () = addressFromStringValue(valueOrErrorMessage(getString(getOracleAddress(), "static_nodeAddress"), "node_address not found!"))
2828
2929
3030 func tryGetInteger (key) = match getInteger(this, key) {
3131 case b: Int =>
3232 b
3333 case _ =>
3434 0
3535 }
3636
3737
3838 func tryGetBinary (key) = match getBinary(this, key) {
3939 case b: ByteVector =>
4040 b
4141 case _ =>
4242 base58''
4343 }
4444
4545
4646 func tryGetString (key) = match getString(this, key) {
4747 case b: String =>
4848 b
4949 case _ =>
5050 ""
5151 }
5252
5353
5454 func getAssetString (assetId) = match assetId {
5555 case b: ByteVector =>
5656 toBase58String(b)
5757 case _ =>
5858 "WAVES"
5959 }
6060
6161
6262 func getAssetBytes (assetIdStr) = if ((assetIdStr == "WAVES"))
6363 then unit
6464 else fromBase58String(assetIdStr)
6565
6666
6767 func addAssetBytesToList (accum,item) = (accum ++ [getAssetBytes(item)])
6868
6969
7070 func addAssetWeightToList (accum,item) = (accum ++ [tryGetInteger((("static_" + getAssetString(item)) + "_weight"))])
7171
7272
7373 func addAssetDecimalsToList (accum,item) = (accum ++ [tryGetInteger((("static_" + getAssetString(item)) + "_decimals"))])
7474
7575
7676 func addAssetScaleToList (accum,item) = (accum ++ [tryGetInteger((("static_" + getAssetString(item)) + "_scale"))])
7777
7878
7979 func addIntToList (accum,item) = (accum ++ [parseIntValue(item)])
8080
8181
82-func reveneuForDayByAsset (day,assetId) = ((("reveneu_day_" + assetId) + "_") + toString(day))
82+func reveneuForDayByAssetOut (day,assetId) = ((("reveneu_day_" + assetId) + "_") + toString(day))
83+
84+
85+func volumeForDayByIn (day,assetId) = ((("volume_day_" + assetId) + "_") + toString(day))
8386
8487
8588 let T = tryGetInteger("static_tokensAmount")
8689
8790 let assetIds = {
8891 let $l = split(tryGetString("static_tokenIds"), ",")
8992 let $s = size($l)
9093 let $acc0 = nil
9194 func $f0_1 ($a,$i) = if (($i >= $s))
9295 then $a
9396 else addAssetBytesToList($a, $l[$i])
9497
9598 func $f0_2 ($a,$i) = if (($i >= $s))
9699 then $a
97100 else throw("List size exceeds 3")
98101
99102 $f0_2($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3)
100103 }
101104
102105 let AssetsWeights = {
103106 let $l = assetIds
104107 let $s = size($l)
105108 let $acc0 = nil
106109 func $f1_1 ($a,$i) = if (($i >= $s))
107110 then $a
108111 else addAssetWeightToList($a, $l[$i])
109112
110113 func $f1_2 ($a,$i) = if (($i >= $s))
111114 then $a
112115 else throw("List size exceeds 3")
113116
114117 $f1_2($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3)
115118 }
116119
117120 let Decimals = {
118121 let $l = assetIds
119122 let $s = size($l)
120123 let $acc0 = nil
121124 func $f2_1 ($a,$i) = if (($i >= $s))
122125 then $a
123126 else addAssetDecimalsToList($a, $l[$i])
124127
125128 func $f2_2 ($a,$i) = if (($i >= $s))
126129 then $a
127130 else throw("List size exceeds 3")
128131
129132 $f2_2($f2_1($f2_1($f2_1($acc0, 0), 1), 2), 3)
130133 }
131134
132135 let Scales = {
133136 let $l = assetIds
134137 let $s = size($l)
135138 let $acc0 = nil
136139 func $f3_1 ($a,$i) = if (($i >= $s))
137140 then $a
138141 else addAssetScaleToList($a, $l[$i])
139142
140143 func $f3_2 ($a,$i) = if (($i >= $s))
141144 then $a
142145 else throw("List size exceeds 3")
143146
144147 $f3_2($f3_1($f3_1($f3_1($acc0, 0), 1), 2), 3)
145148 }
146149
147150 let stakeId = tryGetString("last_stake_id")
148151
149152 let Fee = tryGetInteger("static_fee")
150153
151154 let AssetsWeightsDecimals = 2
152155
153156 let Scale = 10000
154157
155158 let Scale8 = 100000000
156159
157160 let FeeScale = 10000
158161
159162 let PoolTokenDecimals = 8
160163
161164 let PoolTokenScale = pow(10, 0, PoolTokenDecimals, 0, 0, HALFUP)
162165
163166 let earnedAssets = assetIds
164167
165168 func isShutdown () = {
166169 let shutdown = if ((tryGetString("static_oracle") != ""))
167170 then match getBoolean(getOracleAddress(), "amm_shutdown") {
168171 case x: Boolean =>
169172 x
170173 case _ =>
171174 false
172175 }
173176 else false
174177 let shutdown2 = match getBoolean(this, "is_shutdown") {
175178 case x: Boolean =>
176179 x
177180 case _ =>
178181 false
179182 }
180183 if (shutdown)
181184 then true
182185 else shutdown2
183186 }
184187
185188
186189 func canUpdate () = if ((tryGetString("static_oracle") != ""))
187190 then match getBoolean(getOracleAddress(), "amm_tx") {
188191 case x: Boolean =>
189192 x
190193 case _ =>
191194 true
192195 }
193196 else true
194197
195198
196199 func getCurrentTokenBalance (tokenType) = {
197200 let tokenId = getAssetString(assetIds[tokenType])
198201 tryGetInteger((("global_" + tokenId) + "_balance"))
199202 }
200203
201204
202205 func calculatePIssued (amount,tokenId) = {
203206 let Psupply = tryGetInteger("global_poolToken_amount")
204207 let Balance = tryGetInteger((("global_" + getAssetString(tokenId)) + "_balance"))
205208 fraction(amount, Psupply, Balance, DOWN)
206209 }
207210
208211
209212 func getMinPIssued (payments) = {
210213 func handler (accum,current) = {
211214 let PIssued = calculatePIssued(current.amount, current.assetId)
212215 if ((PIssued == 0))
213216 then throw("one of the tokens amounts is too low")
214217 else if (if ((accum == 0))
215218 then true
216219 else (accum > PIssued))
217220 then PIssued
218221 else accum
219222 }
220223
221224 let minPIssed = {
222225 let $l = payments
223226 let $s = size($l)
224227 let $acc0 = 0
225228 func $f4_1 ($a,$i) = if (($i >= $s))
226229 then $a
227230 else handler($a, $l[$i])
228231
229232 func $f4_2 ($a,$i) = if (($i >= $s))
230233 then $a
231234 else throw("List size exceeds 3")
232235
233236 $f4_2($f4_1($f4_1($f4_1($acc0, 0), 1), 2), 3)
234237 }
235238 minPIssed
236239 }
237240
238241
239242 func checkTokensValidity (payments) = {
240243 func handler1 (accum,payment) = (accum ++ [payment.assetId])
241244
242245 let ids = {
243246 let $l = payments
244247 let $s = size($l)
245248 let $acc0 = nil
246249 func $f4_1 ($a,$i) = if (($i >= $s))
247250 then $a
248251 else handler1($a, $l[$i])
249252
250253 func $f4_2 ($a,$i) = if (($i >= $s))
251254 then $a
252255 else throw("List size exceeds 3")
253256
254257 $f4_2($f4_1($f4_1($f4_1($acc0, 0), 1), 2), 3)
255258 }
256259 if ((ids == ids))
257260 then {
258261 func handler2 (accum,assetId) = if ((indexOf(ids, assetId) != unit))
259262 then (accum + 1)
260263 else throw(("asset not attached: " + getAssetString(assetId)))
261264
262265 let checks = {
263266 let $l = assetIds
264267 let $s = size($l)
265268 let $acc0 = 0
266269 func $f5_1 ($a,$i) = if (($i >= $s))
267270 then $a
268271 else handler2($a, $l[$i])
269272
270273 func $f5_2 ($a,$i) = if (($i >= $s))
271274 then $a
272275 else throw("List size exceeds 3")
273276
274277 $f5_2($f5_1($f5_1($f5_1($acc0, 0), 1), 2), 3)
275278 }
276279 if ((checks == checks))
277280 then true
278281 else throw("Strict value is not equal to itself.")
279282 }
280283 else throw("Strict value is not equal to itself.")
281284 }
282285
283286
284287 func stakeUnstake (stake,amount,assetId) = if (if ((assetId == "WAVES"))
285288 then (amount > 0)
286289 else false)
287290 then {
288291 let leasingAmount = valueOrElse(getInteger(this, "leasing_amount"), 0)
289292 let newLeaseAmount = if (stake)
290293 then (leasingAmount + amount)
291294 else (leasingAmount - amount)
292295 let newLease = Lease(getNodeAccount(), newLeaseAmount)
293296 let newLeaseId = calculateLeaseId(newLease)
294297 let data = [newLease, StringEntry("last_stake_id", toBase58String(newLeaseId)), IntegerEntry("leasing_amount", newLeaseAmount)]
295298 if ((stakeId != ""))
296299 then ([LeaseCancel(fromBase58String(stakeId))] ++ data)
297300 else data
298301 }
299302 else nil
300303
301304
302305 func handlePoolTokensAdd (PIssued,payments,userAddress,needChange) = {
303306 func getTokenPaymentAmount (tokenId) = {
304307 func handler (accum,payment) = if ((payment.assetId == tokenId))
305308 then payment.amount
306309 else accum
307310
308311 let $l = payments
309312 let $s = size($l)
310313 let $acc0 = 0
311314 func $f4_1 ($a,$i) = if (($i >= $s))
312315 then $a
313316 else handler($a, $l[$i])
314317
315318 func $f4_2 ($a,$i) = if (($i >= $s))
316319 then $a
317320 else throw("List size exceeds 3")
318321
319322 $f4_2($f4_1($f4_1($f4_1($acc0, 0), 1), 2), 3)
320323 }
321324
322325 func handleTokenChange (accum,tokenId) = {
323326 let Bk = tryGetInteger((("global_" + getAssetString(tokenId)) + "_balance"))
324327 let PSupply = tryGetInteger("global_poolToken_amount")
325328 let tokenDecimals = tryGetInteger((("static_" + getAssetString(tokenId)) + "_scale"))
326329 let DkTemp = fraction((fraction((PSupply + PIssued), tokenDecimals, PSupply, CEILING) - tokenDecimals), Bk, tokenDecimals, CEILING)
327330 let paymentAmount = getTokenPaymentAmount(tokenId)
328331 let Dk = min([DkTemp, paymentAmount])
329332 let toReturn = ((if ((paymentAmount != 0))
330333 then paymentAmount
331334 else 0) - Dk)
332335 let t = if (if (needChange)
333336 then (toReturn > 0)
334337 else false)
335338 then [ScriptTransfer(userAddress, toReturn, tokenId)]
336339 else nil
337340 let stakeUnstakeData = if ((getAssetString(tokenId) == "WAVES"))
338341 then stakeUnstake(true, Dk, "WAVES")
339342 else nil
340343 (((accum ++ t) ++ stakeUnstakeData) ++ [IntegerEntry((("global_" + getAssetString(tokenId)) + "_balance"), (Bk + Dk))])
341344 }
342345
343346 let $l = assetIds
344347 let $s = size($l)
345348 let $acc0 = nil
346349 func $f4_1 ($a,$i) = if (($i >= $s))
347350 then $a
348351 else handleTokenChange($a, $l[$i])
349352
350353 func $f4_2 ($a,$i) = if (($i >= $s))
351354 then $a
352355 else throw("List size exceeds 3")
353356
354357 $f4_2($f4_1($f4_1($f4_1($acc0, 0), 1), 2), 3)
355358 }
356359
357360
358361 func handlePoolTokensRedeem (PRedeemed,userAddress) = {
359362 func handleTokenRedeem (accum,tokenId) = {
360363 let Bk = tryGetInteger((("global_" + getAssetString(tokenId)) + "_balance"))
361364 let PSupply = tryGetInteger("global_poolToken_amount")
362365 let tokenDecimals = tryGetInteger((("static_" + getAssetString(tokenId)) + "_scale"))
363366 let amount = toInt(fraction((toBigInt(Scale8) - fraction(toBigInt((PSupply - PRedeemed)), toBigInt(Scale8), toBigInt(PSupply), CEILING)), toBigInt(Bk), toBigInt(Scale8), DOWN))
364367 let stakeUnstakeData = if ((getAssetString(tokenId) == "WAVES"))
365368 then stakeUnstake(false, amount, "WAVES")
366369 else nil
367370 ((accum ++ stakeUnstakeData) ++ [IntegerEntry((("global_" + getAssetString(tokenId)) + "_balance"), (Bk - amount)), ScriptTransfer(userAddress, amount, tokenId)])
368371 }
369372
370373 let $l = assetIds
371374 let $s = size($l)
372375 let $acc0 = nil
373376 func $f4_1 ($a,$i) = if (($i >= $s))
374377 then $a
375378 else handleTokenRedeem($a, $l[$i])
376379
377380 func $f4_2 ($a,$i) = if (($i >= $s))
378381 then $a
379382 else throw("List size exceeds 3")
380383
381384 $f4_2($f4_1($f4_1($f4_1($acc0, 0), 1), 2), 3)
382385 }
383386
384387
385388 func calculateOutAmount (AmountIn,assetIn,assetOut,BalanceIn,BalanceOut) = {
386389 let IndexIn = value(indexOf(assetIds, assetIn))
387390 let IndexOut = value(indexOf(assetIds, assetOut))
388391 if ((IndexIn == IndexOut))
389392 then throw("wrong tokens pair")
390393 else fraction(BalanceOut, ((Scale8 * Scale8) - toInt(pow(fraction(toBigInt(BalanceIn), toBigInt((Scale8 * Scale8)), toBigInt((BalanceIn + AmountIn)), HALFUP), 16, toBigInt(fraction(AssetsWeights[IndexIn], 10000, AssetsWeights[IndexOut])), 4, 16, CEILING))), (Scale8 * Scale8), DOWN)
391394 }
392395
393396
394397 func calculateMinToGet (asset1,asset2,amountToSwap) = {
395398 let kBalanceA = (("global_" + asset1) + "_balance")
396399 let A_asset_balance = getIntegerValue(this, kBalanceA)
397400 let kBalanceB = (("global_" + asset2) + "_balance")
398401 let B_asset_balance = getIntegerValue(this, kBalanceB)
399402 let toGet = calculateOutAmount(amountToSwap, getAssetBytes(asset1), getAssetBytes(asset2), A_asset_balance, B_asset_balance)
400403 let feeAmount = fraction(toGet, Fee, FeeScale)
401404 if ((feeAmount == feeAmount))
402405 then {
403406 let cleanAmountOut = (toGet - feeAmount)
404407 if ((cleanAmountOut == cleanAmountOut))
405408 then cleanAmountOut
406409 else throw("Strict value is not equal to itself.")
407410 }
408411 else throw("Strict value is not equal to itself.")
409412 }
410413
411414
412415 func getTokenBalance (assetId) = match assetId {
413416 case t: ByteVector =>
414417 assetBalance(this, t)
415418 case _ =>
416419 wavesBalance(this).regular
417420 }
418421
419422
420423 func calculateCurrentAssetInterest (assetId,assetIdStr,aBalance,tokenEarningsLastCheck) = {
421424 let totalStaked = tryGetInteger("global_indexStaked")
422425 let tokenBalanceLastCheck = tokenEarningsLastCheck
423426 let currentBalanceDelta = (getTokenBalance(assetId) - aBalance)
424427 let currentTokenEarnings = if ((currentBalanceDelta > tokenBalanceLastCheck))
425428 then currentBalanceDelta
426429 else tokenBalanceLastCheck
427430 let newEarnings = (currentTokenEarnings - tokenBalanceLastCheck)
428431 let newInterest = if ((totalStaked == 0))
429432 then 0
430433 else fraction(newEarnings, Scale8, totalStaked)
431434 let lastCheckInterest = tryGetInteger((("global_lastCheck_" + assetIdStr) + "_interest"))
432435 (lastCheckInterest + newInterest)
433436 }
434437
435438
436439 func claimResult (address) = {
437440 let addressStr = toString(address)
438441 let shareAmount = tryGetInteger((addressStr + "_indexStaked"))
439442 func handler (accum,assetId) = {
440443 let assetIdStr = getAssetString(assetId)
441444 let aBalance = tryGetInteger((("global_" + getAssetString(assetId)) + "_balance"))
442445 let tokenEarningsLastCheck = tryGetInteger((("global_lastCheck_" + assetIdStr) + "_earnings"))
443446 let currentTokenInterest = calculateCurrentAssetInterest(assetId, assetIdStr, aBalance, tokenEarningsLastCheck)
444447 let currentTokenEarnings = max([tokenEarningsLastCheck, (getTokenBalance(assetId) - aBalance)])
445448 let rewardAmount = fraction(shareAmount, (currentTokenInterest - tryGetInteger((((addressStr + "_lastCheck_") + assetIdStr) + "_interest"))), Scale8)
446449 let transfer = if ((rewardAmount == 0))
447450 then nil
448451 else [ScriptTransfer(address, rewardAmount, assetId)]
449452 let claimed = tryGetInteger((((addressStr + "_lastCheck_") + assetIdStr) + "_claimed"))
450453 ((accum ++ transfer) ++ [IntegerEntry((("global_lastCheck_" + assetIdStr) + "_earnings"), (currentTokenEarnings - rewardAmount)), IntegerEntry((("global_lastCheck_" + assetIdStr) + "_interest"), currentTokenInterest), IntegerEntry((((addressStr + "_lastCheck_") + assetIdStr) + "_interest"), currentTokenInterest), IntegerEntry((((addressStr + "_lastCheck_") + assetIdStr) + "_claimed"), (claimed + rewardAmount))])
451454 }
452455
453456 let accum = {
454457 let $l = earnedAssets
455458 let $s = size($l)
456459 let $acc0 = nil
457460 func $f4_1 ($a,$i) = if (($i >= $s))
458461 then $a
459462 else handler($a, $l[$i])
460463
461464 func $f4_2 ($a,$i) = if (($i >= $s))
462465 then $a
463466 else throw("List size exceeds 3")
464467
465468 $f4_2($f4_1($f4_1($f4_1($acc0, 0), 1), 2), 3)
466469 }
467470 (accum ++ [IntegerEntry((addressStr + "_lastClaim"), lastBlock.timestamp)])
468471 }
469472
470473
471474 func indexStakeResult (addressStr,amount) = {
472475 let li = claimResult(addressFromStringValue(addressStr))
473476 (li ++ [IntegerEntry((addressStr + "_indexStaked"), (tryGetInteger((addressStr + "_indexStaked")) + amount)), IntegerEntry("global_indexStaked", (tryGetInteger("global_indexStaked") + amount))])
474477 }
475478
476479
477480 func sum (accum,n) = (accum + parseIntValue(n))
478481
479482
480483 func setOracleAddressAndInitiate (address) = [StringEntry("static_oracle", address)]
481484
482485
483486 func isTestEnv () = {
484487 let testenv = match getBoolean(this, "TESTENV") {
485488 case x: Boolean =>
486489 x
487490 case _ =>
488491 false
489492 }
490493 testenv
491494 }
492495
493496
494497 @Callable(i)
495498 func readOnlyFunc (asset1,asset2,amountToSwap) = {
496499 let amountOut = calculateMinToGet(asset1, asset2, amountToSwap)
497500 [IntegerEntry("DEBUG", amountOut)]
498501 }
499502
500503
501504
502505 @Callable(i)
503506 func topUpFunds () = if ((size(i.payments) != 1))
504507 then throw("Wrong payments attached!")
505508 else {
506509 let payment = i.payments[0]
507510 let asset = payment.assetId
508511 if ((indexOf(assetIds, asset) == unit))
509512 then throw("Not supported assetId")
510513 else {
511514 let amount = payment.amount
512515 let aBalance = tryGetInteger((("global_" + getAssetString(asset)) + "_balance"))
513516 let day = calculateDaysSinceStart()
514- let reveneu = tryGetInteger(reveneuForDayByAsset(day, getAssetString(asset)))
515-[IntegerEntry((("global_" + getAssetString(asset)) + "_balance"), (aBalance + amount)), IntegerEntry("days_since_apy", day), IntegerEntry(reveneuForDayByAsset(day, getAssetString(asset)), (reveneu + amount))]
517+ let reveneu = tryGetInteger(reveneuForDayByAssetOut(day, getAssetString(asset)))
518+[IntegerEntry((("global_" + getAssetString(asset)) + "_balance"), (aBalance + amount)), IntegerEntry("days_since_apy", day), IntegerEntry(reveneuForDayByAssetOut(day, getAssetString(asset)), (reveneu + amount))]
516519 }
517520 }
518521
519522
520523
521524 @Callable(i)
522525 func preInit (assetIdsStr,assetWeightsStr,baseTokenIdStr,poolDomain) = if ((this != i.caller))
523526 then throw("admin only")
524527 else if ((size(poolDomain) > 13))
525528 then throw("too large pool domain")
526529 else {
527530 let assetIdsStrLi = split(assetIdsStr, ",")
528531 let assetIdsLi = {
529532 let $l = assetIdsStrLi
530533 let $s = size($l)
531534 let $acc0 = nil
532535 func $f4_1 ($a,$i) = if (($i >= $s))
533536 then $a
534537 else addAssetBytesToList($a, $l[$i])
535538
536539 func $f4_2 ($a,$i) = if (($i >= $s))
537540 then $a
538541 else throw("List size exceeds 3")
539542
540543 $f4_2($f4_1($f4_1($f4_1($acc0, 0), 1), 2), 3)
541544 }
542545 let assetWeightsStrLi = split(assetWeightsStr, ",")
543546 let assetWeightsSum = {
544547 let $l = assetWeightsStrLi
545548 let $s = size($l)
546549 let $acc0 = 0
547550 func $f5_1 ($a,$i) = if (($i >= $s))
548551 then $a
549552 else sum($a, $l[$i])
550553
551554 func $f5_2 ($a,$i) = if (($i >= $s))
552555 then $a
553556 else throw("List size exceeds 3")
554557
555558 $f5_2($f5_1($f5_1($f5_1($acc0, 0), 1), 2), 3)
556559 }
557560 func addTokenDataEntries (accum,assetNum) = if ((assetNum >= size(assetIdsLi)))
558561 then accum
559562 else {
560563 let assetDecimals = match assetIdsLi[assetNum] {
561564 case x: ByteVector =>
562565 value(assetInfo(assetIdsLi[assetNum])).decimals
563566 case _ =>
564567 8
565568 }
566569 (accum ++ [IntegerEntry((("static_" + assetIdsStrLi[assetNum]) + "_scale"), pow(10, 0, assetDecimals, 0, 0, DOWN)), IntegerEntry((("static_" + assetIdsStrLi[assetNum]) + "_decimals"), assetDecimals), IntegerEntry((("static_" + assetIdsStrLi[assetNum]) + "_weight"), value(parseInt(assetWeightsStrLi[assetNum])))])
567570 }
568571
569572 if ((assetWeightsSum != 100))
570573 then throw("sum of token weights must be equal to 100")
571574 else ({
572575 let $l = [0, 1, 2]
573576 let $s = size($l)
574577 let $acc0 = nil
575578 func $f6_1 ($a,$i) = if (($i >= $s))
576579 then $a
577580 else addTokenDataEntries($a, $l[$i])
578581
579582 func $f6_2 ($a,$i) = if (($i >= $s))
580583 then $a
581584 else throw("List size exceeds 3")
582585
583586 $f6_2($f6_1($f6_1($f6_1($acc0, 0), 1), 2), 3)
584587 } ++ [StringEntry("static_tokenIds", assetIdsStr), StringEntry("static_tokenWeights", assetWeightsStr), IntegerEntry("static_tokensAmount", size(assetIdsLi)), StringEntry("static_poolDomain", poolDomain), StringEntry("static_baseTokenId", baseTokenIdStr), IntegerEntry("static_fee", 100)])
585588 }
586589
587590
588591
589592 @Callable(i)
590593 func init (oracle) = {
591594 func prepareList () = {
592595 func handler (accum,n) = (accum ++ [IntegerEntry((("global_" + getAssetString(n.assetId)) + "_balance"), n.amount)])
593596
594597 let $l = i.payments
595598 let $s = size($l)
596599 let $acc0 = nil
597600 func $f4_1 ($a,$i) = if (($i >= $s))
598601 then $a
599602 else handler($a, $l[$i])
600603
601604 func $f4_2 ($a,$i) = if (($i >= $s))
602605 then $a
603606 else throw("List size exceeds 3")
604607
605608 $f4_2($f4_1($f4_1($f4_1($acc0, 0), 1), 2), 3)
606609 }
607610
608611 func calculatePoolTokensAmount (payments) = {
609612 func handler (accum,pmt) = {
610613 let assetId = pmt.assetId
611614 func handler2 (accum,n) = if ((n == assetId))
612615 then value(indexOf(assetIds, n))
613616 else accum
614617
615618 let Token = {
616619 let $l = assetIds
617620 let $s = size($l)
618621 let $acc0 = 1
619622 func $f4_1 ($a,$i) = if (($i >= $s))
620623 then $a
621624 else handler2($a, $l[$i])
622625
623626 func $f4_2 ($a,$i) = if (($i >= $s))
624627 then $a
625628 else throw("List size exceeds 3")
626629
627630 $f4_2($f4_1($f4_1($f4_1($acc0, 0), 1), 2), 3)
628631 }
629632 fraction(accum, pow(pmt.amount, Decimals[Token], AssetsWeights[Token], AssetsWeightsDecimals, 8, FLOOR), Scale8)
630633 }
631634
632635 let $l = payments
633636 let $s = size($l)
634637 let $acc0 = PoolTokenScale
635638 func $f4_1 ($a,$i) = if (($i >= $s))
636639 then $a
637640 else handler($a, $l[$i])
638641
639642 func $f4_2 ($a,$i) = if (($i >= $s))
640643 then $a
641644 else throw("List size exceeds 3")
642645
643646 $f4_2($f4_1($f4_1($f4_1($acc0, 0), 1), 2), 3)
644647 }
645648
646649 if ((tryGetInteger("global_wasInited") > 0))
647650 then throw("pool already inited")
648651 else {
649652 let initialPoolTokens = calculatePoolTokensAmount(i.payments)
650653 if ((initialPoolTokens == 0))
651654 then throw("you need a bigger tokens amount to launch the pool")
652655 else {
653656 let poolTokenIssue = Issue(("WD " + tryGetString("static_poolDomain")), "WD pool token", initialPoolTokens, PoolTokenDecimals, true, unit, 0)
654657 let poolTokenId = calculateAssetId(poolTokenIssue)
655658 ((prepareList() ++ [poolTokenIssue, IntegerEntry("global_poolToken_amount", initialPoolTokens), IntegerEntry("global_wasInited", 1), BinaryEntry("global_poolToken_id", poolTokenId), StringEntry("static_poolToken_idStr", getAssetString(poolTokenId)), ScriptTransfer(i.caller, initialPoolTokens, poolTokenId)]) ++ setOracleAddressAndInitiate(oracle))
656659 }
657660 }
658661 }
659662
660663
661664
662665 @Callable(i)
663666 func generateIndex (needChange) = if ((size(i.payments) != T))
664667 then throw(("you need to attach all pool tokens. amount of pool tokens: " + toString(T)))
665668 else if (!(checkTokensValidity(i.payments)))
666669 then throw("wrong assets attached")
667670 else {
668671 let PIssued = getMinPIssued(i.payments)
669672 let reissue = Reissue(getBinaryValue("global_poolToken_id"), PIssued, true)
670673 let result = handlePoolTokensAdd(PIssued, i.payments, i.originCaller, needChange)
671674 $Tuple2((result ++ [reissue, ScriptTransfer(i.caller, PIssued, tryGetBinary("global_poolToken_id")), IntegerEntry("global_poolToken_amount", (tryGetInteger("global_poolToken_amount") + PIssued))]), PIssued)
672675 }
673676
674677
675678
676679 @Callable(i)
677680 func stakeIndex () = {
678681 let addressStr = toString(i.originCaller)
679682 let pmt = i.payments[0]
680683 if ((value(pmt.assetId) != tryGetBinary("global_poolToken_id")))
681684 then throw("wrong asset attached")
682685 else indexStakeResult(addressStr, pmt.amount)
683686 }
684687
685688
686689
687690 @Callable(i)
688691 func unstakeIndex (shareAmount) = {
689692 let addressStr = toString(i.originCaller)
690693 let shareAvailable = tryGetInteger((addressStr + "_indexStaked"))
691694 if ((shareAmount > shareAvailable))
692695 then throw("you don't have index tokens available")
693696 else (claimResult(i.originCaller) ++ [IntegerEntry((addressStr + "_indexStaked"), (shareAvailable - shareAmount)), IntegerEntry("global_indexStaked", (tryGetInteger("global_indexStaked") - shareAmount)), ScriptTransfer(i.caller, shareAmount, getBinaryValue("global_poolToken_id"))])
694697 }
695698
696699
697700
698701 @Callable(i)
699702 func claimIndexRewards () = claimResult(i.caller)
700703
701704
702705
703706 @Callable(i)
704707 func redeemIndex (sendToOrigin) = {
705708 let pmt = i.payments[0]
706709 if ((pmt.assetId != tryGetBinary("global_poolToken_id")))
707710 then throw("please attach pool share token")
708711 else {
709712 let PRedeemed = pmt.amount
710713 let result = handlePoolTokensRedeem(PRedeemed, if (sendToOrigin)
711714 then i.originCaller
712715 else i.caller)
713716 (result ++ [Burn(tryGetBinary("global_poolToken_id"), PRedeemed), IntegerEntry("global_poolToken_amount", (tryGetInteger("global_poolToken_amount") - PRedeemed))])
714717 }
715718 }
716719
717720
718721
719722 @Callable(i)
720723 func swap (assetOut,minimum) = if (isShutdown())
721724 then throw("Pool is currently shutdown")
722725 else {
723726 let pmt = value(i.payments[0])
724727 let AmountIn = value(i.payments[0].amount)
725728 let AssetIn = pmt.assetId
726729 let invokeSwap = asIntTuple(reentrantInvoke(this, "swapInternal", [assetOut, minimum, AmountIn, getAssetString(AssetIn), toString(i.caller)], nil))
727730 if ((invokeSwap == invokeSwap))
728731 then {
729732 let cleanAmountOut = invokeSwap._1
730733 if ((cleanAmountOut == cleanAmountOut))
731734 then {
732735 let feeAmount = invokeSwap._2
733736 if ((feeAmount == feeAmount))
734737 then {
735738 let topUp = [ScriptTransfer(getFeesAccount(), fraction(feeAmount, 2, 4), getAssetBytes(assetOut))]
736739 if ((topUp == topUp))
737740 then $Tuple2(topUp, cleanAmountOut)
738741 else throw("Strict value is not equal to itself.")
739742 }
740743 else throw("Strict value is not equal to itself.")
741744 }
742745 else throw("Strict value is not equal to itself.")
743746 }
744747 else throw("Strict value is not equal to itself.")
745748 }
746749
747750
748751
749752 @Callable(i)
750753 func internal (stake,amount,assetId) = if ((i.caller != this))
751754 then throw("Not allowed")
752755 else stakeUnstake(stake, amount, assetId)
753756
754757
755758
756759 @Callable(i)
757760 func stakeAll () = stakeUnstake(true, (tryGetInteger("global_WAVES_balance") - tryGetInteger("leasing_amount")), "WAVES")
758761
759762
760763
761764 @Callable(i)
762765 func swapInternal (assetOut,minimum,AmountIn,AssetIn,caller) = if ((i.caller != this))
763766 then throw("You cant call this directly")
764767 else {
765768 let AssetOut = getAssetBytes(assetOut)
766769 let day = calculateDaysSinceStart()
767- let reveneu = tryGetInteger(reveneuForDayByAsset(day, assetOut))
770+ let reveneu = tryGetInteger(reveneuForDayByAssetOut(day, assetOut))
768771 let AssetInBalance = tryGetInteger((("global_" + AssetIn) + "_balance"))
769772 if ((AssetInBalance == AssetInBalance))
770773 then {
771774 let AssetOutBalance = tryGetInteger((("global_" + assetOut) + "_balance"))
772775 if ((AssetOutBalance == AssetOutBalance))
773776 then {
774777 let AmountOut = calculateOutAmount(AmountIn, getAssetBytes(AssetIn), AssetOut, AssetInBalance, AssetOutBalance)
775778 if ((AmountOut == AmountOut))
776779 then {
777780 let feeAmount = fraction(AmountOut, Fee, FeeScale)
778781 if ((feeAmount == feeAmount))
779782 then {
780783 let cleanAmountOut = (AmountOut - feeAmount)
781784 if ((cleanAmountOut == cleanAmountOut))
782785 then if ((minimum > cleanAmountOut))
783786 then throw(("amount to recieve is lower than given one: " + toString(cleanAmountOut)))
784787 else if ((0 > (AssetOutBalance - AmountOut)))
785788 then throw("contract is out of reserves")
786789 else if ((AssetOut == getAssetBytes(AssetIn)))
787790 then throw("this swap is not allowed")
788791 else {
792+ let volumeKey = volumeForDayByIn(day, AssetIn)
789793 let newBalanceIn = (AssetInBalance + AmountIn)
790794 if ((newBalanceIn == newBalanceIn))
791795 then {
792796 let stake = reentrantInvoke(this, "internal", [true, AmountIn, AssetIn], nil)
793797 if ((stake == stake))
794798 then {
795799 let newBalanceOut = (AssetOutBalance - AmountOut)
796800 if ((newBalanceOut == newBalanceOut))
797801 then {
798802 let unstake = reentrantInvoke(this, "internal", [false, (cleanAmountOut + fraction(feeAmount, 3, 4)), assetOut], nil)
799803 if ((unstake == unstake))
800- then $Tuple2([IntegerEntry((("global_" + assetOut) + "_balance"), (newBalanceOut + fraction(feeAmount, 1, 4))), ScriptTransfer(addressFromStringValue(caller), cleanAmountOut, AssetOut), IntegerEntry((("global_" + AssetIn) + "_balance"), newBalanceIn), IntegerEntry("days_since_apy", day), IntegerEntry(reveneuForDayByAsset(day, assetOut), reveneu)], $Tuple2(cleanAmountOut, feeAmount))
804+ then $Tuple2([IntegerEntry((("global_" + assetOut) + "_balance"), (newBalanceOut + fraction(feeAmount, 1, 4))), ScriptTransfer(addressFromStringValue(caller), cleanAmountOut, AssetOut), IntegerEntry((("global_" + AssetIn) + "_balance"), newBalanceIn), IntegerEntry("days_since_apy", day), IntegerEntry(reveneuForDayByAssetOut(day, assetOut), (reveneu + feeAmount)), IntegerEntry(volumeKey, AmountIn)], $Tuple2(cleanAmountOut, feeAmount))
801805 else throw("Strict value is not equal to itself.")
802806 }
803807 else throw("Strict value is not equal to itself.")
804808 }
805809 else throw("Strict value is not equal to itself.")
806810 }
807811 else throw("Strict value is not equal to itself.")
808812 }
809813 else throw("Strict value is not equal to itself.")
810814 }
811815 else throw("Strict value is not equal to itself.")
812816 }
813817 else throw("Strict value is not equal to itself.")
814818 }
815819 else throw("Strict value is not equal to itself.")
816820 }
817821 else throw("Strict value is not equal to itself.")
818822 }
819823
820824
821825 @Verifier(tx)
822826 func verify () = if (isTestEnv())
823827 then sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
824828 else {
825- let firstUser = base58'FzsTVRXqD46KW5yj6qGNVrsouvWjpCQvD1446A96iGt4'
829+ let firstUser = base58'6TdaXEfhnjYquvPf3yV7MFxt2CbgFmaqsvGwkKfXtKi4'
826830 let secondUser = base58'E23yUg8eun5nXB1nZRDf7RTyRADKxQhGNXdpTYonEvtU'
827831 let thirdUser = base58'Ga8WEBTPXbHuoXRD355mQ6ms8PsM2RFYKeA1mEP32CFe'
828832 let firstUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], firstUser))
829833 then 1
830834 else if (sigVerify(tx.bodyBytes, tx.proofs[1], firstUser))
831835 then 1
832836 else if (sigVerify(tx.bodyBytes, tx.proofs[2], firstUser))
833837 then 1
834838 else 0
835839 let secondUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], secondUser))
836840 then 1
837841 else if (sigVerify(tx.bodyBytes, tx.proofs[1], secondUser))
838842 then 1
839843 else if (sigVerify(tx.bodyBytes, tx.proofs[2], secondUser))
840844 then 1
841845 else 0
842846 let thirdUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], thirdUser))
843847 then 1
844848 else if (sigVerify(tx.bodyBytes, tx.proofs[1], thirdUser))
845849 then 1
846850 else if (sigVerify(tx.bodyBytes, tx.proofs[2], thirdUser))
847851 then 1
848852 else 0
849853 let signaturesCount = ((firstUserSigned + secondUserSigned) + thirdUserSigned)
850854 match tx {
851855 case _ =>
852856 (signaturesCount >= 2)
853857 }
854858 }
855859

github/deemru/w8io/6500d08 
88.05 ms