tx · Gu286d9cn6YFbPHjKBneuPohVb2UcCiKkNK9JambsP9j

3PDB1pdcw6fPCM1WsFmx9VAidTyMouYERC1:  -0.02300000 Waves

2023.03.29 18:44 [3577037] smart account 3PDB1pdcw6fPCM1WsFmx9VAidTyMouYERC1 > SELF 0.00000000 Waves

{ "type": 13, "id": "Gu286d9cn6YFbPHjKBneuPohVb2UcCiKkNK9JambsP9j", "fee": 2300000, "feeAssetId": null, "timestamp": 1680104634938, "version": 2, "chainId": 87, "sender": "3PDB1pdcw6fPCM1WsFmx9VAidTyMouYERC1", "senderPublicKey": "FAdS85KG2ee4mAB8XCDybKpFu79txSRTHQHTFzHcULDn", "proofs": [ "35oGEdWhuNzNwspNHBYCpiykuqo2Moj2Z2uLDNUchky7eGppU7BJT1PQM9B1VuuDm7qceFrD6BqHNpaB6YY7s8vv" ], "script": "base64:BgJGCAISABIGCgQICAgIEgMKAQgSAwoBBBIAEgMKAQQSAwoBARIAEgMKAQQSAwoBARIECgIIARIFCgMEAQgSABIHCgUIAQEICDAACXN0YXJ0VHNNcwDo546s8jABF2NhbGN1bGF0ZURheXNTaW5jZVN0YXJ0AAQEZGlmZgkAZQIIBQlsYXN0QmxvY2sJdGltZXN0YW1wBQlzdGFydFRzTXMECmRheXNQYXNzZWQJAGkCBQRkaWZmCQBoAgCAowUA6AcFCmRheXNQYXNzZWQBCmFzSW50VHVwbGUBBXZhbHVlBAckbWF0Y2gwBQV2YWx1ZQMJAAECBQckbWF0Y2gwAgooSW50LCBJbnQpBANpbnQFByRtYXRjaDAFA2ludAkAAgECH1dyb25nIHR5cGUsIGV4cGVjdGVkOiBUdXBsZSBJbnQBEGdldE9yYWNsZUFkZHJlc3MACQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMCDXN0YXRpY19vcmFjbGUCEW9yYWNsZSBub3QgZm91bmQhAhZjb3VsZCBub3QgcGFyc2Ugb3JhY2xlAQ5nZXRGZWVzQWNjb3VudAAJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCCQEQZ2V0T3JhY2xlQWRkcmVzcwACFHN0YXRpY19mZWVBZ2dyZWdhdG9yAh9zdGF0aWNfZmVlQWdncmVnYXRvciBub3QgZm91bmQhAQ5nZXROb2RlQWNjb3VudAAJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCCQEQZ2V0T3JhY2xlQWRkcmVzcwACEnN0YXRpY19ub2RlQWRkcmVzcwIXbm9kZV9hZGRyZXNzIG5vdCBmb3VuZCEBDXRyeUdldEludGVnZXIBA2tleQQHJG1hdGNoMAkAmggCBQR0aGlzBQNrZXkDCQABAgUHJG1hdGNoMAIDSW50BAFiBQckbWF0Y2gwBQFiAAABDHRyeUdldEJpbmFyeQEDa2V5BAckbWF0Y2gwCQCcCAIFBHRoaXMFA2tleQMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAFiBQckbWF0Y2gwBQFiAQABDHRyeUdldFN0cmluZwEDa2V5BAckbWF0Y2gwCQCdCAIFBHRoaXMFA2tleQMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWIFByRtYXRjaDAFAWICAAEOZ2V0QXNzZXRTdHJpbmcBB2Fzc2V0SWQEByRtYXRjaDAFB2Fzc2V0SWQDCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQBYgUHJG1hdGNoMAkA2AQBBQFiAgVXQVZFUwENZ2V0QXNzZXRCeXRlcwEKYXNzZXRJZFN0cgMJAAACBQphc3NldElkU3RyAgVXQVZFUwUEdW5pdAkA2QQBBQphc3NldElkU3RyARNhZGRBc3NldEJ5dGVzVG9MaXN0AgVhY2N1bQRpdGVtCQDOCAIFBWFjY3VtCQDMCAIJAQ1nZXRBc3NldEJ5dGVzAQUEaXRlbQUDbmlsARRhZGRBc3NldFdlaWdodFRvTGlzdAIFYWNjdW0EaXRlbQkAzggCBQVhY2N1bQkAzAgCCQENdHJ5R2V0SW50ZWdlcgEJAKwCAgkArAICAgdzdGF0aWNfCQEOZ2V0QXNzZXRTdHJpbmcBBQRpdGVtAgdfd2VpZ2h0BQNuaWwBFmFkZEFzc2V0RGVjaW1hbHNUb0xpc3QCBWFjY3VtBGl0ZW0JAM4IAgUFYWNjdW0JAMwIAgkBDXRyeUdldEludGVnZXIBCQCsAgIJAKwCAgIHc3RhdGljXwkBDmdldEFzc2V0U3RyaW5nAQUEaXRlbQIJX2RlY2ltYWxzBQNuaWwBE2FkZEFzc2V0U2NhbGVUb0xpc3QCBWFjY3VtBGl0ZW0JAM4IAgUFYWNjdW0JAMwIAgkBDXRyeUdldEludGVnZXIBCQCsAgIJAKwCAgIHc3RhdGljXwkBDmdldEFzc2V0U3RyaW5nAQUEaXRlbQIGX3NjYWxlBQNuaWwBDGFkZEludFRvTGlzdAIFYWNjdW0EaXRlbQkAzggCBQVhY2N1bQkAzAgCCQENcGFyc2VJbnRWYWx1ZQEFBGl0ZW0FA25pbAEUcmV2ZW5ldUZvckRheUJ5QXNzZXQCA2RheQdhc3NldElkCQCsAgIJAKwCAgkArAICAgxyZXZlbmV1X2RheV8FB2Fzc2V0SWQCAV8JAKQDAQUDZGF5AAFUCQENdHJ5R2V0SW50ZWdlcgECE3N0YXRpY190b2tlbnNBbW91bnQACGFzc2V0SWRzCgACJGwJALUJAgkBDHRyeUdldFN0cmluZwECD3N0YXRpY190b2tlbklkcwIBLAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQETYWRkQXNzZXRCeXRlc1RvTGlzdAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgMwkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwANQXNzZXRzV2VpZ2h0cwoAAiRsBQhhc3NldElkcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMV8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEUYWRkQXNzZXRXZWlnaHRUb0xpc3QCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjFfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDMJAQUkZjFfMgIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIFBSRhY2MwAAAAAQACAAMACERlY2ltYWxzCgACJGwFCGFzc2V0SWRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYyXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJARZhZGRBc3NldERlY2ltYWxzVG9MaXN0AgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYyXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyAzCQEFJGYyXzICCQEFJGYyXzECCQEFJGYyXzECCQEFJGYyXzECBQUkYWNjMAAAAAEAAgADAAZTY2FsZXMKAAIkbAUIYXNzZXRJZHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjNfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBE2FkZEFzc2V0U2NhbGVUb0xpc3QCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjNfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDMJAQUkZjNfMgIJAQUkZjNfMQIJAQUkZjNfMQIJAQUkZjNfMQIFBSRhY2MwAAAAAQACAAMAB3N0YWtlSWQJAQx0cnlHZXRTdHJpbmcBAg1sYXN0X3N0YWtlX2lkAANGZWUJAQ10cnlHZXRJbnRlZ2VyAQIKc3RhdGljX2ZlZQAVQXNzZXRzV2VpZ2h0c0RlY2ltYWxzAAIABVNjYWxlAJBOAAZTY2FsZTgAgMLXLwAIRmVlU2NhbGUAkE4AEVBvb2xUb2tlbkRlY2ltYWxzAAgADlBvb2xUb2tlblNjYWxlCQBsBgAKAAAFEVBvb2xUb2tlbkRlY2ltYWxzAAAAAAUGSEFMRlVQAAxlYXJuZWRBc3NldHMFCGFzc2V0SWRzAQppc1NodXRkb3duAAQIc2h1dGRvd24DCQECIT0CCQEMdHJ5R2V0U3RyaW5nAQINc3RhdGljX29yYWNsZQIABAckbWF0Y2gwCQCbCAIJARBnZXRPcmFjbGVBZGRyZXNzAAIMYW1tX3NodXRkb3duAwkAAQIFByRtYXRjaDACB0Jvb2xlYW4EAXgFByRtYXRjaDAFAXgHBwQJc2h1dGRvd24yBAckbWF0Y2gwCQCbCAIFBHRoaXMCC2lzX3NodXRkb3duAwkAAQIFByRtYXRjaDACB0Jvb2xlYW4EAXgFByRtYXRjaDAFAXgHAwUIc2h1dGRvd24GBQlzaHV0ZG93bjIBCWNhblVwZGF0ZQADCQECIT0CCQEMdHJ5R2V0U3RyaW5nAQINc3RhdGljX29yYWNsZQIABAckbWF0Y2gwCQCbCAIJARBnZXRPcmFjbGVBZGRyZXNzAAIGYW1tX3R4AwkAAQIFByRtYXRjaDACB0Jvb2xlYW4EAXgFByRtYXRjaDAFAXgGBgEWZ2V0Q3VycmVudFRva2VuQmFsYW5jZQEJdG9rZW5UeXBlBAd0b2tlbklkCQEOZ2V0QXNzZXRTdHJpbmcBCQCRAwIFCGFzc2V0SWRzBQl0b2tlblR5cGUJAQ10cnlHZXRJbnRlZ2VyAQkArAICCQCsAgICB2dsb2JhbF8FB3Rva2VuSWQCCF9iYWxhbmNlARBjYWxjdWxhdGVQSXNzdWVkAgZhbW91bnQHdG9rZW5JZAQHUHN1cHBseQkBDXRyeUdldEludGVnZXIBAhdnbG9iYWxfcG9vbFRva2VuX2Ftb3VudAQHQmFsYW5jZQkBDXRyeUdldEludGVnZXIBCQCsAgIJAKwCAgIHZ2xvYmFsXwkBDmdldEFzc2V0U3RyaW5nAQUHdG9rZW5JZAIIX2JhbGFuY2UJAG4EBQZhbW91bnQFB1BzdXBwbHkFB0JhbGFuY2UFBERPV04BDWdldE1pblBJc3N1ZWQBCHBheW1lbnRzCgEHaGFuZGxlcgIFYWNjdW0HY3VycmVudAQHUElzc3VlZAkBEGNhbGN1bGF0ZVBJc3N1ZWQCCAUHY3VycmVudAZhbW91bnQIBQdjdXJyZW50B2Fzc2V0SWQDCQAAAgUHUElzc3VlZAAACQACAQIkb25lIG9mIHRoZSB0b2tlbnMgYW1vdW50cyBpcyB0b28gbG93AwMJAAACBQVhY2N1bQAABgkAZgIFBWFjY3VtBQdQSXNzdWVkBQdQSXNzdWVkBQVhY2N1bQQJbWluUElzc2VkCgACJGwFCHBheW1lbnRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAAACgEFJGY0XzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQdoYW5kbGVyAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGY0XzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyAzCQEFJGY0XzICCQEFJGY0XzECCQEFJGY0XzECCQEFJGY0XzECBQUkYWNjMAAAAAEAAgADBQltaW5QSXNzZWQBE2NoZWNrVG9rZW5zVmFsaWRpdHkBCHBheW1lbnRzCgEIaGFuZGxlcjECBWFjY3VtB3BheW1lbnQJAM4IAgUFYWNjdW0JAMwIAggFB3BheW1lbnQHYXNzZXRJZAUDbmlsBANpZHMKAAIkbAUIcGF5bWVudHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjRfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGhhbmRsZXIxAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGY0XzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyAzCQEFJGY0XzICCQEFJGY0XzECCQEFJGY0XzECCQEFJGY0XzECBQUkYWNjMAAAAAEAAgADAwkAAAIFA2lkcwUDaWRzCgEIaGFuZGxlcjICBWFjY3VtB2Fzc2V0SWQDCQECIT0CCQDPCAIFA2lkcwUHYXNzZXRJZAUEdW5pdAkAZAIFBWFjY3VtAAEJAAIBCQCsAgICFGFzc2V0IG5vdCBhdHRhY2hlZDogCQEOZ2V0QXNzZXRTdHJpbmcBBQdhc3NldElkBAZjaGVja3MKAAIkbAUIYXNzZXRJZHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwAAAKAQUkZjVfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGhhbmRsZXIyAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGY1XzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyAzCQEFJGY1XzICCQEFJGY1XzECCQEFJGY1XzECCQEFJGY1XzECBQUkYWNjMAAAAAEAAgADAwkAAAIFBmNoZWNrcwUGY2hlY2tzBgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEMc3Rha2VVbnN0YWtlAwVzdGFrZQZhbW91bnQHYXNzZXRJZAMDCQAAAgUHYXNzZXRJZAIFV0FWRVMJAGYCBQZhbW91bnQAAAcEDWxlYXNpbmdBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwIObGVhc2luZ19hbW91bnQAAAQObmV3TGVhc2VBbW91bnQDBQVzdGFrZQkAZAIFDWxlYXNpbmdBbW91bnQFBmFtb3VudAkAZQIFDWxlYXNpbmdBbW91bnQFBmFtb3VudAQIbmV3TGVhc2UJAMQIAgkBDmdldE5vZGVBY2NvdW50AAUObmV3TGVhc2VBbW91bnQECm5ld0xlYXNlSWQJALkIAQUIbmV3TGVhc2UEBGRhdGEJAMwIAgUIbmV3TGVhc2UJAMwIAgkBC1N0cmluZ0VudHJ5AgINbGFzdF9zdGFrZV9pZAkA2AQBBQpuZXdMZWFzZUlkCQDMCAIJAQxJbnRlZ2VyRW50cnkCAg5sZWFzaW5nX2Ftb3VudAUObmV3TGVhc2VBbW91bnQFA25pbAMJAQIhPQIFB3N0YWtlSWQCAAkAzggCCQDMCAIJAQtMZWFzZUNhbmNlbAEJANkEAQUHc3Rha2VJZAUDbmlsBQRkYXRhBQRkYXRhBQNuaWwBE2hhbmRsZVBvb2xUb2tlbnNBZGQEB1BJc3N1ZWQIcGF5bWVudHMLdXNlckFkZHJlc3MKbmVlZENoYW5nZQoBFWdldFRva2VuUGF5bWVudEFtb3VudAEHdG9rZW5JZAoBB2hhbmRsZXICBWFjY3VtB3BheW1lbnQDCQAAAggFB3BheW1lbnQHYXNzZXRJZAUHdG9rZW5JZAgFB3BheW1lbnQGYW1vdW50BQVhY2N1bQoAAiRsBQhwYXltZW50cwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAAAAoBBSRmNF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEHaGFuZGxlcgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmNF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgMwkBBSRmNF8yAgkBBSRmNF8xAgkBBSRmNF8xAgkBBSRmNF8xAgUFJGFjYzAAAAABAAIAAwoBEWhhbmRsZVRva2VuQ2hhbmdlAgVhY2N1bQd0b2tlbklkBAJCawkBDXRyeUdldEludGVnZXIBCQCsAgIJAKwCAgIHZ2xvYmFsXwkBDmdldEFzc2V0U3RyaW5nAQUHdG9rZW5JZAIIX2JhbGFuY2UEB1BTdXBwbHkJAQ10cnlHZXRJbnRlZ2VyAQIXZ2xvYmFsX3Bvb2xUb2tlbl9hbW91bnQEDXRva2VuRGVjaW1hbHMJAQ10cnlHZXRJbnRlZ2VyAQkArAICCQCsAgICB3N0YXRpY18JAQ5nZXRBc3NldFN0cmluZwEFB3Rva2VuSWQCBl9zY2FsZQQGRGtUZW1wCQBuBAkAZQIJAG4ECQBkAgUHUFN1cHBseQUHUElzc3VlZAUNdG9rZW5EZWNpbWFscwUHUFN1cHBseQUHQ0VJTElORwUNdG9rZW5EZWNpbWFscwUCQmsFDXRva2VuRGVjaW1hbHMFB0NFSUxJTkcEDXBheW1lbnRBbW91bnQJARVnZXRUb2tlblBheW1lbnRBbW91bnQBBQd0b2tlbklkBAJEawkAlwMBCQDMCAIFBkRrVGVtcAkAzAgCBQ1wYXltZW50QW1vdW50BQNuaWwECHRvUmV0dXJuCQBlAgMJAQIhPQIFDXBheW1lbnRBbW91bnQAAAUNcGF5bWVudEFtb3VudAAABQJEawQBdAMDBQpuZWVkQ2hhbmdlCQBmAgUIdG9SZXR1cm4AAAcJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwULdXNlckFkZHJlc3MFCHRvUmV0dXJuBQd0b2tlbklkBQNuaWwFA25pbAQQc3Rha2VVbnN0YWtlRGF0YQMJAAACCQEOZ2V0QXNzZXRTdHJpbmcBBQd0b2tlbklkAgVXQVZFUwkBDHN0YWtlVW5zdGFrZQMGBQJEawIFV0FWRVMFA25pbAkAzggCCQDOCAIJAM4IAgUFYWNjdW0FAXQFEHN0YWtlVW5zdGFrZURhdGEJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICAgdnbG9iYWxfCQEOZ2V0QXNzZXRTdHJpbmcBBQd0b2tlbklkAghfYmFsYW5jZQkAZAIFAkJrBQJEawUDbmlsCgACJGwFCGFzc2V0SWRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGY0XzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJARFoYW5kbGVUb2tlbkNoYW5nZQIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmNF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgMwkBBSRmNF8yAgkBBSRmNF8xAgkBBSRmNF8xAgkBBSRmNF8xAgUFJGFjYzAAAAABAAIAAwEWaGFuZGxlUG9vbFRva2Vuc1JlZGVlbQIJUFJlZGVlbWVkC3VzZXJBZGRyZXNzCgERaGFuZGxlVG9rZW5SZWRlZW0CBWFjY3VtB3Rva2VuSWQEAkJrCQENdHJ5R2V0SW50ZWdlcgEJAKwCAgkArAICAgdnbG9iYWxfCQEOZ2V0QXNzZXRTdHJpbmcBBQd0b2tlbklkAghfYmFsYW5jZQQHUFN1cHBseQkBDXRyeUdldEludGVnZXIBAhdnbG9iYWxfcG9vbFRva2VuX2Ftb3VudAQNdG9rZW5EZWNpbWFscwkBDXRyeUdldEludGVnZXIBCQCsAgIJAKwCAgIHc3RhdGljXwkBDmdldEFzc2V0U3RyaW5nAQUHdG9rZW5JZAIGX3NjYWxlBAZhbW91bnQJAKADAQkAvQIECQC4AgIJALYCAQUGU2NhbGU4CQC9AgQJALYCAQkAZQIFB1BTdXBwbHkFCVBSZWRlZW1lZAkAtgIBBQZTY2FsZTgJALYCAQUHUFN1cHBseQUHQ0VJTElORwkAtgIBBQJCawkAtgIBBQZTY2FsZTgFBERPV04EEHN0YWtlVW5zdGFrZURhdGEDCQAAAgkBDmdldEFzc2V0U3RyaW5nAQUHdG9rZW5JZAIFV0FWRVMJAQxzdGFrZVVuc3Rha2UDBwUGYW1vdW50AgVXQVZFUwUDbmlsCQDOCAIJAM4IAgUFYWNjdW0FEHN0YWtlVW5zdGFrZURhdGEJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICAgdnbG9iYWxfCQEOZ2V0QXNzZXRTdHJpbmcBBQd0b2tlbklkAghfYmFsYW5jZQkAZQIFAkJrBQZhbW91bnQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwULdXNlckFkZHJlc3MFBmFtb3VudAUHdG9rZW5JZAUDbmlsCgACJGwFCGFzc2V0SWRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGY0XzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJARFoYW5kbGVUb2tlblJlZGVlbQIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmNF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgMwkBBSRmNF8yAgkBBSRmNF8xAgkBBSRmNF8xAgkBBSRmNF8xAgUFJGFjYzAAAAABAAIAAwESY2FsY3VsYXRlT3V0QW1vdW50BQhBbW91bnRJbgdhc3NldEluCGFzc2V0T3V0CUJhbGFuY2VJbgpCYWxhbmNlT3V0BAdJbmRleEluCQEFdmFsdWUBCQDPCAIFCGFzc2V0SWRzBQdhc3NldEluBAhJbmRleE91dAkBBXZhbHVlAQkAzwgCBQhhc3NldElkcwUIYXNzZXRPdXQDCQAAAgUHSW5kZXhJbgUISW5kZXhPdXQJAAIBAhF3cm9uZyB0b2tlbnMgcGFpcgkAbgQFCkJhbGFuY2VPdXQJAGUCCQBoAgUGU2NhbGU4BQZTY2FsZTgJAKADAQkAdgYJAL0CBAkAtgIBBQlCYWxhbmNlSW4JALYCAQkAaAIFBlNjYWxlOAUGU2NhbGU4CQC2AgEJAGQCBQlCYWxhbmNlSW4FCEFtb3VudEluBQZIQUxGVVAAEAkAtgIBCQBrAwkAkQMCBQ1Bc3NldHNXZWlnaHRzBQdJbmRleEluAJBOCQCRAwIFDUFzc2V0c1dlaWdodHMFCEluZGV4T3V0AAQAEAUHQ0VJTElORwkAaAIFBlNjYWxlOAUGU2NhbGU4BQRET1dOAQ9nZXRUb2tlbkJhbGFuY2UBB2Fzc2V0SWQEByRtYXRjaDAFB2Fzc2V0SWQDCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQBdAUHJG1hdGNoMAkA8AcCBQR0aGlzBQF0CAkA7wcBBQR0aGlzB3JlZ3VsYXIBHWNhbGN1bGF0ZUN1cnJlbnRBc3NldEludGVyZXN0BAdhc3NldElkCmFzc2V0SWRTdHIIYUJhbGFuY2UWdG9rZW5FYXJuaW5nc0xhc3RDaGVjawQLdG90YWxTdGFrZWQJAQ10cnlHZXRJbnRlZ2VyAQISZ2xvYmFsX2luZGV4U3Rha2VkBBV0b2tlbkJhbGFuY2VMYXN0Q2hlY2sFFnRva2VuRWFybmluZ3NMYXN0Q2hlY2sEE2N1cnJlbnRCYWxhbmNlRGVsdGEJAGUCCQEPZ2V0VG9rZW5CYWxhbmNlAQUHYXNzZXRJZAUIYUJhbGFuY2UEFGN1cnJlbnRUb2tlbkVhcm5pbmdzAwkAZgIFE2N1cnJlbnRCYWxhbmNlRGVsdGEFFXRva2VuQmFsYW5jZUxhc3RDaGVjawUTY3VycmVudEJhbGFuY2VEZWx0YQUVdG9rZW5CYWxhbmNlTGFzdENoZWNrBAtuZXdFYXJuaW5ncwkAZQIFFGN1cnJlbnRUb2tlbkVhcm5pbmdzBRV0b2tlbkJhbGFuY2VMYXN0Q2hlY2sEC25ld0ludGVyZXN0AwkAAAIFC3RvdGFsU3Rha2VkAAAAAAkAawMFC25ld0Vhcm5pbmdzBQZTY2FsZTgFC3RvdGFsU3Rha2VkBBFsYXN0Q2hlY2tJbnRlcmVzdAkBDXRyeUdldEludGVnZXIBCQCsAgIJAKwCAgIRZ2xvYmFsX2xhc3RDaGVja18FCmFzc2V0SWRTdHICCV9pbnRlcmVzdAkAZAIFEWxhc3RDaGVja0ludGVyZXN0BQtuZXdJbnRlcmVzdAELY2xhaW1SZXN1bHQBB2FkZHJlc3MECmFkZHJlc3NTdHIJAKUIAQUHYWRkcmVzcwQLc2hhcmVBbW91bnQJAQ10cnlHZXRJbnRlZ2VyAQkArAICBQphZGRyZXNzU3RyAgxfaW5kZXhTdGFrZWQKAQdoYW5kbGVyAgVhY2N1bQdhc3NldElkBAphc3NldElkU3RyCQEOZ2V0QXNzZXRTdHJpbmcBBQdhc3NldElkBAhhQmFsYW5jZQkBDXRyeUdldEludGVnZXIBCQCsAgIJAKwCAgIHZ2xvYmFsXwkBDmdldEFzc2V0U3RyaW5nAQUHYXNzZXRJZAIIX2JhbGFuY2UEFnRva2VuRWFybmluZ3NMYXN0Q2hlY2sJAQ10cnlHZXRJbnRlZ2VyAQkArAICCQCsAgICEWdsb2JhbF9sYXN0Q2hlY2tfBQphc3NldElkU3RyAglfZWFybmluZ3MEFGN1cnJlbnRUb2tlbkludGVyZXN0CQEdY2FsY3VsYXRlQ3VycmVudEFzc2V0SW50ZXJlc3QEBQdhc3NldElkBQphc3NldElkU3RyBQhhQmFsYW5jZQUWdG9rZW5FYXJuaW5nc0xhc3RDaGVjawQUY3VycmVudFRva2VuRWFybmluZ3MJAJYDAQkAzAgCBRZ0b2tlbkVhcm5pbmdzTGFzdENoZWNrCQDMCAIJAGUCCQEPZ2V0VG9rZW5CYWxhbmNlAQUHYXNzZXRJZAUIYUJhbGFuY2UFA25pbAQMcmV3YXJkQW1vdW50CQBrAwULc2hhcmVBbW91bnQJAGUCBRRjdXJyZW50VG9rZW5JbnRlcmVzdAkBDXRyeUdldEludGVnZXIBCQCsAgIJAKwCAgkArAICBQphZGRyZXNzU3RyAgtfbGFzdENoZWNrXwUKYXNzZXRJZFN0cgIJX2ludGVyZXN0BQZTY2FsZTgECHRyYW5zZmVyAwkAAAIFDHJld2FyZEFtb3VudAAABQNuaWwJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUHYWRkcmVzcwUMcmV3YXJkQW1vdW50BQdhc3NldElkBQNuaWwEB2NsYWltZWQJAQ10cnlHZXRJbnRlZ2VyAQkArAICCQCsAgIJAKwCAgUKYWRkcmVzc1N0cgILX2xhc3RDaGVja18FCmFzc2V0SWRTdHICCF9jbGFpbWVkCQDOCAIJAM4IAgUFYWNjdW0FCHRyYW5zZmVyCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgIRZ2xvYmFsX2xhc3RDaGVja18FCmFzc2V0SWRTdHICCV9lYXJuaW5ncwkAZQIFFGN1cnJlbnRUb2tlbkVhcm5pbmdzBQxyZXdhcmRBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICAhFnbG9iYWxfbGFzdENoZWNrXwUKYXNzZXRJZFN0cgIJX2ludGVyZXN0BRRjdXJyZW50VG9rZW5JbnRlcmVzdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgUKYWRkcmVzc1N0cgILX2xhc3RDaGVja18FCmFzc2V0SWRTdHICCV9pbnRlcmVzdAUUY3VycmVudFRva2VuSW50ZXJlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIFCmFkZHJlc3NTdHICC19sYXN0Q2hlY2tfBQphc3NldElkU3RyAghfY2xhaW1lZAkAZAIFB2NsYWltZWQFDHJld2FyZEFtb3VudAUDbmlsBAVhY2N1bQoAAiRsBQxlYXJuZWRBc3NldHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjRfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBB2hhbmRsZXICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjRfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDMJAQUkZjRfMgIJAQUkZjRfMQIJAQUkZjRfMQIJAQUkZjRfMQIFBSRhY2MwAAAAAQACAAMJAM4IAgUFYWNjdW0JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUKYWRkcmVzc1N0cgIKX2xhc3RDbGFpbQgFCWxhc3RCbG9jawl0aW1lc3RhbXAFA25pbAEQaW5kZXhTdGFrZVJlc3VsdAIKYWRkcmVzc1N0cgZhbW91bnQEAmxpCQELY2xhaW1SZXN1bHQBCQERQGV4dHJOYXRpdmUoMTA2MikBBQphZGRyZXNzU3RyCQDOCAIFAmxpCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCmFkZHJlc3NTdHICDF9pbmRleFN0YWtlZAkAZAIJAQ10cnlHZXRJbnRlZ2VyAQkArAICBQphZGRyZXNzU3RyAgxfaW5kZXhTdGFrZWQFBmFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgISZ2xvYmFsX2luZGV4U3Rha2VkCQBkAgkBDXRyeUdldEludGVnZXIBAhJnbG9iYWxfaW5kZXhTdGFrZWQFBmFtb3VudAUDbmlsAQNzdW0CBWFjY3VtAW4JAGQCBQVhY2N1bQkBDXBhcnNlSW50VmFsdWUBBQFuARtzZXRPcmFjbGVBZGRyZXNzQW5kSW5pdGlhdGUBB2FkZHJlc3MJAMwIAgkBC1N0cmluZ0VudHJ5AgINc3RhdGljX29yYWNsZQUHYWRkcmVzcwUDbmlsAQlpc1Rlc3RFbnYABAd0ZXN0ZW52BAckbWF0Y2gwCQCbCAIFBHRoaXMCB1RFU1RFTlYDCQABAgUHJG1hdGNoMAIHQm9vbGVhbgQBeAUHJG1hdGNoMAUBeAcFB3Rlc3RlbnYOAWkBCnRvcFVwRnVuZHMAAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABCQACAQIYV3JvbmcgcGF5bWVudHMgYXR0YWNoZWQhBAdwYXltZW50CQCRAwIIBQFpCHBheW1lbnRzAAAEBWFzc2V0CAUHcGF5bWVudAdhc3NldElkAwkAAAIJAM8IAgUIYXNzZXRJZHMFBWFzc2V0BQR1bml0CQACAQIVTm90IHN1cHBvcnRlZCBhc3NldElkBAZhbW91bnQIBQdwYXltZW50BmFtb3VudAQIYUJhbGFuY2UJAQ10cnlHZXRJbnRlZ2VyAQkArAICCQCsAgICB2dsb2JhbF8JAQ5nZXRBc3NldFN0cmluZwEFBWFzc2V0AghfYmFsYW5jZQQDZGF5CQEXY2FsY3VsYXRlRGF5c1NpbmNlU3RhcnQABAdyZXZlbmV1CQENdHJ5R2V0SW50ZWdlcgEJARRyZXZlbmV1Rm9yRGF5QnlBc3NldAIFA2RheQkBDmdldEFzc2V0U3RyaW5nAQUFYXNzZXQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICAgdnbG9iYWxfCQEOZ2V0QXNzZXRTdHJpbmcBBQVhc3NldAIIX2JhbGFuY2UJAGQCBQhhQmFsYW5jZQUGYW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCAg5kYXlzX3NpbmNlX2FweQUDZGF5CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEUcmV2ZW5ldUZvckRheUJ5QXNzZXQCBQNkYXkJAQ5nZXRBc3NldFN0cmluZwEFBWFzc2V0CQBkAgUHcmV2ZW5ldQUGYW1vdW50BQNuaWwBaQEHcHJlSW5pdAQLYXNzZXRJZHNTdHIPYXNzZXRXZWlnaHRzU3RyDmJhc2VUb2tlbklkU3RyCnBvb2xEb21haW4DCQECIT0CBQR0aGlzCAUBaQZjYWxsZXIJAAIBAgphZG1pbiBvbmx5AwkAZgIJALECAQUKcG9vbERvbWFpbgANCQACAQIVdG9vIGxhcmdlIHBvb2wgZG9tYWluBA1hc3NldElkc1N0ckxpCQC1CQIFC2Fzc2V0SWRzU3RyAgEsBAphc3NldElkc0xpCgACJGwFDWFzc2V0SWRzU3RyTGkKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjRfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBE2FkZEFzc2V0Qnl0ZXNUb0xpc3QCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjRfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDMJAQUkZjRfMgIJAQUkZjRfMQIJAQUkZjRfMQIJAQUkZjRfMQIFBSRhY2MwAAAAAQACAAMEEWFzc2V0V2VpZ2h0c1N0ckxpCQC1CQIFD2Fzc2V0V2VpZ2h0c1N0cgIBLAQPYXNzZXRXZWlnaHRzU3VtCgACJGwFEWFzc2V0V2VpZ2h0c1N0ckxpCgACJHMJAJADAQUCJGwKAAUkYWNjMAAACgEFJGY1XzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQNzdW0CBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjVfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDMJAQUkZjVfMgIJAQUkZjVfMQIJAQUkZjVfMQIJAQUkZjVfMQIFBSRhY2MwAAAAAQACAAMKARNhZGRUb2tlbkRhdGFFbnRyaWVzAgVhY2N1bQhhc3NldE51bQMJAGcCBQhhc3NldE51bQkAkAMBBQphc3NldElkc0xpBQVhY2N1bQQNYXNzZXREZWNpbWFscwQHJG1hdGNoMAkAkQMCBQphc3NldElkc0xpBQhhc3NldE51bQMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAF4BQckbWF0Y2gwCAkBBXZhbHVlAQkA7AcBCQCRAwIFCmFzc2V0SWRzTGkFCGFzc2V0TnVtCGRlY2ltYWxzAAgJAM4IAgUFYWNjdW0JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICAgdzdGF0aWNfCQCRAwIFDWFzc2V0SWRzU3RyTGkFCGFzc2V0TnVtAgZfc2NhbGUJAGwGAAoAAAUNYXNzZXREZWNpbWFscwAAAAAFBERPV04JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICAgdzdGF0aWNfCQCRAwIFDWFzc2V0SWRzU3RyTGkFCGFzc2V0TnVtAglfZGVjaW1hbHMFDWFzc2V0RGVjaW1hbHMJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICAgdzdGF0aWNfCQCRAwIFDWFzc2V0SWRzU3RyTGkFCGFzc2V0TnVtAgdfd2VpZ2h0CQEFdmFsdWUBCQC2CQEJAJEDAgURYXNzZXRXZWlnaHRzU3RyTGkFCGFzc2V0TnVtBQNuaWwDCQECIT0CBQ9hc3NldFdlaWdodHNTdW0AZAkAAgECKXN1bSBvZiB0b2tlbiB3ZWlnaHRzIG11c3QgYmUgZXF1YWwgdG8gMTAwCQDOCAIKAAIkbAkAzAgCAAAJAMwIAgABCQDMCAIAAgUDbmlsCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGY2XzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJARNhZGRUb2tlbkRhdGFFbnRyaWVzAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGY2XzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyAzCQEFJGY2XzICCQEFJGY2XzECCQEFJGY2XzECCQEFJGY2XzECBQUkYWNjMAAAAAEAAgADCQDMCAIJAQtTdHJpbmdFbnRyeQICD3N0YXRpY190b2tlbklkcwULYXNzZXRJZHNTdHIJAMwIAgkBC1N0cmluZ0VudHJ5AgITc3RhdGljX3Rva2VuV2VpZ2h0cwUPYXNzZXRXZWlnaHRzU3RyCQDMCAIJAQxJbnRlZ2VyRW50cnkCAhNzdGF0aWNfdG9rZW5zQW1vdW50CQCQAwEFCmFzc2V0SWRzTGkJAMwIAgkBC1N0cmluZ0VudHJ5AgIRc3RhdGljX3Bvb2xEb21haW4FCnBvb2xEb21haW4JAMwIAgkBC1N0cmluZ0VudHJ5AgISc3RhdGljX2Jhc2VUb2tlbklkBQ5iYXNlVG9rZW5JZFN0cgkAzAgCCQEMSW50ZWdlckVudHJ5AgIKc3RhdGljX2ZlZQBkBQNuaWwBaQEEaW5pdAEGb3JhY2xlCgELcHJlcGFyZUxpc3QACgEHaGFuZGxlcgIFYWNjdW0BbgkAzggCBQVhY2N1bQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgICB2dsb2JhbF8JAQ5nZXRBc3NldFN0cmluZwEIBQFuB2Fzc2V0SWQCCF9iYWxhbmNlCAUBbgZhbW91bnQFA25pbAoAAiRsCAUBaQhwYXltZW50cwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmNF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEHaGFuZGxlcgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmNF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgMwkBBSRmNF8yAgkBBSRmNF8xAgkBBSRmNF8xAgkBBSRmNF8xAgUFJGFjYzAAAAABAAIAAwoBGWNhbGN1bGF0ZVBvb2xUb2tlbnNBbW91bnQBCHBheW1lbnRzCgEHaGFuZGxlcgIFYWNjdW0DcG10BAdhc3NldElkCAUDcG10B2Fzc2V0SWQKAQhoYW5kbGVyMgIFYWNjdW0BbgMJAAACBQFuBQdhc3NldElkCQEFdmFsdWUBCQDPCAIFCGFzc2V0SWRzBQFuBQVhY2N1bQQFVG9rZW4KAAIkbAUIYXNzZXRJZHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwAAEKAQUkZjRfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGhhbmRsZXIyAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGY0XzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyAzCQEFJGY0XzICCQEFJGY0XzECCQEFJGY0XzECCQEFJGY0XzECBQUkYWNjMAAAAAEAAgADCQBrAwUFYWNjdW0JAGwGCAUDcG10BmFtb3VudAkAkQMCBQhEZWNpbWFscwUFVG9rZW4JAJEDAgUNQXNzZXRzV2VpZ2h0cwUFVG9rZW4FFUFzc2V0c1dlaWdodHNEZWNpbWFscwAIBQVGTE9PUgUGU2NhbGU4CgACJGwFCHBheW1lbnRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAUOUG9vbFRva2VuU2NhbGUKAQUkZjRfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBB2hhbmRsZXICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjRfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDMJAQUkZjRfMgIJAQUkZjRfMQIJAQUkZjRfMQIJAQUkZjRfMQIFBSRhY2MwAAAAAQACAAMDCQBmAgkBDXRyeUdldEludGVnZXIBAhBnbG9iYWxfd2FzSW5pdGVkAAAJAAIBAhNwb29sIGFscmVhZHkgaW5pdGVkBBFpbml0aWFsUG9vbFRva2VucwkBGWNhbGN1bGF0ZVBvb2xUb2tlbnNBbW91bnQBCAUBaQhwYXltZW50cwMJAAACBRFpbml0aWFsUG9vbFRva2VucwAACQACAQIyeW91IG5lZWQgYSBiaWdnZXIgdG9rZW5zIGFtb3VudCB0byBsYXVuY2ggdGhlIHBvb2wEDnBvb2xUb2tlbklzc3VlCQDDCAcJAKwCAgIDV0QgCQEMdHJ5R2V0U3RyaW5nAQIRc3RhdGljX3Bvb2xEb21haW4CDVdEIHBvb2wgdG9rZW4FEWluaXRpYWxQb29sVG9rZW5zBRFQb29sVG9rZW5EZWNpbWFscwYFBHVuaXQAAAQLcG9vbFRva2VuSWQJALgIAQUOcG9vbFRva2VuSXNzdWUJAM4IAgkAzggCCQELcHJlcGFyZUxpc3QACQDMCAIFDnBvb2xUb2tlbklzc3VlCQDMCAIJAQxJbnRlZ2VyRW50cnkCAhdnbG9iYWxfcG9vbFRva2VuX2Ftb3VudAURaW5pdGlhbFBvb2xUb2tlbnMJAMwIAgkBDEludGVnZXJFbnRyeQICEGdsb2JhbF93YXNJbml0ZWQAAQkAzAgCCQELQmluYXJ5RW50cnkCAhNnbG9iYWxfcG9vbFRva2VuX2lkBQtwb29sVG9rZW5JZAkAzAgCCQELU3RyaW5nRW50cnkCAhZzdGF0aWNfcG9vbFRva2VuX2lkU3RyCQEOZ2V0QXNzZXRTdHJpbmcBBQtwb29sVG9rZW5JZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFEWluaXRpYWxQb29sVG9rZW5zBQtwb29sVG9rZW5JZAUDbmlsCQEbc2V0T3JhY2xlQWRkcmVzc0FuZEluaXRpYXRlAQUGb3JhY2xlAWkBDWdlbmVyYXRlSW5kZXgBCm5lZWRDaGFuZ2UDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzBQFUCQACAQkArAICAjt5b3UgbmVlZCB0byBhdHRhY2ggYWxsIHBvb2wgdG9rZW5zLiBhbW91bnQgb2YgcG9vbCB0b2tlbnM6IAkApAMBBQFUAwkBASEBCQETY2hlY2tUb2tlbnNWYWxpZGl0eQEIBQFpCHBheW1lbnRzCQACAQIVd3JvbmcgYXNzZXRzIGF0dGFjaGVkBAdQSXNzdWVkCQENZ2V0TWluUElzc3VlZAEIBQFpCHBheW1lbnRzBAdyZWlzc3VlCQEHUmVpc3N1ZQMJARFAZXh0ck5hdGl2ZSgxMDU3KQECE2dsb2JhbF9wb29sVG9rZW5faWQFB1BJc3N1ZWQGBAZyZXN1bHQJARNoYW5kbGVQb29sVG9rZW5zQWRkBAUHUElzc3VlZAgFAWkIcGF5bWVudHMIBQFpDG9yaWdpbkNhbGxlcgUKbmVlZENoYW5nZQkAlAoCCQDOCAIFBnJlc3VsdAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFB1BJc3N1ZWQJAQx0cnlHZXRCaW5hcnkBAhNnbG9iYWxfcG9vbFRva2VuX2lkCQDMCAIFB3JlaXNzdWUJAMwIAgkBDEludGVnZXJFbnRyeQICF2dsb2JhbF9wb29sVG9rZW5fYW1vdW50CQBkAgkBDXRyeUdldEludGVnZXIBAhdnbG9iYWxfcG9vbFRva2VuX2Ftb3VudAUHUElzc3VlZAUDbmlsBQdQSXNzdWVkAWkBCnN0YWtlSW5kZXgABAphZGRyZXNzU3RyCQClCAEIBQFpDG9yaWdpbkNhbGxlcgQDcG10CQCRAwIIBQFpCHBheW1lbnRzAAADCQECIT0CCQEFdmFsdWUBCAUDcG10B2Fzc2V0SWQJAQx0cnlHZXRCaW5hcnkBAhNnbG9iYWxfcG9vbFRva2VuX2lkCQACAQIUd3JvbmcgYXNzZXQgYXR0YWNoZWQJARBpbmRleFN0YWtlUmVzdWx0AgUKYWRkcmVzc1N0cggFA3BtdAZhbW91bnQBaQEVZ2VuZXJhdGVBbmRTdGFrZUluZGV4AQpuZWVkQ2hhbmdlAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwUBVAkAAgEJAKwCAgI7eW91IG5lZWQgdG8gYXR0YWNoIGFsbCBwb29sIHRva2Vucy4gYW1vdW50IG9mIHBvb2wgdG9rZW5zOiAJAKQDAQUBVAMJAQEhAQkBE2NoZWNrVG9rZW5zVmFsaWRpdHkBCAUBaQhwYXltZW50cwkAAgECFXdyb25nIGFzc2V0cyBhdHRhY2hlZAQHUElzc3VlZAkBDWdldE1pblBJc3N1ZWQBCAUBaQhwYXltZW50cwQHcmVpc3N1ZQkBB1JlaXNzdWUDCQERQGV4dHJOYXRpdmUoMTA1NykBAhNnbG9iYWxfcG9vbFRva2VuX2lkBQdQSXNzdWVkBgQGcmVzdWx0CQETaGFuZGxlUG9vbFRva2Vuc0FkZAQFB1BJc3N1ZWQIBQFpCHBheW1lbnRzCAUBaQxvcmlnaW5DYWxsZXIFCm5lZWRDaGFuZ2UJAJQKAgkAzggCCQDOCAIFBnJlc3VsdAkAzAgCBQdyZWlzc3VlCQDMCAIJAQxJbnRlZ2VyRW50cnkCAhdnbG9iYWxfcG9vbFRva2VuX2Ftb3VudAkAZAIJAQ10cnlHZXRJbnRlZ2VyAQIXZ2xvYmFsX3Bvb2xUb2tlbl9hbW91bnQFB1BJc3N1ZWQFA25pbAkBEGluZGV4U3Rha2VSZXN1bHQCCQClCAEIBQFpDG9yaWdpbkNhbGxlcgUHUElzc3VlZAUHUElzc3VlZAFpAQx1bnN0YWtlSW5kZXgBC3NoYXJlQW1vdW50BAphZGRyZXNzU3RyCQClCAEIBQFpDG9yaWdpbkNhbGxlcgQOc2hhcmVBdmFpbGFibGUJAQ10cnlHZXRJbnRlZ2VyAQkArAICBQphZGRyZXNzU3RyAgxfaW5kZXhTdGFrZWQDCQBmAgULc2hhcmVBbW91bnQFDnNoYXJlQXZhaWxhYmxlCQACAQIleW91IGRvbid0IGhhdmUgaW5kZXggdG9rZW5zIGF2YWlsYWJsZQkAzggCCQELY2xhaW1SZXN1bHQBCAUBaQxvcmlnaW5DYWxsZXIJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUKYWRkcmVzc1N0cgIMX2luZGV4U3Rha2VkCQBlAgUOc2hhcmVBdmFpbGFibGUFC3NoYXJlQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCAhJnbG9iYWxfaW5kZXhTdGFrZWQJAGUCCQENdHJ5R2V0SW50ZWdlcgECEmdsb2JhbF9pbmRleFN0YWtlZAULc2hhcmVBbW91bnQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQtzaGFyZUFtb3VudAkBEUBleHRyTmF0aXZlKDEwNTcpAQITZ2xvYmFsX3Bvb2xUb2tlbl9pZAUDbmlsAWkBEWNsYWltSW5kZXhSZXdhcmRzAAkBC2NsYWltUmVzdWx0AQgFAWkGY2FsbGVyAWkBC3JlZGVlbUluZGV4AQxzZW5kVG9PcmlnaW4EA3BtdAkAkQMCCAUBaQhwYXltZW50cwAAAwkBAiE9AggFA3BtdAdhc3NldElkCQEMdHJ5R2V0QmluYXJ5AQITZ2xvYmFsX3Bvb2xUb2tlbl9pZAkAAgECHnBsZWFzZSBhdHRhY2ggcG9vbCBzaGFyZSB0b2tlbgQJUFJlZGVlbWVkCAUDcG10BmFtb3VudAQGcmVzdWx0CQEWaGFuZGxlUG9vbFRva2Vuc1JlZGVlbQIFCVBSZWRlZW1lZAMFDHNlbmRUb09yaWdpbggFAWkMb3JpZ2luQ2FsbGVyCAUBaQZjYWxsZXIJAM4IAgUGcmVzdWx0CQDMCAIJAQRCdXJuAgkBDHRyeUdldEJpbmFyeQECE2dsb2JhbF9wb29sVG9rZW5faWQFCVBSZWRlZW1lZAkAzAgCCQEMSW50ZWdlckVudHJ5AgIXZ2xvYmFsX3Bvb2xUb2tlbl9hbW91bnQJAGUCCQENdHJ5R2V0SW50ZWdlcgECF2dsb2JhbF9wb29sVG9rZW5fYW1vdW50BQlQUmVkZWVtZWQFA25pbAFpARV1bnN0YWtlQW5kUmVkZWVtSW5kZXgBC3NoYXJlQW1vdW50BAphZGRyZXNzU3RyCQClCAEIBQFpDG9yaWdpbkNhbGxlcgQOc2hhcmVBdmFpbGFibGUJAQ10cnlHZXRJbnRlZ2VyAQkArAICBQphZGRyZXNzU3RyAgxfaW5kZXhTdGFrZWQDCQBmAgULc2hhcmVBbW91bnQFDnNoYXJlQXZhaWxhYmxlCQACAQIleW91IGRvbid0IGhhdmUgaW5kZXggdG9rZW5zIGF2YWlsYWJsZQQJUFJlZGVlbWVkBQtzaGFyZUFtb3VudAQGcmVzdWx0CQEWaGFuZGxlUG9vbFRva2Vuc1JlZGVlbQIFCVBSZWRlZW1lZAgFAWkMb3JpZ2luQ2FsbGVyCQDOCAIJAM4IAgkAzggCCQELY2xhaW1SZXN1bHQBCAUBaQxvcmlnaW5DYWxsZXIJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUKYWRkcmVzc1N0cgIMX2luZGV4U3Rha2VkCQBlAgUOc2hhcmVBdmFpbGFibGUFC3NoYXJlQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCAhJnbG9iYWxfaW5kZXhTdGFrZWQJAGUCCQENdHJ5R2V0SW50ZWdlcgECEmdsb2JhbF9pbmRleFN0YWtlZAULc2hhcmVBbW91bnQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQtzaGFyZUFtb3VudAkBEUBleHRyTmF0aXZlKDEwNTcpAQITZ2xvYmFsX3Bvb2xUb2tlbl9pZAUDbmlsBQZyZXN1bHQJAMwIAgkBBEJ1cm4CCQEMdHJ5R2V0QmluYXJ5AQITZ2xvYmFsX3Bvb2xUb2tlbl9pZAUJUFJlZGVlbWVkCQDMCAIJAQxJbnRlZ2VyRW50cnkCAhdnbG9iYWxfcG9vbFRva2VuX2Ftb3VudAkAZQIJAQ10cnlHZXRJbnRlZ2VyAQIXZ2xvYmFsX3Bvb2xUb2tlbl9hbW91bnQFCVBSZWRlZW1lZAUDbmlsAWkBBHN3YXACCGFzc2V0T3V0B21pbmltdW0DCQEKaXNTaHV0ZG93bgAJAAIBAhpQb29sIGlzIGN1cnJlbnRseSBzaHV0ZG93bgQDcG10CQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAAECEFtb3VudEluCQEFdmFsdWUBCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAQHQXNzZXRJbggFA3BtdAdhc3NldElkBAppbnZva2VTd2FwCQEKYXNJbnRUdXBsZQEJAP0HBAUEdGhpcwIMc3dhcEludGVybmFsCQDMCAIFCGFzc2V0T3V0CQDMCAIFB21pbmltdW0JAMwIAgUIQW1vdW50SW4JAMwIAgkBDmdldEFzc2V0U3RyaW5nAQUHQXNzZXRJbgkAzAgCCQClCAEIBQFpBmNhbGxlcgUDbmlsBQNuaWwDCQAAAgUKaW52b2tlU3dhcAUKaW52b2tlU3dhcAQOY2xlYW5BbW91bnRPdXQIBQppbnZva2VTd2FwAl8xAwkAAAIFDmNsZWFuQW1vdW50T3V0BQ5jbGVhbkFtb3VudE91dAQJZmVlQW1vdW50CAUKaW52b2tlU3dhcAJfMgMJAAACBQlmZWVBbW91bnQFCWZlZUFtb3VudAQFdG9wVXADCQAAAgUIYXNzZXRPdXQCBVdBVkVTBAd1bnN0YWtlCQD9BwQFBHRoaXMCCGludGVybmFsCQDMCAIHCQDMCAIJAGQCBQ5jbGVhbkFtb3VudE91dAkAawMFCWZlZUFtb3VudAADAAQJAMwIAgIFV0FWRVMFA25pbAUDbmlsAwkAAAIFB3Vuc3Rha2UFB3Vuc3Rha2UJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBDmdldEZlZXNBY2NvdW50AAkAawMFCWZlZUFtb3VudAACAAQJAQ1nZXRBc3NldEJ5dGVzAQUIYXNzZXRPdXQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEOZ2V0RmVlc0FjY291bnQACQBrAwUJZmVlQW1vdW50AAIABAkBDWdldEFzc2V0Qnl0ZXMBBQhhc3NldE91dAUDbmlsAwkAAAIFBXRvcFVwBQV0b3BVcAkAlAoCBQV0b3BVcAUOY2xlYW5BbW91bnRPdXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEIaW50ZXJuYWwDBXN0YWtlBmFtb3VudAdhc3NldElkAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQILTm90IGFsbG93ZWQJAQxzdGFrZVVuc3Rha2UDBQVzdGFrZQUGYW1vdW50BQdhc3NldElkAWkBCHN0YWtlQWxsAAkBDHN0YWtlVW5zdGFrZQMGCQBlAgkBDXRyeUdldEludGVnZXIBAhRnbG9iYWxfV0FWRVNfYmFsYW5jZQkBDXRyeUdldEludGVnZXIBAg5sZWFzaW5nX2Ftb3VudAIFV0FWRVMBaQEMc3dhcEludGVybmFsBQhhc3NldE91dAdtaW5pbXVtCEFtb3VudEluB0Fzc2V0SW4GY2FsbGVyAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIbWW91IGNhbnQgY2FsbCB0aGlzIGRpcmVjdGx5BAhBc3NldE91dAkBDWdldEFzc2V0Qnl0ZXMBBQhhc3NldE91dAQDZGF5CQEXY2FsY3VsYXRlRGF5c1NpbmNlU3RhcnQABAdyZXZlbmV1CQENdHJ5R2V0SW50ZWdlcgEJARRyZXZlbmV1Rm9yRGF5QnlBc3NldAIFA2RheQUIYXNzZXRPdXQEDkFzc2V0SW5CYWxhbmNlCQENdHJ5R2V0SW50ZWdlcgEJAKwCAgkArAICAgdnbG9iYWxfBQdBc3NldEluAghfYmFsYW5jZQMJAAACBQ5Bc3NldEluQmFsYW5jZQUOQXNzZXRJbkJhbGFuY2UED0Fzc2V0T3V0QmFsYW5jZQkBDXRyeUdldEludGVnZXIBCQCsAgIJAKwCAgIHZ2xvYmFsXwUIYXNzZXRPdXQCCF9iYWxhbmNlAwkAAAIFD0Fzc2V0T3V0QmFsYW5jZQUPQXNzZXRPdXRCYWxhbmNlBAlBbW91bnRPdXQJARJjYWxjdWxhdGVPdXRBbW91bnQFBQhBbW91bnRJbgkBDWdldEFzc2V0Qnl0ZXMBBQdBc3NldEluBQhBc3NldE91dAUOQXNzZXRJbkJhbGFuY2UFD0Fzc2V0T3V0QmFsYW5jZQMJAAACBQlBbW91bnRPdXQFCUFtb3VudE91dAQJZmVlQW1vdW50CQBrAwUJQW1vdW50T3V0BQNGZWUFCEZlZVNjYWxlAwkAAAIFCWZlZUFtb3VudAUJZmVlQW1vdW50BA5jbGVhbkFtb3VudE91dAkAZQIFCUFtb3VudE91dAUJZmVlQW1vdW50AwkAAAIFDmNsZWFuQW1vdW50T3V0BQ5jbGVhbkFtb3VudE91dAMJAGYCBQdtaW5pbXVtBQ5jbGVhbkFtb3VudE91dAkAAgEJAKwCAgIrYW1vdW50IHRvIHJlY2lldmUgaXMgbG93ZXIgdGhhbiBnaXZlbiBvbmU6IAkApAMBBQ5jbGVhbkFtb3VudE91dAMJAGYCAAAJAGUCBQ9Bc3NldE91dEJhbGFuY2UFCUFtb3VudE91dAkAAgECG2NvbnRyYWN0IGlzIG91dCBvZiByZXNlcnZlcwMJAAACBQhBc3NldE91dAkBDWdldEFzc2V0Qnl0ZXMBBQdBc3NldEluCQACAQIYdGhpcyBzd2FwIGlzIG5vdCBhbGxvd2VkBAxuZXdCYWxhbmNlSW4JAGQCBQ5Bc3NldEluQmFsYW5jZQUIQW1vdW50SW4DCQAAAgUMbmV3QmFsYW5jZUluBQxuZXdCYWxhbmNlSW4EBXN0YWtlCQD9BwQFBHRoaXMCCGludGVybmFsCQDMCAIGCQDMCAIFCEFtb3VudEluCQDMCAIFB0Fzc2V0SW4FA25pbAUDbmlsAwkAAAIFBXN0YWtlBQVzdGFrZQQNbmV3QmFsYW5jZU91dAkAZQIFD0Fzc2V0T3V0QmFsYW5jZQUJQW1vdW50T3V0AwkAAAIFDW5ld0JhbGFuY2VPdXQFDW5ld0JhbGFuY2VPdXQJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgICB2dsb2JhbF8FCGFzc2V0T3V0AghfYmFsYW5jZQkAZAIFDW5ld0JhbGFuY2VPdXQJAGsDBQlmZWVBbW91bnQAAQAECQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEFBmNhbGxlcgUOY2xlYW5BbW91bnRPdXQFCEFzc2V0T3V0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgIHZ2xvYmFsXwUHQXNzZXRJbgIIX2JhbGFuY2UFDG5ld0JhbGFuY2VJbgkAzAgCCQEMSW50ZWdlckVudHJ5AgIOZGF5c19zaW5jZV9hcHkFA2RheQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFHJldmVuZXVGb3JEYXlCeUFzc2V0AgUDZGF5BQhhc3NldE91dAUHcmV2ZW5ldQUDbmlsCQCUCgIFDmNsZWFuQW1vdW50T3V0BQlmZWVBbW91bnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAnR4AQZ2ZXJpZnkAAwkBCWlzVGVzdEVudgAJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAIBQJ0eA9zZW5kZXJQdWJsaWNLZXkECWZpcnN0VXNlcgEg3tbGUeRTFtBlgOsBmioL0PeXUfocdpF+m44GQ3cXvSUECnNlY29uZFVzZXIBIMFs347t041zj4ui+fqJD/R1zUQbVHJSo7Sc0lakLeB1BAl0aGlyZFVzZXIBIOdb9I6q0vlJnm6EJrj5fh/cZ6h93Cu41Op7zfJoCsElBA9maXJzdFVzZXJTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQlmaXJzdFVzZXIAAQMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAEFCWZpcnN0VXNlcgABAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAgUJZmlyc3RVc2VyAAEAAAQQc2Vjb25kVXNlclNpZ25lZAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFCnNlY29uZFVzZXIAAQMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAEFCnNlY29uZFVzZXIAAQMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAIFCnNlY29uZFVzZXIAAQAABA90aGlyZFVzZXJTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQl0aGlyZFVzZXIAAQMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAEFCXRoaXJkVXNlcgABAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAgUJdGhpcmRVc2VyAAEAAAQPc2lnbmF0dXJlc0NvdW50CQBkAgkAZAIFD2ZpcnN0VXNlclNpZ25lZAUQc2Vjb25kVXNlclNpZ25lZAUPdGhpcmRVc2VyU2lnbmVkBAckbWF0Y2gwBQJ0eAkAZwIFD3NpZ25hdHVyZXNDb3VudAACSDGQGQ==", "height": 3577037, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: none Next: DMXVbJXg3ftDBXKz284XLv9d3Q7ctdtPpbzzmdKyzet Full:
OldNewDifferences
1-# no script
1+{-# STDLIB_VERSION 6 #-}
2+{-# SCRIPT_TYPE ACCOUNT #-}
3+{-# CONTENT_TYPE DAPP #-}
4+let startTsMs = 1679961601000
5+
6+func calculateDaysSinceStart () = {
7+ let diff = (lastBlock.timestamp - startTsMs)
8+ let daysPassed = (diff / (86400 * 1000))
9+ daysPassed
10+ }
11+
12+
13+func asIntTuple (value) = match value {
14+ case int: (Int, Int) =>
15+ int
16+ case _ =>
17+ throw("Wrong type, expected: Tuple Int")
18+}
19+
20+
21+func getOracleAddress () = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(this, "static_oracle"), "oracle not found!")), "could not parse oracle")
22+
23+
24+func getFeesAccount () = addressFromStringValue(valueOrErrorMessage(getString(getOracleAddress(), "static_feeAggregator"), "static_feeAggregator not found!"))
25+
26+
27+func getNodeAccount () = addressFromStringValue(valueOrErrorMessage(getString(getOracleAddress(), "static_nodeAddress"), "node_address not found!"))
28+
29+
30+func tryGetInteger (key) = match getInteger(this, key) {
31+ case b: Int =>
32+ b
33+ case _ =>
34+ 0
35+}
36+
37+
38+func tryGetBinary (key) = match getBinary(this, key) {
39+ case b: ByteVector =>
40+ b
41+ case _ =>
42+ base58''
43+}
44+
45+
46+func tryGetString (key) = match getString(this, key) {
47+ case b: String =>
48+ b
49+ case _ =>
50+ ""
51+}
52+
53+
54+func getAssetString (assetId) = match assetId {
55+ case b: ByteVector =>
56+ toBase58String(b)
57+ case _ =>
58+ "WAVES"
59+}
60+
61+
62+func getAssetBytes (assetIdStr) = if ((assetIdStr == "WAVES"))
63+ then unit
64+ else fromBase58String(assetIdStr)
65+
66+
67+func addAssetBytesToList (accum,item) = (accum ++ [getAssetBytes(item)])
68+
69+
70+func addAssetWeightToList (accum,item) = (accum ++ [tryGetInteger((("static_" + getAssetString(item)) + "_weight"))])
71+
72+
73+func addAssetDecimalsToList (accum,item) = (accum ++ [tryGetInteger((("static_" + getAssetString(item)) + "_decimals"))])
74+
75+
76+func addAssetScaleToList (accum,item) = (accum ++ [tryGetInteger((("static_" + getAssetString(item)) + "_scale"))])
77+
78+
79+func addIntToList (accum,item) = (accum ++ [parseIntValue(item)])
80+
81+
82+func reveneuForDayByAsset (day,assetId) = ((("reveneu_day_" + assetId) + "_") + toString(day))
83+
84+
85+let T = tryGetInteger("static_tokensAmount")
86+
87+let assetIds = {
88+ let $l = split(tryGetString("static_tokenIds"), ",")
89+ let $s = size($l)
90+ let $acc0 = nil
91+ func $f0_1 ($a,$i) = if (($i >= $s))
92+ then $a
93+ else addAssetBytesToList($a, $l[$i])
94+
95+ func $f0_2 ($a,$i) = if (($i >= $s))
96+ then $a
97+ else throw("List size exceeds 3")
98+
99+ $f0_2($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3)
100+ }
101+
102+let AssetsWeights = {
103+ let $l = assetIds
104+ let $s = size($l)
105+ let $acc0 = nil
106+ func $f1_1 ($a,$i) = if (($i >= $s))
107+ then $a
108+ else addAssetWeightToList($a, $l[$i])
109+
110+ func $f1_2 ($a,$i) = if (($i >= $s))
111+ then $a
112+ else throw("List size exceeds 3")
113+
114+ $f1_2($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3)
115+ }
116+
117+let Decimals = {
118+ let $l = assetIds
119+ let $s = size($l)
120+ let $acc0 = nil
121+ func $f2_1 ($a,$i) = if (($i >= $s))
122+ then $a
123+ else addAssetDecimalsToList($a, $l[$i])
124+
125+ func $f2_2 ($a,$i) = if (($i >= $s))
126+ then $a
127+ else throw("List size exceeds 3")
128+
129+ $f2_2($f2_1($f2_1($f2_1($acc0, 0), 1), 2), 3)
130+ }
131+
132+let Scales = {
133+ let $l = assetIds
134+ let $s = size($l)
135+ let $acc0 = nil
136+ func $f3_1 ($a,$i) = if (($i >= $s))
137+ then $a
138+ else addAssetScaleToList($a, $l[$i])
139+
140+ func $f3_2 ($a,$i) = if (($i >= $s))
141+ then $a
142+ else throw("List size exceeds 3")
143+
144+ $f3_2($f3_1($f3_1($f3_1($acc0, 0), 1), 2), 3)
145+ }
146+
147+let stakeId = tryGetString("last_stake_id")
148+
149+let Fee = tryGetInteger("static_fee")
150+
151+let AssetsWeightsDecimals = 2
152+
153+let Scale = 10000
154+
155+let Scale8 = 100000000
156+
157+let FeeScale = 10000
158+
159+let PoolTokenDecimals = 8
160+
161+let PoolTokenScale = pow(10, 0, PoolTokenDecimals, 0, 0, HALFUP)
162+
163+let earnedAssets = assetIds
164+
165+func isShutdown () = {
166+ let shutdown = if ((tryGetString("static_oracle") != ""))
167+ then match getBoolean(getOracleAddress(), "amm_shutdown") {
168+ case x: Boolean =>
169+ x
170+ case _ =>
171+ false
172+ }
173+ else false
174+ let shutdown2 = match getBoolean(this, "is_shutdown") {
175+ case x: Boolean =>
176+ x
177+ case _ =>
178+ false
179+ }
180+ if (shutdown)
181+ then true
182+ else shutdown2
183+ }
184+
185+
186+func canUpdate () = if ((tryGetString("static_oracle") != ""))
187+ then match getBoolean(getOracleAddress(), "amm_tx") {
188+ case x: Boolean =>
189+ x
190+ case _ =>
191+ true
192+ }
193+ else true
194+
195+
196+func getCurrentTokenBalance (tokenType) = {
197+ let tokenId = getAssetString(assetIds[tokenType])
198+ tryGetInteger((("global_" + tokenId) + "_balance"))
199+ }
200+
201+
202+func calculatePIssued (amount,tokenId) = {
203+ let Psupply = tryGetInteger("global_poolToken_amount")
204+ let Balance = tryGetInteger((("global_" + getAssetString(tokenId)) + "_balance"))
205+ fraction(amount, Psupply, Balance, DOWN)
206+ }
207+
208+
209+func getMinPIssued (payments) = {
210+ func handler (accum,current) = {
211+ let PIssued = calculatePIssued(current.amount, current.assetId)
212+ if ((PIssued == 0))
213+ then throw("one of the tokens amounts is too low")
214+ else if (if ((accum == 0))
215+ then true
216+ else (accum > PIssued))
217+ then PIssued
218+ else accum
219+ }
220+
221+ let minPIssed = {
222+ let $l = payments
223+ let $s = size($l)
224+ let $acc0 = 0
225+ func $f4_1 ($a,$i) = if (($i >= $s))
226+ then $a
227+ else handler($a, $l[$i])
228+
229+ func $f4_2 ($a,$i) = if (($i >= $s))
230+ then $a
231+ else throw("List size exceeds 3")
232+
233+ $f4_2($f4_1($f4_1($f4_1($acc0, 0), 1), 2), 3)
234+ }
235+ minPIssed
236+ }
237+
238+
239+func checkTokensValidity (payments) = {
240+ func handler1 (accum,payment) = (accum ++ [payment.assetId])
241+
242+ let ids = {
243+ let $l = payments
244+ let $s = size($l)
245+ let $acc0 = nil
246+ func $f4_1 ($a,$i) = if (($i >= $s))
247+ then $a
248+ else handler1($a, $l[$i])
249+
250+ func $f4_2 ($a,$i) = if (($i >= $s))
251+ then $a
252+ else throw("List size exceeds 3")
253+
254+ $f4_2($f4_1($f4_1($f4_1($acc0, 0), 1), 2), 3)
255+ }
256+ if ((ids == ids))
257+ then {
258+ func handler2 (accum,assetId) = if ((indexOf(ids, assetId) != unit))
259+ then (accum + 1)
260+ else throw(("asset not attached: " + getAssetString(assetId)))
261+
262+ let checks = {
263+ let $l = assetIds
264+ let $s = size($l)
265+ let $acc0 = 0
266+ func $f5_1 ($a,$i) = if (($i >= $s))
267+ then $a
268+ else handler2($a, $l[$i])
269+
270+ func $f5_2 ($a,$i) = if (($i >= $s))
271+ then $a
272+ else throw("List size exceeds 3")
273+
274+ $f5_2($f5_1($f5_1($f5_1($acc0, 0), 1), 2), 3)
275+ }
276+ if ((checks == checks))
277+ then true
278+ else throw("Strict value is not equal to itself.")
279+ }
280+ else throw("Strict value is not equal to itself.")
281+ }
282+
283+
284+func stakeUnstake (stake,amount,assetId) = if (if ((assetId == "WAVES"))
285+ then (amount > 0)
286+ else false)
287+ then {
288+ let leasingAmount = valueOrElse(getInteger(this, "leasing_amount"), 0)
289+ let newLeaseAmount = if (stake)
290+ then (leasingAmount + amount)
291+ else (leasingAmount - amount)
292+ let newLease = Lease(getNodeAccount(), newLeaseAmount)
293+ let newLeaseId = calculateLeaseId(newLease)
294+ let data = [newLease, StringEntry("last_stake_id", toBase58String(newLeaseId)), IntegerEntry("leasing_amount", newLeaseAmount)]
295+ if ((stakeId != ""))
296+ then ([LeaseCancel(fromBase58String(stakeId))] ++ data)
297+ else data
298+ }
299+ else nil
300+
301+
302+func handlePoolTokensAdd (PIssued,payments,userAddress,needChange) = {
303+ func getTokenPaymentAmount (tokenId) = {
304+ func handler (accum,payment) = if ((payment.assetId == tokenId))
305+ then payment.amount
306+ else accum
307+
308+ let $l = payments
309+ let $s = size($l)
310+ let $acc0 = 0
311+ func $f4_1 ($a,$i) = if (($i >= $s))
312+ then $a
313+ else handler($a, $l[$i])
314+
315+ func $f4_2 ($a,$i) = if (($i >= $s))
316+ then $a
317+ else throw("List size exceeds 3")
318+
319+ $f4_2($f4_1($f4_1($f4_1($acc0, 0), 1), 2), 3)
320+ }
321+
322+ func handleTokenChange (accum,tokenId) = {
323+ let Bk = tryGetInteger((("global_" + getAssetString(tokenId)) + "_balance"))
324+ let PSupply = tryGetInteger("global_poolToken_amount")
325+ let tokenDecimals = tryGetInteger((("static_" + getAssetString(tokenId)) + "_scale"))
326+ let DkTemp = fraction((fraction((PSupply + PIssued), tokenDecimals, PSupply, CEILING) - tokenDecimals), Bk, tokenDecimals, CEILING)
327+ let paymentAmount = getTokenPaymentAmount(tokenId)
328+ let Dk = min([DkTemp, paymentAmount])
329+ let toReturn = ((if ((paymentAmount != 0))
330+ then paymentAmount
331+ else 0) - Dk)
332+ let t = if (if (needChange)
333+ then (toReturn > 0)
334+ else false)
335+ then [ScriptTransfer(userAddress, toReturn, tokenId)]
336+ else nil
337+ let stakeUnstakeData = if ((getAssetString(tokenId) == "WAVES"))
338+ then stakeUnstake(true, Dk, "WAVES")
339+ else nil
340+ (((accum ++ t) ++ stakeUnstakeData) ++ [IntegerEntry((("global_" + getAssetString(tokenId)) + "_balance"), (Bk + Dk))])
341+ }
342+
343+ let $l = assetIds
344+ let $s = size($l)
345+ let $acc0 = nil
346+ func $f4_1 ($a,$i) = if (($i >= $s))
347+ then $a
348+ else handleTokenChange($a, $l[$i])
349+
350+ func $f4_2 ($a,$i) = if (($i >= $s))
351+ then $a
352+ else throw("List size exceeds 3")
353+
354+ $f4_2($f4_1($f4_1($f4_1($acc0, 0), 1), 2), 3)
355+ }
356+
357+
358+func handlePoolTokensRedeem (PRedeemed,userAddress) = {
359+ func handleTokenRedeem (accum,tokenId) = {
360+ let Bk = tryGetInteger((("global_" + getAssetString(tokenId)) + "_balance"))
361+ let PSupply = tryGetInteger("global_poolToken_amount")
362+ let tokenDecimals = tryGetInteger((("static_" + getAssetString(tokenId)) + "_scale"))
363+ let amount = toInt(fraction((toBigInt(Scale8) - fraction(toBigInt((PSupply - PRedeemed)), toBigInt(Scale8), toBigInt(PSupply), CEILING)), toBigInt(Bk), toBigInt(Scale8), DOWN))
364+ let stakeUnstakeData = if ((getAssetString(tokenId) == "WAVES"))
365+ then stakeUnstake(false, amount, "WAVES")
366+ else nil
367+ ((accum ++ stakeUnstakeData) ++ [IntegerEntry((("global_" + getAssetString(tokenId)) + "_balance"), (Bk - amount)), ScriptTransfer(userAddress, amount, tokenId)])
368+ }
369+
370+ let $l = assetIds
371+ let $s = size($l)
372+ let $acc0 = nil
373+ func $f4_1 ($a,$i) = if (($i >= $s))
374+ then $a
375+ else handleTokenRedeem($a, $l[$i])
376+
377+ func $f4_2 ($a,$i) = if (($i >= $s))
378+ then $a
379+ else throw("List size exceeds 3")
380+
381+ $f4_2($f4_1($f4_1($f4_1($acc0, 0), 1), 2), 3)
382+ }
383+
384+
385+func calculateOutAmount (AmountIn,assetIn,assetOut,BalanceIn,BalanceOut) = {
386+ let IndexIn = value(indexOf(assetIds, assetIn))
387+ let IndexOut = value(indexOf(assetIds, assetOut))
388+ if ((IndexIn == IndexOut))
389+ then throw("wrong tokens pair")
390+ 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)
391+ }
392+
393+
394+func getTokenBalance (assetId) = match assetId {
395+ case t: ByteVector =>
396+ assetBalance(this, t)
397+ case _ =>
398+ wavesBalance(this).regular
399+}
400+
401+
402+func calculateCurrentAssetInterest (assetId,assetIdStr,aBalance,tokenEarningsLastCheck) = {
403+ let totalStaked = tryGetInteger("global_indexStaked")
404+ let tokenBalanceLastCheck = tokenEarningsLastCheck
405+ let currentBalanceDelta = (getTokenBalance(assetId) - aBalance)
406+ let currentTokenEarnings = if ((currentBalanceDelta > tokenBalanceLastCheck))
407+ then currentBalanceDelta
408+ else tokenBalanceLastCheck
409+ let newEarnings = (currentTokenEarnings - tokenBalanceLastCheck)
410+ let newInterest = if ((totalStaked == 0))
411+ then 0
412+ else fraction(newEarnings, Scale8, totalStaked)
413+ let lastCheckInterest = tryGetInteger((("global_lastCheck_" + assetIdStr) + "_interest"))
414+ (lastCheckInterest + newInterest)
415+ }
416+
417+
418+func claimResult (address) = {
419+ let addressStr = toString(address)
420+ let shareAmount = tryGetInteger((addressStr + "_indexStaked"))
421+ func handler (accum,assetId) = {
422+ let assetIdStr = getAssetString(assetId)
423+ let aBalance = tryGetInteger((("global_" + getAssetString(assetId)) + "_balance"))
424+ let tokenEarningsLastCheck = tryGetInteger((("global_lastCheck_" + assetIdStr) + "_earnings"))
425+ let currentTokenInterest = calculateCurrentAssetInterest(assetId, assetIdStr, aBalance, tokenEarningsLastCheck)
426+ let currentTokenEarnings = max([tokenEarningsLastCheck, (getTokenBalance(assetId) - aBalance)])
427+ let rewardAmount = fraction(shareAmount, (currentTokenInterest - tryGetInteger((((addressStr + "_lastCheck_") + assetIdStr) + "_interest"))), Scale8)
428+ let transfer = if ((rewardAmount == 0))
429+ then nil
430+ else [ScriptTransfer(address, rewardAmount, assetId)]
431+ let claimed = tryGetInteger((((addressStr + "_lastCheck_") + assetIdStr) + "_claimed"))
432+ ((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))])
433+ }
434+
435+ let accum = {
436+ let $l = earnedAssets
437+ let $s = size($l)
438+ let $acc0 = nil
439+ func $f4_1 ($a,$i) = if (($i >= $s))
440+ then $a
441+ else handler($a, $l[$i])
442+
443+ func $f4_2 ($a,$i) = if (($i >= $s))
444+ then $a
445+ else throw("List size exceeds 3")
446+
447+ $f4_2($f4_1($f4_1($f4_1($acc0, 0), 1), 2), 3)
448+ }
449+ (accum ++ [IntegerEntry((addressStr + "_lastClaim"), lastBlock.timestamp)])
450+ }
451+
452+
453+func indexStakeResult (addressStr,amount) = {
454+ let li = claimResult(addressFromStringValue(addressStr))
455+ (li ++ [IntegerEntry((addressStr + "_indexStaked"), (tryGetInteger((addressStr + "_indexStaked")) + amount)), IntegerEntry("global_indexStaked", (tryGetInteger("global_indexStaked") + amount))])
456+ }
457+
458+
459+func sum (accum,n) = (accum + parseIntValue(n))
460+
461+
462+func setOracleAddressAndInitiate (address) = [StringEntry("static_oracle", address)]
463+
464+
465+func isTestEnv () = {
466+ let testenv = match getBoolean(this, "TESTENV") {
467+ case x: Boolean =>
468+ x
469+ case _ =>
470+ false
471+ }
472+ testenv
473+ }
474+
475+
476+@Callable(i)
477+func topUpFunds () = if ((size(i.payments) != 1))
478+ then throw("Wrong payments attached!")
479+ else {
480+ let payment = i.payments[0]
481+ let asset = payment.assetId
482+ if ((indexOf(assetIds, asset) == unit))
483+ then throw("Not supported assetId")
484+ else {
485+ let amount = payment.amount
486+ let aBalance = tryGetInteger((("global_" + getAssetString(asset)) + "_balance"))
487+ let day = calculateDaysSinceStart()
488+ let reveneu = tryGetInteger(reveneuForDayByAsset(day, getAssetString(asset)))
489+[IntegerEntry((("global_" + getAssetString(asset)) + "_balance"), (aBalance + amount)), IntegerEntry("days_since_apy", day), IntegerEntry(reveneuForDayByAsset(day, getAssetString(asset)), (reveneu + amount))]
490+ }
491+ }
492+
493+
494+
495+@Callable(i)
496+func preInit (assetIdsStr,assetWeightsStr,baseTokenIdStr,poolDomain) = if ((this != i.caller))
497+ then throw("admin only")
498+ else if ((size(poolDomain) > 13))
499+ then throw("too large pool domain")
500+ else {
501+ let assetIdsStrLi = split(assetIdsStr, ",")
502+ let assetIdsLi = {
503+ let $l = assetIdsStrLi
504+ let $s = size($l)
505+ let $acc0 = nil
506+ func $f4_1 ($a,$i) = if (($i >= $s))
507+ then $a
508+ else addAssetBytesToList($a, $l[$i])
509+
510+ func $f4_2 ($a,$i) = if (($i >= $s))
511+ then $a
512+ else throw("List size exceeds 3")
513+
514+ $f4_2($f4_1($f4_1($f4_1($acc0, 0), 1), 2), 3)
515+ }
516+ let assetWeightsStrLi = split(assetWeightsStr, ",")
517+ let assetWeightsSum = {
518+ let $l = assetWeightsStrLi
519+ let $s = size($l)
520+ let $acc0 = 0
521+ func $f5_1 ($a,$i) = if (($i >= $s))
522+ then $a
523+ else sum($a, $l[$i])
524+
525+ func $f5_2 ($a,$i) = if (($i >= $s))
526+ then $a
527+ else throw("List size exceeds 3")
528+
529+ $f5_2($f5_1($f5_1($f5_1($acc0, 0), 1), 2), 3)
530+ }
531+ func addTokenDataEntries (accum,assetNum) = if ((assetNum >= size(assetIdsLi)))
532+ then accum
533+ else {
534+ let assetDecimals = match assetIdsLi[assetNum] {
535+ case x: ByteVector =>
536+ value(assetInfo(assetIdsLi[assetNum])).decimals
537+ case _ =>
538+ 8
539+ }
540+ (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])))])
541+ }
542+
543+ if ((assetWeightsSum != 100))
544+ then throw("sum of token weights must be equal to 100")
545+ else ({
546+ let $l = [0, 1, 2]
547+ let $s = size($l)
548+ let $acc0 = nil
549+ func $f6_1 ($a,$i) = if (($i >= $s))
550+ then $a
551+ else addTokenDataEntries($a, $l[$i])
552+
553+ func $f6_2 ($a,$i) = if (($i >= $s))
554+ then $a
555+ else throw("List size exceeds 3")
556+
557+ $f6_2($f6_1($f6_1($f6_1($acc0, 0), 1), 2), 3)
558+ } ++ [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)])
559+ }
560+
561+
562+
563+@Callable(i)
564+func init (oracle) = {
565+ func prepareList () = {
566+ func handler (accum,n) = (accum ++ [IntegerEntry((("global_" + getAssetString(n.assetId)) + "_balance"), n.amount)])
567+
568+ let $l = i.payments
569+ let $s = size($l)
570+ let $acc0 = nil
571+ func $f4_1 ($a,$i) = if (($i >= $s))
572+ then $a
573+ else handler($a, $l[$i])
574+
575+ func $f4_2 ($a,$i) = if (($i >= $s))
576+ then $a
577+ else throw("List size exceeds 3")
578+
579+ $f4_2($f4_1($f4_1($f4_1($acc0, 0), 1), 2), 3)
580+ }
581+
582+ func calculatePoolTokensAmount (payments) = {
583+ func handler (accum,pmt) = {
584+ let assetId = pmt.assetId
585+ func handler2 (accum,n) = if ((n == assetId))
586+ then value(indexOf(assetIds, n))
587+ else accum
588+
589+ let Token = {
590+ let $l = assetIds
591+ let $s = size($l)
592+ let $acc0 = 1
593+ func $f4_1 ($a,$i) = if (($i >= $s))
594+ then $a
595+ else handler2($a, $l[$i])
596+
597+ func $f4_2 ($a,$i) = if (($i >= $s))
598+ then $a
599+ else throw("List size exceeds 3")
600+
601+ $f4_2($f4_1($f4_1($f4_1($acc0, 0), 1), 2), 3)
602+ }
603+ fraction(accum, pow(pmt.amount, Decimals[Token], AssetsWeights[Token], AssetsWeightsDecimals, 8, FLOOR), Scale8)
604+ }
605+
606+ let $l = payments
607+ let $s = size($l)
608+ let $acc0 = PoolTokenScale
609+ func $f4_1 ($a,$i) = if (($i >= $s))
610+ then $a
611+ else handler($a, $l[$i])
612+
613+ func $f4_2 ($a,$i) = if (($i >= $s))
614+ then $a
615+ else throw("List size exceeds 3")
616+
617+ $f4_2($f4_1($f4_1($f4_1($acc0, 0), 1), 2), 3)
618+ }
619+
620+ if ((tryGetInteger("global_wasInited") > 0))
621+ then throw("pool already inited")
622+ else {
623+ let initialPoolTokens = calculatePoolTokensAmount(i.payments)
624+ if ((initialPoolTokens == 0))
625+ then throw("you need a bigger tokens amount to launch the pool")
626+ else {
627+ let poolTokenIssue = Issue(("WD " + tryGetString("static_poolDomain")), "WD pool token", initialPoolTokens, PoolTokenDecimals, true, unit, 0)
628+ let poolTokenId = calculateAssetId(poolTokenIssue)
629+ ((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))
630+ }
631+ }
632+ }
633+
634+
635+
636+@Callable(i)
637+func generateIndex (needChange) = if ((size(i.payments) != T))
638+ then throw(("you need to attach all pool tokens. amount of pool tokens: " + toString(T)))
639+ else if (!(checkTokensValidity(i.payments)))
640+ then throw("wrong assets attached")
641+ else {
642+ let PIssued = getMinPIssued(i.payments)
643+ let reissue = Reissue(getBinaryValue("global_poolToken_id"), PIssued, true)
644+ let result = handlePoolTokensAdd(PIssued, i.payments, i.originCaller, needChange)
645+ $Tuple2((result ++ [ScriptTransfer(i.caller, PIssued, tryGetBinary("global_poolToken_id")), reissue, IntegerEntry("global_poolToken_amount", (tryGetInteger("global_poolToken_amount") + PIssued))]), PIssued)
646+ }
647+
648+
649+
650+@Callable(i)
651+func stakeIndex () = {
652+ let addressStr = toString(i.originCaller)
653+ let pmt = i.payments[0]
654+ if ((value(pmt.assetId) != tryGetBinary("global_poolToken_id")))
655+ then throw("wrong asset attached")
656+ else indexStakeResult(addressStr, pmt.amount)
657+ }
658+
659+
660+
661+@Callable(i)
662+func generateAndStakeIndex (needChange) = if ((size(i.payments) != T))
663+ then throw(("you need to attach all pool tokens. amount of pool tokens: " + toString(T)))
664+ else if (!(checkTokensValidity(i.payments)))
665+ then throw("wrong assets attached")
666+ else {
667+ let PIssued = getMinPIssued(i.payments)
668+ let reissue = Reissue(getBinaryValue("global_poolToken_id"), PIssued, true)
669+ let result = handlePoolTokensAdd(PIssued, i.payments, i.originCaller, needChange)
670+ $Tuple2(((result ++ [reissue, IntegerEntry("global_poolToken_amount", (tryGetInteger("global_poolToken_amount") + PIssued))]) ++ indexStakeResult(toString(i.originCaller), PIssued)), PIssued)
671+ }
672+
673+
674+
675+@Callable(i)
676+func unstakeIndex (shareAmount) = {
677+ let addressStr = toString(i.originCaller)
678+ let shareAvailable = tryGetInteger((addressStr + "_indexStaked"))
679+ if ((shareAmount > shareAvailable))
680+ then throw("you don't have index tokens available")
681+ else (claimResult(i.originCaller) ++ [IntegerEntry((addressStr + "_indexStaked"), (shareAvailable - shareAmount)), IntegerEntry("global_indexStaked", (tryGetInteger("global_indexStaked") - shareAmount)), ScriptTransfer(i.caller, shareAmount, getBinaryValue("global_poolToken_id"))])
682+ }
683+
684+
685+
686+@Callable(i)
687+func claimIndexRewards () = claimResult(i.caller)
688+
689+
690+
691+@Callable(i)
692+func redeemIndex (sendToOrigin) = {
693+ let pmt = i.payments[0]
694+ if ((pmt.assetId != tryGetBinary("global_poolToken_id")))
695+ then throw("please attach pool share token")
696+ else {
697+ let PRedeemed = pmt.amount
698+ let result = handlePoolTokensRedeem(PRedeemed, if (sendToOrigin)
699+ then i.originCaller
700+ else i.caller)
701+ (result ++ [Burn(tryGetBinary("global_poolToken_id"), PRedeemed), IntegerEntry("global_poolToken_amount", (tryGetInteger("global_poolToken_amount") - PRedeemed))])
702+ }
703+ }
704+
705+
706+
707+@Callable(i)
708+func unstakeAndRedeemIndex (shareAmount) = {
709+ let addressStr = toString(i.originCaller)
710+ let shareAvailable = tryGetInteger((addressStr + "_indexStaked"))
711+ if ((shareAmount > shareAvailable))
712+ then throw("you don't have index tokens available")
713+ else {
714+ let PRedeemed = shareAmount
715+ let result = handlePoolTokensRedeem(PRedeemed, i.originCaller)
716+ (((claimResult(i.originCaller) ++ [IntegerEntry((addressStr + "_indexStaked"), (shareAvailable - shareAmount)), IntegerEntry("global_indexStaked", (tryGetInteger("global_indexStaked") - shareAmount)), ScriptTransfer(i.caller, shareAmount, getBinaryValue("global_poolToken_id"))]) ++ result) ++ [Burn(tryGetBinary("global_poolToken_id"), PRedeemed), IntegerEntry("global_poolToken_amount", (tryGetInteger("global_poolToken_amount") - PRedeemed))])
717+ }
718+ }
719+
720+
721+
722+@Callable(i)
723+func swap (assetOut,minimum) = if (isShutdown())
724+ then throw("Pool is currently shutdown")
725+ else {
726+ let pmt = value(i.payments[0])
727+ let AmountIn = value(i.payments[0].amount)
728+ let AssetIn = pmt.assetId
729+ let invokeSwap = asIntTuple(reentrantInvoke(this, "swapInternal", [assetOut, minimum, AmountIn, getAssetString(AssetIn), toString(i.caller)], nil))
730+ if ((invokeSwap == invokeSwap))
731+ then {
732+ let cleanAmountOut = invokeSwap._1
733+ if ((cleanAmountOut == cleanAmountOut))
734+ then {
735+ let feeAmount = invokeSwap._2
736+ if ((feeAmount == feeAmount))
737+ then {
738+ let topUp = if ((assetOut == "WAVES"))
739+ then {
740+ let unstake = reentrantInvoke(this, "internal", [false, (cleanAmountOut + fraction(feeAmount, 3, 4)), "WAVES"], nil)
741+ if ((unstake == unstake))
742+ then [ScriptTransfer(getFeesAccount(), fraction(feeAmount, 2, 4), getAssetBytes(assetOut))]
743+ else throw("Strict value is not equal to itself.")
744+ }
745+ else [ScriptTransfer(getFeesAccount(), fraction(feeAmount, 2, 4), getAssetBytes(assetOut))]
746+ if ((topUp == topUp))
747+ then $Tuple2(topUp, cleanAmountOut)
748+ else throw("Strict value is not equal to itself.")
749+ }
750+ else throw("Strict value is not equal to itself.")
751+ }
752+ else throw("Strict value is not equal to itself.")
753+ }
754+ else throw("Strict value is not equal to itself.")
755+ }
756+
757+
758+
759+@Callable(i)
760+func internal (stake,amount,assetId) = if ((i.caller != this))
761+ then throw("Not allowed")
762+ else stakeUnstake(stake, amount, assetId)
763+
764+
765+
766+@Callable(i)
767+func stakeAll () = stakeUnstake(true, (tryGetInteger("global_WAVES_balance") - tryGetInteger("leasing_amount")), "WAVES")
768+
769+
770+
771+@Callable(i)
772+func swapInternal (assetOut,minimum,AmountIn,AssetIn,caller) = if ((i.caller != this))
773+ then throw("You cant call this directly")
774+ else {
775+ let AssetOut = getAssetBytes(assetOut)
776+ let day = calculateDaysSinceStart()
777+ let reveneu = tryGetInteger(reveneuForDayByAsset(day, assetOut))
778+ let AssetInBalance = tryGetInteger((("global_" + AssetIn) + "_balance"))
779+ if ((AssetInBalance == AssetInBalance))
780+ then {
781+ let AssetOutBalance = tryGetInteger((("global_" + assetOut) + "_balance"))
782+ if ((AssetOutBalance == AssetOutBalance))
783+ then {
784+ let AmountOut = calculateOutAmount(AmountIn, getAssetBytes(AssetIn), AssetOut, AssetInBalance, AssetOutBalance)
785+ if ((AmountOut == AmountOut))
786+ then {
787+ let feeAmount = fraction(AmountOut, Fee, FeeScale)
788+ if ((feeAmount == feeAmount))
789+ then {
790+ let cleanAmountOut = (AmountOut - feeAmount)
791+ if ((cleanAmountOut == cleanAmountOut))
792+ then if ((minimum > cleanAmountOut))
793+ then throw(("amount to recieve is lower than given one: " + toString(cleanAmountOut)))
794+ else if ((0 > (AssetOutBalance - AmountOut)))
795+ then throw("contract is out of reserves")
796+ else if ((AssetOut == getAssetBytes(AssetIn)))
797+ then throw("this swap is not allowed")
798+ else {
799+ let newBalanceIn = (AssetInBalance + AmountIn)
800+ if ((newBalanceIn == newBalanceIn))
801+ then {
802+ let stake = reentrantInvoke(this, "internal", [true, AmountIn, AssetIn], nil)
803+ if ((stake == stake))
804+ then {
805+ let newBalanceOut = (AssetOutBalance - AmountOut)
806+ if ((newBalanceOut == newBalanceOut))
807+ 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))
808+ else throw("Strict value is not equal to itself.")
809+ }
810+ else throw("Strict value is not equal to itself.")
811+ }
812+ else throw("Strict value is not equal to itself.")
813+ }
814+ else throw("Strict value is not equal to itself.")
815+ }
816+ else throw("Strict value is not equal to itself.")
817+ }
818+ else throw("Strict value is not equal to itself.")
819+ }
820+ else throw("Strict value is not equal to itself.")
821+ }
822+ else throw("Strict value is not equal to itself.")
823+ }
824+
825+
826+@Verifier(tx)
827+func verify () = if (isTestEnv())
828+ then sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
829+ else {
830+ let firstUser = base58'FzsTVRXqD46KW5yj6qGNVrsouvWjpCQvD1446A96iGt4'
831+ let secondUser = base58'E23yUg8eun5nXB1nZRDf7RTyRADKxQhGNXdpTYonEvtU'
832+ let thirdUser = base58'Ga8WEBTPXbHuoXRD355mQ6ms8PsM2RFYKeA1mEP32CFe'
833+ let firstUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], firstUser))
834+ then 1
835+ else if (sigVerify(tx.bodyBytes, tx.proofs[1], firstUser))
836+ then 1
837+ else if (sigVerify(tx.bodyBytes, tx.proofs[2], firstUser))
838+ then 1
839+ else 0
840+ let secondUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], secondUser))
841+ then 1
842+ else if (sigVerify(tx.bodyBytes, tx.proofs[1], secondUser))
843+ then 1
844+ else if (sigVerify(tx.bodyBytes, tx.proofs[2], secondUser))
845+ then 1
846+ else 0
847+ let thirdUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], thirdUser))
848+ then 1
849+ else if (sigVerify(tx.bodyBytes, tx.proofs[1], thirdUser))
850+ then 1
851+ else if (sigVerify(tx.bodyBytes, tx.proofs[2], thirdUser))
852+ then 1
853+ else 0
854+ let signaturesCount = ((firstUserSigned + secondUserSigned) + thirdUserSigned)
855+ match tx {
856+ case _ =>
857+ (signaturesCount >= 2)
858+ }
859+ }
860+

github/deemru/w8io/6500d08 
42.28 ms